From: schwarze@mandoc.bsd.lv
To: source@mandoc.bsd.lv
Subject: mandoc: When drawing a horizontal line in tbl(7) UTF-8 output, it is not
Date: Sat, 16 Mar 2019 16:36:18 -0500 (EST) [thread overview]
Message-ID: <e3f201547ae1f99b@fantadrom.bsd.lv> (raw)
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 source+unsubscribe@mandoc.bsd.lv
reply other threads:[~2019-03-16 21:36 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=e3f201547ae1f99b@fantadrom.bsd.lv \
--to=schwarze@mandoc.bsd.lv \
--cc=source@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).