=================================================================== RCS file: /cvs/mandoc/mdoc_term.c,v retrieving revision 1.344 retrieving revision 1.349 diff -u -p -r1.344 -r1.349 --- mandoc/mdoc_term.c 2017/02/16 03:00:23 1.344 +++ mandoc/mdoc_term.c 2017/04/17 12:53:29 1.349 @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.344 2017/02/16 03:00:23 schwarze Exp $ */ +/* $Id: mdoc_term.c,v 1.349 2017/04/17 12:53:29 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2012-2017 Ingo Schwarze @@ -606,6 +606,7 @@ termp_ll_pre(DECL_ARGS) static int termp_it_pre(DECL_ARGS) { + struct roffsu su; char buf[24]; const struct roff_node *bl, *nn; size_t ncols, dcol; @@ -683,9 +684,12 @@ termp_it_pre(DECL_ARGS) for (i = 0, nn = n->prev; nn->prev && i < (int)ncols; - nn = nn->prev, i++) - offset += dcol + a2width(p, - bl->norm->Bl.cols[i]); + nn = nn->prev, i++) { + SCALE_HS_INIT(&su, + term_strlen(p, bl->norm->Bl.cols[i])); + su.scale /= term_strlen(p, "0"); + offset += term_hspan(p, &su) / 24 + dcol; + } /* * When exceeding the declared number of columns, leave @@ -700,7 +704,9 @@ termp_it_pre(DECL_ARGS) * Use the declared column widths, extended as explained * in the preceding paragraph. */ - width = a2width(p, bl->norm->Bl.cols[i]) + dcol; + SCALE_HS_INIT(&su, term_strlen(p, bl->norm->Bl.cols[i])); + su.scale /= term_strlen(p, "0"); + width = term_hspan(p, &su) / 24 + dcol; break; default: if (NULL == bl->norm->Bl.width) @@ -1708,6 +1714,8 @@ termp_quote_pre(DECL_ARGS) case MDOC_Bq: term_word(p, "["); break; + case MDOC__T: + /* FALLTHROUGH */ case MDOC_Do: case MDOC_Dq: term_word(p, "\\(Lq"); @@ -1722,7 +1730,6 @@ termp_quote_pre(DECL_ARGS) case MDOC_Pq: term_word(p, "("); break; - case MDOC__T: case MDOC_Qo: case MDOC_Qq: term_word(p, "\""); @@ -1765,6 +1772,8 @@ termp_quote_post(DECL_ARGS) case MDOC_Bq: term_word(p, "]"); break; + case MDOC__T: + /* FALLTHROUGH */ case MDOC_Do: case MDOC_Dq: term_word(p, "\\(Rq"); @@ -1781,7 +1790,6 @@ termp_quote_post(DECL_ARGS) case MDOC_Pq: term_word(p, ")"); break; - case MDOC__T: case MDOC_Qo: case MDOC_Qq: term_word(p, "\""); @@ -1985,25 +1993,41 @@ static int termp_lk_pre(DECL_ARGS) { const struct roff_node *link, *descr; + int display; - if (NULL == (link = n->child)) + if ((link = n->child) == NULL) return 0; - if (NULL != (descr = link->next)) { + /* Link text. */ + if ((descr = link->next) != NULL && !(descr->flags & NODE_DELIMC)) { term_fontpush(p, TERMFONT_UNDER); - while (NULL != descr) { + while (descr != NULL && !(descr->flags & NODE_DELIMC)) { term_word(p, descr->string); descr = descr->next; } + term_fontpop(p); p->flags |= TERMP_NOSPACE; term_word(p, ":"); - term_fontpop(p); } + /* Link target. */ + display = term_strlen(p, link->string) >= 26; + if (display) { + term_newln(p); + p->offset += term_len(p, p->defindent + 1); + } term_fontpush(p, TERMFONT_BOLD); term_word(p, link->string); term_fontpop(p); + /* Trailing punctuation. */ + while (descr != NULL) { + p->flags |= TERMP_NOSPACE; + term_word(p, descr->string); + descr = descr->next; + } + if (display) + term_newln(p); return 0; }