diff options
-rw-r--r-- | src/Text/Pandoc/Writers/RST.hs | 8 | ||||
-rw-r--r-- | src/Text/Pandoc/Writers/Shared.hs | 24 | ||||
-rw-r--r-- | test/command/5128.md | 26 | ||||
-rw-r--r-- | test/command/5899.md | 51 |
4 files changed, 94 insertions, 15 deletions
diff --git a/src/Text/Pandoc/Writers/RST.hs b/src/Text/Pandoc/Writers/RST.hs index 4a3b1b066..dc732b0e6 100644 --- a/src/Text/Pandoc/Writers/RST.hs +++ b/src/Text/Pandoc/Writers/RST.hs @@ -296,7 +296,13 @@ blockToRST (Table caption aligns widths headers rows) = do opts <- gets stOptions let isSimple = all (== 0) widths tbl <- if isSimple - then simpleTable opts blocksToDoc headers rows + then do + tbl' <- simpleTable opts blocksToDoc headers rows + if offset tbl' > writerColumns opts + then gridTable opts blocksToDoc (all null headers) + (map (const AlignDefault) aligns) widths + headers rows + else return tbl' else gridTable opts blocksToDoc (all null headers) (map (const AlignDefault) aligns) widths headers rows diff --git a/src/Text/Pandoc/Writers/Shared.hs b/src/Text/Pandoc/Writers/Shared.hs index 39035832f..0161db506 100644 --- a/src/Text/Pandoc/Writers/Shared.hs +++ b/src/Text/Pandoc/Writers/Shared.hs @@ -229,8 +229,7 @@ gridTable opts blocksToDoc headless aligns widths headers rows = do -- handleGivenWidths wraps the given blocks in order for them to fit -- in cells with given widths. the returned content can be -- concatenated with borders and frames - let handleGivenWidths widths' = do - let widthsInChars' = officialWidthsInChars widths' + let handleGivenWidthsInChars widthsInChars' = do -- replace page width (in columns) in the options with a -- given width if smaller (adjusting by two) let useWidth w = opts{writerColumns = min (w - 2) (writerColumns opts)} @@ -241,6 +240,8 @@ gridTable opts blocksToDoc headless aligns widths headers rows = do (\cs -> zipWithM blocksToDoc columnOptions cs) rows return (widthsInChars', rawHeaders', rawRows') + let handleGivenWidths widths' = handleGivenWidthsInChars + (officialWidthsInChars widths') -- handleFullWidths tries to wrap cells to the page width or even -- more in cases where `--wrap=none`. thus the content here is left -- as wide as possible @@ -262,9 +263,22 @@ gridTable opts blocksToDoc headless aligns widths headers rows = do let handleZeroWidths widths' = do (widthsInChars', rawHeaders', rawRows') <- handleFullWidths widths' if foldl' (+) 0 widthsInChars' > writerColumns opts - then -- use even widths - handleGivenWidths - (replicate numcols (1.0 / fromIntegral numcols) :: [Double]) + then do -- use even widths except for thin columns + let evenCols = max 5 + (((writerColumns opts - 1) `div` numcols) - 3) + let (numToExpand, colsToExpand) = + foldr (\w (n, tot) -> if w < evenCols + then (n, tot + (evenCols - w)) + else (n + 1, tot)) + (0,0) widthsInChars' + let expandAllowance = colsToExpand `div` numToExpand + let newWidthsInChars = map (\w -> if w < evenCols + then w + else min + (evenCols + expandAllowance) + w) + widthsInChars' + handleGivenWidthsInChars newWidthsInChars else return (widthsInChars', rawHeaders', rawRows') -- render the contents of header and row cells differently depending -- on command line options, widths given in this specific table, and diff --git a/test/command/5128.md b/test/command/5128.md index 2ab051c04..35866547e 100644 --- a/test/command/5128.md +++ b/test/command/5128.md @@ -1,5 +1,5 @@ ``` -pandoc -f org -t rst +pandoc -f org -t rst --columns=78 | Option | Meaning | |--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | =<= | Left alignment, additional characters are added to the right (default for string). | @@ -7,12 +7,20 @@ pandoc -f org -t rst | =^= | Centered , the same amount of characters is added to the left and the right. | | === | Padding. If a numeric value is printed with a sign, then additional characters are added after the sign. Otherwise it behaves like "=>=". This option is only available for numbers (default for numbers). | ^D -====== ============================================================================================================================================================================================================ -Option Meaning -====== ============================================================================================================================================================================================================ -``<`` Left alignment, additional characters are added to the right (default for string). -``>`` Right alignment, additional characters are added to the left. -``^`` Centered , the same amount of characters is added to the left and the right. -``=`` Padding. If a numeric value is printed with a sign, then additional characters are added after the sign. Otherwise it behaves like "``>``". This option is only available for numbers (default for numbers). -====== ============================================================================================================================================================================================================ ++--------+------------------------------------------------------------------+ +| Option | Meaning | ++========+==================================================================+ +| ``<`` | Left alignment, additional characters are added to the right | +| | (default for string). | ++--------+------------------------------------------------------------------+ +| ``>`` | Right alignment, additional characters are added to the left. | ++--------+------------------------------------------------------------------+ +| ``^`` | Centered , the same amount of characters is added to the left | +| | and the right. | ++--------+------------------------------------------------------------------+ +| ``=`` | Padding. If a numeric value is printed with a sign, then | +| | additional characters are added after the sign. Otherwise it | +| | behaves like "``>``". This option is only available for numbers | +| | (default for numbers). | ++--------+------------------------------------------------------------------+ ``` diff --git a/test/command/5899.md b/test/command/5899.md new file mode 100644 index 000000000..28e020d20 --- /dev/null +++ b/test/command/5899.md @@ -0,0 +1,51 @@ +``` +% pandoc -f html -t rst +<html> + <body> + <ul> + <li>A list of stuff with a table inside + <table> + <thead> + <tr> + <th>First</th><th>Second</th><th>Third</th> + </tr> + </thead> + <tbody> + <tr> + <td>First</td> + <td> + The big long table cell. + The big long table cell. + The big long table cell. + The big long table cell. + The big long table cell. + The big long table cell. + The big long table cell. + The big long table cell. + The big long table cell. + The big long table cell. + </td> + <td>Third</td> + </tr> + </tbody> + </table> + </li> + <li>Another list item</li> + </ul> + </body> +</html> +^D +- A list of stuff with a table inside + + +-------+----------------------------------------------------+-------+ + | First | Second | Third | + +=======+====================================================+=======+ + | First | The big long table cell. The big long table cell. | Third | + | | The big long table cell. The big long table cell. | | + | | The big long table cell. The big long table cell. | | + | | The big long table cell. The big long table cell. | | + | | The big long table cell. The big long table cell. | | + +-------+----------------------------------------------------+-------+ + +- Another list item + ``` |