version 1.228, 2019/01/05 21:18:26 |
version 1.231, 2019/07/22 03:21:49 |
|
|
#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 "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 92 static void post_SY(DECL_ARGS); |
|
Line 94 static void post_SY(DECL_ARGS); |
|
static void post_TP(DECL_ARGS); |
static void post_TP(DECL_ARGS); |
static void post_UR(DECL_ARGS); |
static void post_UR(DECL_ARGS); |
|
|
|
static void tag_man(struct termp *, struct roff_node *); |
|
|
static const struct man_term_act man_term_acts[MAN_MAX - MAN_TH] = { |
static const struct man_term_act man_term_acts[MAN_MAX - MAN_TH] = { |
{ NULL, NULL, 0 }, /* TH */ |
{ NULL, NULL, 0 }, /* TH */ |
{ pre_SH, post_SH, 0 }, /* SH */ |
{ pre_SH, post_SH, 0 }, /* SH */ |
Line 146 terminal_man(void *arg, const struct roff_meta *man) |
|
Line 150 terminal_man(void *arg, const struct roff_meta *man) |
|
{ |
{ |
struct mtermp mt; |
struct mtermp mt; |
struct termp *p; |
struct termp *p; |
struct roff_node *n; |
struct roff_node *n, *nc, *nn; |
size_t save_defindent; |
size_t save_defindent; |
|
|
p = (struct termp *)arg; |
p = (struct termp *)arg; |
Line 165 terminal_man(void *arg, const struct roff_meta *man) |
|
Line 169 terminal_man(void *arg, const struct roff_meta *man) |
|
|
|
n = man->first->child; |
n = man->first->child; |
if (p->synopsisonly) { |
if (p->synopsisonly) { |
while (n != NULL) { |
for (nn = NULL; n != NULL; n = n->next) { |
if (n->tok == MAN_SH && |
if (n->tok != MAN_SH) |
n->child->child->type == ROFFT_TEXT && |
continue; |
!strcmp(n->child->child->string, "SYNOPSIS")) { |
nc = n->child->child; |
if (n->child->next->child != NULL) |
if (nc->type != ROFFT_TEXT) |
print_man_nodelist(p, &mt, |
continue; |
n->child->next->child, man); |
if (strcmp(nc->string, "SYNOPSIS") == 0) |
term_newln(p); |
|
break; |
break; |
} |
if (nn == NULL && strcmp(nc->string, "NAME") == 0) |
n = n->next; |
nn = n; |
} |
} |
|
if (n == NULL) |
|
n = nn; |
|
p->flags |= TERMP_NOSPACE; |
|
if (n != NULL && (n = n->child->next->child) != NULL) |
|
print_man_nodelist(p, &mt, n, man); |
|
term_newln(p); |
} else { |
} else { |
term_begin(p, print_man_head, print_man_foot, man); |
term_begin(p, print_man_head, print_man_foot, man); |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
Line 310 pre_alternate(DECL_ARGS) |
|
Line 319 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 529 pre_IP(DECL_ARGS) |
|
Line 538 pre_IP(DECL_ARGS) |
|
case ROFFT_HEAD: |
case ROFFT_HEAD: |
p->tcol->offset = mt->offset; |
p->tcol->offset = mt->offset; |
p->tcol->rmargin = mt->offset + len; |
p->tcol->rmargin = mt->offset + len; |
if (n->child != NULL) |
if (n->child != NULL) { |
print_man_node(p, mt, n->child, meta); |
print_man_node(p, mt, n->child, meta); |
|
tag_man(p, n->child); |
|
} |
return 0; |
return 0; |
case ROFFT_BODY: |
case ROFFT_BODY: |
p->tcol->offset = mt->offset + len; |
p->tcol->offset = mt->offset + len; |
Line 1142 print_man_head(struct termp *p, const struct roff_meta |
|
Line 1153 print_man_head(struct termp *p, const struct roff_meta |
|
term_vspace(p); |
term_vspace(p); |
} |
} |
free(title); |
free(title); |
|
} |
|
|
|
/* |
|
* Skip leading whitespace, dashes, backslashes, and font escapes, |
|
* then create a tag if the first following byte is a letter. |
|
* Priority is high unless whitespace is present. |
|
*/ |
|
static void |
|
tag_man(struct termp *p, struct roff_node *n) |
|
{ |
|
const char *cp, *arg; |
|
int prio, sz; |
|
|
|
assert(n->type == ROFFT_TEXT); |
|
cp = n->string; |
|
prio = 1; |
|
for (;;) { |
|
switch (*cp) { |
|
case ' ': |
|
case '\t': |
|
prio = INT_MAX; |
|
/* FALLTHROUGH */ |
|
case '-': |
|
cp++; |
|
break; |
|
case '\\': |
|
cp++; |
|
switch (mandoc_escape(&cp, &arg, &sz)) { |
|
case ESCAPE_FONT: |
|
case ESCAPE_FONTROMAN: |
|
case ESCAPE_FONTITALIC: |
|
case ESCAPE_FONTBOLD: |
|
case ESCAPE_FONTPREV: |
|
case ESCAPE_FONTBI: |
|
break; |
|
case ESCAPE_SPECIAL: |
|
if (sz != 1) |
|
return; |
|
switch (*arg) { |
|
case '&': |
|
case '-': |
|
case 'e': |
|
break; |
|
default: |
|
return; |
|
} |
|
break; |
|
default: |
|
return; |
|
} |
|
break; |
|
default: |
|
if (isalpha((unsigned char)*cp)) |
|
tag_put(cp, prio, p->line); |
|
return; |
|
} |
|
} |
} |
} |