diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2019-02-09 21:02:47 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2019-02-09 21:02:47 +0000 |
commit | a3e97e30f7b0752d324f2a8dc6da61bc6585b822 (patch) | |
tree | 09a68b9385d2b003a08d9b289a4ad22fdcb9bc62 /tbl_term.c | |
parent | 94abcff9fc6ce36fc492979c34aafd92f5440d71 (diff) | |
download | mandoc-a3e97e30f7b0752d324f2a8dc6da61bc6585b822.tar.gz |
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@.
Diffstat (limited to 'tbl_term.c')
-rw-r--r-- | tbl_term.c | 91 |
1 files changed, 44 insertions, 47 deletions
@@ -166,7 +166,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp) 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 tbl_span *sp) (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 tbl_span *sp) 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 tbl_span *sp) } 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 tbl_span *sp) (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); } |