]> git.cameronkatri.com Git - mandoc.git/commitdiff
Drastically fix -T[x]html's handling of font-escape mode changes (i.e.,
authorKristaps Dzonsons <kristaps@bsd.lv>
Fri, 24 Dec 2010 00:46:49 +0000 (00:46 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Fri, 24 Dec 2010 00:46:49 +0000 (00:46 +0000)
using \fI or \fP).  Now, using these modes will cause a font to be
rendered for each word; furthermore, setting mode within a word will do
the correct thing.

Second, make -man use real font tags (B, I, SMALL) to set its font
instead of using font modes and fix up the pre-macro unsetting of the
current mode.

This fixes how roff.7 wasn't validating (<P> closing out a font mode)
and has been checked against gcc.1 (more will come).  I considered
failure to validate OUR manual to be a show-stopper for the up-coming
release.

example.style.css
html.c
html.h
man_html.c

index a39ec40274eb843b4ddca1c1a70a291afad1b860..567fd0ba5074cc3002d35eeaa9153e08428f043e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: example.style.css,v 1.38 2010/12/22 11:15:16 kristaps Exp $ */
+/* $Id: example.style.css,v 1.39 2010/12/24 00:46:49 kristaps Exp $ */
 
 /*
  * This default style-sheet mimics the appearance of the traditional
@@ -35,12 +35,11 @@ td          { vertical-align: top; }
 
 /* General font modes. */
 
-.italic                { font-style: italic; font-weight: normal; } /* Italic: BI, IB, I, (implicit). */
+i              { } /* Italic: BI, IB, I, (implicit). */
 .emph          { font-style: italic; font-weight: normal; } /* Emphasis: Em, Bl -emphasis. */
-.bold          { font-style: normal; font-weight: bold; } /* Bold: SB, BI, IB, BR, RB, B, (implicit). */
+b              { } /* Bold: SB, BI, IB, BR, RB, B, (implicit). */
 .symb          { font-style: normal; font-weight: bold; } /* Symbolic: Sy, Ms, Bf -symbolic. */
-.roman         { font-style: normal; font-weight: normal; } /* Roman: (implicit). */
-.small         { font-style: normal; font-weight: normal; font-size: smaller; } /* Small: SB, SM. */
+small          { } /* Small: SB, SM. */
 
 /* Block modes. */
 
diff --git a/html.c b/html.c
index d99bd58fbdc28e083b30567fa0481cddda98c3db..df7940baba81e9edb827cabd76510d4a25c59bb6 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/*     $Id: html.c,v 1.121 2010/12/22 11:15:16 kristaps Exp $ */
+/*     $Id: html.c,v 1.122 2010/12/24 00:46:49 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -74,12 +74,7 @@ static       const struct htmldata htmltags[TAG_MAX] = {
        {"i",           0 }, /* TAG_I */
        {"u",           0 }, /* TAG_U */
        {"code",        0 }, /* TAG_CODE */
-};
-
-static const char      *const htmlfonts[HTMLFONT_MAX] = {
-       "roman",
-       "bold",
-       "italic"
+       {"small",       0 }, /* TAG_SMALL */
 };
 
 static const char      *const htmlattrs[ATTR_MAX] = {
@@ -257,25 +252,6 @@ print_res(struct html *h, const char *p, size_t len)
 }
 
 
-struct tag *
-print_ofont(struct html *h, enum htmlfont font)
-{
-       struct htmlpair  tag;
-
-       h->metal = h->metac;
-       h->metac = font;
-
-       /* FIXME: DECO_ROMAN should just close out preexisting. */
-
-       if (h->metaf && h->tags.head == h->metaf)
-               print_tagq(h, h->metaf);
-
-       PAIR_CLASS_INIT(&tag, htmlfonts[font]);
-       h->metaf = print_otag(h, TAG_SPAN, 1, &tag);
-       return(h->metaf);
-}
-
-
 static void
 print_metaf(struct html *h, enum roffdeco deco)
 {
@@ -299,7 +275,18 @@ print_metaf(struct html *h, enum roffdeco deco)
                /* NOTREACHED */
        }
 
-       (void)print_ofont(h, font);
+       if (h->metaf) {
+               print_tagq(h, h->metaf);
+               h->metaf = NULL;
+       }
+
+       h->metal = h->metac;
+       h->metac = font;
+
+       if (HTMLFONT_NONE != font)
+               h->metaf = HTMLFONT_BOLD == font ?
+                       print_otag(h, TAG_B, 0, NULL) :
+                       print_otag(h, TAG_I, 0, NULL);
 }
 
 
@@ -554,11 +541,22 @@ print_text(struct html *h, const char *word)
                        printf("&#160;");
        }
 
+       assert(NULL == h->metaf);
+       if (HTMLFONT_NONE != h->metac)
+               h->metaf = HTMLFONT_BOLD == h->metac ?
+                       print_otag(h, TAG_B, 0, NULL) :
+                       print_otag(h, TAG_I, 0, NULL);
+
        assert(word);
        if ( ! print_encode(h, word, 0))
                if ( ! (h->flags & HTML_NONOSPACE))
                        h->flags &= ~HTML_NOSPACE;
 
