aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b>2010-03-10 06:19:53 +0000
committerfiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b>2010-03-10 06:19:53 +0000
commit8382de28de003fd9474d94e04b645fdb9236db5b (patch)
treeee47dc40b61930e186df750ce42ad5d0df040c7b
parent0cf4652ad6cb59f5c10058f1dfc03cb2b2ab620d (diff)
downloadpandoc-8382de28de003fd9474d94e04b645fdb9236db5b.tar.gz
HTML writer: Use tbody, thead, and cols in tables.
git-svn-id: https://pandoc.googlecode.com/svn/trunk@1875 788f1e2b-df1e-0410-8736-df70ead52e1b
-rw-r--r--src/Text/Pandoc/Writers/HTML.hs38
-rw-r--r--tests/tables.html474
2 files changed, 274 insertions, 238 deletions
diff --git a/src/Text/Pandoc/Writers/HTML.hs b/src/Text/Pandoc/Writers/HTML.hs
index b337572fe..2f58c7614 100644
--- a/src/Text/Pandoc/Writers/HTML.hs
+++ b/src/Text/Pandoc/Writers/HTML.hs
@@ -346,27 +346,32 @@ blockToHtml opts (Table capt aligns widths headers rows') = do
captionDoc <- if null capt
then return noHtml
else inlineListToHtml opts capt >>= return . caption
- let zeros = replicate (length headers) (0.0 :: Double)
- let (rownums, rows'') = if all null headers
- then ([1..], rows')
- else ([0..], (headers : rows'))
- body' <- mapM (tableRowToHtml opts alignStrings) $
- zip3 rownums (widths : repeat zeros) rows''
- return $ table $ captionDoc +++ body'
+ let percent w = show (truncate (100*w) :: Integer) ++ "%"
+ let coltags = if all (== 0.0) widths
+ then noHtml
+ else concatHtml $ map
+ (\w -> col ! [width $ percent w] $ noHtml) widths
+ head' <- if all null headers
+ then return noHtml
+ else liftM (thead <<) $ tableRowToHtml opts alignStrings 0 headers
+ body' <- liftM (tbody <<) $
+ zipWithM (tableRowToHtml opts alignStrings) [1..] rows'
+ return $ table $ captionDoc +++ coltags +++ head' +++ body'
tableRowToHtml :: WriterOptions
-> [String]
- -> (Int, [Double], [[Block]])
+ -> Int
+ -> [[Block]]
-> State WriterState Html
-tableRowToHtml opts alignStrings (rownum, widths, cols') = do
+tableRowToHtml opts alignStrings rownum cols' = do
let mkcell = if rownum == 0 then th else td
let rowclass = case rownum of
0 -> "header"
x | x `rem` 2 == 1 -> "odd"
_ -> "even"
- cols'' <- sequence $ zipWith3
- (\alignment columnwidth item -> tableItemToHtml opts mkcell alignment columnwidth item)
- alignStrings widths cols'
+ cols'' <- sequence $ zipWith
+ (\alignment item -> tableItemToHtml opts mkcell alignment item)
+ alignStrings cols'
return $ tr ! [theclass rowclass] $ toHtmlFromList cols''
alignmentToString :: Alignment -> [Char]
@@ -379,16 +384,11 @@ alignmentToString alignment = case alignment of
tableItemToHtml :: WriterOptions
-> (Html -> Html)
-> [Char]
- -> Double
-> [Block]
-> State WriterState Html
-tableItemToHtml opts tag' align' width' item = do
+tableItemToHtml opts tag' align' item = do
contents <- blockListToHtml opts item
- let attrib = [align align'] ++
- if width' /= 0
- then [thestyle ("width: " ++ (show (truncate (100 * width') :: Integer)) ++ "%;")]
- else []
- return $ tag' ! attrib $ contents
+ return $ tag' ! [align align'] $ contents
blockListToHtml :: WriterOptions -> [Block] -> State WriterState Html
blockListToHtml opts lst =
diff --git a/tests/tables.html b/tests/tables.html
index 54e7ae5bc..e4dd6be58 100644
--- a/tests/tables.html
+++ b/tests/tables.html
@@ -3,263 +3,299 @@
><table
><caption
>Demonstration of simple table syntax.</caption
+ ><thead
><tr class="header"
- ><th align="right"
- >Right</th
- ><th align="left"
- >Left</th
- ><th align="center"
- >Center</th
- ><th align="left"
- >Default</th
- ></tr
- ><tr class="odd"
- ><td align="right"
- >12</td
- ><td align="left"
- >12</td
- ><td align="center"
- >12</td
- ><td align="left"
- >12</td
- ></tr
- ><tr class="even"
- ><td align="right"
- >123</td
- ><td align="left"
- >123</td
- ><td align="center"
- >123</td
- ><td align="left"
- >123</td
- ></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 class="odd"
- ><td align="right"
- >1</td
- ><td align="left"
- >1</td
- ><td align="center"
- >1</td
- ><td align="left"
- >1</td
- ></tr
+ ><td align="right"
+ >12</td
+ ><td align="left"
+ >12</td
+ ><td align="center"
+ >12</td
+ ><td align="left"
+ >12</td
+ ></tr
+ ><tr class="even"
+ ><td align="right"
+ >123</td
+ ><td align="left"
+ >123</td
+ ><td align="center"
+ >123</td
+ ><td align="left"
+ >123</td
+ ></tr
+ ><tr class="odd"
+ ><td align="right"
+ >1</td
+ ><td align="left"
+ >1</td
+ ><td align="center"
+ >1</td
+ ><td align="left"
+ >1</td
+ ></tr
+ ></tbody
></table
><p
>Simple table without caption:</p
><table
-><tr class="header"
- ><th align="right"
- >Right</th
- ><th align="left"
- >Left</th
- ><th align="center"
- >Center</th
- ><th align="left"
- >Default</th
- ></tr
- ><tr class="odd"
- ><td align="right"
- >12</td
- ><td align="left"
- >12</td
- ><td align="center"
- >12</td
- ><td align="left"
- >12</td
- ></tr
- ><tr class="even"
- ><td align="right"
- >123</td
- ><td align="left"
- >123</td
- ><td align="center"
- >123</td
- ><td align="left"
- >123</td
- ></tr
+><thead
+ ><tr class="header"
+ ><th align="right"
+ >Right</th
+ ><th align="left"
+ >Left</th
+ ><th align="center"
+ >Center</th
+ ><th align="left"
+ >Default</th
+ ></tr
+ ></thead
+ ><tbody
><tr class="odd"
- ><td align="right"
- >1</td
- ><td align="left"
- >1</td
- ><td align="center"
- >1</td
- ><td align="left"
- >1</td
- ></tr
+ ><td align="right"
+ >12</td
+ ><td align="left"
+ >12</td
+ ><td align="center"
+ >12</td
+ ><td align="left"
+ >12</td
+ ></tr
+ ><tr class="even"
+ ><td align="right"
+ >123</td
+ ><td align="left"
+ >123</td
+ ><td align="center"
+ >123</td
+ ><td align="left"
+ >123</td
+ ></tr
+ ><tr class="odd"
+ ><td align="right"
+ >1</td
+ ><td align="left"
+ >1</td
+ ><td align="center"
+ >1</td
+ ><td align="left"
+ >1</td
+ ></tr
+ ></tbody
></table
><p
>Simple table indented two spaces:</p
><table
><caption
>Demonstration of simple table syntax.</caption
+ ><thead
><tr class="header"
- ><th align="right"
- >Right</th
- ><th align="left"
- >Left</th
- ><th align="center"
- >Center</th
- ><th align="left"
- >Default</th
- ></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 class="odd"
- ><td align="right"
- >12</td
- ><td align="left"
- >12</td
- ><td align="center"
- >12</td
- ><td align="left"
- >12</td
- ></tr
- ><tr class="even"
- ><td align="right"
- >123</td
- ><td align="left"
- >123</td
- ><td align="center"
- >123</td
- ><td align="left"
- >123</td
- ></tr
- ><tr class="odd"
- ><td align="right"
- >1</td
- ><td align="left"
- >1</td
- ><td align="center"
- >1</td
- ><td align="left"
- >1</td
- ></tr
+ ><td align="right"
+ >12</td
+ ><td align="left"
+ >12</td
+ ><td align="center"
+ >12</td
+ ><td align="left"
+ >12</td
+ ></tr
+ ><tr class="even"
+ ><td align="right"
+ >123</td
+ ><td align="left"
+ >123</td
+ ><td align="center"
+ >123</td
+ ><td align="left"
+ >123</td
+ ></tr
+ ><tr class="odd"
+ ><td align="right"
+ >1</td
+ ><td align="left"
+ >1</td
+ ><td align="center"
+ >1</td
+ ><td align="left"
+ >1</td
+ ></tr
+ ></tbody
></table
><p
>Multiline table with caption:</p
><table
><caption
>Here's the caption. It may span multiple lines.</caption
+ ><col width="15%"
+ /><col width="13%"
+ /><col width="16%"
+ /><col width="33%"
+ /><thead
><tr class="header"
- ><th align="center" style="width: 15%;"
- >Centered Header</th
- ><th align="left" style="width: 13%;"
- >Left Aligned</th
- ><th align="right" style="width: 16%;"
- >Right Aligned</th
- ><th align="left" style="width: 33%;"
- >Default aligned</th
- ></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 class="odd"
- ><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 class="even"
- ><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
+ ><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 class="even"
+ ><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
></table
><p
>Multiline table without caption:</p
><table
-><tr class="header"
- ><th align="center" style="width: 15%;"
- >Centered Header</th
- ><th align="left" style="width: 13%;"
- >Left Aligned</th
- ><th align="right" style="width: 16%;"
- >Right Aligned</th
- ><th align="left" style="width: 33%;"
- >Default aligned</th
- ></tr
+><col width="15%"
+ /><col width="13%"
+ /><col width="16%"
+ /><col width="33%"
+ /><thead
+ ><tr class="header"
+ ><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 class="odd"
- ><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 class="even"
- ><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
+ ><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 class="even"
+ ><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
></table
><p
>Table without column headers:</p
><table
-><tr class="odd"
- ><td align="right"
- >12</td
- ><td align="left"
- >12</td
- ><td align="center"
- >12</td
+><tbody
+ ><tr class="odd"
><td align="right"
- >12</td
- ></tr
- ><tr class="even"
- ><td align="right"
- >123</td
- ><td align="left"
- >123</td
- ><td align="center"
- >123</td
+ >12</td
+ ><td align="left"
+ >12</td
+ ><td align="center"
+ >12</td
+ ><td align="right"
+ >12</td
+ ></tr
+ ><tr class="even"
><td align="right"
- >123</td
- ></tr
- ><tr class="odd"
- ><td align="right"
- >1</td
- ><td align="left"
- >1</td
- ><td align="center"
- >1</td
+ >123</td
+ ><td align="left"
+ >123</td
+ ><td align="center"
+ >123</td
+ ><td align="right"
+ >123</td
+ ></tr
+ ><tr class="odd"
><td align="right"
- >1</td
- ></tr
+ >1</td
+ ><td align="left"
+ >1</td
+ ><td align="center"
+ >1</td
+ ><td align="right"
+ >1</td
+ ></tr
+ ></tbody
></table
><p
>Multiline table without column headers:</p
><table
-><tr class="odd"
- ><td align="center" style="width: 15%;"
- >First</td
- ><td align="left" style="width: 13%;"
- >row</td
- ><td align="right" style="width: 16%;"
- >12.0</td
- ><td align="left" style="width: 33%;"
- >Example of a row that spans multiple lines.</td
- ></tr
- ><tr class="even"
- ><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
+><col width="15%"
+ /><col width="13%"
+ /><col width="16%"
+ /><col width="33%"
+ /><tbody
+ ><tr class="odd"
+ ><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 class="even"
+ ><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
></table
>