version 1.16, 2009/10/03 15:08:09 |
version 1.21, 2009/10/04 09:00:40 |
|
|
#include <assert.h> |
#include <assert.h> |
#include <ctype.h> |
#include <ctype.h> |
#include <err.h> |
#include <err.h> |
#include <stdarg.h> |
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
|
#define MDOC_ARGS const struct mdoc_meta *m, \ |
#define MDOC_ARGS const struct mdoc_meta *m, \ |
const struct mdoc_node *n, \ |
const struct mdoc_node *n, \ |
struct html *h |
struct html *h |
#define MAN_ARGS const struct man_meta *m, \ |
|
const struct man_node *n, \ |
|
struct html *h |
|
|
|
struct htmlmdoc { |
struct htmlmdoc { |
int (*pre)(MDOC_ARGS); |
int (*pre)(MDOC_ARGS); |
Line 54 static int a2width(const char *); |
|
Line 50 static int a2width(const char *); |
|
static int a2offs(const char *); |
static int a2offs(const char *); |
static int a2list(const struct mdoc_node *); |
static int a2list(const struct mdoc_node *); |
|
|
static void buffmt_man(struct html *, |
|
const char *, const char *); |
|
static void buffmt(struct html *, const char *, ...); |
|
static void bufcat(struct html *, const char *); |
|
static void bufncat(struct html *, const char *, size_t); |
|
|
|
|
|
static void mdoc_root_post(MDOC_ARGS); |
static void mdoc_root_post(MDOC_ARGS); |
static int mdoc_root_pre(MDOC_ARGS); |
static int mdoc_root_pre(MDOC_ARGS); |
static int mdoc_tbl_pre(MDOC_ARGS, int); |
static int mdoc_tbl_pre(MDOC_ARGS, int); |
Line 281 html_mdoc(void *arg, const struct mdoc *m) |
|
Line 270 html_mdoc(void *arg, const struct mdoc *m) |
|
} |
} |
|
|
|
|
static void |
|
bufinit(struct html *h) |
|
{ |
|
|
|
h->buf[0] = '\0'; |
|
h->buflen = 0; |
|
} |
|
|
|
|
|
static void |
|
bufcat(struct html *h, const char *p) |
|
{ |
|
|
|
bufncat(h, p, strlen(p)); |
|
} |
|
|
|
|
|
static void |
|
buffmt(struct html *h, const char *fmt, ...) |
|
{ |
|
va_list ap; |
|
|
|
va_start(ap, fmt); |
|
(void)vsnprintf(h->buf + h->buflen, |
|
BUFSIZ - h->buflen - 1, fmt, ap); |
|
va_end(ap); |
|
h->buflen = strlen(h->buf); |
|
assert('\0' == h->buf[h->buflen]); |
|
} |
|
|
|
|
|
static void |
|
bufncat(struct html *h, const char *p, size_t sz) |
|
{ |
|
|
|
if (h->buflen + sz > BUFSIZ - 1) |
|
sz = BUFSIZ - 1 - h->buflen; |
|
|
|
(void)strncat(h->buf, p, sz); |
|
h->buflen += sz; |
|
assert('\0' == h->buf[h->buflen]); |
|
} |
|
|
|
|
|
static void |
|
buffmt_man(struct html *h, |
|
const char *name, const char *sec) |
|
{ |
|
const char *p, *pp; |
|
|
|
pp = h->base_man; |
|
|
|
/* FIXME: URL-encode contents. */ |
|
|
|
while ((p = strchr(pp, '%'))) { |
|
bufncat(h, pp, p - pp); |
|
switch (*(p + 1)) { |
|
case('S'): |
|
bufcat(h, sec); |
|
break; |
|
case('N'): |
|
buffmt(h, name ? name : "1"); |
|
break; |
|
default: |
|
bufncat(h, p, 2); |
|
break; |
|
} |
|
pp = p + 2; |
|
} |
|
if (pp) |
|
bufcat(h, pp); |
|
} |
|
|
|
|
|
static int |
static int |
a2list(const struct mdoc_node *n) |
a2list(const struct mdoc_node *n) |
{ |
{ |
Line 467 print_mdoc(MDOC_ARGS) |
|
Line 382 print_mdoc(MDOC_ARGS) |
|
static void |
static void |
print_mdoc_head(MDOC_ARGS) |
print_mdoc_head(MDOC_ARGS) |
{ |
{ |
char b[BUFSIZ]; |
|
|
|
print_gen_head(h); |
print_gen_head(h); |
|
bufinit(h); |
|
buffmt(h, "%s(%d)", m->title, m->msec); |
|
|
(void)snprintf(b, BUFSIZ - 1, |
|
"%s(%d)", m->title, m->msec); |
|
|
|
if (m->arch) { |
if (m->arch) { |
(void)strlcat(b, " (", BUFSIZ); |
bufcat(h, " ("); |
(void)strlcat(b, m->arch, BUFSIZ); |
bufcat(h, m->arch); |
(void)strlcat(b, ")", BUFSIZ); |
bufcat(h, ")"); |
} |
} |
|
|
print_otag(h, TAG_TITLE, 0, NULL); |
print_otag(h, TAG_TITLE, 0, NULL); |
print_text(h, b); |
print_text(h, h->buf); |
} |
} |
|
|
|
|
Line 629 mdoc_sh_pre(MDOC_ARGS) |
|
Line 542 mdoc_sh_pre(MDOC_ARGS) |
|
{ |
{ |
struct htmlpair tag[2]; |
struct htmlpair tag[2]; |
const struct mdoc_node *nn; |
const struct mdoc_node *nn; |
|
char link[BUFSIZ]; |
|
|
if (MDOC_HEAD == n->type) { |
if (MDOC_BODY == n->type) { |
|
buffmt(h, "margin-left: %dem;", INDENT); |
|
|
tag[0].key = ATTR_CLASS; |
tag[0].key = ATTR_CLASS; |
tag[0].val = "sec-head"; |
tag[0].val = "sec-body"; |
print_otag(h, TAG_DIV, 1, tag); |
tag[1].key = ATTR_STYLE; |
print_otag(h, TAG_SPAN, 1, tag); |
tag[1].val = h->buf; |
|
|
for (nn = n->child; nn; nn = nn->next) { |
print_otag(h, TAG_DIV, 2, tag); |
bufcat(h, nn->string); |
|
if (nn->next) |
|
bufncat(h, " ", 1); |
|
} |
|
tag[0].key = ATTR_NAME; |
|
tag[0].val = h->buf; |
|
print_otag(h, TAG_A, 1, tag); |
|
return(1); |
return(1); |
} else if (MDOC_BLOCK == n->type) { |
} else if (MDOC_BLOCK == n->type) { |
tag[0].key = ATTR_CLASS; |
tag[0].key = ATTR_CLASS; |
Line 660 mdoc_sh_pre(MDOC_ARGS) |
|
Line 569 mdoc_sh_pre(MDOC_ARGS) |
|
|
|
tag[1].key = ATTR_STYLE; |
tag[1].key = ATTR_STYLE; |
tag[1].val = h->buf; |
tag[1].val = h->buf; |
|
|
print_otag(h, TAG_DIV, 2, tag); |
print_otag(h, TAG_DIV, 2, tag); |
return(1); |
return(1); |
} |
} |
|
|
buffmt(h, "margin-left: %dem;", INDENT); |
link[0] = 0; |
|
for (nn = n->child; nn; nn = nn->next) { |
|
(void)strlcat(link, nn->string, BUFSIZ); |
|
if (nn->next) |
|
(void)strlcat(link, "_", BUFSIZ); |
|
} |
|
|
tag[0].key = ATTR_CLASS; |
tag[0].key = ATTR_CLASS; |
tag[0].val = "sec-body"; |
tag[0].val = "sec-head"; |
tag[1].key = ATTR_STYLE; |
tag[1].key = ATTR_ID; |
tag[1].val = h->buf; |
tag[1].val = link; |
|
|
print_otag(h, TAG_DIV, 2, tag); |
print_otag(h, TAG_DIV, 2, tag); |
return(1); |
return(1); |
Line 681 mdoc_sh_pre(MDOC_ARGS) |
|
Line 594 mdoc_sh_pre(MDOC_ARGS) |
|
static int |
static int |
mdoc_ss_pre(MDOC_ARGS) |
mdoc_ss_pre(MDOC_ARGS) |
{ |
{ |
struct htmlpair tag[2]; |
struct htmlpair tag[3]; |
int i; |
int i; |
const struct mdoc_node *nn; |
const struct mdoc_node *nn; |
|
char link[BUFSIZ]; |
|
|
i = 0; |
i = 0; |
|
|
if (MDOC_BODY == n->type) { |
if (MDOC_BODY == n->type) { |
tag[i].key = ATTR_CLASS; |
tag[i].key = ATTR_CLASS; |
tag[i++].val = "ssec-body"; |
tag[i++].val = "ssec-body"; |
|
|
if (n->parent->next && n->child) { |
if (n->parent->next && n->child) { |
bufcat(h, "margin-bottom: 1em;"); |
bufcat(h, "margin-bottom: 1em;"); |
tag[i].key = ATTR_STYLE; |
tag[i].key = ATTR_STYLE; |
tag[i++].val = h->buf; |
tag[i++].val = h->buf; |
} |
} |
|
|
print_otag(h, TAG_DIV, i, tag); |
print_otag(h, TAG_DIV, i, tag); |
return(1); |
return(1); |
} else if (MDOC_BLOCK == n->type) { |
} else if (MDOC_BLOCK == n->type) { |
tag[i].key = ATTR_CLASS; |
tag[i].key = ATTR_CLASS; |
tag[i++].val = "ssec-block"; |
tag[i++].val = "ssec-block"; |
|
|
if (n->prev) { |
if (n->prev) { |
bufcat(h, "margin-top: 1em;"); |
bufcat(h, "margin-top: 1em;"); |
tag[i].key = ATTR_STYLE; |
tag[i].key = ATTR_STYLE; |
tag[i++].val = h->buf; |
tag[i++].val = h->buf; |
} |
} |
|
|
print_otag(h, TAG_DIV, i, tag); |
print_otag(h, TAG_DIV, i, tag); |
return(1); |
return(1); |
} |
} |
|
|
|
link[0] = 0; |
|
for (nn = n->child; nn; nn = nn->next) { |
|
(void)strlcat(link, nn->string, BUFSIZ); |
|
if (nn->next) |
|
(void)strlcat(link, "_", BUFSIZ); |
|
} |
|
|
buffmt(h, "margin-left: -%dem;", INDENT - HALFINDENT); |
buffmt(h, "margin-left: -%dem;", INDENT - HALFINDENT); |
|
|
tag[0].key = ATTR_CLASS; |
tag[0].key = ATTR_CLASS; |
tag[0].val = "ssec-head"; |
tag[0].val = "ssec-head"; |
tag[1].key = ATTR_STYLE; |
tag[1].key = ATTR_STYLE; |
tag[1].val = h->buf; |
tag[1].val = h->buf; |
|
tag[2].key = ATTR_ID; |
|
tag[2].val = link; |
|
|
print_otag(h, TAG_DIV, 2, tag); |
print_otag(h, TAG_DIV, 3, tag); |
print_otag(h, TAG_SPAN, 1, tag); |
|
|
|
bufinit(h); |
|
for (nn = n->child; nn; nn = nn->next) { |
|
bufcat(h, nn->string); |
|
if (nn->next) |
|
bufcat(h, " "); |
|
} |
|
tag[0].key = ATTR_NAME; |
|
tag[0].val = h->buf; |
|
print_otag(h, TAG_A, 1, tag); |
|
|
|
return(1); |
return(1); |
} |
} |
|
|
Line 829 mdoc_xr_pre(MDOC_ARGS) |
|
Line 744 mdoc_xr_pre(MDOC_ARGS) |
|
{ |
{ |
struct htmlpair tag[2]; |
struct htmlpair tag[2]; |
const struct mdoc_node *nn; |
const struct mdoc_node *nn; |
|
int i; |
|
|
buffmt_man(h, n->child->string, |
i = 0; |
n->child->next ? |
tag[i].key = ATTR_CLASS; |
n->child->next->string : NULL); |
tag[i++].val = "link-man"; |
|
|
tag[0].key = ATTR_CLASS; |
if (h->base_man) { |
tag[0].val = "link-man"; |
buffmt_man(h, n->child->string, n->child->next ? |
tag[1].key = ATTR_HREF; |
n->child->next->string : NULL); |
tag[1].val = h->buf; |
tag[i].key = ATTR_HREF; |
print_otag(h, TAG_A, 2, tag); |
tag[i++].val = h->buf; |
|
} |
|
|
|
print_otag(h, TAG_A, i, tag); |
|
|
nn = n->child; |
nn = n->child; |
print_text(h, nn->string); |
print_text(h, nn->string); |
|
|
Line 1352 mdoc_sx_pre(MDOC_ARGS) |
|
Line 1271 mdoc_sx_pre(MDOC_ARGS) |
|
{ |
{ |
struct htmlpair tag[2]; |
struct htmlpair tag[2]; |
const struct mdoc_node *nn; |
const struct mdoc_node *nn; |
|
char link[BUFSIZ]; |
|
|
bufcat(h, "#"); |
(void)strlcpy(link, "#", BUFSIZ); |
for (nn = n->child; nn; nn = nn->next) { |
for (nn = n->child; nn; nn = nn->next) { |
bufcat(h, nn->string); |
(void)strlcat(link, nn->string, BUFSIZ); |
if (nn->next) |
if (nn->next) |
bufcat(h, " "); |
(void)strlcat(link, "_", BUFSIZ); |
} |
} |
|
|
tag[0].key = ATTR_HREF; |
tag[0].key = ATTR_CLASS; |
tag[0].val = h->buf; |
tag[0].val = "link-sec"; |
tag[1].key = ATTR_CLASS; |
tag[1].key = ATTR_HREF; |
tag[1].val = "link-sec"; |
tag[1].val = link; |
|
|
print_otag(h, TAG_A, 2, tag); |
print_otag(h, TAG_A, 2, tag); |
return(1); |
return(1); |
Line 1516 mdoc_an_pre(MDOC_ARGS) |
|
Line 1436 mdoc_an_pre(MDOC_ARGS) |
|
{ |
{ |
struct htmlpair tag; |
struct htmlpair tag; |
|
|
|
/* TODO: -split and -nosplit (see termp_an_pre()). */ |
|
|
tag.key = ATTR_CLASS; |
tag.key = ATTR_CLASS; |
tag.val = "author"; |
tag.val = "author"; |
print_otag(h, TAG_SPAN, 1, &tag); |
print_otag(h, TAG_SPAN, 1, &tag); |
Line 1694 mdoc_fn_pre(MDOC_ARGS) |
|
Line 1616 mdoc_fn_pre(MDOC_ARGS) |
|
} |
} |
|
|
/* Split apart into type and name. */ |
/* Split apart into type and name. */ |
|
|
tag[0].key = ATTR_CLASS; |
|
tag[0].val = "ftype"; |
|
t = print_otag(h, TAG_SPAN, 1, tag); |
|
|
|
assert(n->child->string); |
assert(n->child->string); |
sp = n->child->string; |
sp = n->child->string; |
while (NULL != (ep = strchr(sp, ' '))) { |
|
sz = MIN((int)(ep - sp), BUFSIZ - 1); |
if ((ep = strchr(sp, ' '))) { |
(void)memcpy(nbuf, sp, (size_t)sz); |
tag[0].key = ATTR_CLASS; |
nbuf[sz] = '\0'; |
tag[0].val = "ftype"; |
print_text(h, nbuf); |
|
sp = ++ep; |
t = print_otag(h, TAG_SPAN, 1, tag); |
|
|
|
while (ep) { |
|
sz = MIN((int)(ep - sp), BUFSIZ - 1); |
|
(void)memcpy(nbuf, sp, (size_t)sz); |
|
nbuf[sz] = '\0'; |
|
print_text(h, nbuf); |
|
sp = ++ep; |
|
ep = strchr(sp, ' '); |
|
} |
|
print_tagq(h, t); |
} |
} |
|
|
print_tagq(h, t); |
|
|
|
tag[0].key = ATTR_CLASS; |
tag[0].key = ATTR_CLASS; |
tag[0].val = "fname"; |
tag[0].val = "fname"; |
t = print_otag(h, TAG_SPAN, 1, tag); |
t = print_otag(h, TAG_SPAN, 1, tag); |
Line 1769 mdoc_sp_pre(MDOC_ARGS) |
|
Line 1694 mdoc_sp_pre(MDOC_ARGS) |
|
break; |
break; |
} |
} |
|
|
buffmt(h, "height: %dem", len); |
buffmt(h, "height: %dem;", len); |
tag.key = ATTR_STYLE; |
tag.key = ATTR_STYLE; |
tag.val = h->buf; |
tag.val = h->buf; |
print_otag(h, TAG_DIV, 1, &tag); |
print_otag(h, TAG_DIV, 1, &tag); |
|
|
mdoc_in_pre(MDOC_ARGS) |
mdoc_in_pre(MDOC_ARGS) |
{ |
{ |
const struct mdoc_node *nn; |
const struct mdoc_node *nn; |
struct htmlpair tag; |
struct htmlpair tag[2]; |
|
struct tag *t; |
|
int i; |
|
|
if (SEC_SYNOPSIS == n->sec) { |
if (SEC_SYNOPSIS == n->sec) { |
if (n->next && MDOC_In != n->next->tok) { |
if (n->next && MDOC_In != n->next->tok) { |
tag.key = ATTR_STYLE; |
tag[0].key = ATTR_STYLE; |
tag.val = "margin-bottom: 1em;"; |
tag[0].val = "margin-bottom: 1em;"; |
print_otag(h, TAG_DIV, 1, &tag); |
print_otag(h, TAG_DIV, 1, tag); |
} else |
} else |
print_otag(h, TAG_DIV, 0, NULL); |
print_otag(h, TAG_DIV, 0, NULL); |
} |
} |
|
|
tag.key = ATTR_CLASS; |
tag[0].key = ATTR_CLASS; |
tag.val = "includes"; |
tag[0].val = "includes"; |
|
|
print_otag(h, TAG_SPAN, 1, &tag); |
print_otag(h, TAG_SPAN, 1, tag); |
|
|
if (SEC_SYNOPSIS == n->sec) |
if (SEC_SYNOPSIS == n->sec) |
print_text(h, "#include"); |
print_text(h, "#include"); |
Line 1920 mdoc_in_pre(MDOC_ARGS) |
|
Line 1847 mdoc_in_pre(MDOC_ARGS) |
|
|
|
/* XXX -- see warning in termp_in_post(). */ |
/* XXX -- see warning in termp_in_post(). */ |
|
|
for (nn = n->child; nn; nn = nn->next) |
for (nn = n->child; nn; nn = nn->next) { |
|
assert(MDOC_TEXT == nn->type); |
|
i = 0; |
|
tag[i].key = ATTR_CLASS; |
|
tag[i++].val = "link-includes"; |
|
if (h->base_includes) { |
|
buffmt_includes(h, nn->string); |
|
tag[i].key = ATTR_HREF; |
|
tag[i++].val = h->buf; |
|
} |
|
t = print_otag(h, TAG_A, i, tag); |
print_mdoc_node(m, nn, h); |
print_mdoc_node(m, nn, h); |
|
print_tagq(h, t); |
|
} |
|
|
h->flags |= HTML_NOSPACE; |
h->flags |= HTML_NOSPACE; |
print_text(h, ">"); |
print_text(h, ">"); |