diff options
-rw-r--r-- | TODO | 4 | ||||
-rw-r--r-- | mdoc.c | 2 | ||||
-rw-r--r-- | mdoc.h | 5 | ||||
-rw-r--r-- | mdoc_term.c | 45 | ||||
-rw-r--r-- | mdoc_validate.c | 17 |
5 files changed, 65 insertions, 8 deletions
@@ -132,10 +132,6 @@ or not (run a manual without `Nm blah' to see this). I'm not sure that this exists in the wild, but it's still an error. -- .%T should be quoted, not underlined, when .%J is also present, - to better distinguish the contents of .%T and .%J, - see for example OpenBSD cat(1) - - In .Bl -bullet, the groff bullet is "+\b+\bo\bo", the mandoc bullet is just "o\bo". see for example OpenBSD ksh(1) @@ -484,6 +484,8 @@ mdoc_block_alloc(struct mdoc *m, int line, int pos, case (MDOC_Bf): /* FALLTHROUGH */ case (MDOC_Bl): + /* FALLTHROUGH */ + case (MDOC_Rs): p->norm = mandoc_calloc(1, sizeof(union mdoc_data)); break; default: @@ -353,6 +353,10 @@ struct mdoc_an { enum mdoc_auth auth; /* -split, etc. */ }; +struct mdoc_rs { + int titlejournal; /* whether %T and %J */ +}; + /* * Consists of normalised node arguments. These should be used instead * of iterating through the mdoc_arg pointers of a node: defaults are @@ -363,6 +367,7 @@ union mdoc_data { struct mdoc_bd Bd; struct mdoc_bf Bf; struct mdoc_bl Bl; + struct mdoc_rs Rs; }; /* diff --git a/mdoc_term.c b/mdoc_term.c index 28cdfdbd..7a4a7fa5 100644 --- a/mdoc_term.c +++ b/mdoc_term.c @@ -68,6 +68,7 @@ static void synopsis_pre(struct termp *, const struct mdoc_node *); static void termp____post(DECL_ARGS); +static void termp__t_post(DECL_ARGS); static void termp_an_post(DECL_ARGS); static void termp_bd_post(DECL_ARGS); static void termp_bk_post(DECL_ARGS); @@ -85,6 +86,7 @@ static void termp_sh_post(DECL_ARGS); static void termp_ss_post(DECL_ARGS); static int termp__a_pre(DECL_ARGS); +static int termp__t_pre(DECL_ARGS); static int termp_an_pre(DECL_ARGS); static int termp_ap_pre(DECL_ARGS); static int termp_bd_pre(DECL_ARGS); @@ -174,7 +176,7 @@ static const struct termact termacts[MDOC_MAX] = { { NULL, termp____post }, /* %O */ { NULL, termp____post }, /* %P */ { NULL, termp____post }, /* %R */ - { termp_under_pre, termp____post }, /* %T */ + { termp__t_pre, termp__t_post }, /* %T */ { NULL, termp____post }, /* %V */ { NULL, NULL }, /* Ac */ { termp_quote_pre, termp_quote_post }, /* Ao */ @@ -1830,7 +1832,7 @@ static int termp_quote_pre(DECL_ARGS) { - if (MDOC_BODY != n->type) + if (MDOC_BODY != n->type && MDOC_ELEM != n->type) return(1); switch (n->tok) { @@ -1853,6 +1855,8 @@ termp_quote_pre(DECL_ARGS) case (MDOC_Bq): term_word(p, "["); break; + case (MDOC__T): + /* FALLTHROUGH */ case (MDOC_Do): /* FALLTHROUGH */ case (MDOC_Dq): @@ -1890,7 +1894,7 @@ static void termp_quote_post(DECL_ARGS) { - if (MDOC_BODY != n->type) + if (MDOC_BODY != n->type && MDOC_ELEM != n->type) return; p->flags |= TERMP_NOSPACE; @@ -1915,6 +1919,8 @@ termp_quote_post(DECL_ARGS) case (MDOC_Bq): term_word(p, "]"); break; + case (MDOC__T): + /* FALLTHROUGH */ case (MDOC_Do): /* FALLTHROUGH */ case (MDOC_Dq): @@ -2134,6 +2140,39 @@ termp_bk_post(DECL_ARGS) } /* ARGSUSED */ +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.titlejournal) + termp_quote_post(p, pair, m, n); + + termp____post(p, pair, m, n); +} + +/* ARGSUSED */ +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.titlejournal) + return(termp_quote_pre(p, pair, m, n)); + + term_fontpush(p, TERMFONT_UNDER); + return(1); +} + +/* ARGSUSED */ static int termp_under_pre(DECL_ARGS) { diff --git a/mdoc_validate.c b/mdoc_validate.c index aa65061c..89cdde0e 100644 --- a/mdoc_validate.c +++ b/mdoc_validate.c @@ -1649,8 +1649,19 @@ post_rs(POST_ARGS) { struct mdoc_node *nn, *next, *prev; int i, j; + int *tj; +#define RS_JOURNAL (1 << 0) +#define RS_TITLE (1 << 1) - if (MDOC_BODY != mdoc->last->type) + /* Mark whether we're carrying both a %T and %J. */ + + tj = &mdoc->last->norm->Rs.titlejournal; + + if (MDOC_BLOCK == mdoc->last->type) { + if ( ! (RS_JOURNAL & *tj && RS_TITLE & *tj)) + *tj = 0; + return(1); + } else if (MDOC_BODY != mdoc->last->type) return(1); /* @@ -1666,6 +1677,10 @@ post_rs(POST_ARGS) break; if (i < RSORD_MAX) { + if (MDOC__T == rsord[i]) + *tj |= RS_TITLE; + else if (MDOC__J == rsord[i]) + *tj |= RS_JOURNAL; next = nn->next; continue; } |