diff options
author | fiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b> | 2010-03-10 06:19:53 +0000 |
---|---|---|
committer | fiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b> | 2010-03-10 06:19:53 +0000 |
commit | 8382de28de003fd9474d94e04b645fdb9236db5b (patch) | |
tree | ee47dc40b61930e186df750ce42ad5d0df040c7b | |
parent | 0cf4652ad6cb59f5c10058f1dfc03cb2b2ab620d (diff) | |
download | pandoc-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.hs | 38 | ||||
-rw-r--r-- | tests/tables.html | 474 |
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 > |