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
prev 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).