-/* $Id: mdoc_html.c,v 1.3 2009/09/22 16:10:52 kristaps Exp $ */
+/* $Id: mdoc_html.c,v 1.13 2009/09/26 17:35:49 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
+#include <sys/param.h>
#include <sys/queue.h>
#include <assert.h>
static int mdoc_tbl_body_pre(MDOC_ARGS, int, int);
static int mdoc_tbl_head_pre(MDOC_ARGS, int, int);
+static void mdoc__x_post(MDOC_ARGS);
+static int mdoc__x_pre(MDOC_ARGS);
static int mdoc_ad_pre(MDOC_ARGS);
static int mdoc_an_pre(MDOC_ARGS);
+static int mdoc_ap_pre(MDOC_ARGS);
static void mdoc_aq_post(MDOC_ARGS);
static int mdoc_aq_pre(MDOC_ARGS);
static int mdoc_ar_pre(MDOC_ARGS);
static int mdoc_bd_pre(MDOC_ARGS);
+static int mdoc_bf_pre(MDOC_ARGS);
static void mdoc_bl_post(MDOC_ARGS);
static int mdoc_bl_pre(MDOC_ARGS);
+static void mdoc_bq_post(MDOC_ARGS);
+static int mdoc_bq_pre(MDOC_ARGS);
static void mdoc_brq_post(MDOC_ARGS);
static int mdoc_brq_pre(MDOC_ARGS);
+static int mdoc_bt_pre(MDOC_ARGS);
+static int mdoc_bx_pre(MDOC_ARGS);
static int mdoc_cd_pre(MDOC_ARGS);
static int mdoc_d1_pre(MDOC_ARGS);
static void mdoc_dq_post(MDOC_ARGS);
static int mdoc_er_pre(MDOC_ARGS);
static int mdoc_ev_pre(MDOC_ARGS);
static int mdoc_ex_pre(MDOC_ARGS);
+static void mdoc_fo_post(MDOC_ARGS);
+static int mdoc_fo_pre(MDOC_ARGS);
+static int mdoc_ic_pre(MDOC_ARGS);
+static int mdoc_in_pre(MDOC_ARGS);
static int mdoc_it_pre(MDOC_ARGS);
+static int mdoc_lb_pre(MDOC_ARGS);
+static int mdoc_li_pre(MDOC_ARGS);
static int mdoc_lk_pre(MDOC_ARGS);
static int mdoc_mt_pre(MDOC_ARGS);
+static int mdoc_ms_pre(MDOC_ARGS);
static int mdoc_nd_pre(MDOC_ARGS);
static int mdoc_nm_pre(MDOC_ARGS);
static int mdoc_ns_pre(MDOC_ARGS);
static void mdoc_op_post(MDOC_ARGS);
static int mdoc_op_pre(MDOC_ARGS);
static int mdoc_pa_pre(MDOC_ARGS);
+static void mdoc_pf_post(MDOC_ARGS);
+static int mdoc_pf_pre(MDOC_ARGS);
static void mdoc_pq_post(MDOC_ARGS);
static int mdoc_pq_pre(MDOC_ARGS);
-static void mdoc_qq_post(MDOC_ARGS);
-static int mdoc_qq_pre(MDOC_ARGS);
+static int mdoc_rs_pre(MDOC_ARGS);
+static int mdoc_rv_pre(MDOC_ARGS);
static int mdoc_sh_pre(MDOC_ARGS);
static int mdoc_sp_pre(MDOC_ARGS);
static void mdoc_sq_post(MDOC_ARGS);
static int mdoc_sq_pre(MDOC_ARGS);
static int mdoc_ss_pre(MDOC_ARGS);
static int mdoc_sx_pre(MDOC_ARGS);
+static int mdoc_sy_pre(MDOC_ARGS);
+static int mdoc_ud_pre(MDOC_ARGS);
+static int mdoc_va_pre(MDOC_ARGS);
static int mdoc_vt_pre(MDOC_ARGS);
static int mdoc_xr_pre(MDOC_ARGS);
static int mdoc_xx_pre(MDOC_ARGS);
#endif
static const struct htmlmdoc mdocs[MDOC_MAX] = {
- {NULL, NULL}, /* Ap */
+ {mdoc_ap_pre, NULL}, /* Ap */
{NULL, NULL}, /* Dd */
{NULL, NULL}, /* Dt */
{NULL, NULL}, /* Os */
{mdoc_fl_pre, NULL}, /* Fl */
{mdoc_fn_pre, NULL}, /* Fn */
{mdoc_ft_pre, NULL}, /* Ft */
- {NULL, NULL}, /* Ic */
- {NULL, NULL}, /* In */
- {NULL, NULL}, /* Li */
+ {mdoc_ic_pre, NULL}, /* Ic */
+ {mdoc_in_pre, NULL}, /* In */
+ {mdoc_li_pre, NULL}, /* Li */
{mdoc_nd_pre, NULL}, /* Nd */
{mdoc_nm_pre, NULL}, /* Nm */
{mdoc_op_pre, mdoc_op_post}, /* Op */
{NULL, NULL}, /* Ot */
{mdoc_pa_pre, NULL}, /* Pa */
- {NULL, NULL}, /* Rv */
+ {mdoc_rv_pre, NULL}, /* Rv */
{NULL, NULL}, /* St */
- {NULL, NULL}, /* Va */
+ {mdoc_va_pre, NULL}, /* Va */
{mdoc_vt_pre, NULL}, /* Vt */
{mdoc_xr_pre, NULL}, /* Xr */
- {NULL, NULL}, /* %A */
- {NULL, NULL}, /* %B */
- {NULL, NULL}, /* %D */
- {NULL, NULL}, /* %I */
- {NULL, NULL}, /* %J */
- {NULL, NULL}, /* %N */
- {NULL, NULL}, /* %O */
- {NULL, NULL}, /* %P */
- {NULL, NULL}, /* %R */
- {NULL, NULL}, /* %T */
- {NULL, NULL}, /* %V */
+ {mdoc__x_pre, mdoc__x_post}, /* %A */
+ {mdoc__x_pre, mdoc__x_post}, /* %B */
+ {mdoc__x_pre, mdoc__x_post}, /* %D */
+ {mdoc__x_pre, mdoc__x_post}, /* %I */
+ {mdoc__x_pre, mdoc__x_post}, /* %J */
+ {mdoc__x_pre, mdoc__x_post}, /* %N */
+ {mdoc__x_pre, mdoc__x_post}, /* %O */
+ {mdoc__x_pre, mdoc__x_post}, /* %P */
+ {mdoc__x_pre, mdoc__x_post}, /* %R */
+ {mdoc__x_pre, mdoc__x_post}, /* %T */
+ {mdoc__x_pre, mdoc__x_post}, /* %V */
{NULL, NULL}, /* Ac */
{mdoc_aq_pre, mdoc_aq_post}, /* Ao */
{mdoc_aq_pre, mdoc_aq_post}, /* Aq */
{NULL, NULL}, /* At */
{NULL, NULL}, /* Bc */
- {NULL, NULL}, /* Bf */
- {NULL, NULL}, /* Bo */
- {NULL, NULL}, /* Bq */
+ {mdoc_bf_pre, NULL}, /* Bf */
+ {mdoc_bq_pre, mdoc_bq_post}, /* Bo */
+ {mdoc_bq_pre, mdoc_bq_post}, /* Bq */
{mdoc_xx_pre, NULL}, /* Bsx */
- {NULL, NULL}, /* Bx */
+ {mdoc_bx_pre, NULL}, /* Bx */
{NULL, NULL}, /* Db */
{NULL, NULL}, /* Dc */
- {NULL, NULL}, /* Do */
+ {mdoc_dq_pre, mdoc_dq_post}, /* Do */
{mdoc_dq_pre, mdoc_dq_post}, /* Dq */
{NULL, NULL}, /* Ec */
{NULL, NULL}, /* Ef */
{mdoc_em_pre, NULL}, /* Em */
{NULL, NULL}, /* Eo */
{mdoc_xx_pre, NULL}, /* Fx */
- {NULL, NULL}, /* Ms */
+ {mdoc_ms_pre, NULL}, /* Ms */ /* FIXME: convert to symbol? */
{NULL, NULL}, /* No */
{mdoc_ns_pre, NULL}, /* Ns */
{mdoc_xx_pre, NULL}, /* Nx */
{mdoc_xx_pre, NULL}, /* Ox */
{NULL, NULL}, /* Pc */
- {NULL, NULL}, /* Pf */
+ {mdoc_pf_pre, mdoc_pf_post}, /* Pf */
{mdoc_pq_pre, mdoc_pq_post}, /* Po */
{mdoc_pq_pre, mdoc_pq_post}, /* Pq */
{NULL, NULL}, /* Qc */
- {NULL, NULL}, /* Ql */
- {mdoc_qq_pre, mdoc_qq_post}, /* Qo */
- {mdoc_qq_pre, mdoc_qq_post}, /* Qq */
+ {mdoc_sq_pre, mdoc_sq_post}, /* Ql */
+ {mdoc_dq_pre, mdoc_dq_post}, /* Qo */
+ {mdoc_dq_pre, mdoc_dq_post}, /* Qq */
{NULL, NULL}, /* Re */
- {NULL, NULL}, /* Rs */
+ {mdoc_rs_pre, NULL}, /* Rs */
{NULL, NULL}, /* Sc */
{mdoc_sq_pre, mdoc_sq_post}, /* So */
{mdoc_sq_pre, mdoc_sq_post}, /* Sq */
- {NULL, NULL}, /* Sm */
+ {NULL, NULL}, /* Sm */ /* FIXME - no idea. */
{mdoc_sx_pre, NULL}, /* Sx */
- {NULL, NULL}, /* Sy */
+ {mdoc_sy_pre, NULL}, /* Sy */
{NULL, NULL}, /* Tn */
{mdoc_xx_pre, NULL}, /* Ux */
{NULL, NULL}, /* Xc */
{NULL, NULL}, /* Xo */
- {NULL, NULL}, /* Fo */
+ {mdoc_fo_pre, mdoc_fo_post}, /* Fo */
{NULL, NULL}, /* Fc */
- {NULL, NULL}, /* Oo */
+ {mdoc_op_pre, mdoc_op_post}, /* Oo */
{NULL, NULL}, /* Oc */
{NULL, NULL}, /* Bk */
{NULL, NULL}, /* Ek */
- {NULL, NULL}, /* Bt */
+ {mdoc_bt_pre, NULL}, /* Bt */
{NULL, NULL}, /* Hf */
{NULL, NULL}, /* Fr */
- {NULL, NULL}, /* Ud */
- {NULL, NULL}, /* Lb */
+ {mdoc_ud_pre, NULL}, /* Ud */
+ {mdoc_lb_pre, NULL}, /* Lb */
{mdoc_sp_pre, NULL}, /* Lp */
{mdoc_lk_pre, NULL}, /* Lk */
{mdoc_mt_pre, NULL}, /* Mt */
{mdoc_brq_pre, mdoc_brq_post}, /* Brq */
{mdoc_brq_pre, mdoc_brq_post}, /* Bro */
{NULL, NULL}, /* Brc */
- {NULL, NULL}, /* %C */
+ {mdoc__x_pre, mdoc__x_post}, /* %C */
{NULL, NULL}, /* Es */ /* TODO */
{NULL, NULL}, /* En */ /* TODO */
{mdoc_xx_pre, NULL}, /* Dx */
- {NULL, NULL}, /* %Q */
+ {mdoc__x_pre, mdoc__x_post}, /* %Q */
{mdoc_sp_pre, NULL}, /* br */
{mdoc_sp_pre, NULL}, /* sp */
};
tt = print_otag(h, TAG_TR, 0, NULL);
tag[0].key = ATTR_STYLE;
- tag[0].val = "width: 33%;";
+ tag[0].val = "width: 10%;";
print_otag(h, TAG_TD, 1, tag);
print_text(h, title);
print_stagq(h, tt);
tag[0].key = ATTR_STYLE;
- tag[0].val = "width: 33%; text-align: center;";
+ tag[0].val = "width: 80%; white-space: nowrap; text-align: center;";
print_otag(h, TAG_TD, 1, tag);
print_text(h, b);
print_stagq(h, tt);
tag[0].key = ATTR_STYLE;
- tag[0].val = "width: 33%; text-align: right;";
+ tag[0].val = "width: 10%; text-align: right;";
print_otag(h, TAG_TD, 1, tag);
print_text(h, title);
print_tagq(h, t);
}
+/* ARGSUSED */
+static int
+mdoc_bx_pre(MDOC_ARGS)
+{
+ const struct mdoc_node *nn;
+ struct htmlpair tag;
+
+ tag.key = ATTR_CLASS;
+ tag.val = "unix";
+
+ print_otag(h, TAG_SPAN, 1, &tag);
+
+ for (nn = n->child; nn; nn = nn->next)
+ print_mdoc_node(m, nn, h);
+
+ if (n->child)
+ h->flags |= HTML_NOSPACE;
+
+ print_text(h, "BSD");
+ return(0);
+}
+
+
/* ARGSUSED */
static int
mdoc_tbl_block_pre(MDOC_ARGS, int t, int w, int o, int c)
print_otag(h, TAG_DIV, 1, &tag);
break;
default:
- buffmt("margin-left: -%dem; width: %dem;", w, w);
+ buffmt("margin-left: -%dem; min-width: %dem;",
+ w, w ? w - 1 : 0);
bufcat("clear: left;");
if (n->next && n->next->child)
bufcat("float: left;");
print_text(h, "\\(en");
return(0);
case (MDOC_Hyphen):
- print_text(h, "\\-");
+ print_text(h, "\\(hy");
return(0);
case (MDOC_Bullet):
print_text(h, "\\(bu");
buffmt("margin-left: %dem;", INDENT);
tag[0].key = ATTR_CLASS;
- tag[0].val = "lit-block";
+ tag[0].val = "lit";
tag[1].key = ATTR_STYLE;
tag[1].val = buf;
switch (bl->args->argv[i].arg) {
case (MDOC_Offset):
assert(bl->args->argv[i].sz);
- o = a2offs (bl->args->argv[i].value[0]);
+ o = a2offs(bl->args->argv[i].value[0]);
break;
case (MDOC_Compact):
c = 1;
tag[0].key = ATTR_STYLE;
tag[0].val = buf;
tag[1].key = ATTR_CLASS;
- tag[1].val = "lit-block";
+ tag[1].val = "lit";
print_otag(h, TAG_DIV, 2, tag);
}
-/* ARGSUSED */
-static int
-mdoc_qq_pre(MDOC_ARGS)
-{
-
- if (MDOC_BODY != n->type)
- return(1);
- print_text(h, "\\*q");
- h->flags |= HTML_NOSPACE;
- return(1);
-}
-
-
-/* ARGSUSED */
-static void
-mdoc_qq_post(MDOC_ARGS)
-{
-
- if (MDOC_BODY != n->type)
- return;
- h->flags |= HTML_NOSPACE;
- print_text(h, "\\*q");
-}
-
-
/* ARGSUSED */
static int
mdoc_ad_pre(MDOC_ARGS)
if (SEC_SYNOPSIS == n->sec) {
if (n->prev && MDOC_Fo == n->prev->tok) {
tag.key = ATTR_STYLE;
- tag.val = "magin-bottom: 1em;";
+ tag.val = "margin-top: 1em;";
print_otag(h, TAG_DIV, 1, &tag);
} else
print_otag(h, TAG_DIV, 0, NULL);
}
tag.key = ATTR_CLASS;
- tag.val = "type";
+ tag.val = "ftype";
print_otag(h, TAG_SPAN, 1, &tag);
return(1);
}
struct tag *t;
struct htmlpair tag;
const struct mdoc_node *nn;
+ char nbuf[BUFSIZ];
+ const char *sp, *ep;
+ int sz;
if (SEC_SYNOPSIS == n->sec) {
if (n->next) {
print_otag(h, TAG_DIV, 0, NULL);
}
+ /* Split apart into type and name. */
+
tag.key = ATTR_CLASS;
- tag.val = "type";
+ tag.val = "ftype";
+ t = print_otag(h, TAG_SPAN, 1, &tag);
+ assert(n->child->string);
+ sp = n->child->string;
+ while (NULL != (ep = strchr(sp, ' '))) {
+ sz = MIN((int)(ep - sp), BUFSIZ - 1);
+ (void)memcpy(nbuf, sp, (size_t)sz);
+ nbuf[sz] = '\0';
+ print_text(h, nbuf);
+ sp = ++ep;
+ }
+
+ print_tagq(h, t);
+
+ tag.key = ATTR_CLASS;
+ tag.val = "fname";
t = print_otag(h, TAG_SPAN, 1, &tag);
- print_text(h, n->child->string);
+
+ if (sp) {
+ (void)strlcpy(nbuf, sp, BUFSIZ);
+ print_text(h, nbuf);
+ }
+
print_tagq(h, t);
h->flags |= HTML_NOSPACE;
return(0);
}
+
+
+/* ARGSUSED */
+static int
+mdoc_fo_pre(MDOC_ARGS)
+{
+ struct htmlpair tag;
+
+ if (MDOC_BODY == n->type) {
+ h->flags |= HTML_NOSPACE;
+ print_text(h, "(");
+ h->flags |= HTML_NOSPACE;
+ return(1);
+ } else if (MDOC_BLOCK == n->type)
+ return(1);
+
+ tag.key = ATTR_CLASS;
+ tag.val = "fname";
+ print_otag(h, TAG_SPAN, 1, &tag);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+mdoc_fo_post(MDOC_ARGS)
+{
+ if (MDOC_BODY != n->type)
+ return;
+ h->flags |= HTML_NOSPACE;
+ print_text(h, ")");
+ h->flags |= HTML_NOSPACE;
+ print_text(h, ";");
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_in_pre(MDOC_ARGS)
+{
+ const struct mdoc_node *nn;
+ struct htmlpair tag;
+
+ if (SEC_SYNOPSIS == n->sec) {
+ if (n->next && MDOC_In != n->next->tok) {
+ tag.key = ATTR_STYLE;
+ tag.val = "margin-bottom: 1em;";
+ print_otag(h, TAG_DIV, 1, &tag);
+ } else
+ print_otag(h, TAG_DIV, 0, NULL);
+ }
+
+ tag.key = ATTR_CLASS;
+ tag.val = "includes";
+
+ print_otag(h, TAG_SPAN, 1, &tag);
+
+ if (SEC_SYNOPSIS == n->sec)
+ print_text(h, "#include");
+
+ print_text(h, "<");
+ h->flags |= HTML_NOSPACE;
+
+ /* XXX -- see warning in termp_in_post(). */
+
+ for (nn = n->child; nn; nn = nn->next)
+ print_mdoc_node(m, nn, h);
+
+ h->flags |= HTML_NOSPACE;
+ print_text(h, ">");
+
+ return(0);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_ic_pre(MDOC_ARGS)
+{
+ struct htmlpair tag;
+
+ tag.key = ATTR_CLASS;
+ tag.val = "cmd";
+
+ print_otag(h, TAG_SPAN, 1, &tag);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_rv_pre(MDOC_ARGS)
+{
+ const struct mdoc_node *nn;
+ struct htmlpair tag;
+ struct tag *t;
+
+ print_otag(h, TAG_DIV, 0, NULL);
+
+ print_text(h, "The");
+
+ for (nn = n->child; nn; nn = nn->next) {
+ tag.key = ATTR_CLASS;
+ tag.val = "fname";
+ t = print_otag(h, TAG_SPAN, 1, &tag);
+ print_text(h, nn->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, "()");
+ }
+
+ if (n->child->next)
+ print_text(h, "functions return");
+ else
+ print_text(h, "function returns");
+
+ print_text(h, "the value 0 if successful; otherwise the value "
+ "-1 is returned and the global variable");
+
+ tag.key = ATTR_CLASS;
+ tag.val = "var";
+ t = print_otag(h, TAG_SPAN, 1, &tag);
+ print_text(h, "errno");
+ print_tagq(h, t);
+ print_text(h, "is set to indicate the error.");
+ return(0);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_va_pre(MDOC_ARGS)
+{
+ struct htmlpair tag;
+
+ tag.key = ATTR_CLASS;
+ tag.val = "var";
+ print_otag(h, TAG_SPAN, 1, &tag);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_bq_pre(MDOC_ARGS)
+{
+
+ if (MDOC_BODY != n->type)
+ return(1);
+ print_text(h, "\\(lB");
+ h->flags |= HTML_NOSPACE;
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+mdoc_bq_post(MDOC_ARGS)
+{
+
+ if (MDOC_BODY != n->type)
+ return;
+ h->flags |= HTML_NOSPACE;
+ print_text(h, "\\(rB");
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_ap_pre(MDOC_ARGS)
+{
+
+ h->flags |= HTML_NOSPACE;
+ print_text(h, "\\(aq");
+ h->flags |= HTML_NOSPACE;
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_bf_pre(MDOC_ARGS)
+{
+ int i;
+ struct htmlpair tag[2];
+
+ if (MDOC_HEAD == n->type)
+ return(0);
+ else if (MDOC_BLOCK != n->type)
+ return(1);
+
+ tag[0].key = ATTR_CLASS;
+ tag[0].val = NULL;
+
+ if (n->head->child) {
+ if ( ! strcmp("Em", n->head->child->string))
+ tag[0].val = "emph";
+ else if ( ! strcmp("Sy", n->head->child->string))
+ tag[0].val = "symb";
+ else if ( ! strcmp("Li", n->head->child->string))
+ tag[0].val = "lit";
+ } else {
+ assert(n->args);
+ for (i = 0; i < (int)n->args->argc; i++)
+ switch (n->args->argv[i].arg) {
+ case (MDOC_Symbolic):
+ tag[0].val = "symb";
+ break;
+ case (MDOC_Literal):
+ tag[0].val = "lit";
+ break;
+ case (MDOC_Emphasis):
+ tag[0].val = "emph";
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* FIXME: div's have spaces stripped--we want them. */
+
+ assert(tag[0].val);
+ tag[1].key = ATTR_STYLE;
+ tag[1].val = "display: inline; margin-right: 1em;";
+ print_otag(h, TAG_DIV, 2, tag);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_ms_pre(MDOC_ARGS)
+{
+ struct htmlpair tag;
+
+ tag.key = ATTR_CLASS;
+ tag.val = "symb";
+ print_otag(h, TAG_SPAN, 1, &tag);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_pf_pre(MDOC_ARGS)
+{
+
+ h->flags |= HTML_IGNDELIM;
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+mdoc_pf_post(MDOC_ARGS)
+{
+
+ h->flags &= ~HTML_IGNDELIM;
+ h->flags |= HTML_NOSPACE;
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_rs_pre(MDOC_ARGS)
+{
+ struct htmlpair tag;
+
+ if (MDOC_BLOCK != n->type)
+ return(1);
+
+ if (n->prev && SEC_SEE_ALSO == n->sec) {
+ tag.key = ATTR_STYLE;
+ tag.val = "margin-top: 1em;";
+ print_otag(h, TAG_DIV, 1, &tag);
+ }
+
+ tag.key = ATTR_CLASS;
+ tag.val = "ref";
+ print_otag(h, TAG_SPAN, 1, &tag);
+ return(1);
+}
+
+
+
+/* ARGSUSED */
+static int
+mdoc_li_pre(MDOC_ARGS)
+{
+ struct htmlpair tag;
+
+ tag.key = ATTR_CLASS;
+ tag.val = "lit";
+
+ print_otag(h, TAG_SPAN, 1, &tag);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_sy_pre(MDOC_ARGS)
+{
+ struct htmlpair tag;
+
+ tag.key = ATTR_CLASS;
+ tag.val = "symb";
+
+ print_otag(h, TAG_SPAN, 1, &tag);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_bt_pre(MDOC_ARGS)
+{
+
+ print_text(h, "is currently in beta test.");
+ return(0);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_ud_pre(MDOC_ARGS)
+{
+
+ print_text(h, "currently under development.");
+ return(0);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc_lb_pre(MDOC_ARGS)
+{
+ struct htmlpair tag;
+
+ tag.key = ATTR_CLASS;
+ tag.val = "lib";
+
+ if (SEC_SYNOPSIS == n->sec)
+ print_otag(h, TAG_DIV, 0, NULL);
+
+ print_otag(h, TAG_SPAN, 1, &tag);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+mdoc__x_pre(MDOC_ARGS)
+{
+ struct htmlpair tag;
+
+ tag.key = ATTR_CLASS;
+
+ switch (n->tok) {
+ case(MDOC__A):
+ tag.val = "ref-auth";
+ break;
+ case(MDOC__B):
+ tag.val = "ref-book";
+ break;
+ case(MDOC__C):
+ tag.val = "ref-city";
+ break;
+ case(MDOC__D):
+ tag.val = "ref-date";
+ break;
+ case(MDOC__I):
+ tag.val = "ref-issue";
+ break;
+ case(MDOC__J):
+ tag.val = "ref-jrnl";
+ break;
+ case(MDOC__N):
+ tag.val = "ref-num";
+ break;
+ case(MDOC__O):
+ tag.val = "ref-opt";
+ break;
+ case(MDOC__P):
+ tag.val = "ref-page";
+ break;
+ case(MDOC__Q):
+ tag.val = "ref-corp";
+ break;
+ case(MDOC__R):
+ tag.val = "ref-rep";
+ break;
+ case(MDOC__T):
+ print_text(h, "\\(lq");
+ h->flags |= HTML_NOSPACE;
+ tag.val = "ref-title";
+ break;
+ case(MDOC__V):
+ tag.val = "ref-vol";
+ break;
+ default:
+ abort();
+ /* NOTREACHED */
+ }
+
+ print_otag(h, TAG_SPAN, 1, &tag);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+mdoc__x_post(MDOC_ARGS)
+{
+
+ h->flags |= HTML_NOSPACE;
+ switch (n->tok) {
+ case (MDOC__T):
+ print_text(h, "\\(rq");
+ h->flags |= HTML_NOSPACE;
+ break;
+ default:
+ break;
+ }
+ print_text(h, n->next ? "," : ".");
+}