summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2011-12-04 23:10:52 +0000
committerIngo Schwarze <schwarze@openbsd.org>2011-12-04 23:10:52 +0000
commitb887f376932da87023511c40a07015f6191bdd1f (patch)
tree01ec8260db57535d1d07db45069c74a90e1fc960
parent29ac73dafe481c332afcf1adc7c74cdad72433c9 (diff)
downloadmandoc-b887f376932da87023511c40a07015f6191bdd1f.tar.gz
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@
-rw-r--r--man_term.c55
-rw-r--r--term.h1
-rw-r--r--term_ascii.c13
3 files changed, 49 insertions, 20 deletions
diff --git a/man_term.c b/man_term.c
index 4b3473a8..0941f7cf 100644
--- a/man_term.c
+++ b/man_term.c
@@ -970,11 +970,26 @@ print_man_foot(struct termp *p, const void *arg)
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 void *arg)
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 void *arg)
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 void *arg)
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 void *arg)
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 void *arg)
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 void *arg)
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);
+ }
}
diff --git a/term.h b/term.h
index bb44ba60..8d8554cb 100644
--- a/term.h
+++ b/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. */
diff --git a/term_ascii.c b/term_ascii.c
index ec5d17d8..0cc8ac9d 100644
--- a/term_ascii.c
+++ b/term_ascii.c
@@ -68,7 +68,7 @@ static size_t locale_width(const struct termp *, int);
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 *outopts)
toks[0] = "indent";
toks[1] = "width";
- toks[2] = NULL;
+ toks[2] = "mdoc";
+ toks[3] = NULL;
while (outopts && *outopts)
switch (getsubopt(&outopts, UNCONST(toks), &v)) {
@@ -116,6 +117,14 @@ ascii_init(enum termenc enc, char *outopts)
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;
}