aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2011-07-24 23:24:03 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2011-07-24 23:24:03 -0700
commit07c7cd19459da37372fc888e3e34e7feee284aec (patch)
tree0cd38b5b2138269d700609adc0b757a24e83b5be
parent3162adbd9b045b0ae67c8902b76c726363eabdf4 (diff)
downloadpandoc-07c7cd19459da37372fc888e3e34e7feee284aec.tar.gz
Docbook writer: Use CALS tables (instead of XHTML tables).
Reason: Some older docbook software does not work with XHTML tables. Closes #77.
-rw-r--r--src/Text/Pandoc/Writers/Docbook.hs36
-rw-r--r--tests/tables.docbook758
2 files changed, 409 insertions, 385 deletions
diff --git a/src/Text/Pandoc/Writers/Docbook.hs b/src/Text/Pandoc/Writers/Docbook.hs
index 9d09d46e3..1ca76bfd6 100644
--- a/src/Text/Pandoc/Writers/Docbook.hs
+++ b/src/Text/Pandoc/Writers/Docbook.hs
@@ -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
diff --git a/tests/tables.docbook b/tests/tables.docbook
index 6483a97c0..6224cf222 100644
--- a/tests/tables.docbook
+++ b/tests/tables.docbook
@@ -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>