=================================================================== RCS file: /cvs/mandoc/mdoc_html.c,v retrieving revision 1.288 retrieving revision 1.295 diff -u -p -r1.288 -r1.295 --- mandoc/mdoc_html.c 2017/05/17 17:54:45 1.288 +++ mandoc/mdoc_html.c 2018/04/11 17:11:13 1.295 @@ -1,4 +1,4 @@ -/* $Id: mdoc_html.c,v 1.288 2017/05/17 17:54:45 schwarze Exp $ */ +/* $Id: mdoc_html.c,v 1.295 2018/04/11 17:11:13 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons * Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze @@ -27,6 +27,7 @@ #include #include "mandoc_aux.h" +#include "mandoc.h" #include "roff.h" #include "mdoc.h" #include "out.h" @@ -343,7 +344,7 @@ print_mdoc_node(MDOC_ARGS) int child; struct tag *t; - if (n->flags & NODE_NOPRT) + if (n->type == ROFFT_COMMENT || n->flags & NODE_NOPRT) return; child = 1; @@ -714,10 +715,7 @@ mdoc_it_pre(MDOC_ARGS) case ROFFT_HEAD: return 0; case ROFFT_BODY: - if (bl->norm->Bl.comp) - print_otag(h, TAG_LI, "csvt", cattr, 0); - else - print_otag(h, TAG_LI, "c", cattr); + print_otag(h, TAG_LI, "c", cattr); break; default: break; @@ -729,15 +727,12 @@ mdoc_it_pre(MDOC_ARGS) case LIST_ohang: switch (n->type) { case ROFFT_HEAD: - if (bl->norm->Bl.comp) - print_otag(h, TAG_DT, "csvt", cattr, 0); - else - print_otag(h, TAG_DT, "c", cattr); + print_otag(h, TAG_DT, "c", cattr); if (type == LIST_diag) print_otag(h, TAG_B, "c", cattr); break; case ROFFT_BODY: - print_otag(h, TAG_DD, "cswl", cattr, + print_otag(h, TAG_DD, "csw*+l", cattr, bl->norm->Bl.width); break; default: @@ -751,7 +746,7 @@ mdoc_it_pre(MDOC_ARGS) (n->parent->prev == NULL || n->parent->prev->body == NULL || n->parent->prev->body->child != NULL)) { - t = print_otag(h, TAG_DT, "csw+-l", + t = print_otag(h, TAG_DT, "csw*+-l", cattr, bl->norm->Bl.width); print_text(h, "\\ "); print_tagq(h, t); @@ -759,7 +754,7 @@ mdoc_it_pre(MDOC_ARGS) print_text(h, "\\ "); print_tagq(h, t); } - print_otag(h, TAG_DT, "csw+-l", cattr, + print_otag(h, TAG_DT, "csw*+-l", cattr, bl->norm->Bl.width); break; case ROFFT_BODY: @@ -779,10 +774,7 @@ mdoc_it_pre(MDOC_ARGS) case ROFFT_HEAD: break; case ROFFT_BODY: - if (bl->norm->Bl.comp) - print_otag(h, TAG_TD, "csvt", cattr, 0); - else - print_otag(h, TAG_TD, "c", cattr); + print_otag(h, TAG_TD, "c", cattr); break; default: print_otag(h, TAG_TR, "c", cattr); @@ -797,9 +789,9 @@ mdoc_it_pre(MDOC_ARGS) static int mdoc_bl_pre(MDOC_ARGS) { + char cattr[21]; struct tag *t; struct mdoc_bl *bl; - const char *cattr; size_t i; enum htmltag elemtype; @@ -834,50 +826,52 @@ mdoc_bl_pre(MDOC_ARGS) switch (bl->type) { case LIST_bullet: elemtype = TAG_UL; - cattr = "Bl-bullet"; + (void)strlcpy(cattr, "Bl-bullet", sizeof(cattr)); break; case LIST_dash: case LIST_hyphen: elemtype = TAG_UL; - cattr = "Bl-dash"; + (void)strlcpy(cattr, "Bl-dash", sizeof(cattr)); break; case LIST_item: elemtype = TAG_UL; - cattr = "Bl-item"; + (void)strlcpy(cattr, "Bl-item", sizeof(cattr)); break; case LIST_enum: elemtype = TAG_OL; - cattr = "Bl-enum"; + (void)strlcpy(cattr, "Bl-enum", sizeof(cattr)); break; case LIST_diag: elemtype = TAG_DL; - cattr = "Bl-diag"; + (void)strlcpy(cattr, "Bl-diag", sizeof(cattr)); break; case LIST_hang: elemtype = TAG_DL; - cattr = "Bl-hang"; + (void)strlcpy(cattr, "Bl-hang", sizeof(cattr)); break; case LIST_inset: elemtype = TAG_DL; - cattr = "Bl-inset"; + (void)strlcpy(cattr, "Bl-inset", sizeof(cattr)); break; case LIST_ohang: elemtype = TAG_DL; - cattr = "Bl-ohang"; + (void)strlcpy(cattr, "Bl-ohang", sizeof(cattr)); break; case LIST_tag: - cattr = "Bl-tag"; if (bl->offs) - print_otag(h, TAG_DIV, "cswl", cattr, bl->offs); - print_otag(h, TAG_DL, "csw+l", cattr, bl->width); + print_otag(h, TAG_DIV, "cswl", "Bl-tag", bl->offs); + print_otag(h, TAG_DL, "csw*+l", bl->comp ? + "Bl-tag Bl-compact" : "Bl-tag", bl->width); return 1; case LIST_column: elemtype = TAG_TABLE; - cattr = "Bl-column"; + (void)strlcpy(cattr, "Bl-column", sizeof(cattr)); break; default: abort(); } + if (bl->comp) + (void)strlcat(cattr, " Bl-compact", sizeof(cattr)); print_otag(h, elemtype, "cswl", cattr, bl->offs); return 1; } @@ -1309,24 +1303,36 @@ mdoc_pp_pre(MDOC_ARGS) static int mdoc_lk_pre(MDOC_ARGS) { + const struct roff_node *link, *descr, *punct; struct tag *t; - if ((n = n->child) == NULL) + if ((link = n->child) == NULL) return 0; + /* Find beginning of trailing punctuation. */ + punct = n->last; + while (punct != link && punct->flags & NODE_DELIMC) + punct = punct->prev; + punct = punct->next; + /* Link target and link text. */ - t = print_otag(h, TAG_A, "cTh", "Lk", n->string); - if (n->next == NULL || n->next->flags & NODE_DELIMC) - print_text(h, n->string); - for (n = n->next; n != NULL && !(n->flags & NODE_DELIMC); n = n->next) - print_text(h, n->string); + descr = link->next; + if (descr == punct) + descr = link; /* no text */ + t = print_otag(h, TAG_A, "cTh", "Lk", link->string); + do { + if (descr->flags & (NODE_DELIMC | NODE_DELIMO)) + h->flags |= HTML_NOSPACE; + print_text(h, descr->string); + descr = descr->next; + } while (descr != punct); print_tagq(h, t); /* Trailing punctuation. */ - while (n != NULL) { + while (punct != NULL) { h->flags |= HTML_NOSPACE; - print_text(h, n->string); - n = n->next; + print_text(h, punct->string); + punct = punct->next; } return 0; }