diff options
author | 2010-07-25 18:05:54 +0000 | |
---|---|---|
committer | 2010-07-25 18:05:54 +0000 | |
commit | ddce0b0ca1b3ae66643ffdf36394eda67117ca14 (patch) | |
tree | a6d88f26f28f3fc7273e7a3f88d4648f6eec6e06 /usr.bin/mandoc/man_html.c | |
parent | Missing SCSI_DATA_IN flag in dvd_read_copyright() caused (diff) | |
download | wireguard-openbsd-ddce0b0ca1b3ae66643ffdf36394eda67117ca14.tar.xz wireguard-openbsd-ddce0b0ca1b3ae66643ffdf36394eda67117ca14.zip |
Sync to bsd.lv; in particular, pull in lots of bug fixes.
new features:
* support the .in macro in man(7)
* support minimal PDF output
* support .Sm in mdoc(7) HTML output
* support .Vb and .nf in man(7) HTML output
* complete the mdoc(7) manual
bug fixes:
* do not let mdoc(7) .Pp produce a newline before/after .Sh; reported by jmc@
* avoid double blank lines related to man(7) .sp and .br
* let man(7) .nf and .fi flush the line; reported by jsg@ and naddy@
* let "\ " produce a non-breaking space; reported by deraadt@
* discard \m colour escape sequences; reported by J.C. Roberts
* map undefined 1-character-escapes to the literal character itself
maintenance:
* express mdoc(7) arguments in terms of an enum for additional type-safety
* simplify mandoc_special() and a2roffdeco()
* use strcspn in term_word() in place of a manual loop
* minor optimisations in the -Tps and -Thtml formatting frontends
Diffstat (limited to 'usr.bin/mandoc/man_html.c')
-rw-r--r-- | usr.bin/mandoc/man_html.c | 83 |
1 files changed, 65 insertions, 18 deletions
diff --git a/usr.bin/mandoc/man_html.c b/usr.bin/mandoc/man_html.c index 8b77f129bb6..b127639e546 100644 --- a/usr.bin/mandoc/man_html.c +++ b/usr.bin/mandoc/man_html.c @@ -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 <kristaps@bsd.lv> * @@ -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 a2width(const struct man_node *, 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 @@ static const struct htmlman mans[MAN_MAX] = { { 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 @@ static const struct htmlman mans[MAN_MAX] = { { 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 @@ html_man(void *arg, const struct man *m) { 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 @@ print_man(MAN_ARGS) 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 @@ print_man(MAN_ARGS) 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 @@ static void 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 @@ print_man_node(MAN_ARGS) 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 @@ print_man_node(MAN_ARGS) 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 @@ print_man_node(MAN_ARGS) 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 @@ man_alt_pre(MAN_ARGS) * 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 @@ man_IP_pre(MAN_ARGS) 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); } @@ -713,6 +729,37 @@ man_I_pre(MAN_ARGS) /* 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); +} + + +/* ARGSUSED */ +static int man_ign_pre(MAN_ARGS) { |