=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_term.c,v retrieving revision 1.277 retrieving revision 1.278 diff -c -r1.277 -r1.278 *** src/usr.bin/mandoc/mdoc_term.c 2020/02/27 21:38:27 1.277 --- src/usr.bin/mandoc/mdoc_term.c 2020/03/13 00:31:05 1.278 *************** *** 1,7 **** ! /* $OpenBSD: mdoc_term.c,v 1.277 2020/02/27 21:38:27 schwarze Exp $ */ /* - * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2012-2020 Ingo Schwarze * Copyright (c) 2013 Franco Fichtner * * Permission to use, copy, modify, and distribute this software for any --- 1,7 ---- ! /* $OpenBSD: mdoc_term.c,v 1.278 2020/03/13 00:31:05 schwarze Exp $ */ /* * Copyright (c) 2010, 2012-2020 Ingo Schwarze + * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2013 Franco Fichtner * * Permission to use, copy, modify, and distribute this software for any *************** *** 15,20 **** --- 15,23 ---- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Plain text formatter for mdoc(7), used by mandoc(1) + * for ASCII, UTF-8, PostScript, and PDF output. */ #include *************** *** 31,37 **** #include "mdoc.h" #include "out.h" #include "term.h" ! #include "tag.h" #include "main.h" struct termpair { --- 34,40 ---- #include "mdoc.h" #include "out.h" #include "term.h" ! #include "term_tag.h" #include "main.h" struct termpair { *************** *** 87,97 **** static int termp_bk_pre(DECL_ARGS); static int termp_bl_pre(DECL_ARGS); static int termp_bold_pre(DECL_ARGS); - static int termp_cd_pre(DECL_ARGS); static int termp_d1_pre(DECL_ARGS); static int termp_eo_pre(DECL_ARGS); - static int termp_em_pre(DECL_ARGS); - static int termp_er_pre(DECL_ARGS); static int termp_ex_pre(DECL_ARGS); static int termp_fa_pre(DECL_ARGS); static int termp_fd_pre(DECL_ARGS); --- 90,97 ---- *************** *** 113,120 **** static int termp_sm_pre(DECL_ARGS); static int termp_pp_pre(DECL_ARGS); static int termp_ss_pre(DECL_ARGS); - static int termp_sy_pre(DECL_ARGS); - static int termp_tag_pre(DECL_ARGS); static int termp_under_pre(DECL_ARGS); static int termp_vt_pre(DECL_ARGS); static int termp_xr_pre(DECL_ARGS); --- 113,118 ---- *************** *** 138,148 **** { termp_an_pre, NULL }, /* An */ { termp_ap_pre, NULL }, /* Ap */ { termp_under_pre, NULL }, /* Ar */ ! { termp_cd_pre, NULL }, /* Cd */ { termp_bold_pre, NULL }, /* Cm */ { termp_li_pre, NULL }, /* Dv */ ! { termp_er_pre, NULL }, /* Er */ ! { termp_tag_pre, NULL }, /* Ev */ { termp_ex_pre, NULL }, /* Ex */ { termp_fa_pre, NULL }, /* Fa */ { termp_fd_pre, termp_fd_post }, /* Fd */ --- 136,146 ---- { termp_an_pre, NULL }, /* An */ { termp_ap_pre, NULL }, /* Ap */ { termp_under_pre, NULL }, /* Ar */ ! { termp_fd_pre, NULL }, /* Cd */ { termp_bold_pre, NULL }, /* Cm */ { termp_li_pre, NULL }, /* Dv */ ! { NULL, NULL }, /* Er */ ! { NULL, NULL }, /* Ev */ { termp_ex_pre, NULL }, /* Ex */ { termp_fa_pre, NULL }, /* Fa */ { termp_fd_pre, termp_fd_post }, /* Fd */ *************** *** 189,195 **** { termp_quote_pre, termp_quote_post }, /* Dq */ { NULL, NULL }, /* Ec */ /* FIXME: no space */ { NULL, NULL }, /* Ef */ ! { termp_em_pre, NULL }, /* Em */ { termp_eo_pre, termp_eo_post }, /* Eo */ { termp_xx_pre, termp_xx_post }, /* Fx */ { termp_bold_pre, NULL }, /* Ms */ --- 187,193 ---- { termp_quote_pre, termp_quote_post }, /* Dq */ { NULL, NULL }, /* Ec */ /* FIXME: no space */ { NULL, NULL }, /* Ef */ ! { termp_under_pre, NULL }, /* Em */ { termp_eo_pre, termp_eo_post }, /* Eo */ { termp_xx_pre, termp_xx_post }, /* Fx */ { termp_bold_pre, NULL }, /* Ms */ *************** *** 212,218 **** { termp_quote_pre, termp_quote_post }, /* Sq */ { termp_sm_pre, NULL }, /* Sm */ { termp_under_pre, NULL }, /* Sx */ ! { termp_sy_pre, NULL }, /* Sy */ { NULL, NULL }, /* Tn */ { termp_xx_pre, termp_xx_post }, /* Ux */ { NULL, NULL }, /* Xc */ --- 210,216 ---- { termp_quote_pre, termp_quote_post }, /* Sq */ { termp_sm_pre, NULL }, /* Sm */ { termp_under_pre, NULL }, /* Sx */ ! { termp_bold_pre, NULL }, /* Sy */ { NULL, NULL }, /* Tn */ { termp_xx_pre, termp_xx_post }, /* Ux */ { NULL, NULL }, /* Xc */ *************** *** 244,252 **** { termp_skip_pre, NULL }, /* Tg */ }; - static int fn_prio = TAG_STRONG; - void terminal_mdoc(void *arg, const struct roff_meta *mdoc) { --- 242,248 ---- *************** *** 298,304 **** static void print_mdoc_nodelist(DECL_ARGS) { - while (n != NULL) { print_mdoc_node(p, pair, meta, n); n = n->next; --- 294,299 ---- *************** *** 339,346 **** npair.ppair = pair; if (n->flags & NODE_ID) ! tag_put(n->string == NULL ? n->child->string : n->string, ! TAG_MANUAL, p->line); /* * Keeps only work until the end of a line. If a keep was --- 334,340 ---- npair.ppair = pair; if (n->flags & NODE_ID) ! term_tag_write(n, p->line); /* * Keeps only work until the end of a line. If a keep was *************** *** 1006,1029 **** p->flags |= TERMP_HANG; } } ! ! term_fontpush(p, TERMFONT_BOLD); ! return 1; } static void termp_nm_post(DECL_ARGS) { ! ! if (n->type == ROFFT_BLOCK) { p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP); ! } else if (n->type == ROFFT_HEAD && ! NULL != n->next && NULL != n->next->child) { term_flushln(p); p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG); p->trailspace = 0; ! } else if (n->type == ROFFT_BODY && n->child != NULL) ! term_flushln(p); } static int --- 1000,1029 ---- p->flags |= TERMP_HANG; } } ! return termp_bold_pre(p, pair, meta, n); } static void termp_nm_post(DECL_ARGS) { ! switch (n->type) { ! case ROFFT_BLOCK: p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP); ! break; ! case ROFFT_HEAD: ! if (n->next == NULL || n->next->child == NULL) ! break; term_flushln(p); p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG); p->trailspace = 0; ! break; ! case ROFFT_BODY: ! if (n->child != NULL) ! term_flushln(p); ! break; ! default: ! break; ! } } static int *************** *** 1031,1037 **** { struct roff_node *nn; - termp_tag_pre(p, pair, meta, n); term_fontpush(p, TERMFONT_BOLD); term_word(p, "\\-"); --- 1031,1036 ---- *************** *** 1217,1240 **** static int termp_vt_pre(DECL_ARGS) { ! ! if (n->type == ROFFT_ELEM) { synopsis_pre(p, n); - return termp_under_pre(p, pair, meta, n); - } else if (n->type == ROFFT_BLOCK) { - synopsis_pre(p, n); return 1; ! } else if (n->type == ROFFT_HEAD) return 0; ! ! return termp_under_pre(p, pair, meta, n); } static int termp_bold_pre(DECL_ARGS) { - - termp_tag_pre(p, pair, meta, n); term_fontpush(p, TERMFONT_BOLD); return 1; } --- 1216,1237 ---- static int termp_vt_pre(DECL_ARGS) { ! switch (n->type) { ! case ROFFT_ELEM: ! return termp_ft_pre(p, pair, meta, n); ! case ROFFT_BLOCK: synopsis_pre(p, n); return 1; ! case ROFFT_HEAD: return 0; ! default: ! return termp_under_pre(p, pair, meta, n); ! } } static int termp_bold_pre(DECL_ARGS) { term_fontpush(p, TERMFONT_BOLD); return 1; } *************** *** 1242,1248 **** static int termp_fd_pre(DECL_ARGS) { - synopsis_pre(p, n); return termp_bold_pre(p, pair, meta, n); } --- 1239,1244 ---- *************** *** 1250,1256 **** static void termp_fd_post(DECL_ARGS) { - term_newln(p); } --- 1246,1251 ---- *************** *** 1271,1293 **** term_vspace(p); break; case ROFFT_HEAD: ! term_fontpush(p, TERMFONT_BOLD); ! break; case ROFFT_BODY: p->tcol->offset = term_len(p, p->defindent); term_tab_set(p, NULL); term_tab_set(p, "T"); term_tab_set(p, ".5i"); ! switch (n->sec) { ! case SEC_DESCRIPTION: ! fn_prio = TAG_STRONG; ! break; ! case SEC_AUTHORS: p->flags &= ~(TERMP_SPLIT|TERMP_NOSPLIT); - break; - default: - break; - } break; default: break; --- 1266,1279 ---- term_vspace(p); break; case ROFFT_HEAD: ! return termp_bold_pre(p, pair, meta, n); case ROFFT_BODY: p->tcol->offset = term_len(p, p->defindent); term_tab_set(p, NULL); term_tab_set(p, "T"); term_tab_set(p, ".5i"); ! if (n->sec == SEC_AUTHORS) p->flags &= ~(TERMP_SPLIT|TERMP_NOSPLIT); break; default: break; *************** *** 1298,1304 **** static void termp_sh_post(DECL_ARGS) { - switch (n->type) { case ROFFT_HEAD: term_newln(p); --- 1284,1289 ---- *************** *** 1315,1329 **** static void termp_lb_post(DECL_ARGS) { ! ! if (SEC_LIBRARY == n->sec && NODE_LINE & n->flags) term_newln(p); } static int termp_d1_pre(DECL_ARGS) { - if (n->type != ROFFT_BLOCK) return 1; term_newln(p); --- 1300,1312 ---- static void termp_lb_post(DECL_ARGS) { ! if (n->sec == SEC_LIBRARY && n->flags & NODE_LINE) term_newln(p); } static int termp_d1_pre(DECL_ARGS) { if (n->type != ROFFT_BLOCK) return 1; term_newln(p); *************** *** 1337,1347 **** static int termp_ft_pre(DECL_ARGS) { - - /* NB: NODE_LINE does not effect this! */ synopsis_pre(p, n); ! term_fontpush(p, TERMFONT_UNDER); ! return 1; } static int --- 1320,1327 ---- static int termp_ft_pre(DECL_ARGS) { synopsis_pre(p, n); ! return termp_under_pre(p, pair, meta, n); } static int *************** *** 1350,1360 **** size_t rmargin = 0; int pretty; - pretty = NODE_SYNPRETTY & n->flags; - synopsis_pre(p, n); ! ! if (NULL == (n = n->child)) return 0; if (pretty) { --- 1330,1338 ---- size_t rmargin = 0; int pretty; synopsis_pre(p, n); ! pretty = n->flags & NODE_SYNPRETTY; ! if ((n = n->child) == NULL) return 0; if (pretty) { *************** *** 1368,1376 **** term_word(p, n->string); term_fontpop(p); - if (n->sec == SEC_DESCRIPTION || n->sec == SEC_CUSTOM) - tag_put(n->string, fn_prio++, p->line); - if (pretty) { term_flushln(p); p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG); --- 1346,1351 ---- *************** *** 1405,1411 **** term_word(p, ";"); term_flushln(p); } - return 0; } --- 1380,1385 ---- *************** *** 1414,1423 **** { const struct roff_node *nn; ! if (n->parent->tok != MDOC_Fo) { ! term_fontpush(p, TERMFONT_UNDER); ! return 1; ! } for (nn = n->child; nn != NULL; nn = nn->next) { term_fontpush(p, TERMFONT_UNDER); p->flags |= TERMP_NBRWORD; --- 1388,1396 ---- { const struct roff_node *nn; ! if (n->parent->tok != MDOC_Fo) ! return termp_under_pre(p, pair, meta, n); ! for (nn = n->child; nn != NULL; nn = nn->next) { term_fontpush(p, TERMFONT_UNDER); p->flags |= TERMP_NBRWORD; *************** *** 1528,1536 **** term_vspace(p); break; case ROFFT_HEAD: - term_fontpush(p, TERMFONT_BOLD); p->tcol->offset = term_len(p, (p->defindent+1)/2); ! break; case ROFFT_BODY: p->tcol->offset = term_len(p, p->defindent); term_tab_set(p, NULL); --- 1501,1508 ---- term_vspace(p); break; case ROFFT_HEAD: p->tcol->offset = term_len(p, (p->defindent+1)/2); ! return termp_bold_pre(p, pair, meta, n); case ROFFT_BODY: p->tcol->offset = term_len(p, p->defindent); term_tab_set(p, NULL); *************** *** 1551,1571 **** } static int - termp_cd_pre(DECL_ARGS) - { - - synopsis_pre(p, n); - term_fontpush(p, TERMFONT_BOLD); - return 1; - } - - static int termp_in_pre(DECL_ARGS) { - synopsis_pre(p, n); ! ! if (NODE_SYNPRETTY & n->flags && NODE_LINE & n->flags) { term_fontpush(p, TERMFONT_BOLD); term_word(p, "#include"); term_word(p, "<"); --- 1523,1532 ---- } static int termp_in_pre(DECL_ARGS) { synopsis_pre(p, n); ! if (n->flags & NODE_SYNPRETTY && n->flags & NODE_LINE) { term_fontpush(p, TERMFONT_BOLD); term_word(p, "#include"); term_word(p, "<"); *************** *** 1573,1579 **** term_word(p, "<"); term_fontpush(p, TERMFONT_UNDER); } - p->flags |= TERMP_NOSPACE; return 1; } --- 1534,1539 ---- *************** *** 1581,1601 **** static void termp_in_post(DECL_ARGS) { ! ! if (NODE_SYNPRETTY & n->flags) term_fontpush(p, TERMFONT_BOLD); - p->flags |= TERMP_NOSPACE; term_word(p, ">"); ! ! if (NODE_SYNPRETTY & n->flags) term_fontpop(p); } static int termp_pp_pre(DECL_ARGS) { - fn_prio = TAG_STRONG; term_vspace(p); return 0; } --- 1541,1557 ---- static void termp_in_post(DECL_ARGS) { ! if (n->flags & NODE_SYNPRETTY) term_fontpush(p, TERMFONT_BOLD); p->flags |= TERMP_NOSPACE; term_word(p, ">"); ! if (n->flags & NODE_SYNPRETTY) term_fontpop(p); } static int termp_pp_pre(DECL_ARGS) { term_vspace(p); return 0; } *************** *** 1603,1616 **** static int termp_skip_pre(DECL_ARGS) { - return 0; } static int termp_quote_pre(DECL_ARGS) { - if (n->type != ROFFT_BODY && n->type != ROFFT_ELEM) return 1; --- 1559,1570 ---- *************** *** 1767,1783 **** static int termp_fo_pre(DECL_ARGS) { ! size_t rmargin = 0; ! int pretty; ! pretty = NODE_SYNPRETTY & n->flags; ! ! if (n->type == ROFFT_BLOCK) { synopsis_pre(p, n); return 1; ! } else if (n->type == ROFFT_BODY) { ! if (pretty) { ! rmargin = p->tcol->rmargin; p->tcol->rmargin = p->tcol->offset + term_len(p, 4); p->flags |= TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG; --- 1721,1735 ---- static int termp_fo_pre(DECL_ARGS) { ! size_t rmargin; ! switch (n->type) { ! case ROFFT_BLOCK: synopsis_pre(p, n); return 1; ! case ROFFT_BODY: ! rmargin = p->tcol->rmargin; ! if (n->flags & NODE_SYNPRETTY) { p->tcol->rmargin = p->tcol->offset + term_len(p, 4); p->flags |= TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG; *************** *** 1785,1791 **** p->flags |= TERMP_NOSPACE; term_word(p, "("); p->flags |= TERMP_NOSPACE; ! if (pretty) { term_flushln(p); p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG); --- 1737,1743 ---- p->flags |= TERMP_NOSPACE; term_word(p, "("); p->flags |= TERMP_NOSPACE; ! if (n->flags & NODE_SYNPRETTY) { term_flushln(p); p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG); *************** *** 1794,1823 **** p->tcol->rmargin = rmargin; } return 1; } - - if (NULL == n->child) - return 0; - - /* XXX: we drop non-initial arguments as per groff. */ - - assert(n->child->string); - term_fontpush(p, TERMFONT_BOLD); - term_word(p, n->child->string); - return 0; } static void termp_fo_post(DECL_ARGS) { - if (n->type != ROFFT_BODY) return; p->flags |= TERMP_NOSPACE; term_word(p, ")"); ! if (NODE_SYNPRETTY & n->flags) { p->flags |= TERMP_NOSPACE; term_word(p, ";"); term_flushln(p); --- 1746,1766 ---- p->tcol->rmargin = rmargin; } return 1; + default: + return termp_bold_pre(p, pair, meta, n); } } static void termp_fo_post(DECL_ARGS) { if (n->type != ROFFT_BODY) return; p->flags |= TERMP_NOSPACE; term_word(p, ")"); ! if (n->flags & NODE_SYNPRETTY) { p->flags |= TERMP_NOSPACE; term_word(p, ";"); term_flushln(p); *************** *** 1827,1855 **** static int termp_bf_pre(DECL_ARGS) { ! ! if (n->type == ROFFT_HEAD) return 0; ! else if (n->type != ROFFT_BODY) return 1; ! ! if (FONT_Em == n->norm->Bf.font) ! term_fontpush(p, TERMFONT_UNDER); ! else if (FONT_Sy == n->norm->Bf.font) ! term_fontpush(p, TERMFONT_BOLD); ! else ! term_fontpush(p, TERMFONT_NONE); ! ! return 1; } static int termp_sm_pre(DECL_ARGS) { ! ! if (NULL == n->child) p->flags ^= TERMP_NONOSPACE; ! else if (0 == strcmp("on", n->child->string)) p->flags &= ~TERMP_NONOSPACE; else p->flags |= TERMP_NONOSPACE; --- 1770,1799 ---- static int termp_bf_pre(DECL_ARGS) { ! switch (n->type) { ! case ROFFT_HEAD: return 0; ! case ROFFT_BODY: ! break; ! default: return 1; ! } ! switch (n->norm->Bf.font) { ! case FONT_Em: ! return termp_under_pre(p, pair, meta, n); ! case FONT_Sy: ! return termp_bold_pre(p, pair, meta, n); ! default: ! return termp_li_pre(p, pair, meta, n); ! } } static int termp_sm_pre(DECL_ARGS) { ! if (n->child == NULL) p->flags ^= TERMP_NONOSPACE; ! else if (strcmp(n->child->string, "on") == 0) p->flags &= ~TERMP_NONOSPACE; else p->flags |= TERMP_NONOSPACE; *************** *** 1863,1869 **** static int termp_ap_pre(DECL_ARGS) { - p->flags |= TERMP_NOSPACE; term_word(p, "'"); p->flags |= TERMP_NOSPACE; --- 1807,1812 ---- *************** *** 1902,1909 **** static int termp_li_pre(DECL_ARGS) { - - termp_tag_pre(p, pair, meta, n); term_fontpush(p, TERMFONT_NONE); return 1; } --- 1845,1850 ---- *************** *** 1953,1959 **** static int termp_bk_pre(DECL_ARGS) { - switch (n->type) { case ROFFT_BLOCK: break; --- 1894,1899 ---- *************** *** 1966,2068 **** default: abort(); } - return 1; } static void termp_bk_post(DECL_ARGS) { - if (n->type == ROFFT_BODY) p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP); } static void termp__t_post(DECL_ARGS) { ! ! /* ! * If we're in an `Rs' and there's a journal present, then quote ! * us instead of underlining us (for disambiguation). ! */ ! if (n->parent && MDOC_Rs == n->parent->tok && n->parent->norm->Rs.quote_T) termp_quote_post(p, pair, meta, n); - termp____post(p, pair, meta, n); } static int termp__t_pre(DECL_ARGS) { ! ! /* ! * If we're in an `Rs' and there's a journal present, then quote ! * us instead of underlining us (for disambiguation). ! */ ! if (n->parent && MDOC_Rs == n->parent->tok && n->parent->norm->Rs.quote_T) return termp_quote_pre(p, pair, meta, n); ! ! term_fontpush(p, TERMFONT_UNDER); ! return 1; } static int termp_under_pre(DECL_ARGS) { - term_fontpush(p, TERMFONT_UNDER); - return 1; - } - - static int - termp_em_pre(DECL_ARGS) - { - if (n->child != NULL && - n->child->type == ROFFT_TEXT) - tag_put(n->child->string, TAG_FALLBACK, p->line); - term_fontpush(p, TERMFONT_UNDER); - return 1; - } - - static int - termp_sy_pre(DECL_ARGS) - { - if (n->child != NULL && - n->child->type == ROFFT_TEXT) - tag_put(n->child->string, TAG_FALLBACK, p->line); - term_fontpush(p, TERMFONT_BOLD); - return 1; - } - - static int - termp_er_pre(DECL_ARGS) - { - - if (n->sec == SEC_ERRORS && - (n->parent->tok == MDOC_It || - (n->parent->tok == MDOC_Bq && - n->parent->parent->parent->tok == MDOC_It))) - tag_put(n->child->string, TAG_STRONG, p->line); - return 1; - } - - static int - termp_tag_pre(DECL_ARGS) - { - - if (n->child != NULL && - n->child->type == ROFFT_TEXT && - (n->prev == NULL || - (n->prev->type == ROFFT_TEXT && - strcmp(n->prev->string, "|") == 0)) && - (n->parent->tok == MDOC_It || - (n->parent->tok == MDOC_Xo && - n->parent->parent->prev == NULL && - n->parent->parent->parent->tok == MDOC_It))) - tag_put(n->child->string, TAG_STRONG, p->line); return 1; } --- 1906,1948 ---- default: abort(); } return 1; } static void termp_bk_post(DECL_ARGS) { if (n->type == ROFFT_BODY) p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP); } + /* + * If we are in an `Rs' and there is a journal present, + * then quote us instead of underlining us (for disambiguation). + */ static void termp__t_post(DECL_ARGS) { ! if (n->parent != NULL && n->parent->tok == MDOC_Rs && n->parent->norm->Rs.quote_T) termp_quote_post(p, pair, meta, n); termp____post(p, pair, meta, n); } static int termp__t_pre(DECL_ARGS) { ! if (n->parent != NULL && n->parent->tok == MDOC_Rs && n->parent->norm->Rs.quote_T) return termp_quote_pre(p, pair, meta, n); ! else ! return termp_under_pre(p, pair, meta, n); } static int termp_under_pre(DECL_ARGS) { term_fontpush(p, TERMFONT_UNDER); return 1; }