-/* $Id: mdoc_html.c,v 1.324 2019/01/10 07:40:10 schwarze Exp $ */
+/* $Id: mdoc_html.c,v 1.328 2019/03/01 10:57:18 schwarze Exp $ */
/*
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2014,2015,2016,2017,2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2014-2019 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
if ((h->oflags & HTML_FRAGMENT) == 0) {
print_gen_decls(h);
print_otag(h, TAG_HTML, "");
- if (n->type == ROFFT_COMMENT)
+ if (n != NULL && n->type == ROFFT_COMMENT)
print_gen_comment(h, n);
t = print_otag(h, TAG_HEAD, "");
print_mdoc_head(mdoc, h);
html_fillmode(h, n->flags & NODE_NOFILL ? ROFF_nf : ROFF_fi);
child = 1;
- t = h->tag;
- if (t->tag == TAG_P || t->tag == TAG_PRE)
- t = t->next;
-
n->flags &= ~NODE_ENDED;
switch (n->type) {
case ROFFT_TEXT:
+ t = h->tag;
+ t->refcnt++;
+
/* No tables in this mode... */
assert(NULL == h->tblt);
h->flags |= HTML_NOSPACE;
break;
case ROFFT_EQN:
+ t = h->tag;
+ t->refcnt++;
print_eqn(h, n->eqn);
break;
case ROFFT_TBL:
* the "meta" table state. This will be reopened on the
* next table element.
*/
- if (h->tblt != NULL) {
+ if (h->tblt != NULL)
print_tblclose(h);
- t = h->tag;
- }
assert(h->tblt == NULL);
+ t = h->tag;
+ t->refcnt++;
if (n->tok < ROFF_MAX) {
roff_html_pre(h, n);
+ t->refcnt--;
print_stagq(h, t);
return;
}
if (child && n->child != NULL)
print_mdoc_nodelist(meta, n->child, h);
+ t->refcnt--;
print_stagq(h, t);
switch (n->type) {
html_close_paragraph(h);
if ((h->oflags & HTML_TOC) == 0 ||
h->flags & HTML_TOCDONE ||
- n->sec <= SEC_SYNOPSIS)
+ n->sec <= SEC_SYNOPSIS) {
+ print_otag(h, TAG_SECTION, "c", "Sh");
break;
+ }
h->flags |= HTML_TOCDONE;
sc = 0;
for (sn = n->next; sn != NULL; sn = sn->next)
print_tagq(h, tsec);
}
print_tagq(h, t);
+ print_otag(h, TAG_SECTION, "c", "Sh");
break;
case ROFFT_HEAD:
id = html_make_id(n, 1);
- print_otag(h, TAG_H1, "cTi", "Sh", id);
+ print_otag(h, TAG_H1, "ci", "Sh", id);
if (id != NULL)
print_otag(h, TAG_A, "chR", "permalink", id);
break;
switch (n->type) {
case ROFFT_BLOCK:
html_close_paragraph(h);
+ print_otag(h, TAG_SECTION, "c", "Ss");
return 1;
case ROFFT_HEAD:
break;
}
id = html_make_id(n, 1);
- print_otag(h, TAG_H2, "cTi", "Ss", id);
+ print_otag(h, TAG_H2, "ci", "Ss", id);
if (id != NULL)
print_otag(h, TAG_A, "chR", "permalink", id);
return 1;
if ((id = cond_id(n)) != NULL)
print_otag(h, TAG_A, "chR", "permalink", id);
- print_otag(h, TAG_CODE, "cTi", "Fl", id);
+ print_otag(h, TAG_CODE, "ci", "Fl", id);
print_text(h, "\\-");
if (!(n->child == NULL &&
if ((id = cond_id(n)) != NULL)
print_otag(h, TAG_A, "chR", "permalink", id);
- print_otag(h, TAG_CODE, "cTi", "Cm", id);
+ print_otag(h, TAG_CODE, "ci", "Cm", id);
return 1;
}
}
print_text(h, "\\(em");
/* Cannot use TAG_SPAN because it may contain blocks. */
- print_otag(h, TAG_DIV, "cT", "Nd");
+ print_otag(h, TAG_DIV, "c", "Nd");
return 1;
}
print_otag(h, TAG_TD, "");
/* FALLTHROUGH */
case ROFFT_ELEM:
- print_otag(h, TAG_CODE, "cT", "Nm");
+ print_otag(h, TAG_CODE, "c", "Nm");
return 1;
case ROFFT_BODY:
print_otag(h, TAG_TD, "");
return 0;
if (h->base_man1)
- print_otag(h, TAG_A, "cThM", "Xr",
+ print_otag(h, TAG_A, "chM", "Xr",
n->child->string, n->child->next == NULL ?
NULL : n->child->next->string);
else
- print_otag(h, TAG_A, "cT", "Xr");
+ print_otag(h, TAG_A, "c", "Xr");
n = n->child;
print_text(h, n->string);
static int
mdoc_ar_pre(MDOC_ARGS)
{
- print_otag(h, TAG_VAR, "cT", "Ar");
+ print_otag(h, TAG_VAR, "c", "Ar");
return 1;
}
static int
mdoc_st_pre(MDOC_ARGS)
{
- print_otag(h, TAG_SPAN, "cT", "St");
+ print_otag(h, TAG_SPAN, "c", "St");
return 1;
}
static int
mdoc_em_pre(MDOC_ARGS)
{
- print_otag(h, TAG_I, "cT", "Em");
+ print_otag(h, TAG_I, "c", "Em");
return 1;
}
char *id;
id = html_make_id(n, 0);
- print_otag(h, TAG_A, "cThR", "Sx", id);
+ print_otag(h, TAG_A, "chR", "Sx", id);
free(id);
return 1;
}
static int
mdoc_pa_pre(MDOC_ARGS)
{
- print_otag(h, TAG_SPAN, "cT", "Pa");
+ print_otag(h, TAG_SPAN, "c", "Pa");
return 1;
}
if (n->sec == SEC_AUTHORS && ! (h->flags & HTML_NOSPLIT))
h->flags |= HTML_SPLIT;
- print_otag(h, TAG_SPAN, "cT", "An");
+ print_otag(h, TAG_SPAN, "c", "An");
return 1;
}
mdoc_cd_pre(MDOC_ARGS)
{
synopsis_pre(h, n);
- print_otag(h, TAG_CODE, "cT", "Cd");
+ print_otag(h, TAG_CODE, "c", "Cd");
return 1;
}
if ((id = cond_id(n)) != NULL)
print_otag(h, TAG_A, "chR", "permalink", id);
- print_otag(h, TAG_CODE, "cTi", "Dv", id);
+ print_otag(h, TAG_CODE, "ci", "Dv", id);
return 1;
}
if ((id = cond_id(n)) != NULL)
print_otag(h, TAG_A, "chR", "permalink", id);
- print_otag(h, TAG_CODE, "cTi", "Ev", id);
+ print_otag(h, TAG_CODE, "ci", "Ev", id);
return 1;
}
if (id != NULL)
print_otag(h, TAG_A, "chR", "permalink", id);
- print_otag(h, TAG_CODE, "cTi", "Er", id);
+ print_otag(h, TAG_CODE, "ci", "Er", id);
return 1;
}
struct tag *t;
if (n->parent->tok != MDOC_Fo) {
- print_otag(h, TAG_VAR, "cT", "Fa");
+ print_otag(h, TAG_VAR, "c", "Fa");
return 1;
}
for (nn = n->child; nn; nn = nn->next) {
- t = print_otag(h, TAG_VAR, "cT", "Fa");
+ t = print_otag(h, TAG_VAR, "c", "Fa");
print_text(h, nn->string);
print_tagq(h, t);
if (nn->next) {
assert(n->type == ROFFT_TEXT);
if (strcmp(n->string, "#include")) {
- print_otag(h, TAG_CODE, "cT", "Fd");
+ print_otag(h, TAG_CODE, "c", "Fd");
return 1;
}
- print_otag(h, TAG_CODE, "cT", "In");
+ print_otag(h, TAG_CODE, "c", "In");
print_text(h, n->string);
if (NULL != (n = n->next)) {
cp = strchr(buf, '\0') - 1;
if (cp >= buf && (*cp == '>' || *cp == '"'))
*cp = '\0';
- t = print_otag(h, TAG_A, "cThI", "In", buf);
+ t = print_otag(h, TAG_A, "chI", "In", buf);
free(buf);
} else
- t = print_otag(h, TAG_A, "cT", "In");
+ t = print_otag(h, TAG_A, "c", "In");
print_text(h, n->string);
print_tagq(h, t);
} else if (n->type == ROFFT_HEAD)
return 0;
- print_otag(h, TAG_VAR, "cT", "Vt");
+ print_otag(h, TAG_VAR, "c", "Vt");
return 1;
}
mdoc_ft_pre(MDOC_ARGS)
{
synopsis_pre(h, n);
- print_otag(h, TAG_VAR, "cT", "Ft");
+ print_otag(h, TAG_VAR, "c", "Ft");
return 1;
}
ep = strchr(sp, ' ');
if (NULL != ep) {
- t = print_otag(h, TAG_VAR, "cT", "Ft");
+ t = print_otag(h, TAG_VAR, "c", "Ft");
while (ep) {
sz = MIN((int)(ep - sp), BUFSIZ - 1);
print_tagq(h, t);
}
- t = print_otag(h, TAG_CODE, "cT", "Fn");
+ t = print_otag(h, TAG_CODE, "c", "Fn");
if (sp)
print_text(h, sp);
for (n = n->child->next; n; n = n->next) {
if (NODE_SYNPRETTY & n->flags)
- t = print_otag(h, TAG_VAR, "cTs", "Fa",
+ t = print_otag(h, TAG_VAR, "cs", "Fa",
"white-space", "nowrap");
else
- t = print_otag(h, TAG_VAR, "cT", "Fa");
+ t = print_otag(h, TAG_VAR, "c", "Fa");
print_text(h, n->string);
print_tagq(h, t);
if (n->next) {
descr = link->next;
if (descr == punct)
descr = link; /* no text */
- t = print_otag(h, TAG_A, "cTh", "Lk", link->string);
+ t = print_otag(h, TAG_A, "ch", "Lk", link->string);
do {
if (descr->flags & (NODE_DELIMC | NODE_DELIMO))
h->flags |= HTML_NOSPACE;
assert(n->type == ROFFT_TEXT);
mandoc_asprintf(&cp, "mailto:%s", n->string);
- t = print_otag(h, TAG_A, "cTh", "Mt", cp);
+ t = print_otag(h, TAG_A, "ch", "Mt", cp);
print_text(h, n->string);
print_tagq(h, t);
free(cp);
return 0;
assert(n->child->string);
- t = print_otag(h, TAG_CODE, "cT", "Fn");
+ t = print_otag(h, TAG_CODE, "c", "Fn");
print_text(h, n->child->string);
print_tagq(h, t);
return 0;
struct tag *t;
synopsis_pre(h, n);
- print_otag(h, TAG_CODE, "cT", "In");
+ print_otag(h, TAG_CODE, "c", "In");
/*
* The first argument of the `In' gets special treatment as
assert(n->type == ROFFT_TEXT);
if (h->base_includes)
- t = print_otag(h, TAG_A, "cThI", "In", n->string);
+ t = print_otag(h, TAG_A, "chI", "In", n->string);
else
- t = print_otag(h, TAG_A, "cT", "In");
+ t = print_otag(h, TAG_A, "c", "In");
print_text(h, n->string);
print_tagq(h, t);
if ((id = cond_id(n)) != NULL)
print_otag(h, TAG_A, "chR", "permalink", id);
- print_otag(h, TAG_CODE, "cTi", "Ic", id);
+ print_otag(h, TAG_CODE, "ci", "Ic", id);
return 1;
}
static int
mdoc_va_pre(MDOC_ARGS)
{
- print_otag(h, TAG_VAR, "cT", "Va");
+ print_otag(h, TAG_VAR, "c", "Va");
return 1;
}
if ((id = cond_id(n)) != NULL)
print_otag(h, TAG_A, "chR", "permalink", id);
- print_otag(h, TAG_SPAN, "cTi", "Ms", id);
+ print_otag(h, TAG_SPAN, "ci", "Ms", id);
return 1;
}
case ROFFT_BODY:
if (n->sec == SEC_SEE_ALSO)
print_otag(h, TAG_P, "c", "Pp");
- print_otag(h, TAG_CITE, "cT", "Rs");
+ print_otag(h, TAG_CITE, "c", "Rs");
break;
default:
abort();
static int
mdoc_sy_pre(MDOC_ARGS)
{
- print_otag(h, TAG_B, "cT", "Sy");
+ print_otag(h, TAG_B, "c", "Sy");
return 1;
}
if (SEC_LIBRARY == n->sec && NODE_LINE & n->flags && n->prev)
print_otag(h, TAG_BR, "");
- print_otag(h, TAG_SPAN, "cT", "Lb");
+ print_otag(h, TAG_SPAN, "c", "Lb");
return 1;
}