=================================================================== RCS file: /cvs/mandoc/man_html.c,v retrieving revision 1.163 retrieving revision 1.169 diff -u -p -r1.163 -r1.169 --- mandoc/man_html.c 2019/01/05 09:14:44 1.163 +++ mandoc/man_html.c 2019/01/11 16:36:19 1.169 @@ -1,4 +1,4 @@ -/* $Id: man_html.c,v 1.163 2019/01/05 09:14:44 schwarze Exp $ */ +/* $Id: man_html.c,v 1.169 2019/01/11 16:36:19 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * Copyright (c) 2013-2015, 2017-2019 Ingo Schwarze @@ -33,8 +33,6 @@ #include "html.h" #include "main.h" -/* FIXME: have PD set the default vspace width. */ - #define MAN_ARGS const struct roff_meta *man, \ const struct roff_node *n, \ struct html *h @@ -44,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); @@ -59,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); @@ -74,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 */ @@ -112,29 +106,6 @@ static const struct man_html_act man_html_acts[MAN_MAX }; -/* - * 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 && n->body->child) - if (n->body->child->type == ROFFT_TBL) - return; - - if (n->parent->type == ROFFT_ROOT || n->parent->tok != MAN_RS) - if (NULL == n->prev) - return; - - print_paragraph(h); -} - void html_man(void *arg, const struct roff_meta *man) { @@ -148,7 +119,7 @@ html_man(void *arg, const struct roff_meta *man) if ((h->oflags & HTML_FRAGMENT) == 0) { print_gen_decls(h); print_otag(h, TAG_HTML, ""); - if (n->type == ROFFT_COMMENT) + if (n != NULL && n->type == ROFFT_COMMENT) print_gen_comment(h, n); t = print_otag(h, TAG_HEAD, ""); print_man_head(man, h); @@ -179,7 +150,6 @@ print_man_head(const struct roff_meta *man, struct htm static void print_man_nodelist(MAN_ARGS) { - while (n != NULL) { print_man_node(man, n, h); n = n->next; @@ -192,16 +162,22 @@ print_man_node(MAN_ARGS) struct tag *t; int child; + if (n->type == ROFFT_COMMENT || n->flags & NODE_NOPRT) + return; + html_fillmode(h, n->flags & NODE_NOFILL ? ROFF_nf : ROFF_fi); child = 1; + t = h->tag; + if (t->tag == TAG_P || t->tag == TAG_PRE) + t = t->next; + switch (n->type) { case ROFFT_TEXT: if (*n->string == '\0') { print_endline(h); return; } - t = h->tag; if (*n->string == ' ' && n->flags & NODE_LINE && (h->flags & HTML_NONEWLINE) == 0) print_endline(h); @@ -209,10 +185,7 @@ print_man_node(MAN_ARGS) h->flags |= HTML_NOSPACE; print_text(h, n->string); break; - case ROFFT_COMMENT: - return; case ROFFT_EQN: - t = h->tag; print_eqn(h, n->eqn); break; case ROFFT_TBL: @@ -238,16 +211,15 @@ print_man_node(MAN_ARGS) * the "meta" table state. This will be reopened on the * next table element. */ - if (h->tblt) + if (h->tblt != NULL) { print_tblclose(h); - - t = h->tag; + t = h->tag; + } if (n->tok < ROFF_MAX) { roff_html_pre(h, n); print_stagq(h, t); return; } - assert(n->tok >= MAN_TH && n->tok < MAN_MAX); if (man_html_acts[n->tok - MAN_TH].pre != NULL) child = (*man_html_acts[n->tok - MAN_TH].pre)(man, @@ -255,14 +227,14 @@ print_man_node(MAN_ARGS) break; } - if (child && n->child) + if (child && n->child != NULL) print_man_nodelist(man, n->child, h); /* This will automatically close out any font scope. */ print_stagq(h, t); - if (n->flags & NODE_NOFILL && - (n->next == NULL || n->next->flags & NODE_LINE)) { + if (n->flags & NODE_NOFILL && n->tok != MAN_YS && + (n->next != NULL && n->next->flags & NODE_LINE)) { /* In .nf =
, print even empty lines. */
 		h->col++;
 		print_endline(h);
