Print this page
5051 import mdocml-1.12.3
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Approved by: TBD

*** 1,8 **** ! /* $Id: man_html.c,v 1.86 2012/01/03 15:16:24 kristaps Exp $ */ /* ! * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * --- 1,9 ---- ! /* $Id: man_html.c,v 1.90 2013/10/17 20:54:58 schwarze Exp $ */ /* ! * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> ! * Copyright (c) 2013 Ingo Schwarze <schwarze@openbsd.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. *
*** 35,45 **** /* TODO: preserve ident widths. */ /* FIXME: have PD set the default vspace width. */ #define INDENT 5 ! #define MAN_ARGS const struct man_meta *m, \ const struct man_node *n, \ struct mhtml *mh, \ struct html *h struct mhtml { --- 36,46 ---- /* TODO: preserve ident widths. */ /* FIXME: have PD set the default vspace width. */ #define INDENT 5 ! #define MAN_ARGS const struct man_meta *man, \ const struct man_node *n, \ struct mhtml *mh, \ struct html *h struct mhtml {
*** 68,77 **** --- 69,79 ---- static int man_PP_pre(MAN_ARGS); static int man_RS_pre(MAN_ARGS); static int man_SH_pre(MAN_ARGS); static int man_SM_pre(MAN_ARGS); static int man_SS_pre(MAN_ARGS); + static int man_UR_pre(MAN_ARGS); static int man_alt_pre(MAN_ARGS); static int man_br_pre(MAN_ARGS); static int man_ign_pre(MAN_ARGS); static int man_in_pre(MAN_ARGS); static int man_literal_pre(MAN_ARGS);
*** 111,120 **** --- 113,126 ---- { man_ign_pre, NULL }, /* PD */ { man_ign_pre, NULL }, /* AT */ { man_in_pre, NULL }, /* in */ { man_ign_pre, NULL }, /* ft */ { man_OP_pre, NULL }, /* OP */ + { man_literal_pre, NULL }, /* EX */ + { man_literal_pre, NULL }, /* EE */ + { man_UR_pre, NULL }, /* UR */ + { NULL, NULL }, /* UE */ }; /* * Printing leading vertical space before a block. * This is used for the paragraph macros.
*** 137,152 **** print_otag(h, TAG_P, 0, NULL); } void ! html_man(void *arg, const struct man *m) { struct mhtml mh; memset(&mh, 0, sizeof(struct mhtml)); ! print_man(man_meta(m), man_node(m), &mh, (struct html *)arg); putchar('\n'); } static void print_man(MAN_ARGS) --- 143,158 ---- print_otag(h, TAG_P, 0, NULL); } void ! html_man(void *arg, const struct man *man) { struct mhtml mh; memset(&mh, 0, sizeof(struct mhtml)); ! print_man(man_meta(man), man_node(man), &mh, (struct html *)arg); putchar('\n'); } static void print_man(MAN_ARGS)
*** 158,175 **** if ( ! (HTML_FRAGMENT & h->oflags)) { print_gen_decls(h); t = print_otag(h, TAG_HTML, 0, NULL); tt = print_otag(h, TAG_HEAD, 0, NULL); ! print_man_head(m, n, mh, h); print_tagq(h, tt); print_otag(h, TAG_BODY, 0, NULL); print_otag(h, TAG_DIV, 1, &tag); } else t = print_otag(h, TAG_DIV, 1, &tag); ! print_man_nodelist(m, n, mh, h); print_tagq(h, t); } /* ARGSUSED */ --- 164,181 ---- if ( ! (HTML_FRAGMENT & h->oflags)) { print_gen_decls(h); t = print_otag(h, TAG_HTML, 0, NULL); tt = print_otag(h, TAG_HEAD, 0, NULL); ! print_man_head(man, n, mh, h); print_tagq(h, tt); print_otag(h, TAG_BODY, 0, NULL); print_otag(h, TAG_DIV, 1, &tag); } else t = print_otag(h, TAG_DIV, 1, &tag); ! print_man_nodelist(man, n, mh, h); print_tagq(h, t); } /* ARGSUSED */
*** 176,200 **** static void print_man_head(MAN_ARGS) { print_gen_head(h); ! assert(m->title); ! assert(m->msec); ! bufcat_fmt(h, "%s(%s)", m->title, m->msec); print_otag(h, TAG_TITLE, 0, NULL); print_text(h, h->buf); } static void print_man_nodelist(MAN_ARGS) { ! print_man_node(m, n, mh, h); if (n->next) ! print_man_nodelist(m, n->next, mh, h); } static void print_man_node(MAN_ARGS) --- 182,206 ---- static void print_man_head(MAN_ARGS) { print_gen_head(h); ! assert(man->title); ! assert(man->msec); ! bufcat_fmt(h, "%s(%s)", man->title, man->msec); print_otag(h, TAG_TITLE, 0, NULL); print_text(h, h->buf); } static void print_man_nodelist(MAN_ARGS) { ! print_man_node(man, n, mh, h); if (n->next) ! print_man_nodelist(man, n->next, mh, h); } static void print_man_node(MAN_ARGS)
*** 205,215 **** child = 1; t = h->tags.head; switch (n->type) { case (MAN_ROOT): ! man_root_pre(m, n, mh, h); break; case (MAN_TEXT): /* * If we have a blank line, output a vertical space. * If we have a space as the first character, break --- 211,221 ---- child = 1; t = h->tags.head; switch (n->type) { case (MAN_ROOT): ! man_root_pre(man, n, mh, h); break; case (MAN_TEXT): /* * If we have a blank line, output a vertical space. * If we have a space as the first character, break
*** 256,284 **** if (h->tblt) { print_tblclose(h); t = h->tags.head; } if (mans[n->tok].pre) ! child = (*mans[n->tok].pre)(m, n, mh, h); break; } if (child && n->child) ! print_man_nodelist(m, n->child, mh, h); /* This will automatically close out any font scope. */ print_stagq(h, t); switch (n->type) { case (MAN_ROOT): ! man_root_post(m, n, mh, h); break; case (MAN_EQN): break; default: if (mans[n->tok].post) ! (*mans[n->tok].post)(m, n, mh, h); break; } } --- 262,290 ---- if (h->tblt) { print_tblclose(h); t = h->tags.head; } if (mans[n->tok].pre) ! child = (*mans[n->tok].pre)(man, n, mh, h); break; } if (child && n->child) ! print_man_nodelist(man, n->child, mh, h); /* This will automatically close out any font scope. */ print_stagq(h, t); switch (n->type) { case (MAN_ROOT): ! man_root_post(man, n, mh, h); break; case (MAN_EQN): break; default: if (mans[n->tok].post) ! (*mans[n->tok].post)(man, n, mh, h); break; } }
*** 302,317 **** struct htmlpair tag[3]; struct tag *t, *tt; char b[BUFSIZ], title[BUFSIZ]; b[0] = 0; ! if (m->vol) ! (void)strlcat(b, m->vol, BUFSIZ); ! assert(m->title); ! assert(m->msec); ! snprintf(title, BUFSIZ - 1, "%s(%s)", m->title, m->msec); PAIR_SUMMARY_INIT(&tag[0], "Document Header"); PAIR_CLASS_INIT(&tag[1], "head"); PAIR_INIT(&tag[2], ATTR_WIDTH, "100%"); t = print_otag(h, TAG_TABLE, 3, tag); --- 308,323 ---- struct htmlpair tag[3]; struct tag *t, *tt; char b[BUFSIZ], title[BUFSIZ]; b[0] = 0; ! if (man->vol) ! (void)strlcat(b, man->vol, BUFSIZ); ! assert(man->title); ! assert(man->msec); ! snprintf(title, BUFSIZ - 1, "%s(%s)", man->title, man->msec); PAIR_SUMMARY_INIT(&tag[0], "Document Header"); PAIR_CLASS_INIT(&tag[1], "head"); PAIR_INIT(&tag[2], ATTR_WIDTH, "100%"); t = print_otag(h, TAG_TABLE, 3, tag);
*** 361,380 **** tt = print_otag(h, TAG_TR, 0, NULL); PAIR_CLASS_INIT(&tag[0], "foot-date"); print_otag(h, TAG_TD, 1, tag); ! assert(m->date); ! print_text(h, m->date); print_stagq(h, tt); PAIR_CLASS_INIT(&tag[0], "foot-os"); PAIR_INIT(&tag[1], ATTR_ALIGN, "right"); print_otag(h, TAG_TD, 2, tag); ! if (m->source) ! print_text(h, m->source); print_tagq(h, t); } /* ARGSUSED */ --- 367,386 ---- tt = print_otag(h, TAG_TR, 0, NULL); PAIR_CLASS_INIT(&tag[0], "foot-date"); print_otag(h, TAG_TD, 1, tag); ! assert(man->date); ! print_text(h, man->date); print_stagq(h, tt); PAIR_CLASS_INIT(&tag[0], "foot-os"); PAIR_INIT(&tag[1], ATTR_ALIGN, "right"); print_otag(h, TAG_TD, 2, tag); ! if (man->source) ! print_text(h, man->source); print_tagq(h, t); } /* ARGSUSED */
*** 466,476 **** h->flags |= HTML_NOSPACE; if (TAG_MAX != fp) t = print_otag(h, fp, 0, NULL); ! print_man_node(m, nn, mh, h); if (t) print_tagq(h, t); } --- 472,482 ---- h->flags |= HTML_NOSPACE; if (TAG_MAX != fp) t = print_otag(h, fp, 0, NULL); ! print_man_node(man, nn, mh, h); if (t) print_tagq(h, t); }
*** 541,558 **** print_otag(h, TAG_DT, 0, NULL); /* For IP, only print the first header element. */ if (MAN_IP == n->tok && n->child) ! print_man_node(m, n->child, mh, h); /* For TP, only print next-line header elements. */ if (MAN_TP == n->tok) for (nn = n->child; nn; nn = nn->next) if (nn->line > n->line) ! print_man_node(m, nn, mh, h); return(0); } /* ARGSUSED */ --- 547,564 ---- print_otag(h, TAG_DT, 0, NULL); /* For IP, only print the first header element. */ if (MAN_IP == n->tok && n->child) ! print_man_node(man, n->child, mh, h); /* For TP, only print next-line header elements. */ if (MAN_TP == n->tok) for (nn = n->child; nn; nn = nn->next) if (nn->line > n->line) ! print_man_node(man, nn, mh, h); return(0); } /* ARGSUSED */
*** 636,646 **** /* ARGSUSED */ static int man_literal_pre(MAN_ARGS) { ! if (MAN_nf != n->tok) { print_otag(h, TAG_BR, 0, NULL); mh->fl &= ~MANH_LITERAL; } else mh->fl |= MANH_LITERAL; --- 642,652 ---- /* ARGSUSED */ static int man_literal_pre(MAN_ARGS) { ! if (MAN_fi == n->tok || MAN_EE == n->tok) { print_otag(h, TAG_BR, 0, NULL); mh->fl &= ~MANH_LITERAL; } else mh->fl |= MANH_LITERAL;
*** 683,688 **** --- 689,718 ---- bufinit(h); bufcat_su(h, "margin-left", &su); PAIR_STYLE_INIT(&tag, h); print_otag(h, TAG_DIV, 1, &tag); return(1); + } + + /* ARGSUSED */ + static int + man_UR_pre(MAN_ARGS) + { + struct htmlpair tag[2]; + + n = n->child; + assert(MAN_HEAD == n->type); + if (n->nchild) { + assert(MAN_TEXT == n->child->type); + PAIR_CLASS_INIT(&tag[0], "link-ext"); + PAIR_HREF_INIT(&tag[1], n->child->string); + print_otag(h, TAG_A, 2, tag); + } + + assert(MAN_BODY == n->next->type); + if (n->next->nchild) + n = n->next; + + print_man_nodelist(man, n->child, mh, h); + + return(0); }