diff options
author | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2019-01-06 04:41:16 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2019-01-06 04:41:16 +0000 |
commit | a7e276d2dd22a043f79e6c0a53b1d01549d585ac (patch) | |
tree | 5eecbaa7dedd3f82cf5eec045cbcebc09cc788a2 /usr.bin | |
parent | b564c8b89dc3914a5e9096719a141f1be39731a6 (diff) |
Finally, represent the man(7) .PP and .HP macros by the natural
choice, which is <p> HTML element. On top of the previous fill-mode
improvements, the key to making this possible is to automatically
close the <p> when required: before headers, subsequent paragraphs,
lists, indented blocks, synopsis blocks, tbl(7) blocks, and before
blocks using no-fill mode.
In man(7) documents, represent the .sp request by a blank line in
no-fill mode and in the same way as .PP in fill mode.
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/mandoc/html.c | 19 | ||||
-rw-r--r-- | usr.bin/mandoc/html.h | 6 | ||||
-rw-r--r-- | usr.bin/mandoc/man_html.c | 125 | ||||
-rw-r--r-- | usr.bin/mandoc/roff_html.c | 10 | ||||
-rw-r--r-- | usr.bin/mandoc/tbl_html.c | 3 |
5 files changed, 86 insertions, 77 deletions
diff --git a/usr.bin/mandoc/html.c b/usr.bin/mandoc/html.c index 197338c66e5..49bc3512bc2 100644 --- a/usr.bin/mandoc/html.c +++ b/usr.bin/mandoc/html.c @@ -1,7 +1,7 @@ -/* $OpenBSD: html.c,v 1.118 2019/01/05 09:14:11 schwarze Exp $ */ +/* $OpenBSD: html.c,v 1.119 2019/01/06 04:41:15 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> - * Copyright (c) 2011-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> + * Copyright (c) 2011-2015, 2017-2019 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 @@ -76,6 +76,7 @@ static const struct htmldata htmltags[TAG_MAX] = { {"dl", HTML_NLALL | HTML_INDENT}, {"dt", HTML_NLAROUND}, {"dd", HTML_NLAROUND | HTML_INDENT}, + {"p", HTML_NLAROUND | HTML_INDENT}, {"pre", HTML_NLALL | HTML_NOINDENT}, {"var", 0}, {"cite", 0}, @@ -263,6 +264,19 @@ print_metaf(struct html *h, enum mandoc_esc deco) } } +void +html_close_paragraph(struct html *h) +{ + struct tag *t; + + for (t = h->tag; t != NULL; t = t->next) { + if (t->tag == TAG_P) { + print_tagq(h, t); + break; + } + } +} + /* * ROFF_nf switches to no-fill mode, ROFF_fi to fill mode. * TOKEN_NONE does not switch. The old mode is returned. @@ -285,6 +299,7 @@ html_fillmode(struct html *h, enum roff_tok want) print_tagq(h, t); break; case ROFF_nf: + html_close_paragraph(h); print_otag(h, TAG_PRE, ""); break; case TOKEN_NONE: diff --git a/usr.bin/mandoc/html.h b/usr.bin/mandoc/html.h index 56d085eb23b..27993595b78 100644 --- a/usr.bin/mandoc/html.h +++ b/usr.bin/mandoc/html.h @@ -1,7 +1,7 @@ -/* $OpenBSD: html.h,v 1.60 2019/01/05 09:14:11 schwarze Exp $ */ +/* $OpenBSD: html.h,v 1.61 2019/01/06 04:41:15 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> - * Copyright (c) 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> + * Copyright (c) 2017, 2018, 2019 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 @@ -39,6 +39,7 @@ enum htmltag { TAG_DL, TAG_DT, TAG_DD, + TAG_P, TAG_PRE, TAG_VAR, TAG_CITE, @@ -135,5 +136,6 @@ void print_eqn(struct html *, const struct eqn_box *); void print_paragraph(struct html *); void print_endline(struct html *); +void html_close_paragraph(struct html *); enum roff_tok html_fillmode(struct html *, enum roff_tok); char *html_make_id(const struct roff_node *, int); diff --git a/usr.bin/mandoc/man_html.c b/usr.bin/mandoc/man_html.c index d2bf1733fdf..b5b11914b0a 100644 --- a/usr.bin/mandoc/man_html.c +++ b/usr.bin/mandoc/man_html.c @@ -1,4 +1,4 @@ -/* $OpenBSD: man_html.c,v 1.118 2019/01/05 21:52:57 schwarze Exp $ */ +/* $OpenBSD: man_html.c,v 1.119 2019/01/06 04:41:15 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2013-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org> @@ -40,14 +40,11 @@ struct man_html_act { int (*post)(MAN_ARGS); }; -static void print_bvspace(struct html *, - const struct roff_node *); static void print_man_head(const struct roff_meta *, struct html *); static void print_man_nodelist(MAN_ARGS); static void print_man_node(MAN_ARGS); static int man_B_pre(MAN_ARGS); -static int man_HP_pre(MAN_ARGS); static int man_IP_pre(MAN_ARGS); static int man_I_pre(MAN_ARGS); static int man_OP_pre(MAN_ARGS); @@ -55,7 +52,6 @@ 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_SY_pre(MAN_ARGS); static int man_UR_pre(MAN_ARGS); static int man_abort_pre(MAN_ARGS); @@ -70,14 +66,14 @@ static void man_root_pre(const struct roff_meta *, static const struct man_html_act man_html_acts[MAN_MAX - MAN_TH] = { { NULL, NULL }, /* TH */ { man_SH_pre, NULL }, /* SH */ - { man_SS_pre, NULL }, /* SS */ + { man_SH_pre, NULL }, /* SS */ { man_IP_pre, NULL }, /* TP */ { man_IP_pre, NULL }, /* TQ */ { man_abort_pre, NULL }, /* LP */ { man_PP_pre, NULL }, /* PP */ { man_abort_pre, NULL }, /* P */ { man_IP_pre, NULL }, /* IP */ - { man_HP_pre, NULL }, /* HP */ + { man_PP_pre, NULL }, /* HP */ { man_SM_pre, NULL }, /* SM */ { man_SM_pre, NULL }, /* SB */ { man_alt_pre, NULL }, /* BI */ @@ -108,27 +104,6 @@ static const struct man_html_act man_html_acts[MAN_MAX - MAN_TH] = { }; -/* - * Printing leading vertical space before a block. - * This is used for the paragraph macros. - * The rules are pretty simple, since there's very little nesting going - * on here. Basically, if we're the first within another block (SS/SH), - * then don't emit vertical space. If we are (RS), then do. If not the - * first, print it. - */ -static void -print_bvspace(struct html *h, const struct roff_node *n) -{ - if (n->body != NULL && n->body->child != NULL && - n->body->child->type == ROFFT_TBL) - return; - - if (n->prev == NULL && n->parent->tok != MAN_RS) - return; - - print_paragraph(h); -} - void html_man(void *arg, const struct roff_meta *man) { @@ -237,7 +212,8 @@ print_man_node(MAN_ARGS) t = h->tag; if (n->tok < ROFF_MAX) { roff_html_pre(h, n); - print_stagq(h, t); + if (n->tok != ROFF_sp) + print_stagq(h, t); return; } @@ -313,11 +289,23 @@ man_SH_pre(MAN_ARGS) { char *id; - if (n->type == ROFFT_HEAD) { + switch (n->type) { + case ROFFT_BLOCK: + html_close_paragraph(h); + break; + case ROFFT_HEAD: id = html_make_id(n, 1); - print_otag(h, TAG_H1, "cTi", "Sh", id); + if (n->tok == MAN_SH) + print_otag(h, TAG_H1, "cTi", "Sh", id); + else + print_otag(h, TAG_H2, "cTi", "Ss", id); if (id != NULL) print_otag(h, TAG_A, "chR", "permalink", id); + break; + case ROFFT_BODY: + break; + default: + abort(); } return 1; } @@ -378,27 +366,23 @@ man_SM_pre(MAN_ARGS) } static int -man_SS_pre(MAN_ARGS) -{ - char *id; - - if (n->type == ROFFT_HEAD) { - id = html_make_id(n, 1); - print_otag(h, TAG_H2, "cTi", "Ss", id); - if (id != NULL) - print_otag(h, TAG_A, "chR", "permalink", id); - } - return 1; -} - -static int man_PP_pre(MAN_ARGS) { - if (n->type == ROFFT_HEAD) + switch (n->type) { + case ROFFT_BLOCK: + html_close_paragraph(h); + break; + case ROFFT_HEAD: return 0; - else if (n->type == ROFFT_BLOCK) - print_bvspace(h, n); - + case ROFFT_BODY: + if (n->child != NULL && + (n->child->flags & NODE_NOFILL) == 0) + print_otag(h, TAG_P, "c", + n->tok == MAN_PP ? "Pp" : "Pp HP"); + break; + default: + abort(); + } return 1; } @@ -407,16 +391,21 @@ man_IP_pre(MAN_ARGS) { const struct roff_node *nn; - if (n->type == ROFFT_BODY) { - print_otag(h, TAG_DD, ""); - return 1; - } else if (n->type != ROFFT_HEAD) { + switch (n->type) { + case ROFFT_BLOCK: + html_close_paragraph(h); print_otag(h, TAG_DL, "c", "Bl-tag"); return 1; + case ROFFT_HEAD: + print_otag(h, TAG_DT, ""); + break; + case ROFFT_BODY: + print_otag(h, TAG_DD, ""); + return 1; + default: + abort(); } - print_otag(h, TAG_DT, ""); - switch(n->tok) { case MAN_IP: /* Only print the first header element. */ if (n->child != NULL) @@ -439,19 +428,6 @@ man_IP_pre(MAN_ARGS) } static int -man_HP_pre(MAN_ARGS) -{ - if (n->type == ROFFT_HEAD) - return 0; - - if (n->type == ROFFT_BLOCK) { - print_bvspace(h, n); - print_otag(h, TAG_DIV, "c", "HP"); - } - return 1; -} - -static int man_OP_pre(MAN_ARGS) { struct tag *tt; @@ -508,10 +484,18 @@ man_ign_pre(MAN_ARGS) static int man_RS_pre(MAN_ARGS) { - if (n->type == ROFFT_HEAD) + switch (n->type) { + case ROFFT_BLOCK: + html_close_paragraph(h); + break; + case ROFFT_HEAD: return 0; - if (n->type == ROFFT_BLOCK) + case ROFFT_BODY: print_otag(h, TAG_DIV, "c", "Bd-indent"); + break; + default: + abort(); + } return 1; } @@ -520,6 +504,7 @@ man_SY_pre(MAN_ARGS) { switch (n->type) { case ROFFT_BLOCK: + html_close_paragraph(h); print_otag(h, TAG_TABLE, "c", "Nm"); print_otag(h, TAG_TR, ""); break; diff --git a/usr.bin/mandoc/roff_html.c b/usr.bin/mandoc/roff_html.c index 517a2257ab7..79527ec2e50 100644 --- a/usr.bin/mandoc/roff_html.c +++ b/usr.bin/mandoc/roff_html.c @@ -1,4 +1,4 @@ -/* $OpenBSD: roff_html.c,v 1.17 2019/01/05 09:14:11 schwarze Exp $ */ +/* $OpenBSD: roff_html.c,v 1.18 2019/01/06 04:41:15 schwarze Exp $ */ /* * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2014, 2017, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org> @@ -107,5 +107,11 @@ roff_html_pre_nf(ROFF_HTML_ARGS) static void roff_html_pre_sp(ROFF_HTML_ARGS) { - print_paragraph(h); + if (html_fillmode(h, TOKEN_NONE) == ROFF_nf) { + h->col++; + print_endline(h); + } else if (n->parent->tok >= MAN_TH) + print_otag(h, TAG_P, "c", "Pp"); + else + print_paragraph(h); } diff --git a/usr.bin/mandoc/tbl_html.c b/usr.bin/mandoc/tbl_html.c index a4a448ef42e..bbde210c570 100644 --- a/usr.bin/mandoc/tbl_html.c +++ b/usr.bin/mandoc/tbl_html.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tbl_html.c,v 1.26 2018/12/15 23:33:20 schwarze Exp $ */ +/* $OpenBSD: tbl_html.c,v 1.27 2019/01/06 04:41:15 schwarze Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2014, 2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> @@ -78,6 +78,7 @@ html_tbl_sulen(const struct roffsu *su, void *arg) static void html_tblopen(struct html *h, const struct tbl_span *sp) { + html_close_paragraph(h); if (h->tbl.cols == NULL) { h->tbl.len = html_tbl_len; h->tbl.slen = html_tbl_strlen; |