summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2018-08-16 13:54:06 +0000
committerIngo Schwarze <schwarze@openbsd.org>2018-08-16 13:54:06 +0000
commit27f1545e0f756e82e793a38e1bc5a55d673a6261 (patch)
treeaec0540f62f2ddaaf8ca6abc5d05a59cd47da072
parent53895dc947dd04e38242df7ec586e07b9b14ba99 (diff)
downloadmandoc-27f1545e0f756e82e793a38e1bc5a55d673a6261.tar.gz
Implement the \*(.T predefined string (interpolate device name)
by allowing the preprocessor to pass it through to the formatters. Used for example by the groff_char(7) manual page.
-rw-r--r--TODO7
-rw-r--r--html.c3
-rw-r--r--mandoc.c7
-rw-r--r--mandoc.h1
-rw-r--r--mdoc_markdown.c5
-rw-r--r--regress/roff/string/Makefile5
-rw-r--r--regress/roff/string/dotT.in20
-rw-r--r--regress/roff/string/dotT.out_ascii19
-rw-r--r--regress/roff/string/dotT.out_html7
-rw-r--r--regress/roff/string/dotT.out_markdown21
-rw-r--r--regress/roff/string/dotT.out_utf819
-rw-r--r--roff.c13
-rw-r--r--term.c27
13 files changed, 144 insertions, 10 deletions
diff --git a/TODO b/TODO
index dc65e449..785a10d8 100644
--- a/TODO
+++ b/TODO
@@ -38,13 +38,6 @@ are mere guesses, and some may be wrong.
--- missing roff features ----------------------------------------------
-- \*(.T prints the device being used,
- see groff_char(7) for an example
- This is slightly hard because -Tlocale only decides to use ascii or
- utf8 when initializing the formatter, so the information is not
- yet available to the preprocessor at the parsing stage.
- loc ** exist ** algo * size * imp *
-
- .ad (adjust margins)
.ad l -- adjust left margin only (flush left)
.ad r -- adjust right margin only (flush right)
diff --git a/html.c b/html.c
index 267221cd..778e7953 100644
--- a/html.c
+++ b/html.c
@@ -433,6 +433,9 @@ print_encode(struct html *h, const char *p, const char *pend, int norecurse)
if (c <= 0)
continue;
break;
+ case ESCAPE_DEVICE:
+ print_word(h, "html");
+ continue;
case ESCAPE_BREAK:
breakline = 1;
continue;
diff --git a/mandoc.c b/mandoc.c
index 7e785312..d1b6fe93 100644
--- a/mandoc.c
+++ b/mandoc.c
@@ -139,6 +139,13 @@ mandoc_escape(const char **end, const char **start, int *sz)
break;
}
break;
+ case '*':
+ if (strncmp(*start, "(.T", 3) != 0)
+ abort();
+ gly = ESCAPE_DEVICE;
+ *start = ++*end;
+ *sz = 2;
+ break;
/*
* These escapes are of the form \X'Y', where 'X' is the trigger
diff --git a/mandoc.h b/mandoc.h
index c3d1d6a3..b44ec87f 100644
--- a/mandoc.h
+++ b/mandoc.h
@@ -431,6 +431,7 @@ enum mandoc_esc {
ESCAPE_FONTPREV, /* previous font mode */
ESCAPE_NUMBERED, /* a numbered glyph */
ESCAPE_UNICODE, /* a unicode codepoint */
+ ESCAPE_DEVICE, /* print the output device name */
ESCAPE_BREAK, /* break the output line */
ESCAPE_NOSPACE, /* suppress space if the last on a line */
ESCAPE_HORIZ, /* horizontal movement */
diff --git a/mdoc_markdown.c b/mdoc_markdown.c
index e9259744..2cb18420 100644
--- a/mdoc_markdown.c
+++ b/mdoc_markdown.c
@@ -1,6 +1,6 @@
/* $Id$ */
/*
- * Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2017, 2018 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
@@ -580,6 +580,9 @@ md_word(const char *s)
case ESCAPE_SPECIAL:
uc = mchars_spec2cp(seq, sz);
break;
+ case ESCAPE_DEVICE:
+ md_rawword("markdown");
+ continue;
case ESCAPE_FONTBOLD:
nextfont = "**";
break;
diff --git a/regress/roff/string/Makefile b/regress/roff/string/Makefile
index eda8c8ad..b8885c65 100644
--- a/regress/roff/string/Makefile
+++ b/regress/roff/string/Makefile
@@ -1,7 +1,10 @@
# $OpenBSD: Makefile,v 1.6 2014/07/06 19:08:57 schwarze Exp $
-REGRESS_TARGETS = escape infinite name std undef zerolength
+REGRESS_TARGETS = dotT escape infinite name std undef zerolength
LINT_TARGETS = name std undef
+UTF8_TARGETS = dotT
+HTML_TARGETS = dotT
+SKIP_MARKDOWN = escape infinite name std undef zerolength
# The infinite test fails badly with groff-1.20.1:
# It fails to print the following text.
diff --git a/regress/roff/string/dotT.in b/regress/roff/string/dotT.in
new file mode 100644
index 00000000..6ff81598
--- /dev/null
+++ b/regress/roff/string/dotT.in
@@ -0,0 +1,20 @@
+.\" $OpenBSD: dotT.in,v 1.1 2018/08/16 13:49:40 schwarze Exp $
+.Dd $Mdocdate$
+.Dt STRING-DOTT 1
+.Os
+.Sh NAME
+.Nm string-dotT
+.Nd interpolating the device name
+.Sh DESCRIPTION
+initial text
+.Pp
+BEGINTEST
+.Pp
+We are using the \*(.T device.
+.Pp
+.ds .T name
+The device \*(.T can be overridden.
+.Pp
+ENDTEST
+.Pp
+final text
diff --git a/regress/roff/string/dotT.out_ascii b/regress/roff/string/dotT.out_ascii
new file mode 100644
index 00000000..e1737090
--- /dev/null
+++ b/regress/roff/string/dotT.out_ascii
@@ -0,0 +1,19 @@
+STRING-DOTT(1) General Commands Manual STRING-DOTT(1)
+
+NNAAMMEE
+ ssttrriinngg--ddoottTT - interpolating the device name
+
+DDEESSCCRRIIPPTTIIOONN
+ initial text
+
+ BEGINTEST
+
+ We are using the ascii device.
+
+ The device name can be overridden.
+
+ ENDTEST
+
+ final text
+
+OpenBSD August 16, 2018 OpenBSD
diff --git a/regress/roff/string/dotT.out_html b/regress/roff/string/dotT.out_html
new file mode 100644
index 00000000..67cb1eed
--- /dev/null
+++ b/regress/roff/string/dotT.out_html
@@ -0,0 +1,7 @@
+BEGINTEST
+<div class="Pp"></div>
+We are using the html device.
+<div class="Pp"></div>
+The device name can be overridden.
+<div class="Pp"></div>
+ENDTEST
diff --git a/regress/roff/string/dotT.out_markdown b/regress/roff/string/dotT.out_markdown
new file mode 100644
index 00000000..5a1f8d09
--- /dev/null
+++ b/regress/roff/string/dotT.out_markdown
@@ -0,0 +1,21 @@
+STRING-DOTT(1) - General Commands Manual
+
+# NAME
+
+**string-dotT** - interpolating the device name
+
+# DESCRIPTION
+
+initial text
+
+BEGINTEST
+
+We are using the markdown device.
+
+The device name can be overridden.
+
+ENDTEST
+
+final text
+
+OpenBSD - August 16, 2018
diff --git a/regress/roff/string/dotT.out_utf8 b/regress/roff/string/dotT.out_utf8
new file mode 100644
index 00000000..827b3994
--- /dev/null
+++ b/regress/roff/string/dotT.out_utf8
@@ -0,0 +1,19 @@
+STRING-DOTT(1) General Commands Manual STRING-DOTT(1)
+
+NNAAMMEE
+ ssttrriinngg--ddoottTT – interpolating the device name
+
+DDEESSCCRRIIPPTTIIOONN
+ initial text
+
+ BEGINTEST
+
+ We are using the utf8 device.
+
+ The device name can be overridden.
+
+ ENDTEST
+
+ final text
+
+OpenBSD August 16, 2018 OpenBSD
diff --git a/roff.c b/roff.c
index dde46486..c5efc2d7 100644
--- a/roff.c
+++ b/roff.c
@@ -1367,6 +1367,19 @@ roff_res(struct roff *r, struct buf *buf, int ln, int pos)
if (arg_complete) {
deftype = ROFFDEF_USER | ROFFDEF_PRE;
res = roff_getstrn(r, stnam, naml, &deftype);
+
+ /*
+ * If not overriden, let \*(.T
+ * through to the formatters.
+ */
+
+ if (res == NULL && naml == 2 &&
+ stnam[0] == '.' && stnam[1] == 'T') {
+ roff_setstrn(&r->strtab,
+ ".T", 2, NULL, 0, 0);
+ stesc--;
+ continue;
+ }
}
break;
case 'B':
diff --git a/term.c b/term.c
index a69f8c3d..52d3fa68 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-2017 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010-2018 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
@@ -525,6 +525,16 @@ term_word(struct termp *p, const char *word)
else if (*word == '\0')
p->flags |= (TERMP_NOSPACE | TERMP_NONEWLINE);
continue;
+ case ESCAPE_DEVICE:
+ if (p->type == TERMTYPE_PDF)
+ encode(p, "pdf", 3);
+ else if (p->type == TERMTYPE_PS)
+ encode(p, "ps", 2);
+ else if (p->enc == TERMENC_ASCII)
+ encode(p, "ascii", 5);
+ else
+ encode(p, "utf8", 4);
+ continue;
case ESCAPE_HORIZ:
if (*seq == '|') {
seq++;
@@ -860,6 +870,21 @@ term_strlen(const struct termp *p, const char *cp)
sz += cond_width(p, uc, &skip);
}
continue;
+ case ESCAPE_DEVICE:
+ if (p->type == TERMTYPE_PDF) {
+ rhs = "pdf";
+ rsz = 3;
+ } else if (p->type == TERMTYPE_PS) {
+ rhs = "ps";
+ rsz = 2;
+ } else if (p->enc == TERMENC_ASCII) {
+ rhs = "ascii";
+ rsz = 5;
+ } else {
+ rhs = "utf8";
+ rsz = 4;
+ }
+ break;
case ESCAPE_SKIPCHAR:
skip = 1;
continue;