git.iko.soy/typeable/pandoc
on master help sign in
Make `implicit_header_references` work with explicit header ids.

(Markdown reader.)

commit07e8cedf2bddcbf13bfd69a415107b2a9aa074aa authorJohn MacFarlane <fiddlosopher@gmail.com> dateThu 21 Feb 2013, 19:53 (14 years ago) parent7a97369
4 files changed+30−20
src/Text/Pandoc/Parsing.hs+2−2 src/Text/Pandoc/Readers/Markdown.hs+23−16 tests/markdown-reader-more.native+3−2 tests/markdown-reader-more.txt+2
src/Text/Pandoc/Parsing.hs+2−2
@@ -794,7 +794,7 @@ data ParserState = ParserState
794794 stateAuthors :: [[Inline]], -- ^ Authors of document
795795 stateDate :: [Inline], -- ^ Date of document
796796 stateHeaderTable :: [HeaderType], -- ^ Ordered list of header types used
797− stateHeaders :: [[Inline]], -- ^ List of headers (used for implicit ref links)
797+ stateHeaders :: M.Map Inlines String, -- ^ List of headers and ids (used for implicit ref links)
798798 stateIdentifiers :: [String], -- ^ List of header identifiers used
799799 stateNextExample :: Int, -- ^ Number of next example
800800 stateExamples :: M.Map String Int, -- ^ Map from example labels to numbers
@@ -823,7 +823,7 @@ defaultParserState =
823823 stateAuthors = [],
824824 stateDate = [],
825825 stateHeaderTable = [],
826− stateHeaders = [],
826+ stateHeaders = M.empty,
827827 stateIdentifiers = [],
828828 stateNextExample = 1,
829829 stateExamples = M.empty,
src/Text/Pandoc/Readers/Markdown.hs+23−16
@@ -390,15 +390,22 @@ header = setextHeader <|> atxHeader <?> "header"
390390-- returns unique identifier
391391addToHeaderList :: Attr -> F Inlines -> MarkdownParser Attr
392392addToHeaderList (ident,classes,kvs) text = do
393− let headerList = B.toList $ runF text defaultParserState
394− updateState $ \st -> st{ stateHeaders = headerList : stateHeaders st }
395− (do guardEnabled Ext_auto_identifiers
396− ids <- stateIdentifiers `fmap` getState
397− let id' = if null ident
398− then uniqueIdent headerList ids
399− else ident
400− updateState $ \st -> st{ stateIdentifiers = id' : ids }
401− return (id',classes,kvs)) <|> return ("",classes,kvs)
393+ let header' = runF text defaultParserState
394+ exts <- getOption readerExtensions
395+ let insert' = M.insertWith (\_new old -> old)
396+ if null ident && Ext_auto_identifiers `Set.member` exts
397+ then do
398+ ids <- stateIdentifiers `fmap` getState
399+ let id' = uniqueIdent (B.toList header') ids
400+ updateState $ \st -> st{
401+ stateIdentifiers = id' : ids,
402+ stateHeaders = insert' header' id' $ stateHeaders st }
403+ return (id',classes,kvs)
404+ else do
405+ unless (null ident) $
406+ updateState $ \st -> st{
407+ stateHeaders = insert' header' ident $ stateHeaders st }
408+ return (ident,classes,kvs)
402409
403410atxHeader :: MarkdownParser (F Blocks)
404411atxHeader = try $ do
@@ -1539,13 +1546,13 @@ referenceLink constructor (lab, raw) = do
15391546 case M.lookup key keys of
15401547 Nothing -> do
15411548 headers <- asksF stateHeaders
1542− let ref' = B.toList $ runF (if labIsRef then lab else ref)
1543− defaultParserState
1544− if implicitHeaderRefs && ref' `elem` headers
1545− then do
1546− let src = '#' : uniqueIdent ref' []
1547− constructor src "" <$> lab
1548− else (\x -> B.str "[" <> x <> B.str "]" <> B.str raw') <$> fallback
1549+ let ref' = runF (if labIsRef then lab else ref) defaultParserState
1550+ let makeFallback x = B.str "[" <> x <> B.str "]" <> B.str raw'
1551+ if implicitHeaderRefs
1552+ then case M.lookup ref' headers of
1553+ Just ident -> constructor ('#':ident) "" <$> lab
1554+ Nothing -> makeFallback <$> fallback
1555+ else makeFallback <$> fallback
15491556 Just (src,tit) -> constructor src tit <$> lab
15501557
15511558bareURL :: MarkdownParser (F Inlines)
tests/markdown-reader-more.native+3−2
@@ -61,8 +61,9 @@
6161,Header 2 ("implicit-header-references",[],[]) [Str "Implicit",Space,Str "header",Space,Str "references"]
6262,Header 3 ("my-header-1",[],[]) [Str "My",Space,Str "header"]
6363,Header 3 ("my-other-header",[],[]) [Str "My",Space,Str "other",Space,Str "header"]
64−,Para [Str "A",Space,Str "link",Space,Str "to",Space,Link [Str "My",Space,Str "header"] ("#my-header",""),Str "."]
65−,Para [Str "Another",Space,Str "link",Space,Str "to",Space,Link [Str "it"] ("#my-header",""),Str "."]
64+,Para [Str "A",Space,Str "link",Space,Str "to",Space,Link [Str "My",Space,Str "header"] ("#my-header-1",""),Str "."]
65+,Para [Str "Another",Space,Str "link",Space,Str "to",Space,Link [Str "it"] ("#my-header-1",""),Str "."]
66+,Para [Str "Link",Space,Str "to",Space,Link [Str "Explicit",Space,Str "header",Space,Str "attributes"] ("#foobar",""),Str "."]
6667,Para [Str "But",Space,Str "this",Space,Str "is",Space,Str "not",Space,Str "a",Space,Str "link",Space,Str "to",Space,Link [Str "My",Space,Str "other",Space,Str "header"] ("/foo",""),Str ",",Space,Str "since",Space,Str "the",Space,Str "reference",Space,Str "is",Space,Str "defined."]
6768,Header 2 ("foobar",["baz"],[("key","val")]) [Str "Explicit",Space,Str "header",Space,Str "attributes"]
6869,Header 2 ("line-blocks",[],[]) [Str "Line",Space,Str "blocks"]
tests/markdown-reader-more.txt+2
@@ -144,6 +144,8 @@ A link to [My header].
144144
145145Another link to [it][My header].
146146
147+Link to [Explicit header attributes].
148+
147149[my other header]: /foo
148150
149151But this is not a link to [My other header], since the reference is defined.