source@mandoc.bsd.lv
 help / color / mirror / Atom feed
From: schwarze@mdocml.bsd.lv
To: source@mdocml.bsd.lv
Subject: mdocml: In -Tman mode, support automatic word keeps in the SYNOPSIS just
Date: Sun, 18 Nov 2012 21:14:45 -0500 (EST)	[thread overview]
Message-ID: <201211190214.qAJ2Ejp7008953@krisdoz.my.domain> (raw)

Log Message:
-----------
In -Tman mode, support automatic word keeps in the SYNOPSIS
just like in -Tascii mode; requested by millert@.

While here, do not escape the blank characters terminating man(7)
macros; this is becoming more important as we use more keeps now.

Note that -Tman still does not support .nr nS.

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.45
retrieving revision 1.46
diff -Lmdoc_man.c -Lmdoc_man.c -u -p -r1.45 -r1.46
--- mdoc_man.c
+++ mdoc_man.c
@@ -251,9 +251,10 @@ static	int		outflags;
 #define	MMAN_PP		(1 << 5)  /* reset indentation etc. */
 #define	MMAN_Sm		(1 << 6)  /* horizontal spacing mode */
 #define	MMAN_Bk		(1 << 7)  /* word keep mode */
-#define	MMAN_An_split	(1 << 8)  /* author mode is "split" */
-#define	MMAN_An_nosplit	(1 << 9)  /* author mode is "nosplit" */
-#define	MMAN_PD		(1 << 10) /* inter-paragraph spacing disabled */
+#define	MMAN_Bk_susp	(1 << 8)  /* suspend this (after a macro) */
+#define	MMAN_An_split	(1 << 9)  /* author mode is "split" */
+#define	MMAN_An_nosplit	(1 << 10) /* author mode is "nosplit" */
+#define	MMAN_PD		(1 << 11) /* inter-paragraph spacing disabled */
 
 #define	BL_STACK_MAX	32
 
@@ -334,7 +335,8 @@ print_word(const char *s)
 		 */
 		if (MMAN_spc_force & outflags || '\0' == s[0] ||
 		    NULL == strchr(".,:;)]?!", s[0]) || '\0' != s[1]) {
-			if (MMAN_Bk & outflags)
+			if (MMAN_Bk & outflags &&
+			    ! (MMAN_Bk_susp & outflags))
 				putchar('\\');
 			putchar(' ');
 			if (TPremain)
@@ -351,7 +353,7 @@ print_word(const char *s)
 		outflags |= MMAN_spc;
 	else
 		outflags &= ~MMAN_spc;
-	outflags &= ~MMAN_spc_force;
+	outflags &= ~(MMAN_spc_force | MMAN_Bk_susp);
 
 	for ( ; *s; s++) {
 		switch (*s) {
@@ -391,13 +393,11 @@ print_block(const char *s, int newflags)
 			print_line(".PD", 0);
 			outflags &= ~MMAN_PD;
 		}
-	} else if (! (MMAN_PD & outflags)) {
-		print_line(".PD 0", 0);
-		outflags |= MMAN_PD;
-	}
+	} else if (! (MMAN_PD & outflags))
+		print_line(".PD 0", MMAN_PD);
 	outflags |= MMAN_nl;
 	print_word(s);
-	outflags |= newflags;
+	outflags |= MMAN_Bk_susp | newflags;
 }
 
 static void
@@ -475,7 +475,7 @@ print_width(const char *v, const struct 
 	 * preserve its indentation.
 	 */
 	if (Bl_stack_len && Bl_stack[Bl_stack_len - 1]) {
-		print_line(".RS", 0);
+		print_line(".RS", MMAN_Bk_susp);
 		snprintf(buf, sizeof(buf), "%ldn",
 				Bl_stack[Bl_stack_len - 1]);
 		print_word(buf);
@@ -556,7 +556,7 @@ print_node(DECL_ARGS)
 	const struct mdoc_node	*prev, *sub;
 	const struct manact	*act;
 	int			 cond, do_sub;
-	
+
 	/*
 	 * Break the line if we were parsed subsequent the current node.
 	 * This makes the page structure be more consistent.
@@ -706,13 +706,25 @@ static int
 pre_sect(DECL_ARGS)
 {
 
-	if (MDOC_HEAD != n->type)
-		return(1);
-	outflags |= MMAN_sp;
-	print_block(manacts[n->tok].prefix, 0);
-	print_word("");
-	putchar('\"');
-	outflags &= ~MMAN_spc;
+	switch (n->type) {
+	case (MDOC_HEAD):
+		outflags |= MMAN_sp;
+		print_block(manacts[n->tok].prefix, 0);
+		print_word("");
+		putchar('\"');
+		outflags &= ~MMAN_spc;
+		break;
+	case (MDOC_BODY):
+		if (MDOC_Sh == n->tok) {
+			if (MDOC_SYNPRETTY & n->flags)
+				outflags |= MMAN_Bk;
+			else
+				outflags &= ~MMAN_Bk;
+		}
+		break;
+	default:
+		break;
+	}
 	return(1);
 }
 
@@ -817,7 +829,7 @@ pre_bd(DECL_ARGS)
 		print_line(".nf", 0);
 	if (0 == n->norm->Bd.comp && NULL != n->parent->prev)
 		outflags |= MMAN_sp;
-	print_line(".RS", 0);
+	print_line(".RS", MMAN_Bk_susp);
 	print_offs(n->norm->Bd.offs);
 	outflags |= MMAN_nl;
 	return(1);
@@ -841,7 +853,7 @@ post_bd(DECL_ARGS)
 	 */
 	if (NULL != n->parent->next &&
 	    Bl_stack_len && Bl_stack[Bl_stack_len - 1]) {
-		print_line(".RS", 0);
+		print_line(".RS", MMAN_Bk_susp);
 		snprintf(buf, sizeof(buf), "%ldn",
 				Bl_stack[Bl_stack_len - 1]);
 		print_word(buf);
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

                 reply	other threads:[~2012-11-19  2:14 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201211190214.qAJ2Ejp7008953@krisdoz.my.domain \
    --to=schwarze@mdocml.bsd.lv \
    --cc=source@mdocml.bsd.lv \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).