Docbook writer: Use CALS tables (instead of XHTML tables).

Reason:  Some older docbook software does not work with XHTML
tables.

Closes #77.
This commit is contained in:
John MacFarlane 2011-07-24 23:24:03 -07:00
parent 3162adbd9b
commit 07c7cd1945
2 changed files with 409 additions and 385 deletions

View file

@ -185,24 +185,24 @@ blockToDocbook _ (RawBlock "html" str) = text str -- raw XML block
blockToDocbook _ (RawBlock _ _) = empty
blockToDocbook _ HorizontalRule = empty -- not semantic
blockToDocbook opts (Table caption aligns widths headers rows) =
let alignStrings = map alignmentToString aligns
captionDoc = if null caption
let captionDoc = if null caption
then empty
else inTagsIndented "caption"
else inTagsIndented "title"
(inlinesToDocbook opts caption)
tableType = if isEmpty captionDoc then "informaltable" else "table"
percent w = show (truncate (100*w) :: Integer) ++ "%"
coltags = if all (== 0.0) widths
then empty
else vcat $ map (\w ->
selfClosingTag "col" [("width", percent w)]) widths
percent w = show (truncate (100*w) :: Integer) ++ "*"
coltags = vcat $ zipWith (\w al -> selfClosingTag "colspec"
([("colwidth", percent w) | w > 0] ++
[("align", alignmentToString al)])) widths aligns
head' = if all null headers
then empty
else inTagsIndented "thead" $
tableRowToDocbook opts alignStrings "th" headers
tableRowToDocbook opts headers
body' = inTagsIndented "tbody" $
vcat $ map (tableRowToDocbook opts alignStrings "td") rows
in inTagsIndented tableType $ captionDoc $$ coltags $$ head' $$ body'
vcat $ map (tableRowToDocbook opts) rows
in inTagsIndented tableType $ captionDoc $$
(inTags True "tgroup" [("cols", show (length headers))] $
coltags $$ head' $$ body')
alignmentToString :: Alignment -> [Char]
alignmentToString alignment = case alignment of
@ -212,22 +212,16 @@ alignmentToString alignment = case alignment of
AlignDefault -> "left"
tableRowToDocbook :: WriterOptions
-> [String]
-> String
-> [[Block]]
-> Doc
tableRowToDocbook opts aligns celltype cols =
inTagsIndented "tr" $ vcat $
zipWith (tableItemToDocbook opts celltype) aligns cols
tableRowToDocbook opts cols =
inTagsIndented "row" $ vcat $ map (tableItemToDocbook opts) cols
tableItemToDocbook :: WriterOptions
-> [Char]
-> [Char]
-> [Block]
-> Doc
tableItemToDocbook opts tag align item =
let attrib = [("align", align)]
in inTags True tag attrib $ vcat $ map (blockToDocbook opts) item
tableItemToDocbook opts item =
inTags True "entry" [] $ vcat $ map (blockToDocbook opts) item
-- | Convert a list of inline elements to Docbook.
inlinesToDocbook :: WriterOptions -> [Inline] -> Doc

View file

