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.
This commit is contained in:
John MacFarlane 2021-05-20 17:12:00 -07:00
parent bb11f5fb86
commit d7b5def287
3 changed files with 92 additions and 6 deletions

View file

@ -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

40
test/command/7288.md Normal file
View file

@ -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
```

View file

@ -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