=================================================================== RCS file: /cvs/mandoc/mdoc_html.c,v retrieving revision 1.123 retrieving revision 1.132 diff -u -p -r1.123 -r1.132 --- mandoc/mdoc_html.c 2010/12/17 00:18:29 1.123 +++ mandoc/mdoc_html.c 2010/12/20 10:40:11 1.132 @@ -1,4 +1,4 @@ -/* $Id: mdoc_html.c,v 1.123 2010/12/17 00:18:29 kristaps Exp $ */ +/* $Id: mdoc_html.c,v 1.132 2010/12/20 10:40:11 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * @@ -287,7 +287,7 @@ a2width(const char *p, struct roffsu *su) { if ( ! a2roffsu(p, su, SCALE_MAX)) { - su->unit = SCALE_EM; + su->unit = SCALE_BU; su->scale = (int)strlen(p); } } @@ -299,21 +299,15 @@ a2width(const char *p, struct roffsu *su) static void synopsis_pre(struct html *h, const struct mdoc_node *n) { - struct roffsu su; - struct htmlpair tag; if (NULL == n->prev || ! (MDOC_SYNPRETTY & n->flags)) return; - SCALE_VS_INIT(&su, 1); - bufcat_su(h, "margin-top", &su); - PAIR_STYLE_INIT(&tag, h); - if (n->prev->tok == n->tok && MDOC_Fo != n->tok && MDOC_Ft != n->tok && MDOC_Fn != n->tok) { - print_otag(h, TAG_DIV, 0, NULL); + print_otag(h, TAG_BR, 0, NULL); return; } @@ -327,16 +321,16 @@ synopsis_pre(struct html *h, const struct mdoc_node *n case (MDOC_In): /* FALLTHROUGH */ case (MDOC_Vt): - print_otag(h, TAG_DIV, 1, &tag); + print_otag(h, TAG_P, 0, NULL); break; case (MDOC_Ft): if (MDOC_Fn != n->tok && MDOC_Fo != n->tok) { - print_otag(h, TAG_DIV, 1, &tag); + print_otag(h, TAG_P, 0, NULL); break; } /* FALLTHROUGH */ default: - print_otag(h, TAG_DIV, 0, NULL); + print_otag(h, TAG_BR, 0, NULL); break; } } @@ -360,7 +354,7 @@ a2offs(const char *p, struct roffsu *su) else if (0 == strcmp(p, "indent-two")) SCALE_HS_INIT(su, INDENT * 2); else if ( ! a2roffsu(p, su, SCALE_MAX)) { - su->unit = SCALE_EM; + su->unit = SCALE_BU; su->scale = (int)strlen(p); } } @@ -463,7 +457,6 @@ print_mdoc_node(MDOC_ARGS) } } - /* ARGSUSED */ static void mdoc_root_post(MDOC_ARGS) @@ -474,26 +467,34 @@ mdoc_root_post(MDOC_ARGS) time2a(m->date, b, DATESIZ); - PAIR_CLASS_INIT(&tag[0], "footer"); - bufcat_style(h, "width", "100%"); - PAIR_STYLE_INIT(&tag[1], h); - PAIR_SUMMARY_INIT(&tag[2], "footer"); + PAIR_SUMMARY_INIT(&tag[0], "Document Footer"); + PAIR_CLASS_INIT(&tag[1], "foot"); + if (NULL == h->style) { + PAIR_INIT(&tag[1], ATTR_WIDTH, "100%"); + t = print_otag(h, TAG_TABLE, 3, tag); + PAIR_INIT(&tag[0], ATTR_WIDTH, "50%"); + print_otag(h, TAG_COL, 1, tag); + print_otag(h, TAG_COL, 1, tag); + } else + t = print_otag(h, TAG_TABLE, 2, tag); - t = print_otag(h, TAG_TABLE, 3, tag); + t = print_otag(h, TAG_TBODY, 0, NULL); + tt = print_otag(h, TAG_TR, 0, NULL); - bufinit(h); - bufcat_style(h, "width", "50%"); - PAIR_STYLE_INIT(&tag[0], h); + PAIR_CLASS_INIT(&tag[0], "foot-date"); print_otag(h, TAG_TD, 1, tag); + print_text(h, b); print_stagq(h, tt); - bufinit(h); - bufcat_style(h, "width", "50%"); - bufcat_style(h, "text-align", "right"); - PAIR_STYLE_INIT(&tag[0], h); - print_otag(h, TAG_TD, 1, tag); + PAIR_CLASS_INIT(&tag[0], "foot-os"); + if (NULL == h->style) { + PAIR_INIT(&tag[1], ATTR_ALIGN, "right"); + print_otag(h, TAG_TD, 2, tag); + } else + print_otag(h, TAG_TD, 1, tag); + print_text(h, m->os); print_tagq(h, t); } @@ -517,36 +518,45 @@ mdoc_root_pre(MDOC_ARGS) snprintf(title, BUFSIZ - 1, "%s(%s)", m->title, m->msec); - PAIR_CLASS_INIT(&tag[0], "header"); - bufcat_style(h, "width", "100%"); - PAIR_STYLE_INIT(&tag[1], h); - PAIR_SUMMARY_INIT(&tag[2], "header"); + PAIR_SUMMARY_INIT(&tag[0], "Document Header"); + PAIR_CLASS_INIT(&tag[1], "head"); + if (NULL == h->style) { + PAIR_INIT(&tag[2], ATTR_WIDTH, "100%"); + t = print_otag(h, TAG_TABLE, 3, tag); + PAIR_INIT(&tag[0], ATTR_WIDTH, "30%"); + print_otag(h, TAG_COL, 1, tag); + print_otag(h, TAG_COL, 1, tag); + print_otag(h, TAG_COL, 1, tag); + } else + t = print_otag(h, TAG_TABLE, 2, tag); - t = print_otag(h, TAG_TABLE, 3, tag); + print_otag(h, TAG_TBODY, 0, NULL); tt = print_otag(h, TAG_TR, 0, NULL); - bufinit(h); - bufcat_style(h, "width", "10%"); - PAIR_STYLE_INIT(&tag[0], h); + PAIR_CLASS_INIT(&tag[0], "head-ltitle"); print_otag(h, TAG_TD, 1, tag); + print_text(h, title); print_stagq(h, tt); - bufinit(h); - bufcat_style(h, "text-align", "center"); - bufcat_style(h, "white-space", "nowrap"); - bufcat_style(h, "width", "80%"); - PAIR_STYLE_INIT(&tag[0], h); - print_otag(h, TAG_TD, 1, tag); + PAIR_CLASS_INIT(&tag[0], "head-vol"); + if (NULL == h->style) { + PAIR_INIT(&tag[1], ATTR_ALIGN, "center"); + print_otag(h, TAG_TD, 2, tag); + } else + print_otag(h, TAG_TD, 1, tag); + print_text(h, b); print_stagq(h, tt); - bufinit(h); - bufcat_style(h, "text-align", "right"); - bufcat_style(h, "width", "10%"); - PAIR_STYLE_INIT(&tag[0], h); - print_otag(h, TAG_TD, 1, tag); + PAIR_CLASS_INIT(&tag[0], "head-rtitle"); + if (NULL == h->style) { + PAIR_INIT(&tag[1], ATTR_ALIGN, "right"); + print_otag(h, TAG_TD, 2, tag); + } else + print_otag(h, TAG_TD, 1, tag); + print_text(h, title); print_tagq(h, t); return(1); @@ -614,7 +624,7 @@ mdoc_fl_pre(MDOC_ARGS) struct htmlpair tag; PAIR_CLASS_INIT(&tag, "flag"); - print_otag(h, TAG_SPAN, 1, &tag); + print_otag(h, TAG_B, 1, &tag); /* `Cm' has no leading hyphen. */ @@ -644,7 +654,7 @@ mdoc_nd_pre(MDOC_ARGS) /* XXX: this tag in theory can contain block elements. */ print_text(h, "\\(em"); - PAIR_CLASS_INIT(&tag, "desc-body"); + PAIR_CLASS_INIT(&tag, "desc"); print_otag(h, TAG_SPAN, 1, &tag); return(1); } @@ -655,68 +665,46 @@ mdoc_nm_pre(MDOC_ARGS) { struct htmlpair tag; struct roffsu su; - const char *cp; + size_t len; - /* - * Accomodate for `Nm' being both an element (which may have - * NULL children AND no m->name) and a block. - */ - - cp = NULL; - - if (MDOC_ELEM == n->type) { - if (NULL == n->child && NULL == m->name) - return(1); + switch (n->type) { + case (MDOC_ELEM): synopsis_pre(h, n); PAIR_CLASS_INIT(&tag, "name"); - print_otag(h, TAG_SPAN, 1, &tag); - if (NULL == n->child) + print_otag(h, TAG_B, 1, &tag); + if (NULL == n->child && m->name) print_text(h, m->name); - } else if (MDOC_BLOCK == n->type) { - synopsis_pre(h, n); + return(1); + case (MDOC_HEAD): + print_otag(h, TAG_TD, 0, NULL); + if (NULL == n->child && m->name) + print_text(h, m->name); + return(1); + case (MDOC_BODY): + print_otag(h, TAG_TD, 0, NULL); + return(1); + default: + break; + } - bufcat_style(h, "clear", "both"); - if (n->head->child || m->name) { - if (n->head->child && MDOC_TEXT == - n->head->child->type) - cp = n->head->child->string; - if (NULL == cp || '\0' == *cp) - cp = m->name; + synopsis_pre(h, n); + PAIR_CLASS_INIT(&tag, "synopsis"); + print_otag(h, TAG_TABLE, 1, &tag); - SCALE_HS_INIT(&su, (double)strlen(cp)); - bufcat_su(h, "padding-left", &su); - } + for (len = 0, n = n->child; n; n = n->next) + if (MDOC_TEXT == n->type) + len += strlen(n->string); - PAIR_STYLE_INIT(&tag, h); - print_otag(h, TAG_DIV, 1, &tag); - } else if (MDOC_HEAD == n->type) { - if (NULL == n->child && NULL == m->name) - return(1); + if (0 == len && m->name) + len = strlen(m->name); - if (n->child && MDOC_TEXT == n->child->type) - cp = n->child->string; - if (NULL == cp || '\0' == *cp) - cp = m->name; - - SCALE_HS_INIT(&su, (double)strlen(cp)); - - bufcat_style(h, "float", "left"); - bufcat_su(h, "min-width", &su); - SCALE_INVERT(&su); - bufcat_su(h, "margin-left", &su); - - PAIR_STYLE_INIT(&tag, h); - print_otag(h, TAG_DIV, 1, &tag); - - if (NULL == n->child) - print_text(h, m->name); - } else if (MDOC_BODY == n->type) { - SCALE_HS_INIT(&su, 2); - bufcat_su(h, "margin-left", &su); - PAIR_STYLE_INIT(&tag, h); - print_otag(h, TAG_DIV, 1, &tag); - } - + SCALE_HS_INIT(&su, (double)len); + bufcat_su(h, "width", &su); + PAIR_STYLE_INIT(&tag, h); + print_otag(h, TAG_COL, 1, &tag); + print_otag(h, TAG_COL, 0, NULL); + print_otag(h, TAG_TBODY, 0, NULL); + print_otag(h, TAG_TR, 0, NULL); return(1); } @@ -869,6 +857,7 @@ mdoc_it_pre(MDOC_ARGS) case(LIST_enum): return(0); case(LIST_diag): + /* FIXME: STYLE for diag! */ /* FALLTHROUGH */ case(LIST_hang): /* FALLTHROUGH */ @@ -988,7 +977,10 @@ mdoc_bl_pre(MDOC_ARGS) PAIR_STYLE_INIT(&tag[0], h); assert(lists[n->data.Bl->type]); - PAIR_CLASS_INIT(&tag[1], lists[n->data.Bl->type]); + bufinit(h); + bufcat(h, "list "); + bufcat(h, lists[n->data.Bl->type]); + PAIR_INIT(&tag[1], ATTR_CLASS, h->buf); i = 2; /* Set the block's left-hand margin. */ @@ -1043,11 +1035,14 @@ mdoc_ex_pre(MDOC_ARGS) struct tag *t; struct htmlpair tag; + if (n->prev) + print_otag(h, TAG_BR, 0, NULL); + PAIR_CLASS_INIT(&tag, "utility"); print_text(h, "The"); for (nn = n->child; nn; nn = nn->next) { - t = print_otag(h, TAG_SPAN, 1, &tag); + t = print_otag(h, TAG_B, 1, &tag); print_text(h, nn->string); print_tagq(h, t); @@ -1101,12 +1096,12 @@ mdoc_d1_pre(MDOC_ARGS) /* BLOCKQUOTE needs a block body. */ - if (MDOC_Dl == n->tok) { - PAIR_CLASS_INIT(&tag[1], "lit"); - print_otag(h, TAG_DIV, 1, tag); - } else - print_otag(h, TAG_DIV, 0, tag); + if (MDOC_Dl == n->tok) + PAIR_CLASS_INIT(&tag[0], "lit display"); + else + PAIR_CLASS_INIT(&tag[0], "display"); + print_otag(h, TAG_DIV, 1, tag); return(1); } @@ -1146,19 +1141,8 @@ mdoc_bd_pre(MDOC_ARGS) if (MDOC_HEAD == n->type) return(0); - SCALE_VS_INIT(&su, 0); - - assert(n->data.Bd); - if (n->data.Bd->offs) - a2offs(n->data.Bd->offs, &su); - - comp = n->data.Bd->comp; - - /* FIXME: -centered, etc. formatting. */ - /* FIXME: does not respect -offset ??? */ - if (MDOC_BLOCK == n->type) { - bufcat_su(h, "margin-left", &su); + comp = n->data.Bd->comp; for (nn = n; nn && ! comp; nn = nn->parent) { if (MDOC_BLOCK != nn->type) continue; @@ -1167,26 +1151,27 @@ mdoc_bd_pre(MDOC_ARGS) if (nn->prev) break; } - if (comp) { - PAIR_STYLE_INIT(&tag[0], h); - print_otag(h, TAG_DIV, 1, tag); - return(1); - } - SCALE_VS_INIT(&su, 1); - bufcat_su(h, "margin-top", &su); - PAIR_STYLE_INIT(&tag[0], h); - print_otag(h, TAG_DIV, 1, tag); + if ( ! comp) + print_otag(h, TAG_P, 0, NULL); return(1); } + SCALE_HS_INIT(&su, 0); + if (n->data.Bd->offs) + a2offs(n->data.Bd->offs, &su); + + bufcat_su(h, "margin-left", &su); + PAIR_STYLE_INIT(&tag[0], h); + if (DISP_unfilled != n->data.Bd->type && - DISP_literal != n->data.Bd->type) + DISP_literal != n->data.Bd->type) { + PAIR_CLASS_INIT(&tag[1], "display"); + print_otag(h, TAG_DIV, 2, tag); return(1); + } - PAIR_CLASS_INIT(&tag[0], "lit"); - bufcat_style(h, "white-space", "pre"); - PAIR_STYLE_INIT(&tag[1], h); - print_otag(h, TAG_DIV, 2, tag); + PAIR_CLASS_INIT(&tag[1], "lit display"); + print_otag(h, TAG_PRE, 2, tag); for (nn = n->child; nn; nn = nn->next) { print_mdoc_node(m, nn, h); @@ -1218,7 +1203,9 @@ mdoc_bd_pre(MDOC_ARGS) } if (nn->next && nn->next->line == nn->line) continue; - print_text(h, "\n"); + else if (nn->next) + print_text(h, "\n"); + h->flags |= HTML_NOSPACE; } @@ -1272,7 +1259,7 @@ mdoc_cd_pre(MDOC_ARGS) synopsis_pre(h, n); PAIR_CLASS_INIT(&tag, "config"); - print_otag(h, TAG_SPAN, 1, &tag); + print_otag(h, TAG_B, 1, &tag); return(1); } @@ -1351,7 +1338,7 @@ mdoc_fd_pre(MDOC_ARGS) synopsis_pre(h, n); PAIR_CLASS_INIT(&tag, "macro"); - print_otag(h, TAG_SPAN, 1, &tag); + print_otag(h, TAG_B, 1, &tag); return(1); } @@ -1440,7 +1427,7 @@ mdoc_fn_pre(MDOC_ARGS) } #endif - t = print_otag(h, TAG_SPAN, 1, tag); + t = print_otag(h, TAG_B, 1, tag); if (sp) { strlcpy(nbuf, sp, BUFSIZ); @@ -1638,7 +1625,7 @@ mdoc_in_pre(MDOC_ARGS) synopsis_pre(h, n); PAIR_CLASS_INIT(&tag[0], "includes"); - print_otag(h, TAG_SPAN, 1, tag); + print_otag(h, TAG_B, 1, tag); if (MDOC_SYNPRETTY & n->flags && MDOC_LINE & n->flags) print_text(h, "#include"); @@ -1674,7 +1661,7 @@ mdoc_ic_pre(MDOC_ARGS) struct htmlpair tag; PAIR_CLASS_INIT(&tag, "cmd"); - print_otag(h, TAG_SPAN, 1, &tag); + print_otag(h, TAG_B, 1, &tag); return(1); } @@ -1687,7 +1674,9 @@ mdoc_rv_pre(MDOC_ARGS) struct htmlpair tag; struct tag *t; - print_otag(h, TAG_DIV, 0, NULL); + if (n->prev) + print_otag(h, TAG_BR, 0, NULL); + print_text(h, "The"); for (nn = n->child; nn; nn = nn->next) { @@ -1714,7 +1703,7 @@ mdoc_rv_pre(MDOC_ARGS) "-1 is returned and the global variable"); PAIR_CLASS_INIT(&tag, "var"); - t = print_otag(h, TAG_SPAN, 1, &tag); + t = print_otag(h, TAG_B, 1, &tag); print_text(h, "errno"); print_tagq(h, t); print_text(h, "is set to indicate the error."); @@ -1729,7 +1718,7 @@ mdoc_va_pre(MDOC_ARGS) struct htmlpair tag; PAIR_CLASS_INIT(&tag, "var"); - print_otag(h, TAG_SPAN, 1, &tag); + print_otag(h, TAG_B, 1, &tag); return(1); } @@ -1883,8 +1872,9 @@ mdoc_lb_pre(MDOC_ARGS) { struct htmlpair tag; - if (SEC_LIBRARY == n->sec && MDOC_LINE & n->flags) - print_otag(h, TAG_DIV, 0, NULL); + if (SEC_LIBRARY == n->sec && MDOC_LINE & n->flags && n->prev) + print_otag(h, TAG_BR, 0, NULL); + PAIR_CLASS_INIT(&tag, "lib"); print_otag(h, TAG_SPAN, 1, &tag); return(1); @@ -1990,7 +1980,8 @@ mdoc_bk_pre(MDOC_ARGS) case (MDOC_HEAD): return(0); case (MDOC_BODY): - h->flags |= HTML_PREKEEP; + if (n->parent->args || 0 == n->prev->nchild) + h->flags |= HTML_PREKEEP; break; default: abort();