diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2013-08-08 20:07:47 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2013-08-08 20:07:47 +0000 |
commit | 35783c93c6366fa20e6ed5149c9c25091d01a222 (patch) | |
tree | 4266ad56af17b4c240366f90f69b31b3faa383b4 /term.c | |
parent | 20b1a5ef7f370e238b774d0fb38b8cb6bedae40f (diff) | |
download | mandoc-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%.
Diffstat (limited to 'term.c')
-rw-r--r-- | term.c | 50 |
1 files changed, 22 insertions, 28 deletions
@@ -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]; } } |