", table_nc (t));
+ *tfoot = true;
+ }
+ else
+ fputs ("\n ", html->file);
+}
+
+static void
+html_output_table (struct html_driver *html, const struct table_item *item)
{
const struct table *t = table_item_get_table (item);
- const char *caption;
- int x, y;
+ const char *title = table_item_get_title (item);
+ const char *caption = table_item_get_caption (item);
+ int footnote_idx = 0;
+ bool tfoot = false;
+ int y;
+
+ fputs ("", html->file);
+
+ if (caption)
+ {
+ put_tfoot (html, t, &tfoot);
+ escape_string (html->file, caption, strlen (caption), " ", " ");
+ }
+ footnote_idx = 0;
+ for (y = 0; y < table_nr (t); y++)
+ {
+ int x;
+
+ for (x = 0; x < table_nc (t); )
+ {
+ const struct cell_contents *c;
+ struct table_cell cell;
+
+ table_get_cell (t, x, y, &cell);
+ if (y != cell.d[TABLE_VERT][0])
+ continue;
+
+ for (c = cell.contents; c < &cell.contents[cell.n_contents]; c++)
+ {
+ int i;
+
+ for (i = 0; i < c->n_footnotes; i++)
+ {
+ char marker[16];
+
+ put_tfoot (html, t, &tfoot);
+ str_format_26adic (++footnote_idx, false, marker, sizeof marker);
+ fprintf (html->file, "%s ", marker);
+ escape_string (html->file, c->footnotes[i],
+ strlen (c->footnotes[i]), " ", " ");
+ }
+ }
+ x = cell.d[TABLE_HORZ][1];
+ table_cell_free (&cell);
+ }
+ }
+ if (tfoot)
+ fputs ("\n", html->file);
+ footnote_idx = 0;
- fputs ("\n", html->file);
+ fputs ("\n", html->file);
- caption = table_item_get_caption (item);
- if (caption != NULL)
+ if (title != NULL)
{
fputs (" ", html->file);
- escape_string (html->file, caption, strlen (caption), " ");
+ escape_string (html->file, title, strlen (title), " ", " ");
fputs ("\n", html->file);
}
for (y = 0; y < table_nr (t); y++)
{
+ int x;
+
fputs (" \n", html->file);
- for (x = 0; x < table_nc (t); x++)
+ for (x = 0; x < table_nc (t); )
{
+ const struct cell_contents *c;
struct table_cell cell;
const char *tag;
bool is_header;
int alignment, colspan, rowspan;
int top, left, right, bottom, n_borders;
- const char *s;
table_get_cell (t, x, y, &cell);
if (x != cell.d[TABLE_HORZ][0] || y != cell.d[TABLE_VERT][0])
@@ -410,7 +474,9 @@ html_output_table (struct html_driver *html, struct table_item *item)
tag = is_header ? "TH" : "TD";
fprintf (html->file, " <%s", tag);
- alignment = cell.options & TAB_ALIGNMENT;
+ alignment = (cell.n_contents > 0
+ ? cell.contents[0].options & TAB_ALIGNMENT
+ : TAB_LEFT);
if (alignment != TAB_LEFT)
fprintf (html->file, " ALIGN=\"%s\"",
alignment == TAB_RIGHT ? "RIGHT" : "CENTER");
@@ -432,9 +498,9 @@ html_output_table (struct html_driver *html, struct table_item *item)
if (top > TAL_GAP)
put_border (html->file, n_borders++, top, "top");
- if (y == table_nr (t) - 1)
+ if (y + rowspan == table_nr (t))
{
- bottom = table_get_rule (t, TABLE_VERT, x, y + 1);
+ bottom = table_get_rule (t, TABLE_VERT, x, y + rowspan);
if (bottom > TAL_GAP)
put_border (html->file, n_borders++, bottom, "bottom");
}
@@ -443,9 +509,9 @@ html_output_table (struct html_driver *html, struct table_item *item)
if (left > TAL_GAP)
put_border (html->file, n_borders++, left, "left");
- if (x == table_nc (t) - 1)
+ if (x + colspan == table_nc (t))
{
- right = table_get_rule (t, TABLE_HORZ, x + 1, y);
+ right = table_get_rule (t, TABLE_HORZ, x + colspan, y);
if (right > TAL_GAP)
put_border (html->file, n_borders++, right, "right");
}
@@ -457,32 +523,59 @@ html_output_table (struct html_driver *html, struct table_item *item)
putc ('>', html->file);
/* Output cell contents. */
- s = cell.contents;
- if (cell.options & TAB_EMPH)
- fputs ("", html->file);
- if (cell.options & TAB_FIX)
- {
- fputs ("", html->file);
- escape_string (html->file, s, strlen (s), " ");
- fputs ("", html->file);
- }
- else
+ for (c = cell.contents; c < &cell.contents[cell.n_contents]; c++)
{
- s += strspn (s, CC_SPACES);
- escape_string (html->file, s, strlen (s), " ");
+ if (c->text)
+ {
+ const char *s = c->text;
+ int i;
+
+ if (c->options & TAB_EMPH)
+ fputs ("", html->file);
+ if (c->options & TAB_FIX)
+ {
+ fputs ("", html->file);
+ escape_string (html->file, s, strlen (s), " ", " ");
+ fputs ("", html->file);
+ }
+ else
+ {
+ s += strspn (s, CC_SPACES);
+ escape_string (html->file, s, strlen (s), " ", " ");
+ }
+ if (c->options & TAB_EMPH)
+ fputs ("", html->file);
+
+ if (c->n_footnotes > 0)
+ {
+ fputs ("", html->file);
+ for (i = 0; i < c->n_footnotes; i++)
+ {
+ char marker[16];
+
+ if (i > 0)
+ putc (',', html->file);
+ str_format_26adic (++footnote_idx, false,
+ marker, sizeof marker);
+ fputs (marker, html->file);
+ }
+ fputs ("", html->file);
+ }
+ }
+ else
+ html_output_table (html, c->table);
}
- if (cell.options & TAB_EMPH)
- fputs ("", html->file);
/* Output or . */
fprintf (html->file, "%s>\n", tag);
+ x = cell.d[TABLE_HORZ][1];
table_cell_free (&cell);
}
fputs (" \n", html->file);
}
- fputs (" \n\n", html->file);
+ fputs (" \n\n", html->file);
}
struct output_driver_factory html_driver_factory =
|