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