git.iko.soy/typeable/pandoc
on master help sign in
HTML writer: render table footers if present

Part of: #6314

commita400d0dc623a2f08d7470788855e880291d2f222 authorAlbert Krewinkel <albert@zeitkraut.de> dateSat 12 Sep 2020, 20:44 (6 years ago) parent22babd5
6 files changed+224−29
pandoc.cabal+3 src/Text/Pandoc/Writers/HTML.hs+50−23 test/Tests/Old.hs+7−6 test/tables/nordics.html4+59 test/tables/nordics.html5+59 test/tables/nordics.native+46
pandoc.cabal+3
@@ -288,6 +288,9 @@ extra-source-files:
288288 test/tables.muse
289289 test/tables.custom
290290 test/tables.xwiki
291+ test/tables/*.html4
292+ test/tables/*.html5
293+ test/tables/*.native
291294 test/testsuite.txt
292295 test/writer.latex
293296 test/writer.context
src/Text/Pandoc/Writers/HTML.hs+50−23
@@ -910,7 +910,7 @@ tableToHtml :: PandocMonad m
910910 => WriterOptions
911911 -> Ann.Table
912912 -> StateT WriterState m Html
913−tableToHtml opts (Ann.Table attr caption colspecs thead tbodies _tfoot) = do
913+tableToHtml opts (Ann.Table attr caption colspecs thead tbodies tfoot) = do
914914 captionDoc <- case caption of
915915 Caption _ [] -> return mempty
916916 Caption _ longCapt -> do
@@ -921,11 +921,11 @@ tableToHtml opts (Ann.Table attr caption colspecs thead tbodies _tfoot) = do
921921 coltags <- colSpecListToHtml opts colspecs
922922 head' <- tableHeadToHtml opts thead
923923 body' <- mconcat <$> mapM (tableBodyToHtml opts) tbodies
924+ foot' <- tableFootToHtml opts tfoot
924925 let (ident,classes,kvs) = attr
925926 -- When widths of columns are < 100%, we need to set width for the whole
926927 -- table, or some browsers give us skinny columns with lots of space
927928 -- between:
928− -- let totalWidth = sum widths
929929 let colWidth = \case
930930 ColWidth d -> d
931931 ColWidthDefault -> 0
@@ -936,8 +936,14 @@ tableToHtml opts (Ann.Table attr caption colspecs thead tbodies _tfoot) = do
936936 T.pack (show (round (totalWidth * 100) :: Int))
937937 <> "%;"):kvs)
938938 _ -> attr
939− addAttrs opts attr' $ H.table $
940− nl opts *> captionDoc *> coltags *> head' *> body' *> nl opts
939+ addAttrs opts attr' $ H.table $ do
940+ nl opts
941+ captionDoc
942+ coltags
943+ head'
944+ body'
945+ foot'
946+ nl opts
941947
942948tableBodyToHtml :: PandocMonad m
943949 => WriterOptions
@@ -951,36 +957,57 @@ tableHeadToHtml :: PandocMonad m
951957 -> Ann.TableHead
952958 -> StateT WriterState m Html
953959tableHeadToHtml opts (Ann.TableHead attr rows) =
960+ tablePartToHtml opts Thead attr rows
961+
962+tableFootToHtml :: PandocMonad m
963+ => WriterOptions
964+ -> Ann.TableFoot
965+ -> StateT WriterState m Html
966+tableFootToHtml opts (Ann.TableFoot attr rows) =
967+ tablePartToHtml opts Tfoot attr rows
968+
969+tablePartToHtml :: PandocMonad m
970+ => WriterOptions
971+ -> TablePart
972+ -> Attr
973+ -> [Ann.HeaderRow]
974+ -> StateT WriterState m Html
975+tablePartToHtml opts tblpart attr rows =
954976 if null rows || all isEmptyRow rows
955977 then return mempty
956978 else do
957− contents <- headerRowsToHtml opts rows
958− headElement <- addAttrs opts attr $ H.thead contents
979+ let tag' = case tblpart of
980+ Thead -> H.thead
981+ Tfoot -> H.tfoot
982+ Tbody -> H.tbody -- this would be unexpected
983+ contents <- headerRowsToHtml opts tblpart rows
984+ tablePartElement <- addAttrs opts attr $ tag' contents
959985 return $ do
960− headElement
986+ tablePartElement
961987 nl opts
962988 where
963989 isEmptyRow (Ann.HeaderRow _attr _rownum cells) = all isEmptyCell cells
964990 isEmptyCell (Ann.Cell _colspecs _colnum cell) =
965991 cell == Cell nullAttr AlignDefault (RowSpan 1) (ColSpan 1) []
966992
967−
968−data RowType = HeaderRow | FooterRow | BodyRow
993+-- | The part of a table; header, footer, or body.
994+data TablePart = Thead | Tfoot | Tbody
969995 deriving (Eq)
970996
971997data CellType = HeaderCell | BodyCell
972998
973−data TableRow = TableRow RowType Attr Ann.RowNumber Ann.RowHead Ann.RowBody
999+data TableRow = TableRow TablePart Attr Ann.RowNumber Ann.RowHead Ann.RowBody
9741000
9751001headerRowsToHtml :: PandocMonad m
976− => WriterOptions
977− -> [Ann.HeaderRow]
978− -> StateT WriterState m Html
979−headerRowsToHtml opts =
1002+ => WriterOptions
1003+ -> TablePart
1004+ -> [Ann.HeaderRow]
1005+ -> StateT WriterState m Html
1006+headerRowsToHtml opts tablepart =
9801007 rowListToHtml opts . map toTableRow
9811008 where
9821009 toTableRow (Ann.HeaderRow attr rownum rowbody) =
983− TableRow HeaderRow attr rownum [] rowbody
1010+ TableRow tablepart attr rownum [] rowbody
9841011
9851012bodyRowsToHtml :: PandocMonad m
9861013 => WriterOptions
@@ -990,7 +1017,7 @@ bodyRowsToHtml opts =
9901017 rowListToHtml opts . zipWith toTableRow [1..]
9911018 where
9921019 toTableRow rownum (Ann.BodyRow attr _rownum rowhead rowbody) =
993− TableRow BodyRow attr rownum rowhead rowbody
1020+ TableRow Tbody attr rownum rowhead rowbody
9941021
9951022
9961023rowListToHtml :: PandocMonad m
@@ -1034,14 +1061,14 @@ tableRowToHtml :: PandocMonad m
10341061 => WriterOptions
10351062 -> TableRow
10361063 -> StateT WriterState m Html
1037−tableRowToHtml opts (TableRow rowtype _attr rownum rowhead rowbody) = do
1064+tableRowToHtml opts (TableRow tblpart _attr rownum rowhead rowbody) = do
10381065 let rowclass = A.class_ $ case rownum of
1039− Ann.RowNumber x | x `rem` 2 == 1 -> "odd"
1040− _ | rowtype /= HeaderRow -> "even"
1041− _ -> "header"
1042− let celltype = case rowtype of
1043− HeaderRow -> HeaderCell
1044− _ -> BodyCell
1066+ Ann.RowNumber x | x `rem` 2 == 1 -> "odd"
1067+ _ | tblpart /= Thead -> "even"
1068+ _ -> "header"
1069+ let celltype = case tblpart of
1070+ Thead -> HeaderCell
1071+ _ -> BodyCell
10451072 head' <- mapM (cellToHtml opts HeaderCell) rowhead
10461073 body <- mapM (cellToHtml opts celltype) rowbody
10471074 return $ do
test/Tests/Old.hs+7−6
@@ -267,12 +267,13 @@ writerTests pandocPath format
267267extendedWriterTests :: FilePath -> String -> [TestTree]
268268extendedWriterTests pandocPath format
269269 = writerTests pandocPath format ++
270− [ test pandocPath
271− "tables"
272− opts
273− ("tables" </> "planets.native")
274− ("tables" </> "planets" <.> format)
275− ]
270+ let testForTable name =
271+ test pandocPath
272+ (name ++ " table")
273+ opts
274+ ("tables" </> name <.> "native")
275+ ("tables" </> name <.> format)
276+ in map testForTable ["planets", "nordics"]
276277 where
277278 opts = ["-r", "native", "-w", format, "--columns=78",
278279 "--variable", "pandoc-version="]
test/tables/nordics.html4new file+59
@@ -0,0 +1,59 @@
1+<table>
2+<caption><p>States belonging to the <em>Nordics.</em></p></caption>
3+<colgroup>
4+<col width="30%" />
5+<col width="30%" />
6+<col width="20%" />
7+<col width="20%" />
8+</colgroup>
9+<thead>
10+<tr class="header">
11+<th align="center">Name</th>
12+<th align="center">Capital</th>
13+<th align="center">Population<br />
14+(in 2018)</th>
15+<th align="center">Area<br />
16+(in km<sup>2</sup>)</th>
17+</tr>
18+</thead>
19+<tbody>
20+<tr class="odd">
21+<th align="center">Denmark</th>
22+<td align="left">Copenhagen</td>
23+<td align="left">5,809,502</td>
24+<td align="left">43,094</td>
25+</tr>
26+<tr class="even">
27+<th align="center">Finland</th>
28+<td align="left">Helsinki</td>
29+<td align="left">5,537,364</td>
30+<td align="left">338,145</td>
31+</tr>
32+<tr class="odd">
33+<th align="center">Iceland</th>
34+<td align="left">Reykjavik</td>
35+<td align="left">343,518</td>
36+<td align="left">103,000</td>
37+</tr>
38+<tr class="even">
39+<th align="center">Norway</th>
40+<td align="left">Oslo</td>
41+<td align="left">5,372,191</td>
42+<td align="left">323,802</td>
43+</tr>
44+<tr class="odd">
45+<th align="center">Sweden</th>
46+<td align="left">Stockholm</td>
47+<td align="left">10,313,447</td>
48+<td align="left">450,295</td>
49+</tr>
50+</tbody><tfoot>
51+<tr class="even">
52+<td align="center">Total</td>
53+<td align="left"></td>
54+<td align="left">27,376,022</td>
55+<td align="left">1,258,336</td>
56+</tr>
57+</tfoot>
58+
59+</table>
test/tables/nordics.html5new file+59
@@ -0,0 +1,59 @@
1+<table>
2+<caption><p>States belonging to the <em>Nordics.</em></p></caption>
3+<colgroup>
4+<col style="width: 30%" />
5+<col style="width: 30%" />
6+<col style="width: 20%" />
7+<col style="width: 20%" />
8+</colgroup>
9+<thead>
10+<tr class="header">
11+<th style="text-align: center;">Name</th>
12+<th style="text-align: center;">Capital</th>
13+<th style="text-align: center;">Population<br />
14+(in 2018)</th>
15+<th style="text-align: center;">Area<br />
16+(in km<sup>2</sup>)</th>
17+</tr>
18+</thead>
19+<tbody>
20+<tr class="odd">
21+<th style="text-align: center;">Denmark</th>
22+<td style="text-align: left;">Copenhagen</td>
23+<td style="text-align: left;">5,809,502</td>
24+<td style="text-align: left;">43,094</td>
25+</tr>
26+<tr class="even">
27+<th style="text-align: center;">Finland</th>
28+<td style="text-align: left;">Helsinki</td>
29+<td style="text-align: left;">5,537,364</td>
30+<td style="text-align: left;">338,145</td>
31+</tr>
32+<tr class="odd">
33+<th style="text-align: center;">Iceland</th>
34+<td style="text-align: left;">Reykjavik</td>
35+<td style="text-align: left;">343,518</td>
36+<td style="text-align: left;">103,000</td>
37+</tr>
38+<tr class="even">
39+<th style="text-align: center;">Norway</th>
40+<td style="text-align: left;">Oslo</td>
41+<td style="text-align: left;">5,372,191</td>
42+<td style="text-align: left;">323,802</td>
43+</tr>
44+<tr class="odd">
45+<th style="text-align: center;">Sweden</th>
46+<td style="text-align: left;">Stockholm</td>
47+<td style="text-align: left;">10,313,447</td>
48+<td style="text-align: left;">450,295</td>
49+</tr>
50+</tbody><tfoot>
51+<tr class="even">
52+<td style="text-align: center;">Total</td>
53+<td style="text-align: left;"></td>
54+<td style="text-align: left;">27,376,022</td>
55+<td style="text-align: left;">1,258,336</td>
56+</tr>
57+</tfoot>
58+
59+</table>
test/tables/nordics.nativenew file+46
@@ -0,0 +1,46 @@
1+[Table ("",[],[]) (Caption (Just [Str "Nordic countries"])
2+ [Para [Str "States", Space, Str "belonging", Space, Str "to", Space, Str "the", Space, Emph [Str "Nordics."]]])
3+ [(AlignCenter,ColWidth 0.3)
4+ ,(AlignLeft,ColWidth 0.3)
5+ ,(AlignLeft,ColWidth 0.2)
6+ ,(AlignLeft,ColWidth 0.2)]
7+ (TableHead ("",[],[])
8+ [Row ("",[],[])
9+ [Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1) [Plain [Str "Name"]]
10+ ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1) [Plain [Str "Capital"]]
11+ ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1) [Plain [Str "Population", LineBreak, Str "(in", Space, Str "2018)"]]
12+ ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1) [Plain [Str "Area", LineBreak, Str "(in", Space, Str "km", Superscript [Str "2"], Str ")"]]]])
13+ [(TableBody ("",[],[]) (RowHeadColumns 1)
14+ []
15+ [Row ("",[],[])
16+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "Denmark"]]
17+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "Copenhagen"]]
18+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "5,809,502"]]
19+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "43,094"]]]
20+ ,Row ("",[],[])
21+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "Finland"]]
22+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "Helsinki"]]
23+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "5,537,364"]]
24+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "338,145"]]]
25+ ,Row ("",[],[])
26+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "Iceland"]]
27+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "Reykjavik"]]
28+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "343,518"]]
29+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "103,000"]]]
30+ ,Row ("",[],[])
31+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "Norway"]]
32+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "Oslo"]]
33+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "5,372,191"]]
34+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "323,802"]]]
35+ ,Row ("",[],[])
36+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "Sweden"]]
37+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "Stockholm"]]
38+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "10,313,447"]]
39+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "450,295"]]]])]
40+ (TableFoot ("",[],[])
41+ [Row ("",[],[])
42+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "Total"]]
43+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) []
44+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "27,376,022"]]
45+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1) [Plain [Str "1,258,336"]]]])
46+]