diff options
-rw-r--r-- | share/man/man7/tbl.7 | 20 | ||||
-rw-r--r-- | usr.bin/mandoc/mandoc.h | 3 | ||||
-rw-r--r-- | usr.bin/mandoc/out.c | 76 | ||||
-rw-r--r-- | usr.bin/mandoc/out.h | 6 | ||||
-rw-r--r-- | usr.bin/mandoc/tbl_html.c | 6 | ||||
-rw-r--r-- | usr.bin/mandoc/tbl_layout.c | 7 | ||||
-rw-r--r-- | usr.bin/mandoc/tbl_term.c | 4 |
7 files changed, 103 insertions, 19 deletions
diff --git a/share/man/man7/tbl.7 b/share/man/man7/tbl.7 index 082a399d6c6..2f5590607a1 100644 --- a/share/man/man7/tbl.7 +++ b/share/man/man7/tbl.7 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tbl.7,v 1.6 2014/10/13 23:31:26 schwarze Exp $ +.\" $OpenBSD: tbl.7,v 1.7 2014/10/14 02:16:02 schwarze Exp $ .\" .\" Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> .\" Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org> @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: October 13 2014 $ +.Dd $Mdocdate: October 14 2014 $ .Dt TBL 7 .Os .Sh NAME @@ -248,6 +248,11 @@ The following case-insensitive modifier keys are available: .Bl -tag -width 2n .It Cm b Use a bold font for the contents of this column. +.It Cm e +Make this column wider to match the maximum width +of any other column also having the +.Cm e +modifier. .It Cm f The next character selects the font to use for this column. See the @@ -255,16 +260,21 @@ See the manual for supported one-character font names. .It Cm i Use an italic font for the contents of this column. +.It Cm x +After determining the width of all other columns, distribute the +rest of the line length among all columns having the +.Cm x +modifier. +.It Cm z +Do not use this cell for determining the width of this column. .El .Pp The modifiers .Cm d , -.Cm e , -.Cm r , .Cm t , .Cm u , and -.Cm z +.Cm w are ignored by .Xr mandoc 1 . .Pp diff --git a/usr.bin/mandoc/mandoc.h b/usr.bin/mandoc/mandoc.h index ce7f9040251..e2c8975a478 100644 --- a/usr.bin/mandoc/mandoc.h +++ b/usr.bin/mandoc/mandoc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mandoc.h,v 1.105 2014/10/12 19:10:56 schwarze Exp $ */ +/* $OpenBSD: mandoc.h,v 1.106 2014/10/14 02:16:02 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org> @@ -246,6 +246,7 @@ struct tbl_cell { #define TBL_CELL_EQUAL (1 << 4) /* e, E */ #define TBL_CELL_UP (1 << 5) /* u, U */ #define TBL_CELL_WIGN (1 << 6) /* z, Z */ +#define TBL_CELL_WMAX (1 << 7) /* x, X */ struct tbl_head *head; }; diff --git a/usr.bin/mandoc/out.c b/usr.bin/mandoc/out.c index 09c910c9927..cf33aa6edb0 100644 --- a/usr.bin/mandoc/out.c +++ b/usr.bin/mandoc/out.c @@ -1,7 +1,7 @@ -/* $Id: out.c,v 1.23 2014/08/12 19:27:57 schwarze Exp $ */ +/* $OpenBSD: out.c,v 1.24 2014/10/14 02:16:02 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> - * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org> + * Copyright (c) 2011, 2014 Ingo Schwarze <schwarze@openbsd.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -137,11 +137,14 @@ a2roffsu(const char *src, struct roffsu *dst, enum roffscale def) * used for the actual width calculations. */ void -tblcalc(struct rofftbl *tbl, const struct tbl_span *sp) +tblcalc(struct rofftbl *tbl, const struct tbl_span *sp, + size_t totalwidth) { const struct tbl_dat *dp; struct roffcol *col; + size_t ewidth, xwidth; int spans; + int icol, maxcol, necol, nxcol; /* * Allocate the master column specifiers. These will hold the @@ -153,7 +156,7 @@ tblcalc(struct rofftbl *tbl, const struct tbl_span *sp) tbl->cols = mandoc_calloc((size_t)sp->opts->cols, sizeof(struct roffcol)); - for ( ; sp; sp = sp->next) { + for (maxcol = 0; sp; sp = sp->next) { if (TBL_SPAN_DATA != sp->pos) continue; spans = 1; @@ -168,11 +171,72 @@ tblcalc(struct rofftbl *tbl, const struct tbl_span *sp) spans = dp->spans; if (1 < spans) continue; - assert(dp->layout); - col = &tbl->cols[dp->layout->head->ident]; + icol = dp->layout->head->ident; + if (maxcol < icol) + maxcol = icol; + col = tbl->cols + icol; + col->flags |= dp->layout->flags; + if (dp->layout->flags & TBL_CELL_WIGN) + continue; tblcalc_data(tbl, col, sp->opts, dp); } } + + /* + * Count columns to equalize and columns to maximize. + * Find maximum width of the columns to equalize. + * Find total width of the columns *not* to maximize. + */ + + necol = nxcol = 0; + ewidth = xwidth = 0; + for (icol = 0; icol <= maxcol; icol++) { + col = tbl->cols + icol; + if (col->flags & TBL_CELL_EQUAL) { + necol++; + if (ewidth < col->width) + ewidth = col->width; + } + if (col->flags & TBL_CELL_WMAX) + nxcol++; + else + xwidth += col->width; + } + + /* + * Equalize columns, if requested for any of them. + * Update total width of the columns not to maximize. + */ + + if (necol) { + for (icol = 0; icol <= maxcol; icol++) { + col = tbl->cols + icol; + if ( ! (col->flags & TBL_CELL_EQUAL)) + continue; + if (col->width == ewidth) + continue; + if (nxcol && totalwidth) + xwidth += ewidth - col->width; + col->width = ewidth; + } + } + + /* + * If there are any columns to maximize, find the total + * available width, deducting 3n margins between columns. + * Distribute the available width evenly. + */ + + if (nxcol && totalwidth) { + xwidth = totalwidth - 3*maxcol - xwidth; + for (icol = 0; icol <= maxcol; icol++) { + col = tbl->cols + icol; + if ( ! (col->flags & TBL_CELL_WMAX)) + continue; + col->width = xwidth / nxcol--; + xwidth -= col->width; + } + } } static void diff --git a/usr.bin/mandoc/out.h b/usr.bin/mandoc/out.h index 424a6e0dd9f..57dd409970a 100644 --- a/usr.bin/mandoc/out.h +++ b/usr.bin/mandoc/out.h @@ -1,4 +1,4 @@ -/* $Id: out.h,v 1.14 2014/08/12 19:19:42 schwarze Exp $ */ +/* $OpenBSD: out.h,v 1.15 2014/10/14 02:16:02 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * @@ -34,6 +34,7 @@ enum roffscale { struct roffcol { size_t width; /* width of cell */ size_t decimal; /* decimal position in cell */ + int flags; /* layout flags, see tbl_cell */ }; struct roffsu { @@ -64,7 +65,8 @@ __BEGIN_DECLS while (/* CONSTCOND */ 0) int a2roffsu(const char *, struct roffsu *, enum roffscale); -void tblcalc(struct rofftbl *tbl, const struct tbl_span *); +void tblcalc(struct rofftbl *tbl, + const struct tbl_span *, size_t); __END_DECLS diff --git a/usr.bin/mandoc/tbl_html.c b/usr.bin/mandoc/tbl_html.c index 86e930d68ea..34382121c65 100644 --- a/usr.bin/mandoc/tbl_html.c +++ b/usr.bin/mandoc/tbl_html.c @@ -1,4 +1,4 @@ -/* $Id: tbl_html.c,v 1.7 2014/04/20 16:44:44 schwarze Exp $ */ +/* $OpenBSD: tbl_html.c,v 1.8 2014/10/14 02:16:02 schwarze Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> * @@ -14,6 +14,8 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include <sys/types.h> + #include <assert.h> #include <stdio.h> #include <stdlib.h> @@ -53,7 +55,7 @@ html_tblopen(struct html *h, const struct tbl_span *sp) if (TBL_SPAN_FIRST & sp->flags) { h->tbl.len = html_tbl_len; h->tbl.slen = html_tbl_strlen; - tblcalc(&h->tbl, sp); + tblcalc(&h->tbl, sp, 0); } assert(NULL == h->tblt); diff --git a/usr.bin/mandoc/tbl_layout.c b/usr.bin/mandoc/tbl_layout.c index d1b5f0d28ff..0dfaf62cf5f 100644 --- a/usr.bin/mandoc/tbl_layout.c +++ b/usr.bin/mandoc/tbl_layout.c @@ -1,4 +1,4 @@ -/* $Id: tbl_layout.c,v 1.15 2014/10/07 14:06:14 schwarze Exp $ */ +/* $OpenBSD: tbl_layout.c,v 1.16 2014/10/14 02:16:02 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2012, 2014 Ingo Schwarze <schwarze@openbsd.org> @@ -15,6 +15,8 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include <sys/types.h> + #include <ctype.h> #include <stdlib.h> #include <string.h> @@ -164,6 +166,9 @@ mod: goto mod; case 'w': /* XXX for now, ignore minimal column width */ goto mod; + case 'x': + cp->flags |= TBL_CELL_WMAX; + goto mod; case 'f': break; case 'r': diff --git a/usr.bin/mandoc/tbl_term.c b/usr.bin/mandoc/tbl_term.c index eb515287b5b..fee39ee9f2b 100644 --- a/usr.bin/mandoc/tbl_term.c +++ b/usr.bin/mandoc/tbl_term.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tbl_term.c,v 1.17 2014/10/13 23:31:26 schwarze Exp $ */ +/* $OpenBSD: tbl_term.c,v 1.18 2014/10/14 02:16:02 schwarze Exp $ */ /* * Copyright (c) 2009, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2011, 2012, 2014 Ingo Schwarze <schwarze@openbsd.org> @@ -89,7 +89,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp) tp->tbl.slen = term_tbl_strlen; tp->tbl.arg = tp; - tblcalc(&tp->tbl, sp); + tblcalc(&tp->tbl, sp, rmargin - tp->offset); } /* Horizontal frame at the start of boxed tables. */ |