=================================================================== RCS file: /cvs/mandoc/mdoc_html.c,v retrieving revision 1.158 retrieving revision 1.166 diff -u -p -r1.158 -r1.166 --- mandoc/mdoc_html.c 2011/04/04 15:45:12 1.158 +++ mandoc/mdoc_html.c 2011/05/14 16:28:23 1.166 @@ -1,4 +1,4 @@ -/* $Id: mdoc_html.c,v 1.158 2011/04/04 15:45:12 kristaps Exp $ */ +/* $Id: mdoc_html.c,v 1.166 2011/05/14 16:28:23 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * @@ -288,7 +288,7 @@ a2width(const char *p, struct roffsu *su) if ( ! a2roffsu(p, su, SCALE_MAX)) { su->unit = SCALE_BU; - su->scale = (int)strlen(p); + su->scale = html_strlen(p); } } @@ -355,7 +355,7 @@ a2offs(const char *p, struct roffsu *su) SCALE_HS_INIT(su, INDENT * 2); else if ( ! a2roffsu(p, su, SCALE_MAX)) { su->unit = SCALE_BU; - su->scale = (int)strlen(p); + su->scale = html_strlen(p); } } @@ -703,7 +703,7 @@ mdoc_nm_pre(MDOC_ARGS) { struct htmlpair tag; struct roffsu su; - size_t len; + int len; switch (n->type) { case (MDOC_ELEM): @@ -731,10 +731,10 @@ mdoc_nm_pre(MDOC_ARGS) for (len = 0, n = n->child; n; n = n->next) if (MDOC_TEXT == n->type) - len += strlen(n->string); + len += html_strlen(n->string); if (0 == len && m->name) - len = strlen(m->name); + len = html_strlen(m->name); SCALE_HS_INIT(&su, (double)len); bufcat_su(h, "width", &su); @@ -1086,9 +1086,9 @@ mdoc_bl_pre(MDOC_ARGS) static int mdoc_ex_pre(MDOC_ARGS) { - const struct mdoc_node *nn; - struct tag *t; - struct htmlpair tag; + struct tag *t; + struct htmlpair tag; + int nchild; if (n->prev) print_otag(h, TAG_BR, 0, NULL); @@ -1096,22 +1096,25 @@ mdoc_ex_pre(MDOC_ARGS) PAIR_CLASS_INIT(&tag, "utility"); print_text(h, "The"); - for (nn = n->child; nn; nn = nn->next) { + + nchild = n->nchild; + for (n = n->child; n; n = n->next) { + assert(MDOC_TEXT == n->type); + t = print_otag(h, TAG_B, 1, &tag); - print_text(h, nn->string); + print_text(h, n->string); print_tagq(h, t); - h->flags |= HTML_NOSPACE; - - if (nn->next && NULL == nn->next->next) - print_text(h, ", and"); - else if (nn->next) + if (nchild > 2 && n->next) { + h->flags |= HTML_NOSPACE; print_text(h, ","); - else - h->flags &= ~HTML_NOSPACE; + } + + if (n->next && NULL == n->next->next) + print_text(h, "and"); } - if (n->child && n->child->next) + if (nchild > 1) print_text(h, "utilities exit"); else print_text(h, "utility exits"); @@ -1402,13 +1405,61 @@ mdoc_fa_pre(MDOC_ARGS) static int mdoc_fd_pre(MDOC_ARGS) { - struct htmlpair tag; + struct htmlpair tag[2]; + char buf[BUFSIZ]; + size_t sz; + int i; + struct tag *t; synopsis_pre(h, n); - PAIR_CLASS_INIT(&tag, "macro"); - print_otag(h, TAG_B, 1, &tag); - return(1); + if (NULL == (n = n->child)) + return(0); + + assert(MDOC_TEXT == n->type); + + if (strcmp(n->string, "#include")) { + PAIR_CLASS_INIT(&tag[0], "macro"); + print_otag(h, TAG_B, 1, tag); + return(1); + } + + PAIR_CLASS_INIT(&tag[0], "includes"); + print_otag(h, TAG_B, 1, tag); + print_text(h, n->string); + + if (NULL != (n = n->next)) { + assert(MDOC_TEXT == n->type); + strlcpy(buf, '<' == *n->string || '"' == *n->string ? + n->string + 1 : n->string, BUFSIZ); + + sz = strlen(buf); + if (sz && ('>' == buf[sz - 1] || '"' == buf[sz - 1])) + buf[sz - 1] = '\0'; + + PAIR_CLASS_INIT(&tag[0], "link-includes"); + bufinit(h); + + i = 1; + if (h->base_includes) { + buffmt_includes(h, buf); + PAIR_HREF_INIT(&tag[i], h->buf); + i++; + } + + t = print_otag(h, TAG_A, i, tag); + print_text(h, n->string); + print_tagq(h, t); + + n = n->next; + } + + for ( ; n; n = n->next) { + assert(MDOC_TEXT == n->type); + print_text(h, n->string); + } + + return(0); } @@ -1507,6 +1558,7 @@ mdoc_fn_pre(MDOC_ARGS) h->flags |= HTML_NOSPACE; print_text(h, "("); + h->flags |= HTML_NOSPACE; bufinit(h); PAIR_CLASS_INIT(&tag[0], "farg"); @@ -1628,19 +1680,21 @@ mdoc_lk_pre(MDOC_ARGS) static int mdoc_mt_pre(MDOC_ARGS) { - struct htmlpair tag[2]; - struct tag *t; - const struct mdoc_node *nn; + struct htmlpair tag[2]; + struct tag *t; PAIR_CLASS_INIT(&tag[0], "link-mail"); - for (nn = n->child; nn; nn = nn->next) { + for (n = n->child; n; n = n->next) { + assert(MDOC_TEXT == n->type); + bufinit(h); bufcat(h, "mailto:"); - bufcat(h, nn->string); + bufcat(h, n->string); + PAIR_HREF_INIT(&tag[1], h->buf); t = print_otag(h, TAG_A, 2, tag); - print_text(h, nn->string); + print_text(h, n->string); print_tagq(h, t); } @@ -1728,7 +1782,8 @@ mdoc_in_pre(MDOC_ARGS) if (h->base_includes) { buffmt_includes(h, n->string); - PAIR_HREF_INIT(&tag[i++], h->buf); + PAIR_HREF_INIT(&tag[i], h->buf); + i++; } t = print_otag(h, TAG_A, i, tag); @@ -1766,31 +1821,38 @@ mdoc_ic_pre(MDOC_ARGS) static int mdoc_rv_pre(MDOC_ARGS) { - const struct mdoc_node *nn; - struct htmlpair tag; - struct tag *t; + struct htmlpair tag; + struct tag *t; + int nchild; if (n->prev) print_otag(h, TAG_BR, 0, NULL); + PAIR_CLASS_INIT(&tag, "fname"); + print_text(h, "The"); - for (nn = n->child; nn; nn = nn->next) { - PAIR_CLASS_INIT(&tag, "fname"); + nchild = n->nchild; + for (n = n->child; n; n = n->next) { + assert(MDOC_TEXT == n->type); + t = print_otag(h, TAG_B, 1, &tag); - print_text(h, nn->string); + print_text(h, n->string); print_tagq(h, t); h->flags |= HTML_NOSPACE; - if (nn->next && NULL == nn->next->next) - print_text(h, "(), and"); - else if (nn->next) - print_text(h, "(),"); - else - print_text(h, "()"); + print_text(h, "()"); + + if (nchild > 2 && n->next) { + h->flags |= HTML_NOSPACE; + print_text(h, ","); + } + + if (n->next && NULL == n->next->next) + print_text(h, "and"); } - if (n->child && n->child->next) + if (nchild > 1) print_text(h, "functions return"); else print_text(h, "function returns");