source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: If the tag in .Bl -tag .It would leave exactly one blank before
@ 2012-07-13 20:43 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2012-07-13 20:43 UTC (permalink / raw)
  To: source

Log Message:
-----------
If the tag in .Bl -tag .It would leave exactly one blank before the
body of the item, mdoc(7) breaks the line, whereas the .TP used to
translate this to man(7) does not.  Thus, insert an explicit roff(7)
line break in this place.
To be able to correctly count the characters, do not pass font escapes
an the like through print_word().
OpenBSD rev. 1.35

Modified Files:
--------------
    mdocml:
        mdoc_man.c

Revision Data
-------------
Index: mdoc_man.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_man.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -Lmdoc_man.c -Lmdoc_man.c -u -p -r1.36 -r1.37
--- mdoc_man.c
+++ mdoc_man.c
@@ -254,6 +254,8 @@ static	int		outflags;
 #define	MMAN_An_split	(1 << 8)  /* author mode is "split" */
 #define	MMAN_An_nosplit	(1 << 9)  /* author mode is "nosplit" */
 
+static	int		TPremain;  /* characters before tag is full */
+
 static	struct {
 	char	*head;
 	char	*tail;
@@ -270,7 +272,8 @@ font_push(char newfont)
 				fontqueue.size);
 	}
 	*fontqueue.tail = newfont;
-	print_word("\\f");
+	print_word("");
+	printf("\\f");
 	putchar(newfont);
 	outflags &= ~MMAN_spc;
 }
@@ -282,7 +285,8 @@ font_pop(void)
 	if (fontqueue.tail > fontqueue.head)
 		fontqueue.tail--;
 	outflags &= ~MMAN_spc;
-	print_word("\\f");
+	print_word("");
+	printf("\\f");
 	putchar(*fontqueue.tail);
 }
 
@@ -305,28 +309,34 @@ print_word(const char *s)
 		else if (MMAN_nl & outflags)
 			putchar('\n');
 		outflags &= ~(MMAN_PP|MMAN_sp|MMAN_br|MMAN_nl|MMAN_spc);
-	} else if (MMAN_spc & outflags && '\0' != s[0])
+		if (1 == TPremain)
+			printf(".br\n");
+		TPremain = 0;
+	} else if (MMAN_spc & outflags) {
 		/*
 		 * If we need a space, only print it if
 		 * (1) it is forced by `No' or
 		 * (2) what follows is not terminating punctuation or
 		 * (3) what follows is longer than one character.
 		 */
-		if (MMAN_spc_force & outflags ||
+		if (MMAN_spc_force & outflags || '\0' == s[0] ||
 		    NULL == strchr(".,:;)]?!", s[0]) || '\0' != s[1]) {
 			if (MMAN_Bk & outflags) {
 				putchar('\\');
 				putchar('~');
 			} else 
 				putchar(' ');
+			if (TPremain)
+				TPremain--;
 		}
+	}
 
 	/*
 	 * Reassign needing space if we're not following opening
 	 * punctuation.
 	 */
-	if (MMAN_Sm & outflags &&
-	    (('(' != s[0] && '[' != s[0]) || '\0' != s[1]))
+	if (MMAN_Sm & outflags && ('\0' == s[0] ||
+	    (('(' != s[0] && '[' != s[0]) || '\0' != s[1])))
 		outflags |= MMAN_spc;
 	else
 		outflags &= ~MMAN_spc;
@@ -344,6 +354,8 @@ print_word(const char *s)
 			putchar((unsigned char)*s);
 			break;
 		}
+		if (TPremain)
+			TPremain--;
 	}
 }
 
