]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_html.c
Big check-in of compatibility layer. This should work on most major architectures...
[mandoc.git] / mdoc_html.c
index 65f78ea6ea1d0a079310cf7aae3475fea1d5c559..88e9b2f5a337090b59b296d347353403f645040e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_html.c,v 1.41 2009/10/28 05:08:17 kristaps Exp $ */
+/*     $Id: mdoc_html.c,v 1.52 2010/01/01 17:14:29 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <sys/types.h>
-#include <sys/param.h>
 
 #include <assert.h>
 #include <ctype.h>
-#include <err.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
                          const struct mdoc_node *n, \
                          struct html *h
 
+#ifndef MIN
+#define        MIN(a,b)        ((/*CONSTCOND*/(a)<(b))?(a):(b))
+#endif
+
 struct htmlmdoc {
        int             (*pre)(MDOC_ARGS);
        void            (*post)(MDOC_ARGS);
@@ -127,11 +133,6 @@ static     int               mdoc_vt_pre(MDOC_ARGS);
 static int               mdoc_xr_pre(MDOC_ARGS);
 static int               mdoc_xx_pre(MDOC_ARGS);
 
-#ifdef __linux__
-extern size_t            strlcpy(char *, const char *, size_t);
-extern size_t            strlcat(char *, const char *, size_t);
-#endif
-
 static const struct htmlmdoc mdocs[MDOC_MAX] = {
        {mdoc_ap_pre, NULL}, /* Ap */
        {NULL, NULL}, /* Dd */
@@ -425,7 +426,7 @@ print_mdoc_node(MDOC_ARGS)
                break;
        case (MDOC_TEXT):
                print_text(h, n->string);
-               break;
+               return;
        default:
                if (mdocs[n->tok].pre)
                        child = (*mdocs[n->tok].pre)(m, n, h);
@@ -442,8 +443,6 @@ print_mdoc_node(MDOC_ARGS)
        case (MDOC_ROOT):
                mdoc_root_post(m, n, h);
                break;
-       case (MDOC_TEXT):
-               break;
        default:
                if (mdocs[n->tok].post)
                        (*mdocs[n->tok].post)(m, n, h);
@@ -583,11 +582,11 @@ mdoc_sh_pre(MDOC_ARGS)
                return(1);
        }
 
-       html_idcpy(buf, "id_", BUFSIZ);
+       buf[0] = '\0';
        for (nn = n->child; nn; nn = nn->next) {
                html_idcat(buf, nn->string, BUFSIZ);
                if (nn->next)
-                       html_idcat(buf, "_", BUFSIZ);
+                       html_idcat(buf, " ", BUFSIZ);
        }
 
        /* 
@@ -636,11 +635,11 @@ mdoc_ss_pre(MDOC_ARGS)
 
        /* TODO: see note in mdoc_sh_pre() about duplicates. */
 
-       html_idcpy(buf, "id_", BUFSIZ);
+       buf[0] = '\0';
        for (nn = n->child; nn; nn = nn->next) {
                html_idcat(buf, nn->string, BUFSIZ);
                if (nn->next)
-                       html_idcat(buf, "_", BUFSIZ);
+                       html_idcat(buf, " ", BUFSIZ);
        }
 
        SCALE_HS_INIT(&su, INDENT - HALFINDENT);
@@ -664,10 +663,19 @@ mdoc_fl_pre(MDOC_ARGS)
 
        PAIR_CLASS_INIT(&tag, "flag");
        print_otag(h, TAG_SPAN, 1, &tag);
-       if (MDOC_Fl == n->tok) {
-               print_text(h, "\\-");
+
+       /* `Cm' has no leading hyphen. */
+
+       if (MDOC_Cm == n->tok)
+               return(1);
+
+       print_text(h, "\\-");
+
+       /* A blank `Fl' should incur a subsequent space. */
+
+       if (n->child)
                h->flags |= HTML_NOSPACE;
-       }
+
        return(1);
 }
 
