source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mandoc: Now that the NODE_NOFILL flag in the syntax tree is accurate,
@ 2019-01-05  9:15 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2019-01-05  9:15 UTC (permalink / raw)
  To: source

Log Message:
-----------
Now that the NODE_NOFILL flag in the syntax tree is accurate,
use it in the man(7) HTML formatter rather than keeping fill mode
state locally, resulting in massive simplification (minus 40 LOC).

Move the html_fillmode() state handler function to the html.c module
such that both the man(7) and the roff(7) formatter (and in the future,
also the mdoc(7) formatter) can use it.  Give it a query mode, to be
invoked with TOKEN_NONE.

Modified Files:
--------------
    mandoc:
        html.c
        html.h
        man_html.c
        roff_html.c

Revision Data
-------------
Index: html.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/html.c,v
retrieving revision 1.247
retrieving revision 1.248
diff -Lhtml.c -Lhtml.c -u -p -r1.247 -r1.248
--- html.c
+++ html.c
@@ -265,6 +265,39 @@ print_metaf(struct html *h, enum mandoc_
 	}
 }
 
+/*
+ * ROFF_nf switches to no-fill mode, ROFF_fi to fill mode.
+ * TOKEN_NONE does not switch.  The old mode is returned.
+ */
+enum roff_tok
+html_fillmode(struct html *h, enum roff_tok want)
+{
+	struct tag	*t;
+	enum roff_tok	 had;
+
+	for (t = h->tag; t != NULL; t = t->next)
+		if (t->tag == TAG_PRE)
+			break;
+
+	had = t == NULL ? ROFF_fi : ROFF_nf;
+
+	if (want != had) {
+		switch (want) {
+		case ROFF_fi:
+			print_tagq(h, t);
+			break;
+		case ROFF_nf:
+			print_otag(h, TAG_PRE, "");
+			break;
+		case TOKEN_NONE:
+			break;
+		default:
+			abort();
+		}
+	}
+	return had;
+}
+
 char *
 html_make_id(const struct roff_node *n, int unique)
 {
Index: man_html.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/man_html.c,v
retrieving revision 1.162
retrieving revision 1.163
diff -Lman_html.c -Lman_html.c -u -p -r1.162 -r1.163
--- man_html.c
+++ man_html.c
@@ -1,7 +1,7 @@
 /*	$Id$ */
 /*
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2013,2014,2015,2017,2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2013-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
@@ -50,7 +50,6 @@ static	void		  print_man_head(const stru
 				struct html *);
 static	void		  print_man_nodelist(MAN_ARGS);
 static	void		  print_man_node(MAN_ARGS);
-static	int		  fillmode(struct html *, int);
 static	int		  man_B_pre(MAN_ARGS);
 static	int		  man_HP_pre(MAN_ARGS);
 static	int		  man_IP_pre(MAN_ARGS);
@@ -190,95 +189,28 @@ print_man_nodelist(MAN_ARGS)
 static void
 print_man_node(MAN_ARGS)
 {
-	static int	 want_fillmode = ROFF_fi;
-	static int	 save_fillmode;
-
 	struct tag	*t;
 	int		 child;
 
-	/*
-	 * Handle fill mode switch requests up front,
-	 * they would just cause trouble in the subsequent code.
-	 */
-
-	switch (n->tok) {
-	case ROFF_nf:
-	case MAN_EX:
-		want_fillmode = ROFF_nf;
-		return;
-	case ROFF_fi:
-	case MAN_EE:
-		want_fillmode = ROFF_fi;
-		if (fillmode(h, 0) == ROFF_fi)
-			print_otag(h, TAG_BR, "");
-		return;
-	default:
-		break;
-	}
-
-	/* Set up fill mode for the upcoming node. */
-
-	switch (n->type) {
-	case ROFFT_BLOCK:
-		save_fillmode = 0;
-		/* Some block macros suspend or cancel .nf. */
-		switch (n->tok) {
-		case MAN_TP:  /* Tagged paragraphs		*/
-		case MAN_IP:  /* temporarily disable .nf	*/
-		case MAN_HP:  /* for the head.			*/
-			save_fillmode = want_fillmode;
-			/* FALLTHROUGH */
-		case MAN_SH:  /* Section headers		*/
-		case MAN_SS:  /* permanently cancel .nf.	*/
-			want_fillmode = ROFF_fi;
-			/* FALLTHROUGH */
-		case MAN_PP:  /* These have no head.		*/
-		case MAN_RS:  /* They will simply		*/
-		case MAN_UR:  /* reopen .nf in the body.        */
-		case MAN_MT:
-			fillmode(h, ROFF_fi);
-			break;
-		default:
-			break;
-		}
-		break;
-	case ROFFT_TBL:
-		fillmode(h, ROFF_fi);
-		break;
-	case ROFFT_ELEM:
-		/*
-		 * Some in-line macros produce tags and/or text
-		 * in the handler, so they require fill mode to be
-		 * configured up front just like for text nodes.
-		 * For the others, keep the traditional approach
-		 * of doing the same, for now.
-		 */
-		fillmode(h, want_fillmode);
-		break;
-	case ROFFT_TEXT:
-		if (fillmode(h, want_fillmode) == ROFF_fi &&
-		    want_fillmode == ROFF_fi &&
-		    n->flags & NODE_LINE && *n->string == ' ' &&
-		    (h->flags & HTML_NONEWLINE) == 0)
-			print_otag(h, TAG_BR, "");
-		if (want_fillmode == ROFF_nf || *n->string != '\0')
-			break;
-		print_paragraph(h);
-		return;
-	case ROFFT_COMMENT:
-		return;
-	default:
-		break;
-	}
-
-	/* Produce output for this node. */
+	html_fillmode(h, n->flags & NODE_NOFILL ? ROFF_nf : ROFF_fi);
 
 	child = 1;
 	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);
