Merge for mdocml-1.10.9

This commit is contained in:
joerg 2011-01-12 22:58:42 +00:00
parent c0d9444af1
commit f494eb95a3
5 changed files with 453 additions and 1807 deletions

View File

@ -1,281 +0,0 @@
/* $Vendor-Id: man_action.c,v 1.40 2010/07/22 23:03:15 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "mandoc.h"
#include "libman.h"
#include "libmandoc.h"
struct actions {
int (*post)(struct man *);
};
static int post_TH(struct man *);
static int post_fi(struct man *);
static int post_nf(struct man *);
static int post_AT(struct man *);
static int post_UC(struct man *);
const struct actions man_actions[MAN_MAX] = {
{ NULL }, /* br */
{ post_TH }, /* TH */
{ NULL }, /* SH */
{ NULL }, /* SS */
{ NULL }, /* TP */
{ NULL }, /* LP */
{ NULL }, /* PP */
{ NULL }, /* P */
{ NULL }, /* IP */
{ NULL }, /* HP */
{ NULL }, /* SM */
{ NULL }, /* SB */
{ NULL }, /* BI */
{ NULL }, /* IB */
{ NULL }, /* BR */
{ NULL }, /* RB */
{ NULL }, /* R */
{ NULL }, /* B */
{ NULL }, /* I */
{ NULL }, /* IR */
{ NULL }, /* RI */
{ NULL }, /* na */
{ NULL }, /* i */
{ NULL }, /* sp */
{ post_nf }, /* nf */
{ post_fi }, /* fi */
{ NULL }, /* r */
{ NULL }, /* RE */
{ NULL }, /* RS */
{ NULL }, /* DT */
{ post_UC }, /* UC */
{ NULL }, /* PD */
{ NULL }, /* Sp */
{ post_nf }, /* Vb */
{ post_fi }, /* Ve */
{ post_AT }, /* AT */
{ NULL }, /* in */
};
int
man_action_post(struct man *m)
{
if (MAN_ACTED & m->last->flags)
return(1);
m->last->flags |= MAN_ACTED;
switch (m->last->type) {
case (MAN_TEXT):
/* FALLTHROUGH */
case (MAN_ROOT):
return(1);
default:
break;
}
if (NULL == man_actions[m->last->tok].post)
return(1);
return((*man_actions[m->last->tok].post)(m));
}
static int
post_fi(struct man *m)
{
if ( ! (MAN_LITERAL & m->flags))
if ( ! man_nmsg(m, m->last, MANDOCERR_NOSCOPE))
return(0);
m->flags &= ~MAN_LITERAL;
return(1);
}
static int
post_nf(struct man *m)
{
if (MAN_LITERAL & m->flags)
if ( ! man_nmsg(m, m->last, MANDOCERR_SCOPEREP))
return(0);
m->flags |= MAN_LITERAL;
return(1);
}
static int
post_TH(struct man *m)
{
struct man_node *n;
if (m->meta.title)
free(m->meta.title);
if (m->meta.vol)
free(m->meta.vol);
if (m->meta.source)
free(m->meta.source);
if (m->meta.msec)
free(m->meta.msec);
if (m->meta.rawdate)
free(m->meta.rawdate);
m->meta.title = m->meta.vol = m->meta.rawdate =
m->meta.msec = m->meta.source = NULL;
m->meta.date = 0;
/* ->TITLE<- MSEC DATE SOURCE VOL */
n = m->last->child;
assert(n);
m->meta.title = mandoc_strdup(n->string);
/* TITLE ->MSEC<- DATE SOURCE VOL */
n = n->next;
assert(n);
m->meta.msec = mandoc_strdup(n->string);
/* TITLE MSEC ->DATE<- SOURCE VOL */
/*
* Try to parse the date. If this works, stash the epoch (this
* is optimal because we can reformat it in the canonical form).
* If it doesn't parse, isn't specified at all, or is an empty
* string, then use the current date.
*/
n = n->next;
if (n && n->string && *n->string) {
m->meta.date = mandoc_a2time
(MTIME_ISO_8601, n->string);
if (0 == m->meta.date) {
if ( ! man_nmsg(m, n, MANDOCERR_BADDATE))
return(0);
m->meta.rawdate = mandoc_strdup(n->string);
}
} else
m->meta.date = time(NULL);
/* TITLE MSEC DATE ->SOURCE<- VOL */
if (n && (n = n->next))
m->meta.source = mandoc_strdup(n->string);
/* TITLE MSEC DATE SOURCE ->VOL<- */
if (n && (n = n->next))
m->meta.vol = mandoc_strdup(n->string);
/*
* Remove the `TH' node after we've processed it for our
* meta-data.
*/
man_node_delete(m, m->last);
return(1);
}
static int
post_AT(struct man *m)
{
static const char * const unix_versions[] = {
"7th Edition",
"System III",
"System V",
"System V Release 2",
};
const char *p, *s;
struct man_node *n, *nn;
n = m->last->child;
if (NULL == n || MAN_TEXT != n->type)
p = unix_versions[0];
else {
s = n->string;
if (0 == strcmp(s, "3"))
p = unix_versions[0];
else if (0 == strcmp(s, "4"))
p = unix_versions[1];
else if (0 == strcmp(s, "5")) {
nn = n->next;
if (nn && MAN_TEXT == nn->type && nn->string[0])
p = unix_versions[3];
else
p = unix_versions[2];
} else
p = unix_versions[0];
}
if (m->meta.source)
free(m->meta.source);
m->meta.source = mandoc_strdup(p);
return(1);
}
static int
post_UC(struct man *m)
{
static const char * const bsd_versions[] = {
"3rd Berkeley Distribution",
"4th Berkeley Distribution",
"4.2 Berkeley Distribution",
"4.3 Berkeley Distribution",
"4.4 Berkeley Distribution",
};
const char *p, *s;
struct man_node *n;
n = m->last->child;
if (NULL == n || MAN_TEXT != n->type)
p = bsd_versions[0];
else {
s = n->string;
if (0 == strcmp(s, "3"))
p = bsd_versions[0];
else if (0 == strcmp(s, "4"))
p = bsd_versions[1];
else if (0 == strcmp(s, "5"))
p = bsd_versions[2];
else if (0 == strcmp(s, "6"))
p = bsd_versions[3];
else if (0 == strcmp(s, "7"))
p = bsd_versions[4];
else
p = bsd_versions[0];
}
if (m->meta.source)
free(m->meta.source);
m->meta.source = mandoc_strdup(p);
return(1);
}

View File

