summaryrefslogtreecommitdiffstats
path: root/tbl_html.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-01-06 11:55:39 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-01-06 11:55:39 +0000
commitac00b428a91101164418d879838de2fb4d1580bf (patch)
tree4dad3b0b655ce79661bae0446b482f9bfdaf458f /tbl_html.c
parent0917e72e203afc38813a7b83aa30365306e263da (diff)
downloadmandoc-ac00b428a91101164418d879838de2fb4d1580bf.tar.gz
Make -T[x]html for tables structure cells with a width. I don't
anticipate doing much more than this for the coming release. Also, remove "base" part of struct html (not used anywhere) and put some comments in struct html.h.
Diffstat (limited to 'tbl_html.c')
-rw-r--r--tbl_html.c49
1 files changed, 48 insertions, 1 deletions
diff --git a/tbl_html.c b/tbl_html.c
index e67fa862..24e93bf2 100644
--- a/tbl_html.c
+++ b/tbl_html.c
@@ -27,6 +27,25 @@
#include "out.h"
#include "html.h"
+static size_t html_tbl_len(size_t, void *);
+static size_t html_tbl_strlen(const char *, void *);
+
+/* ARGSUSED */
+static size_t
+html_tbl_len(size_t sz, void *arg)
+{
+
+ return(sz);
+}
+
+/* ARGSUSED */
+static size_t
+html_tbl_strlen(const char *p, void *arg)
+{
+
+ return(strlen(p));
+}
+
void
print_tbl(struct html *h, const struct tbl_span *sp)
{
@@ -34,6 +53,8 @@ print_tbl(struct html *h, const struct tbl_span *sp)
const struct tbl_dat *dp;
struct tag *tt;
struct htmlpair tag;
+ struct roffsu su;
+ struct roffcol *col;
switch (sp->pos) {
case (TBL_SPAN_HORIZ):
@@ -49,6 +70,14 @@ print_tbl(struct html *h, const struct tbl_span *sp)
h->flags |= HTML_NONOSPACE;
h->flags |= HTML_NOSPACE;
+ /* First pass: calculate widths. */
+
+ if (TBL_SPAN_FIRST & sp->flags) {
+ h->tbl.len = html_tbl_len;
+ h->tbl.slen = html_tbl_strlen;
+ tblcalc(&h->tbl, sp);
+ }
+
PAIR_CLASS_INIT(&tag, "tbl");
print_otag(h, TAG_TABLE, 1, &tag);
@@ -64,7 +93,17 @@ print_tbl(struct html *h, const struct tbl_span *sp)
case (TBL_HEAD_DATA):
break;
}
- tt = print_otag(h, TAG_TD, 0, NULL);
+
+ /*
+ * For the time being, use the simplest possible table
+ * styling: setting the widths of data columns.
+ */
+
+ col = &h->tbl.cols[hp->ident];
+ SCALE_HS_INIT(&su, col->width);
+ bufcat_su(h, "width", &su);
+ PAIR_STYLE_INIT(&tag, h);
+ tt = print_otag(h, TAG_TD, 1, &tag);
if (dp) {
if (dp->string)
print_text(h, dp->string);
@@ -73,4 +112,12 @@ print_tbl(struct html *h, const struct tbl_span *sp)
print_tagq(h, tt);
}
h->flags &= ~HTML_NONOSPACE;
+
+ /* Close out column specifiers on the last span. */
+
+ if (TBL_SPAN_LAST & sp->flags) {
+ assert(h->tbl.cols);
+ free(h->tbl.cols);
+ h->tbl.cols = NULL;
+ }
}