]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_html.c
correctly handle scaling units after .PD
[mandoc.git] / mdoc_html.c
index 9de0c1c8403e1ce23fad10c4d91a6ce403011b8a..ca51049eec53b7924e409552fc724053087a7c03 100644 (file)
@@ -1,6 +1,6 @@
-/*     $Id: mdoc_html.c,v 1.205 2014/09/27 09:26:01 kristaps Exp $ */
+/*     $Id: mdoc_html.c,v 1.216 2014/12/02 10:08:06 schwarze Exp $ */
 /*
- * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
 #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
@@ -56,7 +55,6 @@ static        void              synopsis_pre(struct html *,
                                const struct mdoc_node *);
 
 static void              a2width(const char *, struct roffsu *);
-static void              a2offs(const char *, struct roffsu *);
 
 static void              mdoc_root_post(MDOC_ARGS);
 static int               mdoc_root_pre(MDOC_ARGS);
@@ -99,6 +97,7 @@ static        int               mdoc_mt_pre(MDOC_ARGS);
 static int               mdoc_ms_pre(MDOC_ARGS);
 static int               mdoc_nd_pre(MDOC_ARGS);
 static int               mdoc_nm_pre(MDOC_ARGS);
+static int               mdoc_no_pre(MDOC_ARGS);
 static int               mdoc_ns_pre(MDOC_ARGS);
 static int               mdoc_pa_pre(MDOC_ARGS);
 static void              mdoc_pf_post(MDOC_ARGS);
@@ -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 */
@@ -193,7 +192,7 @@ static      const struct htmlmdoc mdocs[MDOC_MAX] = {
        {mdoc_quote_pre, mdoc_quote_post}, /* Eo */
        {mdoc_xx_pre, NULL}, /* Fx */
        {mdoc_ms_pre, NULL}, /* Ms */
-       {mdoc_igndelim_pre, NULL}, /* No */
+       {mdoc_no_pre, NULL}, /* No */
        {mdoc_ns_pre, NULL}, /* Ns */
        {mdoc_xx_pre, NULL}, /* Nx */
        {mdoc_xx_pre, NULL}, /* Ox */
@@ -281,7 +280,7 @@ a2width(const char *p, struct roffsu *su)
 {
 
        if ( ! a2roffsu(p, su, SCALE_MAX)) {
-               su->unit = SCALE_BU;
+               su->unit = SCALE_EN;
                su->scale = html_strlen(p);
        }
 }
@@ -314,11 +313,11 @@ synopsis_pre(struct html *h, const struct mdoc_node *n)
        case MDOC_In:
                /* FALLTHROUGH */
        case MDOC_Vt:
-               print_otag(h, TAG_P, 0, NULL);
+               print_paragraph(h);
                break;
        case MDOC_Ft:
                if (MDOC_Fn != n->tok && MDOC_Fo != n->tok) {
-                       print_otag(h, TAG_P, 0, NULL);
+                       print_paragraph(h);
                        break;
                }
                /* FALLTHROUGH */
@@ -328,27 +327,6 @@ synopsis_pre(struct html *h, const struct mdoc_node *n)
        }
 }
 
-/*
- * Calculate the scaling unit passed in an `-offset' argument.  This
- * uses either a native scaling unit (e.g., 1i, 2m), one of a set of
- * predefined strings (indent, etc.), or the string length of the value.
- */
-static void
-a2offs(const char *p, struct roffsu *su)
-{
-
-       /* FIXME: "right"? */
-
-       if (0 == strcmp(p, "left"))
-               SCALE_HS_INIT(su, 0);
-       else if (0 == strcmp(p, "indent"))
-               SCALE_HS_INIT(su, INDENT);
-       else if (0 == strcmp(p, "indent-two"))
-               SCALE_HS_INIT(su, INDENT * 2);
-       else if ( ! a2roffsu(p, su, SCALE_MAX))
-               SCALE_HS_INIT(su, html_strlen(p));
-}
-
 static void
 print_mdoc(MDOC_ARGS)
 {
@@ -444,13 +422,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;
        }
@@ -475,8 +452,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;
        }
 }
@@ -994,7 +976,7 @@ mdoc_bl_pre(MDOC_ARGS)
        /* Set the block's left-hand margin. */
 
        if (n->norm->Bl.offs) {
-               a2offs(n->norm->Bl.offs, &su);
+               a2width(n->norm->Bl.offs, &su);
                bufcat_su(h, "margin-left", &su);
        }
 
@@ -1156,13 +1138,21 @@ mdoc_bd_pre(MDOC_ARGS)
                                break;
                }
                if ( ! comp)
-                       print_otag(h, TAG_P, 0, NULL);
+                       print_paragraph(h);
                return(1);
        }
 
-       SCALE_HS_INIT(&su, 0);
-       if (n->norm->Bd.offs)
-               a2offs(n->norm->Bd.offs, &su);
+       /* Handle the -offset argument. */
+
+       if (n->norm->Bd.offs == NULL ||
+           ! strcmp(n->norm->Bd.offs, "left"))
+               SCALE_HS_INIT(&su, 0);
+       else if ( ! strcmp(n->norm->Bd.offs, "indent"))
+               SCALE_HS_INIT(&su, INDENT);
+       else if ( ! strcmp(n->norm->Bd.offs, "indent-two"))
+               SCALE_HS_INIT(&su, INDENT * 2);
+       else
+               a2width(n->norm->Bd.offs, &su);
 
        bufinit(h);
        bufcat_su(h, "margin-left", &su);
@@ -1211,7 +1201,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,7 +1553,7 @@ static int
 mdoc_pp_pre(MDOC_ARGS)
 {
 
-       print_otag(h, TAG_P, 0, NULL);
+       print_paragraph(h);
        return(0);
 }
 
@@ -1878,7 +1869,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
@@ -1890,13 +1882,23 @@ mdoc_rs_pre(MDOC_ARGS)
                return(1);
 
        if (n->prev && SEC_SEE_ALSO == n->sec)
-               print_otag(h, TAG_P, 0, NULL);
+               print_paragraph(h);
 
        PAIR_CLASS_INIT(&tag, "ref");
        print_otag(h, TAG_SPAN, 1, &tag);
        return(1);
 }
 
+static int
+mdoc_no_pre(MDOC_ARGS)
+{
+       struct htmlpair tag;
+
+       PAIR_CLASS_INIT(&tag, "none");
+       print_otag(h, TAG_CODE, 1, &tag);
+       return(1);
+}
+
 static int
 mdoc_li_pre(MDOC_ARGS)
 {
@@ -2078,7 +2080,8 @@ mdoc_quote_pre(MDOC_ARGS)
        case MDOC_Ao:
                /* FALLTHROUGH */
        case MDOC_Aq:
-               print_text(h, "\\(la");
+               print_text(h, n->parent->prev != NULL &&
+                   n->parent->prev->tok == MDOC_An ?  "<" : "\\(la");
                break;
        case MDOC_Bro:
                /* FALLTHROUGH */
@@ -2144,17 +2147,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, "\\(ra");
+               print_text(h, n->parent->prev != NULL &&
+                   n->parent->prev->tok == MDOC_An ?  ">" : "\\(ra");
                break;
        case MDOC_Bro:
                /* FALLTHROUGH */