]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_html.c
EQN blocks are now printed in all modes. This is simply a printing of
[mandoc.git] / mdoc_html.c
index 36008de53d0841106cf0520c02c0e5759564d44c..712cd92aa556de4e84714d94c35fa5f92dbae154 100644 (file)
@@ -1,6 +1,6 @@
-/*     $Id: mdoc_html.c,v 1.139 2010/12/24 22:47:37 kristaps Exp $ */
+/*     $Id: mdoc_html.c,v 1.153 2011/02/09 09:52:47 kristaps Exp $ */
 /*
- * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
+ * 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
@@ -410,6 +410,7 @@ print_mdoc_node(MDOC_ARGS)
 {
        int              child;
        struct tag      *t;
+       struct htmlpair  tag;
 
        child = 1;
        t = h->tags.head;
@@ -420,9 +421,43 @@ print_mdoc_node(MDOC_ARGS)
                child = mdoc_root_pre(m, n, h);
                break;
        case (MDOC_TEXT):
+               /* No tables in this mode... */
+               assert(NULL == h->tblt);
+
+               /*
+                * Make sure that if we're in a literal mode already
+                * (i.e., within a <PRE>) don't print the newline.
+                */
+               if (' ' == *n->string && MDOC_LINE & n->flags)
+                       if ( ! (HTML_LITERAL & h->flags))
+                               print_otag(h, TAG_BR, 0, NULL);
                print_text(h, n->string);
                return;
+       case (MDOC_EQN):
+               PAIR_CLASS_INIT(&tag, "eqn");
+               print_otag(h, TAG_SPAN, 1, &tag);
+               print_text(h, n->eqn->data);
+               break;
+       case (MDOC_TBL):
+               /*
+                * This will take care of initialising all of the table
+                * state data for the first table, then tearing it down
+                * for the last one.
+                */
+               print_tbl(h, n->span);
+               return;
        default:
+               /*
+                * Close out the current table, if it's open, and unset
+                * the "meta" table state.  This will be reopened on the
+                * next table element.
+                */
+               if (h->tblt) {
+                       print_tblclose(h);
+                       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);
                break;
@@ -450,6 +485,8 @@ print_mdoc_node(MDOC_ARGS)
        case (MDOC_ROOT):
                mdoc_root_post(m, n, h);
                break;
+       case (MDOC_EQN):
+               break;
        default:
                if (mdocs[n->tok].post && ENDBODY_NOT == n->end)
                        (*mdocs[n->tok].post)(m, n, h);
@@ -751,7 +788,8 @@ static int
 mdoc_ns_pre(MDOC_ARGS)
 {
 
-       h->flags |= HTML_NOSPACE;
+       if ( ! (MDOC_LINE & n->flags))
+               h->flags |= HTML_NOSPACE;
        return(1);
 }
 
@@ -774,6 +812,7 @@ mdoc_xx_pre(MDOC_ARGS)
 {
        const char      *pp;
        struct htmlpair  tag;
+       int              flags;
 
        switch (n->tok) {
        case (MDOC_Bsx):
@@ -800,8 +839,15 @@ mdoc_xx_pre(MDOC_ARGS)
 
        PAIR_CLASS_INIT(&tag, "unix");
        print_otag(h, TAG_SPAN, 1, &tag);
+
        print_text(h, pp);
-       return(1);
+       if (n->child) {
+               flags = h->flags;
+               h->flags |= HTML_KEEP;
+               print_text(h, n->child->string);
+               h->flags = flags;
+       }
+       return(0);
 }
 
 
@@ -809,22 +855,31 @@ mdoc_xx_pre(MDOC_ARGS)
 static int
 mdoc_bx_pre(MDOC_ARGS)
 {
-       const struct mdoc_node  *nn;
-       struct htmlpair          tag;
+       struct htmlpair  tag;
 
        PAIR_CLASS_INIT(&tag, "unix");
        print_otag(h, TAG_SPAN, 1, &tag);
 
-       for (nn = n->child; nn; nn = nn->next)
-               print_mdoc_node(m, nn, h);
+       if (NULL != (n = n->child)) {
+               print_text(h, n->string);
+               h->flags |= HTML_NOSPACE;
+               print_text(h, "BSD");
+       } else {
+               print_text(h, "BSD");
+               return(0);
+       }
 
-       if (n->child)
+       if (NULL != (n = n->next)) {
+               h->flags |= HTML_NOSPACE;
+               print_text(h, "-");
                h->flags |= HTML_NOSPACE;
+               print_text(h, n->string);
+       }
 
-       print_text(h, "BSD");
        return(0);
 }
 
+/* ARGSUSED */
 static int
 mdoc_it_pre(MDOC_ARGS)
 {
@@ -939,7 +994,7 @@ mdoc_it_pre(MDOC_ARGS)
 static int
 mdoc_bl_pre(MDOC_ARGS)
 {
-       size_t           i;
+       int              i;
        struct htmlpair  tag[3];
        struct roffsu    su;
        char             buf[BUFSIZ];
@@ -961,10 +1016,10 @@ mdoc_bl_pre(MDOC_ARGS)
                 * screen and we want to preserve that behaviour.
                 */
 
-               for (i = 0; i < n->norm->Bl.ncols; i++) {
+               for (i = 0; i < (int)n->norm->Bl.ncols; i++) {
                        a2width(n->norm->Bl.cols[i], &su);
                        bufinit(h);
-                       if (i < n->norm->Bl.ncols - 1)
+                       if (i < (int)n->norm->Bl.ncols - 1)
                                bufcat_su(h, "width", &su);
                        else
                                bufcat_su(h, "min-width", &su);
@@ -1137,7 +1192,7 @@ static int
 mdoc_bd_pre(MDOC_ARGS)
 {
        struct htmlpair          tag[2];
-       int                      comp;
+       int                      comp, sv;
        const struct mdoc_node  *nn;
        struct roffsu            su;
 
@@ -1176,6 +1231,11 @@ mdoc_bd_pre(MDOC_ARGS)
        PAIR_CLASS_INIT(&tag[1], "lit display");
        print_otag(h, TAG_PRE, 2, tag);
 
+       /* This can be recursive: save & set our literal state. */
+
+       sv = h->flags & HTML_LITERAL;
+       h->flags |= HTML_LITERAL;
+
        for (nn = n->child; nn; nn = nn->next) {
                print_mdoc_node(m, nn, h);
                /*
@@ -1212,6 +1272,9 @@ mdoc_bd_pre(MDOC_ARGS)
                h->flags |= HTML_NOSPACE;
        }
 
+       if (0 == sv)
+               h->flags &= ~HTML_LITERAL;
+
        return(0);
 }