diff options
author | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2018-12-15 23:33:21 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2018-12-15 23:33:21 +0000 |
commit | c435f684013b13f8286956412bb611ffe3ab5c0a (patch) | |
tree | 1333fd954431797accba4c6eef9be77dbb045771 /usr.bin/mandoc | |
parent | 3962ec0010304a43d14512a8b79da75485655694 (diff) |
Yet another round of improvements to manual font selection.
Unify handling of \f and .ft.
Support \f4 (bold+italic).
Support ".ft BI" and ".ft CW" for terminal output.
Support the .ft request in HTML output.
Reject the bogus fonts \f(C1, \f(C2, \f(C3, and \f(CP.
Diffstat (limited to 'usr.bin/mandoc')
-rw-r--r-- | usr.bin/mandoc/html.c | 7 | ||||
-rw-r--r-- | usr.bin/mandoc/html.h | 3 | ||||
-rw-r--r-- | usr.bin/mandoc/man_html.c | 3 | ||||
-rw-r--r-- | usr.bin/mandoc/mandoc.c | 97 | ||||
-rw-r--r-- | usr.bin/mandoc/mandoc.h | 3 | ||||
-rw-r--r-- | usr.bin/mandoc/mdoc_html.c | 3 | ||||
-rw-r--r-- | usr.bin/mandoc/roff_html.c | 18 | ||||
-rw-r--r-- | usr.bin/mandoc/roff_term.c | 26 | ||||
-rw-r--r-- | usr.bin/mandoc/roff_validate.c | 28 | ||||
-rw-r--r-- | usr.bin/mandoc/tbl_html.c | 3 |
10 files changed, 98 insertions, 93 deletions
diff --git a/usr.bin/mandoc/html.c b/usr.bin/mandoc/html.c index 9c93eb64e55..a2783f1ef34 100644 --- a/usr.bin/mandoc/html.c +++ b/usr.bin/mandoc/html.c @@ -1,4 +1,4 @@ -/* $OpenBSD: html.c,v 1.116 2018/12/15 19:30:19 schwarze Exp $ */ +/* $OpenBSD: html.c,v 1.117 2018/12/15 23:33:20 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2011-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> @@ -115,7 +115,6 @@ 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 *, enum mandoc_esc); void * @@ -208,7 +207,7 @@ print_gen_head(struct html *h) print_tagq(h, t); } -static void +void print_metaf(struct html *h, enum mandoc_esc deco) { enum htmlfont font; @@ -234,7 +233,7 @@ print_metaf(struct html *h, enum mandoc_esc deco) font = HTMLFONT_NONE; break; default: - abort(); + return; } if (h->metaf) { diff --git a/usr.bin/mandoc/html.h b/usr.bin/mandoc/html.h index 5604507e118..b16f973a918 100644 --- a/usr.bin/mandoc/html.h +++ b/usr.bin/mandoc/html.h @@ -1,4 +1,4 @@ -/* $OpenBSD: html.h,v 1.57 2018/10/25 01:21:30 schwarze Exp $ */ +/* $OpenBSD: html.h,v 1.58 2018/12/15 23:33:20 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> @@ -125,6 +125,7 @@ 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 *); diff --git a/usr.bin/mandoc/man_html.c b/usr.bin/mandoc/man_html.c index 2d8fe40de4d..a420656083d 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.112 2018/12/13 11:55:14 schwarze Exp $ */ +/* $OpenBSD: man_html.c,v 1.113 2018/12/15 23:33:20 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2013,2014,2015,2017,2018 Ingo Schwarze <schwarze@openbsd.org> @@ -24,6 +24,7 @@ #include <string.h> #include "mandoc_aux.h" +#include "mandoc.h" #include "roff.h" #include "man.h" #include "out.h" diff --git a/usr.bin/mandoc/mandoc.c b/usr.bin/mandoc/mandoc.c index f4249a4b78f..24c4a8823b3 100644 --- a/usr.bin/mandoc/mandoc.c +++ b/usr.bin/mandoc/mandoc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mandoc.c,v 1.79 2018/12/15 19:30:19 schwarze Exp $ */ +/* $OpenBSD: mandoc.c,v 1.80 2018/12/15 23:33:20 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2011-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> @@ -36,6 +36,59 @@ static char *time2a(time_t); enum mandoc_esc +mandoc_font(const char *cp, int sz) +{ + switch (sz) { + case 0: + return ESCAPE_FONTPREV; + case 1: + switch (cp[0]) { + case 'B': + case '3': + return ESCAPE_FONTBOLD; + case 'I': + case '2': + return ESCAPE_FONTITALIC; + case 'P': + return ESCAPE_FONTPREV; + case 'R': + case '1': + return ESCAPE_FONTROMAN; + case '4': + return ESCAPE_FONTBI; + default: + return ESCAPE_ERROR; + } + case 2: + switch (cp[0]) { + case 'B': + switch (cp[1]) { + case 'I': + return ESCAPE_FONTBI; + default: + return ESCAPE_ERROR; + } + case 'C': + switch (cp[1]) { + case 'B': + return ESCAPE_FONTBOLD; + case 'I': + return ESCAPE_FONTITALIC; + case 'R': + case 'W': + return ESCAPE_FONTCW; + default: + return ESCAPE_ERROR; + } + default: + return ESCAPE_ERROR; + } + default: + return ESCAPE_ERROR; + } +} + +enum mandoc_esc mandoc_escape(const char **end, const char **start, int *sz) { const char *local_start; @@ -365,47 +418,7 @@ mandoc_escape(const char **end, const char **start, int *sz) switch (gly) { case ESCAPE_FONT: - if (*sz == 2) { - if (**start == 'C') { - if ((*start)[1] == 'W' || - (*start)[1] == 'R') { - gly = ESCAPE_FONTCW; - break; - } - /* - * Treat other constant-width font modes - * just like regular font modes. - */ - (*start)++; - (*sz)--; - } else { - if ((*start)[0] == 'B' && (*start)[1] == 'I') - gly = ESCAPE_FONTBI; - break; - } - } else if (*sz != 1) { - if (*sz == 0) - gly = ESCAPE_FONTPREV; - break; - } - - switch (**start) { - case '3': - case 'B': - gly = ESCAPE_FONTBOLD; - break; - case '2': - case 'I': - gly = ESCAPE_FONTITALIC; - break; - case 'P': - gly = ESCAPE_FONTPREV; - break; - case '1': - case 'R': - gly = ESCAPE_FONTROMAN; - break; - } + gly = mandoc_font(*start, *sz); break; case ESCAPE_SPECIAL: if (**start == 'c') { diff --git a/usr.bin/mandoc/mandoc.h b/usr.bin/mandoc/mandoc.h index 2e4a9dc0317..835ee2c95e2 100644 --- a/usr.bin/mandoc/mandoc.h +++ b/usr.bin/mandoc/mandoc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mandoc.h,v 1.203 2018/12/15 19:30:19 schwarze Exp $ */ +/* $OpenBSD: mandoc.h,v 1.204 2018/12/15 23:33:20 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2012-2018 Ingo Schwarze <schwarze@openbsd.org> @@ -270,6 +270,7 @@ enum mandoc_esc { }; +enum mandoc_esc mandoc_font(const char *, int sz); enum mandoc_esc mandoc_escape(const char **, const char **, int *); void mandoc_msg_setoutfile(FILE *); const char *mandoc_msg_getinfilename(void); diff --git a/usr.bin/mandoc/mdoc_html.c b/usr.bin/mandoc/mdoc_html.c index 2c2d0c0842a..598a5020bf6 100644 --- a/usr.bin/mandoc/mdoc_html.c +++ b/usr.bin/mandoc/mdoc_html.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mdoc_html.c,v 1.192 2018/12/13 11:55:14 schwarze Exp $ */ +/* $OpenBSD: mdoc_html.c,v 1.193 2018/12/15 23:33:20 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2014,2015,2016,2017,2018 Ingo Schwarze <schwarze@openbsd.org> @@ -25,6 +25,7 @@ #include <unistd.h> #include "mandoc_aux.h" +#include "mandoc.h" #include "roff.h" #include "mdoc.h" #include "out.h" diff --git a/usr.bin/mandoc/roff_html.c b/usr.bin/mandoc/roff_html.c index cf3e198af15..9cf1c3b1b71 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.14 2018/12/13 11:55:14 schwarze Exp $ */ +/* $OpenBSD: roff_html.c,v 1.15 2018/12/15 23:33:20 schwarze Exp $ */ /* * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2014, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> @@ -18,8 +18,10 @@ #include <sys/types.h> #include <assert.h> -#include <stddef.h> +#include <stdio.h> +#include <string.h> +#include "mandoc.h" #include "roff.h" #include "out.h" #include "html.h" @@ -30,12 +32,13 @@ typedef void (*roff_html_pre_fp)(ROFF_HTML_ARGS); static void roff_html_pre_br(ROFF_HTML_ARGS); static void roff_html_pre_ce(ROFF_HTML_ARGS); +static void roff_html_pre_ft(ROFF_HTML_ARGS); static void roff_html_pre_sp(ROFF_HTML_ARGS); static const roff_html_pre_fp roff_html_pre_acts[ROFF_MAX] = { roff_html_pre_br, /* br */ roff_html_pre_ce, /* ce */ - NULL, /* ft */ + roff_html_pre_ft, /* ft */ NULL, /* ll */ NULL, /* mc */ NULL, /* po */ @@ -75,6 +78,15 @@ roff_html_pre_ce(ROFF_HTML_ARGS) } static void +roff_html_pre_ft(ROFF_HTML_ARGS) +{ + const char *cp; + + cp = n->child->string; + print_metaf(h, mandoc_font(cp, (int)strlen(cp))); +} + +static void roff_html_pre_sp(ROFF_HTML_ARGS) { print_paragraph(h); diff --git a/usr.bin/mandoc/roff_term.c b/usr.bin/mandoc/roff_term.c index 747fe591f69..80e6b90a885 100644 --- a/usr.bin/mandoc/roff_term.c +++ b/usr.bin/mandoc/roff_term.c @@ -1,4 +1,4 @@ -/* $OpenBSD: roff_term.c,v 1.16 2018/12/14 01:17:46 schwarze Exp $ */ +/* $OpenBSD: roff_term.c,v 1.17 2018/12/15 23:33:20 schwarze Exp $ */ /* * Copyright (c) 2010,2014,2015,2017,2018 Ingo Schwarze <schwarze@openbsd.org> * @@ -18,6 +18,7 @@ #include <assert.h> #include <stdio.h> +#include <string.h> #include "mandoc.h" #include "roff.h" @@ -113,25 +114,22 @@ roff_term_pre_ft(ROFF_TERM_ARGS) { const char *cp; - if (*(cp = n->child->string) == 'C') - cp++; - - switch (*cp) { - case '4': - case '3': - case 'B': + cp = n->child->string; + switch (mandoc_font(cp, (int)strlen(cp))) { + case ESCAPE_FONTBOLD: term_fontrepl(p, TERMFONT_BOLD); break; - case '2': - case 'I': + case ESCAPE_FONTITALIC: term_fontrepl(p, TERMFONT_UNDER); break; - case 'P': + case ESCAPE_FONTBI: + term_fontrepl(p, TERMFONT_BI); + break; + case ESCAPE_FONTPREV: term_fontlast(p); break; - case '1': - case 'C': - case 'R': + case ESCAPE_FONTROMAN: + case ESCAPE_FONTCW: term_fontrepl(p, TERMFONT_NONE); break; default: diff --git a/usr.bin/mandoc/roff_validate.c b/usr.bin/mandoc/roff_validate.c index d9b17b5f5f3..839d42c7ed9 100644 --- a/usr.bin/mandoc/roff_validate.c +++ b/usr.bin/mandoc/roff_validate.c @@ -1,4 +1,4 @@ -/* $OpenBSD: roff_validate.c,v 1.14 2018/12/14 05:17:45 schwarze Exp $ */ +/* $OpenBSD: roff_validate.c,v 1.15 2018/12/15 23:33:20 schwarze Exp $ */ /* * Copyright (c) 2010, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> * @@ -104,30 +104,8 @@ roff_valid_ft(ROFF_VALID_ARGS) } cp = n->child->string; - switch (*cp) { - case '1': - case '2': - case '3': - case '4': - case 'I': - case 'P': - case 'R': - if (cp[1] == '\0') - return; - break; - case 'B': - if (cp[1] == '\0' || (cp[1] == 'I' && cp[2] == '\0')) - return; - break; - case 'C': - if (cp[1] != '\0' && cp[2] == '\0' && - strchr("BIRW", cp[1]) != NULL) - return; - break; - default: - break; - } - + if (mandoc_font(cp, (int)strlen(cp)) != ESCAPE_ERROR) + return; mandoc_msg(MANDOCERR_FT_BAD, n->line, n->pos, "ft %s", cp); roff_node_delete(man, n); } diff --git a/usr.bin/mandoc/tbl_html.c b/usr.bin/mandoc/tbl_html.c index 6bfe462aea3..a4a448ef42e 100644 --- a/usr.bin/mandoc/tbl_html.c +++ b/usr.bin/mandoc/tbl_html.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tbl_html.c,v 1.25 2018/12/12 21:54:30 schwarze Exp $ */ +/* $OpenBSD: tbl_html.c,v 1.26 2018/12/15 23:33:20 schwarze Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2014, 2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> @@ -22,6 +22,7 @@ #include <stdlib.h> #include <string.h> +#include "mandoc.h" #include "tbl.h" #include "out.h" #include "html.h" |