From a067fc75956a25725c91bbfc0130ab038867c888 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 | 52 +++++++++++++++++++++++++++++++++++++++++++++++----- man_html.c | 10 ++++++---- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/html.c b/html.c index 887c7de4..33345731 100644 --- a/html.c +++ b/html.c @@ -1,4 +1,4 @@ -/* $Id: html.c,v 1.87 2009/11/14 12:04:59 kristaps Exp $ */ +/* $Id: html.c,v 1.88 2009/11/14 19:23:58 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -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)) diff --git a/man_html.c b/man_html.c index df0527e3..47726a32 100644 --- a/man_html.c +++ b/man_html.c @@ -1,4 +1,4 @@ -/* $Id: man_html.c,v 1.19 2009/11/14 11:58:36 kristaps Exp $ */ +/* $Id: man_html.c,v 1.20 2009/11/14 19:23:58 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -190,14 +190,16 @@ print_man_node(MAN_ARGS) print_text(h, n->string); return; default: + if (h->metaf) { + assert(h->metaf == t); + print_tagq(h, h->metaf); + t = h->tags.head; + } if (mans[n->tok].pre) child = (*mans[n->tok].pre)(m, n, h); break; } - if (child && n->child) - print_man_nodelist(m, n->child, h); - print_stagq(h, t); bufinit(h); -- cgit v1.2.3-56-ge451