=================================================================== RCS file: /cvs/mandoc/mdoc_term.c,v retrieving revision 1.356 retrieving revision 1.361 diff -u -p -r1.356 -r1.361 --- mandoc/mdoc_term.c 2017/05/07 17:31:45 1.356 +++ mandoc/mdoc_term.c 2017/06/04 22:44:15 1.361 @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.356 2017/05/07 17:31:45 schwarze Exp $ */ +/* $Id: mdoc_term.c,v 1.361 2017/06/04 22:44:15 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2012-2017 Ingo Schwarze @@ -259,7 +259,6 @@ terminal_mdoc(void *arg, const struct roff_man *mdoc) size_t save_defindent; p = (struct termp *)arg; - p->overstep = 0; p->rmargin = p->maxrmargin = p->defrmargin; term_tab_set(p, NULL); term_tab_set(p, "T"); @@ -342,7 +341,8 @@ print_mdoc_node(DECL_ARGS) switch (n->type) { case ROFFT_TEXT: - if (' ' == *n->string && NODE_LINE & n->flags) + if (*n->string == ' ' && n->flags & NODE_LINE && + (p->flags & TERMP_NONEWLINE) == 0) term_newln(p); if (NODE_DELIMC & n->flags) p->flags |= TERMP_NOSPACE; @@ -406,7 +406,8 @@ print_mdoc_node(DECL_ARGS) if (NODE_EOS & n->flags) p->flags |= TERMP_SENTENCE; - p->offset = offset; + if (n->type != ROFFT_TEXT) + p->offset = offset; p->rmargin = rmargin; } @@ -763,33 +764,15 @@ termp_it_pre(DECL_ARGS) case LIST_bullet: case LIST_dash: case LIST_hyphen: - /* - * Weird special case. - * Some very narrow lists actually hang. - */ - if (width <= (int)term_len(p, 2)) - p->flags |= TERMP_HANG; - if (n->type != ROFFT_HEAD) - break; - p->flags |= TERMP_NOBREAK; - p->trailspace = 1; + if (n->type == ROFFT_HEAD) { + p->flags |= TERMP_NOBREAK | TERMP_HANG; + p->trailspace = 1; + } else if (width <= (int)term_len(p, 2)) + p->flags |= TERMP_NOPAD; break; case LIST_hang: if (n->type != ROFFT_HEAD) break; - - /* - * This is ugly. If `-hang' is specified and the body - * is a `Bl' or `Bd', then we want basically to nullify - * the "overstep" effect in term_flushln() and treat - * this as a `-ohang' list instead. - */ - if (NULL != n->next && - NULL != n->next->child && - (MDOC_Bl == n->next->child->tok || - MDOC_Bd == n->next->child->tok)) - break; - p->flags |= TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG; p->trailspace = 1; break; @@ -801,7 +784,7 @@ termp_it_pre(DECL_ARGS) p->trailspace = 2; if (NULL == n->next || NULL == n->next->child) - p->flags |= TERMP_DANGLE; + p->flags |= TERMP_HANG; break; case LIST_column: if (n->type == ROFFT_HEAD) @@ -835,23 +818,11 @@ termp_it_pre(DECL_ARGS) p->offset += offset; switch (type) { - case LIST_hang: - /* - * Same stipulation as above, regarding `-hang'. We - * don't want to recalculate rmargin and offsets when - * using `Bd' or `Bl' within `-hang' overstep lists. - */ - if (n->type == ROFFT_HEAD && - NULL != n->next && - NULL != n->next->child && - (MDOC_Bl == n->next->child->tok || - MDOC_Bd == n->next->child->tok)) - break; - /* FALLTHROUGH */ case LIST_bullet: case LIST_dash: case LIST_enum: case LIST_hyphen: + case LIST_hang: case LIST_tag: if (n->type == ROFFT_HEAD) p->rmargin = p->offset + width; @@ -918,6 +889,7 @@ termp_it_pre(DECL_ARGS) case LIST_column: if (n->type == ROFFT_HEAD) return 0; + p->minbl = 0; break; default: break; @@ -958,8 +930,7 @@ termp_it_post(DECL_ARGS) * has munged them in the meanwhile. */ - p->flags &= ~(TERMP_NOBREAK | TERMP_BRTRSP | TERMP_BRIND | - TERMP_DANGLE | TERMP_HANG); + p->flags &= ~(TERMP_NOBREAK | TERMP_BRTRSP | TERMP_BRIND | TERMP_HANG); p->trailspace = 0; } @@ -1379,6 +1350,7 @@ termp_fn_pre(DECL_ARGS) if (pretty) { term_flushln(p); p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG); + p->flags |= TERMP_NOPAD; p->offset = p->rmargin; p->rmargin = rmargin; } @@ -1441,7 +1413,7 @@ termp_fa_pre(DECL_ARGS) static int termp_bd_pre(DECL_ARGS) { - size_t lm, len, rm, rmax; + size_t lm, len; struct roff_node *nn; int offset; @@ -1488,17 +1460,14 @@ termp_bd_pre(DECL_ARGS) } lm = p->offset; - rm = p->rmargin; - rmax = p->maxrmargin; - p->rmargin = p->maxrmargin = TERM_MAXMARGIN; - + p->flags |= TERMP_BRNEVER; for (nn = n->child; nn; nn = nn->next) { if (DISP_centered == n->norm->Bd.type) { if (nn->type == ROFFT_TEXT) { len = term_strlen(p, nn->string); - p->offset = len >= rm ? 0 : - lm + len >= rm ? rm - len : - (lm + rm - len) / 2; + p->offset = len >= p->rmargin ? 0 : + lm + len >= p->rmargin ? p->rmargin - len : + (lm + p->rmargin - len) / 2; } else p->offset = lm; } @@ -1528,32 +1497,21 @@ termp_bd_pre(DECL_ARGS) term_flushln(p); p->flags |= TERMP_NOSPACE; } - - p->rmargin = rm; - p->maxrmargin = rmax; + p->flags &= ~TERMP_BRNEVER; return 0; } static void termp_bd_post(DECL_ARGS) { - size_t rm, rmax; - if (n->type != ROFFT_BODY) return; - - rm = p->rmargin; - rmax = p->maxrmargin; - if (DISP_literal == n->norm->Bd.type || DISP_unfilled == n->norm->Bd.type) - p->rmargin = p->maxrmargin = TERM_MAXMARGIN; - + p->flags |= TERMP_BRNEVER; p->flags |= TERMP_NOSPACE; term_newln(p); - - p->rmargin = rm; - p->maxrmargin = rmax; + p->flags &= ~TERMP_BRNEVER; } static int @@ -1857,6 +1815,7 @@ termp_fo_pre(DECL_ARGS) term_flushln(p); p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG); + p->flags |= TERMP_NOPAD; p->offset = p->rmargin; p->rmargin = rmargin; } @@ -1976,16 +1935,24 @@ termp_li_pre(DECL_ARGS) static int termp_lk_pre(DECL_ARGS) { - const struct roff_node *link, *descr; + const struct roff_node *link, *descr, *punct; int display; if ((link = n->child) == NULL) return 0; + /* Find beginning of trailing punctuation. */ + punct = n->last; + while (punct != link && punct->flags & NODE_DELIMC) + punct = punct->prev; + punct = punct->next; + /* Link text. */ - if ((descr = link->next) != NULL && !(descr->flags & NODE_DELIMC)) { + if ((descr = link->next) != NULL && descr != punct) { term_fontpush(p, TERMFONT_UNDER); - while (descr != NULL && !(descr->flags & NODE_DELIMC)) { + while (descr != punct) { + if (descr->flags & (NODE_DELIMC | NODE_DELIMO)) + p->flags |= TERMP_NOSPACE; term_word(p, descr->string); descr = descr->next; } @@ -2005,10 +1972,10 @@ termp_lk_pre(DECL_ARGS) term_fontpop(p); /* Trailing punctuation. */ - while (descr != NULL) { + while (punct != NULL) { p->flags |= TERMP_NOSPACE; - term_word(p, descr->string); - descr = descr->next; + term_word(p, punct->string); + punct = punct->next; } if (display) term_newln(p);