=================================================================== RCS file: /cvs/mandoc/mdoc_html.c,v retrieving revision 1.253 retrieving revision 1.257 diff -u -p -r1.253 -r1.257 --- mandoc/mdoc_html.c 2017/01/19 15:27:34 1.253 +++ mandoc/mdoc_html.c 2017/01/20 21:37:56 1.257 @@ -1,4 +1,4 @@ -/* $Id: mdoc_html.c,v 1.253 2017/01/19 15:27:34 schwarze Exp $ */ +/* $Id: mdoc_html.c,v 1.257 2017/01/20 21:37:56 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons * Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze @@ -48,6 +48,7 @@ struct htmlmdoc { void (*post)(MDOC_ARGS); }; +static char *make_id(const struct roff_node *); static void print_mdoc_head(MDOC_ARGS); static void print_mdoc_node(MDOC_ARGS); static void print_mdoc_nodelist(MDOC_ARGS); @@ -241,22 +242,7 @@ static const struct htmlmdoc mdocs[MDOC_MAX] = { {mdoc_skip_pre, NULL}, /* ll */ }; -static const char * const lists[LIST_MAX] = { - NULL, - "list-bul", - "list-col", - "list-dash", - "list-diag", - "list-enum", - "list-hang", - "list-hyph", - "list-inset", - "list-item", - "list-ohang", - "list-tag" -}; - /* * See the same function in mdoc_term.c for documentation. */ @@ -492,7 +478,7 @@ mdoc_root_pre(MDOC_ARGS) return 1; } -char * +static char * make_id(const struct roff_node *n) { const struct roff_node *nch; @@ -635,11 +621,11 @@ mdoc_xr_pre(MDOC_ARGS) return 0; if (h->base_man) - print_otag(h, TAG_A, "chM", "link-man", + print_otag(h, TAG_A, "chM", "Xr", n->child->string, n->child->next == NULL ? NULL : n->child->next->string); else - print_otag(h, TAG_A, "c", "link-man"); + print_otag(h, TAG_A, "c", "Xr"); n = n->child; print_text(h, n->string); @@ -682,75 +668,104 @@ mdoc_xx_pre(MDOC_ARGS) static int mdoc_it_pre(MDOC_ARGS) { - enum mdoc_list type; - const struct roff_node *bl; + const struct roff_node *bl; + const char *cattr; + enum mdoc_list type; bl = n->parent; - while (bl && MDOC_Bl != bl->tok) + while (bl != NULL && bl->tok != MDOC_Bl) bl = bl->parent; type = bl->norm->Bl.type; - if (n->type == ROFFT_HEAD) { - switch (type) { - case LIST_bullet: - case LIST_dash: - case LIST_item: - case LIST_hyphen: - case LIST_enum: + switch (type) { + case LIST_bullet: + cattr = "It-bullet"; + break; + case LIST_dash: + case LIST_hyphen: + cattr = "It-dash"; + break; + case LIST_item: + cattr = "It-item"; + break; + case LIST_enum: + cattr = "It-enum"; + break; + case LIST_diag: + cattr = "It-diag"; + break; + case LIST_hang: + cattr = "It-hang"; + break; + case LIST_inset: + cattr = "It-inset"; + break; + case LIST_ohang: + cattr = "It-ohang"; + break; + case LIST_tag: + cattr = "It-tag"; + break; + case LIST_column: + cattr = "It-column"; + break; + default: + break; + } + + switch (type) { + case LIST_bullet: + case LIST_dash: + case LIST_hyphen: + case LIST_item: + case LIST_enum: + switch (n->type) { + case ROFFT_HEAD: return 0; - case LIST_diag: - case LIST_hang: - case LIST_inset: - case LIST_ohang: - case LIST_tag: - print_otag(h, TAG_DT, "csvt", lists[type], + case ROFFT_BODY: + print_otag(h, TAG_LI, "csvt", cattr, !bl->norm->Bl.comp); - if (LIST_diag != type) - break; - print_otag(h, TAG_B, "c", "diag"); break; - case LIST_column: - break; default: break; } - } else if (n->type == ROFFT_BODY) { - switch (type) { - case LIST_bullet: - case LIST_hyphen: - case LIST_dash: - case LIST_enum: - case LIST_item: - print_otag(h, TAG_LI, "csvt", lists[type], + break; + case LIST_diag: + case LIST_hang: + case LIST_inset: + case LIST_ohang: + case LIST_tag: + switch (n->type) { + case ROFFT_HEAD: + print_otag(h, TAG_DT, "csvt", cattr, !bl->norm->Bl.comp); + if (type == LIST_diag) + print_otag(h, TAG_B, "c", cattr); break; - case LIST_diag: - case LIST_hang: - case LIST_inset: - case LIST_ohang: - case LIST_tag: - if (NULL == bl->norm->Bl.width) { - print_otag(h, TAG_DD, "c", lists[type]); - break; - } - print_otag(h, TAG_DD, "cswl", lists[type], - bl->norm->Bl.width); + case ROFFT_BODY: + if (bl->norm->Bl.width == NULL) + print_otag(h, TAG_DD, "c", cattr); + else + print_otag(h, TAG_DD, "cswl", cattr, + bl->norm->Bl.width); break; - case LIST_column: - print_otag(h, TAG_TD, "csvt", lists[type], - !bl->norm->Bl.comp); - break; default: break; } - } else { - switch (type) { - case LIST_column: - print_otag(h, TAG_TR, "c", lists[type]); + break; + case LIST_column: + switch (n->type) { + case ROFFT_HEAD: break; - default: + case ROFFT_BODY: + print_otag(h, TAG_TD, "csvt", cattr, + !bl->norm->Bl.comp); break; + default: + print_otag(h, TAG_TR, "c", cattr); } + default: + break; } return 1; @@ -759,8 +774,8 @@ mdoc_it_pre(MDOC_ARGS) static int mdoc_bl_pre(MDOC_ARGS) { + const char *cattr; int i; - char buf[BUFSIZ]; enum htmltag elemtype; if (n->type == ROFFT_BODY) { @@ -787,39 +802,57 @@ mdoc_bl_pre(MDOC_ARGS) return 0; } - assert(lists[n->norm->Bl.type]); - (void)strlcpy(buf, "list ", BUFSIZ); - (void)strlcat(buf, lists[n->norm->Bl.type], BUFSIZ); - switch (n->norm->Bl.type) { case LIST_bullet: + elemtype = TAG_UL; + cattr = "Bl-bullet"; + break; case LIST_dash: case LIST_hyphen: + elemtype = TAG_UL; + cattr = "Bl-dash"; + break; case LIST_item: elemtype = TAG_UL; + cattr = "Bl-item"; break; case LIST_enum: elemtype = TAG_OL; + cattr = "Bl-enum"; break; case LIST_diag: + elemtype = TAG_DL; + cattr = "Bl-diag"; + break; case LIST_hang: + elemtype = TAG_DL; + cattr = "Bl-hang"; + break; case LIST_inset: + elemtype = TAG_DL; + cattr = "Bl-inset"; + break; case LIST_ohang: + elemtype = TAG_DL; + cattr = "Bl-ohang"; + break; case LIST_tag: elemtype = TAG_DL; + cattr = "Bl-tag"; break; case LIST_column: elemtype = TAG_TABLE; + cattr = "Bl-column"; break; default: abort(); } if (n->norm->Bl.offs) - print_otag(h, elemtype, "csvtvbwl", buf, 0, 0, + print_otag(h, elemtype, "csvtvbwl", cattr, 0, 0, n->norm->Bl.offs); else - print_otag(h, elemtype, "csvtvb", buf, 0, 0); + print_otag(h, elemtype, "csvtvb", cattr, 0, 0); return 1; } @@ -845,15 +878,11 @@ mdoc_d1_pre(MDOC_ARGS) if (n->type != ROFFT_BLOCK) return 1; - print_otag(h, TAG_BLOCKQUOTE, "svtvb", 0, 0); + print_otag(h, TAG_DIV, "c", "D1"); - /* BLOCKQUOTE needs a block body. */ + if (n->tok == MDOC_Dl) + print_otag(h, TAG_CODE, "c", "Li"); - print_otag(h, TAG_DIV, "c", "display"); - - if (MDOC_Dl == n->tok) - print_otag(h, TAG_CODE, "c", "lit"); - return 1; } @@ -862,12 +891,11 @@ mdoc_sx_pre(MDOC_ARGS) { char *id; - print_otag(h, TAG_I, "c", "link-sec"); if ((id = make_id(n)) != NULL) { - print_otag(h, TAG_A, "chR", "link-sec", id); + print_otag(h, TAG_A, "chR", "Sx", id); free(id); } else - print_otag(h, TAG_A, "c", "link-sec"); + print_otag(h, TAG_A, "c", "Sx"); return 1; } @@ -909,15 +937,15 @@ mdoc_bd_pre(MDOC_ARGS) offs = -1; if (offs == -1) - print_otag(h, TAG_DIV, "cswl", "display", n->norm->Bd.offs); + print_otag(h, TAG_DIV, "cswl", "Bd", n->norm->Bd.offs); else - print_otag(h, TAG_DIV, "cshl", "display", offs); + print_otag(h, TAG_DIV, "cshl", "Bd", offs); if (n->norm->Bd.type != DISP_unfilled && n->norm->Bd.type != DISP_literal) return 1; - print_otag(h, TAG_PRE, "c", "lit"); + print_otag(h, TAG_PRE, "c", "Li"); /* This can be recursive: save & set our literal state. */ @@ -1414,7 +1442,7 @@ mdoc_bf_pre(MDOC_ARGS) else if (FONT_Sy == n->norm->Bf.font) cattr = "symb"; else if (FONT_Li == n->norm->Bf.font) - cattr = "lit"; + cattr = "Li"; else cattr = "none"; @@ -1459,7 +1487,7 @@ mdoc_rs_pre(MDOC_ARGS) if (n->prev && SEC_SEE_ALSO == n->sec) print_paragraph(h); - print_otag(h, TAG_SPAN, "c", "ref"); + print_otag(h, TAG_SPAN, "c", "Rs"); return 1; } @@ -1473,7 +1501,7 @@ mdoc_no_pre(MDOC_ARGS) static int mdoc_li_pre(MDOC_ARGS) { - print_otag(h, TAG_CODE, "c", "lit"); + print_otag(h, TAG_CODE, "c", "Li"); return 1; } @@ -1504,64 +1532,58 @@ mdoc__x_pre(MDOC_ARGS) switch (n->tok) { case MDOC__A: - cattr = "ref-auth"; + cattr = "RsA"; if (n->prev && MDOC__A == n->prev->tok) if (NULL == n->next || MDOC__A != n->next->tok) print_text(h, "and"); break; case MDOC__B: - cattr = "ref-book"; t = TAG_I; + cattr = "RsB"; break; case MDOC__C: - cattr = "ref-city"; + cattr = "RsC"; break; case MDOC__D: - cattr = "ref-date"; + cattr = "RsD"; break; case MDOC__I: - cattr = "ref-issue"; t = TAG_I; + cattr = "RsI"; break; case MDOC__J: - cattr = "ref-jrnl"; t = TAG_I; + cattr = "RsJ"; break; case MDOC__N: - cattr = "ref-num"; + cattr = "RsN"; break; case MDOC__O: - cattr = "ref-opt"; + cattr = "RsO"; break; case MDOC__P: - cattr = "ref-page"; + cattr = "RsP"; break; case MDOC__Q: - cattr = "ref-corp"; + cattr = "RsQ"; break; case MDOC__R: - cattr = "ref-rep"; + cattr = "RsR"; break; case MDOC__T: - cattr = "ref-title"; + cattr = "RsT"; break; case MDOC__U: - cattr = "link-ref"; - break; + print_otag(h, TAG_A, "ch", "RsU", n->child->string); + return 1; case MDOC__V: - cattr = "ref-vol"; + cattr = "RsV"; break; default: abort(); } - if (MDOC__U != n->tok) { - print_otag(h, t, "c", cattr); - return 1; - } - - print_otag(h, TAG_A, "ch", cattr, n->child->string); - + print_otag(h, t, "c", cattr); return 1; } @@ -1656,7 +1678,7 @@ mdoc_quote_pre(MDOC_ARGS) case MDOC_Ql: print_text(h, "\\(oq"); h->flags |= HTML_NOSPACE; - print_otag(h, TAG_CODE, "c", "lit"); + print_otag(h, TAG_CODE, "c", "Li"); break; case MDOC_So: case MDOC_Sq: