git.iko.soy/typeable/pandoc
on master help sign in
MediaWiki reader: Handle templates, variables as raw mediawiki.

Also check for column 1 in preformatted text.

commit3fe6ea4c4135f489227cce8d10bc5e6c7b3c1383 authorJohn MacFarlane <jgm@berkeley.edu> dateThu 13 Sep 2012, 12:03 (14 years ago) parent4e1a454
3 files changed+34−6
src/Text/Pandoc/Readers/MediaWiki.hs+14−5 tests/mediawiki-reader.native+9−1 tests/mediawiki-reader.wiki+11
src/Text/Pandoc/Readers/MediaWiki.hs+14−5
@@ -38,7 +38,6 @@ _ support external links (partially implemented)
3838_ support images http://www.mediawiki.org/wiki/Help:Images
3939_ support tables http://www.mediawiki.org/wiki/Help:Tables
4040_ gallery tag?
41−_ tests for templates (should be -> raw mediawiki)
4241-}
4342module Text.Pandoc.Readers.MediaWiki ( readMediaWiki ) where
4443
@@ -130,16 +129,17 @@ block = mempty <$ skipMany1 blankline
130129 <|> blockTag
131130 <|> pTag
132131 <|> blockHtml
133− <|> rawMediaWiki
132+ <|> template
134133 <|> para
135134
136135para :: MWParser Blocks
137136para = B.para . trimInlines . mconcat <$> many1 inline
138137
139−rawMediaWiki :: MWParser Blocks
140−rawMediaWiki = B.rawBlock "mediawiki" <$> doublebrackets
138+template :: MWParser Blocks
139+template = B.rawBlock "mediawiki" <$> doublebrackets
141140 where doublebrackets = try $ do
142141 string "{{"
142+ notFollowedBy (char '{')
143143 contents <- manyTill anyChar (try $ string "}}")
144144 return $ "{{" ++ contents ++ "}}"
145145
@@ -180,7 +180,8 @@ hrule :: MWParser Blocks
180180hrule = B.horizontalRule <$ try (string "----" *> many (char '-') *> newline)
181181
182182preformatted :: MWParser Blocks
183−preformatted = do
183+preformatted = try $ do
184+ getPosition >>= \pos -> guard (sourceColumn pos == 1)
184185 char ' '
185186 let endline' = B.linebreak <$ (try $ newline <* char ' ')
186187 let whitespace' = B.str <$> many1 ('\160' <$ spaceChar)
@@ -280,11 +281,19 @@ inline = whitespace
280281 <|> inlineTag
281282 <|> B.singleton <$> charRef
282283 <|> inlineHtml
284+ <|> variable
283285 <|> special
284286
285287str :: MWParser Inlines
286288str = B.str <$> many1 (noneOf $ specialChars ++ spaceChars)
287289
290+variable :: MWParser Inlines
291+variable = B.rawInline "mediawiki" <$> triplebrackets
292+ where triplebrackets = try $ do
293+ string "{{{"
294+ contents <- manyTill anyChar (try $ string "}}}")
295+ return $ "{{{" ++ contents ++ "}}}"
296+
288297inlineTag :: MWParser Inlines
289298inlineTag = do
290299 (TagOpen t _, raw) <- htmlTag (\x -> isInlineTag x && isTagOpen x)
tests/mediawiki-reader.native+9−1
@@ -135,4 +135,12 @@ Pandoc (Meta {docTitle = [], docAuthors = [], docDate = []})
135135,Header 2 [Str "preformatted",Space,Str "blocks"]
136136,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."]
137137,Para [Code ("",[],[]) "\160hell\160\160\160\160\160\160yeah"]
138−,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"]]
138+,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"]
139+,Para [Str "Not"]
140+,RawBlock "html" "<hr/>"
141+,Para [Str "preformatted"]
142+,Header 2 [Str "templates"]
143+,RawBlock "mediawiki" "{{Welcome}}"
144+,RawBlock "mediawiki" "{{Foo:Bar}}"
145+,RawBlock "mediawiki" "{{Thankyou|all your effort|Me}}"
146+,Para [Str "Written",Space,RawInline "mediawiki" "{{{date}}}",Space,Str "by",Space,RawInline "mediawiki" "{{{name}}}",Str "."]]
tests/mediawiki-reader.wiki+11
@@ -217,4 +217,15 @@ def function():
217217 else:
218218 print False</nowiki>
219219
220+Not<hr/> preformatted
221+
222+== templates ==
223+
224+{{Welcome}}
225+
226+{{Foo:Bar}}
227+
228+{{Thankyou|all your effort|Me}}
229+
230+Written {{{date}}} by {{{name}}}.
220231