]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_html.c
Improve (or rather, rewrite) tbl(7) option parsing.
[mandoc.git] / mdoc_html.c
index eed9b048c53f76d5978578d906a03ad971c9df56..f7ce59e8b2e84c9501d101b529259bb09d5a10de 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: mdoc_html.c,v 1.211 2014/11/19 22:00:37 schwarze Exp $ */
+/*     $Id: mdoc_html.c,v 1.219 2015/01/23 14:21:01 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2014, 2015 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
 #include <string.h>
 #include <unistd.h>
 
-#include "mandoc.h"
 #include "mandoc_aux.h"
+#include "mdoc.h"
 #include "out.h"
 #include "html.h"
-#include "mdoc.h"
 #include "main.h"
 
 #define        INDENT           5
@@ -183,7 +182,7 @@ static      const struct htmlmdoc mdocs[MDOC_MAX] = {
        {mdoc_quote_pre, mdoc_quote_post}, /* Bq */
        {mdoc_xx_pre, NULL}, /* Bsx */
        {mdoc_bx_pre, NULL}, /* Bx */
-       {NULL, NULL}, /* Db */
+       {mdoc_skip_pre, NULL}, /* Db */
        {NULL, NULL}, /* Dc */
        {mdoc_quote_pre, mdoc_quote_post}, /* Do */
        {mdoc_quote_pre, mdoc_quote_post}, /* Dq */
@@ -280,10 +279,11 @@ static void
 a2width(const char *p, struct roffsu *su)
 {
 
-       if ( ! a2roffsu(p, su, SCALE_MAX)) {
+       if (a2roffsu(p, su, SCALE_MAX) < 2) {
                su->unit = SCALE_EN;
                su->scale = html_strlen(p);
-       }
+       } else if (su->scale < 0.0)
+               su->scale = 0.0;
 }
 
 /*
@@ -423,13 +423,12 @@ print_mdoc_node(MDOC_ARGS)
                 * the "meta" table state.  This will be reopened on the
                 * next table element.
                 */
-               if (h->tblt) {
+               if (h->tblt != NULL) {
                        print_tblclose(h);
                        t = h->tags.head;
                }
-
-               assert(NULL == h->tblt);
-               if (mdocs[n->tok].pre && ENDBODY_NOT == n->end)
+               assert(h->tblt == NULL);
+               if (mdocs[n->tok].pre && (n->end == ENDBODY_NOT || n->child))
                        child = (*mdocs[n->tok].pre)(meta, n, h);
                break;
        }
@@ -454,8 +453,13 @@ print_mdoc_node(MDOC_ARGS)
        case MDOC_EQN:
                break;
        default:
-               if (mdocs[n->tok].post && ENDBODY_NOT == n->end)
-                       (*mdocs[n->tok].post)(meta, n, h);
+               if ( ! mdocs[n->tok].post || n->flags & MDOC_ENDED)
+                       break;
+               (*mdocs[n->tok].post)(meta, n, h);
+               if (n->end != ENDBODY_NOT)
+                       n->pending->flags |= MDOC_ENDED;
+               if (n->end == ENDBODY_NOSPACE)
+                       h->flags |= HTML_NOSPACE;
                break;
        }
 }
@@ -1198,7 +1202,8 @@ mdoc_bd_pre(MDOC_ARGS)
                default:
                        break;
                }
-               if (nn->next && nn->next->line == nn->line)
+               if (h->flags & HTML_NONEWLINE ||
+                   (nn->next && ! (nn->next->flags & MDOC_LINE)))
                        continue;
                else if (nn->next)
                        print_text(h, "\n");
@@ -1562,9 +1567,12 @@ mdoc_sp_pre(MDOC_ARGS)
        SCALE_VS_INIT(&su, 1);
 
        if (MDOC_sp == n->tok) {
-               if (NULL != (n = n->child))
+               if (NULL != (n = n->child)) {
                        if ( ! a2roffsu(n->string, &su, SCALE_VS))
-                               SCALE_VS_INIT(&su, atoi(n->string));
+                               su.scale = 1.0;
+                       else if (su.scale < 0.0)
+                               su.scale = 0.0;
+               }
        } else
                su.scale = 0.0;
 
@@ -1865,7 +1873,8 @@ static void
 mdoc_pf_post(MDOC_ARGS)
 {
 
-       h->flags |= HTML_NOSPACE;
+       if ( ! (n->next == NULL || n->next->flags & MDOC_LINE))
+               h->flags |= HTML_NOSPACE;
 }
 
 static int
@@ -2075,8 +2084,8 @@ mdoc_quote_pre(MDOC_ARGS)
        case MDOC_Ao:
                /* FALLTHROUGH */
        case MDOC_Aq:
-               print_text(h, n->parent->prev != NULL &&
-                   n->parent->prev->tok == MDOC_An ?  "<" : "\\(la");
+               print_text(h, n->nchild == 1 &&
+                   n->child->tok == MDOC_Mt ?  "<" : "\\(la");
                break;
        case MDOC_Bro:
                /* FALLTHROUGH */
@@ -2142,18 +2151,19 @@ static void
 mdoc_quote_post(MDOC_ARGS)
 {
 
-       if (MDOC_BODY != n->type)
+       if (n->type != MDOC_BODY && n->type != MDOC_ELEM)
                return;
 
-       if (MDOC_En != n->tok)
+       if ( ! (n->tok == MDOC_En ||
+           (n->tok == MDOC_Eo && n->end == ENDBODY_SPACE)))
                h->flags |= HTML_NOSPACE;
 
        switch (n->tok) {
        case MDOC_Ao:
                /* FALLTHROUGH */
        case MDOC_Aq:
-               print_text(h, n->parent->prev != NULL &&
-                   n->parent->prev->tok == MDOC_An ?  ">" : "\\(ra");
+               print_text(h, n->nchild == 1 &&
+                   n->child->tok == MDOC_Mt ?  ">" : "\\(ra");
                break;
        case MDOC_Bro:
                /* FALLTHROUGH */