@@ -241,8 +241,15 @@ parseMarkdown = do
241241 $ B.setDate (runF date st)
242242 $ B.doc $ runF blocks st
243243
244+addWarning :: Maybe SourcePos -> String -> MarkdownParser ()
245+addWarning mbpos msg =
246+ updateState $ \st -> st{
247+ stateWarnings = (msg ++ maybe "" (\pos -> " " ++ show pos) mbpos) :
248+ stateWarnings st }
249+
244250referenceKey :: MarkdownParser (F Blocks)
245251referenceKey = try $ do
252+ pos <- getPosition
246253 skipNonindentSpaces
247254 (_,raw) <- reference
248255 char ':'
@@ -262,7 +269,11 @@ referenceKey = try $ do
262269 let target = (escapeURI $ trimr src, tit)
263270 st <- getState
264271 let oldkeys = stateKeys st
265− updateState $ \s -> s { stateKeys = M.insert (toKey raw) target oldkeys }
272+ let key = toKey raw
273+ case M.lookup key oldkeys of
274+ Just _ -> addWarning (Just pos) $ "Duplicate link reference `" ++ raw ++ "'"
275+ Nothing -> return ()
276+ updateState $ \s -> s { stateKeys = M.insert key target oldkeys }
266277 return $ return mempty
267278
268279referenceTitle :: MarkdownParser String