From ef806f6a99dcb99b16282082e76d629f24dcafa8 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Fri, 4 Jan 2013 12:01:09 -0800 Subject: Markdown reader: Warn about duplicate link references. --- src/Text/Pandoc/Parsing.hs | 1 + src/Text/Pandoc/Readers/Markdown.hs | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/Text/Pandoc/Parsing.hs b/src/Text/Pandoc/Parsing.hs index 3aa013fdc..629814e4d 100644 --- a/src/Text/Pandoc/Parsing.hs +++ b/src/Text/Pandoc/Parsing.hs @@ -134,6 +134,7 @@ module Text.Pandoc.Parsing ( (>>~), getState, setState, updateState, + SourcePos, getPosition, setPosition, sourceColumn, diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index b687faae7..16141369a 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -241,8 +241,15 @@ parseMarkdown = do $ B.setDate (runF date st) $ B.doc $ runF blocks st +addWarning :: Maybe SourcePos -> String -> MarkdownParser () +addWarning mbpos msg = + updateState $ \st -> st{ + stateWarnings = (msg ++ maybe "" (\pos -> " " ++ show pos) mbpos) : + stateWarnings st } + referenceKey :: MarkdownParser (F Blocks) referenceKey = try $ do + pos <- getPosition skipNonindentSpaces (_,raw) <- reference char ':' @@ -262,7 +269,11 @@ referenceKey = try $ do let target = (escapeURI $ trimr src, tit) st <- getState let oldkeys = stateKeys st - updateState $ \s -> s { stateKeys = M.insert (toKey raw) target oldkeys } + let key = toKey raw + case M.lookup key oldkeys of + Just _ -> addWarning (Just pos) $ "Duplicate link reference `" ++ raw ++ "'" + Nothing -> return () + updateState $ \s -> s { stateKeys = M.insert key target oldkeys } return $ return mempty referenceTitle :: MarkdownParser String -- cgit v1.2.3