]> git.cameronkatri.com Git - mandoc.git/commitdiff
Initial check-in of -man -Thtml \f support (needs testing).
authorKristaps Dzonsons <kristaps@bsd.lv>
Sat, 14 Nov 2009 19:23:58 +0000 (19:23 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Sat, 14 Nov 2009 19:23:58 +0000 (19:23 +0000)
html.c
man_html.c

diff --git a/html.c b/html.c
index 887c7de4d8c7769d8f7aaf6106af6194dc0d54ca..33345731eae7a22643a6d932201c11b94749d0ce 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/*     $Id: html.c,v 1.87 2009/11/14 12:04:59 kristaps Exp $ */
+/*     $Id: html.c,v 1.88 2009/11/14 19:23:58 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -91,7 +91,8 @@ extern        int               getsubopt(char **, char * const *, char **);
 static void              print_spec(struct html *, const char *, size_t);
 static void              print_res(struct html *, const char *, size_t);
 static void              print_ctag(struct html *, enum htmltag);
-static int               print_encode(struct html *, const char *);
+static int               print_encode(struct html *, const char *, int);
+static void              print_metaf(struct html *, enum roffdeco);
 
 
 void *
@@ -220,8 +221,40 @@ print_res(struct html *h, const char *p, size_t len)
 }
 
 
+static void
+print_metaf(struct html *h, enum roffdeco deco)
+{
+       const char      *class;
+       struct htmlpair  tag;
+
+       switch (deco) {
+       case (DECO_BOLD):
+               class = "bold";
+               break;
+       case (DECO_ITALIC):
+               class = "italic";
+               break;
+       case (DECO_ROMAN):
+               class = "roman";
+               break;
+       default:
+               abort();
+               /* NOTREACHED */
+       }
+
+       if (h->metaf) {
+               assert(h->tags.head);
+               assert(h->metaf == h->tags.head);
+               print_tagq(h, h->metaf);
+       }
+       
+       PAIR_CLASS_INIT(&tag, class);
+       h->metaf = print_otag(h, TAG_SPAN, 1, &tag);
+}
+
+
 static int
-print_encode(struct html *h, const char *p)
+print_encode(struct html *h, const char *p, int norecurse)
 {
        size_t           sz;
        int              len, nospace;
@@ -259,6 +292,15 @@ print_encode(struct html *h, const char *p)
                case (DECO_SPECIAL):
                        print_spec(h, seq, sz);
                        break;
+               case (DECO_BOLD):
+                       /* FALLTHROUGH */
+               case (DECO_ITALIC):
+                       /* FALLTHROUGH */
+               case (DECO_ROMAN):
+                       if (norecurse)
+                               break;
+                       print_metaf(h, deco);
+                       break;
                default:
                        break;
                }
@@ -300,7 +342,7 @@ print_otag(struct html *h, enum htmltag tag,
        for (i = 0; i < sz; i++) {
                printf(" %s=\"", htmlattrs[p[i].key]);
                assert(p->val);
-               (void)print_encode(h, p[i].val);
+               (void)print_encode(h, p[i].val, 1);
                putchar('\"');
        }
        putchar('>');
@@ -366,7 +408,7 @@ print_text(struct html *h, const char *p)
                putchar(' ');
 
        assert(p);
-       if ( ! print_encode(h, p))
+       if ( ! print_encode(h, p, 0))
                h->flags &= ~HTML_NOSPACE;
 
        if (*p && 0 == *(p + 1))
index df0527e3318a96c2ba25bff033d4c9c53a856369..47726a32b9a478f5dbfe6b4e579a8bcda2548f4a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_html.c,v 1.19 2009/11/14 11:58:36 kristaps Exp $ */
+/*     $Id: man_html.c,v 1.20 2009/11/14 19:23:58 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -190,14 +190,16 @@ print_man_node(MAN_ARGS)
                print_text(h, n->string);
                return;
        default:
+               if (h->metaf) {
+                       assert(h->metaf == t);
+                       print_tagq(h, h->metaf);
+                       t = h->tags.head;
+               }
                if (mans[n->tok].pre)
                        child = (*mans[n->tok].pre)(m, n, h);
                break;
        }
 
-       if (child && n->child)
-               print_man_nodelist(m, n->child, h);
-
        print_stagq(h, t);
 
        bufinit(h);