tech@mandoc.bsd.lv
 help / color / mirror / Atom feed
From: Ingo Schwarze <schwarze@usta.de>
To: "Anthony J. Bentley" <anthony@anjbe.name>
Cc: tech@mandoc.bsd.lv
Subject: Re: table borders don't span entire width
Date: Sat, 9 Feb 2019 22:06:55 +0100	[thread overview]
Message-ID: <20190209210655.GI37934@athene.usta.de> (raw)
In-Reply-To: <20190208220221.GF20044@athene.usta.de>

Hi,

Ingo Schwarze wrote on Fri, Feb 08, 2019 at 11:02:21PM +0100:
> Anthony J. Bentley wrote on Fri, Feb 08, 2019 at 02:43:45PM -0700:

>> I tried out an example from The Awk Programming Language.
>> The tbl(7) source it generates looks in part like this:
>> 
>> .TS
>> center;
>> n n n n.
>> _	_	_	_
>> 2173	77.1	13765	53.6
>> =	=	=	=
>> .TE
>> 
>> groff creates solid lines as in the book:
>> 
>>                    ---------------------------
>>                    2173   77.1   13765   53.6
>>                    ---------------------------
>> 
>> But mandoc breaks the lines between cells:
>> 
>>                           ----   ----   -----   ----
>>                           2173   77.1   13765   53.6
>>                           ====   ====   =====   ====

> That looks like a bug.
> Here is what the tbl(7) manual page says:
> 
>      If a data cell contains only the single character '_' or '=',
>      a single or double horizontal line is drawn across the cell,
>      joining its neighbours.  If a data cells contains only the two
>      character sequence '\_' or '\=', a single or double horizontal
>      line is drawn inside the cell, not joining its neighbours.

Fixed with the commit below.
More testing is welcome.

Yours,
  Ingo


