-/* $Id: mdoc_html.c,v 1.158 2011/04/04 15:45:12 kristaps Exp $ */
+/* $Id: mdoc_html.c,v 1.172 2011/07/04 09:42:38 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
if ( ! a2roffsu(p, su, SCALE_MAX)) {
su->unit = SCALE_BU;
- su->scale = (int)strlen(p);
+ su->scale = html_strlen(p);
}
}
SCALE_HS_INIT(su, INDENT * 2);
else if ( ! a2roffsu(p, su, SCALE_MAX)) {
su->unit = SCALE_BU;
- su->scale = (int)strlen(p);
+ su->scale = html_strlen(p);
}
}
print_gen_head(h);
bufinit(h);
- buffmt(h, "%s(%s)", m->title, m->msec);
+ bufcat_fmt(h, "%s(%s)", m->title, m->msec);
- if (m->arch) {
- bufcat(h, " (");
- bufcat(h, m->arch);
- bufcat(h, ")");
- }
+ if (m->arch)
+ bufcat_fmt(h, " (%s)", m->arch);
print_otag(h, TAG_TITLE, 0, NULL);
print_text(h, h->buf);
child = 1;
t = h->tags.head;
- bufinit(h);
switch (n->type) {
case (MDOC_ROOT):
child = mdoc_root_pre(m, n, h);
print_stagq(h, t);
- bufinit(h);
switch (n->type) {
case (MDOC_ROOT):
mdoc_root_post(m, n, h);
mdoc_sh_pre(MDOC_ARGS)
{
struct htmlpair tag;
- char buf[BUFSIZ];
if (MDOC_BLOCK == n->type) {
PAIR_CLASS_INIT(&tag, "section");
} else if (MDOC_BODY == n->type)
return(1);
- buf[0] = '\0';
+ bufinit(h);
+ bufcat(h, "x");
for (n = n->child; n; n = n->next) {
- html_idcat(buf, n->string, BUFSIZ);
+ bufcat_id(h, n->string);
if (n->next)
- html_idcat(buf, " ", BUFSIZ);
+ bufcat_id(h, " ");
}
- PAIR_ID_INIT(&tag, buf);
+ PAIR_ID_INIT(&tag, h->buf);
print_otag(h, TAG_H1, 1, &tag);
return(1);
}
mdoc_ss_pre(MDOC_ARGS)
{
struct htmlpair tag;
- char buf[BUFSIZ];
if (MDOC_BLOCK == n->type) {
PAIR_CLASS_INIT(&tag, "subsection");
} else if (MDOC_BODY == n->type)
return(1);
- buf[0] = '\0';
+ bufinit(h);
+ bufcat(h, "x");
for (n = n->child; n; n = n->next) {
- html_idcat(buf, n->string, BUFSIZ);
+ bufcat_id(h, n->string);
if (n->next)
- html_idcat(buf, " ", BUFSIZ);
+ bufcat_id(h, " ");
}
- PAIR_ID_INIT(&tag, buf);
+ PAIR_ID_INIT(&tag, h->buf);
print_otag(h, TAG_H2, 1, &tag);
return(1);
}
{
struct htmlpair tag;
struct roffsu su;
- size_t len;
+ int len;
switch (n->type) {
case (MDOC_ELEM):
for (len = 0, n = n->child; n; n = n->next)
if (MDOC_TEXT == n->type)
- len += strlen(n->string);
+ len += html_strlen(n->string);
if (0 == len && m->name)
- len = strlen(m->name);
+ len = html_strlen(m->name);
SCALE_HS_INIT(&su, (double)len);
+ bufinit(h);
bufcat_su(h, "width", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_COL, 1, &tag);
assert(lists[type]);
PAIR_CLASS_INIT(&tag[0], lists[type]);
+ bufinit(h);
+
if (MDOC_HEAD == n->type) {
switch (type) {
case(LIST_bullet):
struct roffsu su;
char buf[BUFSIZ];
+ bufinit(h);
+
if (MDOC_BODY == n->type) {
if (LIST_column == n->norm->Bl.type)
print_otag(h, TAG_TBODY, 0, NULL);
for (i = 0; i < (int)n->norm->Bl.ncols; i++) {
a2width(n->norm->Bl.cols[i], &su);
- bufinit(h);
if (i < (int)n->norm->Bl.ncols - 1)
bufcat_su(h, "width", &su);
else
static int
mdoc_ex_pre(MDOC_ARGS)
{
- const struct mdoc_node *nn;
- struct tag *t;
- struct htmlpair tag;
+ struct tag *t;
+ struct htmlpair tag;
+ int nchild;
if (n->prev)
print_otag(h, TAG_BR, 0, NULL);
PAIR_CLASS_INIT(&tag, "utility");
print_text(h, "The");
- for (nn = n->child; nn; nn = nn->next) {
+
+ nchild = n->nchild;
+ for (n = n->child; n; n = n->next) {
+ assert(MDOC_TEXT == n->type);
+
t = print_otag(h, TAG_B, 1, &tag);
- print_text(h, nn->string);
+ print_text(h, n->string);
print_tagq(h, t);
- h->flags |= HTML_NOSPACE;
-
- if (nn->next && NULL == nn->next->next)
- print_text(h, ", and");
- else if (nn->next)
+ if (nchild > 2 && n->next) {
+ h->flags |= HTML_NOSPACE;
print_text(h, ",");
- else
- h->flags &= ~HTML_NOSPACE;
+ }
+
+ if (n->next && NULL == n->next->next)
+ print_text(h, "and");
}
- if (n->child && n->child->next)
+ if (nchild > 1)
print_text(h, "utilities exit");
else
print_text(h, "utility exits");
return(1);
SCALE_VS_INIT(&su, 0);
+ bufinit(h);
bufcat_su(h, "margin-top", &su);
bufcat_su(h, "margin-bottom", &su);
PAIR_STYLE_INIT(&tag[0], h);
mdoc_sx_pre(MDOC_ARGS)
{
struct htmlpair tag[2];
- char buf[BUFSIZ];
- strlcpy(buf, "#", BUFSIZ);
+ bufinit(h);
+ bufcat(h, "#x");
for (n = n->child; n; n = n->next) {
- html_idcat(buf, n->string, BUFSIZ);
+ bufcat_id(h, n->string);
if (n->next)
- html_idcat(buf, " ", BUFSIZ);
+ bufcat_id(h, " ");
}
PAIR_CLASS_INIT(&tag[0], "link-sec");
- PAIR_HREF_INIT(&tag[1], buf);
+ PAIR_HREF_INIT(&tag[1], h->buf);
print_otag(h, TAG_I, 1, tag);
print_otag(h, TAG_A, 2, tag);
SCALE_HS_INIT(&su, 0);
if (n->norm->Bd.offs)
a2offs(n->norm->Bd.offs, &su);
-
+
+ bufinit(h);
bufcat_su(h, "margin-left", &su);
PAIR_STYLE_INIT(&tag[0], h);
static int
mdoc_fd_pre(MDOC_ARGS)
{
- struct htmlpair tag;
+ struct htmlpair tag[2];
+ char buf[BUFSIZ];
+ size_t sz;
+ int i;
+ struct tag *t;
synopsis_pre(h, n);
- PAIR_CLASS_INIT(&tag, "macro");
- print_otag(h, TAG_B, 1, &tag);
- return(1);
+ if (NULL == (n = n->child))
+ return(0);
+
+ assert(MDOC_TEXT == n->type);
+
+ if (strcmp(n->string, "#include")) {
+ PAIR_CLASS_INIT(&tag[0], "macro");
+ print_otag(h, TAG_B, 1, tag);
+ return(1);
+ }
+
+ PAIR_CLASS_INIT(&tag[0], "includes");
+ print_otag(h, TAG_B, 1, tag);
+ print_text(h, n->string);
+
+ if (NULL != (n = n->next)) {
+ assert(MDOC_TEXT == n->type);
+ strlcpy(buf, '<' == *n->string || '"' == *n->string ?
+ n->string + 1 : n->string, BUFSIZ);
+
+ sz = strlen(buf);
+ if (sz && ('>' == buf[sz - 1] || '"' == buf[sz - 1]))
+ buf[sz - 1] = '\0';
+
+ PAIR_CLASS_INIT(&tag[0], "link-includes");
+
+ i = 1;
+ if (h->base_includes) {
+ buffmt_includes(h, buf);
+ PAIR_HREF_INIT(&tag[i], h->buf);
+ i++;
+ }
+
+ t = print_otag(h, TAG_A, i, tag);
+ print_text(h, n->string);
+ print_tagq(h, t);
+
+ n = n->next;
+ }
+
+ for ( ; n; n = n->next) {
+ assert(MDOC_TEXT == n->type);
+ print_text(h, n->string);
+ }
+
+ return(0);
}
h->flags |= HTML_NOSPACE;
print_text(h, "(");
+ h->flags |= HTML_NOSPACE;
- bufinit(h);
PAIR_CLASS_INIT(&tag[0], "farg");
+ bufinit(h);
bufcat_style(h, "white-space", "nowrap");
PAIR_STYLE_INIT(&tag[1], h);
SCALE_VS_INIT(&su, 1);
if (MDOC_sp == n->tok) {
- if (n->child)
- a2roffsu(n->child->string, &su, SCALE_VS);
+ if (NULL != (n = n->child))
+ if ( ! a2roffsu(n->string, &su, SCALE_VS))
+ SCALE_VS_INIT(&su, atoi(n->string));
} else
su.scale = 0;
+ bufinit(h);
bufcat_su(h, "height", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_DIV, 1, &tag);
print_otag(h, TAG_A, 2, tag);
- for (n = n->next; n; n = n->next) {
- assert(MDOC_TEXT == n->type);
+ if (NULL == n->next)
+ print_text(h, n->string);
+
+ for (n = n->next; n; n = n->next)
print_text(h, n->string);
- }
return(0);
}
static int
mdoc_mt_pre(MDOC_ARGS)
{
- struct htmlpair tag[2];
- struct tag *t;
- const struct mdoc_node *nn;
+ struct htmlpair tag[2];
+ struct tag *t;
PAIR_CLASS_INIT(&tag[0], "link-mail");
- for (nn = n->child; nn; nn = nn->next) {
+ for (n = n->child; n; n = n->next) {
+ assert(MDOC_TEXT == n->type);
+
bufinit(h);
bufcat(h, "mailto:");
- bufcat(h, nn->string);
+ bufcat(h, n->string);
+
PAIR_HREF_INIT(&tag[1], h->buf);
t = print_otag(h, TAG_A, 2, tag);
- print_text(h, nn->string);
+ print_text(h, n->string);
print_tagq(h, t);
}
assert(MDOC_TEXT == n->type);
PAIR_CLASS_INIT(&tag[0], "link-includes");
- bufinit(h);
i = 1;
-
if (h->base_includes) {
buffmt_includes(h, n->string);
- PAIR_HREF_INIT(&tag[i++], h->buf);
+ PAIR_HREF_INIT(&tag[i], h->buf);
+ i++;
}
t = print_otag(h, TAG_A, i, tag);
static int
mdoc_rv_pre(MDOC_ARGS)
{
- const struct mdoc_node *nn;
- struct htmlpair tag;
- struct tag *t;
+ struct htmlpair tag;
+ struct tag *t;
+ int nchild;
if (n->prev)
print_otag(h, TAG_BR, 0, NULL);
+ PAIR_CLASS_INIT(&tag, "fname");
+
print_text(h, "The");
- for (nn = n->child; nn; nn = nn->next) {
- PAIR_CLASS_INIT(&tag, "fname");
+ nchild = n->nchild;
+ for (n = n->child; n; n = n->next) {
+ assert(MDOC_TEXT == n->type);
+
t = print_otag(h, TAG_B, 1, &tag);
- print_text(h, nn->string);
+ print_text(h, n->string);
print_tagq(h, t);
h->flags |= HTML_NOSPACE;
- if (nn->next && NULL == nn->next->next)
- print_text(h, "(), and");
- else if (nn->next)
- print_text(h, "(),");
- else
- print_text(h, "()");
+ print_text(h, "()");
+
+ if (nchild > 2 && n->next) {
+ h->flags |= HTML_NOSPACE;
+ print_text(h, ",");
+ }
+
+ if (n->next && NULL == n->next->next)
+ print_text(h, "and");
}
- if (n->child && n->child->next)
+ if (nchild > 1)
print_text(h, "functions return");
else
print_text(h, "function returns");
* We want this to be inline-formatted, but needs to be div to
* accept block children.
*/
+ bufinit(h);
bufcat_style(h, "display", "inline");
SCALE_HS_INIT(&su, 1);
/* Needs a left-margin for spacing. */