diff options
-rw-r--r-- | tbl.7 | 5 | ||||
-rw-r--r-- | tbl_data.c | 20 | ||||
-rw-r--r-- | tbl_layout.c | 14 | ||||
-rw-r--r-- | tbl_term.c | 23 |
4 files changed, 46 insertions, 16 deletions
@@ -277,7 +277,10 @@ If the last cell of a line is .Cm T{ , all subsequent lines are included as part of the cell until .Cm T} -is specified on its own line. +is specified as its own data cell. +It may then be followed by a tab +.Pq or as designated by Cm tab +or an end-of-line to terminate the row. .Sh COMPATIBILITY This section documents compatibility between mandoc and other .Nm @@ -118,15 +118,27 @@ tbl_cdata(struct tbl_node *tbl, int ln, const char *p) { struct tbl_dat *dat; size_t sz; + int pos; - if (0 == strcmp(p, "T}")) { - tbl->part = TBL_PART_DATA; - return(1); - } + pos = 0; dat = tbl->last_span->last; dat->pos = TBL_DATA_DATA; + if (p[pos] == 'T' && p[pos + 1] == '}') { + pos += 2; + if (p[pos] == tbl->opts.tab) { + tbl->part = TBL_PART_DATA; + pos++; + return(data(tbl, tbl->last_span, ln, p, &pos)); + } else if ('\0' == p[pos]) { + tbl->part = TBL_PART_DATA; + return(1); + } + + /* Fallthrough: T} is part of a word. */ + } + if (dat->string) { sz = strlen(p) + strlen(dat->string) + 2; dat->string = mandoc_realloc(dat->string, sz); diff --git a/tbl_layout.c b/tbl_layout.c index 20c774bc..50e9728d 100644 --- a/tbl_layout.c +++ b/tbl_layout.c @@ -90,6 +90,20 @@ mod: break; } + /* Throw away parenthesised expression. */ + + if ('(' == p[*pos]) { + (*pos)++; + while (p[*pos] && ')' != p[*pos]) + (*pos)++; + if (')' == p[*pos]) { + (*pos)++; + goto mod; + } + TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos); + return(0); + } + /* Parse numerical spacing from modifier string. */ if (isdigit((unsigned char)p[*pos])) { @@ -272,7 +272,7 @@ tbl_data(struct termp *tp, const struct tbl *tbl, break; } - pos = dp->layout ? dp->layout->pos : TBL_CELL_LEFT; + pos = dp && dp->layout ? dp->layout->pos : TBL_CELL_LEFT; switch (pos) { case (TBL_CELL_HORIZ): @@ -344,34 +344,37 @@ tbl_literal(struct termp *tp, const struct tbl_dat *dp, { size_t padl, padr, ssz; enum tbl_cellt pos; + const char *str; padl = padr = 0; - pos = dp->layout ? dp->layout->pos : TBL_CELL_LEFT; + pos = dp && dp->layout ? dp->layout->pos : TBL_CELL_LEFT; + str = dp && dp->string ? dp->string : ""; + ssz = term_len(tp, 1); switch (pos) { case (TBL_CELL_LONG): padl = ssz; - padr = col->width - term_strlen(tp, dp->string) - ssz; + padr = col->width - term_strlen(tp, str) - ssz; break; case (TBL_CELL_CENTRE): - padl = col->width - term_strlen(tp, dp->string); + padl = col->width - term_strlen(tp, str); if (padl % 2) padr++; padl /= 2; padr += padl; break; case (TBL_CELL_RIGHT): - padl = col->width - term_strlen(tp, dp->string); + padl = col->width - term_strlen(tp, str); break; default: - padr = col->width - term_strlen(tp, dp->string); + padr = col->width - term_strlen(tp, str); break; } tbl_char(tp, ASCII_NBRSP, padl); - term_word(tp, dp->string); + term_word(tp, str); tbl_char(tp, ASCII_NBRSP, padr); } @@ -391,9 +394,7 @@ tbl_number(struct termp *tp, const struct tbl *tbl, * and the maximum decimal; right-pad by the remaining amount. */ - str = ""; - if (dp->string) - str = dp->string; + str = dp && dp->string ? dp->string : ""; sz = term_strlen(tp, str); @@ -418,7 +419,7 @@ tbl_number(struct termp *tp, const struct tbl *tbl, padl = col->decimal - d; tbl_char(tp, ASCII_NBRSP, padl); - term_word(tp, dp->string); + term_word(tp, str); tbl_char(tp, ASCII_NBRSP, col->width - sz - padl); } |