summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--html.c50
-rw-r--r--man_html.c8
2 files changed, 51 insertions, 7 deletions
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))
diff --git a/man_html.c b/man_html.c
index 31c990de..2bf7184b 100644
--- a/man_html.c
+++ b/man_html.c
@@ -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);