Implement the \*(.T predefined string (interpolate device name)
authorschwarze <schwarze@openbsd.org>
Thu, 16 Aug 2018 13:49:40 +0000 (13:49 +0000)
committerschwarze <schwarze@openbsd.org>
Thu, 16 Aug 2018 13:49:40 +0000 (13:49 +0000)
by allowing the preprocessor to pass it through to the formatters.
Used for example by the groff_char(7) manual page.

12 files changed:
regress/usr.bin/mandoc/roff/string/Makefile
regress/usr.bin/mandoc/roff/string/dotT.in [new file with mode: 0644]
regress/usr.bin/mandoc/roff/string/dotT.out_ascii [new file with mode: 0644]
regress/usr.bin/mandoc/roff/string/dotT.out_html [new file with mode: 0644]
regress/usr.bin/mandoc/roff/string/dotT.out_markdown [new file with mode: 0644]
regress/usr.bin/mandoc/roff/string/dotT.out_utf8 [new file with mode: 0644]
usr.bin/mandoc/html.c
usr.bin/mandoc/mandoc.c
usr.bin/mandoc/mandoc.h
usr.bin/mandoc/mdoc_markdown.c
usr.bin/mandoc/roff.c
usr.bin/mandoc/term.c

index bbc787a..32f192a 100644 (file)
@@ -1,7 +1,10 @@
-# $OpenBSD: Makefile,v 1.8 2018/04/09 02:31:37 schwarze Exp $
+# $OpenBSD: Makefile,v 1.9 2018/08/16 13:49:40 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/usr.bin/mandoc/roff/string/dotT.in b/regress/usr.bin/mandoc/roff/string/dotT.in
new file mode 100644 (file)
index 0000000..06c544d
--- /dev/null
@@ -0,0 +1,20 @@
+.\" $OpenBSD: dotT.in,v 1.1 2018/08/16 13:49:40 schwarze Exp $
+.Dd $Mdocdate: August 16 2018 $
+.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/usr.bin/mandoc/roff/string/dotT.out_ascii b/regress/usr.bin/mandoc/roff/string/dotT.out_ascii
new file mode 100644 (file)
index 0000000..e173709
--- /dev/null
@@ -0,0 +1,19 @@
+STRING-DOTT(1)              General Commands Manual             STRING-DOTT(1)
+
+N\bNA\bAM\bME\bE
+     s\bst\btr\bri\bin\bng\bg-\b-d\bdo\bot\btT\bT - interpolating the device name
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+     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/usr.bin/mandoc/roff/string/dotT.out_html b/regress/usr.bin/mandoc/roff/string/dotT.out_html
new file mode 100644 (file)
index 0000000..67cb1ee
--- /dev/null
@@ -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/usr.bin/mandoc/roff/string/dotT.out_markdown b/regress/usr.bin/mandoc/roff/string/dotT.out_markdown
new file mode 100644 (file)
index 0000000..5a1f8d0
--- /dev/null
@@ -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/usr.bin/mandoc/roff/string/dotT.out_utf8 b/regress/usr.bin/mandoc/roff/string/dotT.out_utf8
new file mode 100644 (file)
index 0000000..827b399
--- /dev/null
@@ -0,0 +1,19 @@
+STRING-DOTT(1)              General Commands Manual             STRING-DOTT(1)
+
+N\bNA\bAM\bME\bE
+     s\bst\btr\bri\bin\bng\bg-\b-d\bdo\bot\btT\bT – interpolating the device name
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+     initial text
+
+     BEGINTEST
+
+     We are using the utf8 device.
+
+     The device name can be overridden.
+
+     ENDTEST
+
+     final text
+
+OpenBSD                         August 16, 2018                        OpenBSD
index c882174..4b758ed 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: html.c,v 1.108 2018/06/25 16:54:55 schwarze Exp $ */
+/*     $OpenBSD: html.c,v 1.109 2018/08/16 13:49:40 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -431,6 +431,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;
index c33c2a1..0e19486 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mandoc.c,v 1.73 2018/08/10 22:12:40 schwarze Exp $ */
+/*     $OpenBSD: mandoc.c,v 1.74 2018/08/16 13:49:40 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -137,6 +137,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
index 50b2c28..79ddd10 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mandoc.h,v 1.190 2018/07/28 18:32:30 schwarze Exp $ */
+/*     $OpenBSD: mandoc.h,v 1.191 2018/08/16 13:49:40 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -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 */
index 104bb02..2789efb 100644 (file)
@@ -1,6 +1,6 @@
-/*     $OpenBSD: mdoc_markdown.c,v 1.24 2018/04/11 17:10:35 schwarze Exp $ */
+/*     $OpenBSD: mdoc_markdown.c,v 1.25 2018/08/16 13:49:40 schwarze Exp $ */
 /*
- * 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;
index 71b595a..6c6261e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: roff.c,v 1.202 2018/08/10 04:41:21 schwarze Exp $ */
+/*     $OpenBSD: roff.c,v 1.203 2018/08/16 13:49:40 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -1365,6 +1365,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':
index 239865f..317302e 100644 (file)
@@ -1,7 +1,7 @@
-/*     $OpenBSD: term.c,v 1.134 2017/07/28 14:24:17 florian Exp $ */
+/*     $OpenBSD: term.c,v 1.135 2018/08/16 13:49:40 schwarze Exp $ */
 /*
  * 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
@@ -523,6 +523,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++;
@@ -858,6 +868,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;