git.iko.soy/typeable/pandoc
on master help sign in
Docbook writer: Use CALS tables (instead of XHTML tables).

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

commit07c7cd19459da37372fc888e3e34e7feee284aec authorJohn MacFarlane <jgm@berkeley.edu> dateSun 24 Jul 2011, 23:24 (15 years ago) parent3162adb
2 files changed+409−385
src/Text/Pandoc/Writers/Docbook.hs+15−21 tests/tables.docbook+394−364
src/Text/Pandoc/Writers/Docbook.hs+15−21
@@ -185,24 +185,24 @@ blockToDocbook _ (RawBlock "html" str) = text str -- raw XML block
185185blockToDocbook _ (RawBlock _ _) = empty
186186blockToDocbook _ HorizontalRule = empty -- not semantic
187187blockToDocbook opts (Table caption aligns widths headers rows) =
188− let alignStrings = map alignmentToString aligns
189− captionDoc = if null caption
188+ let captionDoc = if null caption
190189 then empty
191− else inTagsIndented "caption"
190+ else inTagsIndented "title"
192191 (inlinesToDocbook opts caption)
193192 tableType = if isEmpty captionDoc then "informaltable" else "table"
194− percent w = show (truncate (100*w) :: Integer) ++ "%"
195− coltags = if all (== 0.0) widths
196− then empty
197− else vcat $ map (\w ->
198− selfClosingTag "col" [("width", percent w)]) widths
193+ percent w = show (truncate (100*w) :: Integer) ++ "*"
194+ coltags = vcat $ zipWith (\w al -> selfClosingTag "colspec"
195+ ([("colwidth", percent w) | w > 0] ++
196+ [("align", alignmentToString al)])) widths aligns
199197 head' = if all null headers
200198 then empty
201199 else inTagsIndented "thead" $
202− tableRowToDocbook opts alignStrings "th" headers
200+ tableRowToDocbook opts headers
203201 body' = inTagsIndented "tbody" $
204− vcat $ map (tableRowToDocbook opts alignStrings "td") rows
205− in inTagsIndented tableType $ captionDoc $$ coltags $$ head' $$ body'
202+ vcat $ map (tableRowToDocbook opts) rows
203+ in inTagsIndented tableType $ captionDoc $$
204+ (inTags True "tgroup" [("cols", show (length headers))] $
205+ coltags $$ head' $$ body')
206206
207207alignmentToString :: Alignment -> [Char]
208208alignmentToString alignment = case alignment of
@@ -212,22 +212,16 @@ alignmentToString alignment = case alignment of
212212 AlignDefault -> "left"
213213
214214tableRowToDocbook :: WriterOptions
215− -> [String]
216− -> String
217215 -> [[Block]]
218216 -> Doc
219−tableRowToDocbook opts aligns celltype cols =
220− inTagsIndented "tr" $ vcat $
221− zipWith (tableItemToDocbook opts celltype) aligns cols
217+tableRowToDocbook opts cols =
218+ inTagsIndented "row" $ vcat $ map (tableItemToDocbook opts) cols
222219
223220tableItemToDocbook :: WriterOptions
224− -> [Char]
225− -> [Char]
226221 -> [Block]
227222 -> Doc
228−tableItemToDocbook opts tag align item =
229− let attrib = [("align", align)]
230− in inTags True tag attrib $ vcat $ map (blockToDocbook opts) item
223+tableItemToDocbook opts item =
224+ inTags True "entry" [] $ vcat $ map (blockToDocbook opts) item
231225
232226-- | Convert a list of inline elements to Docbook.
233227inlinesToDocbook :: WriterOptions -> [Inline] -> Doc
tests/tables.docbook+394−364
@@ -2,401 +2,431 @@
22 Simple table with caption:
33</para>
44<table>
5− <caption>
5+ <title>
66 Demonstration of simple table syntax.
7− </caption>
8− <thead>
9− <tr>
10− <th align="right">
11− Right
12− </th>
13− <th align="left">
14− Left
15− </th>
16− <th align="center">
17− Center
18− </th>
19− <th align="left">
20− Default
21− </th>
22− </tr>
23− </thead>
24− <tbody>
25− <tr>
26− <td align="right">
27− 12
28− </td>
29− <td align="left">
30− 12
31− </td>
32− <td align="center">
33− 12
34− </td>
35− <td align="left">
36− 12
37− </td>
38− </tr>
39− <tr>
40− <td align="right">
41− 123
42− </td>
43− <td align="left">
44− 123
45− </td>
46− <td align="center">
47− 123
48− </td>
49− <td align="left">
50− 123
51− </td>
52− </tr>
53− <tr>
54− <td align="right">
55− 1
56− </td>
57− <td align="left">
58− 1
59− </td>
60− <td align="center">
61− 1
62− </td>
63− <td align="left">
64− 1
65− </td>
66− </tr>
67− </tbody>
7+ </title>
8+ <tgroup cols="4">
9+ <colspec align="right" />
10+ <colspec align="left" />
11+ <colspec align="center" />
12+ <colspec align="left" />
13+ <thead>
14+ <row>
15+ <entry>
16+ Right
17+ </entry>
18+ <entry>
19+ Left
20+ </entry>
21+ <entry>
22+ Center
23+ </entry>
24+ <entry>
25+ Default
26+ </entry>
27+ </row>
28+ </thead>
29+ <tbody>
30+ <row>
31+ <entry>
32+ 12
33+ </entry>
34+ <entry>
35+ 12
36+ </entry>
37+ <entry>
38+ 12
39+ </entry>
40+ <entry>
41+ 12
42+ </entry>
43+ </row>
44+ <row>
45+ <entry>
46+ 123
47+ </entry>
48+ <entry>
49+ 123
50+ </entry>
51+ <entry>
52+ 123
53+ </entry>
54+ <entry>
55+ 123
56+ </entry>
57+ </row>
58+ <row>
59+ <entry>
60+ 1
61+ </entry>
62+ <entry>
63+ 1
64+ </entry>
65+ <entry>
66+ 1
67+ </entry>
68+ <entry>
69+ 1
70+ </entry>
71+ </row>
72+ </tbody>
73+ </tgroup>
6874</table>
6975<para>
7076 Simple table without caption:
7177</para>
7278<informaltable>
73− <thead>
74− <tr>
75− <th align="right">
76− Right
77− </th>
78− <th align="left">
79− Left
80− </th>
81− <th align="center">
82− Center
83− </th>
84− <th align="left">
85− Default
86− </th>
87− </tr>
88− </thead>
89− <tbody>
90− <tr>
91− <td align="right">
92− 12
93− </td>
94− <td align="left">
95− 12
96− </td>
97− <td align="center">
98− 12
99− </td>
100− <td align="left">
101− 12
102− </td>
103− </tr>
104− <tr>
105− <td align="right">
106− 123
107− </td>
108− <td align="left">
109− 123
110− </td>
111− <td align="center">
112− 123
113− </td>
114− <td align="left">
115− 123
116− </td>
117− </tr>
118− <tr>
119− <td align="right">
120− 1
121− </td>
122− <td align="left">
123− 1
124− </td>
125− <td align="center">
126− 1
127− </td>
128− <td align="left">
129− 1
130− </td>
131− </tr>
132− </tbody>
79+ <tgroup cols="4">
80+ <colspec align="right" />
81+ <colspec align="left" />
82+ <colspec align="center" />
83+ <colspec align="left" />
84+ <thead>
85+ <row>
86+ <entry>
87+ Right
88+ </entry>
89+ <entry>
90+ Left
91+ </entry>
92+ <entry>
93+ Center
94+ </entry>
95+ <entry>
96+ Default
97+ </entry>
98+ </row>
99+ </thead>
100+ <tbody>
101+ <row>
102+ <entry>
103+ 12
104+ </entry>
105+ <entry>
106+ 12
107+ </entry>
108+ <entry>
109+ 12
110+ </entry>
111+ <entry>
112+ 12
113+ </entry>
114+ </row>
115+ <row>
116+ <entry>
117+ 123
118+ </entry>
119+ <entry>
120+ 123
121+ </entry>
122+ <entry>
123+ 123
124+ </entry>
125+ <entry>
126+ 123
127+ </entry>
128+ </row>
129+ <row>
130+ <entry>
131+ 1
132+ </entry>
133+ <entry>
134+ 1
135+ </entry>
136+ <entry>
137+ 1
138+ </entry>
139+ <entry>
140+ 1
141+ </entry>
142+ </row>
143+ </tbody>
144+ </tgroup>
133145</informaltable>
134146<para>
135147 Simple table indented two spaces:
136148</para>
137149<table>
138− <caption>
150+ <title>
139151 Demonstration of simple table syntax.
140− </caption>
141− <thead>
142− <tr>
143− <th align="right">
144− Right
145− </th>
146− <th align="left">
147− Left
148− </th>
149− <th align="center">
150− Center
151− </th>
152− <th align="left">
153− Default
154− </th>
155− </tr>
156− </thead>
157− <tbody>
158− <tr>
159− <td align="right">
160− 12
161− </td>
162− <td align="left">
163− 12
164− </td>
165− <td align="center">
166− 12
167− </td>
168− <td align="left">
169− 12
170− </td>
171− </tr>
172− <tr>
173− <td align="right">
174− 123
175− </td>
176− <td align="left">
177− 123
178− </td>
179− <td align="center">
180− 123
181− </td>
182− <td align="left">
183− 123
184− </td>
185− </tr>
186− <tr>
187− <td align="right">
188− 1
189− </td>
190− <td align="left">
191− 1
192− </td>
193− <td align="center">
194− 1
195− </td>
196− <td align="left">
197− 1
198− </td>
199− </tr>
200− </tbody>
152+ </title>
153+ <tgroup cols="4">
154+ <colspec align="right" />
155+ <colspec align="left" />
156+ <colspec align="center" />
157+ <colspec align="left" />
158+ <thead>
159+ <row>
160+ <entry>
161+ Right
162+ </entry>
163+ <entry>
164+ Left
165+ </entry>
166+ <entry>
167+ Center
168+ </entry>
169+ <entry>
170+ Default
171+ </entry>
172+ </row>
173+ </thead>
174+ <tbody>
175+ <row>
176+ <entry>
177+ 12
178+ </entry>
179+ <entry>
180+ 12
181+ </entry>
182+ <entry>
183+ 12
184+ </entry>
185+ <entry>
186+ 12
187+ </entry>
188+ </row>
189+ <row>
190+ <entry>
191+ 123
192+ </entry>
193+ <entry>
194+ 123
195+ </entry>
196+ <entry>
197+ 123
198+ </entry>
199+ <entry>
200+ 123
201+ </entry>
202+ </row>
203+ <row>
204+ <entry>
205+ 1
206+ </entry>
207+ <entry>
208+ 1
209+ </entry>
210+ <entry>
211+ 1
212+ </entry>
213+ <entry>
214+ 1
215+ </entry>
216+ </row>
217+ </tbody>
218+ </tgroup>
201219</table>
202220<para>
203221 Multiline table with caption:
204222</para>
205223<table>
206− <caption>
224+ <title>
207225 Here's the caption. It may span multiple lines.
208− </caption>
209− <col width="15%" />
210− <col width="13%" />
211− <col width="16%" />
212− <col width="33%" />
213− <thead>
214− <tr>
215− <th align="center">
216− Centered Header
217− </th>
218− <th align="left">
219− Left Aligned
220− </th>
221− <th align="right">
222− Right Aligned
223− </th>
224− <th align="left">
225− Default aligned
226− </th>
227− </tr>
228− </thead>
229− <tbody>
230− <tr>
231− <td align="center">
232− First
233− </td>
234− <td align="left">
235− row
236− </td>
237− <td align="right">
238− 12.0
239− </td>
240− <td align="left">
241− Example of a row that spans multiple lines.
242− </td>
243− </tr>
244− <tr>
245− <td align="center">
246− Second
247− </td>
248− <td align="left">
249− row
250− </td>
251− <td align="right">
252− 5.0
253− </td>
254− <td align="left">
255− Here's another one. Note the blank line between rows.
256− </td>
257− </tr>
258− </tbody>
226+ </title>
227+ <tgroup cols="4">
228+ <colspec colwidth="15*" align="center" />
229+ <colspec colwidth="13*" align="left" />
230+ <colspec colwidth="16*" align="right" />
231+ <colspec colwidth="33*" align="left" />
232+ <thead>
233+ <row>
234+ <entry>
235+ Centered Header
236+ </entry>
237+ <entry>
238+ Left Aligned
239+ </entry>
240+ <entry>
241+ Right Aligned
242+ </entry>
243+ <entry>
244+ Default aligned
245+ </entry>
246+ </row>
247+ </thead>
248+ <tbody>
249+ <row>
250+ <entry>
251+ First
252+ </entry>
253+ <entry>
254+ row
255+ </entry>
256+ <entry>
257+ 12.0
258+ </entry>
259+ <entry>
260+ Example of a row that spans multiple lines.
261+ </entry>
262+ </row>
263+ <row>
264+ <entry>
265+ Second
266+ </entry>
267+ <entry>
268+ row
269+ </entry>
270+ <entry>
271+ 5.0
272+ </entry>
273+ <entry>
274+ Here's another one. Note the blank line between rows.
275+ </entry>
276+ </row>
277+ </tbody>
278+ </tgroup>
259279</table>
260280<para>
261281 Multiline table without caption:
262282</para>
263283<informaltable>
264− <col width="15%" />
265− <col width="13%" />
266− <col width="16%" />
267− <col width="33%" />
268− <thead>
269− <tr>
270− <th align="center">
271− Centered Header
272− </th>
273− <th align="left">
274− Left Aligned
275− </th>
276− <th align="right">
277− Right Aligned
278− </th>
279− <th align="left">
280− Default aligned
281− </th>
282− </tr>
283− </thead>
284− <tbody>
285− <tr>
286− <td align="center">
287− First
288− </td>
289− <td align="left">
290− row
291− </td>
292− <td align="right">
293− 12.0
294− </td>
295− <td align="left">
296− Example of a row that spans multiple lines.
297− </td>
298− </tr>
299− <tr>
300− <td align="center">
301− Second
302− </td>
303− <td align="left">
304− row
305− </td>
306− <td align="right">
307− 5.0
308− </td>
309− <td align="left">
310− Here's another one. Note the blank line between rows.
311− </td>
312− </tr>
313− </tbody>
284+ <tgroup cols="4">
285+ <colspec colwidth="15*" align="center" />
286+ <colspec colwidth="13*" align="left" />
287+ <colspec colwidth="16*" align="right" />
288+ <colspec colwidth="33*" align="left" />
289+ <thead>
290+ <row>
291+ <entry>
292+ Centered Header
293+ </entry>
294+ <entry>
295+ Left Aligned
296+ </entry>
297+ <entry>
298+ Right Aligned
299+ </entry>
300+ <entry>
301+ Default aligned
302+ </entry>
303+ </row>
304+ </thead>
305+ <tbody>
306+ <row>
307+ <entry>
308+ First
309+ </entry>
310+ <entry>
311+ row
312+ </entry>
313+ <entry>
314+ 12.0
315+ </entry>
316+ <entry>
317+ Example of a row that spans multiple lines.
318+ </entry>
319+ </row>
320+ <row>
321+ <entry>
322+ Second
323+ </entry>
324+ <entry>
325+ row
326+ </entry>
327+ <entry>
328+ 5.0
329+ </entry>
330+ <entry>
331+ Here's another one. Note the blank line between rows.
332+ </entry>
333+ </row>
334+ </tbody>
335+ </tgroup>
314336</informaltable>
315337<para>
316338 Table without column headers:
317339</para>
318340<informaltable>
319− <tbody>
320− <tr>
321− <td align="right">
322− 12
323− </td>
324− <td align="left">
325− 12
326− </td>
327− <td align="center">
328− 12
329− </td>
330− <td align="right">
331− 12
332− </td>
333− </tr>
334− <tr>
335− <td align="right">
336− 123
337− </td>
338− <td align="left">
339− 123
340− </td>
341− <td align="center">
342− 123
343− </td>
344− <td align="right">
345− 123
346− </td>
347− </tr>
348− <tr>
349− <td align="right">
350− 1
351− </td>
352− <td align="left">
353− 1
354− </td>
355− <td align="center">
356− 1
357− </td>
358− <td align="right">
359− 1
360− </td>
361− </tr>
362− </tbody>
341+ <tgroup cols="4">
342+ <colspec align="right" />
343+ <colspec align="left" />
344+ <colspec align="center" />
345+ <colspec align="right" />
346+ <tbody>
347+ <row>
348+ <entry>
349+ 12
350+ </entry>
351+ <entry>
352+ 12
353+ </entry>
354+ <entry>
355+ 12
356+ </entry>
357+ <entry>
358+ 12
359+ </entry>
360+ </row>
361+ <row>
362+ <entry>
363+ 123
364+ </entry>
365+ <entry>
366+ 123
367+ </entry>
368+ <entry>
369+ 123
370+ </entry>
371+ <entry>
372+ 123
373+ </entry>
374+ </row>
375+ <row>
376+ <entry>
377+ 1
378+ </entry>
379+ <entry>
380+ 1
381+ </entry>
382+ <entry>
383+ 1
384+ </entry>
385+ <entry>
386+ 1
387+ </entry>
388+ </row>
389+ </tbody>
390+ </tgroup>
363391</informaltable>
364392<para>
365393 Multiline table without column headers:
366394</para>
367395<informaltable>
368− <col width="15%" />
369− <col width="13%" />
370− <col width="16%" />
371− <col width="33%" />
372− <tbody>
373− <tr>
374− <td align="center">
375− First
376− </td>
377− <td align="left">
378− row
379− </td>
380− <td align="right">
381− 12.0
382− </td>
383− <td align="left">
384− Example of a row that spans multiple lines.
385− </td>
386− </tr>
387− <tr>
388− <td align="center">
389− Second
390− </td>
391− <td align="left">
392− row
393− </td>
394− <td align="right">
395− 5.0
396− </td>
397− <td align="left">
398− Here's another one. Note the blank line between rows.
399− </td>
400− </tr>
401− </tbody>
396+ <tgroup cols="4">
397+ <colspec colwidth="15*" align="center" />
398+ <colspec colwidth="13*" align="left" />
399+ <colspec colwidth="16*" align="right" />
400+ <colspec colwidth="33*" align="left" />
401+ <tbody>
402+ <row>
403+ <entry>
404+ First
405+ </entry>
406+ <entry>
407+ row
408+ </entry>
409+ <entry>
410+ 12.0
411+ </entry>
412+ <entry>
413+ Example of a row that spans multiple lines.
414+ </entry>
415+ </row>
416+ <row>
417+ <entry>
418+ Second
419+ </entry>
420+ <entry>
421+ row
422+ </entry>
423+ <entry>
424+ 5.0
425+ </entry>
426+ <entry>
427+ Here's another one. Note the blank line between rows.
428+ </entry>
429+ </row>
430+ </tbody>
431+ </tgroup>
402432</informaltable>