aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tbl_html.c
diff options
context:
space:
mode:
Diffstat (limited to 'tbl_html.c')
-rw-r--r--tbl_html.c57
1 files changed, 40 insertions, 17 deletions
diff --git a/tbl_html.c b/tbl_html.c
index 1080ffdf..b6090038 100644
--- a/tbl_html.c
+++ b/tbl_html.c
@@ -1,4 +1,4 @@
-/* $Id: tbl_html.c,v 1.25 2018/11/24 23:03:18 schwarze Exp $ */
+/* $Id: tbl_html.c,v 1.26 2018/11/25 19:24:20 schwarze Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2014, 2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -101,10 +101,10 @@ print_tblclose(struct html *h)
void
print_tbl(struct html *h, const struct tbl_span *sp)
{
- const struct tbl_dat *dp;
- struct tag *tt;
- const char *halign, *valign;
- int ic;
+ const struct tbl_dat *dp;
+ struct tag *tt;
+ const char *hspans, *vspans, *halign, *valign;
+ char hbuf[4], vbuf[4];
/* Inhibit printing of spaces: we do padding ourselves. */
@@ -124,13 +124,31 @@ print_tbl(struct html *h, const struct tbl_span *sp)
print_otag(h, TAG_TD, "?", "colspan", "0");
break;
default:
- dp = sp->first;
- for (ic = 0; ic < sp->opts->cols; ic++) {
+ for (dp = sp->first; dp != NULL; dp = dp->next) {
print_stagq(h, tt);
- if (dp == NULL || dp->layout->col > ic) {
- print_otag(h, TAG_TD, "");
+ switch (dp->layout->pos) {
+ case TBL_CELL_SPAN:
+ case TBL_CELL_DOWN:
continue;
+ default:
+ break;
}
+
+ /* Determine the attribute values. */
+
+ if (dp->hspans > 0) {
+ (void)snprintf(hbuf, sizeof(hbuf),
+ "%d", dp->hspans + 1);
+ hspans = hbuf;
+ } else
+ hspans = NULL;
+ if (dp->vspans > 0) {
+ (void)snprintf(vbuf, sizeof(vbuf),
+ "%d", dp->vspans + 1);
+ vspans = vbuf;
+ } else
+ vspans = NULL;
+
switch (dp->layout->pos) {
case TBL_CELL_CENTRE:
halign = "center";
@@ -149,22 +167,27 @@ print_tbl(struct html *h, const struct tbl_span *sp)
valign = "bottom";
else
valign = NULL;
+
+ /* Print the element and the attributes. */
+
if (halign == NULL && valign == NULL)
- print_otag(h, TAG_TD, "");
+ print_otag(h, TAG_TD, "??",
+ "colspan", hspans, "rowspan", vspans);
else if (halign == NULL)
- print_otag(h, TAG_TD, "s",
+ print_otag(h, TAG_TD, "??s",
+ "colspan", hspans, "rowspan", vspans,
"vertical-align", valign);
else if (valign == NULL)
- print_otag(h, TAG_TD, "s",
+ print_otag(h, TAG_TD, "??s",
+ "colspan", hspans, "rowspan", vspans,
"text-align", halign);
else
- print_otag(h, TAG_TD, "ss",
+ print_otag(h, TAG_TD, "??ss",
+ "colspan", hspans, "rowspan", vspans,
"vertical-align", valign,
"text-align", halign);
- if (dp->layout->pos != TBL_CELL_DOWN)
- if (dp->string != NULL)
- print_text(h, dp->string);
- dp = dp->next;
+ if (dp->string != NULL)
+ print_text(h, dp->string);
}
break;
}