@@ -241,8 +241,15 @@ parseMarkdown = do
241 $ B.setDate (runF date st)
241 $ B.setDate (runF date st)
242 $ B.doc $ runF blocks st
242 $ B.doc $ runF blocks st
244+addWarning :: Maybe SourcePos -> String -> MarkdownParser ()
245+addWarning mbpos msg =
246+ updateState $ \st -> st{
247+ stateWarnings = (msg ++ maybe "" (\pos -> " " ++ show pos) mbpos) :
244referenceKey :: MarkdownParser (F Blocks)
250referenceKey :: MarkdownParser (F Blocks)
245referenceKey = try $ do
251referenceKey = try $ do
246 skipNonindentSpaces
253 skipNonindentSpaces
247 (_,raw) <- reference
254 (_,raw) <- reference
@@ -262,7 +269,11 @@ referenceKey = try $ do
262 let target = (escapeURI $ trimr src, tit)
269 let target = (escapeURI $ trimr src, tit)
263 st <- getState
270 st <- getState
264 let oldkeys = stateKeys st
271 let oldkeys = stateKeys st
273+ case M.lookup key oldkeys of
274+ Just _ -> addWarning (Just pos) $ "Duplicate link reference `" ++ raw ++ "'"
275+ Nothing -> return ()
265− updateState $ \s -> s { stateKeys = M.insert (toKey raw) target oldkeys }
276+ updateState $ \s -> s { stateKeys = M.insert key target oldkeys }
266 return $ return mempty
277 return $ return mempty
268referenceTitle :: MarkdownParser String
279referenceTitle :: MarkdownParser String