summaryrefslogtreecommitdiffstats
path: root/mdoc_term.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdoc_term.c')
-rw-r--r--mdoc_term.c106
1 files changed, 43 insertions, 63 deletions
diff --git a/mdoc_term.c b/mdoc_term.c
index e520ac6f..6ef49375 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -1,7 +1,7 @@
/* $Id$ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2012-2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2012-2019 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2013 Franco Fichtner <franco@lastsummer.de>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -312,6 +312,19 @@ print_mdoc_node(DECL_ARGS)
size_t offset, rmargin;
int chld;
+ /*
+ * In no-fill mode, break the output line at the beginning
+ * of new input lines except after \c, and nowhere else.
+ */
+
+ if (n->flags & NODE_NOFILL) {
+ if (n->flags & NODE_LINE &&
+ (p->flags & TERMP_NONEWLINE) == 0)
+ term_newln(p);
+ p->flags |= TERMP_BRNEVER;
+ } else
+ p->flags &= ~TERMP_BRNEVER;
+
if (n->type == ROFFT_COMMENT || n->flags & NODE_NOPRT)
return;
@@ -341,9 +354,22 @@ print_mdoc_node(DECL_ARGS)
switch (n->type) {
case ROFFT_TEXT:
- if (*n->string == ' ' && n->flags & NODE_LINE &&
- (p->flags & TERMP_NONEWLINE) == 0)
- term_newln(p);
+ if (n->flags & NODE_LINE) {
+ switch (*n->string) {
+ case '\0':
+ if (p->flags & TERMP_NONEWLINE)
+ term_newln(p);
+ else
+ term_vspace(p);
+ return;
+ case ' ':
+ if ((p->flags & TERMP_NONEWLINE) == 0)
+ term_newln(p);
+ break;
+ default:
+ break;
+ }
+ }
if (NODE_DELIMC & n->flags)
p->flags |= TERMP_NOSPACE;
term_word(p, n->string);
@@ -1418,8 +1444,6 @@ termp_fa_pre(DECL_ARGS)
static int
termp_bd_pre(DECL_ARGS)
{
- size_t lm, len;
- struct roff_node *nn;
int offset;
if (n->type == ROFFT_BLOCK) {
@@ -1445,65 +1469,19 @@ termp_bd_pre(DECL_ARGS)
p->tcol->offset += offset;
}
- /*
- * If -ragged or -filled are specified, the block does nothing
- * but change the indentation. If -unfilled or -literal are
- * specified, text is printed exactly as entered in the display:
- * for macro lines, a newline is appended to the line. Blank
- * lines are allowed.
- */
-
- if (n->norm->Bd.type != DISP_literal &&
- n->norm->Bd.type != DISP_unfilled &&
- n->norm->Bd.type != DISP_centered)
- return 1;
-
- if (n->norm->Bd.type == DISP_literal) {
+ switch (n->norm->Bd.type) {
+ case DISP_literal:
term_tab_set(p, NULL);
term_tab_set(p, "T");
term_tab_set(p, "8n");
+ break;
+ case DISP_centered:
+ p->flags |= TERMP_CENTER;
+ break;
+ default:
+ break;
}
-
- lm = p->tcol->offset;
- p->flags |= TERMP_BRNEVER;
- for (nn = n->child; nn != NULL; nn = nn->next) {
- if (n->norm->Bd.type == DISP_centered) {
- if (nn->type == ROFFT_TEXT) {
- len = term_strlen(p, nn->string);
- p->tcol->offset = len >= p->tcol->rmargin ?
- 0 : lm + len >= p->tcol->rmargin ?
- p->tcol->rmargin - len :
- (lm + p->tcol->rmargin - len) / 2;
- } else
- p->tcol->offset = lm;
- }
- print_mdoc_node(p, pair, meta, nn);
- /*
- * If the printed node flushes its own line, then we
- * needn't do it here as well. This is hacky, but the
- * notion of selective eoln whitespace is pretty dumb
- * anyway, so don't sweat it.
- */
- if (nn->tok < ROFF_MAX)
- continue;
- switch (nn->tok) {
- case MDOC_Sm:
- case MDOC_Bl:
- case MDOC_D1:
- case MDOC_Dl:
- case MDOC_Pp:
- continue;
- default:
- break;
- }
- if (p->flags & TERMP_NONEWLINE ||
- (nn->next && ! (nn->next->flags & NODE_LINE)))
- continue;
- term_flushln(p);
- p->flags |= TERMP_NOSPACE;
- }
- p->flags &= ~TERMP_BRNEVER;
- return 0;
+ return 1;
}
static void
@@ -1511,12 +1489,14 @@ termp_bd_post(DECL_ARGS)
{
if (n->type != ROFFT_BODY)
return;
- if (DISP_literal == n->norm->Bd.type ||
- DISP_unfilled == n->norm->Bd.type)
+ if (n->norm->Bd.type == DISP_unfilled ||
+ n->norm->Bd.type == DISP_literal)
p->flags |= TERMP_BRNEVER;
p->flags |= TERMP_NOSPACE;
term_newln(p);
p->flags &= ~TERMP_BRNEVER;
+ if (n->norm->Bd.type == DISP_centered)
+ p->flags &= ~TERMP_CENTER;
}
static int