=================================================================== RCS file: /cvs/mandoc/mdoc_term.c,v retrieving revision 1.194 retrieving revision 1.204 diff -u -p -r1.194 -r1.204 --- mandoc/mdoc_term.c 2010/10/23 23:31:10 1.194 +++ mandoc/mdoc_term.c 2010/12/25 23:25:53 1.204 @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.194 2010/10/23 23:31:10 schwarze Exp $ */ +/* $Id: mdoc_term.c,v 1.204 2010/12/25 23:25:53 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * Copyright (c) 2010 Ingo Schwarze @@ -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 */ @@ -319,9 +321,12 @@ print_mdoc_node(DECL_ARGS) /* * Keeps only work until the end of a line. If a keep was * invoked in a prior line, revert it to PREKEEP. + * + * Also let SYNPRETTY sections behave as if they were wrapped + * in a `Bk' block. */ - if (TERMP_KEEP & p->flags) { + if (TERMP_KEEP & p->flags || MDOC_SYNPRETTY & n->flags) { if (n->prev && n->prev->line != n->line) { p->flags &= ~TERMP_KEEP; p->flags |= TERMP_PREKEEP; @@ -333,6 +338,16 @@ print_mdoc_node(DECL_ARGS) } } + /* + * Since SYNPRETTY sections aren't "turned off" with `Ek', + * we have to intuit whether we should disable formatting. + */ + + if ( ! (MDOC_SYNPRETTY & n->flags) && + ((n->prev && MDOC_SYNPRETTY & n->prev->flags) || + (n->parent && MDOC_SYNPRETTY & n->parent->flags))) + p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP); + if (chld && n->child) print_mdoc_nodelist(p, &npair, m, n->child); @@ -543,9 +558,9 @@ print_bvspace(struct termp *p, term_newln(p); - if (MDOC_Bd == bl->tok && bl->data.Bd->comp) + if (MDOC_Bd == bl->tok && bl->norm->Bd.comp) return; - if (MDOC_Bl == bl->tok && bl->data.Bl->comp) + if (MDOC_Bl == bl->tok && bl->norm->Bl.comp) return; /* Do not vspace directly after Ss/Sh. */ @@ -564,13 +579,13 @@ print_bvspace(struct termp *p, /* A `-column' does not assert vspace within the list. */ - if (MDOC_Bl == bl->tok && LIST_column == bl->data.Bl->type) + if (MDOC_Bl == bl->tok && LIST_column == bl->norm->Bl.type) if (n->prev && MDOC_It == n->prev->tok) return; /* A `-diag' without body does not vspace. */ - if (MDOC_Bl == bl->tok && LIST_diag == bl->data.Bl->type) + if (MDOC_Bl == bl->tok && LIST_diag == bl->norm->Bl.type) if (n->prev && MDOC_It == n->prev->tok) { assert(n->prev->body); if (NULL == n->prev->body->child) @@ -597,8 +612,7 @@ termp_it_pre(DECL_ARGS) } bl = n->parent->parent->parent; - assert(bl->data.Bl); - type = bl->data.Bl->type; + type = bl->norm->Bl.type; /* * First calculate width and offset. This is pretty easy unless @@ -608,8 +622,8 @@ termp_it_pre(DECL_ARGS) width = offset = 0; - if (bl->data.Bl->offs) - offset = a2offs(p, bl->data.Bl->offs); + if (bl->norm->Bl.offs) + offset = a2offs(p, bl->norm->Bl.offs); switch (type) { case (LIST_column): @@ -625,7 +639,7 @@ termp_it_pre(DECL_ARGS) * column. * - For more than 5 columns, add only one column. */ - ncols = bl->data.Bl->ncols; + ncols = bl->norm->Bl.ncols; /* LINTED */ dcol = ncols < 5 ? term_len(p, 4) : @@ -640,7 +654,7 @@ termp_it_pre(DECL_ARGS) nn->prev && i < (int)ncols; nn = nn->prev, i++) offset += dcol + a2width - (p, bl->data.Bl->cols[i]); + (p, bl->norm->Bl.cols[i]); /* * When exceeding the declared number of columns, leave @@ -655,10 +669,10 @@ termp_it_pre(DECL_ARGS) * Use the declared column widths, extended as explained * in the preceding paragraph. */ - width = a2width(p, bl->data.Bl->cols[i]) + dcol; + width = a2width(p, bl->norm->Bl.cols[i]) + dcol; break; default: - if (NULL == bl->data.Bl->width) + if (NULL == bl->norm->Bl.width) break; /* @@ -666,8 +680,8 @@ termp_it_pre(DECL_ARGS) * number for buffering single arguments. See the above * handling for column for how this changes. */ - assert(bl->data.Bl->width); - width = a2width(p, bl->data.Bl->width) + term_len(p, 2); + assert(bl->norm->Bl.width); + width = a2width(p, bl->norm->Bl.width) + term_len(p, 2); break; } @@ -929,7 +943,7 @@ termp_it_post(DECL_ARGS) if (MDOC_BLOCK == n->type) return; - type = n->parent->parent->parent->data.Bl->type; + type = n->parent->parent->parent->norm->Bl.type; switch (type) { case (LIST_item): @@ -1103,10 +1117,10 @@ termp_an_post(DECL_ARGS) return; } - if (AUTH_split == n->data.An.auth) { + if (AUTH_split == n->norm->An.auth) { p->flags &= ~TERMP_NOSPLIT; p->flags |= TERMP_SPLIT; - } else if (AUTH_nosplit == n->data.An.auth) { + } else if (AUTH_nosplit == n->norm->An.auth) { p->flags &= ~TERMP_SPLIT; p->flags |= TERMP_NOSPLIT; } @@ -1553,9 +1567,8 @@ termp_bd_pre(DECL_ARGS) } else if (MDOC_HEAD == n->type) return(0); - assert(n->data.Bd); - if (n->data.Bd->offs) - p->offset += a2offs(p, n->data.Bd->offs); + if (n->norm->Bd.offs) + p->offset += a2offs(p, n->norm->Bd.offs); /* * If -ragged or -filled are specified, the block does nothing @@ -1565,8 +1578,8 @@ termp_bd_pre(DECL_ARGS) * lines are allowed. */ - if (DISP_literal != n->data.Bd->type && - DISP_unfilled != n->data.Bd->type) + if (DISP_literal != n->norm->Bd.type && + DISP_unfilled != n->norm->Bd.type) return(1); tabwidth = p->tabwidth; @@ -1592,6 +1605,10 @@ termp_bd_pre(DECL_ARGS) /* FALLTHROUGH */ case (MDOC_Bl): /* FALLTHROUGH */ + case (MDOC_D1): + /* FALLTHROUGH */ + case (MDOC_Dl): + /* FALLTHROUGH */ case (MDOC_Lp): /* FALLTHROUGH */ case (MDOC_Pp): @@ -1624,9 +1641,8 @@ termp_bd_post(DECL_ARGS) rm = p->rmargin; rmax = p->maxrmargin; - assert(n->data.Bd); - if (DISP_literal == n->data.Bd->type || - DISP_unfilled == n->data.Bd->type) + if (DISP_literal == n->norm->Bd.type || + DISP_unfilled == n->norm->Bd.type) p->rmargin = p->maxrmargin = TERM_MAXMARGIN; p->flags |= TERMP_NOSPACE; @@ -1798,11 +1814,6 @@ termp_sp_pre(DECL_ARGS) len = 0; break; default: - assert(n->parent); - if ((NULL == n->next || NULL == n->prev) && - (MDOC_Ss == n->parent->tok || - MDOC_Sh == n->parent->tok)) - return(0); len = 1; break; } @@ -1821,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) { @@ -1844,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): @@ -1881,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; @@ -1906,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): @@ -1986,11 +2001,9 @@ termp_bf_pre(DECL_ARGS) else if (MDOC_BLOCK != n->type) return(1); - assert(n->data.Bf); - - if (FONT_Em == n->data.Bf->font) + if (FONT_Em == n->norm->Bf.font) term_fontpush(p, TERMFONT_UNDER); - else if (FONT_Sy == n->data.Bf->font) + else if (FONT_Sy == n->norm->Bf.font) term_fontpush(p, TERMFONT_BOLD); else term_fontpush(p, TERMFONT_NONE); @@ -2076,7 +2089,7 @@ termp_lk_pre(DECL_ARGS) nn = sv = n->child; - if (NULL == nn->next) + if (NULL == nn || NULL == nn->next) return(1); for (nn = nn->next; nn; nn = nn->next) @@ -2105,7 +2118,8 @@ termp_bk_pre(DECL_ARGS) case (MDOC_HEAD): return(0); case (MDOC_BODY): - p->flags |= TERMP_PREKEEP; + if (n->parent->args || 0 == n->prev->nchild) + p->flags |= TERMP_PREKEEP; break; default: abort(); @@ -2123,6 +2137,39 @@ termp_bk_post(DECL_ARGS) if (MDOC_BODY == n->type) p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP); +} + +/* 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.child_J) + 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.child_J) + return(termp_quote_pre(p, pair, m, n)); + + term_fontpush(p, TERMFONT_UNDER); + return(1); } /* ARGSUSED */