tech@mandoc.bsd.lv
 help / color / mirror / Atom feed
* Rendering bottom of tables
@ 2019-03-15 23:27 Anthony J. Bentley
  2019-03-18 12:01 ` Ingo Schwarze
  0 siblings, 1 reply; 2+ messages in thread
From: Anthony J. Bentley @ 2019-03-15 23:27 UTC (permalink / raw)
  To: tech

Hi,

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.

-- 
Anthony J. Bentley
--
 To unsubscribe send an email to tech+unsubscribe@mandoc.bsd.lv

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Rendering bottom of tables
  2019-03-15 23:27 Rendering bottom of tables Anthony J. Bentley
@ 2019-03-18 12:01 ` Ingo Schwarze
  0 siblings, 0 replies; 2+ messages in thread
From: Ingo Schwarze @ 2019-03-18 12:01 UTC (permalink / raw)
  To: Anthony J. Bentley; +Cc: tech

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-03-18 12:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-15 23:27 Rendering bottom of tables Anthony J. Bentley
2019-03-18 12:01 ` Ingo Schwarze

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).