diff options
author | John MacFarlane <jgm@berkeley.edu> | 2010-12-05 19:27:00 -0800 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2010-12-05 19:27:00 -0800 |
commit | 5a4609584c84114e8d148f558bed86353c7f0146 (patch) | |
tree | c52e39311a6af3dbd8fe0c921ab08ca8ba176460 /src/Text/Pandoc/Readers | |
parent | 37dc5d8c5d657d26a358aa4d5f6c14b25ae6cc4b (diff) | |
download | pandoc-5a4609584c84114e8d148f558bed86353c7f0146.tar.gz |
Fix regression: markdown references should be case-insensitive.
This broke when we added the Key type. We had assumed that
the custom case-insensitive Ord instance would ensure case-insensitive
matching, but that is not how Data.Map works.
* Added a test case for case-insensitivity in markdown-reader-more
* Removed old refsMatch from Text.Pandoc.Parsing module;
* hid the 'Key' constructor;
* dropped the custom Ord and Eq instances, deriving instead;
* added fromKey and toKey to convert between Keys and Inline lists;
* toKey ensures that keys are case-insensitive, since this is the
only way the API provides to construct a Key.
Resolves Issue #272.
Diffstat (limited to 'src/Text/Pandoc/Readers')
-rw-r--r-- | src/Text/Pandoc/Readers/Markdown.hs | 4 | ||||
-rw-r--r-- | src/Text/Pandoc/Readers/RST.hs | 15 |
2 files changed, 10 insertions, 9 deletions
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index 30012eaa5..feee31ec5 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -220,7 +220,7 @@ referenceKey = try $ do let target = (escapeURI $ removeTrailingSpace src, tit) st <- getState let oldkeys = stateKeys st - updateState $ \s -> s { stateKeys = M.insert (Key lab) target oldkeys } + updateState $ \s -> s { stateKeys = M.insert (toKey lab) target oldkeys } -- return blanks so line count isn't affected return $ replicate (sourceLine endPos - sourceLine startPos) '\n' @@ -1237,7 +1237,7 @@ referenceLink lab = do optional (newline >> skipSpaces) >> reference)) let ref' = if null ref then lab else ref state <- getState - case lookupKeySrc (stateKeys state) (Key ref') of + case lookupKeySrc (stateKeys state) (toKey ref') of Nothing -> fail "no corresponding key" Just target -> return target diff --git a/src/Text/Pandoc/Readers/RST.hs b/src/Text/Pandoc/Readers/RST.hs index 13afe5053..a39a46117 100644 --- a/src/Text/Pandoc/Readers/RST.hs +++ b/src/Text/Pandoc/Readers/RST.hs @@ -565,14 +565,14 @@ imageKey = try $ do skipSpaces string "image::" src <- targetURI - return (Key (normalizeSpaces ref), (src, "")) + return (toKey (normalizeSpaces ref), (src, "")) anonymousKey :: GenParser Char st (Key, Target) anonymousKey = try $ do oneOfStrings [".. __:", "__"] src <- targetURI pos <- getPosition - return (Key [Str $ "_" ++ printf "%09d" (sourceLine pos)], (src, "")) + return (toKey [Str $ "_" ++ printf "%09d" (sourceLine pos)], (src, "")) regularKey :: GenParser Char ParserState (Key, Target) regularKey = try $ do @@ -580,7 +580,7 @@ regularKey = try $ do ref <- referenceName char ':' src <- targetURI - return (Key (normalizeSpaces ref), (src, "")) + return (toKey (normalizeSpaces ref), (src, "")) -- -- tables @@ -779,9 +779,10 @@ referenceLink = try $ do label' <- (quotedReferenceName <|> simpleReferenceName) >>~ char '_' state <- getState let keyTable = stateKeys state - let isAnonKey (Key [Str ('_':_)]) = True - isAnonKey _ = False - key <- option (Key label') $ + let isAnonKey x = case fromKey x of + [Str ('_':_)] -> True + _ -> False + key <- option (toKey label') $ do char '_' let anonKeys = sort $ filter isAnonKey $ M.keys keyTable if null anonKeys @@ -814,7 +815,7 @@ image = try $ do ref <- manyTill inline (char '|') state <- getState let keyTable = stateKeys state - (src,tit) <- case lookupKeySrc keyTable (Key ref) of + (src,tit) <- case lookupKeySrc keyTable (toKey ref) of Nothing -> fail "no corresponding key" Just target -> return target return $ Image (normalizeSpaces ref) (src, tit) |