summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--man.75
-rw-r--r--mdoc.78
-rw-r--r--term.c28
-rw-r--r--term.h4
4 files changed, 33 insertions, 12 deletions
diff --git a/man.7 b/man.7
index 5ab902f9..b0ff117b 100644
--- a/man.7
+++ b/man.7
@@ -109,8 +109,9 @@ and
.Ss Text Decoration
Terms may be text-decorated using the
.Sq \ef
-escape followed by an indicator: B (bold), I, (italic), or P and R
-(Roman, or reset).
+escape followed by an indicator: B (bold), I, (italic), R (Roman), or P
+(revert to previous mode). A numerical representation 3, 2, or 1
+(bold, italic, and Roman, respectively) may be used instead.
.
.
.Ss Whitespace
diff --git a/mdoc.7 b/mdoc.7
index 0a98ba3b..43fd8319 100644
--- a/mdoc.7
+++ b/mdoc.7
@@ -131,10 +131,12 @@ and
.Ss Text Decoration
Terms may be text-decorated using the
.Sq \ef
-escape followed by an indicator: B (bold), I, (italic), or P and R
-(Roman, or reset). This form is not recommended for
+escape followed by an indicator: B (bold), I, (italic), R (Roman), or P
+(revert to previous mode). A numerical representation 3, 2, or 1
+(bold, italic, and Roman, respectively) may be used instead. This form
+is not recommended for
.Nm ,
-which encourages semantic, not presentation, annotation.
+which encourages semantic annotation.
.
.
.Ss Predefined Strings
diff --git a/term.c b/term.c
index de3f2326..79132211 100644
--- a/term.c
+++ b/term.c
@@ -15,6 +15,7 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <assert.h>
+#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -373,7 +374,7 @@ do_reserved(struct termp *p, const char *word, size_t len)
static void
do_escaped(struct termp *p, const char **word)
{
- int j, type;
+ int j, type, sv;
const char *wp;
wp = *word;
@@ -428,16 +429,29 @@ do_escaped(struct termp *p, const char **word)
}
switch (*wp) {
+ case ('3'):
+ /* FALLTHROUGH */
case ('B'):
- p->bold++;
+ p->metamask = p->metafont;
+ p->metafont |= METAF_BOLD;
break;
+ case ('2'):
+ /* FALLTHROUGH */
case ('I'):
- p->under++;
+ p->metamask = p->metafont;
+ p->metafont |= METAF_UNDER;
break;
case ('P'):
+ sv = p->metamask;
+ p->metamask = p->metafont;
+ p->metafont = sv;
+ break;
+ case ('1'):
/* FALLTHROUGH */
case ('R'):
- p->bold = p->under = 0;
+ p->metamask = p->metafont;
+ p->metafont &= ~METAF_UNDER;
+ p->metafont &= ~METAF_BOLD;
break;
default:
break;
@@ -563,12 +577,12 @@ static void
encode(struct termp *p, char c)
{
- if (' ' != c) {
- if (p->under) {
+ if (isgraph((u_char)c)) {
+ if (p->under || METAF_UNDER & p->metafont) {
buffer(p, '_');
buffer(p, 8);
}
- if (p->bold) {
+ if (p->bold || METAF_BOLD & p->metafont) {
buffer(p, c);
buffer(p, 8);
}
diff --git a/term.h b/term.h
index f4f11610..ee8fd90e 100644
--- a/term.h
+++ b/term.h
@@ -43,6 +43,10 @@ struct termp {
#define TERMP_ANPREC (1 << 13) /* See termp_an_pre(). */
int bold;
int under;
+ int metafont; /* See do_escaped(). */
+#define METAF_BOLD (1 << 0)
+#define METAF_UNDER (1 << 1)
+ int metamask; /* See do_escaped(). */
char *buf; /* Output buffer. */
enum termenc enc; /* Type of encoding. */
void *symtab; /* Encoded-symbol table. */