Now that the NODE_NOFILL flag in the syntax tree is accurate,
[mandoc.git] / mdoc_html.c
index 555046be2c55e9ff5b9d8412953cbf1c079670b0..e4523f9575f2ff11a676cbfd35499c29bd58a00d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_html.c,v 1.313 2018/10/02 14:56:47 schwarze Exp $ */
+/*     $Id: mdoc_html.c,v 1.322 2018/12/31 10:35:56 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014,2015,2016,2017,2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -62,6 +62,7 @@ static        int               mdoc_root_pre(const struct roff_meta *,
 
 static void              mdoc__x_post(MDOC_ARGS);
 static int               mdoc__x_pre(MDOC_ARGS);
+static int               mdoc_abort_pre(MDOC_ARGS);
 static int               mdoc_ad_pre(MDOC_ARGS);
 static int               mdoc_an_pre(MDOC_ARGS);
 static int               mdoc_ap_pre(MDOC_ARGS);
@@ -154,7 +155,7 @@ static const struct mdoc_html_act mdoc_html_acts[MDOC_MAX - MDOC_Dd] = {
        {mdoc_nd_pre, NULL}, /* Nd */
        {mdoc_nm_pre, NULL}, /* Nm */
        {mdoc_quote_pre, mdoc_quote_post}, /* Op */
-       {mdoc_ft_pre, NULL}, /* Ot */
+       {mdoc_abort_pre, NULL}, /* Ot */
        {mdoc_pa_pre, NULL}, /* Pa */
        {mdoc_ex_pre, NULL}, /* Rv */
        {mdoc_st_pre, NULL}, /* St */
@@ -227,7 +228,7 @@ static const struct mdoc_html_act mdoc_html_acts[MDOC_MAX - MDOC_Dd] = {
        {mdoc_em_pre, NULL}, /* Fr */
        {NULL, NULL}, /* Ud */
        {mdoc_lb_pre, NULL}, /* Lb */
-       {mdoc_pp_pre, NULL}, /* Lp */
+       {mdoc_abort_pre, NULL}, /* Lp */
        {mdoc_lk_pre, NULL}, /* Lk */
        {mdoc_mt_pre, NULL}, /* Mt */
        {mdoc_quote_pre, mdoc_quote_post}, /* Brq */
@@ -282,7 +283,7 @@ synopsis_pre(struct html *h, const struct roff_node *n)
 }
 
 void
-html_mdoc(void *arg, const struct roff_man *mdoc)
+html_mdoc(void *arg, const struct roff_meta *mdoc)
 {
        struct html             *h;
        struct roff_node        *n;
@@ -297,16 +298,16 @@ html_mdoc(void *arg, const struct roff_man *mdoc)
                if (n->type == ROFFT_COMMENT)
                        print_gen_comment(h, n);
                t = print_otag(h, TAG_HEAD, "");
-               print_mdoc_head(&mdoc->meta, h);
+               print_mdoc_head(mdoc, h);
                print_tagq(h, t);
                print_otag(h, TAG_BODY, "");
        }
 
-       mdoc_root_pre(&mdoc->meta, h);
+       mdoc_root_pre(mdoc, h);
        t = print_otag(h, TAG_DIV, "c", "manual-text");
-       print_mdoc_nodelist(&mdoc->meta, n, h);
+       print_mdoc_nodelist(mdoc, n, h);
        print_tagq(h, t);
-       mdoc_root_post(&mdoc->meta, h);
+       mdoc_root_post(mdoc, h);
        print_tagq(h, NULL);
 }
 
@@ -365,7 +366,8 @@ print_mdoc_node(MDOC_ARGS)
                 * (i.e., within a <PRE>) don't print the newline.
                 */
                if (*n->string == ' ' && n->flags & NODE_LINE &&
-                   (h->flags & (HTML_LITERAL | HTML_NONEWLINE)) == 0)
+                   (h->flags & HTML_NONEWLINE) == 0 &&
+                   (n->flags & NODE_NOFILL) == 0)
                        print_otag(h, TAG_BR, "");
                if (NODE_DELIMC & n->flags)
                        h->flags |= HTML_NOSPACE;
