summaryrefslogtreecommitdiffstats
path: root/man_html.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2019-01-06 04:55:09 +0000
committerIngo Schwarze <schwarze@openbsd.org>2019-01-06 04:55:09 +0000
commit9586714e823ea16c316ae14d0dcd2a88613c265e (patch)
tree79493a933800ae56367169d41bc7021d2417111f /man_html.c
parent908aedff3f73473da78c831aceb1517a17d0ce3a (diff)
downloadmandoc-9586714e823ea16c316ae14d0dcd2a88613c265e.tar.gz
Finally, represent the man(7) .PP and .HP macros by the natural
choice, which is the <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 'man_html.c')
-rw-r--r--man_html.c123
1 files changed, 54 insertions, 69 deletions
diff --git a/man_html.c b/man_html.c
index 85933113..2dbee6a8 100644
--- a/man_html.c
+++ b/man_html.c
@@ -42,14 +42,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);
@@ -57,7 +54,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);
@@ -72,14 +68,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 */
@@ -110,27 +106,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)
{
@@ -239,7 +214,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;
}
@@ -315,11 +291,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;
}
@@ -380,27 +368,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;
}
@@ -409,16 +393,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)
@@ -441,19 +430,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;
@@ -510,10 +486,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;
}
@@ -522,6 +506,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;