From d7b5def287aefe91f881daeecc5f72121c843b66 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Thu, 20 May 2021 17:12:00 -0700 Subject: 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. --- src/Text/Pandoc/Writers/Ms.hs | 28 ++++++++++++++++++++++------ test/command/7288.md | 40 ++++++++++++++++++++++++++++++++++++++++ test/tables.ms | 30 ++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 6 deletions(-) create mode 100644 test/command/7288.md 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 -- cgit v1.2.3