git.iko.soy/typeable/pandoc
on master help sign in
MediaWiki reader: Support HTML lists.
81bec85John MacFarlane
src/Text/Pandoc/Readers/MediaWiki.hs+29−12
@@ -30,9 +30,6 @@ Conversion of mediawiki text to 'Pandoc' document.
30-}
30-}
31{-
31{-
32TODO:
32TODO:
33−_ support HTML lists
34−_ support list style attributes and start values in ol lists, also
35− value attribute on li
36_ support internal links http://www.mediawiki.org/wiki/Help:Links
33_ support internal links http://www.mediawiki.org/wiki/Help:Links
37_ support external links (partially implemented)
34_ support external links (partially implemented)
38_ support images http://www.mediawiki.org/wiki/Help:Images
35_ support images http://www.mediawiki.org/wiki/Help:Images
@@ -50,7 +47,7 @@ import Text.Pandoc.Readers.HTML ( htmlTag, isInlineTag,
50import Text.Pandoc.XML ( fromEntities )
47import Text.Pandoc.XML ( fromEntities )
51import Text.Pandoc.Parsing
48import Text.Pandoc.Parsing
52import Text.Pandoc.Generic ( bottomUp )
49import Text.Pandoc.Generic ( bottomUp )
53−import Text.Pandoc.Shared ( stripTrailingNewlines )
50+import Text.Pandoc.Shared ( stripTrailingNewlines, safeRead )
54import Data.Monoid (mconcat, mempty)
51import Data.Monoid (mconcat, mempty)
55import Control.Applicative ((<$>), (<*), (*>), (<$))
52import Control.Applicative ((<$>), (<*), (*>), (<$))
56import Control.Monad
53import Control.Monad
@@ -121,8 +118,8 @@ block :: MWParser Blocks
121block = mempty <$ skipMany1 blankline
118block = mempty <$ skipMany1 blankline
122 <|> header
119 <|> header
123 <|> hrule
120 <|> hrule
124− <|> bulletList
125 <|> orderedList
121 <|> orderedList
122+ <|> bulletList
126 <|> definitionList
123 <|> definitionList
127 <|> mempty <$ try (spaces *> htmlComment)
124 <|> mempty <$ try (spaces *> htmlComment)
128 <|> preformatted
125 <|> preformatted
@@ -151,7 +148,7 @@ blockTag = do
151 "pre" -> B.codeBlock . trimCode <$> charsInTags "pre"
148 "pre" -> B.codeBlock . trimCode <$> charsInTags "pre"
152 "syntaxhighlight" -> syntaxhighlight attrs
149 "syntaxhighlight" -> syntaxhighlight attrs
153 "haskell" -> B.codeBlockWith ("",["haskell"],[]) . trimCode <$>
150 "haskell" -> B.codeBlockWith ("",["haskell"],[]) . trimCode <$>
154− charsInTags "haskell"
151+ charsInTags "haskell"
155 "p" -> return mempty
152 "p" -> return mempty
156 _ -> return $ B.rawBlock "html" raw
153 _ -> return $ B.rawBlock "html" raw
157
154
@@ -207,10 +204,23 @@ header = try $ do
207 return $ B.header lev contents
204 return $ B.header lev contents
208
205
209bulletList :: MWParser Blocks
206bulletList :: MWParser Blocks
210−bulletList = B.bulletList <$> many1 (listItem '*')
207+bulletList = B.bulletList <$>
208+ ( many1 (listItem '*')
209+ <|> (htmlTag (~== TagOpen "ul" []) *> spaces *> many (listItem '*' <|> li) <*
210+ optional (htmlTag (~== TagClose "ul"))) )
211
211
212orderedList :: MWParser Blocks
212orderedList :: MWParser Blocks
213+orderedList =
213−orderedList = B.orderedList <$> many1 (listItem '#')
214+ (B.orderedList <$> many1 (listItem '#'))
215+ <|> (B.orderedList <$> (htmlTag (~== TagOpen "ul" []) *> spaces *>
216+ many (listItem '#' <|> li) <*
217+ optional (htmlTag (~== TagClose "ul"))))
218+ <|> do (tag,_) <- htmlTag (~== TagOpen "ol" [])
219+ spaces
220+ items <- many (listItem '#' <|> li)
221+ optional (htmlTag (~== TagClose "ol"))
222+ let start = maybe 1 id $ safeRead $ fromAttrib "start" tag
223+ return $ B.orderedListWith (start, DefaultStyle, DefaultDelim) items
214
224
215definitionList :: MWParser Blocks
225definitionList :: MWParser Blocks
216definitionList = B.definitionList <$> many1 defListItem
226definitionList = B.definitionList <$> many1 defListItem
@@ -237,6 +247,10 @@ anyListStart = char '*'
237 <|> char ':'
247 <|> char ':'
238 <|> char ';'
248 <|> char ';'
239
249
250+li :: MWParser Blocks
251+li = htmlTag (~== TagOpen "li" []) *>
252+ (firstParaToPlain <$> blocksInTags "li") <* spaces
253+
240listItem :: Char -> MWParser Blocks
254listItem :: Char -> MWParser Blocks
241listItem c = try $ do
255listItem c = try $ do
242 extras <- many (try $ char c <* lookAhead listStartChar)
256 extras <- many (try $ char c <* lookAhead listStartChar)
@@ -261,11 +275,14 @@ listItem' c = try $ do
261 first <- manyTill anyChar newline
275 first <- manyTill anyChar newline
262 rest <- many (try $ char c *> lookAhead listStartChar *>
276 rest <- many (try $ char c *> lookAhead listStartChar *>
263 manyTill anyChar newline)
277 manyTill anyChar newline)
264− contents <- parseFromString (mconcat <$> many1 block)
278+ parseFromString (firstParaToPlain . mconcat <$> many1 block)
265− $ unlines $ first : rest
279+ $ unlines $ first : rest
280+
281+firstParaToPlain :: Blocks -> Blocks
282+firstParaToPlain contents =
266 case viewl (B.unMany contents) of
283 case viewl (B.unMany contents) of
267− (Para xs) :< ys -> return $ B.Many $ (Plain xs) <| ys
284+ (Para xs) :< ys -> B.Many $ (Plain xs) <| ys
268− _ -> return contents
285+ _ -> contents
269
286
270--
287--
271-- inline parsers
288-- inline parsers
tests/mediawiki-reader.native+15
@@ -130,6 +130,21 @@ Pandoc (Meta {docTitle = [], docAuthors = [], docDate = []})
130 ,OrderedList (1,DefaultStyle,DefaultDelim)
130 ,OrderedList (1,DefaultStyle,DefaultDelim)
131 [[Plain [Str "five",Space,Str "sub",Space,Str "1",Space,Str "sub",Space,Str "1"]]]]
131 [[Plain [Str "five",Space,Str "sub",Space,Str "1",Space,Str "sub",Space,Str "1"]]]]
132 ,[Plain [Str "five",Space,Str "sub",Space,Str "2"]]]]]
132 ,[Plain [Str "five",Space,Str "sub",Space,Str "2"]]]]]
133+,OrderedList (1,DefaultStyle,DefaultDelim)
134+ [[Plain [Str "list",Space,Str "item",Space,Emph [Str "emph"]]
135+ ,OrderedList (1,DefaultStyle,DefaultDelim)
136+ [[Plain [Str "list",Space,Str "item",Space,Str "B1"]]
137+ ,[Plain [Str "list",Space,Str "item",Space,Str "B2"]]]
138+ ,Para [Str "continuing",Space,Str "list",Space,Str "item",Space,Str "A1"]]
139+ ,[Plain [Str "list",Space,Str "item",Space,Str "A2"]]]
140+,OrderedList (1,DefaultStyle,DefaultDelim)
141+ [[Plain [Str "abc"]]
142+ ,[Plain [Str "def"]]
143+ ,[Plain [Str "ghi"]]]
144+,OrderedList (9,DefaultStyle,DefaultDelim)
145+ [[Plain [Str "Amsterdam"]]
146+ ,[Plain [Str "Rotterdam"]]
147+ ,[Plain [Str "The",Space,Str "Hague"]]]
133,Header 2 [Str "math"]
148,Header 2 [Str "math"]
134,Para [Str "Here",Space,Str "is",Space,Str "some",Space,Math InlineMath "x=\\frac{y^\\pi}{z}",Str "."]
149,Para [Str "Here",Space,Str "is",Space,Str "some",Space,Math InlineMath "x=\\frac{y^\\pi}{z}",Str "."]
135,Header 2 [Str "preformatted",Space,Str "blocks"]
150,Header 2 [Str "preformatted",Space,Str "blocks"]
tests/mediawiki-reader.wiki+22
@@ -189,6 +189,28 @@ ends the list.
189### five sub 1 sub 1
189### five sub 1 sub 1
190## five sub 2
190## five sub 2
191
191
192+<ol>
193+ <li>list item ''emph''
194+ <ol>
195+ <li>list item B1</li>
196+ <li>list item B2</li>
197+ </ol>continuing list item A1
198+ </li>
199+ <li>list item A2</li>
200+</ol>
201+
202+<ul>
203+#abc
204+#def
205+#ghi
206+</ul>
207+
208+<ol start="9">
209+<li>Amsterdam</li>
210+<li>Rotterdam</li>
211+<li>The Hague</li>
212+</ol>
213+
192== math ==
214== math ==
193
215
194Here is some <math>x=\frac{y^\pi}{z}</math>.
216Here is some <math>x=\frac{y^\pi}{z}</math>.