version 1.17, 2009/10/03 15:26:26 |
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_includes(struct html *, 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 282 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_includes(struct html *h, const char *name) |
|
{ |
|
const char *p, *pp; |
|
|
|
pp = h->base_includes; |
|
while ((p = strchr(pp, '%'))) { |
|
bufncat(h, pp, p - pp); |
|
switch (*(p + 1)) { |
|
case('I'): |
|
bufcat(h, name); |
|
break; |
|
default: |
|
bufncat(h, p, 2); |
|
break; |
|
} |
|
pp = p + 2; |
|
} |
|
if (pp) |
|
bufcat(h, pp); |
|
} |
|
|
|
|
|
static void |
|
buffmt_man(struct html *h, |
|
const char *name, const char *sec) |
|
{ |
|
const char *p, *pp; |
|
|
|
pp = h->base_man; |
|
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 488 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 650 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 681 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 702 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 1375 mdoc_d1_pre(MDOC_ARGS) |
|
Line 1269 mdoc_d1_pre(MDOC_ARGS) |
|
static int |
static int |
mdoc_sx_pre(MDOC_ARGS) |
mdoc_sx_pre(MDOC_ARGS) |
{ |
{ |
struct htmlpair tag[3]; |
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; |
tag[2].key = ATTR_TARGET; |
|
tag[2].val = "_self"; |
|
|
|
print_otag(h, TAG_A, 3, tag); |
print_otag(h, TAG_A, 2, tag); |
return(1); |
return(1); |
} |
} |
|
|
Line 1543 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 1721 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 1796 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); |