Log Message:
-----------
The horizontal line in a data cell containing only "_" or "="
connects to the horizontally adjacent vertical line or cell;
fixing a bug reported by bentley@.

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.67
retrieving revision 1.68
diff -Ltbl_term.c -Ltbl_term.c -u -p -r1.67 -r1.68
--- tbl_term.c
+++ tbl_term.c
@@ -166,7 +166,7 @@ term_tbl(struct termp *tp, const struct 
 	size_t		 	 save_offset;
 	size_t			 coloff, tsz;
 	int			 hspans, ic, more;
-	int			 dvert, fc, horiz, line, uvert;
+	int			 dvert, fc, horiz, lhori, rhori, uvert;
 
 	/* Inhibit printing of spaces: we do padding ourselves. */
 
@@ -325,11 +325,13 @@ term_tbl(struct termp *tp, const struct 
 		    (horiz || (IS_HORIZ(sp->layout->first) &&
 		      !IS_HORIZ(sp->prev->layout->first))))
 			uvert = sp->prev->layout->vert;
-		line = sp->pos == TBL_SPAN_DHORIZ ||
+		rhori = sp->pos == TBL_SPAN_DHORIZ ||
+		    (sp->first != NULL && sp->first->pos == TBL_DATA_DHORIZ) ||
 		    sp->layout->first->pos == TBL_CELL_DHORIZ ? 2 :
 		    sp->pos == TBL_SPAN_HORIZ ||
+		    (sp->first != NULL && sp->first->pos == TBL_DATA_HORIZ) ||
 		    sp->layout->first->pos == TBL_CELL_HORIZ ? 1 : 0;
-		fc = BUP * uvert + BDOWN * dvert + BRIGHT * line;
+		fc = BUP * uvert + BDOWN * dvert + BRIGHT * rhori;
 		if (uvert > 0 || dvert > 0 || (horiz && sp->opts->lvert)) {
 			(*tp->advance)(tp, tp->tcols->offset);
 			tp->viscol = tp->tcol->offset;
@@ -402,6 +404,15 @@ term_tbl(struct termp *tp, const struct 
 					cpn = cpn->next;
 				}
 
+				lhori = (cp != NULL &&
+				     cp->pos == TBL_CELL_DHORIZ) ||
+				    (dp != NULL &&
+				     dp->pos == TBL_DATA_DHORIZ) ? 2 :
+				    (cp != NULL &&
+				     cp->pos == TBL_CELL_HORIZ) ||
+				    (dp != NULL &&
+				     dp->pos == TBL_DATA_HORIZ) ? 1 : 0;
+
 				/*
 				 * Skip later cells in a span,
 				 * figure out whether to start a span,
@@ -454,57 +465,36 @@ term_tbl(struct termp *tp, const struct 
 				}
 				while (tp->viscol < tp->tcol->rmargin +
 				    tp->tbl.cols[ic].spacing / 2)
-					tbl_direct_border(tp, fc, 1);
+					tbl_direct_border(tp,
+					    BHORIZ * lhori, 1);
 
 				if (tp->tcol + 1 == tp->tcols + tp->lasttcol)
 					continue;
 
-				if (cp != NULL) {
-					switch (cp->pos) {
-					case TBL_CELL_HORIZ:
-						fc = BLEFT;
-						break;
-					case TBL_CELL_DHORIZ:
-						fc = BLEFT * 2;
-						break;
-					default:
-						fc = 0;
-						break;
-					}
+				if (cp != NULL)
 					cp = cp->next;
-				}
-				if (cp != NULL) {
-					switch (cp->pos) {
-					case TBL_CELL_HORIZ:
-						fc += BRIGHT;
-						break;
-					case TBL_CELL_DHORIZ:
-						fc += BRIGHT * 2;
-						break;
-					default:
-						break;
-					}
-				}
+
+				rhori = (cp != NULL &&
+				     cp->pos == TBL_CELL_DHORIZ) ||
+				    (dp != NULL &&
+				     dp->pos == TBL_DATA_DHORIZ) ? 2 :
+				    (cp != NULL &&
+				     cp->pos == TBL_CELL_HORIZ) ||
+				    (dp != NULL &&
+				     dp->pos == TBL_DATA_HORIZ) ? 1 : 0;
+
 				if (tp->tbl.cols[ic].spacing)
-					tbl_direct_border(tp, fc +
+					tbl_direct_border(tp,
+					    BLEFT * lhori + BRIGHT * rhori +
 					    BUP * uvert + BDOWN * dvert, 1);
 
 				if (tp->enc == TERMENC_UTF8)
 					uvert = dvert = 0;
 
-				if (fc != 0) {
-					if (cp != NULL &&
-					    cp->pos == TBL_CELL_HORIZ)
-						fc = BHORIZ;
-					else if (cp != NULL &&
-					    cp->pos == TBL_CELL_DHORIZ)
-						fc = BHORIZ * 2;
-					else
-						fc = 0;
-				}
 				if (tp->tbl.cols[ic].spacing > 2 &&
-				    (uvert > 1 || dvert > 1 || fc != 0))
-					tbl_direct_border(tp, fc +
+				    (uvert > 1 || dvert > 1 || rhori))
+					tbl_direct_border(tp,
+					    BHORIZ * rhori +
 					    BUP * (uvert > 1) +
 					    BDOWN * (dvert > 1), 1);
 			}
@@ -528,20 +518,27 @@ term_tbl(struct termp *tp, const struct 
 		    (horiz || (IS_HORIZ(sp->layout->last) &&
 		     !IS_HORIZ(sp->prev->layout->last))))
 			uvert = sp->prev->layout->last->vert;
-		line = sp->pos == TBL_SPAN_DHORIZ ||
+		lhori = sp->pos == TBL_SPAN_DHORIZ ||
+		    (sp->last != NULL &&
+		     sp->last->pos == TBL_DATA_DHORIZ &&
+		     sp->last->layout->col + 1 == sp->opts->cols) ||
 		    (sp->layout->last->pos == TBL_CELL_DHORIZ &&
 		     sp->layout->last->col + 1 == sp->opts->cols) ? 2 :
 		    sp->pos == TBL_SPAN_HORIZ ||
+		    (sp->last != NULL &&
+		     sp->last->pos == TBL_DATA_HORIZ &&
+		     sp->last->layout->col + 1 == sp->opts->cols) ||
 		    (sp->layout->last->pos == TBL_CELL_HORIZ &&
 		     sp->layout->last->col + 1 == sp->opts->cols) ? 1 : 0;
-		fc = BUP * uvert + BDOWN * dvert + BLEFT * line;
+		fc = BUP * uvert + BDOWN * dvert + BLEFT * lhori;
 		if (uvert > 0 || dvert > 0 || (horiz && sp->opts->rvert)) {
 			if (horiz == 0 && (IS_HORIZ(sp->layout->last) == 0 ||
 			    sp->layout->last->col + 1 < sp->opts->cols)) {
 				tp->tcol++;
-				(*tp->advance)(tp,
-				    tp->tcol->offset > tp->viscol ?
-				    tp->tcol->offset - tp->viscol : 1);
+				do {
+					tbl_direct_border(tp,
+					    BHORIZ * lhori, 1);
+				} while (tp->viscol < tp->tcol->offset);
 			}
 			tbl_direct_border(tp, fc, 1);
 		}
--
 To unsubscribe send an email to tech+unsubscribe@mandoc.bsd.lv

      parent reply	other threads:[~2019-02-09 21:06 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-08 21:43 Anthony J. Bentley
2019-02-08 22:02 ` Ingo Schwarze
2019-02-08 22:39   ` Ingo Schwarze
2019-02-08 23:18     ` Anthony J. Bentley
2019-02-09 16:55       ` Ingo Schwarze
2019-02-09 21:06   ` Ingo Schwarze [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190209210655.GI37934@athene.usta.de \
    --to=schwarze@usta.de \
    --cc=anthony@anjbe.name \
    --cc=tech@mandoc.bsd.lv \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).