summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorschwarze <schwarze@openbsd.org>2019-04-30 15:52:42 +0000
committerschwarze <schwarze@openbsd.org>2019-04-30 15:52:42 +0000
commitcefe897421c083ac43eb7ff12a99198529abd174 (patch)
tree965395f7aa67d55f325864dfefe624c390eddbf4
parenttc_setclock: always call tc_windup() before leaving windup_mtx. (diff)
downloadwireguard-openbsd-cefe897421c083ac43eb7ff12a99198529abd174.tar.xz
wireguard-openbsd-cefe897421c083ac43eb7ff12a99198529abd174.zip
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.
-rw-r--r--regress/usr.bin/mandoc/roff/ft/badargs.out_html9
-rw-r--r--usr.bin/mandoc/html.c74
-rw-r--r--usr.bin/mandoc/html.h17
-rw-r--r--usr.bin/mandoc/man_html.c6
-rw-r--r--usr.bin/mandoc/roff_html.c4
5 files changed, 39 insertions, 71 deletions
diff --git a/regress/usr.bin/mandoc/roff/ft/badargs.out_html b/regress/usr.bin/mandoc/roff/ft/badargs.out_html
index 5d98e9883a6..0fa4a816460 100644
--- a/regress/usr.bin/mandoc/roff/ft/badargs.out_html
+++ b/regress/usr.bin/mandoc/roff/ft/badargs.out_html
@@ -1,9 +1,8 @@
BEGINTEST
<br/>
-default font <i></i><i>italic</i> <b><i></i></b><b><i>bold italic</i></b>
- <span class="Li"></span><span class="Li">typeqriter</span>
- <span class="Li"></span> <span class="Li">roman</span> <b></b><b>bold</b>
- <i></i> <i>italic</i> <b></b><b>bold</b> <b>still bold</b>
- <i></i><i>italic</i> <i></i><i>back to bold</i> <i></i><i>back to italic</i>
+default font <i>italic</i> <b><i>bold italic</i></b>
+ <span class="Li">typeqriter</span> <span class="Li">roman</span> <b>bold</b>
+ <i>italic</i> <b>bold</b> <b>still bold</b> <i>italic</i> <i>back to bold</i>
+ <i>back to italic</i>
<br/>
ENDTEST
diff --git a/usr.bin/mandoc/html.c b/usr.bin/mandoc/html.c
index 1d2e308a55b..b6c1ce12587 100644
--- a/usr.bin/mandoc/html.c
+++ b/usr.bin/mandoc/html.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: html.c,v 1.124 2019/03/03 13:01:47 schwarze Exp $ */
+/* $OpenBSD: html.c,v 1.125 2019/04/30 15:52:42 schwarze Exp $ */
/*
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -118,6 +118,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 *
@@ -220,55 +221,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:
@@ -477,7 +472,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;
@@ -804,27 +800,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;
@@ -832,7 +810,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;
}
diff --git a/usr.bin/mandoc/html.h b/usr.bin/mandoc/html.h
index 253a2423523..71bcf3b5b03 100644
--- a/usr.bin/mandoc/html.h
+++ b/usr.bin/mandoc/html.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: html.h,v 1.64 2019/03/01 10:48:58 schwarze Exp $ */
+/* $OpenBSD: html.h,v 1.65 2019/04/30 15:52:42 schwarze Exp $ */
/*
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2017, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -69,15 +69,6 @@ enum htmltag {
TAG_MAX
};
-enum htmlfont {
- HTMLFONT_NONE = 0,
- HTMLFONT_BOLD,
- HTMLFONT_ITALIC,
- HTMLFONT_BI,
- HTMLFONT_CW,
- HTMLFONT_MAX
-};
-
struct tag {
struct tag *next;
int refcnt;
@@ -111,8 +102,8 @@ struct html {
char *base_includes; /* base for include href */
char *style; /* style-sheet URI */
struct tag *metaf; /* current open font scope */
- enum htmlfont metal; /* last used font */
- enum htmlfont metac; /* current font mode */
+ enum mandoc_esc metal; /* last used font */
+ enum mandoc_esc metac; /* current font mode */
int oflags; /* output options */
#define HTML_FRAGMENT (1 << 0) /* don't emit HTML/HEAD/BODY */
#define HTML_TOC (1 << 1) /* emit a table of contents */
@@ -128,7 +119,6 @@ void roff_html_pre(struct html *, const struct roff_node *);
void print_gen_comment(struct html *, struct roff_node *);
void print_gen_decls(struct html *);
void print_gen_head(struct html *);
-void print_metaf(struct html *, enum mandoc_esc);
struct tag *print_otag(struct html *, enum htmltag, const char *, ...);
void print_tagq(struct html *, const struct tag *);
void print_stagq(struct html *, const struct tag *);
@@ -141,3 +131,4 @@ void print_endline(struct html *);
void html_close_paragraph(struct html *);
enum roff_tok html_fillmode(struct html *, enum roff_tok);
char *html_make_id(const struct roff_node *, int);
+int html_setfont(struct html *, enum mandoc_esc);
diff --git a/usr.bin/mandoc/man_html.c b/usr.bin/mandoc/man_html.c
index 7ce331ecb7e..5c51897edd5 100644
--- a/usr.bin/mandoc/man_html.c
+++ b/usr.bin/mandoc/man_html.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: man_html.c,v 1.126 2019/03/02 16:29:49 schwarze Exp $ */
+/* $OpenBSD: man_html.c,v 1.127 2019/04/30 15:52:42 schwarze Exp $ */
/*
* Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2013-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -201,9 +201,9 @@ print_man_node(MAN_ARGS)
* Close out scope of font prior to opening a macro
* scope.
*/
- if (HTMLFONT_NONE != h->metac) {
+ if (h->metac != ESCAPE_FONTROMAN) {
h->metal = h->metac;
- h->metac = HTMLFONT_NONE;
+ h->metac = ESCAPE_FONTROMAN;
}
/*
diff --git a/usr.bin/mandoc/roff_html.c b/usr.bin/mandoc/roff_html.c
index f2f7258245b..ed9639a3aeb 100644
--- a/usr.bin/mandoc/roff_html.c
+++ b/usr.bin/mandoc/roff_html.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: roff_html.c,v 1.19 2019/01/07 06:51:37 schwarze Exp $ */
+/* $OpenBSD: roff_html.c,v 1.20 2019/04/30 15:52:42 schwarze Exp $ */
/*
* Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2014, 2017, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -94,7 +94,7 @@ roff_html_pre_ft(ROFF_HTML_ARGS)
const char *cp;
cp = n->child->string;
- print_metaf(h, mandoc_font(cp, (int)strlen(cp)));
+ html_setfont(h, mandoc_font(cp, (int)strlen(cp)));
}
static void