diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2011-12-04 23:10:52 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2011-12-04 23:10:52 +0000 |
commit | b887f376932da87023511c40a07015f6191bdd1f (patch) | |
tree | 01ec8260db57535d1d07db45069c74a90e1fc960 | |
parent | 29ac73dafe481c332afcf1adc7c74cdad72433c9 (diff) | |
download | mandoc-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.c | 55 | ||||
-rw-r--r-- | term.h | 1 | ||||
-rw-r--r-- | term_ascii.c | 13 |
3 files changed, 49 insertions, 20 deletions
@@ -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); + } } @@ -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; } |