From 4e79e898c4b9d864a069a79b6221f95ba6189c5d Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Sat, 14 Nov 2009 19:23:58 +0000 Subject: Initial check-in of -man -Thtml \f support (needs testing). --- html.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) (limited to 'html.c') diff --git a/html.c b/html.c index 7833b9e5..741be084 100644 --- a/html.c +++ b/html.c @@ -91,7 +91,8 @@ extern int getsubopt(char **, char * const *, char **); static void print_spec(struct html *, const char *, size_t); static void print_res(struct html *, const char *, size_t); static void print_ctag(struct html *, enum htmltag); -static int print_encode(struct html *, const char *); +static int print_encode(struct html *, const char *, int); +static void print_metaf(struct html *, enum roffdeco); void * @@ -220,8 +221,40 @@ print_res(struct html *h, const char *p, size_t len) } +static void +print_metaf(struct html *h, enum roffdeco deco) +{ + const char *class; + struct htmlpair tag; + + switch (deco) { + case (DECO_BOLD): + class = "bold"; + break; + case (DECO_ITALIC): + class = "italic"; + break; + case (DECO_ROMAN): + class = "roman"; + break; + default: + abort(); + /* NOTREACHED */ + } + + if (h->metaf) { + assert(h->tags.head); + assert(h->metaf == h->tags.head); + print_tagq(h, h->metaf); + } + + PAIR_CLASS_INIT(&tag, class); + h->metaf = print_otag(h, TAG_SPAN, 1, &tag); +} + + static int -print_encode(struct html *h, const char *p) +print_encode(struct html *h, const char *p, int norecurse) { size_t sz; int len, nospace; @@ -259,6 +292,15 @@ print_encode(struct html *h, const char *p) case (DECO_SPECIAL): print_spec(h, seq, sz); break; + case (DECO_BOLD): + /* FALLTHROUGH */ + case (DECO_ITALIC): + /* FALLTHROUGH */ + case (DECO_ROMAN): + if (norecurse) + break; + print_metaf(h, deco); + break; default: break; } @@ -300,7 +342,7 @@ print_otag(struct html *h, enum htmltag tag, for (i = 0; i < sz; i++) { printf(" %s=\"", htmlattrs[p[i].key]); assert(p->val); - (void)print_encode(h, p[i].val); + (void)print_encode(h, p[i].val, 1); putchar('\"'); } putchar('>'); @@ -366,7 +408,7 @@ print_text(struct html *h, const char *p) putchar(' '); assert(p); - if ( ! print_encode(h, p)) + if ( ! print_encode(h, p, 0)) h->flags &= ~HTML_NOSPACE; if (*p && 0 == *(p + 1)) -- cgit