aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Text/Pandoc/Readers/MediaWiki.hs19
-rw-r--r--tests/mediawiki-reader.native10
-rw-r--r--tests/mediawiki-reader.wiki11
3 files changed, 34 insertions, 6 deletions
diff --git a/src/Text/Pandoc/Readers/MediaWiki.hs b/src/Text/Pandoc/Readers/MediaWiki.hs
index 3c44650c2..886a2b105 100644
--- a/src/Text/Pandoc/Readers/MediaWiki.hs
+++ b/src/Text/Pandoc/Readers/MediaWiki.hs
@@ -38,7 +38,6 @@ _ support external links (partially implemented)
_ support images http://www.mediawiki.org/wiki/Help:Images
_ support tables http://www.mediawiki.org/wiki/Help:Tables
_ gallery tag?
-_ tests for templates (should be -> raw mediawiki)
-}
module Text.Pandoc.Readers.MediaWiki ( readMediaWiki ) where
@@ -130,16 +129,17 @@ block = mempty <$ skipMany1 blankline
<|> blockTag
<|> pTag
<|> blockHtml
- <|> rawMediaWiki
+ <|> template
<|> para
para :: MWParser Blocks
para = B.para . trimInlines . mconcat <$> many1 inline
-rawMediaWiki :: MWParser Blocks
-rawMediaWiki = B.rawBlock "mediawiki" <$> doublebrackets
+template :: MWParser Blocks
+template = B.rawBlock "mediawiki" <$> doublebrackets
where doublebrackets = try $ do
string "{{"
+ notFollowedBy (char '{')
contents <- manyTill anyChar (try $ string "}}")
return $ "{{" ++ contents ++ "}}"
@@ -180,7 +180,8 @@ hrule :: MWParser Blocks
hrule = B.horizontalRule <$ try (string "----" *> many (char '-') *> newline)
preformatted :: MWParser Blocks
-preformatted = do
+preformatted = try $ do
+ getPosition >>= \pos -> guard (sourceColumn pos == 1)
char ' '
let endline' = B.linebreak <$ (try $ newline <* char ' ')
let whitespace' = B.str <$> many1 ('\160' <$ spaceChar)
@@ -280,11 +281,19 @@ inline = whitespace
<|> inlineTag
<|> B.singleton <$> charRef
<|> inlineHtml
+ <|> variable
<|> special
str :: MWParser Inlines
str = B.str <$> many1 (noneOf $ specialChars ++ spaceChars)
+variable :: MWParser Inlines
+variable = B.rawInline "mediawiki" <$> triplebrackets
+ where triplebrackets = try $ do
+ string "{{{"
+ contents <- manyTill anyChar (try $ string "}}}")
+ return $ "{{{" ++ contents ++ "}}}"
+
inlineTag :: MWParser Inlines
inlineTag = do
(TagOpen t _, raw) <- htmlTag (\x -> isInlineTag x && isTagOpen x)
diff --git a/tests/mediawiki-reader.native b/tests/mediawiki-reader.native
index 6eac94b9d..48f362078 100644
--- a/tests/mediawiki-reader.native
+++ b/tests/mediawiki-reader.native
@@ -135,4 +135,12 @@ Pandoc (Meta {docTitle = [], docAuthors = [], docDate = []})
,Header 2 [Str "preformatted",Space,Str "blocks"]
,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."]
,Para [Code ("",[],[]) "\160hell\160\160\160\160\160\160yeah"]
-,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"]]
+,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"]
+,Para [Str "Not"]
+,RawBlock "html" "<hr/>"
+,Para [Str "preformatted"]
+,Header 2 [Str "templates"]
+,RawBlock "mediawiki" "{{Welcome}}"
+,RawBlock "mediawiki" "{{Foo:Bar}}"
+,RawBlock "mediawiki" "{{Thankyou|all your effort|Me}}"
+,Para [Str "Written",Space,RawInline "mediawiki" "{{{date}}}",Space,Str "by",Space,RawInline "mediawiki" "{{{name}}}",Str "."]]
diff --git a/tests/mediawiki-reader.wiki b/tests/mediawiki-reader.wiki
index 7066b4a59..bb4ede110 100644
--- a/tests/mediawiki-reader.wiki
+++ b/tests/mediawiki-reader.wiki
@@ -217,4 +217,15 @@ def function():
else:
print False</nowiki>
+Not<hr/> preformatted
+
+== templates ==
+
+{{Welcome}}
+
+{{Foo:Bar}}
+
+{{Thankyou|all your effort|Me}}
+
+Written {{{date}}} by {{{name}}}.