]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_html.c
Allow ERRORS in section 4; OpenBSD rev. 1.121.
[mandoc.git] / mdoc_html.c
index 60ea6dc738300b58ddad4da850ef366f5d881b48..99eed7d4040cf752b7d7dc8d76630377384df8f6 100644 (file)
@@ -1,6 +1,7 @@
-/*     $Id: mdoc_html.c,v 1.182 2011/11/03 20:37:00 schwarze Exp $ */
+/*     $Id: mdoc_html.c,v 1.187 2014/03/30 19:47:48 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2014 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
@@ -35,7 +36,7 @@
 
 #define        INDENT           5
 
-#define        MDOC_ARGS         const struct mdoc_meta *m, \
+#define        MDOC_ARGS         const struct mdoc_meta *meta, \
                          const struct mdoc_node *n, \
                          struct html *h
 
@@ -95,6 +96,7 @@ static        int               mdoc_it_pre(MDOC_ARGS);
 static int               mdoc_lb_pre(MDOC_ARGS);
 static int               mdoc_li_pre(MDOC_ARGS);
 static int               mdoc_lk_pre(MDOC_ARGS);
+static int               mdoc_ll_pre(MDOC_ARGS);
 static int               mdoc_mt_pre(MDOC_ARGS);
 static int               mdoc_ms_pre(MDOC_ARGS);
 static int               mdoc_nd_pre(MDOC_ARGS);
@@ -242,6 +244,7 @@ static      const struct htmlmdoc mdocs[MDOC_MAX] = {
        {mdoc_sp_pre, NULL}, /* sp */ 
        {mdoc__x_pre, mdoc__x_post}, /* %U */ 
        {NULL, NULL}, /* Ta */ 
+       {mdoc_ll_pre, NULL}, /* ll */
 };
 
 static const char * const lists[LIST_MAX] = {
@@ -260,10 +263,11 @@ static    const char * const lists[LIST_MAX] = {
 };
 
 void
-html_mdoc(void *arg, const struct mdoc *m)
+html_mdoc(void *arg, const struct mdoc *mdoc)
 {
 
-       print_mdoc(mdoc_meta(m), mdoc_node(m), (struct html *)arg);
+       print_mdoc(mdoc_meta(mdoc), mdoc_node(mdoc),
+                       (struct html *)arg);
        putchar('\n');
 }
 
@@ -361,14 +365,14 @@ print_mdoc(MDOC_ARGS)
                print_gen_decls(h);
                t = print_otag(h, TAG_HTML, 0, NULL);
                tt = print_otag(h, TAG_HEAD, 0, NULL);
-               print_mdoc_head(m, n, h);
+               print_mdoc_head(meta, n, h);
                print_tagq(h, tt);
                print_otag(h, TAG_BODY, 0, NULL);
                print_otag(h, TAG_DIV, 1, &tag);
        } else 
                t = print_otag(h, TAG_DIV, 1, &tag);
 
-       print_mdoc_nodelist(m, n, h);
+       print_mdoc_nodelist(meta, n, h);
        print_tagq(h, t);
 }
 
@@ -380,10 +384,10 @@ print_mdoc_head(MDOC_ARGS)
 
        print_gen_head(h);
        bufinit(h);
-       bufcat_fmt(h, "%s(%s)", m->title, m->msec);
+       bufcat_fmt(h, "%s(%s)", meta->title, meta->msec);
 
-       if (m->arch)
-               bufcat_fmt(h, " (%s)", m->arch);
+       if (meta->arch)
+               bufcat_fmt(h, " (%s)", meta->arch);
 
        print_otag(h, TAG_TITLE, 0, NULL);
        print_text(h, h->buf);
@@ -394,9 +398,9 @@ static void
 print_mdoc_nodelist(MDOC_ARGS)
 {
 
-       print_mdoc_node(m, n, h);
+       print_mdoc_node(meta, n, h);
        if (n->next)
-               print_mdoc_nodelist(m, n->next, h);
+               print_mdoc_nodelist(meta, n->next, h);
 }
 
 
@@ -411,7 +415,7 @@ print_mdoc_node(MDOC_ARGS)
 
        switch (n->type) {
        case (MDOC_ROOT):
-               child = mdoc_root_pre(m, n, h);
+               child = mdoc_root_pre(meta, n, h);
                break;
        case (MDOC_TEXT):
                /* No tables in this mode... */
@@ -454,36 +458,32 @@ print_mdoc_node(MDOC_ARGS)
 
                assert(NULL == h->tblt);
                if (mdocs[n->tok].pre && ENDBODY_NOT == n->end)
-                       child = (*mdocs[n->tok].pre)(m, n, h);
+                       child = (*mdocs[n->tok].pre)(meta, n, h);
                break;
        }
 
        if (HTML_KEEP & h->flags) {
-               if (n->prev && n->prev->line != n->line) {
+               if (n->prev ? (n->prev->lastline != n->line) :
+                   (n->parent && n->parent->line != n->line)) {
                        h->flags &= ~HTML_KEEP;
                        h->flags |= HTML_PREKEEP;
-               } else if (NULL == n->prev) {
-                       if (n->parent && n->parent->line != n->line) {
-                               h->flags &= ~HTML_KEEP;
-                               h->flags |= HTML_PREKEEP;
-                       }
                }
        }
 
        if (child && n->child)
-               print_mdoc_nodelist(m, n->child, h);
+               print_mdoc_nodelist(meta, n->child, h);
 
        print_stagq(h, t);
 
        switch (n->type) {
        case (MDOC_ROOT):
-               mdoc_root_post(m, n, h);
+               mdoc_root_post(meta, n, h);
                break;
        case (MDOC_EQN):
                break;
        default:
                if (mdocs[n->tok].post && ENDBODY_NOT == n->end)
-                       (*mdocs[n->tok].post)(m, n, h);
+                       (*mdocs[n->tok].post)(meta, n, h);
                break;
        }
 }
