git.iko.soy/typeable/pandoc
on master help sign in
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

commit0cf4652ad6cb59f5c10058f1dfc03cb2b2ab620d authorfiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b> dateTue 9 Mar 2010, 04:34 (17 years ago) parentb15fccd
2 files changed+388−322
src/Text/Pandoc/Writers/Docbook.hs+25−28 tests/tables.docbook+363−294
src/Text/Pandoc/Writers/Docbook.hs+25−28
@@ -168,25 +168,22 @@ blockToDocbook _ HorizontalRule = empty -- not semantic
168168blockToDocbook opts (Table caption aligns widths headers rows) =
169169 let alignStrings = map alignmentToString aligns
170170 captionDoc = if null caption
171− then empty
172− else inTagsIndented "caption"
173− (inlinesToDocbook opts caption)
171+ then empty
172+ else inTagsIndented "caption"
173+ (inlinesToDocbook opts caption)
174174 tableType = if isEmpty captionDoc then "informaltable" else "table"
175− in inTagsIndented tableType $ captionDoc $$
176− (colHeadsToDocbook opts alignStrings widths headers) $$
177− (vcat $ map (tableRowToDocbook opts alignStrings) rows)
178−
179−colHeadsToDocbook :: WriterOptions
180− -> [[Char]]
181− -> [Double]
182− -> [[Block]]
183− -> Doc
184−colHeadsToDocbook _ _ _ hs | all null hs = empty
185−colHeadsToDocbook opts alignStrings widths headers =
186− let heads = zipWith3 (\align width item ->
187− tableItemToDocbook opts "th" align width item)
188− alignStrings widths headers
189− in inTagsIndented "tr" $ vcat heads
175+ percent w = show (truncate (100*w) :: Integer) ++ "%"
176+ coltags = if all (== 0.0) widths
177+ then empty
178+ else vcat $ map (\w ->
179+ selfClosingTag "col" [("width", percent w)]) widths
180+ head' = if all null headers
181+ then empty
182+ else inTagsIndented "thead" $
183+ tableRowToDocbook opts alignStrings "th" headers
184+ body' = inTagsIndented "tbody" $
185+ vcat $ map (tableRowToDocbook opts alignStrings "td") rows
186+ in inTagsIndented tableType $ captionDoc $$ coltags $$ head' $$ body'
190187
191188alignmentToString :: Alignment -> [Char]
192189alignmentToString alignment = case alignment of
@@ -195,22 +192,22 @@ alignmentToString alignment = case alignment of
195192 AlignCenter -> "center"
196193 AlignDefault -> "left"
197194
198−tableRowToDocbook :: WriterOptions -> [[Char]] -> [[Block]] -> Doc
199−tableRowToDocbook opts aligns cols = inTagsIndented "tr" $
200− vcat $ zipWith3 (tableItemToDocbook opts "td") aligns (repeat 0) cols
195+tableRowToDocbook :: WriterOptions
196+ -> [String]
197+ -> String
198+ -> [[Block]]
199+ -> Doc
200+tableRowToDocbook opts aligns celltype cols =
201+ inTagsIndented "tr" $ vcat $
202+ zipWith (tableItemToDocbook opts celltype) aligns cols
201203
202204tableItemToDocbook :: WriterOptions
203205 -> [Char]
204206 -> [Char]
205− -> Double
206207 -> [Block]
207208 -> Doc
208−tableItemToDocbook opts tag align width item =
209− let attrib = [("align", align)] ++
210− if width /= 0
211− then [("style", "{width: " ++
212− show (truncate (100*width) :: Integer) ++ "%;}")]
213− else []
209+tableItemToDocbook opts tag align item =
210+ let attrib = [("align", align)]
214211 in inTags True tag attrib $ vcat $ map (blockToDocbook opts) item
215212
216213-- | Take list of inline elements and return wrapped doc.
tests/tables.docbook+363−294
@@ -5,123 +5,131 @@
55 <caption>
66 Demonstration of simple table syntax.
77 </caption>
8− <tr>
9− <th align="right">
10− Right
11− </th>
12− <th align="left">
13− Left
14− </th>
15− <th align="center">
16− Center
17− </th>
18− <th align="left">
19− Default
20− </th>
21− </tr>
22− <tr>
23− <td align="right">
24− 12
25− </td>
26− <td align="left">
27− 12
28− </td>
29− <td align="center">
30− 12
31− </td>
32− <td align="left">
33− 12
34− </td>
35− </tr>
36− <tr>
37− <td align="right">
38− 123
39− </td>
40− <td align="left">
41− 123
42− </td>
43− <td align="center">
44− 123
45− </td>
46− <td align="left">
47− 123
48− </td>
49− </tr>
50− <tr>
51− <td align="right">
52− 1
53− </td>
54− <td align="left">
55− 1
56− </td>
57− <td align="center">
58− 1
59− </td>
60− <td align="left">
61− 1
62− </td>
63− </tr>
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>
6468</table>
6569<para>
6670 Simple table without caption:
6771</para>
6872<informaltable>
69− <tr>
70− <th align="right">
71− Right
72− </th>
73− <th align="left">
74− Left
75− </th>
76− <th align="center">
77− Center
78− </th>
79− <th align="left">
80− Default
81− </th>
82− </tr>
83− <tr>
84− <td align="right">
85− 12
86− </td>
87− <td align="left">
88− 12
89− </td>
90− <td align="center">
91− 12
92− </td>
93− <td align="left">
94− 12
95− </td>
96− </tr>
97− <tr>
98− <td align="right">
99− 123
100− </td>
101− <td align="left">
102− 123
103− </td>
104− <td align="center">
105− 123
106− </td>
107− <td align="left">
108− 123
109− </td>
110− </tr>
111− <tr>
112− <td align="right">
113− 1
114− </td>
115− <td align="left">
116− 1
117− </td>
118− <td align="center">
119− 1
120− </td>
121− <td align="left">
122− 1
123− </td>
124− </tr>
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>
125133</informaltable>
126134<para>
127135 Simple table indented two spaces:
@@ -130,62 +138,66 @@
130138 <caption>
131139 Demonstration of simple table syntax.
132140 </caption>
133− <tr>
134− <th align="right">
135− Right
136− </th>
137− <th align="left">
138− Left
139− </th>
140− <th align="center">
141− Center
142− </th>
143− <th align="left">
144− Default
145− </th>
146− </tr>
147− <tr>
148− <td align="right">
149− 12
150− </td>
151− <td align="left">
152− 12
153− </td>
154− <td align="center">
155− 12
156− </td>
157− <td align="left">
158− 12
159− </td>
160− </tr>
161− <tr>
162− <td align="right">
163− 123
164− </td>
165− <td align="left">
166− 123
167− </td>
168− <td align="center">
169− 123
170− </td>
171− <td align="left">
172− 123
173− </td>
174− </tr>
175− <tr>
176− <td align="right">
177− 1
178− </td>
179− <td align="left">
180− 1
181− </td>
182− <td align="center">
183− 1
184− </td>
185− <td align="left">
186− 1
187− </td>
188− </tr>
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>
189201</table>
190202<para>
191203 Multiline table with caption:
@@ -194,140 +206,197 @@
194206 <caption>
195207 Here's the caption. It may span multiple lines.
196208 </caption>
197− <tr>
198− <th align="center" style="{width: 15%;}">
199− Centered Header
200− </th>
201− <th align="left" style="{width: 13%;}">
202− Left Aligned
203− </th>
204− <th align="right" style="{width: 16%;}">
205− Right Aligned
206− </th>
207− <th align="left" style="{width: 33%;}">
208− Default aligned
209− </th>
210− </tr>
211− <tr>
212− <td align="center">
213− First
214− </td>
215− <td align="left">
216− row
217− </td>
218− <td align="right">
219− 12.0
220− </td>
221− <td align="left">
222− Example of a row that spans multiple lines.
223− </td>
224− </tr>
225− <tr>
226− <td align="center">
227− Second
228− </td>
229− <td align="left">
230− row
231− </td>
232− <td align="right">
233− 5.0
234− </td>
235− <td align="left">
236− Here's another one. Note the blank line between rows.
237− </td>
238− </tr>
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>
239259</table>
240260<para>
241261 Multiline table without caption:
242262</para>
243263<informaltable>
244− <tr>
245− <th align="center" style="{width: 15%;}">
246− Centered Header
247− </th>
248− <th align="left" style="{width: 13%;}">
249− Left Aligned
250− </th>
251− <th align="right" style="{width: 16%;}">
252− Right Aligned
253− </th>
254− <th align="left" style="{width: 33%;}">
255− Default aligned
256− </th>
257− </tr>
258− <tr>
259− <td align="center">
260− First
261− </td>
262− <td align="left">
263− row
264− </td>
265− <td align="right">
266− 12.0
267− </td>
268− <td align="left">
269− Example of a row that spans multiple lines.
270− </td>
271− </tr>
272− <tr>
273− <td align="center">
274− Second
275− </td>
276− <td align="left">
277− row
278− </td>
279− <td align="right">
280− 5.0
281− </td>
282− <td align="left">
283− Here's another one. Note the blank line between rows.
284− </td>
285− </tr>
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>
286314</informaltable>
287315<para>
288316 Table without column headers:
289317</para>
290318<informaltable>
291− <tr>
292− <td align="right">
293− 12
294− </td>
295− <td align="left">
296− 12
297− </td>
298− <td align="center">
299− 12
300− </td>
301− <td align="right">
302− 12
303− </td>
304− </tr>
305− <tr>
306− <td align="right">
307− 123
308− </td>
309− <td align="left">
310− 123
311− </td>
312− <td align="center">
313− 123
314− </td>
315− <td align="right">
316− 123
317− </td>
318− </tr>
319− <tr>
320− <td align="right">
321− 1
322− </td>
323− <td align="left">
324− 1
325− </td>
326− <td align="center">
327− 1
328− </td>
329− <td align="right">
330− 1
331− </td>
332− </tr>
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>
363+</informaltable>
364+<para>
365+ Multiline table without column headers:
366+</para>
367+<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>
333402</informaltable>