=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/man_html.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- src/usr.bin/mandoc/man_html.c 2010/07/13 01:09:13 1.17 +++ src/usr.bin/mandoc/man_html.c 2010/07/25 18:05:54 1.18 @@ -1,4 +1,4 @@ -/* $Id: man_html.c,v 1.17 2010/07/13 01:09:13 schwarze Exp $ */ +/* $Id: man_html.c,v 1.18 2010/07/25 18:05:54 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * @@ -36,8 +36,14 @@ #define MAN_ARGS const struct man_meta *m, \ const struct man_node *n, \ + struct mhtml *mh, \ struct html *h +struct mhtml { + int fl; +#define MANH_LITERAL (1 << 0) /* literal context */ +}; + struct htmlman { int (*pre)(MAN_ARGS); int (*post)(MAN_ARGS); @@ -54,6 +60,8 @@ 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); static void man_root_post(MAN_ARGS); static int man_root_pre(MAN_ARGS); static int man_B_pre(MAN_ARGS); @@ -92,8 +100,8 @@ { NULL, NULL }, /* na */ { NULL, NULL }, /* i */ { man_br_pre, NULL }, /* sp */ - { NULL, NULL }, /* nf */ - { NULL, NULL }, /* fi */ + { man_literal_pre, NULL }, /* nf */ + { man_literal_pre, NULL }, /* fi */ { NULL, NULL }, /* r */ { NULL, NULL }, /* RE */ { man_RS_pre, NULL }, /* RS */ @@ -101,9 +109,10 @@ { man_ign_pre, NULL }, /* UC */ { man_ign_pre, NULL }, /* PD */ { man_br_pre, NULL }, /* Sp */ - { man_ign_pre, NULL }, /* Vb */ - { NULL, NULL }, /* Ve */ + { man_literal_pre, NULL }, /* Vb */ + { man_literal_pre, NULL }, /* Ve */ { man_ign_pre, NULL }, /* AT */ + { man_in_pre, NULL }, /* in */ }; @@ -112,13 +121,16 @@ { struct html *h; struct tag *t; + struct mhtml mh; h = (struct html *)arg; print_gen_decls(h); + memset(&mh, 0, sizeof(struct mhtml)); + t = print_otag(h, TAG_HTML, 0, NULL); - print_man(man_meta(m), man_node(m), h); + print_man(man_meta(m), man_node(m), &mh, h); print_tagq(h, t); printf("\n"); @@ -133,7 +145,7 @@ t = print_otag(h, TAG_HEAD, 0, NULL); - print_man_head(m, n, h); + print_man_head(m, n, mh, h); print_tagq(h, t); t = print_otag(h, TAG_BODY, 0, NULL); @@ -141,7 +153,7 @@ tag.val = "body"; print_otag(h, TAG_DIV, 1, &tag); - print_man_nodelist(m, n, h); + print_man_nodelist(m, n, mh, h); print_tagq(h, t); } @@ -165,9 +177,9 @@ print_man_nodelist(MAN_ARGS) { - print_man_node(m, n, h); + print_man_node(m, n, mh, h); if (n->next) - print_man_nodelist(m, n->next, h); + print_man_nodelist(m, n->next, mh, h); } @@ -190,10 +202,14 @@ switch (n->type) { case (MAN_ROOT): - child = man_root_pre(m, n, h); + child = man_root_pre(m, n, mh, h); break; case (MAN_TEXT): print_text(h, n->string); + + if (MANH_LITERAL & mh->fl) + print_otag(h, TAG_BR, 0, NULL); + return; default: /* @@ -208,12 +224,12 @@ t = h->tags.head; } if (mans[n->tok].pre) - child = (*mans[n->tok].pre)(m, n, h); + child = (*mans[n->tok].pre)(m, n, mh, h); break; } if (child && n->child) - print_man_nodelist(m, n->child, h); + print_man_nodelist(m, n->child, mh, h); /* This will automatically close out any font scope. */ print_stagq(h, t); @@ -222,13 +238,13 @@ switch (n->type) { case (MAN_ROOT): - man_root_post(m, n, h); + man_root_post(m, n, mh, h); break; case (MAN_TEXT): break; default: if (mans[n->tok].post) - (*mans[n->tok].post)(m, n, h); + (*mans[n->tok].post)(m, n, mh, h); break; } } @@ -449,7 +465,7 @@ * closed out with the scope. */ t = print_ofont(h, fp); - print_man_node(m, nn, h); + print_man_node(m, nn, mh, h); print_tagq(h, t); } @@ -643,10 +659,10 @@ if (MAN_IP == n->tok) for (nn = n->child; nn->next; nn = nn->next) - print_man_node(m, nn, h); + print_man_node(m, nn, mh, h); if (MAN_TP == n->tok) for (nn = n->child->next; nn; nn = nn->next) - print_man_node(m, nn, h); + print_man_node(m, nn, mh, h); return(0); } @@ -708,6 +724,37 @@ print_ofont(h, HTMLFONT_ITALIC); return(1); +} + + +/* ARGSUSED */ +static int +man_literal_pre(MAN_ARGS) +{ + + switch (n->tok) { + case (MAN_nf): + /* FALLTHROUGH */ + case (MAN_Vb): + print_otag(h, TAG_BR, 0, NULL); + mh->fl |= MANH_LITERAL; + return(MAN_Vb != n->tok); + default: + mh->fl &= ~MANH_LITERAL; + break; + } + + return(1); +} + + +/* ARGSUSED */ +static int +man_in_pre(MAN_ARGS) +{ + + print_otag(h, TAG_BR, 0, NULL); + return(0); }