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:
parent
3162adbd9b
commit
07c7cd1945
2 changed files with 409 additions and 385 deletions
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Reference in a new issue