@@ -287,7 +259,7 @@ man_root_pre(const struct roff_meta *man, struct html 
 	print_stagq(h, tt);
 
 	print_otag(h, TAG_TD, "c", "head-vol");
-	if (NULL != man->vol)
+	if (man->vol != NULL)
 		print_text(h, man->vol);
 	print_stagq(h, tt);
 
@@ -310,7 +282,7 @@ man_root_post(const struct roff_meta *man, struct html
 	print_stagq(h, tt);
 
 	print_otag(h, TAG_TD, "c", "foot-os");
-	if (man->os)
+	if (man->os != NULL)
 		print_text(h, man->os);
 	print_tagq(h, t);
 }
@@ -320,11 +292,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, "ci", "Sh", id);
+		else
+			print_otag(h, TAG_H2, "ci", "Ss", id);
 		if (id != NULL)
 			print_otag(h, TAG_A, "chR", "permalink", id);
+		break;
+	case ROFFT_BODY:
+		break;
+	default:
+		abort();
 	}
 	return 1;
 }
@@ -333,11 +317,11 @@ static int
 man_alt_pre(MAN_ARGS)
 {
 	const struct roff_node	*nn;
+	struct tag	*t;
 	int		 i;
 	enum htmltag	 fp;
-	struct tag	*t;
 
-	for (i = 0, nn = n->child; nn; nn = nn->next, i++) {
+	for (i = 0, nn = n->child; nn != NULL; nn = nn->next, i++) {
 		switch (n->tok) {
 		case MAN_BI:
 			fp = i % 2 ? TAG_I : TAG_B;
@@ -379,34 +363,29 @@ static int
 man_SM_pre(MAN_ARGS)
 {
 	print_otag(h, TAG_SMALL, "");
-	if (MAN_SB == n->tok)
+	if (n->tok == MAN_SB)
 		print_otag(h, TAG_B, "");
 	return 1;
 }
 
 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;
 }
 
@@ -415,16 +394,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)
@@ -443,24 +427,10 @@ man_IP_pre(MAN_ARGS)
 	default:
 		abort();
 	}
-
 	return 0;
 }
 
 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;
@@ -469,14 +439,14 @@ man_OP_pre(MAN_ARGS)
 	h->flags |= HTML_NOSPACE;
 	tt = print_otag(h, TAG_SPAN, "c", "Op");
 
-	if (NULL != (n = n->child)) {
+	if ((n = n->child) != NULL) {
 		print_otag(h, TAG_B, "");
 		print_text(h, n->string);
 	}
 
 	print_stagq(h, tt);
 
-	if (NULL != n && NULL != n->next) {
+	if (n != NULL && n->next != NULL) {
 		print_otag(h, TAG_I, "");
 		print_text(h, n->next->string);
 	}
@@ -511,17 +481,24 @@ man_in_pre(MAN_ARGS)
 static int
 man_ign_pre(MAN_ARGS)
 {
-
 	return 0;
 }
 
 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;
 }
 
@@ -530,12 +507,13 @@ 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;
 	case ROFFT_HEAD:
 		print_otag(h, TAG_TD, "");
-		print_otag(h, TAG_CODE, "cT", "Nm");
+		print_otag(h, TAG_CODE, "c", "Nm");
 		break;
 	case ROFFT_BODY:
 		print_otag(h, TAG_TD, "");
@@ -550,16 +528,17 @@ static int
 man_UR_pre(MAN_ARGS)
 {
 	char *cp;
+
 	n = n->child;
 	assert(n->type == ROFFT_HEAD);
 	if (n->child != NULL) {
 		assert(n->child->type == ROFFT_TEXT);
 		if (n->tok == MAN_MT) {
 			mandoc_asprintf(&cp, "mailto:%s", n->child->string);
-			print_otag(h, TAG_A, "cTh", "Mt", cp);
+			print_otag(h, TAG_A, "ch", "Mt", cp);
 			free(cp);
 		} else
-			print_otag(h, TAG_A, "cTh", "Lk", n->child->string);
+			print_otag(h, TAG_A, "ch", "Lk", n->child->string);
 	}
 
 	assert(n->next->type == ROFFT_BODY);
@@ -567,7 +546,6 @@ man_UR_pre(MAN_ARGS)
 		n = n->next;
 
 	print_man_nodelist(man, n->child, h);
-
 	return 0;
 }