summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-11-14 19:23:58 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-11-14 19:23:58 +0000
commita067fc75956a25725c91bbfc0130ab038867c888 (patch)
tree5ca0d4cb37d49bf973c372a32fab6dec9cbfe90a
parent857e034db681b3005c938654ecbd7e973cc29908 (diff)
downloadmandoc-a067fc75956a25725c91bbfc0130ab038867c888.tar.gz
mandoc-a067fc75956a25725c91bbfc0130ab038867c888.tar.zst
mandoc-a067fc75956a25725c91bbfc0130ab038867c888.zip
Initial check-in of -man -Thtml \f support (needs testing).
-rw-r--r--html.c52
-rw-r--r--man_html.c10
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 <kristaps@kth.se>
*
@@ -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 <kristaps@kth.se>
*
@@ -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);