summaryrefslogtreecommitdiffstats
path: root/html.c
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
commit4e79e898c4b9d864a069a79b6221f95ba6189c5d (patch)
treede3a06f849ee086066e8abc067e789b2dee0c398 /html.c
parentdfbca2422907323ba2f121dca984ffcfd5a15e19 (diff)
downloadmandoc-4e79e898c4b9d864a069a79b6221f95ba6189c5d.tar.gz
Initial check-in of -man -Thtml \f support (needs testing).
Diffstat (limited to 'html.c')
-rw-r--r--html.c50
1 files changed, 46 insertions, 4 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))