source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Implement a long-standing desideratum,  hanging indentation for
@ 2013-12-23  2:20 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2013-12-23  2:20 UTC (permalink / raw)
  To: source

Log Message:
-----------
Implement a long-standing desideratum, 
hanging indentation for .Fn in SYNOPSIS mode, 
exploiting the new trailspace feature
by deliberately *NOT* using it.

Modified Files:
--------------
    mdocml:
        term.c
        mdoc_term.c

Revision Data
-------------
Index: term.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/term.c,v
retrieving revision 1.211
retrieving revision 1.212
diff -Lterm.c -Lterm.c -u -p -r1.211 -r1.212
--- term.c
+++ term.c
@@ -120,7 +120,12 @@ term_flushln(struct termp *p)
 	 * First, establish the maximum columns of "visible" content.
 	 * This is usually the difference between the right-margin and
 	 * an indentation, but can be, for tagged lists or columns, a
-	 * small set of values. 
+	 * small set of values.
+	 *
+	 * The following unsigned-signed subtractions look strange,
+	 * but they are actually correct.  If the int p->overstep
+	 * is negative, it gets sign extended.  Subtracting that
+	 * very large size_t effectively adds a small number to dv.
 	 */
 	assert  (p->rmargin >= p->offset);
 	dv     = p->rmargin - p->offset;
@@ -199,7 +204,11 @@ term_flushln(struct termp *p)
 			if (0 < ntab)
 				vbl += ntab * p->tabwidth;
 
-			/* Remove the p->overstep width. */
+			/*
+			 * Remove the p->overstep width.
+			 * Again, if p->overstep is negative,
+			 * sign extension does the right thing.
+			 */
 
 			bp += (size_t)p->overstep;
 			p->overstep = 0;
@@ -275,8 +284,10 @@ term_flushln(struct termp *p)
 		 * If we have overstepped the margin, temporarily move
 		 * it to the right and flag the rest of the line to be
 		 * shorter.
+		 * If there is a request to keep the columns together,
+		 * allow negative overstep when the column is not full.
 		 */
-		if (p->overstep < 0)
+		if (p->trailspace && p->overstep < 0)
 			p->overstep = 0;
 		return;
 
Index: mdoc_term.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_term.c,v
retrieving revision 1.250
retrieving revision 1.251
diff -Lmdoc_term.c -Lmdoc_term.c -u -p -r1.250 -r1.251
--- mdoc_term.c
+++ mdoc_term.c
@@ -1538,6 +1538,7 @@ termp_ft_pre(DECL_ARGS)
 static int
 termp_fn_pre(DECL_ARGS)
 {
+	size_t		 width, rmargin = 0;
 	int		 pretty;
 
 	pretty = MDOC_SYNPRETTY & n->flags;
@@ -1547,11 +1548,25 @@ termp_fn_pre(DECL_ARGS)
 	if (NULL == (n = n->child))
 		return(0);
 
+	if (pretty) {
+		width = term_len(p, 4);
+		rmargin = p->rmargin;
+		p->rmargin = p->offset + width;
+		p->flags |= TERMP_NOBREAK | TERMP_HANG;
+	}
+
 	assert(MDOC_TEXT == n->type);
 	term_fontpush(p, TERMFONT_BOLD);
 	term_word(p, n->string);
 	term_fontpop(p);
 
+	if (pretty) {
+		term_flushln(p);
+		p->flags &= ~(TERMP_NOBREAK | TERMP_HANG);
+		p->offset = p->rmargin;
+		p->rmargin = rmargin;
+	}
+
 	p->flags |= TERMP_NOSPACE;
 	term_word(p, "(");
 	p->flags |= TERMP_NOSPACE;
@@ -1574,6 +1589,7 @@ termp_fn_pre(DECL_ARGS)
 	if (pretty) {
 		p->flags |= TERMP_NOSPACE;
 		term_word(p, ";");
+		term_flushln(p);
 	}
 
 	return(0);
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

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

only message in thread, other threads:[~2013-12-23  2:20 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-12-23  2:20 mdocml: Implement a long-standing desideratum, hanging indentation for 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).