source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mandoc: Simplify handling of no-fill mode in man(7) by inspecting
@ 2022-08-15 18:47 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2022-08-15 18:47 UTC (permalink / raw)
  To: source

Log Message:
-----------
Simplify handling of no-fill mode in man(7) by inspecting NODE_NOFILL
at the beginning of the node handler, in the same way as it is done
in the mdoc(7) node handler.

As a side effect, this also fixes a bug: if an input line contained
nothing but an escape sequence producing no output whatsoever (for
example, \fR), the old code incorrectly emitted a blank line anyway,
whereas the new code only emits such a blank link if the input line
actually produces output (even invisible zero-width output). To make
the distinction, the ASCII_NBRZW -> lastcol -> term_newln() mechanism 
established in term.c rev. 1.289 is used.

Modified Files:
--------------
    mandoc:
        man_term.c

Revision Data
-------------
Index: man_term.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/man_term.c,v
retrieving revision 1.238
retrieving revision 1.239
diff -Lman_term.c -Lman_term.c -u -p -r1.238 -r1.239
--- man_term.c
+++ man_term.c
@@ -517,7 +517,7 @@ pre_IP(DECL_ARGS)
 		p->trailspace = 1;
 		break;
 	case ROFFT_BODY:
-		p->flags |= TERMP_NOSPACE;
+		p->flags |= TERMP_NOSPACE | TERMP_NONEWLINE;
 		break;
 	default:
 		abort();
@@ -591,7 +591,7 @@ pre_TP(DECL_ARGS)
 		p->trailspace = 1;
 		break;
 	case ROFFT_BODY:
-		p->flags |= TERMP_NOSPACE;
+		p->flags |= TERMP_NOSPACE | TERMP_NONEWLINE;
 		break;
 	default:
 		abort();
@@ -900,6 +900,19 @@ print_man_node(DECL_ARGS)
 	const struct man_term_act *act;
 	int c;
 
+	/*
+	 * In no-fill mode, break the output line at the beginning
+	 * of new input lines except after \c, and nowhere else.
+	 */
+
+	if (n->flags & NODE_NOFILL) {
+		if (n->flags & NODE_LINE &&
+		    (p->flags & TERMP_NONEWLINE) == 0)
+			term_newln(p);
+		p->flags |= TERMP_BRNEVER;
+	} else
+		p->flags &= ~TERMP_BRNEVER;
+
 	if (n->flags & NODE_ID)
 		term_tag_write(n, p->line);
 
@@ -964,28 +977,11 @@ print_man_node(DECL_ARGS)
 		term_fontrepl(p, TERMFONT_NONE);
 
 out:
-	/*
-	 * If we're in a literal context, make sure that words
-	 * together on the same line stay together.  This is a
-	 * POST-printing call, so we check the NEXT word.  Since
-	 * -man doesn't have nested macros, we don't need to be
-	 * more specific than this.
-	 */
-	if (n->flags & NODE_NOFILL &&
-	    ! (p->flags & (TERMP_NOBREAK | TERMP_NONEWLINE)) &&
-	    (n->next == NULL || n->next->flags & NODE_LINE)) {
-		p->flags |= TERMP_BRNEVER | TERMP_NOSPACE;
-		p->tcol->taboff = 0;
-		if (n->string != NULL && *n->string != '\0')
-			term_flushln(p);
-		else
-			term_newln(p);
-		p->flags &= ~TERMP_BRNEVER;
-		if (p->tcol->rmargin < p->maxrmargin &&
-		    n->parent->tok == MAN_HP) {
-			p->tcol->offset = p->tcol->rmargin;
-			p->tcol->rmargin = p->maxrmargin;
-		}
+	if (n->parent->tok == MAN_HP && n->parent->type == ROFFT_BODY &&
+	    n->prev == NULL && n->flags & NODE_NOFILL) {
+		term_newln(p);
+		p->tcol->offset = p->tcol->rmargin;
+		p->tcol->rmargin = p->maxrmargin;
 	}
 	if (n->flags & NODE_EOS)
 		p->flags |= TERMP_SENTENCE;
--
 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:[~2022-08-15 18:47 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-15 18:47 mandoc: Simplify handling of no-fill mode in man(7) by inspecting 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).