summaryrefslogtreecommitdiffstats
path: root/html.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2019-04-30 15:53:00 +0000
committerIngo Schwarze <schwarze@openbsd.org>2019-04-30 15:53:00 +0000
commitee0b68f80757c3f0a4e09e9fdbde02dcd76fa6e8 (patch)
tree53b86cbd806f99c0aaaaf8b1f6871705baedfb60 /html.c
parent43f9226f1dc68cb4e5298a723da0b838160b17ec (diff)
downloadmandoc-ee0b68f80757c3f0a4e09e9fdbde02dcd76fa6e8.tar.gz
In HTML output, allow switching the desired font for subsequent
text without printing an opening tag right away, and use that in the .ft request handler. While here, garbage collect redundant enum htmlfont and reduce code duplication in print_text(). Fixing an assertion failure reported by Michael <Stapelberg at Debian> in pmRegisterDerived(3) from libpcp3-dev.
Diffstat (limited to 'html.c')
-rw-r--r--html.c72
1 files changed, 25 insertions, 47 deletions
diff --git a/html.c b/html.c
index ea05c953..98f8b31e 100644
--- a/html.c
+++ b/html.c
@@ -120,6 +120,7 @@ static void print_ctag(struct html *, struct tag *);
static int print_escape(struct html *, char);
static int print_encode(struct html *, const char *, const char *, int);
static void print_href(struct html *, const char *, const char *, int);
+static void print_metaf(struct html *);
void *
@@ -222,55 +223,49 @@ print_gen_head(struct html *h)
print_tagq(h, t);
}
-void
-print_metaf(struct html *h, enum mandoc_esc deco)
+int
+html_setfont(struct html *h, enum mandoc_esc font)
{
- enum htmlfont font;
-
- switch (deco) {
+ switch (font) {
case ESCAPE_FONTPREV:
font = h->metal;
break;
case ESCAPE_FONTITALIC:
- font = HTMLFONT_ITALIC;
- break;
case ESCAPE_FONTBOLD:
- font = HTMLFONT_BOLD;
- break;
case ESCAPE_FONTBI:
- font = HTMLFONT_BI;
- break;
case ESCAPE_FONTCW:
- font = HTMLFONT_CW;
+ case ESCAPE_FONTROMAN:
break;
case ESCAPE_FONT:
- case ESCAPE_FONTROMAN:
- font = HTMLFONT_NONE;
+ font = ESCAPE_FONTROMAN;
break;
default:
- return;
+ return 0;
}
+ h->metal = h->metac;
+ h->metac = font;
+ return 1;
+}
+static void
+print_metaf(struct html *h)
+{
if (h->metaf) {
print_tagq(h, h->metaf);
h->metaf = NULL;
}
-
- h->metal = h->metac;
- h->metac = font;
-
- switch (font) {
- case HTMLFONT_ITALIC:
+ switch (h->metac) {
+ case ESCAPE_FONTITALIC:
h->metaf = print_otag(h, TAG_I, "");
break;
- case HTMLFONT_BOLD:
+ case ESCAPE_FONTBOLD:
h->metaf = print_otag(h, TAG_B, "");
break;
- case HTMLFONT_BI:
+ case ESCAPE_FONTBI:
h->metaf = print_otag(h, TAG_B, "");
print_otag(h, TAG_I, "");
break;
- case HTMLFONT_CW:
+ case ESCAPE_FONTCW:
h->metaf = print_otag(h, TAG_SPAN, "c", "Li");
break;
default:
@@ -479,7 +474,8 @@ print_encode(struct html *h, const char *p, const char *pend, int norecurse)
case ESCAPE_FONTROMAN:
if (0 == norecurse) {
h->flags |= HTML_NOSPACE;
- print_metaf(h, esc);
+ if (html_setfont(h, esc))
+ print_metaf(h);
h->flags &= ~HTML_NOSPACE;
}
continue;
@@ -806,27 +802,9 @@ print_text(struct html *h, const char *word)
print_word(h, "&#x00A0;");
}
- assert(NULL == h->metaf);
- switch (h->metac) {
- case HTMLFONT_ITALIC:
- h->metaf = print_otag(h, TAG_I, "");
- break;
- case HTMLFONT_BOLD:
- h->metaf = print_otag(h, TAG_B, "");
- break;
- case HTMLFONT_BI:
- h->metaf = print_otag(h, TAG_B, "");
- print_otag(h, TAG_I, "");
- break;
- case HTMLFONT_CW:
- h->metaf = print_otag(h, TAG_SPAN, "c", "Li");
- break;
- default:
- print_indent(h);
- break;
- }
-
- assert(word);
+ assert(h->metaf == NULL);
+ print_metaf(h);
+ print_indent(h);
if ( ! print_encode(h, word, NULL, 0)) {
if ( ! (h->flags & HTML_NONOSPACE))
h->flags &= ~HTML_NOSPACE;
@@ -834,7 +812,7 @@ print_text(struct html *h, const char *word)
} else
h->flags |= HTML_NOSPACE | HTML_NONEWLINE;
- if (h->metaf) {
+ if (h->metaf != NULL) {
print_tagq(h, h->metaf);
h->metaf = NULL;
}