From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from scc-mailout-kit-02.scc.kit.edu (scc-mailout-kit-02.scc.kit.edu [129.13.231.82]) by fantadrom.bsd.lv (OpenSMTPD) with ESMTP id 46e2ef50 for ; Mon, 18 Mar 2019 07:01:52 -0500 (EST) Received: from asta-nat.asta.uni-karlsruhe.de ([172.22.63.82] helo=hekate.usta.de) by scc-mailout-kit-02.scc.kit.edu with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (envelope-from ) id 1h5qxi-0002W5-MF; Mon, 18 Mar 2019 13:01:52 +0100 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.77) (envelope-from ) id 1h5qxh-0001oo-Kj; Mon, 18 Mar 2019 13:01:49 +0100 Received: from athene.usta.de ([172.24.96.10]) by donnerwolke.usta.de with esmtp (Exim 4.84_2) (envelope-from ) id 1h5qxh-0004HL-GE; Mon, 18 Mar 2019 13:01:49 +0100 Received: from localhost (athene.usta.de [local]) by athene.usta.de (OpenSMTPD) with ESMTPA id 403922ec; Mon, 18 Mar 2019 13:01:49 +0100 (CET) Date: Mon, 18 Mar 2019 13:01:49 +0100 From: Ingo Schwarze To: "Anthony J. Bentley" Cc: tech@mandoc.bsd.lv Subject: Re: Rendering bottom of tables Message-ID: <20190318120149.GL29153@athene.usta.de> References: <89585.1552692441@desktop.ajb.soy> X-Mailinglist: mandoc-tech Reply-To: tech@mandoc.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <89585.1552692441@desktop.ajb.soy> User-Agent: Mutt/1.8.0 (2017-02-23) Hi, Anthony J. Bentley wrote on Fri, Mar 15, 2019 at 05:27:21PM -0600: > mpv(1) has a number of tables like the following: > > .TS > center; > |l|l|. > _ > T{ > left\-click > T} T{ > toggle play/pause > T} > _ > .TE > > In a UTF-8 locale, groff renders this correctly. But mandoc displays > U+253C in the bottom row when it should display U+2534. I almost forgot to mention on tech@ that this is fixed now, see the commit below. Thanks for reporting, Ingo Log Message: ----------- When drawing a horizontal line in tbl(7) UTF-8 output, it is not sufficient to look at two data rows, but up to three are needed: the one above to identify vertical lines branching off upward, the row itself (in case the line is in a data row rather than a layout line) to figure out the horizontal line style, and the row below to identify vertical lines branching off downward. As an example, bentley@ reported from the mpv(1) manual page that in a tbl(7) having a vertical line in the middle and a horizontal line in the bottom data row, the vertical line extended below the bottom horizontal line. Modified Files: -------------- mandoc: tbl_term.c Revision Data ------------- Index: tbl_term.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/tbl_term.c,v retrieving revision 1.68 retrieving revision 1.69 diff -Ltbl_term.c -Ltbl_term.c -u -p -r1.68 -r1.69 --- tbl_term.c +++ tbl_term.c @@ -46,7 +46,8 @@ static void tbl_fill_border(struct termp static void tbl_fill_char(struct termp *, char, size_t); static void tbl_fill_string(struct termp *, const char *, size_t); static void tbl_hrule(struct termp *, const struct tbl_span *, - const struct tbl_span *, int); + const struct tbl_span *, const struct tbl_span *, + int); static void tbl_literal(struct termp *, const struct tbl_dat *, const struct roffcol *); static void tbl_number(struct termp *, const struct tbl_opts *, @@ -222,9 +223,9 @@ term_tbl(struct termp *tp, const struct if (tp->enc == TERMENC_ASCII && sp->opts->opts & TBL_OPT_DBOX) - tbl_hrule(tp, NULL, sp, TBL_OPT_DBOX); + tbl_hrule(tp, NULL, sp, sp, TBL_OPT_DBOX); if (sp->opts->opts & (TBL_OPT_DBOX | TBL_OPT_BOX)) - tbl_hrule(tp, NULL, sp, TBL_OPT_BOX); + tbl_hrule(tp, NULL, sp, sp, TBL_OPT_BOX); } /* Set up the columns. */ @@ -342,7 +343,7 @@ term_tbl(struct termp *tp, const struct more = 0; if (horiz) - tbl_hrule(tp, sp->prev, sp, 0); + tbl_hrule(tp, sp->prev, sp, sp->next, 0); else { cp = sp->layout->first; cpn = sp->next == NULL ? NULL : @@ -557,12 +558,12 @@ term_tbl(struct termp *tp, const struct tp->tcol->rmargin = tp->maxrmargin; if (sp->next == NULL) { if (sp->opts->opts & (TBL_OPT_DBOX | TBL_OPT_BOX)) { - tbl_hrule(tp, sp, NULL, TBL_OPT_BOX); + tbl_hrule(tp, sp, sp, NULL, TBL_OPT_BOX); tp->skipvsp = 1; } if (tp->enc == TERMENC_ASCII && sp->opts->opts & TBL_OPT_DBOX) { - tbl_hrule(tp, sp, NULL, TBL_OPT_DBOX); + tbl_hrule(tp, sp, sp, NULL, TBL_OPT_DBOX); tp->skipvsp = 2; } assert(tp->tbl.cols); @@ -571,7 +572,7 @@ term_tbl(struct termp *tp, const struct } else if (horiz == 0 && sp->opts->opts & TBL_OPT_ALLBOX && (sp->next == NULL || sp->next->pos == TBL_SPAN_DATA || sp->next->next != NULL)) - tbl_hrule(tp, sp, sp->next, TBL_OPT_ALLBOX); + tbl_hrule(tp, sp, sp, sp->next, TBL_OPT_ALLBOX); tp->tcol->offset = save_offset; tp->flags &= ~TERMP_NONOSPACE; @@ -579,9 +580,10 @@ term_tbl(struct termp *tp, const struct static void tbl_hrule(struct termp *tp, const struct tbl_span *spp, - const struct tbl_span *spn, int flags) + const struct tbl_span *sp, const struct tbl_span *spn, int flags) { const struct tbl_cell *cpp; /* Layout cell above this line. */ + const struct tbl_cell *cp; /* Layout cell in this line. */ const struct tbl_cell *cpn; /* Layout cell below this line. */ const struct tbl_dat *dpn; /* Data cell below this line. */ const struct roffcol *col; /* Contains width and spacing. */ @@ -592,6 +594,7 @@ tbl_hrule(struct termp *tp, const struct int uw, dw; /* Vertical line widths. */ cpp = spp == NULL ? NULL : spp->layout->first; + cp = sp == NULL ? NULL : sp->layout->first; cpn = spn == NULL ? NULL : spn->layout->first; dpn = NULL; if (spn != NULL) { @@ -600,11 +603,11 @@ tbl_hrule(struct termp *tp, const struct else if (spn->next != NULL) dpn = spn->next->first; } - opts = spn == NULL ? spp->opts->opts : spn->opts->opts; + opts = sp->opts->opts; bw = opts & TBL_OPT_DBOX ? (tp->enc == TERMENC_UTF8 ? 2 : 1) : opts & (TBL_OPT_BOX | TBL_OPT_ALLBOX) ? 1 : 0; hw = flags == TBL_OPT_DBOX || flags == TBL_OPT_BOX ? bw : - spn->pos == TBL_SPAN_DHORIZ ? 2 : 1; + sp->pos == TBL_SPAN_DHORIZ ? 2 : 1; /* Print the left end of the line. */ @@ -620,7 +623,7 @@ tbl_hrule(struct termp *tp, const struct cpn->pos != TBL_CELL_DOWN ? BRIGHT * hw : 0), 1); for (;;) { - col = tp->tbl.cols + (cpn == NULL ? cpp->col : cpn->col); + col = tp->tbl.cols + cp->col; /* Print the horizontal line inside this column. */ @@ -646,6 +649,8 @@ tbl_hrule(struct termp *tp, const struct } cpp = cpp->next; } + if (cp != NULL) + cp = cp->next; if (cpn != NULL) { if (flags != TBL_OPT_DBOX) { dw = cpn->vert; @@ -656,7 +661,7 @@ tbl_hrule(struct termp *tp, const struct while (dpn != NULL && dpn->layout != cpn) dpn = dpn->next; } - if (cpp == NULL && cpn == NULL) + if (cpp == NULL && cp == NULL && cpn == NULL) break; /* Vertical lines do not cross spanned cells. */ -- To unsubscribe send an email to tech+unsubscribe@mandoc.bsd.lv