diff options
author | John MacFarlane <jgm@berkeley.edu> | 2019-11-15 23:09:53 -0800 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2019-11-15 23:09:53 -0800 |
commit | 1f69162ffd5f16367d2de0b62c9a80f4d3b9bc59 (patch) | |
tree | 40177e3c06735d88b1d1b8799454cb78b117b1b0 /src/Text/Pandoc/Writers | |
parent | 6c1692ea2271446caba6e95d43aeee6db805e3ce (diff) | |
download | pandoc-1f69162ffd5f16367d2de0b62c9a80f4d3b9bc59.tar.gz |
RST writer: Improve spacing for tables with no width information.
If a simple table would be too wide, we use a grid table.
The code for generating grid tables has been adjusted to
give more intelligent column widths when widths aren't
given. (This also affects the markdown writer.)
Closes #5899.
Diffstat (limited to 'src/Text/Pandoc/Writers')
-rw-r--r-- | src/Text/Pandoc/Writers/RST.hs | 8 | ||||
-rw-r--r-- | src/Text/Pandoc/Writers/Shared.hs | 24 |
2 files changed, 26 insertions, 6 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 |