summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2017-03-02 16:48:53 +0100
committerJohn MacFarlane <jgm@berkeley.edu>2017-03-02 16:48:53 +0100
commit4d25bba5f7a620ee6fe43c43d1a14cce4c357858 (patch)
tree53c918d0b13825af2374d9742855fa66d9392efe
parent46135ac8758c4fbb9dfe676b1462463f5476bbff (diff)
RST reader: Handle multiline cells in simple tables.
Closes #1166.
-rw-r--r--src/Text/Pandoc/Readers/RST.hs24
-rw-r--r--test/command/1166.md48
2 files changed, 64 insertions, 8 deletions
diff --git a/src/Text/Pandoc/Readers/RST.hs b/src/Text/Pandoc/Readers/RST.hs
index fbba022fa..d3e253da8 100644
--- a/src/Text/Pandoc/Readers/RST.hs
+++ b/src/Text/Pandoc/Readers/RST.hs
@@ -1029,22 +1029,29 @@ simpleTableFooter = try $ simpleTableSep '=' >> blanklines
-- Parse a raw line and split it into chunks by indices.
simpleTableRawLine :: Monad m => [Int] -> RSTParser m [String]
-simpleTableRawLine indices = do
- line <- many1Till anyChar newline
- return (simpleTableSplitLine indices line)
+simpleTableRawLine indices = simpleTableSplitLine indices <$> anyLine
+
+simpleTableRawLineWithEmptyCell :: Monad m => [Int] -> RSTParser m [String]
+simpleTableRawLineWithEmptyCell indices = try $ do
+ cs <- simpleTableRawLine indices
+ let isEmptyCell = all (\c -> c == ' ' || c == '\t')
+ guard $ any isEmptyCell cs
+ return cs
-- Parse a table row and return a list of blocks (columns).
simpleTableRow :: PandocMonad m => [Int] -> RSTParser m [Blocks]
simpleTableRow indices = do
notFollowedBy' simpleTableFooter
firstLine <- simpleTableRawLine indices
- colLines <- return [] -- TODO
- let cols = map unlines . transpose $ firstLine : colLines
- mapM (parseFromString (mconcat <$> many plain)) cols
+ conLines <- many $ simpleTableRawLineWithEmptyCell indices
+ let cols = map unlines . transpose $ firstLine : conLines ++
+ [replicate (length indices) ""
+ | not (null conLines)]
+ mapM (parseFromString parseBlocks) cols
simpleTableSplitLine :: [Int] -> String -> [String]
simpleTableSplitLine indices line =
- map trim
+ map trimr
$ tail $ splitByIndices (init indices) line
simpleTableHeader :: PandocMonad m
@@ -1125,7 +1132,8 @@ hyphens = do
escapedChar :: Monad m => ParserT [Char] st m Inlines
escapedChar = do c <- escaped anyChar
- return $ if c == ' ' -- '\ ' is null in RST
+ return $ if c == ' ' || c == '\n' || c == '\r'
+ -- '\ ' is null in RST
then mempty
else B.str [c]
diff --git a/test/command/1166.md b/test/command/1166.md
new file mode 100644
index 000000000..756a065db
--- /dev/null
+++ b/test/command/1166.md
@@ -0,0 +1,48 @@
+See #1166 and <http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#simple-tables>.
+
+```
+% pandoc -f rst -t html5
+===== =====
+col 1 col 2
+===== =====
+1 Second column of row 1.
+2 Second column of row 2.
+ Second line of paragraph.
+3 - Second column of row 3.
+
+ - Second item in bullet
+ list (row 3, column 2).
+\ Row 4; column 1 will be empty.
+===== =====
+^D
+<table>
+<thead>
+<tr class="header">
+<th>col 1</th>
+<th>col 2</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td>1</td>
+<td>Second column of row 1.</td>
+</tr>
+<tr class="even">
+<td><p>2</p></td>
+<td><p>Second column of row 2. Second line of paragraph.</p></td>
+</tr>
+<tr class="odd">
+<td><p>3</p></td>
+<td><ul>
+<li>Second column of row 3.</li>
+<li>Second item in bullet list (row 3, column 2).</li>
+</ul></td>
+</tr>
+<tr class="even">
+<td></td>
+<td>Row 4; column 1 will be empty.</td>
+</tr>
+</tbody>
+</table>
+```
+