@@ -400,33 +412,38 @@ print_width(const char *v, const struct 
 	char		  buf[24];
 	struct roffsu	  su;
 	size_t		  sz, chsz;
+	int		  numeric, remain;
 
-	/* XXX Rough estimation, might have multiple parts. */
-	chsz = (NULL != child && MDOC_TEXT == child->type) ?
-			strlen(child->string) : 0;
-
+	numeric = 1;
+	remain = 0;
 	if (NULL == v)
 		sz = defsz;
 	else if (a2roffsu(v, &su, SCALE_MAX)) {
 		if (SCALE_EN == su.unit)
 			sz = su.scale;
 		else {
-			if (chsz)
-				print_block(".HP", 0);
-			else
-				print_block(".TP", 0);
-			print_word(v);
-			return;
+			sz = 0;
+			numeric = 0;
 		}
 	} else
 		sz = strlen(v);
 
-	if (chsz > sz)
+	/* XXX Rough estimation, might have multiple parts. */
+	chsz = (NULL != child && MDOC_TEXT == child->type) ?
+			strlen(child->string) : 0;
+
+	if (defsz && chsz > sz)
 		print_block(".HP", 0);
-	else
+	else {
 		print_block(".TP", 0);
-	snprintf(buf, sizeof(buf), "%ldn", sz + 2);
-	print_word(buf);
+		remain = sz + 2;
+	}
+	if (numeric) {
+		snprintf(buf, sizeof(buf), "%ldn", sz + 2);
+		print_word(buf);
+	} else
+		print_word(v);
+	TPremain = remain;
 }
 
 void
@@ -499,7 +516,8 @@ print_node(DECL_ARGS)
 		 */
 		if (MMAN_nl & outflags && ('.' == *n->string || 
 					'\'' == *n->string)) {
-			print_word("\\&");
+			print_word("");
+			printf("\\&");
 			outflags &= ~MMAN_spc;
 		}
 		print_word(n->string);
@@ -599,7 +617,8 @@ pre__t(DECL_ARGS)
 
         if (n->parent && MDOC_Rs == n->parent->tok &&
                         n->parent->norm->Rs.quote_T) {
-		print_word("\"");
+		print_word("");
+		putchar('\"');
 		outflags &= ~MMAN_spc;
 	} else
 		font_push('I');
@@ -613,7 +632,8 @@ post__t(DECL_ARGS)
         if (n->parent && MDOC_Rs == n->parent->tok &&
                         n->parent->norm->Rs.quote_T) {
 		outflags &= ~MMAN_spc;
-		print_word("\"");
+		print_word("");
+		putchar('\"');
 	} else
 		font_pop();
 	post_percent(m, n);
@@ -630,7 +650,8 @@ pre_sect(DECL_ARGS)
 		return(1);
 	outflags |= MMAN_sp;
 	print_block(manacts[n->tok].prefix, 0);
-	print_word("\"");
+	print_word("");
+	putchar('\"');
 	outflags &= ~MMAN_spc;
 	return(1);
 }
@@ -645,7 +666,8 @@ post_sect(DECL_ARGS)
 	if (MDOC_HEAD != n->type)
 		return;
 	outflags &= ~MMAN_spc;
-	print_word("\"");
+	print_word("");
+	putchar('\"');
 	outflags |= MMAN_nl;
 	if (MDOC_Sh == n->tok && SEC_AUTHORS == n->sec)
 		outflags &= ~(MMAN_An_split | MMAN_An_nosplit);
@@ -1117,6 +1139,7 @@ pre_it(DECL_ARGS)
 			/* FALLTHROUGH */
 		case (LIST_hyphen):
 			print_width(bln->norm->Bl.width, NULL, 0);
+			TPremain = 0;
 			outflags |= MMAN_nl;
 			font_push('B');
 			if (LIST_bullet == bln->norm->Bl.type)
@@ -1127,15 +1150,19 @@ pre_it(DECL_ARGS)
 			break;
 		case (LIST_enum):
 			print_width(bln->norm->Bl.width, NULL, 0);
+			TPremain = 0;
 			outflags |= MMAN_nl;
 			print_count(&bln->norm->Bl.count);
 			break;
 		case (LIST_hang):
 			print_width(bln->norm->Bl.width, n->child, 6);
+			TPremain = 0;
 			break;
 		case (LIST_tag):
-			print_width(bln->norm->Bl.width, NULL, 8);
-			break;
+			print_width(bln->norm->Bl.width, n->child, 0);
+			putchar('\n');
+			outflags &= ~MMAN_spc;
+			return(1);
 		default:
 			return(1);
 		}
--
 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:[~2012-07-13 20:43 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-13 20:43 mdocml: If the tag in .Bl -tag .It would leave exactly one blank before 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).