summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2013-08-08 20:07:47 +0000
committerIngo Schwarze <schwarze@openbsd.org>2013-08-08 20:07:47 +0000
commit35783c93c6366fa20e6ed5149c9c25091d01a222 (patch)
tree4266ad56af17b4c240366f90f69b31b3faa383b4
parent20b1a5ef7f370e238b774d0fb38b8cb6bedae40f (diff)
downloadmandoc-35783c93c6366fa20e6ed5149c9c25091d01a222.tar.gz
Implement the roff(7) font-escape sequence \f(BI "bold+italic".
This improves the formatting of about 40 base manuals and reduces groff-mandoc formatting differences in base by about 5%.
-rw-r--r--html.c43
-rw-r--r--html.h1
-rw-r--r--mandoc.c22
-rw-r--r--mandoc.h1
-rw-r--r--roff.711
-rw-r--r--term.c50
-rw-r--r--term.h1
7 files changed, 82 insertions, 47 deletions
diff --git a/html.c b/html.c
index abb868b5..8644f284 100644
--- a/html.c
+++ b/html.c
@@ -1,7 +1,7 @@
/* $Id$ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011, 2012, 2013 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
@@ -235,6 +235,9 @@ print_metaf(struct html *h, enum mandoc_esc deco)
case (ESCAPE_FONTBOLD):
font = HTMLFONT_BOLD;
break;
+ case (ESCAPE_FONTBI):
+ font = HTMLFONT_BI;
+ break;
case (ESCAPE_FONT):
/* FALLTHROUGH */
case (ESCAPE_FONTROMAN):
@@ -253,10 +256,20 @@ print_metaf(struct html *h, enum mandoc_esc deco)
h->metal = h->metac;
h->metac = font;
- if (HTMLFONT_NONE != font)
- h->metaf = HTMLFONT_BOLD == font ?
- print_otag(h, TAG_B, 0, NULL) :
- print_otag(h, TAG_I, 0, NULL);
+ switch (font) {
+ case (HTMLFONT_ITALIC):
+ h->metaf = print_otag(h, TAG_I, 0, NULL);
+ break;
+ case (HTMLFONT_BOLD):
+ h->metaf = print_otag(h, TAG_B, 0, NULL);
+ break;
+ case (HTMLFONT_BI):
+ h->metaf = print_otag(h, TAG_B, 0, NULL);
+ print_otag(h, TAG_I, 0, NULL);
+ break;
+ default:
+ break;
+ }
}
int
@@ -367,6 +380,8 @@ print_encode(struct html *h, const char *p, int norecurse)
/* FALLTHROUGH */
case (ESCAPE_FONTITALIC):
/* FALLTHROUGH */
+ case (ESCAPE_FONTBI):
+ /* FALLTHROUGH */
case (ESCAPE_FONTROMAN):
if (0 == norecurse)
print_metaf(h, esc);
@@ -544,10 +559,20 @@ print_text(struct html *h, const char *word)
}
assert(NULL == h->metaf);
- if (HTMLFONT_NONE != h->metac)
- h->metaf = HTMLFONT_BOLD == h->metac ?
- print_otag(h, TAG_B, 0, NULL) :
- print_otag(h, TAG_I, 0, NULL);
+ switch (h->metac) {
+ case (HTMLFONT_ITALIC):
+ h->metaf = print_otag(h, TAG_I, 0, NULL);
+ break;
+ case (HTMLFONT_BOLD):
+ h->metaf = print_otag(h, TAG_B, 0, NULL);
+ break;
+ case (HTMLFONT_BI):
+ h->metaf = print_otag(h, TAG_B, 0, NULL);
+ print_otag(h, TAG_I, 0, NULL);
+ break;
+ default:
+ break;
+ }
assert(word);
if ( ! print_encode(h, word, 0)) {
diff --git a/html.h b/html.h
index 2615060e..0fa4cbbf 100644
--- a/html.h
+++ b/html.h
@@ -75,6 +75,7 @@ enum htmlfont {
HTMLFONT_NONE = 0,
HTMLFONT_BOLD,
HTMLFONT_ITALIC,
+ HTMLFONT_BI,
HTMLFONT_MAX
};
diff --git a/mandoc.c b/mandoc.c
index 156bd689..b8800d99 100644
--- a/mandoc.c
+++ b/mandoc.c
@@ -1,7 +1,7 @@
/* $Id$ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011, 2012, 2013 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
@@ -296,13 +296,19 @@ mandoc_escape(const char **end, const char **start, int *sz)
switch (gly) {
case (ESCAPE_FONT):
- /*
- * Pretend that the constant-width font modes are the
- * same as the regular font modes.
- */
- if (2 == *sz && 'C' == **start) {
- (*start)++;
- (*sz)--;
+ if (2 == *sz) {
+ if ('C' == **start) {
+ /*
+ * Treat constant-width font modes
+ * just like regular font modes.
+ */
+ (*start)++;
+ (*sz)--;
+ } else {
+ if ('B' == (*start)[0] && 'I' == (*start)[1])
+ gly = ESCAPE_FONTBI;
+ break;
+ }
} else if (1 != *sz)
break;
diff --git a/mandoc.h b/mandoc.h
index 09dd6567..5aab0d97 100644
--- a/mandoc.h
+++ b/mandoc.h
@@ -380,6 +380,7 @@ enum mandoc_esc {
ESCAPE_FONT, /* a generic font mode */
ESCAPE_FONTBOLD, /* bold font mode */
ESCAPE_FONTITALIC, /* italic font mode */
+ ESCAPE_FONTBI, /* bold italic font mode */
ESCAPE_FONTROMAN, /* roman font mode */
ESCAPE_FONTPREV, /* previous font mode */
ESCAPE_NUMBERED, /* a numbered glyph */
diff --git a/roff.7 b/roff.7
index 03fa4e72..c7d5c9d5 100644
--- a/roff.7
+++ b/roff.7
@@ -146,12 +146,19 @@ respectively) may be used instead.
The indicator or numerical representative may be preceded by C
(constant-width), which is ignored.
.Pp
+The two-character indicator
+.Sq BI
+requests a font that is both bold and italic.
+It may not be portable to old roff implementations.
+.Pp
Examples:
.Bl -tag -width Ds -offset indent -compact
.It Li \efBbold\efR
-Write in bold, then switch to regular font mode.
+Write in \fBbold\fP, then switch to regular font mode.
.It Li \efIitalic\efP
-Write in italic, then return to previous font mode.
+Write in \fIitalic\fP, then return to previous font mode.
+.It Li \ef(BIbold italic\efP
+Write in \f(BIbold italic\fP, then return to previous font mode.
.El
.Pp
Text decoration is
diff --git a/term.c b/term.c
index c6cc883c..74ebcbdc 100644
--- a/term.c
+++ b/term.c
@@ -1,7 +1,7 @@
/* $Id$ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2011, 2012, 2013 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
@@ -480,6 +480,9 @@ term_word(struct termp *p, const char *word)
case (ESCAPE_FONTITALIC):
term_fontrepl(p, TERMFONT_UNDER);
break;
+ case (ESCAPE_FONTBI):
+ term_fontrepl(p, TERMFONT_BI);
+ break;
case (ESCAPE_FONT):
/* FALLTHROUGH */
case (ESCAPE_FONTROMAN):
@@ -541,27 +544,28 @@ encode1(struct termp *p, int c)
return;
}
- if (p->col + 4 >= p->maxcols)
- adjbuf(p, p->col + 4);
+ if (p->col + 6 >= p->maxcols)
+ adjbuf(p, p->col + 6);
f = term_fonttop(p);
- if (TERMFONT_NONE == f) {
- p->buf[p->col++] = c;
- return;
- } else if (TERMFONT_UNDER == f) {
+ if (TERMFONT_UNDER == f || TERMFONT_BI == f) {
p->buf[p->col++] = '_';
- } else
- p->buf[p->col++] = c;
-
- p->buf[p->col++] = 8;
+ p->buf[p->col++] = 8;
+ }
+ if (TERMFONT_BOLD == f || TERMFONT_BI == f) {
+ if (ASCII_HYPH == c)
+ p->buf[p->col++] = '-';
+ else
+ p->buf[p->col++] = c;
+ p->buf[p->col++] = 8;
+ }
p->buf[p->col++] = c;
}
static void
encode(struct termp *p, const char *word, size_t sz)
{
- enum termfont f;
int i, len;
if (TERMP_SKIPCHAR & p->flags) {
@@ -578,7 +582,7 @@ encode(struct termp *p, const char *word, size_t sz)
* character by character.
*/
- if (TERMFONT_NONE == (f = term_fonttop(p))) {
+ if (TERMFONT_NONE == term_fonttop(p)) {
if (p->col + len >= p->maxcols)
adjbuf(p, p->col + len);
for (i = 0; i < len; i++)
@@ -588,25 +592,15 @@ encode(struct termp *p, const char *word, size_t sz)
/* Pre-buffer, assuming worst-case. */
- if (p->col + 1 + (len * 3) >= p->maxcols)
- adjbuf(p, p->col + 1 + (len * 3));
+ if (p->col + 1 + (len * 5) >= p->maxcols)
+ adjbuf(p, p->col + 1 + (len * 5));
for (i = 0; i < len; i++) {
- if (ASCII_HYPH != word[i] &&
- ! isgraph((unsigned char)word[i])) {
- p->buf[p->col++] = word[i];
- continue;
- }
-
- if (TERMFONT_UNDER == f)
- p->buf[p->col++] = '_';
- else if (ASCII_HYPH == word[i])
- p->buf[p->col++] = '-';
+ if (ASCII_HYPH == word[i] ||
+ isgraph((unsigned char)word[i]))
+ encode1(p, word[i]);
else
p->buf[p->col++] = word[i];
-
- p->buf[p->col++] = 8;
- p->buf[p->col++] = word[i];
}
}
diff --git a/term.h b/term.h
index ccac729e..b33dcd89 100644
--- a/term.h
+++ b/term.h
@@ -37,6 +37,7 @@ enum termfont {
TERMFONT_NONE = 0,
TERMFONT_BOLD,
TERMFONT_UNDER,
+ TERMFONT_BI,
TERMFONT__MAX
};