+		else if (n->flags & NODE_DELIMC)
+			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);
@@ -312,19 +244,14 @@ print_man_node(MAN_ARGS)
 		t = h->tag;
 		if (n->tok < ROFF_MAX) {
 			roff_html_pre(h, n);
-			child = 0;
-			break;
+			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,
 			    n, h);
-
-		/* Some block macros resume .nf in the body. */
-		if (save_fillmode && n->type == ROFFT_BODY)
-			want_fillmode = save_fillmode;
-
 		break;
 	}
 
@@ -334,38 +261,12 @@ print_man_node(MAN_ARGS)
 	/* This will automatically close out any font scope. */
 	print_stagq(h, t);
 
-	if (fillmode(h, 0) == ROFF_nf &&
-	    n->next != NULL && n->next->flags & NODE_LINE) {
+	if (n->flags & NODE_NOFILL &&
+	    (n->next == NULL || n->next->flags & NODE_LINE)) {
 		/* In .nf = <pre>, print even empty lines. */
 		h->col++;
 		print_endline(h);
 	}
-}
-
-/*
- * ROFF_nf switches to no-fill mode, ROFF_fi to fill mode.
- * Other arguments do not switch.
- * The old mode is returned.
- */
-static int
-fillmode(struct html *h, int want)
-{
-	struct tag	*pre;
-	int		 had;
-
-	for (pre = h->tag; pre != NULL; pre = pre->next)
-		if (pre->tag == TAG_PRE)
-			break;
-
-	had = pre == NULL ? ROFF_fi : ROFF_nf;
-
-	if (want && want != had) {
-		if (want == ROFF_nf)
-			print_otag(h, TAG_PRE, "");
-		else
-			print_tagq(h, pre);
-	}
-	return had;
 }
 
 static void
Index: roff_html.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/roff_html.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -Lroff_html.c -Lroff_html.c -u -p -r1.16 -r1.17
--- roff_html.c
+++ roff_html.c
@@ -1,7 +1,7 @@
 /*	$Id$ */
 /*
  * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2014, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2014, 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
@@ -32,17 +32,19 @@ typedef	void	(*roff_html_pre_fp)(ROFF_HT
 
 static	void	  roff_html_pre_br(ROFF_HTML_ARGS);
 static	void	  roff_html_pre_ce(ROFF_HTML_ARGS);
+static	void	  roff_html_pre_fi(ROFF_HTML_ARGS);
 static	void	  roff_html_pre_ft(ROFF_HTML_ARGS);
+static	void	  roff_html_pre_nf(ROFF_HTML_ARGS);
 static	void	  roff_html_pre_sp(ROFF_HTML_ARGS);
 
 static	const roff_html_pre_fp roff_html_pre_acts[ROFF_MAX] = {
 	roff_html_pre_br,  /* br */
 	roff_html_pre_ce,  /* ce */
-	roff_html_pre_br,  /* fi */
+	roff_html_pre_fi,  /* fi */
 	roff_html_pre_ft,  /* ft */
 	NULL,  /* ll */
 	NULL,  /* mc */
-	roff_html_pre_br,  /* nf */
+	roff_html_pre_nf,  /* nf */
 	NULL,  /* po */
 	roff_html_pre_ce,  /* rj */
 	roff_html_pre_sp,  /* sp */
@@ -80,12 +82,26 @@ roff_html_pre_ce(ROFF_HTML_ARGS)
 }
 
 static void
+roff_html_pre_fi(ROFF_HTML_ARGS)
+{
+	if (html_fillmode(h, TOKEN_NONE) == ROFF_fi)
+		print_otag(h, TAG_BR, "");
+}
+
+static void
 roff_html_pre_ft(ROFF_HTML_ARGS)
 {
 	const char	*cp;
 
 	cp = n->child->string;
 	print_metaf(h, mandoc_font(cp, (int)strlen(cp)));
+}
+
+static void
+roff_html_pre_nf(ROFF_HTML_ARGS)
+{
+	if (html_fillmode(h, TOKEN_NONE) == ROFF_nf)
+		print_otag(h, TAG_BR, "");
 }
 
 static void
Index: html.h
===================================================================
RCS file: /home/cvs/mandoc/mandoc/html.h,v
retrieving revision 1.97
retrieving revision 1.98
diff -Lhtml.h -Lhtml.h -u -p -r1.97 -r1.98
--- html.h
+++ html.h
@@ -135,4 +135,5 @@ void		  print_eqn(struct html *, const s
 void		  print_paragraph(struct html *);
 void		  print_endline(struct html *);
 
+enum roff_tok	  html_fillmode(struct html *, enum roff_tok);
 char		 *html_make_id(const struct roff_node *, int);
--
 To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-01-05  9:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-05  9:15 mandoc: Now that the NODE_NOFILL flag in the syntax tree is accurate, schwarze

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).