diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2018-11-25 19:24:20 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2018-11-25 19:24:20 +0000 |
commit | 059731525cc9a54258e9e3b825e28777a212ff15 (patch) | |
tree | 30d57f784c3cfd5db5e6193905cb1ac682176943 /tbl_html.c | |
parent | 146de3f75b3f64ddd06ababf395811b3abbb2fb3 (diff) | |
download | mandoc-059731525cc9a54258e9e3b825e28777a212ff15.tar.gz |
In tbl(7) -T html output,
span cells horizontally and vertically as requested by the layout.
Does not handle spans requested in the data section yet.
To be able to do this, record the number of rows spanned
in the first data cell (struct tbl_dat) of a vertical span.
Missing feature reported by Pali dot Rohar at gmail dot com.
Diffstat (limited to 'tbl_html.c')
-rw-r--r-- | tbl_html.c | 55 |
1 files changed, 39 insertions, 16 deletions
@@ -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; } |