@ -1,6 +1,7 @@
/* $Vendor-Id: man_term.c,v 1.84 2010/07/23 13:22:35 kristaps Exp $ */
/* $Vendor-Id: man_term.c,v 1.94 2011/01/04 01:23:18 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@ -80,14 +81,12 @@ static void print_man_foot(struct termp *, const void *);
static void print_bvspace(struct termp *,
const struct man_node *);
static int pre_alternate(DECL_ARGS);
static int pre_B(DECL_ARGS);
static int pre_BI(DECL_ARGS);
static int pre_HP(DECL_ARGS);
static int pre_I(DECL_ARGS);
static int pre_IP(DECL_ARGS);
static int pre_PP(DECL_ARGS);
static int pre_RB(DECL_ARGS);
static int pre_RI(DECL_ARGS);
static int pre_RS(DECL_ARGS);
static int pre_SH(DECL_ARGS);
static int pre_SS(DECL_ARGS);
@ -96,6 +95,7 @@ static int pre_ign(DECL_ARGS);
static int pre_in(DECL_ARGS);
static int pre_literal(DECL_ARGS);
static int pre_sp(DECL_ARGS);
static int pre_ft(DECL_ARGS);
static void post_IP(DECL_ARGS);
static void post_HP(DECL_ARGS);
@ -117,31 +117,27 @@ static const struct termact termacts[MAN_MAX] = {
{ pre_HP, post_HP, 0 }, /* HP */
{ NULL, NULL, 0 }, /* SM */
{ pre_B, NULL, 0 }, /* SB */
{ pre_BI, NULL, 0 }, /* BI */
{ pre_BI, NULL, 0 }, /* IB */
{ pre_RB, NULL, 0 }, /* BR */
{ pre_RB, NULL, 0 }, /* RB */
{ pre_alternate, NULL, 0 }, /* BI */
{ pre_alternate, NULL, 0 }, /* IB */
{ pre_alternate, NULL, 0 }, /* BR */
{ pre_alternate, NULL, 0 }, /* RB */
{ NULL, NULL, 0 }, /* R */
{ pre_B, NULL, 0 }, /* B */
{ pre_I, NULL, 0 }, /* I */
{ pre_RI, NULL, 0 }, /* IR */
{ pre_RI, NULL, 0 }, /* RI */
{ pre_alternate, NULL, 0 }, /* IR */
{ pre_alternate, NULL, 0 }, /* RI */
{ NULL, NULL, MAN_NOTEXT }, /* na */
{ pre_I, NULL, 0 }, /* i */
{ pre_sp, NULL, MAN_NOTEXT }, /* sp */
{ pre_literal, NULL, 0 }, /* nf */
{ pre_literal, NULL, 0 }, /* fi */
{ NULL, NULL, 0 }, /* r */
{ NULL, NULL, 0 }, /* RE */
{ pre_RS, post_RS, 0 }, /* RS */
{ pre_ign, NULL, 0 }, /* DT */
{ pre_ign, NULL, 0 }, /* UC */
{ pre_ign, NULL, 0 }, /* PD */
{ pre_sp, NULL, MAN_NOTEXT }, /* Sp */
{ pre_literal, NULL, 0 }, /* Vb */
{ pre_literal, NULL, 0 }, /* Ve */
{ pre_ign, NULL, 0 }, /* AT */
{ pre_in, NULL, MAN_NOTEXT }, /* in */
{ pre_ft, NULL, MAN_NOTEXT }, /* ft */
};
@ -253,96 +249,67 @@ pre_literal(DECL_ARGS)
{
term_newln(p);
switch (n->tok) {
case (MAN_Vb):
/* FALLTHROUGH */
case (MAN_nf):
if (MAN_nf == n->tok)
mt->fl |= MANT_LITERAL;
return(MAN_Vb != n->tok);
default:
else
mt->fl &= ~MANT_LITERAL;
break;
}
return(1);
}
/* ARGSUSED */
static int
pre_RB(DECL_ARGS)
{
const struct man_node *nn;
int i;
for (i = 0, nn = n->child; nn; nn = nn->next, i++) {
if (i % 2 && MAN_RB == n->tok)
term_fontrepl(p, TERMFONT_BOLD);
else if ( ! (i % 2) && MAN_RB != n->tok)
term_fontrepl(p, TERMFONT_BOLD);
else
term_fontrepl(p, TERMFONT_NONE);
if (i > 0)
p->flags |= TERMP_NOSPACE;
print_man_node(p, mt, nn, m);
}
return(0);
}
/* ARGSUSED */
static int
pre_RI(DECL_ARGS)
{
const struct man_node *nn;
int i;
for (i = 0, nn = n->child; nn; nn = nn->next, i++) {
if (i % 2 && MAN_RI == n->tok)
term_fontrepl(p, TERMFONT_UNDER);
else if ( ! (i % 2) && MAN_RI != n->tok)
term_fontrepl(p, TERMFONT_UNDER);
else
term_fontrepl(p, TERMFONT_NONE);
if (i > 0)
p->flags |= TERMP_NOSPACE;
print_man_node(p, mt, nn, m);
}
return(0);
}
/* ARGSUSED */
static int
pre_BI(DECL_ARGS)
pre_alternate(DECL_ARGS)
{
enum termfont font[2];
const struct man_node *nn;
int i;
int savelit, i;
for (i = 0, nn = n->child; nn; nn = nn->next, i++) {
if (i % 2 && MAN_BI == n->tok)
term_fontrepl(p, TERMFONT_UNDER);
else if (i % 2)
term_fontrepl(p, TERMFONT_BOLD);
else if (MAN_BI == n->tok)
term_fontrepl(p, TERMFONT_BOLD);
else
term_fontrepl(p, TERMFONT_UNDER);
if (i)
p->flags |= TERMP_NOSPACE;
print_man_node(p, mt, nn, m);
switch (n->tok) {
case (MAN_RB):
font[0] = TERMFONT_NONE;
font[1] = TERMFONT_BOLD;
break;
case (MAN_RI):
font[0] = TERMFONT_NONE;
font[1] = TERMFONT_UNDER;
break;
case (MAN_BR):
font[0] = TERMFONT_BOLD;
font[1] = TERMFONT_NONE;
break;
case (MAN_BI):
font[0] = TERMFONT_BOLD;
font[1] = TERMFONT_UNDER;
break;
case (MAN_IR):
font[0] = TERMFONT_UNDER;
font[1] = TERMFONT_NONE;
break;
case (MAN_IB):
font[0] = TERMFONT_UNDER;
font[1] = TERMFONT_BOLD;
break;
default:
abort();
}
savelit = MANT_LITERAL & mt->fl;
mt->fl &= ~MANT_LITERAL;
for (i = 0, nn = n->child; nn; nn = nn->next, i = 1 - i) {
term_fontrepl(p, font[i]);
if (savelit && NULL == nn->next)
mt->fl |= MANT_LITERAL;
print_man_node(p, mt, nn, m);
if (nn->next)
p->flags |= TERMP_NOSPACE;
}
return(0);
}
/* ARGSUSED */
static int
pre_B(DECL_ARGS)
@ -352,6 +319,46 @@ pre_B(DECL_ARGS)
return(1);
}
/* ARGSUSED */
static int
pre_ft(DECL_ARGS)
{
const char *cp;
if (NULL == n->child) {
term_fontlast(p);
return(0);
}
cp = n->child->string;
switch (*cp) {
case ('4'):
/* FALLTHROUGH */
case ('3'):
/* FALLTHROUGH */
case ('B'):
term_fontrepl(p, TERMFONT_BOLD);
break;
case ('2'):
/* FALLTHROUGH */
case ('I'):
term_fontrepl(p, TERMFONT_UNDER);
break;
case ('P'):
term_fontlast(p);
break;
case ('1'):
/* FALLTHROUGH */
case ('C'):
/* FALLTHROUGH */
case ('R'):
term_fontrepl(p, TERMFONT_NONE);
break;
default:
break;
}
return(0);
}
/* ARGSUSED */
static int
@ -497,7 +504,7 @@ pre_PP(DECL_ARGS)
break;
}
return(1);
return(MAN_HEAD != n->type);
}
@ -507,7 +514,7 @@ pre_IP(DECL_ARGS)
{
const struct man_node *nn;
size_t len;
int ival;
int savelit, ival;
switch (n->type) {
case (MAN_BODY):
@ -527,15 +534,11 @@ pre_IP(DECL_ARGS)
len = mt->lmargin;
ival = -1;
/* Calculate offset. */
/* Calculate the offset from the optional second argument. */
if (NULL != (nn = n->parent->head->child))
if (NULL != (nn = nn->next)) {
for ( ; nn->next; nn = nn->next)
/* Do nothing. */ ;
if (NULL != (nn = nn->next))
if ((ival = a2width(p, nn->string)) >= 0)
len = (size_t)ival;
}
switch (n->type) {
case (MAN_HEAD):
@ -551,9 +554,15 @@ pre_IP(DECL_ARGS)
/* Set the saved left-margin. */
mt->lmargin = (size_t)ival;
/* Don't print the length value. */
for (nn = n->child; nn->next; nn = nn->next)
print_man_node(p, mt, nn, m);
savelit = MANT_LITERAL & mt->fl;
mt->fl &= ~MANT_LITERAL;
if (n->child)
print_man_node(p, mt, n->child, m);
if (savelit)
mt->fl |= MANT_LITERAL;
return(0);
case (MAN_BODY):
p->offset = mt->offset + len;
@ -579,7 +588,7 @@ post_IP(DECL_ARGS)
p->rmargin = p->maxrmargin;
break;
case (MAN_BODY):
term_flushln(p);
term_newln(p);
p->flags &= ~TERMP_NOLPAD;
break;
default:
@ -594,12 +603,11 @@ pre_TP(DECL_ARGS)
{
const struct man_node *nn;
size_t len;
int ival;
int savelit, ival;
switch (n->type) {
case (MAN_HEAD):
p->flags |= TERMP_NOBREAK;
p->flags |= TERMP_TWOSPACE;
break;
case (MAN_BODY):
p->flags |= TERMP_NOLPAD;
@ -634,11 +642,17 @@ pre_TP(DECL_ARGS)
p->offset = mt->offset;
p->rmargin = mt->offset + len;
savelit = MANT_LITERAL & mt->fl;
mt->fl &= ~MANT_LITERAL;
/* Don't print same-line elements. */
for (nn = n->child; nn; nn = nn->next)
if (nn->line > n->line)
print_man_node(p, mt, nn, m);
if (savelit)
mt->fl |= MANT_LITERAL;
if (ival >= 0)
mt->lmargin = (size_t)ival;
@ -668,7 +682,7 @@ post_TP(DECL_ARGS)
p->rmargin = p->maxrmargin;
break;
case (MAN_BODY):
term_flushln(p);
term_newln(p);
p->flags &= ~TERMP_NOLPAD;
break;
default:
@ -855,10 +869,16 @@ print_man_node(DECL_ARGS)
p->rmargin = p->maxrmargin = TERM_MAXMARGIN;
p->flags |= TERMP_NOSPACE;
term_flushln(p);
p->flags &= ~TERMP_NOLPAD;
p->rmargin = rm;
p->maxrmargin = rmax;
}
break;
case (MAN_TBL):
if (TBL_SPAN_FIRST & n->span->flags)
term_newln(p);
term_tbl(p, n->span);
break;
default:
if ( ! (MAN_NOTEXT & termacts[n->tok].flags))
term_fontrepl(p, TERMFONT_NONE);
@ -870,11 +890,17 @@ print_man_node(DECL_ARGS)
if (c && n->child)
print_man_nodelist(p, mt, n->child, m);
if (MAN_TEXT != n->type) {
switch (n->type) {
case (MAN_TEXT):
/* FALLTHROUGH */
case (MAN_TBL):
break;
default:
if (termacts[n->tok].post)
(*termacts[n->tok].post)(p, mt, n, m);
if ( ! (MAN_NOTEXT & termacts[n->tok].flags))
term_fontrepl(p, TERMFONT_NONE);
break;
}
if (MAN_EOS & n->flags)
@ -916,6 +942,10 @@ print_man_foot(struct termp *p, const void *arg)
p->rmargin = p->maxrmargin - term_strlen(p, buf);
p->offset = 0;
/* term_strlen() can return zero. */
if (p->rmargin == p->maxrmargin)
p->rmargin--;
if (meta->source)
term_word(p, meta->source);
if (meta->source)

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
/* $Vendor-Id: mdoc_term.c,v 1.179 2010/07/27 08:38:04 kristaps Exp $ */
/* $Vendor-Id: mdoc_term.c,v 1.208 2011/01/06 14:05:12 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@ -68,50 +68,43 @@ static void synopsis_pre(struct termp *,
const struct mdoc_node *);
static void termp____post(DECL_ARGS);
static void termp__t_post(DECL_ARGS);
static void termp_an_post(DECL_ARGS);
static void termp_aq_post(DECL_ARGS);
static void termp_bd_post(DECL_ARGS);
static void termp_bk_post(DECL_ARGS);
static void termp_bl_post(DECL_ARGS);
static void termp_bq_post(DECL_ARGS);
static void termp_brq_post(DECL_ARGS);
static void termp_bx_post(DECL_ARGS);
static void termp_d1_post(DECL_ARGS);
static void termp_dq_post(DECL_ARGS);
static int termp_fd_pre(DECL_ARGS);
static void termp_fo_post(DECL_ARGS);
static void termp_in_post(DECL_ARGS);
static void termp_it_post(DECL_ARGS);
static void termp_lb_post(DECL_ARGS);
static void termp_nm_post(DECL_ARGS);
static void termp_op_post(DECL_ARGS);
static void termp_pf_post(DECL_ARGS);
static void termp_pq_post(DECL_ARGS);
static void termp_qq_post(DECL_ARGS);
static void termp_quote_post(DECL_ARGS);
static void termp_sh_post(DECL_ARGS);
static void termp_sq_post(DECL_ARGS);
static void termp_ss_post(DECL_ARGS);
static int termp__a_pre(DECL_ARGS);
static int termp__t_pre(DECL_ARGS);
static int termp_an_pre(DECL_ARGS);
static int termp_ap_pre(DECL_ARGS);
static int termp_aq_pre(DECL_ARGS);
static int termp_bd_pre(DECL_ARGS);
static int termp_bf_pre(DECL_ARGS);
static int termp_bk_pre(DECL_ARGS);
static int termp_bl_pre(DECL_ARGS);
static int termp_bold_pre(DECL_ARGS);
static int termp_bq_pre(DECL_ARGS);
static int termp_brq_pre(DECL_ARGS);
static int termp_bt_pre(DECL_ARGS);
static int termp_cd_pre(DECL_ARGS);
static int termp_d1_pre(DECL_ARGS);
static int termp_dq_pre(DECL_ARGS);
static int termp_ex_pre(DECL_ARGS);
static int termp_fa_pre(DECL_ARGS);
static int termp_fd_pre(DECL_ARGS);
static int termp_fl_pre(DECL_ARGS);
static int termp_fn_pre(DECL_ARGS);
static int termp_fo_pre(DECL_ARGS);
static int termp_ft_pre(DECL_ARGS);
static int termp_igndelim_pre(DECL_ARGS);
static int termp_in_pre(DECL_ARGS);
static int termp_it_pre(DECL_ARGS);
static int termp_li_pre(DECL_ARGS);
@ -119,16 +112,12 @@ static int termp_lk_pre(DECL_ARGS);
static int termp_nd_pre(DECL_ARGS);
static int termp_nm_pre(DECL_ARGS);
static int termp_ns_pre(DECL_ARGS);
static int termp_op_pre(DECL_ARGS);
static int termp_pf_pre(DECL_ARGS);
static int termp_pq_pre(DECL_ARGS);
static int termp_qq_pre(DECL_ARGS);
static int termp_quote_pre(DECL_ARGS);
static int termp_rs_pre(DECL_ARGS);
static int termp_rv_pre(DECL_ARGS);
static int termp_sh_pre(DECL_ARGS);
static int termp_sm_pre(DECL_ARGS);
static int termp_sp_pre(DECL_ARGS);
static int termp_sq_pre(DECL_ARGS);
static int termp_ss_pre(DECL_ARGS);
static int termp_under_pre(DECL_ARGS);
static int termp_ud_pre(DECL_ARGS);
@ -170,7 +159,7 @@ static const struct termact termacts[MDOC_MAX] = {
{ termp_li_pre, NULL }, /* Li */
{ termp_nd_pre, NULL }, /* Nd */
{ termp_nm_pre, termp_nm_post }, /* Nm */
{ termp_op_pre, termp_op_post }, /* Op */
{ termp_quote_pre, termp_quote_post }, /* Op */
{ NULL, NULL }, /* Ot */
{ termp_under_pre, NULL }, /* Pa */
{ termp_rv_pre, NULL }, /* Rv */
@ -178,7 +167,7 @@ static const struct termact termacts[MDOC_MAX] = {
{ termp_under_pre, NULL }, /* Va */
{ termp_vt_pre, NULL }, /* Vt */
{ termp_xr_pre, NULL }, /* Xr */
{ NULL, termp____post }, /* %A */
{ termp__a_pre, termp____post }, /* %A */
{ termp_under_pre, termp____post }, /* %B */
{ NULL, termp____post }, /* %D */
{ termp_under_pre, termp____post }, /* %I */
@ -187,45 +176,45 @@ static const struct termact termacts[MDOC_MAX] = {
{ NULL, termp____post }, /* %O */
{ NULL, termp____post }, /* %P */
{ NULL, termp____post }, /* %R */
{ termp_under_pre, termp____post }, /* %T */
{ termp__t_pre, termp__t_post }, /* %T */
{ NULL, termp____post }, /* %V */
{ NULL, NULL }, /* Ac */
{ termp_aq_pre, termp_aq_post }, /* Ao */
{ termp_aq_pre, termp_aq_post }, /* Aq */
{ termp_quote_pre, termp_quote_post }, /* Ao */
{ termp_quote_pre, termp_quote_post }, /* Aq */
{ NULL, NULL }, /* At */
{ NULL, NULL }, /* Bc */
{ termp_bf_pre, NULL }, /* Bf */
{ termp_bq_pre, termp_bq_post }, /* Bo */
{ termp_bq_pre, termp_bq_post }, /* Bq */
{ termp_quote_pre, termp_quote_post }, /* Bo */
{ termp_quote_pre, termp_quote_post }, /* Bq */
{ termp_xx_pre, NULL }, /* Bsx */
{ NULL, termp_bx_post }, /* Bx */
{ NULL, NULL }, /* Db */
{ NULL, NULL }, /* Dc */
{ termp_dq_pre, termp_dq_post }, /* Do */
{ termp_dq_pre, termp_dq_post }, /* Dq */
{ termp_quote_pre, termp_quote_post }, /* Do */
{ termp_quote_pre, termp_quote_post }, /* Dq */
{ NULL, NULL }, /* Ec */ /* FIXME: no space */
{ NULL, NULL }, /* Ef */
{ termp_under_pre, NULL }, /* Em */
{ NULL, NULL }, /* Eo */
{ termp_xx_pre, NULL }, /* Fx */
{ termp_bold_pre, NULL }, /* Ms */
{ NULL, NULL }, /* No */
{ termp_igndelim_pre, NULL }, /* No */
{ termp_ns_pre, NULL }, /* Ns */
{ termp_xx_pre, NULL }, /* Nx */
{ termp_xx_pre, NULL }, /* Ox */
{ NULL, NULL }, /* Pc */
{ termp_pf_pre, termp_pf_post }, /* Pf */
{ termp_pq_pre, termp_pq_post }, /* Po */
{ termp_pq_pre, termp_pq_post }, /* Pq */
{ termp_igndelim_pre, termp_pf_post }, /* Pf */
{ termp_quote_pre, termp_quote_post }, /* Po */
{ termp_quote_pre, termp_quote_post }, /* Pq */
{ NULL, NULL }, /* Qc */
{ termp_sq_pre, termp_sq_post }, /* Ql */
{ termp_qq_pre, termp_qq_post }, /* Qo */
{ termp_qq_pre, termp_qq_post }, /* Qq */
{ termp_quote_pre, termp_quote_post }, /* Ql */
{ termp_quote_pre, termp_quote_post }, /* Qo */
{ termp_quote_pre, termp_quote_post }, /* Qq */
{ NULL, NULL }, /* Re */
{ termp_rs_pre, NULL }, /* Rs */
{ NULL, NULL }, /* Sc */
{ termp_sq_pre, termp_sq_post }, /* So */
{ termp_sq_pre, termp_sq_post }, /* Sq */
{ termp_quote_pre, termp_quote_post }, /* So */
{ termp_quote_pre, termp_quote_post }, /* Sq */
{ termp_sm_pre, NULL }, /* Sm */
{ termp_under_pre, NULL }, /* Sx */
{ termp_bold_pre, NULL }, /* Sy */
@ -235,7 +224,7 @@ static const struct termact termacts[MDOC_MAX] = {
{ NULL, NULL }, /* Xo */
{ termp_fo_pre, termp_fo_post }, /* Fo */
{ NULL, NULL }, /* Fc */
{ termp_op_pre, termp_op_post }, /* Oo */
{ termp_quote_pre, termp_quote_post }, /* Oo */
{ NULL, NULL }, /* Oc */
{ termp_bk_pre, termp_bk_post }, /* Bk */
{ NULL, NULL }, /* Ek */
@ -247,8 +236,8 @@ static const struct termact termacts[MDOC_MAX] = {
{ termp_sp_pre, NULL }, /* Lp */
{ termp_lk_pre, NULL }, /* Lk */
{ termp_under_pre, NULL }, /* Mt */
{ termp_brq_pre, termp_brq_post }, /* Brq */
{ termp_brq_pre, termp_brq_post }, /* Bro */
{ termp_quote_pre, termp_quote_post }, /* Brq */
{ termp_quote_pre, termp_quote_post }, /* Bro */
{ NULL, NULL }, /* Brc */
{ NULL, termp____post }, /* %C */
{ NULL, NULL }, /* Es */ /* TODO */
@ -324,17 +313,29 @@ print_mdoc_node(DECL_ARGS)
memset(&npair, 0, sizeof(struct termpair));
npair.ppair = pair;
if (MDOC_TEXT == n->type)
switch (n->type) {
case (MDOC_TEXT):
term_word(p, n->string);
else if (termacts[n->tok].pre && ENDBODY_NOT == n->end)
chld = (*termacts[n->tok].pre)(p, &npair, m, n);
break;
case (MDOC_TBL):
term_tbl(p, n->span);
break;
default:
if (termacts[n->tok].pre && ENDBODY_NOT == n->end)
chld = (*termacts[n->tok].pre)
(p, &npair, m, n);
break;
}
/*
* Keeps only work until the end of a line. If a keep was
* invoked in a prior line, revert it to PREKEEP.
*
* Also let SYNPRETTY sections behave as if they were wrapped
* in a `Bk' block.
*/
if (TERMP_KEEP & p->flags) {
if (TERMP_KEEP & p->flags || MDOC_SYNPRETTY & n->flags) {
if (n->prev && n->prev->line != n->line) {
p->flags &= ~TERMP_KEEP;
p->flags |= TERMP_PREKEEP;
@ -346,13 +347,29 @@ print_mdoc_node(DECL_ARGS)
}
}
/*
* Since SYNPRETTY sections aren't "turned off" with `Ek',
* we have to intuit whether we should disable formatting.
*/
if ( ! (MDOC_SYNPRETTY & n->flags) &&
((n->prev && MDOC_SYNPRETTY & n->prev->flags) ||
(n->parent && MDOC_SYNPRETTY & n->parent->flags)))
p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP);
if (chld && n->child)
print_mdoc_nodelist(p, &npair, m, n->child);
term_fontpopq(p, font);
if (MDOC_TEXT != n->type && termacts[n->tok].post &&
! (MDOC_ENDED & n->flags)) {
switch (n->type) {
case (MDOC_TEXT):
break;
case (MDOC_TBL):
break;
default:
if ( ! termacts[n->tok].post || MDOC_ENDED & n->flags)
break;
(void)(*termacts[n->tok].post)(p, &npair, m, n);
/*
@ -370,6 +387,7 @@ print_mdoc_node(DECL_ARGS)
*/
if (ENDBODY_NOSPACE == n->end)
p->flags |= TERMP_NOSPACE;
break;
}
if (MDOC_EOS & n->flags)
@ -556,9 +574,9 @@ print_bvspace(struct termp *p,
term_newln(p);
if (MDOC_Bd == bl->tok && bl->data.Bd->comp)
if (MDOC_Bd == bl->tok && bl->norm->Bd.comp)
return;
if (MDOC_Bl == bl->tok && bl->data.Bl->comp)
if (MDOC_Bl == bl->tok && bl->norm->Bl.comp)
return;
/* Do not vspace directly after Ss/Sh. */
@ -577,13 +595,13 @@ print_bvspace(struct termp *p,
/* A `-column' does not assert vspace within the list. */
if (MDOC_Bl == bl->tok && LIST_column == bl->data.Bl->type)
if (MDOC_Bl == bl->tok && LIST_column == bl->norm->Bl.type)
if (n->prev && MDOC_It == n->prev->tok)
return;
/* A `-diag' without body does not vspace. */
if (MDOC_Bl == bl->tok && LIST_diag == bl->data.Bl->type)
if (MDOC_Bl == bl->tok && LIST_diag == bl->norm->Bl.type)
if (n->prev && MDOC_It == n->prev->tok) {
assert(n->prev->body);
if (NULL == n->prev->body->child)
@ -594,33 +612,6 @@ print_bvspace(struct termp *p,
}
/* ARGSUSED */
static int
termp_dq_pre(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return(1);
term_word(p, "\\(lq");
p->flags |= TERMP_NOSPACE;
return(1);
}
/* ARGSUSED */
static void
termp_dq_post(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return;
p->flags |= TERMP_NOSPACE;
term_word(p, "\\(rq");
}
/* ARGSUSED */
static int
termp_it_pre(DECL_ARGS)
@ -637,8 +628,7 @@ termp_it_pre(DECL_ARGS)
}
bl = n->parent->parent->parent;
assert(bl->data.Bl);
type = bl->data.Bl->type;
type = bl->norm->Bl.type;
/*
* First calculate width and offset. This is pretty easy unless
@ -648,8 +638,8 @@ termp_it_pre(DECL_ARGS)
width = offset = 0;
if (bl->data.Bl->offs)
offset = a2offs(p, bl->data.Bl->offs);
if (bl->norm->Bl.offs)
offset = a2offs(p, bl->norm->Bl.offs);
switch (type) {
case (LIST_column):
@ -665,7 +655,7 @@ termp_it_pre(DECL_ARGS)
* column.
* - For more than 5 columns, add only one column.
*/
ncols = bl->data.Bl->ncols;
ncols = bl->norm->Bl.ncols;
/* LINTED */
dcol = ncols < 5 ? term_len(p, 4) :
@ -680,7 +670,7 @@ termp_it_pre(DECL_ARGS)
nn->prev && i < (int)ncols;
nn = nn->prev, i++)
offset += dcol + a2width
(p, bl->data.Bl->cols[i]);
(p, bl->norm->Bl.cols[i]);
/*
* When exceeding the declared number of columns, leave
@ -695,10 +685,10 @@ termp_it_pre(DECL_ARGS)
* Use the declared column widths, extended as explained
* in the preceding paragraph.
*/
width = a2width(p, bl->data.Bl->cols[i]) + dcol;
width = a2width(p, bl->norm->Bl.cols[i]) + dcol;
break;
default:
if (NULL == bl->data.Bl->width)
if (NULL == bl->norm->Bl.width)
break;
/*
@ -706,8 +696,8 @@ termp_it_pre(DECL_ARGS)
* number for buffering single arguments. See the above
* handling for column for how this changes.
*/
assert(bl->data.Bl->width);
width = a2width(p, bl->data.Bl->width) + term_len(p, 2);
assert(bl->norm->Bl.width);
width = a2width(p, bl->norm->Bl.width) + term_len(p, 2);
break;
}
@ -969,7 +959,7 @@ termp_it_post(DECL_ARGS)
if (MDOC_BLOCK == n->type)
return;
type = n->parent->parent->parent->data.Bl->type;
type = n->parent->parent->parent->norm->Bl.type;
switch (type) {
case (LIST_item):
@ -1030,12 +1020,18 @@ termp_nm_pre(DECL_ARGS)
synopsis_pre(p, n->parent);
if (MDOC_HEAD == n->type && n->next->child) {
p->flags |= TERMP_NOSPACE | TERMP_NOBREAK | TERMP_HANG;
p->rmargin = p->offset + term_len(p, 1) +
(NULL == n->child ? term_strlen(p, m->name) :
MDOC_TEXT == n->child->type ?
term_strlen(p, n->child->string) :
term_len(p, 5));
p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
p->rmargin = p->offset + term_len(p, 1);
if (NULL == n->child) {
p->rmargin += term_strlen(p, m->name);
} else if (MDOC_TEXT == n->child->type) {
p->rmargin += term_strlen(p, n->child->string);
if (n->child->next)
p->flags |= TERMP_HANG;
} else {
p->rmargin += term_len(p, 5);
p->flags |= TERMP_HANG;
}
}
term_fontpush(p, TERMFONT_BOLD);
@ -1077,6 +1073,19 @@ termp_fl_pre(DECL_ARGS)
}
/* ARGSUSED */
static int
termp__a_pre(DECL_ARGS)
{
if (n->prev && MDOC__A == n->prev->tok)
if (NULL == n->next || MDOC__A != n->next->tok)
term_word(p, "and");
return(1);
}
/* ARGSUSED */
static int
termp_an_pre(DECL_ARGS)
@ -1124,10 +1133,10 @@ termp_an_post(DECL_ARGS)
return;
}
if (AUTH_split == n->data.An.auth) {
if (AUTH_split == n->norm->An.auth) {
p->flags &= ~TERMP_NOSPLIT;
p->flags |= TERMP_SPLIT;
} else if (AUTH_nosplit == n->data.An.auth) {
} else if (AUTH_nosplit == n->norm->An.auth) {
p->flags &= ~TERMP_SPLIT;
p->flags |= TERMP_NOSPLIT;
}
@ -1268,18 +1277,6 @@ termp_bl_post(DECL_ARGS)
}
/* ARGSUSED */
static void
termp_op_post(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return;
p->flags |= TERMP_NOSPACE;
term_word(p, "\\(rB");
}
/* ARGSUSED */
static int
termp_xr_pre(DECL_ARGS)
@ -1297,9 +1294,7 @@ termp_xr_pre(DECL_ARGS)
return(0);
p->flags |= TERMP_NOSPACE;
term_word(p, "(");
p->flags |= TERMP_NOSPACE;
term_word(p, nn->string);
p->flags |= TERMP_NOSPACE;
term_word(p, ")");
return(0);
@ -1447,23 +1442,6 @@ termp_sh_post(DECL_ARGS)
}
/* ARGSUSED */
static int
termp_op_pre(DECL_ARGS)
{
switch (n->type) {
case (MDOC_BODY):
term_word(p, "\\(lB");
p->flags |= TERMP_NOSPACE;
break;
default:
break;
}
return(1);
}
/* ARGSUSED */
static int
termp_bt_pre(DECL_ARGS)
@ -1520,31 +1498,6 @@ termp_d1_post(DECL_ARGS)
}
/* ARGSUSED */
static int
termp_aq_pre(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return(1);
term_word(p, "\\(la");
p->flags |= TERMP_NOSPACE;
return(1);
}
/* ARGSUSED */
static void
termp_aq_post(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return;
p->flags |= TERMP_NOSPACE;
term_word(p, "\\(ra");
}
/* ARGSUSED */
static int
termp_ft_pre(DECL_ARGS)
@ -1630,9 +1583,8 @@ termp_bd_pre(DECL_ARGS)
} else if (MDOC_HEAD == n->type)
return(0);
assert(n->data.Bd);
if (n->data.Bd->offs)
p->offset += a2offs(p, n->data.Bd->offs);
if (n->norm->Bd.offs)
p->offset += a2offs(p, n->norm->Bd.offs);
/*
* If -ragged or -filled are specified, the block does nothing
@ -1642,20 +1594,50 @@ termp_bd_pre(DECL_ARGS)
* lines are allowed.
*/
if (DISP_literal != n->data.Bd->type &&
DISP_unfilled != n->data.Bd->type)
if (DISP_literal != n->norm->Bd.type &&
DISP_unfilled != n->norm->Bd.type)
return(1);
tabwidth = p->tabwidth;
p->tabwidth = term_len(p, 8);
if (DISP_literal == n->norm->Bd.type)
p->tabwidth = term_len(p, 8);
rm = p->rmargin;
rmax = p->maxrmargin;
p->rmargin = p->maxrmargin = TERM_MAXMARGIN;
for (nn = n->child; nn; nn = nn->next) {
if (nn->prev && nn->prev->line < nn->line)
term_newln(p);
print_mdoc_node(p, pair, m, 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.
*/
switch (nn->tok) {
case (MDOC_Sm):
/* FALLTHROUGH */
case (MDOC_br):
/* FALLTHROUGH */
case (MDOC_sp):
/* FALLTHROUGH */
case (MDOC_Bl):
/* FALLTHROUGH */
case (MDOC_D1):
/* FALLTHROUGH */
case (MDOC_Dl):
/* FALLTHROUGH */
case (MDOC_Lp):
/* FALLTHROUGH */
case (MDOC_Pp):
continue;
default:
break;
}
if (nn->next && nn->next->line == nn->line)
continue;
term_flushln(p);
p->flags |= TERMP_NOSPACE;
}
p->tabwidth = tabwidth;
@ -1677,9 +1659,8 @@ termp_bd_post(DECL_ARGS)
rm = p->rmargin;
rmax = p->maxrmargin;
assert(n->data.Bd);
if (DISP_literal == n->data.Bd->type ||
DISP_unfilled == n->data.Bd->type)
if (DISP_literal == n->norm->Bd.type ||
DISP_unfilled == n->norm->Bd.type)
p->rmargin = p->maxrmargin = TERM_MAXMARGIN;
p->flags |= TERMP_NOSPACE;
@ -1690,31 +1671,6 @@ termp_bd_post(DECL_ARGS)
}
/* ARGSUSED */
static int
termp_qq_pre(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return(1);
term_word(p, "\"");
p->flags |= TERMP_NOSPACE;
return(1);
}
/* ARGSUSED */
static void
termp_qq_post(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return;
p->flags |= TERMP_NOSPACE;
term_word(p, "\"");
}
/* ARGSUSED */
static void
termp_bx_post(DECL_ARGS)
@ -1735,7 +1691,7 @@ termp_xx_pre(DECL_ARGS)
pp = NULL;
switch (n->tok) {
case (MDOC_Bsx):
pp = "BSDI BSD/OS";
pp = "BSD/OS";
break;
case (MDOC_Dx):
pp = "DragonFly";
@ -1764,32 +1720,7 @@ termp_xx_pre(DECL_ARGS)
/* ARGSUSED */
static int
termp_sq_pre(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return(1);
term_word(p, "\\(oq");
p->flags |= TERMP_NOSPACE;
return(1);
}
/* ARGSUSED */
static void
termp_sq_post(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return;
p->flags |= TERMP_NOSPACE;
term_word(p, "\\(aq");
}
/* ARGSUSED */
static int
termp_pf_pre(DECL_ARGS)
termp_igndelim_pre(DECL_ARGS)
{
p->flags |= TERMP_IGNDELIM;
@ -1802,7 +1733,6 @@ static void
termp_pf_post(DECL_ARGS)
{
p->flags &= ~TERMP_IGNDELIM;
p->flags |= TERMP_NOSPACE;
}
@ -1902,11 +1832,6 @@ termp_sp_pre(DECL_ARGS)
len = 0;
break;
default:
assert(n->parent);
if ((NULL == n->next || NULL == n->prev) &&
(MDOC_Ss == n->parent->tok ||
MDOC_Sh == n->parent->tok))
return(0);
len = 1;
break;
}
@ -1922,12 +1847,61 @@ termp_sp_pre(DECL_ARGS)
/* ARGSUSED */
static int
termp_brq_pre(DECL_ARGS)
termp_quote_pre(DECL_ARGS)
{
if (MDOC_BODY != n->type)
if (MDOC_BODY != n->type && MDOC_ELEM != n->type)
return(1);
term_word(p, "\\(lC");
switch (n->tok) {
case (MDOC_Ao):
/* FALLTHROUGH */
case (MDOC_Aq):
term_word(p, "<");
break;
case (MDOC_Bro):
/* FALLTHROUGH */
case (MDOC_Brq):
term_word(p, "{");
break;
case (MDOC_Oo):
/* FALLTHROUGH */
case (MDOC_Op):
/* FALLTHROUGH */
case (MDOC_Bo):
/* FALLTHROUGH */
case (MDOC_Bq):
term_word(p, "[");
break;
case (MDOC_Do):
/* FALLTHROUGH */
case (MDOC_Dq):
term_word(p, "``");
break;
case (MDOC_Po):
/* FALLTHROUGH */
case (MDOC_Pq):
term_word(p, "(");
break;
case (MDOC__T):
/* FALLTHROUGH */
case (MDOC_Qo):
/* FALLTHROUGH */
case (MDOC_Qq):
term_word(p, "\"");
break;
case (MDOC_Ql):
/* FALLTHROUGH */
case (MDOC_So):
/* FALLTHROUGH */
case (MDOC_Sq):
term_word(p, "`");
break;
default:
abort();
/* NOTREACHED */
}
p->flags |= TERMP_NOSPACE;
return(1);
}
@ -1935,62 +1909,62 @@ termp_brq_pre(DECL_ARGS)
/* ARGSUSED */
static void
termp_brq_post(DECL_ARGS)
termp_quote_post(DECL_ARGS)
{
if (MDOC_BODY != n->type)
if (MDOC_BODY != n->type && MDOC_ELEM != n->type)
return;
p->flags |= TERMP_NOSPACE;
term_word(p, "\\(rC");
}
/* ARGSUSED */
static int
termp_bq_pre(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return(1);
term_word(p, "\\(lB");
p->flags |= TERMP_NOSPACE;
return(1);
}
/* ARGSUSED */
static void
termp_bq_post(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return;
p->flags |= TERMP_NOSPACE;
term_word(p, "\\(rB");
}
/* ARGSUSED */
static int
termp_pq_pre(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return(1);
term_word(p, "\\&(");
p->flags |= TERMP_NOSPACE;
return(1);
}
/* ARGSUSED */
static void
termp_pq_post(DECL_ARGS)
{
if (MDOC_BODY != n->type)
return;
term_word(p, ")");
switch (n->tok) {
case (MDOC_Ao):
/* FALLTHROUGH */
case (MDOC_Aq):
term_word(p, ">");
break;
case (MDOC_Bro):
/* FALLTHROUGH */
case (MDOC_Brq):
term_word(p, "}");
break;
case (MDOC_Oo):
/* FALLTHROUGH */
case (MDOC_Op):
/* FALLTHROUGH */
case (MDOC_Bo):
/* FALLTHROUGH */
case (MDOC_Bq):
term_word(p, "]");
break;
case (MDOC_Do):
/* FALLTHROUGH */
case (MDOC_Dq):
term_word(p, "''");
break;
case (MDOC_Po):
/* FALLTHROUGH */
case (MDOC_Pq):
term_word(p, ")");
break;
case (MDOC__T):
/* FALLTHROUGH */
case (MDOC_Qo):
/* FALLTHROUGH */
case (MDOC_Qq):
term_word(p, "\"");
break;
case (MDOC_Ql):
/* FALLTHROUGH */
case (MDOC_So):
/* FALLTHROUGH */
case (MDOC_Sq):
term_word(p, "'");
break;
default:
abort();
/* NOTREACHED */
}
}
@ -2005,7 +1979,6 @@ termp_fo_pre(DECL_ARGS)
} else if (MDOC_BODY == n->type) {
p->flags |= TERMP_NOSPACE;
term_word(p, "(");
p->flags |= TERMP_NOSPACE;
return(1);
}
@ -2029,13 +2002,10 @@ termp_fo_post(DECL_ARGS)
if (MDOC_BODY != n->type)
return;
p->flags |= TERMP_NOSPACE;
term_word(p, ")");
if (MDOC_SYNPRETTY & n->flags) {
p->flags |= TERMP_NOSPACE;
if (MDOC_SYNPRETTY & n->flags)
term_word(p, ";");
}
}
@ -2049,11 +2019,9 @@ termp_bf_pre(DECL_ARGS)
else if (MDOC_BLOCK != n->type)
return(1);
assert(n->data.Bf);
if (FONT_Em == n->data.Bf->font)
if (FONT_Em == n->norm->Bf.font)
term_fontpush(p, TERMFONT_UNDER);
else if (FONT_Sy == n->data.Bf->font)
else if (FONT_Sy == n->norm->Bf.font)
term_fontpush(p, TERMFONT_BOLD);
else
term_fontpush(p, TERMFONT_NONE);
@ -2085,7 +2053,7 @@ termp_ap_pre(DECL_ARGS)
{
p->flags |= TERMP_NOSPACE;
term_word(p, "\\(aq");
term_word(p, "'");
p->flags |= TERMP_NOSPACE;
return(1);
}
@ -2096,10 +2064,26 @@ static void
termp____post(DECL_ARGS)
{
/*
* Handle lists of authors. In general, print each followed by
* a comma. Don't print the comma if there are only two
* authors.
*/
if (MDOC__A == n->tok && n->next && MDOC__A == n->next->tok)
if (NULL == n->next->next || MDOC__A != n->next->next->tok)
if (NULL == n->prev || MDOC__A != n->prev->tok)
return;
/* TODO: %U. */
p->flags |= TERMP_NOSPACE;
term_word(p, n->next ? "," : ".");
if (NULL == n->parent || MDOC_Rs != n->parent->tok)
return;
if (NULL == n->next) {
term_word(p, ".");
p->flags |= TERMP_SENTENCE;
} else
term_word(p, ",");
}
@ -2117,23 +2101,24 @@ termp_li_pre(DECL_ARGS)
static int
termp_lk_pre(DECL_ARGS)
{
const struct mdoc_node *nn;
const struct mdoc_node *nn, *sv;
term_fontpush(p, TERMFONT_UNDER);
nn = n->child;
if (NULL == nn->next)
nn = sv = n->child;
if (NULL == nn || NULL == nn->next)
return(1);
term_word(p, nn->string);
for (nn = nn->next; nn; nn = nn->next)
term_word(p, nn->string);
term_fontpop(p);
p->flags |= TERMP_NOSPACE;
term_word(p, ":");
term_fontpush(p, TERMFONT_BOLD);
for (nn = nn->next; nn; nn = nn->next)
term_word(p, nn->string);
term_word(p, sv->string);
term_fontpop(p);
return(0);
@ -2151,7 +2136,8 @@ termp_bk_pre(DECL_ARGS)
case (MDOC_HEAD):
return(0);
case (MDOC_BODY):
p->flags |= TERMP_PREKEEP;
if (n->parent->args || 0 == n->prev->nchild)
p->flags |= TERMP_PREKEEP;
break;
default:
abort();
@ -2171,6 +2157,39 @@ termp_bk_post(DECL_ARGS)
p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP);
}
/* ARGSUSED */
static void
termp__t_post(DECL_ARGS)
{
/*
* If we're in an `Rs' and there's a journal present, then quote
* us instead of underlining us (for disambiguation).
*/
if (n->parent && MDOC_Rs == n->parent->tok &&
n->parent->norm->Rs.child_J)
termp_quote_post(p, pair, m, n);
termp____post(p, pair, m, n);
}
/* ARGSUSED */
static int
termp__t_pre(DECL_ARGS)
{
/*
* If we're in an `Rs' and there's a journal present, then quote
* us instead of underlining us (for disambiguation).
*/
if (n->parent && MDOC_Rs == n->parent->tok &&
n->parent->norm->Rs.child_J)
return(termp_quote_pre(p, pair, m, n));
term_fontpush(p, TERMFONT_UNDER);
return(1);
}
/* ARGSUSED */
static int
termp_under_pre(DECL_ARGS)

View File

@ -1,77 +0,0 @@
div.body { color: #333333;
max-width: 800px;
padding-left: 10px;
font-size: smaller;
font-family: Verdana, Tahoma, Arial, sans-serif; }
div.sec-head { color: #000000;
font-weight: bold; }
div.sec-body { }
div.sec-block { padding-bottom: 1em; }
div.ssec-head { color: #000000;
font-weight: bold; }
div.ssec-body { }
div.ssec-block { }
span.addr { } /* Address (Ad). */
span.arg { font-style: italic; } /* Command argument (Ar). */
span.author { } /* Author name (An). */
span.cmd { font-weight: bold; } /* Command (Cm). */
span.config { font-weight: bold; } /* Config statement (Cd). */
span.define { } /* Defines (Dv). */
span.desc { } /* Nd. After em-dash. */
span.diag { font-weight: bold; } /* Diagnostic (Bl -diag). */
span.emph { font-style: italic; } /* Emphasis (Em). */
span.env { } /* Environment variables (Ev). */
span.errno { } /* Error string (Er). */
span.farg { font-style: italic; } /* Function argument (Fa, Fn). */
span.file { font-style: italic; } /* File (Pa). */
span.flag { font-weight: bold; } /* Flag (Fl, Cm). */
span.fname { font-weight: bold; } /* Function name (Fa, Fn, Rv). */
span.ftype { font-style: italic; } /* Function types (Ft, Fn). */
span.includes { font-weight: bold; } /* Header includes (In). */
span.lib { } /* Library (Lb). */
span.lit { font-family: monospace; } /* Literals (Bf -literal). */
span.macro { font-weight: bold; } /* Macro-ish thing (Fd). */
span.name { color: #003333; font-weight: bold; } /* Name of utility (Nm). */
span.opt { } /* Options (Op, Oo/Oc). */
span.ref { } /* Citations (Rs). */
span.ref-auth { } /* Reference author (%A). */
span.ref-book { font-style: italic; } /* Reference book (%B). */
span.ref-city { } /* Reference city (%C). */
span.ref-date { } /* Reference date (%D). */
span.ref-issue { font-style: italic; } /* Reference issuer/publisher (%I). */
span.ref-jrnl { font-style: italic; } /* Reference journal (%J). */
span.ref-num { } /* Reference number (%N). */
span.ref-opt { } /* Reference optionals (%O). */
span.ref-page { } /* Reference page (%P). */
span.ref-corp { } /* Reference corporate/foreign author (%Q). */
span.ref-rep { } /* Reference report (%R). */
span.ref-title { } /* Reference title (%T). */
span.ref-vol { } /* Reference volume (%V). */
span.symb { font-weight: bold; } /* Symbols. */
span.type { font-style: italic; } /* Variable types (Vt). */
span.unix { } /* Unices (Ux, Ox, Nx, Fx, Bx, Bsx, Dx). */
span.utility { font-weight: bold; } /* Name of utility (Ex). */
span.var { font-weight: bold; } /* Variables (Rv). */
a.link-ext { background: transparent url(external.png) center right no-repeat; padding-right: 12px; }/* Off-site link (Lk). */
a.link-includes { } /* Include-file link (In). */
a.link-mail { background: transparent url(external.png) center right no-repeat; padding-right: 12px; }/* Mailto links (Mt). */
a.link-man { } /* Manual links (Xr). */
a.link-sec { text-decoration: none; border-bottom: 1px dotted #339999; } /* Section links (Sx). */
div.emph { font-style: italic; } /* Emphasis (Bl -emphasis). */
div.lit { margin: 3px;
padding: 3px;
background-color: #EEEEEE;
border: 1px solid #339999;
color: #000000;
font-family: monospace; }
div.symb { font-weight: bold; } /* Symbols (Bl -symbolic). */
table.header { border-bottom: 1px dotted #dddddd;
color: #999999; }
table.footer { border-top: 1px dotted #dddddd;
color: #999999; }