-/* $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 <kristaps@kth.se>
*
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 *
}
+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;
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;
}
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('>');
putchar(' ');
assert(p);
- if ( ! print_encode(h, p))
+ if ( ! print_encode(h, p, 0))
h->flags &= ~HTML_NOSPACE;
if (*p && 0 == *(p + 1))
-/* $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 <kristaps@kth.se>
*
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);