source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Implement mdoc(7)-like output style variant for man(7)
@ 2011-12-04 23:10 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2011-12-04 23:10 UTC (permalink / raw)
  To: source

Log Message:
-----------
Implement mdoc(7)-like output style variant for man(7) documents:
* one instead of three blank lines after the page header;
* one instead of three blank lines before the page footer;
* source instead of title(section) in the lower right corner.
Select this style variant with the undocumented command line option -Omdoc.
In the long run, we hope to unify the ouput of both languages and
to pull this out again, but that requires coordination with groff.

Grudgingly ok and, (as usual,-) more comments requested by  kristaps@

Modified Files:
--------------
    mdocml:
        man_term.c
        term.h
        term_ascii.c

Revision Data
-------------
Index: term.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/term.h,v
retrieving revision 1.89
retrieving revision 1.90
diff -Lterm.h -Lterm.h -u -p -r1.89 -r1.90
--- term.h
+++ term.h
@@ -52,6 +52,7 @@ struct	termp_tbl {
 struct	termp {
 	enum termtype	  type;
 	struct rofftbl	  tbl;		/* table configuration */
+	int		  mdocstyle;	/* imitate mdoc(7) output */
 	size_t		  defindent;	/* Default indent for text. */
 	size_t		  defrmargin;	/* Right margin of the device. */
 	size_t		  rmargin;	/* Current right margin. */
Index: man_term.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man_term.c,v
retrieving revision 1.125
retrieving revision 1.126
diff -Lman_term.c -Lman_term.c -u -p -r1.125 -r1.126
--- man_term.c
+++ man_term.c
@@ -970,11 +970,26 @@ print_man_foot(struct termp *p, const vo
 	term_fontrepl(p, TERMFONT_NONE);
 
 	term_vspace(p);
-	term_vspace(p);
-	term_vspace(p);
-	snprintf(title, BUFSIZ, "%s(%s)", meta->title, meta->msec);
+
+	/*
+	 * Temporary, undocumented option to imitate mdoc(7) output.
+	 * In the bottom right corner, use the source instead of
+	 * the title.
+	 */
+
+	if ( ! p->mdocstyle) {
+		term_vspace(p);
+		term_vspace(p);
+		snprintf(title, BUFSIZ, "%s(%s)", meta->title, meta->msec);
+	} else if (meta->source) {
+		strlcpy(title, meta->source, BUFSIZ);
+	} else {
+		title[0] = '\0';
+	}
 	datelen = term_strlen(p, meta->date);
 
+	/* Bottom left corner: manual source. */
+
 	p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
 	p->offset = 0;
 	p->rmargin = (p->maxrmargin - datelen + term_len(p, 1)) / 2;
@@ -983,6 +998,8 @@ print_man_foot(struct termp *p, const vo
 		term_word(p, meta->source);
 	term_flushln(p);
 
+	/* At the bottom in the middle: manual date. */
+
 	p->flags |= TERMP_NOSPACE;
 	p->offset = p->rmargin;
 	p->rmargin = p->maxrmargin - term_strlen(p, title);
@@ -992,6 +1009,8 @@ print_man_foot(struct termp *p, const vo
 	term_word(p, meta->date);
 	term_flushln(p);
 
+	/* Bottom right corner: manual title and section. */
+
 	p->flags &= ~TERMP_NOBREAK;
 	p->flags |= TERMP_NOSPACE;
 	p->offset = p->rmargin;
@@ -1013,21 +1032,14 @@ print_man_head(struct termp *p, const vo
 	assert(m->title);
 	assert(m->msec);
 
-	/*
-	 * Note that old groff would spit out some spaces before the
-	 * header.  We discontinue this strange behaviour, but at one
-	 * point we did so here.
-	 */
-
-	p->offset = 0;
-	p->rmargin = p->maxrmargin;
-
-	buf[0] = title[0] = '\0';
-
 	if (m->vol)
 		strlcpy(buf, m->vol, BUFSIZ);
+	else
+		buf[0] = '\0';
 	buflen = term_strlen(p, buf);
 
+	/* Top left corner: manual title and section. */
+
 	snprintf(title, BUFSIZ, "%s(%s)", m->title, m->msec);
 	titlen = term_strlen(p, title);
 
@@ -1041,6 +1053,8 @@ print_man_head(struct termp *p, const vo
 	term_word(p, title);
 	term_flushln(p);
 
+	/* At the top in the middle: manual volume. */
+
 	p->flags |= TERMP_NOSPACE;
 	p->offset = p->rmargin;
 	p->rmargin = p->offset + buflen + titlen < p->maxrmargin ?
@@ -1049,6 +1063,8 @@ print_man_head(struct termp *p, const vo
 	term_word(p, buf);
 	term_flushln(p);
 
+	/* Top right corner: title and section, again. */
+
 	p->flags &= ~TERMP_NOBREAK;
 	if (p->rmargin + titlen <= p->maxrmargin) {
 		p->flags |= TERMP_NOSPACE;
@@ -1063,11 +1079,14 @@ print_man_head(struct termp *p, const vo
 	p->rmargin = p->maxrmargin;
 
 	/* 
-	 * Groff likes to have some leading spaces before content.  Well
-	 * that's fine by me.
+	 * Groff prints three blank lines before the content.
+	 * Do the same, except in the temporary, undocumented
+	 * mode imitating mdoc(7) output.
 	 */
 
 	term_vspace(p);
-	term_vspace(p);
-	term_vspace(p);
+	if ( ! p->mdocstyle) {
+		term_vspace(p);
+		term_vspace(p);
+	}
 }
Index: term_ascii.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/term_ascii.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -Lterm_ascii.c -Lterm_ascii.c -u -p -r1.19 -r1.20
--- term_ascii.c
+++ term_ascii.c
@@ -68,7 +68,7 @@ static	size_t		  locale_width(const stru
 static struct termp *
 ascii_init(enum termenc enc, char *outopts)
 {
-	const char	*toks[3];
+	const char	*toks[4];
 	char		*v;
 	struct termp	*p;
 
@@ -106,7 +106,8 @@ ascii_init(enum termenc enc, char *outop
 
 	toks[0] = "indent";
 	toks[1] = "width";
-	toks[2] = NULL;
+	toks[2] = "mdoc";
+	toks[3] = NULL;
 
 	while (outopts && *outopts)
 		switch (getsubopt(&outopts, UNCONST(toks), &v)) {
@@ -115,6 +116,14 @@ ascii_init(enum termenc enc, char *outop
 			break;
 		case (1):
 			p->defrmargin = (size_t)atoi(v);
+			break;
+		case (2):
+			/*
+			 * Temporary, undocumented mode
+			 * to imitate mdoc(7) output style.
+			 */
+			p->mdocstyle = 1;
+			p->defindent = 5;
 			break;
 		default:
 			break;
--
 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:[~2011-12-04 23:10 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-04 23:10 mdocml: Implement mdoc(7)-like output style variant for man(7) 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).