git.iko.soy/typeable/pandoc
on master help sign in
MediaWiki reader: Add automatic header identifiers.
commit0fd2176e29bd1118d314c6179455fb78bed35aea authorJohn MacFarlane <fiddlosopher@gmail.com> dateSun 17 Nov 2013, 08:47 (13 years ago) parentd566027
2 files changed+49−31
src/Text/Pandoc/Readers/MediaWiki.hs+20−2 tests/mediawiki-reader.native+29−29
src/Text/Pandoc/Readers/MediaWiki.hs+20−2
@@ -1,4 +1,5 @@
1−{-# LANGUAGE RelaxedPolyRec #-} -- needed for inlinesBetween on GHC < 7
1+{-# LANGUAGE RelaxedPolyRec, FlexibleInstances, TypeSynonymInstances #-}
2+-- RelaxedPolyRec needed for inlinesBetween on GHC < 7
23{-
34 Copyright (C) 2012 John MacFarlane <jgm@berkeley.edu>
45
@@ -51,6 +52,7 @@ import Data.List (intersperse, intercalate, isPrefixOf )
5152import Text.HTML.TagSoup
5253import Data.Sequence (viewl, ViewL(..), (<|))
5354import qualified Data.Foldable as F
55+import qualified Data.Map as M
5456import Data.Char (isDigit, isSpace)
5557
5658-- | Read mediawiki from an input string and return a Pandoc document.
@@ -62,6 +64,8 @@ readMediaWiki opts s =
6264 , mwMaxNestingLevel = 4
6365 , mwNextLinkNumber = 1
6466 , mwCategoryLinks = []
67+ , mwHeaderMap = M.empty
68+ , mwIdentifierList = []
6569 }
6670 "source" (s ++ "\n") of
6771 Left err' -> error $ "\nError:\n" ++ show err'
@@ -71,10 +75,23 @@ data MWState = MWState { mwOptions :: ReaderOptions
7175 , mwMaxNestingLevel :: Int
7276 , mwNextLinkNumber :: Int
7377 , mwCategoryLinks :: [Inlines]
78+ , mwHeaderMap :: M.Map Inlines String
79+ , mwIdentifierList :: [String]
7480 }
7581
7682type MWParser = Parser [Char] MWState
7783
84+instance HasReaderOptions MWParser where
85+ askReaderOption f = (f . mwOptions) `fmap` getState
86+
87+instance HasHeaderMap MWParser where
88+ getHeaderMap = fmap mwHeaderMap getState
89+ putHeaderMap hm = updateState $ \st -> st{ mwHeaderMap = hm }
90+
91+instance HasIdentifierList MWParser where
92+ getIdentifierList = fmap mwIdentifierList getState
93+ putIdentifierList l = updateState $ \st -> st{ mwIdentifierList = l }
94+
7895--
7996-- auxiliary functions
8097--
@@ -351,7 +368,8 @@ header = try $ do
351368 let lev = length eqs
352369 guard $ lev <= 6
353370 contents <- trimInlines . mconcat <$> manyTill inline (count lev $ char '=')
354− return $ B.header lev contents
371+ attr <- registerHeader nullAttr contents
372+ return $ B.headerWith attr lev contents
355373
356374bulletList :: MWParser Blocks
357375bulletList = B.bulletList <$>
tests/mediawiki-reader.native+29−29
@@ -1,39 +1,39 @@
11Pandoc (Meta {unMeta = fromList []})
2−[Header 1 ("",[],[]) [Str "header"]
3−,Header 2 ("",[],[]) [Str "header",Space,Str "level",Space,Str "two"]
4−,Header 3 ("",[],[]) [Str "header",Space,Str "level",Space,Str "3"]
5−,Header 4 ("",[],[]) [Str "header",Space,Emph [Str "level"],Space,Str "four"]
6−,Header 5 ("",[],[]) [Str "header",Space,Str "level",Space,Str "5"]
7−,Header 6 ("",[],[]) [Str "header",Space,Str "level",Space,Str "6"]
2+[Header 1 ("header",[],[]) [Str "header"]
3+,Header 2 ("header-level-two",[],[]) [Str "header",Space,Str "level",Space,Str "two"]
4+,Header 3 ("header-level-3",[],[]) [Str "header",Space,Str "level",Space,Str "3"]
5+,Header 4 ("header-level-four",[],[]) [Str "header",Space,Emph [Str "level"],Space,Str "four"]
6+,Header 5 ("header-level-5",[],[]) [Str "header",Space,Str "level",Space,Str "5"]
7+,Header 6 ("header-level-6",[],[]) [Str "header",Space,Str "level",Space,Str "6"]
88,Para [Str "=======",Space,Str "not",Space,Str "a",Space,Str "header",Space,Str "========"]
99,Para [Code ("",[],[]) "==\160not\160a\160header\160=="]
10−,Header 2 ("",[],[]) [Str "emph",Space,Str "and",Space,Str "strong"]
10+,Header 2 ("emph-and-strong",[],[]) [Str "emph",Space,Str "and",Space,Str "strong"]
1111,Para [Emph [Str "emph"],Space,Strong [Str "strong"]]
1212,Para [Strong [Emph [Str "strong",Space,Str "and",Space,Str "emph"]]]
1313,Para [Strong [Emph [Str "emph",Space,Str "inside"],Space,Str "strong"]]
1414,Para [Strong [Str "strong",Space,Str "with",Space,Emph [Str "emph"]]]
1515,Para [Emph [Strong [Str "strong",Space,Str "inside"],Space,Str "emph"]]
16−,Header 2 ("",[],[]) [Str "horizontal",Space,Str "rule"]
16+,Header 2 ("horizontal-rule",[],[]) [Str "horizontal",Space,Str "rule"]
1717,Para [Str "top"]
1818,HorizontalRule
1919,Para [Str "bottom"]
2020,HorizontalRule
21−,Header 2 ("",[],[]) [Str "nowiki"]
21+,Header 2 ("nowiki",[],[]) [Str "nowiki"]
2222,Para [Str "''not",Space,Str "emph''"]
23−,Header 2 ("",[],[]) [Str "strikeout"]
23+,Header 2 ("strikeout",[],[]) [Str "strikeout"]
2424,Para [Strikeout [Str "This",Space,Str "is",Space,Emph [Str "struck",Space,Str "out"]]]
25−,Header 2 ("",[],[]) [Str "entities"]
25+,Header 2 ("entities",[],[]) [Str "entities"]
2626,Para [Str "hi",Space,Str "&",Space,Str "low"]
2727,Para [Str "hi",Space,Str "&",Space,Str "low"]
2828,Para [Str "G\246del"]
2929,Para [Str "\777\2730"]
30−,Header 2 ("",[],[]) [Str "comments"]
30+,Header 2 ("comments",[],[]) [Str "comments"]
3131,Para [Str "inline",Space,Str "comment"]
3232,Para [Str "between",Space,Str "blocks"]
33−,Header 2 ("",[],[]) [Str "linebreaks"]
33+,Header 2 ("linebreaks",[],[]) [Str "linebreaks"]
3434,Para [Str "hi",LineBreak,Str "there"]
3535,Para [Str "hi",LineBreak,Str "there"]
36−,Header 2 ("",[],[]) [Str ":",Space,Str "indents"]
36+,Header 2 ("indents",[],[]) [Str ":",Space,Str "indents"]
3737,Para [Str "hi"]
3838,DefinitionList
3939 [([],
@@ -46,36 +46,36 @@ Pandoc (Meta {unMeta = fromList []})
4646 [([],
4747 [[Plain [Str "there"]]])]]])]
4848,Para [Str "bud"]
49−,Header 2 ("",[],[]) [Str "p",Space,Str "tags"]
49+,Header 2 ("p-tags",[],[]) [Str "p",Space,Str "tags"]
5050,Para [Str "hi",Space,Str "there"]
5151,Para [Str "bud"]
5252,Para [Str "another"]
53−,Header 2 ("",[],[]) [Str "raw",Space,Str "html"]
53+,Header 2 ("raw-html",[],[]) [Str "raw",Space,Str "html"]
5454,Para [Str "hi",Space,RawInline (Format "html") "<span style=\"color:red\">",Emph [Str "there"],RawInline (Format "html") "</span>",Str "."]
5555,Para [RawInline (Format "html") "<ins>",Str "inserted",RawInline (Format "html") "</ins>"]
5656,RawBlock (Format "html") "<div class=\"special\">"
5757,Para [Str "hi",Space,Emph [Str "there"]]
5858,RawBlock (Format "html") "</div>"
59−,Header 2 ("",[],[]) [Str "sup,",Space,Str "sub,",Space,Str "del"]
59+,Header 2 ("sup-sub-del",[],[]) [Str "sup,",Space,Str "sub,",Space,Str "del"]
6060,Para [Str "H",Subscript [Str "2"],Str "O",Space,Str "base",Superscript [Emph [Str "exponent"]],Space,Strikeout [Str "hello"]]
61−,Header 2 ("",[],[]) [Str "inline",Space,Str "code"]
61+,Header 2 ("inline-code",[],[]) [Str "inline",Space,Str "code"]
6262,Para [Code ("",[],[]) "*\8594*",Space,Code ("",[],[]) "typed",Space,Code ("",["haskell"],[]) ">>="]
63−,Header 2 ("",[],[]) [Str "code",Space,Str "blocks"]
63+,Header 2 ("code-blocks",[],[]) [Str "code",Space,Str "blocks"]
6464,CodeBlock ("",[],[]) "case xs of\n (_:_) -> reverse xs\n [] -> ['*']"
6565,CodeBlock ("",["haskell"],[]) "case xs of\n (_:_) -> reverse xs\n [] -> ['*']"
6666,CodeBlock ("",["ruby","numberLines"],[("startFrom","100")]) "widgets.each do |w|\n print w.price\nend"
67−,Header 2 ("",[],[]) [Str "block",Space,Str "quotes"]
67+,Header 2 ("block-quotes",[],[]) [Str "block",Space,Str "quotes"]
6868,Para [Str "Regular",Space,Str "paragraph"]
6969,BlockQuote
7070 [Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "block",Space,Str "quote."]
7171 ,Para [Str "With",Space,Str "two",Space,Str "paragraphs."]]
7272,Para [Str "Nother",Space,Str "paragraph."]
73−,Header 2 ("",[],[]) [Str "external",Space,Str "links"]
73+,Header 2 ("external-links",[],[]) [Str "external",Space,Str "links"]
7474,Para [Link [Emph [Str "Google"],Space,Str "search",Space,Str "engine"] ("http://google.com","")]
7575,Para [Link [Str "http://johnmacfarlane.net/pandoc/"] ("http://johnmacfarlane.net/pandoc/","")]
7676,Para [Link [Str "1"] ("http://google.com",""),Space,Link [Str "2"] ("http://yahoo.com","")]
7777,Para [Link [Str "email",Space,Str "me"] ("mailto:info@example.org","")]
78−,Header 2 ("",[],[]) [Str "internal",Space,Str "links"]
78+,Header 2 ("internal-links",[],[]) [Str "internal",Space,Str "links"]
7979,Para [Link [Str "Help"] ("Help","wikilink")]
8080,Para [Link [Str "the",Space,Str "help",Space,Str "page"] ("Help","wikilink")]
8181,Para [Link [Str "Helpers"] ("Help","wikilink")]
@@ -83,12 +83,12 @@ Pandoc (Meta {unMeta = fromList []})
8383,Para [Link [Str "Contents"] ("Help:Contents","wikilink")]
8484,Para [Link [Str "#My",Space,Str "anchor"] ("#My_anchor","wikilink")]
8585,Para [Link [Str "and",Space,Str "text"] ("Page#with_anchor","wikilink")]
86−,Header 2 ("",[],[]) [Str "images"]
86+,Header 2 ("images",[],[]) [Str "images"]
8787,Para [Image [Str "caption"] ("example.jpg","fig:caption")]
8888,Para [Image [Str "the",Space,Emph [Str "caption"],Space,Str "with",Space,Link [Str "external",Space,Str "link"] ("http://google.com","")] ("example.jpg","fig:the caption with external link")]
8989,Para [Image [Str "caption"] ("example.jpg","fig:caption")]
9090,Para [Image [Str "example.jpg"] ("example.jpg","fig:example.jpg")]
91−,Header 2 ("",[],[]) [Str "lists"]
91+,Header 2 ("lists",[],[]) [Str "lists"]
9292,BulletList
9393 [[Plain [Str "Start",Space,Str "each",Space,Str "line"]]
9494 ,[Plain [Str "with",Space,Str "an",Space,Str "asterisk",Space,Str "(*)."]
@@ -161,10 +161,10 @@ Pandoc (Meta {unMeta = fromList []})
161161 [[Plain [Str "Amsterdam"]]
162162 ,[Plain [Str "Rotterdam"]]
163163 ,[Plain [Str "The",Space,Str "Hague"]]]
164−,Header 2 ("",[],[]) [Str "math"]
164+,Header 2 ("math",[],[]) [Str "math"]
165165,Para [Str "Here",Space,Str "is",Space,Str "some",Space,Math InlineMath "x=\\frac{y^\\pi}{z}",Str "."]
166166,Para [Str "With",Space,Str "spaces:",Space,Math InlineMath "x=\\frac{y^\\pi}{z}",Str "."]
167−,Header 2 ("",[],[]) [Str "preformatted",Space,Str "blocks"]
167+,Header 2 ("preformatted-blocks",[],[]) [Str "preformatted",Space,Str "blocks"]
168168,Para [Code ("",[],[]) "Start\160each\160line\160with\160a\160space.",LineBreak,Code ("",[],[]) "Text\160is\160",Strong [Code ("",[],[]) "preformatted"],Code ("",[],[]) "\160and",LineBreak,Emph [Code ("",[],[]) "markups"],Code ("",[],[]) "\160",Strong [Emph [Code ("",[],[]) "can"]],Code ("",[],[]) "\160be\160done."]
169169,Para [Code ("",[],[]) "\160hell\160\160\160\160\160\160yeah"]
170170,Para [Code ("",[],[]) "Start\160with\160a\160space\160in\160the\160first\160column,",LineBreak,Code ("",[],[]) "(before\160the\160<nowiki>).",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "Then\160your\160block\160format\160will\160be",LineBreak,Code ("",[],[]) "\160\160\160\160maintained.",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "This\160is\160good\160for\160copying\160in\160code\160blocks:",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "def\160function():",LineBreak,Code ("",[],[]) "\160\160\160\160\"\"\"documentation\160string\"\"\"",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "\160\160\160\160if\160True:",LineBreak,Code ("",[],[]) "\160\160\160\160\160\160\160\160print\160True",LineBreak,Code ("",[],[]) "\160\160\160\160else:",LineBreak,Code ("",[],[]) "\160\160\160\160\160\160\160\160print\160False"]
@@ -174,12 +174,12 @@ Pandoc (Meta {unMeta = fromList []})
174174,Para [Str "Don't",Space,Str "need"]
175175,Para [Code ("",[],[]) "a\160blank\160line"]
176176,Para [Str "around",Space,Str "a",Space,Str "preformatted",Space,Str "block."]
177−,Header 2 ("",[],[]) [Str "templates"]
177+,Header 2 ("templates",[],[]) [Str "templates"]
178178,RawBlock (Format "mediawiki") "{{Welcome}}"
179179,RawBlock (Format "mediawiki") "{{Foo:Bar}}"
180180,RawBlock (Format "mediawiki") "{{Thankyou|all your effort|Me}}"
181181,Para [Str "Written",Space,RawInline (Format "mediawiki") "{{{date}}}",Space,Str "by",Space,RawInline (Format "mediawiki") "{{{name}}}",Str "."]
182−,Header 2 ("",[],[]) [Str "tables"]
182+,Header 2 ("tables",[],[]) [Str "tables"]
183183,Table [] [AlignDefault,AlignDefault] [0.0,0.0]
184184 [[]
185185 ,[]]
@@ -245,6 +245,6 @@ Pandoc (Meta {unMeta = fromList []})
245245 [[]]
246246 [[[Para [Str "Orange"]]]]
247247,Para [Str "Paragraph",Space,Str "after",Space,Str "the",Space,Str "table."]
248−,Header 2 ("",[],[]) [Str "notes"]
248+,Header 2 ("notes",[],[]) [Str "notes"]
249249,Para [Str "My",Space,Str "note!",Note [Plain [Str "This."]]]
250250,Para [Str "URL",Space,Str "note.",Note [Plain [Link [Str "http://docs.python.org/library/functions.html#range"] ("http://docs.python.org/library/functions.html#range","")]]]]