@@ -509,13 +509,13 @@ mdoc_root_post(MDOC_ARGS)
 
        PAIR_CLASS_INIT(&tag[0], "foot-date");
        print_otag(h, TAG_TD, 1, tag);
-       print_text(h, m->date);
+       print_text(h, meta->date);
        print_stagq(h, tt);
 
        PAIR_CLASS_INIT(&tag[0], "foot-os");
        PAIR_INIT(&tag[1], ATTR_ALIGN, "right");
        print_otag(h, TAG_TD, 2, tag);
-       print_text(h, m->os);
+       print_text(h, meta->os);
        print_tagq(h, t);
 }
 
@@ -528,15 +528,15 @@ mdoc_root_pre(MDOC_ARGS)
        struct tag      *t, *tt;
        char             b[BUFSIZ], title[BUFSIZ];
 
-       strlcpy(b, m->vol, BUFSIZ);
+       strlcpy(b, meta->vol, BUFSIZ);
 
-       if (m->arch) {
+       if (meta->arch) {
                strlcat(b, " (", BUFSIZ);
-               strlcat(b, m->arch, BUFSIZ);
+               strlcat(b, meta->arch, BUFSIZ);
                strlcat(b, ")", BUFSIZ);
        }
 
-       snprintf(title, BUFSIZ - 1, "%s(%s)", m->title, m->msec);
+       snprintf(title, BUFSIZ - 1, "%s(%s)", meta->title, meta->msec);
 
        PAIR_SUMMARY_INIT(&tag[0], "Document Header");
        PAIR_CLASS_INIT(&tag[1], "head");
@@ -689,13 +689,13 @@ mdoc_nm_pre(MDOC_ARGS)
                synopsis_pre(h, n);
                PAIR_CLASS_INIT(&tag, "name");
                print_otag(h, TAG_B, 1, &tag);
-               if (NULL == n->child && m->name)
-                       print_text(h, m->name);
+               if (NULL == n->child && meta->name)
+                       print_text(h, meta->name);
                return(1);
        case (MDOC_HEAD):
                print_otag(h, TAG_TD, 0, NULL);
-               if (NULL == n->child && m->name)
-                       print_text(h, m->name);
+               if (NULL == n->child && meta->name)
+                       print_text(h, meta->name);
                return(1);
        case (MDOC_BODY):
                print_otag(h, TAG_TD, 0, NULL);
@@ -712,8 +712,8 @@ mdoc_nm_pre(MDOC_ARGS)
                if (MDOC_TEXT == n->type)
                        len += html_strlen(n->string);
 
-       if (0 == len && m->name)
-               len = html_strlen(m->name);
+       if (0 == len && meta->name)
+               len = html_strlen(meta->name);
 
        SCALE_HS_INIT(&su, (double)len);
        bufinit(h);
@@ -981,8 +981,6 @@ mdoc_bl_pre(MDOC_ARGS)
        struct roffsu    su;
        char             buf[BUFSIZ];
 
-       bufinit(h);
-
        if (MDOC_BODY == n->type) {
                if (LIST_column == n->norm->Bl.type)
                        print_otag(h, TAG_TBODY, 0, NULL);
@@ -1001,6 +999,7 @@ mdoc_bl_pre(MDOC_ARGS)
                 */
 
                for (i = 0; i < (int)n->norm->Bl.ncols; i++) {
+                       bufinit(h);
                        a2width(n->norm->Bl.cols[i], &su);
                        if (i < (int)n->norm->Bl.ncols - 1)
                                bufcat_su(h, "width", &su);
@@ -1014,6 +1013,7 @@ mdoc_bl_pre(MDOC_ARGS)
        }
 
        SCALE_VS_INIT(&su, 0);
+       bufinit(h);
        bufcat_su(h, "margin-top", &su);
        bufcat_su(h, "margin-bottom", &su);
        PAIR_STYLE_INIT(&tag[0], h);
@@ -1225,7 +1225,7 @@ mdoc_bd_pre(MDOC_ARGS)
        h->flags |= HTML_LITERAL;
 
        for (nn = n->child; nn; nn = nn->next) {
-               print_mdoc_node(m, nn, h);
+               print_mdoc_node(meta, nn, h);
                /*
                 * If the printed node flushes its own line, then we
                 * needn't do it here as well.  This is hacky, but the
@@ -1600,6 +1600,14 @@ mdoc_sm_pre(MDOC_ARGS)
        return(0);
 }
 
+/* ARGSUSED */
+static int
+mdoc_ll_pre(MDOC_ARGS)
+{
+
+       return(0);
+}
+
 /* ARGSUSED */
 static int
 mdoc_pp_pre(MDOC_ARGS)
@@ -1607,7 +1615,6 @@ mdoc_pp_pre(MDOC_ARGS)
 
        print_otag(h, TAG_P, 0, NULL);
        return(0);
-
 }
 
 /* ARGSUSED */
@@ -2273,7 +2280,7 @@ mdoc_quote_post(MDOC_ARGS)
        case (MDOC_So):
                /* FALLTHROUGH */
        case (MDOC_Sq):
-               print_text(h, "\\(aq");
+               print_text(h, "\\(cq");
                break;
        default:
                abort();