size_t n_footnotes;
const struct footnote **footnotes;
+
+ const struct area_style *style;
};
static const struct table_class tab_table_class;
t->fmtmap[RC_OTHER] = *settings_get_format ();
memset (t->styles, 0, sizeof t->styles);
+ memset (t->rule_colors, 0, sizeof t->rule_colors);
t->col_ofs = t->row_ofs = 0;
j->d[TABLE_VERT][1] = ++y2 + table->row_ofs;
j->n_footnotes = 0;
j->footnotes = NULL;
+ j->style = NULL;
{
void **cc = &table->cc[x1 + y1 * table->cf];
struct footnote *
tab_create_footnote (struct tab_table *table, size_t idx, const char *content,
- const char *marker)
+ const char *marker, struct area_style *style)
{
struct footnote *f = pool_alloc (table->container, sizeof *f);
f->idx = idx;
f->content = pool_strdup (table->container, content);
f->marker = pool_strdup (table->container, marker);
+ f->style = style;
return f;
}
j->footnotes[j->n_footnotes++] = f;
}
+void
+tab_add_style (struct tab_table *table, int x, int y,
+ const struct area_style *style)
+{
+ int index = x + y * table->cf;
+ unsigned short opt = table->ct[index];
+ struct tab_joined_cell *j;
+
+ if (opt & TAB_JOIN)
+ j = table->cc[index];
+ else
+ {
+ char *text = table->cc[index];
+
+ j = add_joined_cell (table, x, y, x, y, table->ct[index]);
+ j->u.text = text ? text : xstrdup ("");
+ }
+
+ j->style = style;
+}
+
bool
tab_cell_is_empty (const struct tab_table *table, int c, int r)
{
void
tab_output_text (int options, const char *string)
{
- enum text_item_type type = (options & TAB_EMPH ? TEXT_ITEM_SUBHEAD
- : options & TAB_FIX ? TEXT_ITEM_MONOSPACE
+ enum text_item_type type = (options & TAB_EMPH ? TEXT_ITEM_TITLE
+ : options & TAB_FIX ? TEXT_ITEM_LOG
: TEXT_ITEM_PARAGRAPH);
text_item_submit (text_item_create (type, string));
}
unsigned short opt = t->ct[index];
const void *cc = t->cc[index];
- cell->inline_contents.options = opt;
- cell->inline_contents.n_footnotes = 0;
+ cell->options = opt;
+ cell->n_footnotes = 0;
cell->destructor = NULL;
+ int style_idx = (opt & TAB_STYLE_MASK) >> TAB_STYLE_SHIFT;
+ const struct area_style *style = t->styles[style_idx];
+ if (style)
+ cell->style = style;
+ else
+ {
+ static const struct area_style styles[3][3] = {
+#define S(H,V) [H][V] = { AREA_STYLE_INITIALIZER__, \
+ .cell_style.halign = H, \
+ .cell_style.valign = V }
+ S(TABLE_HALIGN_LEFT, TABLE_VALIGN_TOP),
+ S(TABLE_HALIGN_LEFT, TABLE_VALIGN_CENTER),
+ S(TABLE_HALIGN_LEFT, TABLE_VALIGN_BOTTOM),
+ S(TABLE_HALIGN_CENTER, TABLE_VALIGN_TOP),
+ S(TABLE_HALIGN_CENTER, TABLE_VALIGN_CENTER),
+ S(TABLE_HALIGN_CENTER, TABLE_VALIGN_BOTTOM),
+ S(TABLE_HALIGN_RIGHT, TABLE_VALIGN_TOP),
+ S(TABLE_HALIGN_RIGHT, TABLE_VALIGN_CENTER),
+ S(TABLE_HALIGN_RIGHT, TABLE_VALIGN_BOTTOM),
+ };
+
+ enum table_halign halign
+ = ((opt & TAB_HALIGN) == TAB_LEFT ? TABLE_HALIGN_LEFT
+ : (opt & TAB_HALIGN) == TAB_CENTER ? TABLE_HALIGN_CENTER
+ : TABLE_HALIGN_RIGHT);
+ enum table_valign valign
+ = ((opt & TAB_VALIGN) == TAB_TOP ? TABLE_VALIGN_TOP
+ : (opt & TAB_VALIGN) == TAB_CENTER ? TABLE_VALIGN_CENTER
+ : TABLE_VALIGN_BOTTOM);
+
+ cell->style = &styles[halign][valign];
+ }
+
if (opt & TAB_JOIN)
{
const struct tab_joined_cell *jc = cc;
- cell->contents = &cell->inline_contents;
- cell->n_contents = 1;
- cell->inline_contents.text = jc->u.text;
+ cell->text = jc->u.text;
- cell->inline_contents.footnotes = jc->footnotes;
- cell->inline_contents.n_footnotes = jc->n_footnotes;
+ cell->footnotes = jc->footnotes;
+ cell->n_footnotes = jc->n_footnotes;
cell->d[TABLE_HORZ][0] = jc->d[TABLE_HORZ][0];
cell->d[TABLE_HORZ][1] = jc->d[TABLE_HORZ][1];
cell->d[TABLE_VERT][0] = jc->d[TABLE_VERT][0];
cell->d[TABLE_VERT][1] = jc->d[TABLE_VERT][1];
+
+ if (jc->style)
+ cell->style = jc->style;
}
else
{
cell->d[TABLE_HORZ][1] = x + 1;
cell->d[TABLE_VERT][0] = y;
cell->d[TABLE_VERT][1] = y + 1;
- if (cc != NULL)
- {
- cell->contents = &cell->inline_contents;
- cell->n_contents = 1;
- cell->inline_contents.text = CONST_CAST (char *, cc);
- }
- else
- {
- cell->contents = NULL;
- cell->n_contents = 0;
- }
+ cell->text = CONST_CAST (char *, cc ? cc : "");
}
-
- int style_idx = (opt & TAB_STYLE_MASK) >> TAB_STYLE_SHIFT;
- const struct cell_style *style = t->styles[style_idx];
- if (style)
- cell->style = style;
}
static int
-tab_get_rule (const struct table *table, enum table_axis axis, int x, int y)
+tab_get_rule (const struct table *table, enum table_axis axis, int x, int y,
+ struct cell_color *color)
{
const struct tab_table *t = tab_cast (table);
- return (axis == TABLE_VERT
- ? t->rh[x + t->cf * y] : t->rv[x + (t->cf + 1) * y]);
+ uint8_t raw = (axis == TABLE_VERT
+ ? t->rh[x + t->cf * y] : t->rv[x + (t->cf + 1) * y]);
+ struct cell_color *p = t->rule_colors[(raw & TAB_RULE_STYLE_MASK)
+ >> TAB_RULE_STYLE_SHIFT];
+ if (p)
+ *color = *p;
+ return (raw & TAB_RULE_TYPE_MASK) >> TAB_RULE_TYPE_SHIFT;
}
static const struct table_class tab_table_class = {