source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* pod2mdoc: Preserve blank lines inside literal displays, do not render
@ 2015-02-19 13:51 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2015-02-19 13:51 UTC (permalink / raw)
  To: source

Log Message:
-----------
Preserve blank lines inside literal displays,
do not render them by closing the display and opening a new one.
Besides, ignore leading newlines.

Modified Files:
--------------
    pod2mdoc:
        pod2mdoc.c

Revision Data
-------------
Index: pod2mdoc.c
===================================================================
RCS file: /home/cvs/mdocml/pod2mdoc/pod2mdoc.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -Lpod2mdoc.c -Lpod2mdoc.c -u -p -r1.52 -r1.53
--- pod2mdoc.c
+++ pod2mdoc.c
@@ -1059,11 +1059,26 @@ verbatim(struct state *st, char *buf, si
 {
 	size_t		 i, ift, ifo, ifa, ifc, inl;
 	char		*cp, *cp2;
-	int		 nopen;
+	int		 indisplay, nopen, wantsp;
 
-	if ( ! st->parsing || st->paused || start == end)
+	if (st->paused || ! st->parsing)
 		return;
+
+	indisplay = wantsp = 0;
+
 again:
+	if (start == end) {
+		if (indisplay)
+			puts(".Ed");
+		return;
+	}
+
+	if ('\n' == buf[start]) {
+		wantsp = 1;
+		start++;
+		goto again;
+	}
+
 	/* 
 	 * If we're in the SYNOPSIS, see if we're an #include block.
 	 * If we are, then print the "In" macro and re-loop.
@@ -1075,7 +1090,7 @@ again:
 		while (i < end && buf[i] == ' ')
 			i++;
 		if (i == end)
-			return;
+			goto again;
 
 		/* We're an include block! */
 		if (end - i > 10 && 
@@ -1083,6 +1098,9 @@ again:
 			start = i + 10;
 			while (start < end && ' ' == buf[start])
 				start++;
+			if (indisplay)
+				puts(".Ed");
+			indisplay = wantsp = 0;
 			fputs(".In ", stdout);
 			/* Stop til the '>' marker or we hit eoln. */
 			while (start < end && 
@@ -1098,6 +1116,9 @@ again:
 
 		/* Other preprocessor directives. */
 		if ('#' == buf[i]) {
+			if (indisplay)
+				puts(".Ed");
+			indisplay = wantsp = 0;
 			fputs(".Fd ", stdout);
 			start = i;
 			while(start < end && '\n' != buf[start])
@@ -1177,6 +1198,9 @@ again:
 					buf[i] = ' ';
 			buf[ifo++] = '\0';
 			register_type(buf + ift);
+			if (indisplay)
+				puts(".Ed");
+			indisplay = wantsp = 0;
 			printf(".Ft %s", buf + ift);
 			if (buf[ifo] == '*') {
 				fputs(" *", stdout);
@@ -1217,28 +1241,37 @@ again:
 				buf[inl] = '\0';
 				puts(buf + ifc);
 			}
-			start = inl + 1;
-			if (start < end) 
-				goto again;
-			return;
+			start = inl < end ? inl + 1 : end;
+			goto again;
 		}
 	}
-	
-	puts(".Bd -literal");
-	for (last = ' '; start < end; start++) {
+
+	if ( ! indisplay)
+		puts(".Bd -literal");
+	else if (wantsp)
+		putchar('\n');
+	indisplay = 1;
+	wantsp = 0;
+
+	for (last = '\n'; start < end; start++) {
 		/*
 		 * Handle accidental macros (newline starting with
 		 * control character) and escapes.
 		 */
-		if ('\n' == last)
+		if ('\n' == last) {
+			if ('\n' == buf[start])
+				goto again;
 			if ('.' == buf[start] || '\'' == buf[start])
 				printf("\\&");
+		}
 		putchar(last = buf[start]);
 		if ('\\' == buf[start])
 			printf("e");
 	}
-	putchar(last = '\n');
-	puts(".Ed");
+	if ('\n' != last)
+		putchar('\n');
+	if (indisplay)
+		puts(".Ed");
 }
 
 /*
@@ -1627,7 +1660,8 @@ dofile(const struct args *args, const ch
 	struct state	 st;
 	const char	*fbase, *fext, *section, *date, *format;
 	char		*title, *cp;
-	size_t		 sup, end, i, cur = 0;
+	size_t		 cur, end;
+	int		 verb;
 
 	if (0 == sz)
 		return;
@@ -1699,24 +1733,32 @@ dofile(const struct args *args, const ch
 
 	/* Main loop over file contents. */
 
-	while (cur < sz) {
+	cur = 0;
+	for (;;) {
+		while (cur < sz && '\n' == buf[cur])
+			cur++;
+		if (cur >= sz)
+			break;
+
+		verb = isspace((unsigned char)buf[cur]);
+
 		/* Read until next paragraph. */
-		for (i = cur + 1; i < sz; i++)
-			if ('\n' == buf[i] && '\n' == buf[i - 1]) {
-				/* Consume blank paragraphs. */
-				while (i + 1 < sz && '\n' == buf[i + 1])
-					i++;
+
+		for (end = cur + 1; end + 1 < sz; end++)
+			if ('\n' == buf[end] && '\n' == buf[end + 1] &&
+			    !(verb && end + 2 < sz &&
+			      isspace((unsigned char)buf[end + 2])))
 				break;
-			}
 		
 		/* Adjust end marker for EOF. */
-		end = i < sz ? i - 1 : 
-			('\n' == buf[sz - 1] ? sz - 1 : sz);
-		sup = i < sz ? end + 2 : sz;
+
+		if (end < sz && '\n' != buf[end])
+			end++;
 
 		/* Process paragraph and adjust start. */
+
 		dopar(&st, buf, cur, end);
-		cur = sup;
+		cur = end + 2;
 	}
 	dict_destroy();
 }
--
 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:[~2015-02-19 13:51 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-19 13:51 pod2mdoc: Preserve blank lines inside literal displays, do not render 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).