summaryrefslogtreecommitdiffstats
path: root/tbl_layout.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2021-08-10 12:55:03 +0000
committerIngo Schwarze <schwarze@openbsd.org>2021-08-10 12:55:03 +0000
commiteaf84848c463416967ecacc10a55630fcf7f115c (patch)
tree117ec40c599172a6a7bff36a9975014afe37425f /tbl_layout.c
parent87aab9cae5c14191a96f9f17bd2723fe998eb2be (diff)
downloadmandoc-eaf84848c463416967ecacc10a55630fcf7f115c.tar.gz
Support two-character font names (BI, CW, CR, CB, CI)
in the tbl(7) layout font modifier. Get rid of the TBL_CELL_BOLD and TBL_CELL_ITALIC flags and use the usual ESCAPE_FONT* enum mandoc_esc members from mandoc.h instead, which simplifies and unifies some code. While here, also support CB and CI in roff(7) \f escape sequences and in roff(7) .ft requests for all output modes. Using those is certainly not recommended because portability is limited even with groff, but supporting them makes some existing third-party manual pages look better, in particular in HTML output mode. Bug-compatible with groff as far as i'm aware, except that i consider font names starting with the '\n' (ASCII 0x0a line feed) character so insane that i decided to not support them. Missing feature reported by nabijaczleweli dot xyz in https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=992002. I used none of the code from the initial patch submitted by nabijaczleweli, but some of their ideas. Final patch tested by them, too.
Diffstat (limited to 'tbl_layout.c')
-rw-r--r--tbl_layout.c54
1 files changed, 26 insertions, 28 deletions
diff --git a/tbl_layout.c b/tbl_layout.c
index 34952e06..7c8764e2 100644
--- a/tbl_layout.c
+++ b/tbl_layout.c
@@ -1,7 +1,8 @@
/* $Id$ */
/*
* Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2012, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2012, 2014, 2015, 2017, 2020, 2021
+ * 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
@@ -67,6 +68,8 @@ mods(struct tbl_node *tbl, struct tbl_cell *cp,
char *endptr;
unsigned long spacing;
size_t sz;
+ int isz;
+ enum mandoc_esc fontesc;
mod:
while (p[*pos] == ' ' || p[*pos] == '\t')
@@ -105,7 +108,7 @@ mod:
switch (tolower((unsigned char)p[(*pos)++])) {
case 'b':
- cp->flags |= TBL_CELL_BOLD;
+ cp->font = ESCAPE_FONTBOLD;
goto mod;
case 'd':
cp->flags |= TBL_CELL_BALIGN;
@@ -116,7 +119,7 @@ mod:
case 'f':
break;
case 'i':
- cp->flags |= TBL_CELL_ITALIC;
+ cp->font = ESCAPE_FONTITALIC;
goto mod;
case 'm':
mandoc_msg(MANDOCERR_TBLLAYOUT_MOD, ln, *pos, "m");
@@ -170,40 +173,34 @@ mod:
goto mod;
}
+ while (p[*pos] == ' ' || p[*pos] == '\t')
+ (*pos)++;
+
/* Ignore parenthised font names for now. */
if (p[*pos] == '(')
goto mod;
- /* Support only one-character font-names for now. */
-
- if (p[*pos] == '\0' || (p[*pos + 1] != ' ' && p[*pos + 1] != '.')) {
+ isz = 0;
+ if (p[*pos] != '\0')
+ isz++;
+ if (strchr(" \t.", p[*pos + isz]) == NULL)
+ isz++;
+
+ fontesc = mandoc_font(p + *pos, isz);
+
+ switch (fontesc) {
+ case ESCAPE_FONTPREV:
+ case ESCAPE_ERROR:
mandoc_msg(MANDOCERR_FT_BAD,
ln, *pos, "TS %s", p + *pos - 1);
- if (p[*pos] != '\0')
- (*pos)++;
- if (p[*pos] != '\0')
- (*pos)++;
- goto mod;
- }
-
- switch (p[(*pos)++]) {
- case '3':
- case 'B':
- cp->flags |= TBL_CELL_BOLD;
- goto mod;
- case '2':
- case 'I':
- cp->flags |= TBL_CELL_ITALIC;
- goto mod;
- case '1':
- case 'R':
- goto mod;
+ break;
default:
- mandoc_msg(MANDOCERR_FT_BAD,
- ln, *pos - 1, "TS f%c", p[*pos - 1]);
- goto mod;
+ cp->font = fontesc;
+ break;
}
+ *pos += isz;
+ goto mod;
}
static void
@@ -362,6 +359,7 @@ cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, enum tbl_cellt pos)
p = mandoc_calloc(1, sizeof(*p));
p->spacing = SIZE_MAX;
+ p->font = ESCAPE_FONTROMAN;
p->pos = pos;
if ((pp = rp->last) != NULL) {