@ -2,401 +2,431 @@
Simple table with caption:
</para>
<table>
<caption>
<title>
Demonstration of simple table syntax.
</caption>
<thead>
<tr>
<th align="right">
Right
</th>
<th align="left">
Left
</th>
<th align="center">
Center
</th>
<th align="left">
Default
</th>
</tr>
</thead>
<tbody>
<tr>
<td align="right">
12
</td>
<td align="left">
12
</td>
<td align="center">
12
</td>
<td align="left">
12
</td>
</tr>
<tr>
<td align="right">
123
</td>
<td align="left">
123
</td>
<td align="center">
123
</td>
<td align="left">
123
</td>
</tr>
<tr>
<td align="right">
1
</td>
<td align="left">
1
</td>
<td align="center">
1
</td>
<td align="left">
1
</td>
</tr>
</tbody>
</title>
<tgroup cols="4">
<colspec align="right" />
<colspec align="left" />
<colspec align="center" />
<colspec align="left" />
<thead>
<row>
<entry>
Right
</entry>
<entry>
Left
</entry>
<entry>
Center
</entry>
<entry>
Default
</entry>
</row>
</thead>
<tbody>
<row>
<entry>
12
</entry>
<entry>
12
</entry>
<entry>
12
</entry>
<entry>
12
</entry>
</row>
<row>
<entry>
123
</entry>
<entry>
123
</entry>
<entry>
123
</entry>
<entry>
123
</entry>
</row>
<row>
<entry>
1
</entry>
<entry>
1
</entry>
<entry>
1
</entry>
<entry>
1
</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Simple table without caption:
</para>
<informaltable>
<thead>
<tr>
<th align="right">
Right
</th>
<th align="left">
Left
</th>
<th align="center">
Center
</th>
<th align="left">
Default
</th>
</tr>
</thead>
<tbody>
<tr>
<td align="right">
12
</td>
<td align="left">
12
</td>
<td align="center">
12
</td>
<td align="left">
12
</td>
</tr>
<tr>
<td align="right">
123
</td>
<td align="left">
123
</td>
<td align="center">
123
</td>
<td align="left">
123
</td>
</tr>
<tr>
<td align="right">
1
</td>
<td align="left">
1
</td>
<td align="center">
1
</td>
<td align="left">
1
</td>
</tr>
</tbody>
<tgroup cols="4">
<colspec align="right" />
<colspec align="left" />
<colspec align="center" />
<colspec align="left" />
<thead>
<row>
<entry>
Right
</entry>
<entry>
Left
</entry>
<entry>
Center
</entry>
<entry>
Default
</entry>
</row>
</thead>
<tbody>
<row>
<entry>
12
</entry>
<entry>
12
</entry>
<entry>
12
</entry>
<entry>
12
</entry>
</row>
<row>
<entry>
123
</entry>
<entry>
123
</entry>
<entry>
123
</entry>
<entry>
123
</entry>
</row>
<row>
<entry>
1
</entry>
<entry>
1
</entry>
<entry>
1
</entry>
<entry>
1
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>
Simple table indented two spaces:
</para>
<table>
<caption>
<title>
Demonstration of simple table syntax.
</caption>
<thead>
<tr>
<th align="right">
Right
</th>
<th align="left">
Left
</th>
<th align="center">
Center
</th>
<th align="left">
Default
</th>
</tr>
</thead>
<tbody>
<tr>
<td align="right">
12
</td>
<td align="left">
12
</td>
<td align="center">
12
</td>
<td align="left">
12
</td>
</tr>
<tr>
<td align="right">
123
</td>
<td align="left">
123
</td>
<td align="center">
123
</td>
<td align="left">
123
</td>
</tr>
<tr>
<td align="right">
1
</td>
<td align="left">
1
</td>
<td align="center">
1
</td>
<td align="left">
1
</td>
</tr>
</tbody>
</title>
<tgroup cols="4">
<colspec align="right" />
<colspec align="left" />
<colspec align="center" />
<colspec align="left" />
<thead>
<row>
<entry>
Right
</entry>
<entry>
Left
</entry>
<entry>
Center
</entry>
<entry>
Default
</entry>
</row>
</thead>
<tbody>
<row>
<entry>
12
</entry>
<entry>
12
</entry>
<entry>
12
</entry>
<entry>
12
</entry>
</row>
<row>
<entry>
123
</entry>
<entry>
123
</entry>
<entry>
123
</entry>
<entry>
123
</entry>
</row>
<row>
<entry>
1
</entry>
<entry>
1
</entry>
<entry>
1
</entry>
<entry>
1
</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Multiline table with caption:
</para>
<table>
<caption>
<title>
Here's the caption. It may span multiple lines.
</caption>
<col width="15%" />
<col width="13%" />
<col width="16%" />
<col width="33%" />
<thead>
<tr>
<th align="center">
Centered Header
</th>
<th align="left">
Left Aligned
</th>
<th align="right">
Right Aligned
</th>
<th align="left">
Default aligned
</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">
First
</td>
<td align="left">
row
</td>
<td align="right">
12.0
</td>
<td align="left">
Example of a row that spans multiple lines.
</td>
</tr>
<tr>
<td align="center">
Second
</td>
<td align="left">
row
</td>
<td align="right">
5.0
</td>
<td align="left">
Here's another one. Note the blank line between rows.
</td>
</tr>
</tbody>
</title>
<tgroup cols="4">
<colspec colwidth="15*" align="center" />
<colspec colwidth="13*" align="left" />
<colspec colwidth="16*" align="right" />
<colspec colwidth="33*" align="left" />
<thead>
<row>
<entry>
Centered Header
</entry>
<entry>
Left Aligned
</entry>
<entry>
Right Aligned
</entry>
<entry>
Default aligned
</entry>
</row>
</thead>
<tbody>
<row>
<entry>
First
</entry>
<entry>
row
</entry>
<entry>
12.0
</entry>
<entry>
Example of a row that spans multiple lines.
</entry>
</row>
<row>
<entry>
Second
</entry>
<entry>
row
</entry>
<entry>
5.0
</entry>
<entry>
Here's another one. Note the blank line between rows.
</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Multiline table without caption:
</para>
<informaltable>
<col width="15%" />
<col width="13%" />
<col width="16%" />
<col width="33%" />
<thead>
<tr>
<th align="center">
Centered Header
</th>
<th align="left">
Left Aligned
</th>
<th align="right">
Right Aligned
</th>
<th align="left">
Default aligned
</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">
First
</td>
<td align="left">
row
</td>
<td align="right">
12.0
</td>
<td align="left">
Example of a row that spans multiple lines.
</td>
</tr>
<tr>
<td align="center">
Second
</td>
<td align="left">
row
</td>
<td align="right">
5.0
</td>
<td align="left">
Here's another one. Note the blank line between rows.
</td>
</tr>
</tbody>
<tgroup cols="4">
<colspec colwidth="15*" align="center" />
<colspec colwidth="13*" align="left" />
<colspec colwidth="16*" align="right" />
<colspec colwidth="33*" align="left" />
<thead>
<row>
<entry>
Centered Header
</entry>
<entry>
Left Aligned
</entry>
<entry>
Right Aligned
</entry>
<entry>
Default aligned
</entry>
</row>
</thead>
<tbody>
<row>
<entry>
First
</entry>
<entry>
row
</entry>
<entry>
12.0
</entry>
<entry>
Example of a row that spans multiple lines.
</entry>
</row>
<row>
<entry>
Second
</entry>
<entry>
row
</entry>
<entry>
5.0
</entry>
<entry>
Here's another one. Note the blank line between rows.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>
Table without column headers:
</para>
<informaltable>
<tbody>
<tr>
<td align="right">
12
</td>
<td align="left">
12
</td>
<td align="center">
12
</td>
<td align="right">
12
</td>
</tr>
<tr>
<td align="right">
123
</td>
<td align="left">
123
</td>
<td align="center">
123
</td>
<td align="right">
123
</td>
</tr>
<tr>
<td align="right">
1
</td>
<td align="left">
1
</td>
<td align="center">
1
</td>
<td align="right">
1
</td>
</tr>
</tbody>
<tgroup cols="4">
<colspec align="right" />
<colspec align="left" />
<colspec align="center" />
<colspec align="right" />
<tbody>
<row>
<entry>
12
</entry>
<entry>
12
</entry>
<entry>
12
</entry>
<entry>
12
</entry>
</row>
<row>
<entry>
123
</entry>
<entry>
123
</entry>
<entry>
123
</entry>
<entry>
123
</entry>
</row>
<row>
<entry>
1
</entry>
<entry>
1
</entry>
<entry>
1
</entry>
<entry>
1
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>
Multiline table without column headers:
</para>
<informaltable>
<col width="15%" />
<col width="13%" />
<col width="16%" />
<col width="33%" />
<tbody>
<tr>
<td align="center">
First
</td>
<td align="left">
row
</td>
<td align="right">
12.0
</td>
<td align="left">
Example of a row that spans multiple lines.
</td>
</tr>
<tr>
<td align="center">
Second
</td>
<td align="left">
row
</td>
<td align="right">
5.0
</td>
<td align="left">
Here's another one. Note the blank line between rows.
</td>
</tr>
</tbody>
<tgroup cols="4">
<colspec colwidth="15*" align="center" />
<colspec colwidth="13*" align="left" />
<colspec colwidth="16*" align="right" />
<colspec colwidth="33*" align="left" />
<tbody>
<row>
<entry>
First
</entry>
<entry>
row
</entry>
<entry>
12.0
</entry>
<entry>
Example of a row that spans multiple lines.
</entry>
</row>
<row>
<entry>
Second
</entry>
<entry>
row
</entry>
<entry>
5.0
</entry>
<entry>
Here's another one. Note the blank line between rows.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>