aboutsummaryrefslogtreecommitdiffstatshomepage
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
commitcbcd971bbd4927814d654460337a6774684b3d8f (patch)
treea16bde046faa01e1fc65164f1b20f8dc356001d7
parentb9c9c79db57653ef779df3251313389a9fe378ec (diff)
downloadmandoc-cbcd971bbd4927814d654460337a6774684b3d8f.tar.gz
mandoc-cbcd971bbd4927814d654460337a6774684b3d8f.tar.zst
mandoc-cbcd971bbd4927814d654460337a6774684b3d8f.zip
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.c45
-rw-r--r--html.h3
-rw-r--r--mandoc.c24
-rw-r--r--mandoc.h3
-rw-r--r--roff.715
-rw-r--r--term.c52
-rw-r--r--term.h3
7 files changed, 90 insertions, 55 deletions
diff --git a/html.c b/html.c
index 115b79a0..9d28b427 100644
--- a/html.c
+++ b/html.c
@@ -1,7 +1,7 @@
-/* $Id: html.c,v 1.151 2012/05/31 22:29:13 schwarze Exp $ */
+/* $Id: html.c,v 1.152 2013/08/08 20:07:47 schwarze Exp $ */
/*
* 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 9bb5cb42..894cfc4c 100644
--- a/html.h
+++ b/html.h
@@ -1,4 +1,4 @@
-/* $Id: html.h,v 1.48 2012/05/31 22:29:13 schwarze Exp $ */
+/* $Id: html.h,v 1.49 2013/08/08 20:07:47 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -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 274b7163..df510226 100644
--- a/mandoc.c
+++ b/mandoc.c
@@ -1,7 +1,7 @@
-/* $Id: mandoc.c,v 1.67 2013/06/20 22:39:30 schwarze Exp $ */
+/* $Id: mandoc.c,v 1.68 2013/08/08 20:07:47 schwarze Exp $ */
/*
* 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 560bf62a..cc4d7946 100644
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/* $Id: mandoc.h,v 1.108 2013/07/13 12:52:07 schwarze Exp $ */
+/* $Id: mandoc.h,v 1.109 2013/08/08 20:07:47 schwarze Exp $ */
/*
* Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -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 47db874d..7c26086e 100644
--- a/roff.7
+++ b/roff.7
@@ -1,4 +1,4 @@
-.\" $Id: roff.7,v 1.41 2013/07/13 19:41:16 schwarze Exp $
+.\" $Id: roff.7,v 1.42 2013/08/08 20:07:47 schwarze Exp $
.\"
.\" Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
.\" Copyright (c) 2010, 2011 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: July 13 2013 $
+.Dd $Mdocdate: August 8 2013 $
.Dt ROFF 7
.Os
.Sh NAME
@@ -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 5eef6275..4c1a8dbc 100644
--- a/term.c
+++ b/term.c
@@ -1,7 +1,7 @@
-/* $Id: term.c,v 1.208 2013/08/05 23:36:42 schwarze Exp $ */
+/* $Id: term.c,v 1.209 2013/08/08 20:07:47 schwarze Exp $ */
/*
* 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 3da11394..051080b2 100644
--- a/term.h
+++ b/term.h
@@ -1,4 +1,4 @@
-/* $Id: term.h,v 1.92 2012/05/31 22:29:13 schwarze Exp $ */
+/* $Id: term.h,v 1.93 2013/08/08 20:07:47 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -37,6 +37,7 @@ enum termfont {
TERMFONT_NONE = 0,
TERMFONT_BOLD,
TERMFONT_UNDER,
+ TERMFONT_BI,
TERMFONT__MAX
};