Print this page
Update to 1.12.3.

@@ -1,6 +1,6 @@
-/*      $Id: mdoc_html.c,v 1.182 2011/11/03 20:37:00 schwarze Exp $ */
+/*      $Id: mdoc_html.c,v 1.186 2013/12/24 20:45:27 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above

@@ -33,11 +33,11 @@
 #include "mdoc.h"
 #include "main.h"
 
 #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
 
 #ifndef MIN
 #define MIN(a,b)        ((/*CONSTCOND*/(a)<(b))?(a):(b))

@@ -258,14 +258,15 @@
         "list-ohang",
         "list-tag"
 };
 
 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');
 }
 
 
 /*

@@ -359,18 +360,18 @@
 
         if ( ! (HTML_FRAGMENT & h->oflags)) {
                 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);
 }
 
 
 /* ARGSUSED */

@@ -378,14 +379,14 @@
 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);
 }
 

@@ -392,13 +393,13 @@
 
 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);
 }
 
 
 static void
 print_mdoc_node(MDOC_ARGS)

@@ -409,11 +410,11 @@
         child = 1;
         t = h->tags.head;
 
         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... */
                 assert(NULL == h->tblt);
 

@@ -452,40 +453,36 @@
                         t = h->tags.head;
                 }
 
                 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;
         }
 }
 
 /* ARGSUSED */

@@ -507,17 +504,17 @@
 
         tt = print_otag(h, TAG_TR, 0, NULL);
 
         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);
 }
 
 
 /* ARGSUSED */

@@ -526,19 +523,19 @@
 {
         struct htmlpair  tag[3];
         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");
         PAIR_INIT(&tag[2], ATTR_WIDTH, "100%");
         t = print_otag(h, TAG_TABLE, 3, tag);

@@ -687,17 +684,17 @@
         switch (n->type) {
         case (MDOC_ELEM):
                 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);
                 return(1);
         default:

@@ -710,12 +707,12 @@
 
         for (len = 0, n = n->child; n; n = n->next)
                 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);
         bufcat_su(h, "width", &su);
         PAIR_STYLE_INIT(&tag, h);

@@ -979,12 +976,10 @@
         int              i;
         struct htmlpair  tag[3];
         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);
                 return(1);
         }

@@ -999,10 +994,11 @@
                  * in terminal mode it auto-sizes to the width of the
                  * screen and we want to preserve that behaviour.
                  */
 
                 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);
                         else
                                 bufcat_su(h, "min-width", &su);

@@ -1012,10 +1008,11 @@
 
                 return(0);
         }
 
         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);
 
         assert(lists[n->norm->Bl.type]);

@@ -1223,11 +1220,11 @@
 
         sv = h->flags & HTML_LITERAL;
         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
                  * notion of selective eoln whitespace is pretty dumb
                  * anyway, so don't sweat it.

@@ -2271,11 +2268,11 @@
         case (MDOC_Ql):
                 /* FALLTHROUGH */
         case (MDOC_So):
                 /* FALLTHROUGH */
         case (MDOC_Sq):
-                print_text(h, "\\(aq");
+                print_text(h, "\\(cq");
                 break;
         default:
                 abort();
                 /* NOTREACHED */
         }