]> git.cameronkatri.com Git - mandoc.git/blobdiff - html.c
Moved output definitions into main.h.
[mandoc.git] / html.c
diff --git a/html.c b/html.c
index 426624a46af37b4aff91e9e7b7dcc7db975e2fde..623fa975bc71924b1a038a2308214316e5bbaae3 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/*     $Id: html.c,v 1.52 2009/09/24 09:50:31 kristaps Exp $ */
+/*     $Id: html.c,v 1.64 2009/10/13 10:57:25 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
 #include <assert.h>
 #include <err.h>
 #include <stdio.h>
+#include <stdarg.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
+#include "out.h"
 #include "chars.h"
 #include "html.h"
+#include "main.h"
+
+#define        UNCONST(a)      ((void *)(uintptr_t)(const void *)(a))
 
 #define        DOCTYPE         "-//W3C//DTD HTML 4.01//EN"
 #define        DTD             "http://www.w3.org/TR/html4/strict.dtd"
 
 struct htmldata {
-       char             *name;
+       const char       *name;
        int               flags;
 #define        HTML_CLRLINE     (1 << 0)
 #define        HTML_NOSTACK     (1 << 1)
@@ -73,6 +79,8 @@ static        const char       *const htmlattrs[ATTR_MAX] = {
        "style",
        "width",
        "valign",
+       "target",
+       "id",
 };
 
 #ifdef __linux__
@@ -83,11 +91,13 @@ void *
 html_alloc(char *outopts)
 {
        struct html     *h;
-       char            *toks[3], *v;
+       const char      *toks[4];
+       char            *v;
 
        toks[0] = "style";
-       toks[1] = "base";
-       toks[2] = NULL;
+       toks[1] = "man";
+       toks[2] = "includes";
+       toks[3] = NULL;
 
        if (NULL == (h = calloc(1, sizeof(struct html))))
                return(NULL);
@@ -101,12 +111,15 @@ html_alloc(char *outopts)
        }
 
        while (outopts && *outopts)
-               switch (getsubopt(&outopts, toks, &v)) {
+               switch (getsubopt(&outopts, UNCONST(toks), &v)) {
                case (0):
                        h->style = v;
                        break;
                case (1):
-                       h->base = v;
+                       h->base_man = v;
+                       break;
+               case (2):
+                       h->base_includes = v;
                        break;
                default:
                        break;
@@ -139,6 +152,7 @@ html_free(void *p)
        
        if (h->symtab)
                chars_free(h->symtab);
+
        free(h);
 }
 
@@ -171,12 +185,6 @@ print_gen_head(struct html *h)
                tag[3].val = "all";
                print_otag(h, TAG_LINK, 4, tag);
        }
-
-       if (h->base) {
-               tag[0].key = ATTR_HREF;
-               tag[1].val = h->base;
-               print_otag(h, TAG_BASE, 1, tag);
-       }
 }
 
 
@@ -485,3 +493,160 @@ print_stagq(struct html *h, const struct tag *suntil)
                free(tag);
        }
 }
+
+
+void
+bufinit(struct html *h)
+{
+
+       h->buf[0] = '\0';
+       h->buflen = 0;
+}
+
+
+void
+bufcat_style(struct html *h, const char *key, const char *val)
+{
+
+       bufcat(h, key);
+       bufncat(h, ":", 1);
+       bufcat(h, val);
+       bufncat(h, ";", 1);
+}
+
+
+void
+bufcat(struct html *h, const char *p)
+{
+
+       bufncat(h, p, strlen(p));
+}
+
+
+void
+buffmt(struct html *h, const char *fmt, ...)
+{
+       va_list          ap;
+
+       va_start(ap, fmt);
+       (void)vsnprintf(h->buf + (int)h->buflen, 
+                       BUFSIZ - h->buflen - 1, fmt, ap);
+       va_end(ap);
+       h->buflen = strlen(h->buf);
+}
+
+
+void
+bufncat(struct html *h, const char *p, size_t sz)
+{
+
+       if (h->buflen + sz > BUFSIZ - 1)
+               sz = BUFSIZ - 1 - h->buflen;
+
+       (void)strncat(h->buf, p, sz);
+       h->buflen += sz;
+}
+
+
+void
+buffmt_includes(struct html *h, const char *name)
+{
+       const char      *p, *pp;
+
+       pp = h->base_includes;
+       
+       while (NULL != (p = strchr(pp, '%'))) {
+               bufncat(h, pp, (size_t)(p - pp));
+               switch (*(p + 1)) {
+               case('I'):
+                       bufcat(h, name);
+                       break;
+               default:
+                       bufncat(h, p, 2);
+                       break;
+               }
+               pp = p + 2;
+       }
+       if (pp)
+               bufcat(h, pp);
+}
+
+
+void
+buffmt_man(struct html *h, 
+               const char *name, const char *sec)
+{
+       const char      *p, *pp;
+
+       pp = h->base_man;
+       
+       /* LINTED */
+       while (NULL != (p = strchr(pp, '%'))) {
+               bufncat(h, pp, (size_t)(p - pp));
+               switch (*(p + 1)) {
+               case('S'):
+                       bufcat(h, sec ? sec : "1");
+                       break;
+               case('N'):
+                       buffmt(h, name);
+                       break;
+               default:
+                       bufncat(h, p, 2);
+                       break;
+               }
+               pp = p + 2;
+       }
+       if (pp)
+               bufcat(h, pp);
+}
+
+
+void
+bufcat_su(struct html *h, const char *p, const struct roffsu *su)
+{
+       double           v;
+       const char      *u;
+
+       v = su->scale;
+
+       switch (su->unit) {
+       case (SCALE_CM):
+               u = "cm";
+               break;
+       case (SCALE_IN):
+               u = "in";
+               break;
+       case (SCALE_PC):
+               u = "pc";
+               break;
+       case (SCALE_PT):
+               u = "pt";
+               break;
+       case (SCALE_EM):
+               u = "em";
+               break;
+       case (SCALE_MM):
+               if (0 == (v /= 100))
+                       v = 1;
+               u = "em";
+               break;
+       case (SCALE_EN):
+               u = "ex";
+               break;
+       case (SCALE_BU):
+               u = "ex";
+               break;
+       case (SCALE_VS):
+               u = "em";
+               break;
+       default:
+               u = "ex";
+               break;
+       }
+
+       if (su->pt)
+               buffmt(h, "%s: %f%s;", p, v, u);
+       else
+               /* LINTED */
+               buffmt(h, "%s: %d%s;", p, (int)v, u);
+}