summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorschwarze <schwarze@openbsd.org>2014-10-14 02:16:02 +0000
committerschwarze <schwarze@openbsd.org>2014-10-14 02:16:02 +0000
commit46fa2066bb963beb380e9ea6cd82c166a30a6603 (patch)
tree7d88d2aac0706616678ca90cb2b03e1b75ecec75
parentimplement font modifiers in table layouts (diff)
downloadwireguard-openbsd-46fa2066bb963beb380e9ea6cd82c166a30a6603.tar.xz
wireguard-openbsd-46fa2066bb963beb380e9ea6cd82c166a30a6603.zip
Rudimentary implementation of the e, x, and z table layout modifiers
to equalize, maximize, and ignore the width of columns. Does not yet take vertical rulers into account, and does not do line breaks within table cells. Considerably improves the lftp(1) manual; issue noticed by sthen@.
-rw-r--r--share/man/man7/tbl.720
-rw-r--r--usr.bin/mandoc/mandoc.h3
-rw-r--r--usr.bin/mandoc/out.c76
-rw-r--r--usr.bin/mandoc/out.h6
-rw-r--r--usr.bin/mandoc/tbl_html.c6
-rw-r--r--usr.bin/mandoc/tbl_layout.c7
-rw-r--r--usr.bin/mandoc/tbl_term.c4
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. */