aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2021-05-20 17:12:00 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2021-05-20 17:12:38 -0700
commitd7b5def287aefe91f881daeecc5f72121c843b66 (patch)
tree37c3a7e85b025d2c264808ca3f44a4ad9bbc5693
parentbb11f5fb86993559f9999d4795355b02ae78cc3d (diff)
downloadpandoc-d7b5def287aefe91f881daeecc5f72121c843b66.tar.gz
Ms writer: handle tables with multiple paragraphs.
Previously they overflowed the table cell width. We now set line lengths per-cell and restore them after the table has been written. Closes #7288.
-rw-r--r--src/Text/Pandoc/Writers/Ms.hs28
-rw-r--r--test/command/7288.md40
-rw-r--r--test/tables.ms30
3 files changed, 92 insertions, 6 deletions
diff --git a/src/Text/Pandoc/Writers/Ms.hs b/src/Text/Pandoc/Writers/Ms.hs
index 0ed7a8a64..97c23f24d 100644
--- a/src/Text/Pandoc/Writers/Ms.hs
+++ b/src/Text/Pandoc/Writers/Ms.hs
@@ -245,13 +245,17 @@ blockToMs opts (Table _ blkCapt specs thead tbody tfoot) =
aligncode AlignDefault = "l"
in do
caption' <- inlineListToMs' opts caption
- let iwidths = if all (== 0) widths
- then repeat ""
- else map (T.pack . printf "w(%0.1fn)" . (70 *)) widths
+ let isSimple = all (== 0) widths
+ let totalWidth = 70
-- 78n default width - 8n indent = 70n
let coldescriptions = literal $ T.unwords
- (zipWith (\align width -> aligncode align <> width)
- alignments iwidths) <> "."
+ (zipWith (\align width -> aligncode align <>
+ if width == 0
+ then ""
+ else T.pack $
+ printf "w(%0.1fn)"
+ (totalWidth * width))
+ alignments widths) <> "."
colheadings <- mapM (blockListToMs opts) headers
let makeRow cols = literal "T{" $$
vcat (intersperse (literal "T}\tT{") cols) $$
@@ -260,13 +264,25 @@ blockToMs opts (Table _ blkCapt specs thead tbody tfoot) =
then empty
else makeRow colheadings $$ char '_'
body <- mapM (\row -> do
- cols <- mapM (blockListToMs opts) row
+ cols <- mapM (\(cell, w) ->
+ (if isSimple
+ then id
+ else (literal (".nr LL " <>
+ T.pack (printf "%0.1fn"
+ (w * totalWidth))) $$)) <$>
+ blockListToMs opts cell) (zip row widths)
return $ makeRow cols) rows
setFirstPara
return $ literal ".PP" $$ caption' $$
literal ".na" $$ -- we don't want justification in table cells
+ (if isSimple
+ then ""
+ else ".nr LLold \\n[LL]") $$
literal ".TS" $$ literal "delim(@@) tab(\t);" $$ coldescriptions $$
colheadings' $$ vcat body $$ literal ".TE" $$
+ (if isSimple
+ then ""
+ else ".nr LL \\n[LLold]") $$
literal ".ad"
blockToMs opts (BulletList items) = do
diff --git a/test/command/7288.md b/test/command/7288.md
new file mode 100644
index 000000000..e94aeeeb3
--- /dev/null
+++ b/test/command/7288.md
@@ -0,0 +1,40 @@
+```
+% pandoc -f rst -t ms
+.. list-table::
+ :widths: 50 50
+ :header-rows: 1
+
+ * - Left
+ - Right
+ * - Long text that should be easy to break up into multiple lines
+ - Another long text that should be easy to break up into multiple lines
+
+ Bar
+^D
+.PP
+.na
+.nr LLold \n[LL]
+.TS
+delim(@@) tab( );
+lw(35.0n) lw(35.0n).
+T{
+Left
+T} T{
+Right
+T}
+_
+T{
+.nr LL 35.0n
+.LP
+Long text that should be easy to break up into multiple lines
+T} T{
+.nr LL 35.0n
+.PP
+Another long text that should be easy to break up into multiple lines
+.PP
+Bar
+T}
+.TE
+.nr LL \n[LLold]
+.ad
+```
diff --git a/test/tables.ms b/test/tables.ms
index 7337db25f..21183a5eb 100644
--- a/test/tables.ms
+++ b/test/tables.ms
@@ -143,6 +143,7 @@ Multiline table with caption:
.PP
Here\[cq]s the caption. It may span multiple lines.
.na
+.nr LLold \n[LL]
.TS
delim(@@) tab( );
cw(10.5n) lw(9.6n) rw(11.4n) lw(24.5n).
@@ -157,30 +158,40 @@ Default aligned
T}
_
T{
+.nr LL 10.5n
First
T} T{
+.nr LL 9.6n
row
T} T{
+.nr LL 11.4n
12.0
T} T{
+.nr LL 24.5n
Example of a row that spans multiple lines.
T}
T{
+.nr LL 10.5n
Second
T} T{
+.nr LL 9.6n
row
T} T{
+.nr LL 11.4n
5.0
T} T{
+.nr LL 24.5n
Here\[cq]s another one.
Note the blank line between rows.
T}
.TE
+.nr LL \n[LLold]
.ad
.LP
Multiline table without caption:
.PP
.na
+.nr LLold \n[LL]
.TS
delim(@@) tab( );
cw(10.5n) lw(9.6n) rw(11.4n) lw(24.5n).
@@ -195,25 +206,34 @@ Default aligned
T}
_
T{
+.nr LL 10.5n
First
T} T{
+.nr LL 9.6n
row
T} T{
+.nr LL 11.4n
12.0
T} T{
+.nr LL 24.5n
Example of a row that spans multiple lines.
T}
T{
+.nr LL 10.5n
Second
T} T{
+.nr LL 9.6n
row
T} T{
+.nr LL 11.4n
5.0
T} T{
+.nr LL 24.5n
Here\[cq]s another one.
Note the blank line between rows.
T}
.TE
+.nr LL \n[LLold]
.ad
.LP
Table without column headers:
@@ -255,27 +275,37 @@ T}
Multiline table without column headers:
.PP
.na
+.nr LLold \n[LL]
.TS
delim(@@) tab( );
cw(10.5n) lw(9.6n) rw(11.4n) lw(24.5n).
T{
+.nr LL 10.5n
First
T} T{
+.nr LL 9.6n
row
T} T{
+.nr LL 11.4n
12.0
T} T{
+.nr LL 24.5n
Example of a row that spans multiple lines.
T}
T{
+.nr LL 10.5n
Second
T} T{
+.nr LL 9.6n
row
T} T{
+.nr LL 11.4n
5.0
T} T{
+.nr LL 24.5n
Here\[cq]s another one.
Note the blank line between rows.
T}
.TE
+.nr LL \n[LLold]
.ad