-/* $Id: mdoc_html.c,v 1.124 2010/12/17 01:02:00 kristaps Exp $ */
+/* $Id: mdoc_html.c,v 1.140 2011/01/01 12:18:37 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
{
if ( ! a2roffsu(p, su, SCALE_MAX)) {
- su->unit = SCALE_EM;
+ su->unit = SCALE_BU;
su->scale = (int)strlen(p);
}
}
static void
synopsis_pre(struct html *h, const struct mdoc_node *n)
{
- struct roffsu su;
- struct htmlpair tag;
if (NULL == n->prev || ! (MDOC_SYNPRETTY & n->flags))
return;
- SCALE_VS_INIT(&su, 1);
- bufcat_su(h, "margin-top", &su);
- PAIR_STYLE_INIT(&tag, h);
-
if (n->prev->tok == n->tok &&
MDOC_Fo != n->tok &&
MDOC_Ft != n->tok &&
MDOC_Fn != n->tok) {
- print_otag(h, TAG_DIV, 0, NULL);
+ print_otag(h, TAG_BR, 0, NULL);
return;
}
case (MDOC_In):
/* FALLTHROUGH */
case (MDOC_Vt):
- print_otag(h, TAG_DIV, 1, &tag);
+ print_otag(h, TAG_P, 0, NULL);
break;
case (MDOC_Ft):
if (MDOC_Fn != n->tok && MDOC_Fo != n->tok) {
- print_otag(h, TAG_DIV, 1, &tag);
+ print_otag(h, TAG_P, 0, NULL);
break;
}
/* FALLTHROUGH */
default:
- print_otag(h, TAG_DIV, 0, NULL);
+ print_otag(h, TAG_BR, 0, NULL);
break;
}
}
else if (0 == strcmp(p, "indent-two"))
SCALE_HS_INIT(su, INDENT * 2);
else if ( ! a2roffsu(p, su, SCALE_MAX)) {
- su->unit = SCALE_EM;
+ su->unit = SCALE_BU;
su->scale = (int)strlen(p);
}
}
case (MDOC_TEXT):
print_text(h, n->string);
return;
+ case (MDOC_TBL):
+ return;
default:
if (mdocs[n->tok].pre && ENDBODY_NOT == n->end)
child = (*mdocs[n->tok].pre)(m, n, h);
}
}
-
/* ARGSUSED */
static void
mdoc_root_post(MDOC_ARGS)
time2a(m->date, b, DATESIZ);
- PAIR_CLASS_INIT(&tag[0], "footer");
- bufcat_style(h, "width", "100%");
- PAIR_STYLE_INIT(&tag[1], h);
- PAIR_SUMMARY_INIT(&tag[2], "footer");
+ PAIR_SUMMARY_INIT(&tag[0], "Document Footer");
+ PAIR_CLASS_INIT(&tag[1], "foot");
+ if (NULL == h->style) {
+ PAIR_INIT(&tag[2], ATTR_WIDTH, "100%");
+ t = print_otag(h, TAG_TABLE, 3, tag);
+ PAIR_INIT(&tag[0], ATTR_WIDTH, "50%");
+ print_otag(h, TAG_COL, 1, tag);
+ print_otag(h, TAG_COL, 1, tag);
+ } else
+ t = print_otag(h, TAG_TABLE, 2, tag);
+
+ t = print_otag(h, TAG_TBODY, 0, NULL);
- t = print_otag(h, TAG_TABLE, 3, tag);
tt = print_otag(h, TAG_TR, 0, NULL);
- bufinit(h);
- bufcat_style(h, "width", "50%");
- PAIR_STYLE_INIT(&tag[0], h);
+ PAIR_CLASS_INIT(&tag[0], "foot-date");
print_otag(h, TAG_TD, 1, tag);
+
print_text(h, b);
print_stagq(h, tt);
- bufinit(h);
- bufcat_style(h, "width", "50%");
- bufcat_style(h, "text-align", "right");
- PAIR_STYLE_INIT(&tag[0], h);
- print_otag(h, TAG_TD, 1, tag);
+ PAIR_CLASS_INIT(&tag[0], "foot-os");
+ if (NULL == h->style) {
+ PAIR_INIT(&tag[1], ATTR_ALIGN, "right");
+ print_otag(h, TAG_TD, 2, tag);
+ } else
+ print_otag(h, TAG_TD, 1, tag);
+
print_text(h, m->os);
print_tagq(h, t);
}
snprintf(title, BUFSIZ - 1, "%s(%s)", m->title, m->msec);
- PAIR_CLASS_INIT(&tag[0], "header");
- bufcat_style(h, "width", "100%");
- PAIR_STYLE_INIT(&tag[1], h);
- PAIR_SUMMARY_INIT(&tag[2], "header");
+ PAIR_SUMMARY_INIT(&tag[0], "Document Header");
+ PAIR_CLASS_INIT(&tag[1], "head");
+ if (NULL == h->style) {
+ PAIR_INIT(&tag[2], ATTR_WIDTH, "100%");
+ t = print_otag(h, TAG_TABLE, 3, tag);
+ PAIR_INIT(&tag[0], ATTR_WIDTH, "30%");
+ print_otag(h, TAG_COL, 1, tag);
+ print_otag(h, TAG_COL, 1, tag);
+ print_otag(h, TAG_COL, 1, tag);
+ } else
+ t = print_otag(h, TAG_TABLE, 2, tag);
- t = print_otag(h, TAG_TABLE, 3, tag);
+ print_otag(h, TAG_TBODY, 0, NULL);
tt = print_otag(h, TAG_TR, 0, NULL);
- bufinit(h);
- bufcat_style(h, "width", "10%");
- PAIR_STYLE_INIT(&tag[0], h);
+ PAIR_CLASS_INIT(&tag[0], "head-ltitle");
print_otag(h, TAG_TD, 1, tag);
+
print_text(h, title);
print_stagq(h, tt);
- bufinit(h);
- bufcat_style(h, "text-align", "center");
- bufcat_style(h, "white-space", "nowrap");
- bufcat_style(h, "width", "80%");
- PAIR_STYLE_INIT(&tag[0], h);
- print_otag(h, TAG_TD, 1, tag);
+ PAIR_CLASS_INIT(&tag[0], "head-vol");
+ if (NULL == h->style) {
+ PAIR_INIT(&tag[1], ATTR_ALIGN, "center");
+ print_otag(h, TAG_TD, 2, tag);
+ } else
+ print_otag(h, TAG_TD, 1, tag);
+
print_text(h, b);
print_stagq(h, tt);
- bufinit(h);
- bufcat_style(h, "text-align", "right");
- bufcat_style(h, "width", "10%");
- PAIR_STYLE_INIT(&tag[0], h);
- print_otag(h, TAG_TD, 1, tag);
+ PAIR_CLASS_INIT(&tag[0], "head-rtitle");
+ if (NULL == h->style) {
+ PAIR_INIT(&tag[1], ATTR_ALIGN, "right");
+ print_otag(h, TAG_TD, 2, tag);
+ } else
+ print_otag(h, TAG_TD, 1, tag);
+
print_text(h, title);
print_tagq(h, t);
return(1);
struct htmlpair tag;
PAIR_CLASS_INIT(&tag, "flag");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_B, 1, &tag);
/* `Cm' has no leading hyphen. */
case (MDOC_ELEM):
synopsis_pre(h, n);
PAIR_CLASS_INIT(&tag, "name");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_B, 1, &tag);
if (NULL == n->child && m->name)
print_text(h, m->name);
return(1);
struct htmlpair tag;
PAIR_CLASS_INIT(&tag, "arg");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_I, 1, &tag);
return(1);
}
assert(bl);
- type = bl->data.Bl->type;
+ type = bl->norm->Bl.type;
assert(lists[type]);
PAIR_CLASS_INIT(&tag[0], lists[type]);
case(LIST_ohang):
/* FALLTHROUGH */
case(LIST_tag):
- SCALE_VS_INIT(&su, ! bl->data.Bl->comp);
+ SCALE_VS_INIT(&su, ! bl->norm->Bl.comp);
bufcat_su(h, "margin-top", &su);
PAIR_STYLE_INIT(&tag[1], h);
print_otag(h, TAG_DT, 2, tag);
+ if (LIST_diag != type)
+ break;
+ PAIR_CLASS_INIT(&tag[0], "diag");
+ print_otag(h, TAG_B, 1, tag);
break;
case(LIST_column):
break;
case(LIST_enum):
/* FALLTHROUGH */
case(LIST_item):
- SCALE_VS_INIT(&su, ! bl->data.Bl->comp);
+ SCALE_VS_INIT(&su, ! bl->norm->Bl.comp);
bufcat_su(h, "margin-top", &su);
PAIR_STYLE_INIT(&tag[1], h);
print_otag(h, TAG_LI, 2, tag);
case(LIST_ohang):
/* FALLTHROUGH */
case(LIST_tag):
- if (NULL == bl->data.Bl->width) {
+ if (NULL == bl->norm->Bl.width) {
print_otag(h, TAG_DD, 1, tag);
break;
}
- a2width(bl->data.Bl->width, &su);
+ a2width(bl->norm->Bl.width, &su);
bufcat_su(h, "margin-left", &su);
PAIR_STYLE_INIT(&tag[1], h);
print_otag(h, TAG_DD, 2, tag);
break;
case(LIST_column):
- SCALE_VS_INIT(&su, ! bl->data.Bl->comp);
+ SCALE_VS_INIT(&su, ! bl->norm->Bl.comp);
bufcat_su(h, "margin-top", &su);
PAIR_STYLE_INIT(&tag[1], h);
print_otag(h, TAG_TD, 2, tag);
size_t i;
struct htmlpair tag[3];
struct roffsu su;
+ char buf[BUFSIZ];
if (MDOC_BODY == n->type) {
- if (LIST_column == n->data.Bl->type)
+ if (LIST_column == n->norm->Bl.type)
print_otag(h, TAG_TBODY, 0, NULL);
return(1);
}
if (MDOC_HEAD == n->type) {
- if (LIST_column != n->data.Bl->type)
+ if (LIST_column != n->norm->Bl.type)
return(0);
/*
* screen and we want to preserve that behaviour.
*/
- for (i = 0; i < n->data.Bl->ncols; i++) {
- a2width(n->data.Bl->cols[i], &su);
+ for (i = 0; i < n->norm->Bl.ncols; i++) {
+ a2width(n->norm->Bl.cols[i], &su);
bufinit(h);
- if (i < n->data.Bl->ncols - 1)
+ if (i < n->norm->Bl.ncols - 1)
bufcat_su(h, "width", &su);
else
bufcat_su(h, "min-width", &su);
bufcat_su(h, "margin-bottom", &su);
PAIR_STYLE_INIT(&tag[0], h);
- assert(lists[n->data.Bl->type]);
- PAIR_CLASS_INIT(&tag[1], lists[n->data.Bl->type]);
- i = 2;
+ assert(lists[n->norm->Bl.type]);
+ strlcpy(buf, "list ", BUFSIZ);
+ strlcat(buf, lists[n->norm->Bl.type], BUFSIZ);
+ PAIR_INIT(&tag[1], ATTR_CLASS, buf);
/* Set the block's left-hand margin. */
- if (n->data.Bl->offs) {
- a2offs(n->data.Bl->offs, &su);
+ if (n->norm->Bl.offs) {
+ a2offs(n->norm->Bl.offs, &su);
bufcat_su(h, "margin-left", &su);
- PAIR_STYLE_INIT(&tag[2], h);
- i = 3;
}
- switch (n->data.Bl->type) {
+ switch (n->norm->Bl.type) {
case(LIST_bullet):
/* FALLTHROUGH */
case(LIST_dash):
case(LIST_hyphen):
/* FALLTHROUGH */
case(LIST_item):
- print_otag(h, TAG_UL, i, tag);
+ print_otag(h, TAG_UL, 2, tag);
break;
case(LIST_enum):
- print_otag(h, TAG_OL, i, tag);
+ print_otag(h, TAG_OL, 2, tag);
break;
case(LIST_diag):
/* FALLTHROUGH */
case(LIST_ohang):
/* FALLTHROUGH */
case(LIST_tag):
- print_otag(h, TAG_DL, i, tag);
+ print_otag(h, TAG_DL, 2, tag);
break;
case(LIST_column):
- print_otag(h, TAG_TABLE, i, tag);
+ print_otag(h, TAG_TABLE, 2, tag);
break;
default:
abort();
struct tag *t;
struct htmlpair tag;
+ 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) {
- t = print_otag(h, TAG_SPAN, 1, &tag);
+ t = print_otag(h, TAG_B, 1, &tag);
print_text(h, nn->string);
print_tagq(h, t);
/* BLOCKQUOTE needs a block body. */
+ PAIR_CLASS_INIT(&tag[0], "display");
+ print_otag(h, TAG_DIV, 1, tag);
+
if (MDOC_Dl == n->tok) {
- PAIR_CLASS_INIT(&tag[1], "lit");
- print_otag(h, TAG_DIV, 1, tag);
- } else
- print_otag(h, TAG_DIV, 0, tag);
+ PAIR_CLASS_INIT(&tag[0], "lit");
+ print_otag(h, TAG_CODE, 1, tag);
+ }
return(1);
}
PAIR_CLASS_INIT(&tag[0], "link-sec");
PAIR_HREF_INIT(&tag[1], buf);
+ print_otag(h, TAG_I, 1, tag);
print_otag(h, TAG_A, 2, tag);
return(1);
}
if (MDOC_HEAD == n->type)
return(0);
- SCALE_VS_INIT(&su, 0);
-
- assert(n->data.Bd);
- if (n->data.Bd->offs)
- a2offs(n->data.Bd->offs, &su);
-
- comp = n->data.Bd->comp;
-
- /* FIXME: -centered, etc. formatting. */
- /* FIXME: does not respect -offset ??? */
-
if (MDOC_BLOCK == n->type) {
- bufcat_su(h, "margin-left", &su);
+ comp = n->norm->Bd.comp;
for (nn = n; nn && ! comp; nn = nn->parent) {
if (MDOC_BLOCK != nn->type)
continue;
if (nn->prev)
break;
}
- if (comp) {
- PAIR_STYLE_INIT(&tag[0], h);
- print_otag(h, TAG_DIV, 1, tag);
- return(1);
- }
- SCALE_VS_INIT(&su, 1);
- bufcat_su(h, "margin-top", &su);
- PAIR_STYLE_INIT(&tag[0], h);
- print_otag(h, TAG_DIV, 1, tag);
+ if ( ! comp)
+ print_otag(h, TAG_P, 0, NULL);
return(1);
}
- if (DISP_unfilled != n->data.Bd->type &&
- DISP_literal != n->data.Bd->type)
+ SCALE_HS_INIT(&su, 0);
+ if (n->norm->Bd.offs)
+ a2offs(n->norm->Bd.offs, &su);
+
+ bufcat_su(h, "margin-left", &su);
+ PAIR_STYLE_INIT(&tag[0], h);
+
+ if (DISP_unfilled != n->norm->Bd.type &&
+ DISP_literal != n->norm->Bd.type) {
+ PAIR_CLASS_INIT(&tag[1], "display");
+ print_otag(h, TAG_DIV, 2, tag);
return(1);
+ }
- PAIR_CLASS_INIT(&tag[0], "lit");
- bufcat_style(h, "white-space", "pre");
- PAIR_STYLE_INIT(&tag[1], h);
- print_otag(h, TAG_DIV, 2, tag);
+ PAIR_CLASS_INIT(&tag[1], "lit display");
+ print_otag(h, TAG_PRE, 2, tag);
for (nn = n->child; nn; nn = nn->next) {
print_mdoc_node(m, nn, h);
}
if (nn->next && nn->next->line == nn->line)
continue;
- print_text(h, "\n");
+ else if (nn->next)
+ print_text(h, "\n");
+
h->flags |= HTML_NOSPACE;
}
struct htmlpair tag;
PAIR_CLASS_INIT(&tag, "file");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_I, 1, &tag);
return(1);
}
struct htmlpair tag;
PAIR_CLASS_INIT(&tag, "addr");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_I, 1, &tag);
return(1);
}
synopsis_pre(h, n);
PAIR_CLASS_INIT(&tag, "config");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_B, 1, &tag);
return(1);
}
PAIR_CLASS_INIT(&tag, "farg");
if (n->parent->tok != MDOC_Fo) {
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_I, 1, &tag);
return(1);
}
for (nn = n->child; nn; nn = nn->next) {
- t = print_otag(h, TAG_SPAN, 1, &tag);
+ t = print_otag(h, TAG_I, 1, &tag);
print_text(h, nn->string);
print_tagq(h, t);
if (nn->next)
synopsis_pre(h, n);
PAIR_CLASS_INIT(&tag, "macro");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_B, 1, &tag);
return(1);
}
synopsis_pre(h, n);
PAIR_CLASS_INIT(&tag, "ftype");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_I, 1, &tag);
return(1);
}
ep = strchr(sp, ' ');
if (NULL != ep) {
PAIR_CLASS_INIT(&tag[0], "ftype");
- t = print_otag(h, TAG_SPAN, 1, tag);
+ t = print_otag(h, TAG_I, 1, tag);
while (ep) {
sz = MIN((int)(ep - sp), BUFSIZ - 1);
}
#endif
- t = print_otag(h, TAG_SPAN, 1, tag);
+ t = print_otag(h, TAG_B, 1, tag);
if (sp) {
strlcpy(nbuf, sp, BUFSIZ);
i = 1;
if (MDOC_SYNPRETTY & n->flags)
i = 2;
- t = print_otag(h, TAG_SPAN, i, tag);
+ t = print_otag(h, TAG_I, i, tag);
print_text(h, nn->string);
print_tagq(h, t);
if (nn->next)
assert(n->child->string);
PAIR_CLASS_INIT(&tag, "fname");
- t = print_otag(h, TAG_SPAN, 1, &tag);
+ t = print_otag(h, TAG_B, 1, &tag);
print_text(h, n->child->string);
print_tagq(h, t);
return(0);
synopsis_pre(h, n);
PAIR_CLASS_INIT(&tag[0], "includes");
- print_otag(h, TAG_SPAN, 1, tag);
+ print_otag(h, TAG_B, 1, tag);
if (MDOC_SYNPRETTY & n->flags && MDOC_LINE & n->flags)
print_text(h, "#include");
struct htmlpair tag;
PAIR_CLASS_INIT(&tag, "cmd");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_B, 1, &tag);
return(1);
}
struct htmlpair tag;
struct tag *t;
- print_otag(h, TAG_DIV, 0, NULL);
+ if (n->prev)
+ print_otag(h, TAG_BR, 0, NULL);
+
print_text(h, "The");
for (nn = n->child; nn; nn = nn->next) {
PAIR_CLASS_INIT(&tag, "fname");
- t = print_otag(h, TAG_SPAN, 1, &tag);
+ t = print_otag(h, TAG_B, 1, &tag);
print_text(h, nn->string);
print_tagq(h, t);
"-1 is returned and the global variable");
PAIR_CLASS_INIT(&tag, "var");
- t = print_otag(h, TAG_SPAN, 1, &tag);
+ t = print_otag(h, TAG_B, 1, &tag);
print_text(h, "errno");
print_tagq(h, t);
print_text(h, "is set to indicate the error.");
struct htmlpair tag;
PAIR_CLASS_INIT(&tag, "var");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_B, 1, &tag);
return(1);
}
else if (MDOC_BODY != n->type)
return(1);
- assert(n->data.Bf);
-
- if (FONT_Em == n->data.Bf->font)
+ if (FONT_Em == n->norm->Bf.font)
PAIR_CLASS_INIT(&tag[0], "emph");
- else if (FONT_Sy == n->data.Bf->font)
+ else if (FONT_Sy == n->norm->Bf.font)
PAIR_CLASS_INIT(&tag[0], "symb");
- else if (FONT_Li == n->data.Bf->font)
+ else if (FONT_Li == n->norm->Bf.font)
PAIR_CLASS_INIT(&tag[0], "lit");
else
PAIR_CLASS_INIT(&tag[0], "none");
{
struct htmlpair tag;
- if (SEC_LIBRARY == n->sec && MDOC_LINE & n->flags)
- print_otag(h, TAG_DIV, 0, NULL);
+ if (SEC_LIBRARY == n->sec && MDOC_LINE & n->flags && n->prev)
+ print_otag(h, TAG_BR, 0, NULL);
+
PAIR_CLASS_INIT(&tag, "lib");
print_otag(h, TAG_SPAN, 1, &tag);
return(1);
mdoc__x_pre(MDOC_ARGS)
{
struct htmlpair tag[2];
+ enum htmltag t;
+
+ t = TAG_SPAN;
switch (n->tok) {
case(MDOC__A):
break;
case(MDOC__B):
PAIR_CLASS_INIT(&tag[0], "ref-book");
+ t = TAG_I;
break;
case(MDOC__C):
PAIR_CLASS_INIT(&tag[0], "ref-city");
break;
case(MDOC__I):
PAIR_CLASS_INIT(&tag[0], "ref-issue");
+ t = TAG_I;
break;
case(MDOC__J):
PAIR_CLASS_INIT(&tag[0], "ref-jrnl");
+ t = TAG_I;
break;
case(MDOC__N):
PAIR_CLASS_INIT(&tag[0], "ref-num");
}
if (MDOC__U != n->tok) {
- print_otag(h, TAG_SPAN, 1, tag);
+ print_otag(h, t, 1, tag);
return(1);
}
case (MDOC_HEAD):
return(0);
case (MDOC_BODY):
- h->flags |= HTML_PREKEEP;
+ if (n->parent->args || 0 == n->prev->nchild)
+ h->flags |= HTML_PREKEEP;
break;
default:
abort();