@@ -726,12 +734,11 @@ mdoc_nm_pre(MDOC_ARGS)
 {
        struct htmlpair tag;
 
-       if ( ! (HTML_NEWLINE & h->flags))
-               if (SEC_SYNOPSIS == n->sec) {
-                       bufcat_style(h, "clear", "both");
-                       PAIR_STYLE_INIT(&tag, h);
-                       print_otag(h, TAG_BR, 1, &tag);
-               }
+       if (SEC_SYNOPSIS == n->sec && n->prev) {
+               bufcat_style(h, "clear", "both");
+               PAIR_STYLE_INIT(&tag, h);
+               print_otag(h, TAG_BR, 1, &tag);
+       }
 
        PAIR_CLASS_INIT(&tag, "name");
        print_otag(h, TAG_SPAN, 1, &tag);
@@ -811,7 +818,7 @@ mdoc_xx_pre(MDOC_ARGS)
                pp = "BSDI BSD/OS";
                break;
        case (MDOC_Dx):
-               pp = "DragonFlyBSD";
+               pp = "DragonFly";
                break;
        case (MDOC_Fx):
                pp = "FreeBSD";
@@ -952,10 +959,10 @@ mdoc_it_head_pre(MDOC_ARGS, int type, struct roffsu *width)
 
        switch (type) {
        case (MDOC_Item):
-               /* FALLTHROUGH */
+               return(0);
        case (MDOC_Ohang):
-               print_otag(h, TAG_DIV, 0, NULL);
-               break;
+               print_otag(h, TAG_DIV, 0, &tag);
+               return(1);
        case (MDOC_Column):
                bufcat_su(h, "min-width", width);
                bufcat_style(h, "clear", "none");
@@ -1069,6 +1076,8 @@ mdoc_it_pre(MDOC_ARGS)
        /* Override width in some cases. */
 
        switch (type) {
+       case (MDOC_Ohang):
+               /* FALLTHROUGH */
        case (MDOC_Item):
                /* FALLTHROUGH */
        case (MDOC_Inset):
@@ -1116,8 +1125,10 @@ mdoc_bl_pre(MDOC_ARGS)
                return(1);
 
        ord = malloc(sizeof(struct ord));
-       if (NULL == ord)
-               err(EXIT_FAILURE, "malloc");
+       if (NULL == ord) {
+               perror(NULL);
+               exit(EXIT_FAILURE);
+       }
        ord->cookie = n;
        ord->pos = 1;
        ord->next = h->ords.head;
@@ -1298,11 +1309,10 @@ mdoc_sx_pre(MDOC_ARGS)
        /* FIXME: duplicates? */
 
        strlcpy(buf, "#", BUFSIZ);
-       html_idcat(buf, "id_", BUFSIZ);
        for (nn = n->child; nn; nn = nn->next) {
                html_idcat(buf, nn->string, BUFSIZ);
                if (nn->next)
-                       html_idcat(buf, "_", BUFSIZ);
+                       html_idcat(buf, " ", BUFSIZ);
        }
 
        PAIR_CLASS_INIT(&tag[0], "link-sec");
@@ -1574,9 +1584,9 @@ mdoc_vt_pre(MDOC_ARGS)
        struct roffsu    su;
 
        if (SEC_SYNOPSIS == n->sec) {
-               if (n->next && MDOC_Vt != n->next->tok) {
+               if (n->prev && MDOC_Vt != n->prev->tok) {
                        SCALE_VS_INIT(&su, 1);
-                       bufcat_su(h, "margin-bottom", &su);
+                       bufcat_su(h, "margin-top", &su);
                        PAIR_STYLE_INIT(&tag, h);
                        print_otag(h, TAG_DIV, 1, &tag);
                } else
@@ -1719,7 +1729,10 @@ mdoc_sp_pre(MDOC_ARGS)
        bufcat_su(h, "height", &su);
        PAIR_STYLE_INIT(&tag, h);
        print_otag(h, TAG_DIV, 1, &tag);
-       return(1);
+       /* So the div isn't empty: */
+       print_text(h, "\\~");
+
+       return(0);
 
 }