summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-11-16 06:07:49 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-11-16 06:07:49 +0000
commit77a404388af995dd280b4021ca59a652c5cc2982 (patch)
tree5c294dc314bbdbce7543cf410c128e32419e128f
parentc993702f3a8c4d976aa9848cef460bb753bde12a (diff)
downloadmandoc-77a404388af995dd280b4021ca59a652c5cc2982.tar.gz
Abstraction of -Thtml -man font setting (still experimental).
-rw-r--r--html.c51
-rw-r--r--html.h10
-rw-r--r--man_html.c31
3 files changed, 58 insertions, 34 deletions
diff --git a/html.c b/html.c
index e6409ffa..66421a8e 100644
--- a/html.c
+++ b/html.c
@@ -66,6 +66,12 @@ static const struct htmldata htmltags[TAG_MAX] = {
{"base", HTML_CLRLINE | HTML_NOSTACK}, /* TAG_BASE */
};
+static const char *const htmlfonts[HTMLFONT_MAX] = {
+ "roman",
+ "bold",
+ "italic"
+};
+
static const char *const htmlattrs[ATTR_MAX] = {
"http-equiv",
"content",
@@ -221,35 +227,49 @@ print_res(struct html *h, const char *p, size_t len)
}
+struct tag *
+print_ofont(struct html *h, enum htmlfont font)
+{
+ struct htmlpair tag;
+
+ h->metal = h->metac;
+ h->metac = font;
+
+ /* FIXME: DECO_ROMAN should just close out preexisting. */
+
+ if (h->metaf)
+ print_tagq(h, h->metaf);
+
+ PAIR_CLASS_INIT(&tag, htmlfonts[font]);
+ h->metaf = print_otag(h, TAG_SPAN, 1, &tag);
+ return(h->metaf);
+}
+
+
static void
print_metaf(struct html *h, enum roffdeco deco)
{
- const char *class;
- struct htmlpair tag;
+ enum htmlfont font;
switch (deco) {
- case (DECO_BOLD):
- class = "bold";
+ case (DECO_PREVIOUS):
+ font = h->metal;
break;
case (DECO_ITALIC):
- class = "italic";
+ font = HTMLFONT_ITALIC;
+ break;
+ case (DECO_BOLD):
+ font = HTMLFONT_BOLD;
break;
case (DECO_ROMAN):
- class = "roman";
+ font = HTMLFONT_NONE;
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);
+ (void)print_ofont(h, font);
}
@@ -292,6 +312,8 @@ print_encode(struct html *h, const char *p, int norecurse)
case (DECO_SPECIAL):
print_spec(h, seq, sz);
break;
+ case (DECO_PREVIOUS):
+ /* FALLTHROUGH */
case (DECO_BOLD):
/* FALLTHROUGH */
case (DECO_ITALIC):
@@ -352,7 +374,6 @@ print_otag(struct html *h, enum htmltag tag,
}
-/* ARGSUSED */
static void
print_ctag(struct html *h, enum htmltag tag)
{
diff --git a/html.h b/html.h
index 31ce8130..7c401de6 100644
--- a/html.h
+++ b/html.h
@@ -62,6 +62,13 @@ enum htmlattr {
ATTR_MAX
};
+enum htmlfont {
+ HTMLFONT_NONE = 0,
+ HTMLFONT_BOLD,
+ HTMLFONT_ITALIC,
+ HTMLFONT_MAX
+};
+
struct tag {
struct tag *next;
enum htmltag tag;
@@ -112,12 +119,15 @@ struct html {
char buf[BUFSIZ];
size_t buflen;
struct tag *metaf;
+ enum htmlfont metal;
+ enum htmlfont metac;
};
struct roffsu;
void print_gen_doctype(struct html *);
void print_gen_head(struct html *);
+struct tag *print_ofont(struct html *, enum htmlfont);
struct tag *print_otag(struct html *, enum htmltag,
int, const struct htmlpair *);
void print_tagq(struct html *, const struct tag *);
diff --git a/man_html.c b/man_html.c
index 4f55dec5..3c53726a 100644
--- a/man_html.c
+++ b/man_html.c
@@ -395,31 +395,27 @@ man_alt_pre(MAN_ARGS)
const struct man_node *nn;
struct tag *t;
int i;
- struct htmlpair tagi, tagb, tagr, *tagp;
-
- PAIR_CLASS_INIT(&tagi, "italic");
- PAIR_CLASS_INIT(&tagb, "bold");
- PAIR_CLASS_INIT(&tagr, "roman");
+ enum htmlfont fp;
for (i = 0, nn = n->child; nn; nn = nn->next, i++) {
switch (n->tok) {
case (MAN_BI):
- tagp = i % 2 ? &tagi : &tagb;
+ fp = i % 2 ? HTMLFONT_ITALIC : HTMLFONT_BOLD;
break;
case (MAN_IB):
- tagp = i % 2 ? &tagb : &tagi;
+ fp = i % 2 ? HTMLFONT_BOLD : HTMLFONT_ITALIC;
break;
case (MAN_RI):
- tagp = i % 2 ? &tagi : &tagr;
+ fp = i % 2 ? HTMLFONT_ITALIC : HTMLFONT_NONE;
break;
case (MAN_IR):
- tagp = i % 2 ? &tagr : &tagi;
+ fp = i % 2 ? HTMLFONT_NONE : HTMLFONT_ITALIC;
break;
case (MAN_BR):
- tagp = i % 2 ? &tagr : &tagb;
+ fp = i % 2 ? HTMLFONT_NONE : HTMLFONT_BOLD;
break;
case (MAN_RB):
- tagp = i % 2 ? &tagb : &tagr;
+ fp = i % 2 ? HTMLFONT_BOLD : HTMLFONT_NONE;
break;
default:
abort();
@@ -429,7 +425,7 @@ man_alt_pre(MAN_ARGS)
if (i)
h->flags |= HTML_NOSPACE;
- t = print_otag(h, TAG_SPAN, 1, tagp);
+ t = print_ofont(h, fp);
print_man_node(m, nn, h);
print_tagq(h, t);
}
@@ -444,6 +440,7 @@ man_SB_pre(MAN_ARGS)
{
struct htmlpair tag;
+ /* FIXME: print_ofont(). */
PAIR_CLASS_INIT(&tag, "small bold");
print_otag(h, TAG_SPAN, 1, &tag);
return(1);
@@ -657,10 +654,8 @@ man_HP_pre(MAN_ARGS)
static int
man_B_pre(MAN_ARGS)
{
- struct htmlpair tag;
- PAIR_CLASS_INIT(&tag, "bold");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_ofont(h, HTMLFONT_BOLD);
return(1);
}
@@ -669,10 +664,8 @@ man_B_pre(MAN_ARGS)
static int
man_I_pre(MAN_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "italic");
- print_otag(h, TAG_SPAN, 1, &tag);
+
+ print_ofont(h, HTMLFONT_ITALIC);
return(1);
}