version 1.341, 2020/10/16 17:22:43 |
version 1.353, 2025/01/25 00:22:28 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2014-2020 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2014-2022, 2025 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> |
|
* Copyright (c) 2022 Anna Vyalkova <cyber@sysrq.in> |
* |
* |
* 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 |
Line 292 html_mdoc(void *arg, const struct roff_meta *mdoc) |
|
Line 293 html_mdoc(void *arg, const struct roff_meta *mdoc) |
|
if ((h->oflags & HTML_FRAGMENT) == 0) { |
if ((h->oflags & HTML_FRAGMENT) == 0) { |
print_gen_decls(h); |
print_gen_decls(h); |
print_otag(h, TAG_HTML, ""); |
print_otag(h, TAG_HTML, ""); |
if (n != NULL && n->type == ROFFT_COMMENT) |
|
print_gen_comment(h, n); |
|
t = print_otag(h, TAG_HEAD, ""); |
t = print_otag(h, TAG_HEAD, ""); |
print_mdoc_head(mdoc, h); |
print_mdoc_head(mdoc, h); |
print_tagq(h, t); |
print_tagq(h, t); |
|
if (n != NULL && n->type == ROFFT_COMMENT) |
|
print_gen_comment(h, n); |
print_otag(h, TAG_BODY, ""); |
print_otag(h, TAG_BODY, ""); |
} |
} |
|
|
mdoc_root_pre(mdoc, h); |
mdoc_root_pre(mdoc, h); |
t = print_otag(h, TAG_DIV, "c", "manual-text"); |
t = print_otag(h, TAG_MAIN, "c", "manual-text"); |
print_mdoc_nodelist(mdoc, n, h); |
print_mdoc_nodelist(mdoc, n, h); |
print_tagq(h, t); |
print_tagq(h, t); |
mdoc_root_post(mdoc, h); |
mdoc_root_post(mdoc, h); |
Line 452 print_mdoc_node(MDOC_ARGS) |
|
Line 453 print_mdoc_node(MDOC_ARGS) |
|
static void |
static void |
mdoc_root_post(const struct roff_meta *meta, struct html *h) |
mdoc_root_post(const struct roff_meta *meta, struct html *h) |
{ |
{ |
struct tag *t, *tt; |
struct tag *t; |
|
|
t = print_otag(h, TAG_TABLE, "c", "foot"); |
t = print_otag(h, TAG_DIV, "cr?", "foot", "doc-pagefooter", |
tt = print_otag(h, TAG_TR, ""); |
"aria-label", "Manual footer line"); |
|
|
print_otag(h, TAG_TD, "c", "foot-date"); |
print_otag(h, TAG_SPAN, "c", "foot-left"); |
|
print_stagq(h, t); |
|
|
|
print_otag(h, TAG_SPAN, "c", "foot-date"); |
print_text(h, meta->date); |
print_text(h, meta->date); |
print_stagq(h, tt); |
print_stagq(h, t); |
|
|
print_otag(h, TAG_TD, "c", "foot-os"); |
print_otag(h, TAG_SPAN, "c", "foot-os"); |
print_text(h, meta->os); |
print_text(h, meta->os); |
print_tagq(h, t); |
print_tagq(h, t); |
} |
} |
Line 469 mdoc_root_post(const struct roff_meta *meta, struct ht |
|
Line 473 mdoc_root_post(const struct roff_meta *meta, struct ht |
|
static int |
static int |
mdoc_root_pre(const struct roff_meta *meta, struct html *h) |
mdoc_root_pre(const struct roff_meta *meta, struct html *h) |
{ |
{ |
struct tag *t, *tt; |
struct tag *t; |
char *volume, *title; |
char *volume, *title; |
|
|
if (NULL == meta->arch) |
if (NULL == meta->arch) |
Line 484 mdoc_root_pre(const struct roff_meta *meta, struct htm |
|
Line 488 mdoc_root_pre(const struct roff_meta *meta, struct htm |
|
mandoc_asprintf(&title, "%s(%s)", |
mandoc_asprintf(&title, "%s(%s)", |
meta->title, meta->msec); |
meta->title, meta->msec); |
|
|
t = print_otag(h, TAG_TABLE, "c", "head"); |
t = print_otag(h, TAG_DIV, "cr?", "head", "doc-pageheader", |
tt = print_otag(h, TAG_TR, ""); |
"aria-label", "Manual header line"); |
|
|
print_otag(h, TAG_TD, "c", "head-ltitle"); |
print_otag(h, TAG_SPAN, "c", "head-ltitle"); |
print_text(h, title); |
print_text(h, title); |
print_stagq(h, tt); |
print_stagq(h, t); |
|
|
print_otag(h, TAG_TD, "c", "head-vol"); |
print_otag(h, TAG_SPAN, "c", "head-vol"); |
print_text(h, volume); |
print_text(h, volume); |
print_stagq(h, tt); |
print_stagq(h, t); |
|
|
print_otag(h, TAG_TD, "c", "head-rtitle"); |
print_otag(h, TAG_SPAN, "c", "head-rtitle"); |
print_text(h, title); |
print_text(h, title); |
print_tagq(h, t); |
print_tagq(h, t); |
|
|
|
|
mdoc_sh_pre(MDOC_ARGS) |
mdoc_sh_pre(MDOC_ARGS) |
{ |
{ |
struct roff_node *sn, *subn; |
struct roff_node *sn, *subn; |
struct tag *t, *tsec, *tsub; |
struct tag *t, *tnav, *tsec, *tsub; |
char *id; |
char *id; |
int sc; |
int sc; |
|
|
Line 536 mdoc_sh_pre(MDOC_ARGS) |
|
Line 540 mdoc_sh_pre(MDOC_ARGS) |
|
break; |
break; |
if (sc < 2) |
if (sc < 2) |
break; |
break; |
t = print_otag(h, TAG_H1, "c", "Sh"); |
tnav = print_otag(h, TAG_NAV, "r", "doc-toc"); |
|
t = print_otag(h, TAG_H2, "c", "Sh"); |
print_text(h, "TABLE OF CONTENTS"); |
print_text(h, "TABLE OF CONTENTS"); |
print_tagq(h, t); |
print_tagq(h, t); |
t = print_otag(h, TAG_UL, "c", "Bl-compact"); |
t = print_otag(h, TAG_UL, "c", "Bl-compact"); |
Line 567 mdoc_sh_pre(MDOC_ARGS) |
|
Line 572 mdoc_sh_pre(MDOC_ARGS) |
|
} |
} |
print_tagq(h, tsec); |
print_tagq(h, tsec); |
} |
} |
print_tagq(h, t); |
print_tagq(h, tnav); |
print_otag(h, TAG_SECTION, "c", "Sh"); |
print_otag(h, TAG_SECTION, "c", "Sh"); |
break; |
break; |
case ROFFT_HEAD: |
case ROFFT_HEAD: |
print_otag_id(h, TAG_H1, "Sh", n); |
print_otag_id(h, TAG_H2, "Sh", n); |
break; |
break; |
case ROFFT_BODY: |
case ROFFT_BODY: |
if (n->sec == SEC_AUTHORS) |
if (n->sec == SEC_AUTHORS) |
Line 592 mdoc_ss_pre(MDOC_ARGS) |
|
Line 597 mdoc_ss_pre(MDOC_ARGS) |
|
print_otag(h, TAG_SECTION, "c", "Ss"); |
print_otag(h, TAG_SECTION, "c", "Ss"); |
break; |
break; |
case ROFFT_HEAD: |
case ROFFT_HEAD: |
print_otag_id(h, TAG_H2, "Ss", n); |
print_otag_id(h, TAG_H3, "Ss", n); |
break; |
break; |
case ROFFT_BODY: |
case ROFFT_BODY: |
break; |
break; |
Line 632 mdoc_nd_pre(MDOC_ARGS) |
|
Line 637 mdoc_nd_pre(MDOC_ARGS) |
|
abort(); |
abort(); |
} |
} |
print_text(h, "\\(em"); |
print_text(h, "\\(em"); |
print_otag(h, TAG_SPAN, "c", "Nd"); |
print_otag(h, TAG_SPAN, "cr", "Nd", "doc-subtitle"); |
return 1; |
return 1; |
} |
} |
|
|
Line 664 mdoc_nm_pre(MDOC_ARGS) |
|
Line 669 mdoc_nm_pre(MDOC_ARGS) |
|
static int |
static int |
mdoc_xr_pre(MDOC_ARGS) |
mdoc_xr_pre(MDOC_ARGS) |
{ |
{ |
if (NULL == n->child) |
char *name, *section, *label; |
|
|
|
if (n->child == NULL) |
return 0; |
return 0; |
|
|
|
name = n->child->string; |
|
if (n->child->next != NULL) { |
|
section = n->child->next->string; |
|
mandoc_asprintf(&label, "%s, section %s", name, section); |
|
} else |
|
section = label = NULL; |
|
|
if (h->base_man1) |
if (h->base_man1) |
print_otag(h, TAG_A, "chM", "Xr", |
print_otag(h, TAG_A, "chM?", "Xr", |
n->child->string, n->child->next == NULL ? |
name, section, "aria-label", label); |
NULL : n->child->next->string); |
|
else |
else |
print_otag(h, TAG_A, "c", "Xr"); |
print_otag(h, TAG_A, "c?", "Xr", "aria-label", label); |
|
|
n = n->child; |
free(label); |
print_text(h, n->string); |
print_text(h, name); |
|
|
if (NULL == (n = n->next)) |
if (section == NULL) |
return 0; |
return 0; |
|
|
h->flags |= HTML_NOSPACE; |
h->flags |= HTML_NOSPACE; |
print_text(h, "("); |
print_text(h, "("); |
h->flags |= HTML_NOSPACE; |
h->flags |= HTML_NOSPACE; |
print_text(h, n->string); |
print_text(h, section); |
h->flags |= HTML_NOSPACE; |
h->flags |= HTML_NOSPACE; |
print_text(h, ")"); |
print_text(h, ")"); |
return 0; |
return 0; |
Line 930 mdoc_sx_pre(MDOC_ARGS) |
|
Line 943 mdoc_sx_pre(MDOC_ARGS) |
|
static int |
static int |
mdoc_bd_pre(MDOC_ARGS) |
mdoc_bd_pre(MDOC_ARGS) |
{ |
{ |
char buf[16]; |
char buf[20]; |
struct roff_node *nn; |
struct roff_node *nn; |
int comp; |
int comp; |
|
|
Line 967 mdoc_bd_pre(MDOC_ARGS) |
|
Line 980 mdoc_bd_pre(MDOC_ARGS) |
|
strcmp(n->norm->Bd.offs, "left") != 0) |
strcmp(n->norm->Bd.offs, "left") != 0) |
(void)strlcat(buf, " Bd-indent", sizeof(buf)); |
(void)strlcat(buf, " Bd-indent", sizeof(buf)); |
|
|
|
if (n->norm->Bd.type == DISP_literal) |
|
(void)strlcat(buf, " Li", sizeof(buf)); |
|
|
print_otag_id(h, TAG_DIV, buf, n); |
print_otag_id(h, TAG_DIV, buf, n); |
return 1; |
return 1; |
} |
} |
Line 1440 mdoc_rs_pre(MDOC_ARGS) |
|
Line 1456 mdoc_rs_pre(MDOC_ARGS) |
|
case ROFFT_BODY: |
case ROFFT_BODY: |
if (n->sec == SEC_SEE_ALSO) |
if (n->sec == SEC_SEE_ALSO) |
print_otag(h, TAG_P, "c", "Pp"); |
print_otag(h, TAG_P, "c", "Pp"); |
print_otag(h, TAG_CITE, "c", "Rs"); |
print_otag(h, TAG_SPAN, "c", "Rs"); |
break; |
break; |
default: |
default: |
abort(); |
abort(); |
|
|
mdoc__x_pre(MDOC_ARGS) |
mdoc__x_pre(MDOC_ARGS) |
{ |
{ |
struct roff_node *nn; |
struct roff_node *nn; |
const char *cattr; |
const unsigned char *cp; |
|
const char *cattr, *arg; |
|
char *url; |
enum htmltag t; |
enum htmltag t; |
|
|
t = TAG_SPAN; |
t = TAG_SPAN; |
|
arg = n->child->string; |
|
|
switch (n->tok) { |
switch (n->tok) { |
case MDOC__A: |
case MDOC__A: |
Line 1491 mdoc__x_pre(MDOC_ARGS) |
|
Line 1510 mdoc__x_pre(MDOC_ARGS) |
|
print_text(h, "and"); |
print_text(h, "and"); |
break; |
break; |
case MDOC__B: |
case MDOC__B: |
t = TAG_I; |
t = TAG_CITE; |
cattr = "RsB"; |
cattr = "RsB"; |
break; |
break; |
case MDOC__C: |
case MDOC__C: |
Line 1521 mdoc__x_pre(MDOC_ARGS) |
|
Line 1540 mdoc__x_pre(MDOC_ARGS) |
|
cattr = "RsQ"; |
cattr = "RsQ"; |
break; |
break; |
case MDOC__R: |
case MDOC__R: |
|
if (strncmp(arg, "RFC ", 4) == 0) { |
|
cp = arg += 4; |
|
while (isdigit(*cp)) |
|
cp++; |
|
if (*cp == '\0') { |
|
mandoc_asprintf(&url, "https://www.rfc-" |
|
"editor.org/rfc/rfc%s.html", arg); |
|
print_otag(h, TAG_A, "ch", "RsR", url); |
|
free(url); |
|
return 1; |
|
} |
|
} |
cattr = "RsR"; |
cattr = "RsR"; |
break; |
break; |
case MDOC__T: |
case MDOC__T: |
cattr = "RsT"; |
t = TAG_CITE; |
|
if (n->parent != NULL && n->parent->tok == MDOC_Rs && |
|
n->parent->norm->Rs.quote_T) { |
|
print_text(h, "\\(lq"); |
|
h->flags |= HTML_NOSPACE; |
|
cattr = "RsT"; |
|
} else |
|
cattr = "RsB"; |
break; |
break; |
case MDOC__U: |
case MDOC__U: |
print_otag(h, TAG_A, "ch", "RsU", n->child->string); |
print_otag(h, TAG_A, "ch", "RsU", arg); |
return 1; |
return 1; |
case MDOC__V: |
case MDOC__V: |
cattr = "RsV"; |
cattr = "RsV"; |
Line 1545 mdoc__x_post(MDOC_ARGS) |
|
Line 1583 mdoc__x_post(MDOC_ARGS) |
|
{ |
{ |
struct roff_node *nn; |
struct roff_node *nn; |
|
|
if (n->tok == MDOC__A && |
switch (n->tok) { |
(nn = roff_node_next(n)) != NULL && nn->tok == MDOC__A && |
case MDOC__A: |
((nn = roff_node_next(nn)) == NULL || nn->tok != MDOC__A) && |
if ((nn = roff_node_next(n)) != NULL && nn->tok == MDOC__A && |
((nn = roff_node_prev(n)) == NULL || nn->tok != MDOC__A)) |
((nn = roff_node_next(nn)) == NULL || nn->tok != MDOC__A) && |
return; |
((nn = roff_node_prev(n)) == NULL || nn->tok != MDOC__A)) |
|
return; |
/* TODO: %U */ |
break; |
|
case MDOC__T: |
|
if (n->parent != NULL && n->parent->tok == MDOC_Rs && |
|
n->parent->norm->Rs.quote_T) { |
|
h->flags |= HTML_NOSPACE; |
|
print_text(h, "\\(rq"); |
|
} |
|
break; |
|
default: |
|
break; |
|
} |
if (n->parent == NULL || n->parent->tok != MDOC_Rs) |
if (n->parent == NULL || n->parent->tok != MDOC_Rs) |
return; |
return; |
|
|