]> git.cameronkatri.com Git - mandoc.git/commitdiff
In HTML output, allow switching the desired font for subsequent
authorIngo Schwarze <schwarze@openbsd.org>
Tue, 30 Apr 2019 15:53:00 +0000 (15:53 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Tue, 30 Apr 2019 15:53:00 +0000 (15:53 +0000)
text without printing an opening tag right away, and use that in
the .ft request handler.  While here, garbage collect redundant
enum htmlfont and reduce code duplication in print_text().
Fixing an assertion failure reported by Michael <Stapelberg at Debian>
in pmRegisterDerived(3) from libpcp3-dev.

html.c
html.h
man_html.c
regress/roff/ft/badargs.out_html
roff_html.c

diff --git a/html.c b/html.c
index 1302972a4e13a65bab4314d53bb548c7f4521475..9c45d3162eaf2f2fab61042ae1122b0bbc0c2f4d 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/*     $Id: html.c,v 1.254 2019/03/03 13:02:11 schwarze Exp $ */
+/*     $Id: html.c,v 1.255 2019/04/30 15:53:00 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -120,6 +120,7 @@ static      void     print_ctag(struct html *, struct tag *);
 static int      print_escape(struct html *, char);
 static int      print_encode(struct html *, const char *, const char *, int);
 static void     print_href(struct html *, const char *, const char *, int);
+static void     print_metaf(struct html *);
 
 
 void *
@@ -222,55 +223,49 @@ print_gen_head(struct html *h)
        print_tagq(h, t);
 }
 
-void
-print_metaf(struct html *h, enum mandoc_esc deco)
+int
+html_setfont(struct html *h, enum mandoc_esc font)
 {
-       enum htmlfont    font;
-
-       switch (deco) {
+       switch (font) {
        case ESCAPE_FONTPREV:
                font = h->metal;
                break;
        case ESCAPE_FONTITALIC:
-               font = HTMLFONT_ITALIC;
-               break;
        case ESCAPE_FONTBOLD:
-               font = HTMLFONT_BOLD;
-               break;
        case ESCAPE_FONTBI:
-               font = HTMLFONT_BI;
-               break;
        case ESCAPE_FONTCW:
-               font = HTMLFONT_CW;
+       case ESCAPE_FONTROMAN:
                break;
        case ESCAPE_FONT:
-       case ESCAPE_FONTROMAN:
-               font = HTMLFONT_NONE;
+               font = ESCAPE_FONTROMAN;
                break;
        default:
-               return;
+               return 0;
        }
+       h->metal = h->metac;
+       h->metac = font;
+       return 1;
+}
 
+static void
+print_metaf(struct html *h)
+{
        if (h->metaf) {
                print_tagq(h, h->metaf);
                h->metaf = NULL;
        }
-
-       h->metal = h->metac;
-       h->metac = font;
-
-       switch (font) {
-       case HTMLFONT_ITALIC:
+       switch (h->metac) {
+       case ESCAPE_FONTITALIC:
                h->metaf = print_otag(h, TAG_I, "");
                break;
-       case HTMLFONT_BOLD:
+       case ESCAPE_FONTBOLD:
                h->metaf = print_otag(h, TAG_B, "");
                break;
-       case HTMLFONT_BI:
+       case ESCAPE_FONTBI:
                h->metaf = print_otag(h, TAG_B, "");
                print_otag(h, TAG_I, "");
                break;
-       case HTMLFONT_CW:
+       case ESCAPE_FONTCW:
                h->metaf = print_otag(h, TAG_SPAN, "c", "Li");
                break;
        default:
@@ -479,7 +474,8 @@ print_encode(struct html *h, const char *p, const char *pend, int norecurse)
                case ESCAPE_FONTROMAN:
                        if (0 == norecurse) {
                                h->flags |= HTML_NOSPACE;
-                               print_metaf(h, esc);
+                               if (html_setfont(h, esc))
+                                       print_metaf(h);
                                h->flags &= ~HTML_NOSPACE;
                        }
                        continue;
@@ -806,27 +802,9 @@ print_text(struct html *h, const char *word)
                        print_word(h, "&#x00A0;");
        }
 
-       assert(NULL == h->metaf);
-       switch (h->metac) {
-       case HTMLFONT_ITALIC:
-               h->metaf = print_otag(h, TAG_I, "");
-               break;
-       case HTMLFONT_BOLD:
-               h->metaf = print_otag(h, TAG_B, "");
-               break;
-       case HTMLFONT_BI:
-               h->metaf = print_otag(h, TAG_B, "");
-               print_otag(h, TAG_I, "");
-               break;
-       case HTMLFONT_CW:
-               h->metaf = print_otag(h, TAG_SPAN, "c", "Li");
-               break;
-       default:
-               print_indent(h);
-               break;
-       }
-
-       assert(word);
+       assert(h->metaf == NULL);
+       print_metaf(h);
+       print_indent(h);
        if ( ! print_encode(h, word, NULL, 0)) {
                if ( ! (h->flags & HTML_NONOSPACE))
                        h->flags &= ~HTML_NOSPACE;
@@ -834,7 +812,7 @@ print_text(struct html *h, const char *word)
        } else
                h->flags |= HTML_NOSPACE | HTML_NONEWLINE;
 
-       if (h->metaf) {
+       if (h->metaf != NULL) {
                print_tagq(h, h->metaf);
                h->metaf = NULL;
        }
diff --git a/html.h b/html.h
index a6bf89119057632f0bdfbe46caa069f718b44dd4..242a63a8d62446650ed31e64877b657732d132f8 100644 (file)
--- a/html.h
+++ b/html.h
@@ -1,4 +1,4 @@
-/*     $Id: html.h,v 1.102 2019/03/01 10:57:18 schwarze Exp $ */
+/*     $Id: html.h,v 1.103 2019/04/30 15:53:00 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2017, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -69,15 +69,6 @@ enum htmltag {
        TAG_MAX
 };
 
-enum   htmlfont {
-       HTMLFONT_NONE = 0,
-       HTMLFONT_BOLD,
-       HTMLFONT_ITALIC,
-       HTMLFONT_BI,
-       HTMLFONT_CW,
-       HTMLFONT_MAX
-};
-
 struct tag {
        struct tag       *next;
        int               refcnt;
@@ -111,8 +102,8 @@ struct      html {
        char             *base_includes; /* base for include href */
        char             *style; /* style-sheet URI */
        struct tag       *metaf; /* current open font scope */
-       enum htmlfont     metal; /* last used font */
-       enum htmlfont     metac; /* current font mode */
+       enum mandoc_esc   metal; /* last used font */
+       enum mandoc_esc   metac; /* current font mode */
        int               oflags; /* output options */
 #define        HTML_FRAGMENT    (1 << 0) /* don't emit HTML/HEAD/BODY */
 #define        HTML_TOC         (1 << 1) /* emit a table of contents */
@@ -128,7 +119,6 @@ void                  roff_html_pre(struct html *, const struct roff_node *);
 void             print_gen_comment(struct html *, struct roff_node *);
 void             print_gen_decls(struct html *);
 void             print_gen_head(struct html *);
-void             print_metaf(struct html *, enum mandoc_esc);
 struct tag      *print_otag(struct html *, enum htmltag, const char *, ...);
 void             print_tagq(struct html *, const struct tag *);
 void             print_stagq(struct html *, const struct tag *);
@@ -141,3 +131,4 @@ void                  print_endline(struct html *);
 void             html_close_paragraph(struct html *);
 enum roff_tok    html_fillmode(struct html *, enum roff_tok);
 char            *html_make_id(const struct roff_node *, int);
+int              html_setfont(struct html *, enum mandoc_esc);
index 994a208aa0eeace2ac42a796c683cbadb9738f1c..c0a429c5d6c9e63c124a773ad9ac36c28ef816fa 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_html.c,v 1.173 2019/03/02 16:30:53 schwarze Exp $ */
+/*     $Id: man_html.c,v 1.174 2019/04/30 15:53:00 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -203,9 +203,9 @@ print_man_node(MAN_ARGS)
                 * Close out scope of font prior to opening a macro
                 * scope.
                 */
-               if (HTMLFONT_NONE != h->metac) {
+               if (h->metac != ESCAPE_FONTROMAN) {
                        h->metal = h->metac;
-                       h->metac = HTMLFONT_NONE;
+                       h->metac = ESCAPE_FONTROMAN;
                }
 
                /*
index 5d98e9883a624bcd0869d5469d5a9a5303ee1d6f..0fa4a816460f3e3198350e1fd46c370de5d915a5 100644 (file)
@@ -1,9 +1,8 @@
 BEGINTEST
 <br/>
-default font <i></i><i>italic</i> <b><i></i></b><b><i>bold italic</i></b>
-  <span class="Li"></span><span class="Li">typeqriter</span>
-  <span class="Li"></span> <span class="Li">roman</span> <b></b><b>bold</b>
-  <i></i> <i>italic</i> <b></b><b>bold</b> <b>still bold</b>
-  <i></i><i>italic</i> <i></i><i>back to bold</i> <i></i><i>back to italic</i>
+default font <i>italic</i> <b><i>bold italic</i></b>
+  <span class="Li">typeqriter</span> <span class="Li">roman</span> <b>bold</b>
+  <i>italic</i> <b>bold</b> <b>still bold</b> <i>italic</i> <i>back to bold</i>
+  <i>back to italic</i>
 <br/>
 ENDTEST
index 02b8beea3bdc9d1783435dcd73ddba34b511fede..e525aa2ede6802b7bff6c5efc6545323a163f26c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: roff_html.c,v 1.19 2019/01/07 07:26:29 schwarze Exp $ */
+/*     $Id: roff_html.c,v 1.20 2019/04/30 15:53:01 schwarze Exp $ */
 /*
  * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2017, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -94,7 +94,7 @@ roff_html_pre_ft(ROFF_HTML_ARGS)
        const char      *cp;
 
        cp = n->child->string;
-       print_metaf(h, mandoc_font(cp, (int)strlen(cp)));
+       html_setfont(h, mandoc_font(cp, (int)strlen(cp)));
 }
 
 static void