git.iko.soy/typeable/pandoc
on master help sign in
HTML writer: Use tbody, thead, and cols in tables.

git-svn-id: https://pandoc.googlecode.com/svn/trunk@1875 788f1e2b-df1e-0410-8736-df70ead52e1b

commit8382de28de003fd9474d94e04b645fdb9236db5b authorfiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b> dateWed 10 Mar 2010, 06:19 (17 years ago) parent0cf4652
2 files changed+274−238
src/Text/Pandoc/Writers/HTML.hs+19−19 tests/tables.html+255−219
src/Text/Pandoc/Writers/HTML.hs+19−19
@@ -346,27 +346,32 @@ blockToHtml opts (Table capt aligns widths headers rows') = do
346346 captionDoc <- if null capt
347347 then return noHtml
348348 else inlineListToHtml opts capt >>= return . caption
349− let zeros = replicate (length headers) (0.0 :: Double)
350− let (rownums, rows'') = if all null headers
351− then ([1..], rows')
352− else ([0..], (headers : rows'))
353− body' <- mapM (tableRowToHtml opts alignStrings) $
354− zip3 rownums (widths : repeat zeros) rows''
355− return $ table $ captionDoc +++ body'
349+ let percent w = show (truncate (100*w) :: Integer) ++ "%"
350+ let coltags = if all (== 0.0) widths
351+ then noHtml
352+ else concatHtml $ map
353+ (\w -> col ! [width $ percent w] $ noHtml) widths
354+ head' <- if all null headers
355+ then return noHtml
356+ else liftM (thead <<) $ tableRowToHtml opts alignStrings 0 headers
357+ body' <- liftM (tbody <<) $
358+ zipWithM (tableRowToHtml opts alignStrings) [1..] rows'
359+ return $ table $ captionDoc +++ coltags +++ head' +++ body'
356360
357361tableRowToHtml :: WriterOptions
358362 -> [String]
359− -> (Int, [Double], [[Block]])
363+ -> Int
364+ -> [[Block]]
360365 -> State WriterState Html
361−tableRowToHtml opts alignStrings (rownum, widths, cols') = do
366+tableRowToHtml opts alignStrings rownum cols' = do
362367 let mkcell = if rownum == 0 then th else td
363368 let rowclass = case rownum of
364369 0 -> "header"
365370 x | x `rem` 2 == 1 -> "odd"
366371 _ -> "even"
367− cols'' <- sequence $ zipWith3
368− (\alignment columnwidth item -> tableItemToHtml opts mkcell alignment columnwidth item)
369− alignStrings widths cols'
372+ cols'' <- sequence $ zipWith
373+ (\alignment item -> tableItemToHtml opts mkcell alignment item)
374+ alignStrings cols'
370375 return $ tr ! [theclass rowclass] $ toHtmlFromList cols''
371376
372377alignmentToString :: Alignment -> [Char]
@@ -379,16 +384,11 @@ alignmentToString alignment = case alignment of
379384tableItemToHtml :: WriterOptions
380385 -> (Html -> Html)
381386 -> [Char]
382− -> Double
383387 -> [Block]
384388 -> State WriterState Html
385−tableItemToHtml opts tag' align' width' item = do
389+tableItemToHtml opts tag' align' item = do
386390 contents <- blockListToHtml opts item
387− let attrib = [align align'] ++
388− if width' /= 0
389− then [thestyle ("width: " ++ (show (truncate (100 * width') :: Integer)) ++ "%;")]
390− else []
391− return $ tag' ! attrib $ contents
391+ return $ tag' ! [align align'] $ contents
392392
393393blockListToHtml :: WriterOptions -> [Block] -> State WriterState Html
394394blockListToHtml opts lst =
tests/tables.html+255−219
@@ -3,263 +3,299 @@
33><table
44><caption
55 >Demonstration of simple table syntax.</caption
6+ ><thead
67 ><tr class="header"
7− ><th align="right"
8− >Right</th
9− ><th align="left"
10− >Left</th
11− ><th align="center"
12− >Center</th
13− ><th align="left"
14− >Default</th
15− ></tr
16− ><tr class="odd"
17− ><td align="right"
18− >12</td
19− ><td align="left"
20− >12</td
21− ><td align="center"
22− >12</td
23− ><td align="left"
24− >12</td
25− ></tr
26− ><tr class="even"
27− ><td align="right"
28− >123</td
29− ><td align="left"
30− >123</td
31− ><td align="center"
32− >123</td
33− ><td align="left"
34− >123</td
35− ></tr
8+ ><th align="right"
9+ >Right</th
10+ ><th align="left"
11+ >Left</th
12+ ><th align="center"
13+ >Center</th
14+ ><th align="left"
15+ >Default</th
16+ ></tr
17+ ></thead
18+ ><tbody
3619 ><tr class="odd"
37− ><td align="right"
38− >1</td
39− ><td align="left"
40− >1</td
41− ><td align="center"
42− >1</td
43− ><td align="left"
44− >1</td
45− ></tr
20+ ><td align="right"
21+ >12</td
22+ ><td align="left"
23+ >12</td
24+ ><td align="center"
25+ >12</td
26+ ><td align="left"
27+ >12</td
28+ ></tr
29+ ><tr class="even"
30+ ><td align="right"
31+ >123</td
32+ ><td align="left"
33+ >123</td
34+ ><td align="center"
35+ >123</td
36+ ><td align="left"
37+ >123</td
38+ ></tr
39+ ><tr class="odd"
40+ ><td align="right"
41+ >1</td
42+ ><td align="left"
43+ >1</td
44+ ><td align="center"
45+ >1</td
46+ ><td align="left"
47+ >1</td
48+ ></tr
49+ ></tbody
4650 ></table
4751><p
4852>Simple table without caption:</p
4953><table
50−><tr class="header"
51− ><th align="right"
52− >Right</th
53− ><th align="left"
54− >Left</th
55− ><th align="center"
56− >Center</th
57− ><th align="left"
58− >Default</th
59− ></tr
60− ><tr class="odd"
61− ><td align="right"
62− >12</td
63− ><td align="left"
64− >12</td
65− ><td align="center"
66− >12</td
67− ><td align="left"
68− >12</td
69− ></tr
70− ><tr class="even"
71− ><td align="right"
72− >123</td
73− ><td align="left"
74− >123</td
75− ><td align="center"
76− >123</td
77− ><td align="left"
78− >123</td
79− ></tr
54+><thead
55+ ><tr class="header"
56+ ><th align="right"
57+ >Right</th
58+ ><th align="left"
59+ >Left</th
60+ ><th align="center"
61+ >Center</th
62+ ><th align="left"
63+ >Default</th
64+ ></tr
65+ ></thead
66+ ><tbody
8067 ><tr class="odd"
81− ><td align="right"
82− >1</td
83− ><td align="left"
84− >1</td
85− ><td align="center"
86− >1</td
87− ><td align="left"
88− >1</td
89− ></tr
68+ ><td align="right"
69+ >12</td
70+ ><td align="left"
71+ >12</td
72+ ><td align="center"
73+ >12</td
74+ ><td align="left"
75+ >12</td
76+ ></tr
77+ ><tr class="even"
78+ ><td align="right"
79+ >123</td
80+ ><td align="left"
81+ >123</td
82+ ><td align="center"
83+ >123</td
84+ ><td align="left"
85+ >123</td
86+ ></tr
87+ ><tr class="odd"
88+ ><td align="right"
89+ >1</td
90+ ><td align="left"
91+ >1</td
92+ ><td align="center"
93+ >1</td
94+ ><td align="left"
95+ >1</td
96+ ></tr
97+ ></tbody
9098 ></table
9199><p
92100>Simple table indented two spaces:</p
93101><table
94102><caption
95103 >Demonstration of simple table syntax.</caption
104+ ><thead
96105 ><tr class="header"
97− ><th align="right"
98− >Right</th
99− ><th align="left"
100− >Left</th
101− ><th align="center"
102− >Center</th
103− ><th align="left"
104− >Default</th
105− ></tr
106+ ><th align="right"
107+ >Right</th
108+ ><th align="left"
109+ >Left</th
110+ ><th align="center"
111+ >Center</th
112+ ><th align="left"
113+ >Default</th
114+ ></tr
115+ ></thead
116+ ><tbody
106117 ><tr class="odd"
107− ><td align="right"
108− >12</td
109− ><td align="left"
110− >12</td
111− ><td align="center"
112− >12</td
113− ><td align="left"
114− >12</td
115− ></tr
116− ><tr class="even"
117− ><td align="right"
118− >123</td
119− ><td align="left"
120− >123</td
121− ><td align="center"
122− >123</td
123− ><td align="left"
124− >123</td
125− ></tr
126− ><tr class="odd"
127− ><td align="right"
128− >1</td
129− ><td align="left"
130− >1</td
131− ><td align="center"
132− >1</td
133− ><td align="left"
134− >1</td
135− ></tr
118+ ><td align="right"
119+ >12</td
120+ ><td align="left"
121+ >12</td
122+ ><td align="center"
123+ >12</td
124+ ><td align="left"
125+ >12</td
126+ ></tr
127+ ><tr class="even"
128+ ><td align="right"
129+ >123</td
130+ ><td align="left"
131+ >123</td
132+ ><td align="center"
133+ >123</td
134+ ><td align="left"
135+ >123</td
136+ ></tr
137+ ><tr class="odd"
138+ ><td align="right"
139+ >1</td
140+ ><td align="left"
141+ >1</td
142+ ><td align="center"
143+ >1</td
144+ ><td align="left"
145+ >1</td
146+ ></tr
147+ ></tbody
136148 ></table
137149><p
138150>Multiline table with caption:</p
139151><table
140152><caption
141153 >Here's the caption. It may span multiple lines.</caption
154+ ><col width="15%"
155+ /><col width="13%"
156+ /><col width="16%"
157+ /><col width="33%"
158+ /><thead
142159 ><tr class="header"
143− ><th align="center" style="width: 15%;"
144− >Centered Header</th
145− ><th align="left" style="width: 13%;"
146− >Left Aligned</th
147− ><th align="right" style="width: 16%;"
148− >Right Aligned</th
149− ><th align="left" style="width: 33%;"
150− >Default aligned</th
151− ></tr
160+ ><th align="center"
161+ >Centered Header</th
162+ ><th align="left"
163+ >Left Aligned</th
164+ ><th align="right"
165+ >Right Aligned</th
166+ ><th align="left"
167+ >Default aligned</th
168+ ></tr
169+ ></thead
170+ ><tbody
152171 ><tr class="odd"
153− ><td align="center"
154− >First</td
155− ><td align="left"
156− >row</td
157− ><td align="right"
158− >12.0</td
159− ><td align="left"
160− >Example of a row that spans multiple lines.</td
161− ></tr
162− ><tr class="even"
163− ><td align="center"
164− >Second</td
165− ><td align="left"
166− >row</td
167− ><td align="right"
168− >5.0</td
169− ><td align="left"
170− >Here's another one. Note the blank line between rows.</td
171− ></tr
172+ ><td align="center"
173+ >First</td
174+ ><td align="left"
175+ >row</td
176+ ><td align="right"
177+ >12.0</td
178+ ><td align="left"
179+ >Example of a row that spans multiple lines.</td
180+ ></tr
181+ ><tr class="even"
182+ ><td align="center"
183+ >Second</td
184+ ><td align="left"
185+ >row</td
186+ ><td align="right"
187+ >5.0</td
188+ ><td align="left"
189+ >Here's another one. Note the blank line between rows.</td
190+ ></tr
191+ ></tbody
172192 ></table
173193><p
174194>Multiline table without caption:</p
175195><table
176−><tr class="header"
177− ><th align="center" style="width: 15%;"
178− >Centered Header</th
179− ><th align="left" style="width: 13%;"
180− >Left Aligned</th
181− ><th align="right" style="width: 16%;"
182− >Right Aligned</th
183− ><th align="left" style="width: 33%;"
184− >Default aligned</th
185− ></tr
196+><col width="15%"
197+ /><col width="13%"
198+ /><col width="16%"
199+ /><col width="33%"
200+ /><thead
201+ ><tr class="header"
202+ ><th align="center"
203+ >Centered Header</th
204+ ><th align="left"
205+ >Left Aligned</th
206+ ><th align="right"
207+ >Right Aligned</th
208+ ><th align="left"
209+ >Default aligned</th
210+ ></tr
211+ ></thead
212+ ><tbody
186213 ><tr class="odd"
187− ><td align="center"
188− >First</td
189− ><td align="left"
190− >row</td
191− ><td align="right"
192− >12.0</td
193− ><td align="left"
194− >Example of a row that spans multiple lines.</td
195− ></tr
196− ><tr class="even"
197− ><td align="center"
198− >Second</td
199− ><td align="left"
200− >row</td
201− ><td align="right"
202− >5.0</td
203− ><td align="left"
204− >Here's another one. Note the blank line between rows.</td
205− ></tr
214+ ><td align="center"
215+ >First</td
216+ ><td align="left"
217+ >row</td
218+ ><td align="right"
219+ >12.0</td
220+ ><td align="left"
221+ >Example of a row that spans multiple lines.</td
222+ ></tr
223+ ><tr class="even"
224+ ><td align="center"
225+ >Second</td
226+ ><td align="left"
227+ >row</td
228+ ><td align="right"
229+ >5.0</td
230+ ><td align="left"
231+ >Here's another one. Note the blank line between rows.</td
232+ ></tr
233+ ></tbody
206234 ></table
207235><p
208236>Table without column headers:</p
209237><table
210−><tr class="odd"
211− ><td align="right"
212− >12</td
213− ><td align="left"
214− >12</td
215− ><td align="center"
216− >12</td
238+><tbody
239+ ><tr class="odd"
217240 ><td align="right"
218− >12</td
219− ></tr
220− ><tr class="even"
221− ><td align="right"
222− >123</td
223− ><td align="left"
224− >123</td
225− ><td align="center"
226− >123</td
241+ >12</td
242+ ><td align="left"
243+ >12</td
244+ ><td align="center"
245+ >12</td
246+ ><td align="right"
247+ >12</td
248+ ></tr
249+ ><tr class="even"
227250 ><td align="right"
228− >123</td
229− ></tr
230− ><tr class="odd"
231− ><td align="right"
232− >1</td
233− ><td align="left"
234− >1</td
235− ><td align="center"
236− >1</td
251+ >123</td
252+ ><td align="left"
253+ >123</td
254+ ><td align="center"
255+ >123</td
256+ ><td align="right"
257+ >123</td
258+ ></tr
259+ ><tr class="odd"
237260 ><td align="right"
238− >1</td
239− ></tr
261+ >1</td
262+ ><td align="left"
263+ >1</td
264+ ><td align="center"
265+ >1</td
266+ ><td align="right"
267+ >1</td
268+ ></tr
269+ ></tbody
240270 ></table
241271><p
242272>Multiline table without column headers:</p
243273><table
244−><tr class="odd"
245− ><td align="center" style="width: 15%;"
246− >First</td
247− ><td align="left" style="width: 13%;"
248− >row</td
249− ><td align="right" style="width: 16%;"
250− >12.0</td
251− ><td align="left" style="width: 33%;"
252− >Example of a row that spans multiple lines.</td
253− ></tr
254− ><tr class="even"
255− ><td align="center"
256− >Second</td
257− ><td align="left"
258− >row</td
259− ><td align="right"
260− >5.0</td
261− ><td align="left"
262− >Here's another one. Note the blank line between rows.</td
263− ></tr
274+><col width="15%"
275+ /><col width="13%"
276+ /><col width="16%"
277+ /><col width="33%"
278+ /><tbody
279+ ><tr class="odd"
280+ ><td align="center"
281+ >First</td
282+ ><td align="left"
283+ >row</td
284+ ><td align="right"
285+ >12.0</td
286+ ><td align="left"
287+ >Example of a row that spans multiple lines.</td
288+ ></tr
289+ ><tr class="even"
290+ ><td align="center"
291+ >Second</td
292+ ><td align="left"
293+ >row</td
294+ ><td align="right"
295+ >5.0</td
296+ ><td align="left"
297+ >Here's another one. Note the blank line between rows.</td
298+ ></tr
299+ ></tbody
264300 ></table
265301>