aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc
diff options
context:
space:
mode:
Diffstat (limited to 'src/Text/Pandoc')
-rw-r--r--src/Text/Pandoc/Writers/RST.hs8
-rw-r--r--src/Text/Pandoc/Writers/Shared.hs24
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