Docbook writer: handle headerless tables.

In addition, use cols, thead, and tbody.

git-svn-id: https://pandoc.googlecode.com/svn/trunk@1874 788f1e2b-df1e-0410-8736-df70ead52e1b
This commit is contained in:
fiddlosopher 2010-03-09 04:34:07 +00:00
parent b15fccd364
commit 0cf4652ad6
2 changed files with 388 additions and 322 deletions

View file

@ -168,25 +168,22 @@ blockToDocbook _ HorizontalRule = empty -- not semantic
blockToDocbook opts (Table caption aligns widths headers rows) =
let alignStrings = map alignmentToString aligns
captionDoc = if null caption
then empty
else inTagsIndented "caption"
(inlinesToDocbook opts caption)
then empty
else inTagsIndented "caption"
(inlinesToDocbook opts caption)
tableType = if isEmpty captionDoc then "informaltable" else "table"
in inTagsIndented tableType $ captionDoc $$
(colHeadsToDocbook opts alignStrings widths headers) $$
(vcat $ map (tableRowToDocbook opts alignStrings) rows)
colHeadsToDocbook :: WriterOptions
-> [[Char]]
-> [Double]
-> [[Block]]
-> Doc
colHeadsToDocbook _ _ _ hs | all null hs = empty
colHeadsToDocbook opts alignStrings widths headers =
let heads = zipWith3 (\align width item ->
tableItemToDocbook opts "th" align width item)
alignStrings widths headers
in inTagsIndented "tr" $ vcat heads
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
head' = if all null headers
then empty
else inTagsIndented "thead" $
tableRowToDocbook opts alignStrings "th" headers
body' = inTagsIndented "tbody" $
vcat $ map (tableRowToDocbook opts alignStrings "td") rows
in inTagsIndented tableType $ captionDoc $$ coltags $$ head' $$ body'
alignmentToString :: Alignment -> [Char]
alignmentToString alignment = case alignment of
@ -195,22 +192,22 @@ alignmentToString alignment = case alignment of
AlignCenter -> "center"
AlignDefault -> "left"
tableRowToDocbook :: WriterOptions -> [[Char]] -> [[Block]] -> Doc
tableRowToDocbook opts aligns cols = inTagsIndented "tr" $
vcat $ zipWith3 (tableItemToDocbook opts "td") aligns (repeat 0) cols
tableRowToDocbook :: WriterOptions
-> [String]
-> String
-> [[Block]]
-> Doc
tableRowToDocbook opts aligns celltype cols =
inTagsIndented "tr" $ vcat $
zipWith (tableItemToDocbook opts celltype) aligns cols
tableItemToDocbook :: WriterOptions
-> [Char]
-> [Char]
-> Double
-> [Block]
-> Doc
tableItemToDocbook opts tag align width item =
let attrib = [("align", align)] ++
if width /= 0
then [("style", "{width: " ++
show (truncate (100*width) :: Integer) ++ "%;}")]
else []
tableItemToDocbook opts tag align item =
let attrib = [("align", align)]
in inTags True tag attrib $ vcat $ map (blockToDocbook opts) item
-- | Take list of inline elements and return wrapped doc.

View file

@ -5,123 +5,131 @@
<caption>
Demonstration of simple table syntax.
</caption>
<tr>
<th align="right">
Right
</th>
<th align="left">
Left
</th>
<th align="center">
Center
</th>
<th align="left">
Default
</th>
</tr>
<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>
<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>
</table>
<para>
Simple table without caption:
</para>
<informaltable>
<tr>
<th align="right">
Right
</th>
<th align="left">
Left
</th>
<th align="center">
Center
</th>
<th align="left">
Default
</th>
</tr>
<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>
<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>
</informaltable>
<para>
Simple table indented two spaces:
@ -130,62 +138,66 @@
<caption>
Demonstration of simple table syntax.
</caption>
<tr>
<th align="right">
Right
</th>
<th align="left">
Left
</th>
<th align="center">
Center
</th>
<th align="left">
Default
</th>
</tr>
<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>
<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>
</table>
<para>
Multiline table with caption:
@ -194,140 +206,197 @@
<caption>
Here's the caption. It may span multiple lines.
</caption>
<tr>
<th align="center" style="{width: 15%;}">
Centered Header
</th>
<th align="left" style="{width: 13%;}">
Left Aligned
</th>
<th align="right" style="{width: 16%;}">
Right Aligned
</th>
<th align="left" style="{width: 33%;}">
Default aligned
</th>
</tr>
<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>
<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>
</table>
<para>
Multiline table without caption:
</para>
<informaltable>
<tr>
<th align="center" style="{width: 15%;}">
Centered Header
</th>
<th align="left" style="{width: 13%;}">
Left Aligned
</th>
<th align="right" style="{width: 16%;}">
Right Aligned
</th>
<th align="left" style="{width: 33%;}">
Default aligned
</th>
</tr>
<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>
<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>
</informaltable>
<para>
Table without column headers:
</para>
<informaltable>
<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>
<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>
</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>
</informaltable>