about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/layout/engine.nim38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/layout/engine.nim b/src/layout/engine.nim
index 1658d91d..8bf5c0d0 100644
--- a/src/layout/engine.nim
+++ b/src/layout/engine.nim
@@ -1294,30 +1294,50 @@ proc buildTableRow(pctx: TableContext, ctx: RowContext, parent: BlockBox,
   row.width = x
   return row
 
+proc preBuildTableRows(ctx: var TableContext, rows: seq[TableRowBoxBuilder],
+    table: BlockBox) =
+  for row in rows:
+    let rctx = ctx.preBuildTableRow(row, table)
+    ctx.rows.add(rctx)
+    ctx.maxwidth = max(rctx.width, ctx.maxwidth)
+
 proc preBuildTableRows(ctx: var TableContext, builder: TableBoxBuilder,
     table: BlockBox) =
-  var rows: seq[TableRowBoxBuilder]
+  # Use separate seqs for different row groups, so that e.g. this HTML:
+  # echo '<TABLE><TBODY><TR><TD>world<THEAD><TR><TD>hello'|cha -T text/html
+  # is rendered as:
+  # hello
+  # world
+  var thead: seq[TableRowBoxBuilder]
+  var tbody: seq[TableRowBoxBuilder]
+  var tfoot: seq[TableRowBoxBuilder]
   var caption: TableCaptionBoxBuilder
   for child in builder.children:
     assert child.computed{"display"} in ProperTableChild
     case child.computed{"display"}
     of DISPLAY_TABLE_ROW:
-      rows.add(TableRowBoxBuilder(child))
-    of DISPLAY_TABLE_HEADER_GROUP, DISPLAY_TABLE_ROW_GROUP,
-        DISPLAY_TABLE_FOOTER_GROUP:
+      tbody.add(TableRowBoxBuilder(child))
+    of DISPLAY_TABLE_HEADER_GROUP:
+      for child in child.children:
+        assert child.computed{"display"} == DISPLAY_TABLE_ROW
+        thead.add(TableRowBoxBuilder(child))
+    of DISPLAY_TABLE_ROW_GROUP:
+      for child in child.children:
+        assert child.computed{"display"} == DISPLAY_TABLE_ROW
+        tbody.add(TableRowBoxBuilder(child))
+    of DISPLAY_TABLE_FOOTER_GROUP:
       for child in child.children:
         assert child.computed{"display"} == DISPLAY_TABLE_ROW
-        rows.add(TableRowBoxBuilder(child))
+        tfoot.add(TableRowBoxBuilder(child))
     of DISPLAY_TABLE_CAPTION:
       if caption == nil:
         caption = TableCaptionBoxBuilder(child)
     else: discard
   if caption != nil:
     ctx.caption = caption
-  for row in rows:
-    let rctx = ctx.preBuildTableRow(row, table)
-    ctx.rows.add(rctx)
-    ctx.maxwidth = max(rctx.width, ctx.maxwidth)
+  ctx.preBuildTableRows(thead, table)
+  ctx.preBuildTableRows(tbody, table)
+  ctx.preBuildTableRows(tfoot, table)
 
 proc calcUnspecifiedColIndices(ctx: var TableContext, W: var LayoutUnit,
     weight: var float64): seq[int] =