version 1.229, 2019/06/27 12:20:18 |
version 1.235, 2020/03/13 15:32:28 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
|
* Copyright (c) 2010-2015, 2017-2020 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2010-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org> |
|
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
* |
|
* Plain text formatter for man(7), used by mandoc(1) |
|
* for ASCII, UTF-8, PostScript, and PDF output. |
*/ |
*/ |
#include "config.h" |
#include "config.h" |
|
|
|
|
#include <string.h> |
#include <string.h> |
|
|
#include "mandoc_aux.h" |
#include "mandoc_aux.h" |
|
#include "mandoc.h" |
#include "roff.h" |
#include "roff.h" |
#include "man.h" |
#include "man.h" |
#include "out.h" |
#include "out.h" |
#include "term.h" |
#include "term.h" |
|
#include "term_tag.h" |
#include "main.h" |
#include "main.h" |
|
|
#define MAXMARGINS 64 /* maximum number of indented scopes */ |
#define MAXMARGINS 64 /* maximum number of indented scopes */ |
Line 62 static void print_man_head(struct termp *, |
|
Line 67 static void print_man_head(struct termp *, |
|
static void print_man_foot(struct termp *, |
static void print_man_foot(struct termp *, |
const struct roff_meta *); |
const struct roff_meta *); |
static void print_bvspace(struct termp *, |
static void print_bvspace(struct termp *, |
const struct roff_node *, int); |
struct roff_node *, int); |
|
|
static int pre_B(DECL_ARGS); |
static int pre_B(DECL_ARGS); |
static int pre_DT(DECL_ARGS); |
static int pre_DT(DECL_ARGS); |
Line 201 terminal_man(void *arg, const struct roff_meta *man) |
|
Line 206 terminal_man(void *arg, const struct roff_meta *man) |
|
* first, print it. |
* first, print it. |
*/ |
*/ |
static void |
static void |
print_bvspace(struct termp *p, const struct roff_node *n, int pardist) |
print_bvspace(struct termp *p, struct roff_node *n, int pardist) |
{ |
{ |
int i; |
struct roff_node *nch; |
|
int i; |
|
|
term_newln(p); |
term_newln(p); |
|
|
if (n->body != NULL && n->body->child != NULL) |
if (n->body != NULL && |
if (n->body->child->type == ROFFT_TBL) |
(nch = roff_node_child(n->body)) != NULL && |
return; |
nch->type == ROFFT_TBL) |
|
return; |
|
|
if (n->parent->type == ROFFT_ROOT || n->parent->tok != MAN_RS) |
if (n->parent->tok != MAN_RS && roff_node_prev(n) == NULL) |
if (n->prev == NULL) |
return; |
return; |
|
|
|
for (i = 0; i < pardist; i++) |
for (i = 0; i < pardist; i++) |
term_vspace(p); |
term_vspace(p); |
Line 315 pre_alternate(DECL_ARGS) |
|
Line 321 pre_alternate(DECL_ARGS) |
|
assert(nn->type == ROFFT_TEXT); |
assert(nn->type == ROFFT_TEXT); |
term_word(p, nn->string); |
term_word(p, nn->string); |
if (nn->flags & NODE_EOS) |
if (nn->flags & NODE_EOS) |
p->flags |= TERMP_SENTENCE; |
p->flags |= TERMP_SENTENCE; |
if (nn->next != NULL) |
if (nn->next != NULL) |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
} |
} |
Line 665 pre_SS(DECL_ARGS) |
|
Line 671 pre_SS(DECL_ARGS) |
|
* and after an empty subsection. |
* and after an empty subsection. |
*/ |
*/ |
|
|
do { |
if ((n = roff_node_prev(n)) == NULL || |
n = n->prev; |
(n->tok == MAN_SS && roff_node_child(n->body) == NULL)) |
} while (n != NULL && n->tok >= MAN_TH && |
|
man_term_act(n->tok)->flags & MAN_NOTEXT); |
|
if (n == NULL || n->type == ROFFT_COMMENT || |
|
(n->tok == MAN_SS && n->body->child == NULL)) |
|
break; |
break; |
|
|
for (i = 0; i < mt->pardist; i++) |
for (i = 0; i < mt->pardist; i++) |
Line 710 pre_SH(DECL_ARGS) |
|
Line 712 pre_SH(DECL_ARGS) |
|
* and after an empty section. |
* and after an empty section. |
*/ |
*/ |
|
|
do { |
if ((n = roff_node_prev(n)) == NULL || |
n = n->prev; |
(n->tok == MAN_SH && roff_node_child(n->body) == NULL)) |
} while (n != NULL && n->tok >= MAN_TH && |
|
man_term_act(n->tok)->flags & MAN_NOTEXT); |
|
if (n == NULL || n->type == ROFFT_COMMENT || |
|
(n->tok == MAN_SH && n->body->child == NULL)) |
|
break; |
break; |
|
|
for (i = 0; i < mt->pardist; i++) |
for (i = 0; i < mt->pardist; i++) |
Line 821 pre_SY(DECL_ARGS) |
|
Line 819 pre_SY(DECL_ARGS) |
|
|
|
switch (n->type) { |
switch (n->type) { |
case ROFFT_BLOCK: |
case ROFFT_BLOCK: |
if (n->prev == NULL || n->prev->tok != MAN_SY) |
if ((nn = roff_node_prev(n)) == NULL || nn->tok != MAN_SY) |
print_bvspace(p, n, mt->pardist); |
print_bvspace(p, n, mt->pardist); |
return 1; |
return 1; |
case ROFFT_HEAD: |
case ROFFT_HEAD: |
Line 901 print_man_node(DECL_ARGS) |
|
Line 899 print_man_node(DECL_ARGS) |
|
{ |
{ |
const struct man_term_act *act; |
const struct man_term_act *act; |
int c; |
int c; |
|
|
|
if (n->flags & NODE_ID) |
|
term_tag_write(n, p->line); |
|
|
switch (n->type) { |
switch (n->type) { |
case ROFFT_TEXT: |
case ROFFT_TEXT: |