@@ -507,8 +509,8 @@ cond_id(const struct roff_node *n)
 static int
 mdoc_sh_pre(MDOC_ARGS)
 {
-       struct roff_node        *sn;
-       struct tag              *t, *tt;
+       struct roff_node        *sn, *subn;
+       struct tag              *t, *tsec, *tsub;
        char                    *id;
        int                      sc;
 
@@ -530,13 +532,32 @@ mdoc_sh_pre(MDOC_ARGS)
                print_text(h, "TABLE OF CONTENTS");
                print_tagq(h, t);
                t = print_otag(h, TAG_UL, "c", "Bl-compact");
-               for (sn = n->next; sn != NULL; sn = sn->next) {
+               for (sn = n; sn != NULL; sn = sn->next) {
+                       tsec = print_otag(h, TAG_LI, "");
                        id = html_make_id(sn->head, 0);
-                       tt = print_otag(h, TAG_LI, "");
-                       print_otag(h, TAG_A, "hR", id);
-                       print_mdoc_nodelist(meta, sn->head->child, h);
-                       print_tagq(h, tt);
+                       tsub = print_otag(h, TAG_A, "hR", id);
                        free(id);
+                       print_mdoc_nodelist(meta, sn->head->child, h);
+                       print_tagq(h, tsub);
+                       tsub = NULL;
+                       for (subn = sn->body->child; subn != NULL;
+                           subn = subn->next) {
+                               if (subn->tok != MDOC_Ss)
+                                       continue;
+                               id = html_make_id(subn->head, 0);
+                               if (id == NULL)
+                                       continue;
+                               if (tsub == NULL)
+                                       print_otag(h, TAG_UL,
+                                           "c", "Bl-compact");
+                               tsub = print_otag(h, TAG_LI, "");
+                               print_otag(h, TAG_A, "hR", id);
+                               free(id);
+                               print_mdoc_nodelist(meta,
+                                   subn->head->child, h);
+                               print_tagq(h, tsub);
+                       }
+                       print_tagq(h, tsec);
                }
                print_tagq(h, t);
                break;
@@ -776,7 +797,7 @@ mdoc_it_pre(MDOC_ARGS)
 static int
 mdoc_bl_pre(MDOC_ARGS)
 {
-       char             cattr[28];
+       char             cattr[32];
        struct mdoc_bl  *bl;
        enum htmltag     elemtype;
 
@@ -895,7 +916,7 @@ mdoc_sx_pre(MDOC_ARGS)
 static int
 mdoc_bd_pre(MDOC_ARGS)
 {
-       int                      comp, sv;
+       int                      comp;
        struct roff_node        *nn;
 
        if (n->type == ROFFT_HEAD)
@@ -929,12 +950,6 @@ mdoc_bd_pre(MDOC_ARGS)
                return 1;
 
        print_otag(h, TAG_PRE, "c", "Li");
-
-       /* 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(meta, nn, h);
                /*
@@ -950,7 +965,6 @@ mdoc_bd_pre(MDOC_ARGS)
                case MDOC_Bl:
                case MDOC_D1:
                case MDOC_Dl:
-               case MDOC_Lp:
                case MDOC_Pp:
                        continue;
                default:
@@ -964,10 +978,6 @@ mdoc_bd_pre(MDOC_ARGS)
 
                h->flags |= HTML_NOSPACE;
        }
-
-       if (0 == sv)
-               h->flags &= ~HTML_LITERAL;
-
        return 0;
 }
 
@@ -1790,3 +1800,9 @@ mdoc_eo_post(MDOC_ARGS)
        else if ( ! tail)
                h->flags &= ~HTML_NOSPACE;
 }
+
+static int
+mdoc_abort_pre(MDOC_ARGS)
+{
+       abort();
+}