summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2019-01-06 04:41:16 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2019-01-06 04:41:16 +0000
commita7e276d2dd22a043f79e6c0a53b1d01549d585ac (patch)
tree5eecbaa7dedd3f82cf5eec045cbcebc09cc788a2 /usr.bin
parentb564c8b89dc3914a5e9096719a141f1be39731a6 (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.c19
-rw-r--r--usr.bin/mandoc/html.h6
-rw-r--r--usr.bin/mandoc/man_html.c125
-rw-r--r--usr.bin/mandoc/roff_html.c10
-rw-r--r--usr.bin/mandoc/tbl_html.c3
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;