+       if (h->metaf) {
+               print_tagq(h, h->metaf);
+               h->metaf = NULL;
+       }
+
        h->flags &= ~HTML_IGNDELIM;
 
        /* 
diff --git a/html.h b/html.h
index 2d11280b5bf13efae0b743809bb201ae7573d1ac..635759029c714515b6cafd12c7afb88b6f8fcb93 100644 (file)
--- a/html.h
+++ b/html.h
@@ -1,4 +1,4 @@
-/*     $Id: html.h,v 1.34 2010/12/22 11:15:16 kristaps Exp $ */
+/*     $Id: html.h,v 1.35 2010/12/24 00:46:49 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -50,6 +50,7 @@ enum  htmltag {
        TAG_I,
        TAG_U,
        TAG_CODE,
+       TAG_SMALL,
        TAG_MAX
 };
 
@@ -123,9 +124,9 @@ struct      html {
        char             *style;
        char              buf[BUFSIZ];
        size_t            buflen;
-       struct tag       *metaf;
-       enum htmlfont     metal;
-       enum htmlfont     metac;
+       struct tag       *metaf; /* current open font scope */
+       enum htmlfont     metal; /* last used font */
+       enum htmlfont     metac; /* current font mode */
        enum htmltype     type;
 };
 
@@ -133,7 +134,6 @@ struct      roffsu;
 
 void             print_gen_decls(struct html *);
 void             print_gen_head(struct html *);
-struct tag      *print_ofont(struct html *, enum htmlfont);
 struct tag      *print_otag(struct html *, enum htmltag, 
                                int, const struct htmlpair *);
 void             print_tagq(struct html *, const struct tag *);
index 39fdf89bcc78ddfa000120040c497a06bc2fd0c6..4bcdf3dc79aa7bc4010ff39e8acd8c6b8e0b4c35 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_html.c,v 1.56 2010/12/22 09:51:27 kristaps Exp $ */
+/*     $Id: man_html.c,v 1.57 2010/12/24 00:46:49 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -209,11 +209,9 @@ print_man_node(MAN_ARGS)
                 * scope.  Assert that the metafont is on the top of the
                 * stack (it's never nested).
                 */
-               if (h->metaf) {
-                       assert(h->metaf == t);
-                       print_tagq(h, h->metaf);
-                       assert(NULL == h->metaf);
-                       t = h->tags.head;
+               if (HTMLFONT_NONE != h->metac) {
+                       h->metal = h->metac;
+                       h->metac = HTMLFONT_NONE;
                }
                if (mans[n->tok].pre)
                        child = (*mans[n->tok].pre)(m, n, mh, h);
@@ -409,29 +407,30 @@ static int
 man_alt_pre(MAN_ARGS)
 {
        const struct man_node   *nn;
-       struct tag              *t;
-       int                      i;
-       enum htmlfont            fp;
+       int              i;
+       enum htmltag     fp;
+       struct tag      *t;
 
        for (i = 0, nn = n->child; nn; nn = nn->next, i++) {
+               t = NULL;
                switch (n->tok) {
                case (MAN_BI):
-                       fp = i % 2 ? HTMLFONT_ITALIC : HTMLFONT_BOLD;
+                       fp = i % 2 ? TAG_I : TAG_B;
                        break;
                case (MAN_IB):
-                       fp = i % 2 ? HTMLFONT_BOLD : HTMLFONT_ITALIC;
+                       fp = i % 2 ? TAG_B : TAG_I;
                        break;
                case (MAN_RI):
-                       fp = i % 2 ? HTMLFONT_ITALIC : HTMLFONT_NONE;
+                       fp = i % 2 ? TAG_I : TAG_MAX;
                        break;
                case (MAN_IR):
-                       fp = i % 2 ? HTMLFONT_NONE : HTMLFONT_ITALIC;
+                       fp = i % 2 ? TAG_MAX : TAG_I;
                        break;
                case (MAN_BR):
-                       fp = i % 2 ? HTMLFONT_NONE : HTMLFONT_BOLD;
+                       fp = i % 2 ? TAG_MAX : TAG_B;
                        break;
                case (MAN_RB):
-                       fp = i % 2 ? HTMLFONT_BOLD : HTMLFONT_NONE;
+                       fp = i % 2 ? TAG_B : TAG_MAX;
                        break;
                default:
                        abort();
@@ -441,14 +440,13 @@ man_alt_pre(MAN_ARGS)
                if (i)
                        h->flags |= HTML_NOSPACE;
 
-               /* 
-                * Open and close the scope with each argument, so that
-                * internal \f escapes, which are common, are also
-                * closed out with the scope.
-                */
-               t = print_ofont(h, fp);
+               if (TAG_MAX != fp)
+                       t = print_otag(h, fp, 0, NULL);
+
                print_man_node(m, nn, mh, h);
-               print_tagq(h, t);
+
+               if (t)
+                       print_tagq(h, t);
        }
 
        return(0);
@@ -459,13 +457,10 @@ man_alt_pre(MAN_ARGS)
 static int
 man_SM_pre(MAN_ARGS)
 {
-       struct htmlpair  tag;
        
-       /* FIXME: print_ofont(). */
-       PAIR_CLASS_INIT(&tag, "small");
-       print_otag(h, TAG_SPAN, 1, &tag);
+       print_otag(h, TAG_SMALL, 0, NULL);
        if (MAN_SB == n->tok)
-               print_ofont(h, HTMLFONT_BOLD);
+               print_otag(h, TAG_B, 0, NULL);
        return(1);
 }
 
@@ -630,7 +625,7 @@ static int
 man_B_pre(MAN_ARGS)
 {
 
-       print_ofont(h, HTMLFONT_BOLD);
+       print_otag(h, TAG_B, 0, NULL);
        return(1);
 }
 
@@ -640,7 +635,7 @@ static int
 man_I_pre(MAN_ARGS)
 {
        
-       print_ofont(h, HTMLFONT_ITALIC);
+       print_otag(h, TAG_I, 0, NULL);
        return(1);
 }