diff options
author | John MacFarlane <jgm@berkeley.edu> | 2018-03-28 08:59:34 -0700 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2018-03-28 08:59:34 -0700 |
commit | 5a79948e0c689ffbcb91355a5575bc46464fa8d2 (patch) | |
tree | bbdbb98e98ee13c104db2a4f39e1ce338e25be26 | |
parent | d0a7dbd948351a6622a4d670bfbb8ef622e6278f (diff) | |
download | pandoc-5a79948e0c689ffbcb91355a5575bc46464fa8d2.tar.gz |
Mediawiki reader: improve table parsing.
This fixes detection of table attributes and also
handles `!` characters in cells.
Closes #4508.
-rw-r--r-- | src/Text/Pandoc/Readers/MediaWiki.hs | 23 | ||||
-rw-r--r-- | test/command/2649.md | 20 |
2 files changed, 29 insertions, 14 deletions
diff --git a/src/Text/Pandoc/Readers/MediaWiki.hs b/src/Text/Pandoc/Readers/MediaWiki.hs index a07f66e7a..498f80216 100644 --- a/src/Text/Pandoc/Readers/MediaWiki.hs +++ b/src/Text/Pandoc/Readers/MediaWiki.hs @@ -232,7 +232,8 @@ para = do table :: PandocMonad m => MWParser m Blocks table = do tableStart - styles <- option [] parseAttrs + styles <- option [] $ + parseAttrs <* skipMany spaceChar <* optional (char '|') skipMany spaceChar optional blanklines let tableWidth = case lookup "width" styles of @@ -283,17 +284,29 @@ rowsep = try $ guardColumnOne *> skipSpaces *> sym "|-" <* cellsep :: PandocMonad m => MWParser m () cellsep = try $ do + col <- sourceColumn <$> getPosition skipSpaces - (char '|' *> notFollowedBy (oneOf "-}+") *> optional (char '|')) - <|> (char '!' *> optional (char '!')) + let pipeSep = do + char '|' + notFollowedBy (oneOf "-}+") + if col == 1 + then optional (char '|') + else void (char '|') + let exclSep = do + char '!' + if col == 1 + then optional (char '!') + else void (char '!') + pipeSep <|> exclSep tableCaption :: PandocMonad m => MWParser m Inlines tableCaption = try $ do guardColumnOne skipSpaces sym "|+" - optional (try $ parseAttr *> skipSpaces *> char '|' *> skipSpaces) - (trimInlines . mconcat) <$> many (notFollowedBy (cellsep <|> rowsep) *> inline) + optional (try $ parseAttr *> skipSpaces *> char '|' *> blanklines) + (trimInlines . mconcat) <$> + many (notFollowedBy (cellsep <|> rowsep) *> inline) tableRow :: PandocMonad m => MWParser m [((Alignment, Double), Blocks)] tableRow = try $ skipMany htmlComment *> many tableCell diff --git a/test/command/2649.md b/test/command/2649.md index 8f594cfe1..52ae16ce4 100644 --- a/test/command/2649.md +++ b/test/command/2649.md @@ -67,7 +67,8 @@ ! Aantal |- | 1 -|align=left| {{FR-VLAG}} [[Sébastien Loeb]] | 78 +|align=left| {{FR-VLAG}} [[Sébastien Loeb]] +| 78 |- | 2 |align=left| {{FR-VLAG}} '''[[Sébastien Ogier]]''' @@ -79,24 +80,25 @@ |} ^D <table> +<thead> +<tr class="header"> +<th><p>Plaats</p></th> +<th><p>Rijder</p></th> +<th><p>Aantal</p></th> +</tr> +</thead> <tbody> <tr class="odd"> -<td></td> -<td><p>Plaats</p></td> -<td><p>Rijder</p></td> -<td><p>Aantal</p></td> -</tr> -<tr class="even"> <td><p>1</p></td> <td><p><a href="Sébastien_Loeb" title="wikilink">Sébastien Loeb</a></p></td> <td><p>78</p></td> </tr> -<tr class="odd"> +<tr class="even"> <td><p>2</p></td> <td><p><strong><a href="Sébastien_Ogier" title="wikilink">Sébastien Ogier</a></strong></p></td> <td><p>38</p></td> </tr> -<tr class="even"> +<tr class="odd"> <td><p>10</p></td> <td><p><a href="Hannu_Mikkola" title="wikilink">Hannu Mikkola</a></p></td> <td><p>18</p></td> |