aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-01-17 01:47:51 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-01-17 01:47:51 +0000
commit24fd28849fa784bd04e3f5bbdb7152253c5d68ba (patch)
tree815cb714ddc062542177ba1156b3ddf9d58061f5
parentebd515705cd44f744240e095a723a476fb6a95ef (diff)
downloadmandoc-24fd28849fa784bd04e3f5bbdb7152253c5d68ba.tar.gz
mandoc-24fd28849fa784bd04e3f5bbdb7152253c5d68ba.tar.zst
mandoc-24fd28849fa784bd04e3f5bbdb7152253c5d68ba.zip
Simplify the usage of print_otag() by making it accept a variable
number of arguments. Delete struct htmlpair and all the PAIR_*() macros. Delete enum htmlattr, handle that in print_otag() instead. Minus 190 lines of code; no functional change except better ordering of attributes (class before style) in three cases.
-rw-r--r--eqn_html.c64
-rw-r--r--html.c185
-rw-r--r--html.h39
-rw-r--r--man_html.c139
-rw-r--r--mandoc_html.3133
-rw-r--r--mdoc_html.c562
-rw-r--r--tbl_html.c32
7 files changed, 497 insertions, 657 deletions
diff --git a/eqn_html.c b/eqn_html.c
index f2973361..b6e7d914 100644
--- a/eqn_html.c
+++ b/eqn_html.c
@@ -1,6 +1,7 @@
-/* $Id: eqn_html.c,v 1.10 2014/10/12 19:31:41 schwarze Exp $ */
+/* $Id: eqn_html.c,v 1.11 2017/01/17 01:47:51 schwarze Exp $ */
/*
* Copyright (c) 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -31,7 +32,6 @@ static void
eqn_box(struct html *p, const struct eqn_box *bp)
{
struct tag *post, *row, *cell, *t;
- struct htmlpair tag[2];
const struct eqn_box *child, *parent;
size_t i, j, rows;
@@ -59,10 +59,10 @@ eqn_box(struct html *p, const struct eqn_box *bp)
for (rows = 0; NULL != child; rows++)
child = child->next;
/* Print row-by-row. */
- post = print_otag(p, TAG_MTABLE, 0, NULL);
+ post = print_otag(p, TAG_MTABLE, "");
for (i = 0; i < rows; i++) {
parent = bp->first->first;
- row = print_otag(p, TAG_MTR, 0, NULL);
+ row = print_otag(p, TAG_MTR, "");
while (NULL != parent) {
child = parent->first;
for (j = 0; j < i; j++) {
@@ -70,8 +70,7 @@ eqn_box(struct html *p, const struct eqn_box *bp)
break;
child = child->next;
}
- cell = print_otag
- (p, TAG_MTD, 0, NULL);
+ cell = print_otag(p, TAG_MTD, "");
/*
* If we have no data for this
* particular cell, then print a
@@ -89,28 +88,28 @@ eqn_box(struct html *p, const struct eqn_box *bp)
switch (bp->pos) {
case (EQNPOS_TO):
- post = print_otag(p, TAG_MOVER, 0, NULL);
+ post = print_otag(p, TAG_MOVER, "");
break;
case (EQNPOS_SUP):
- post = print_otag(p, TAG_MSUP, 0, NULL);
+ post = print_otag(p, TAG_MSUP, "");
break;
case (EQNPOS_FROM):
- post = print_otag(p, TAG_MUNDER, 0, NULL);
+ post = print_otag(p, TAG_MUNDER, "");
break;
case (EQNPOS_SUB):
- post = print_otag(p, TAG_MSUB, 0, NULL);
+ post = print_otag(p, TAG_MSUB, "");
break;
case (EQNPOS_OVER):
- post = print_otag(p, TAG_MFRAC, 0, NULL);
+ post = print_otag(p, TAG_MFRAC, "");
break;
case (EQNPOS_FROMTO):
- post = print_otag(p, TAG_MUNDEROVER, 0, NULL);
+ post = print_otag(p, TAG_MUNDEROVER, "");
break;
case (EQNPOS_SUBSUP):
- post = print_otag(p, TAG_MSUBSUP, 0, NULL);
+ post = print_otag(p, TAG_MSUBSUP, "");
break;
case (EQNPOS_SQRT):
- post = print_otag(p, TAG_MSQRT, 0, NULL);
+ post = print_otag(p, TAG_MSQRT, "");
break;
default:
break;
@@ -119,52 +118,49 @@ eqn_box(struct html *p, const struct eqn_box *bp)
if (bp->top || bp->bottom) {
assert(NULL == post);
if (bp->top && NULL == bp->bottom)
- post = print_otag(p, TAG_MOVER, 0, NULL);
+ post = print_otag(p, TAG_MOVER, "");
else if (bp->top && bp->bottom)
- post = print_otag(p, TAG_MUNDEROVER, 0, NULL);
+ post = print_otag(p, TAG_MUNDEROVER, "");
else if (bp->bottom)
- post = print_otag(p, TAG_MUNDER, 0, NULL);
+ post = print_otag(p, TAG_MUNDER, "");
}
if (EQN_PILE == bp->type) {
assert(NULL == post);
if (bp->first != NULL && bp->first->type == EQN_LIST)
- post = print_otag(p, TAG_MTABLE, 0, NULL);
+ post = print_otag(p, TAG_MTABLE, "");
} else if (bp->type == EQN_LIST &&
bp->parent && bp->parent->type == EQN_PILE) {
assert(NULL == post);
- post = print_otag(p, TAG_MTR, 0, NULL);
- print_otag(p, TAG_MTD, 0, NULL);
+ post = print_otag(p, TAG_MTR, "");
+ print_otag(p, TAG_MTD, "");
}
if (NULL != bp->text) {
assert(NULL == post);
- post = print_otag(p, TAG_MI, 0, NULL);
+ post = print_otag(p, TAG_MI, "");
print_text(p, bp->text);
} else if (NULL == post) {
- if (NULL != bp->left || NULL != bp->right) {
- PAIR_INIT(&tag[0], ATTR_OPEN,
- NULL == bp->left ? "" : bp->left);
- PAIR_INIT(&tag[1], ATTR_CLOSE,
- NULL == bp->right ? "" : bp->right);
- post = print_otag(p, TAG_MFENCED, 2, tag);
- }
+ if (NULL != bp->left || NULL != bp->right)
+ post = print_otag(p, TAG_MFENCED, "??",
+ "open", bp->left == NULL ? "" : bp->left,
+ "close", bp->right == NULL ? "" : bp->right);
if (NULL == post)
- post = print_otag(p, TAG_MROW, 0, NULL);
+ post = print_otag(p, TAG_MROW, "");
else
- print_otag(p, TAG_MROW, 0, NULL);
+ print_otag(p, TAG_MROW, "");
}
eqn_box(p, bp->first);
out:
if (NULL != bp->bottom) {
- t = print_otag(p, TAG_MO, 0, NULL);
+ t = print_otag(p, TAG_MO, "");
print_text(p, bp->bottom);
print_tagq(p, t);
}
if (NULL != bp->top) {
- t = print_otag(p, TAG_MO, 0, NULL);
+ t = print_otag(p, TAG_MO, "");
print_text(p, bp->top);
print_tagq(p, t);
}
@@ -178,11 +174,9 @@ out:
void
print_eqn(struct html *p, const struct eqn *ep)
{
- struct htmlpair tag;
struct tag *t;
- PAIR_CLASS_INIT(&tag, "eqn");
- t = print_otag(p, TAG_MATH, 1, &tag);
+ t = print_otag(p, TAG_MATH, "c", "eqn");
p->flags |= HTML_NONOSPACE;
eqn_box(p, ep->root);
diff --git a/html.c b/html.c
index d49e2f3b..1498f8db 100644
--- a/html.c
+++ b/html.c
@@ -1,7 +1,7 @@
-/* $Id: html.c,v 1.193 2017/01/08 16:38:26 schwarze Exp $ */
+/* $Id: html.c,v 1.194 2017/01/17 01:47:51 schwarze Exp $ */
/*
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2011-2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011-2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -92,22 +92,6 @@ static const struct htmldata htmltags[TAG_MAX] = {
{"mover", 0}, /* TAG_MOVER*/
};
-static const char *const htmlattrs[ATTR_MAX] = {
- "name", /* ATTR_NAME */
- "rel", /* ATTR_REL */
- "href", /* ATTR_HREF */
- "type", /* ATTR_TYPE */
- "media", /* ATTR_MEDIA */
- "class", /* ATTR_CLASS */
- "style", /* ATTR_STYLE */
- "id", /* ATTR_ID */
- "colspan", /* ATTR_COLSPAN */
- "charset", /* ATTR_CHARSET */
- "open", /* ATTR_OPEN */
- "close", /* ATTR_CLOSE */
- "mathvariant", /* ATTR_MATHVARIANT */
-};
-
static const char *const roffscales[SCALE_MAX] = {
"cm", /* SCALE_CM */
"in", /* SCALE_IN */
@@ -121,6 +105,7 @@ static const char *const roffscales[SCALE_MAX] = {
"ex", /* SCALE_FS */
};
+static void a2width(const char *, struct roffsu *);
static void bufncat(struct html *, const char *, size_t);
static void print_ctag(struct html *, struct tag *);
static int print_escape(char);
@@ -165,17 +150,14 @@ html_free(void *p)
void
print_gen_head(struct html *h)
{
- struct htmlpair tag[4];
struct tag *t;
- tag[0].key = ATTR_CHARSET;
- tag[0].val = "utf-8";
- print_otag(h, TAG_META, 1, tag);
+ print_otag(h, TAG_META, "?", "charset", "utf-8");
/*
* Print a default style-sheet.
*/
- t = print_otag(h, TAG_STYLE, 0, NULL);
+ t = print_otag(h, TAG_STYLE, "");
print_text(h, "table.head, table.foot { width: 100%; }\n"
"td.head-rtitle, td.foot-os { text-align: right; }\n"
"td.head-vol { text-align: center; }\n"
@@ -184,17 +166,9 @@ print_gen_head(struct html *h)
"div.spacer { margin: 1em 0; }\n");
print_tagq(h, t);
- if (h->style) {
- tag[0].key = ATTR_REL;
- tag[0].val = "stylesheet";
- tag[1].key = ATTR_HREF;
- tag[1].val = h->style;
- tag[2].key = ATTR_TYPE;
- tag[2].val = "text/css";
- tag[3].key = ATTR_MEDIA;
- tag[3].val = "all";
- print_otag(h, TAG_LINK, 4, tag);
- }
+ if (h->style)
+ print_otag(h, TAG_LINK, "?h??", "rel", "stylesheet",
+ h->style, "type", "text/css", "media", "all");
}
static void
@@ -233,14 +207,14 @@ print_metaf(struct html *h, enum mandoc_esc deco)
switch (font) {
case HTMLFONT_ITALIC:
- h->metaf = print_otag(h, TAG_I, 0, NULL);
+ h->metaf = print_otag(h, TAG_I, "");
break;
case HTMLFONT_BOLD:
- h->metaf = print_otag(h, TAG_B, 0, NULL);
+ h->metaf = print_otag(h, TAG_B, "");
break;
case HTMLFONT_BI:
- h->metaf = print_otag(h, TAG_B, 0, NULL);
- print_otag(h, TAG_I, 0, NULL);
+ h->metaf = print_otag(h, TAG_B, "");
+ print_otag(h, TAG_I, "");
break;
default:
break;
@@ -433,11 +407,13 @@ print_attr(struct html *h, const char *key, const char *val)
}
struct tag *
-print_otag(struct html *h, enum htmltag tag,
- int sz, const struct htmlpair *p)
+print_otag(struct html *h, enum htmltag tag, const char *fmt, ...)
{
- int i;
+ va_list ap;
+ struct roffsu mysu, *su;
struct tag *t;
+ char *s;
+ int i, have_style;
/* Push this tags onto the stack of open scopes. */
@@ -468,8 +444,104 @@ print_otag(struct html *h, enum htmltag tag,
/* Print out the tag name and attributes. */
printf("<%s", htmltags[tag].name);
- for (i = 0; i < sz; i++)
- print_attr(h, htmlattrs[p[i].key], p[i].val);
+
+ va_start(ap, fmt);
+
+ have_style = 0;
+ while (*fmt != '\0') {
+ if (*fmt == 's') {
+ printf(" style=\"");
+ have_style = 1;
+ fmt++;
+ break;
+ }
+ s = va_arg(ap, char *);
+ switch (*fmt++) {
+ case 'c':
+ print_attr(h, "class", s);
+ break;
+ case 'h':
+ print_attr(h, "href", s);
+ break;
+ case 'i':
+ print_attr(h, "id", s);
+ break;
+ case '?':
+ print_attr(h, s, va_arg(ap, char *));
+ break;
+ default:
+ abort();
+ }
+ }
+
+ /* Print out styles. */
+
+ s = NULL;
+ su = &mysu;
+ while (*fmt != '\0') {
+
+ /* First letter: input argument type. */
+
+ switch (*fmt++) {
+ case 'h':
+ i = va_arg(ap, int);
+ SCALE_HS_INIT(su, i);
+ break;
+ case 's':
+ s = va_arg(ap, char *);
+ break;
+ case 'u':
+ su = va_arg(ap, struct roffsu *);
+ break;
+ case 'v':
+ i = va_arg(ap, int);
+ SCALE_VS_INIT(su, i);
+ break;
+ case 'w':
+ s = va_arg(ap, char *);
+ a2width(s, su);
+ break;
+ default:
+ abort();
+ }
+
+ /* Second letter: style name. */
+
+ bufinit(h);
+ switch (*fmt++) {
+ case 'b':
+ bufcat_su(h, "margin-bottom", su);
+ break;
+ case 'h':
+ bufcat_su(h, "height", su);
+ break;
+ case 'i':
+ bufcat_su(h, "text-indent", su);
+ break;
+ case 'l':
+ bufcat_su(h, "margin-left", su);
+ break;
+ case 't':
+ bufcat_su(h, "margin-top", su);
+ break;
+ case 'w':
+ bufcat_su(h, "width", su);
+ break;
+ case 'W':
+ bufcat_su(h, "min-width", su);
+ break;
+ case '?':
+ bufcat_style(h, s, va_arg(ap, char *));
+ break;
+ default:
+ abort();
+ }
+ printf("%s", h->buf);
+ }
+ if (have_style)
+ putchar('"');
+
+ va_end(ap);
/* Accommodate for "well-formed" singleton escaping. */
@@ -533,14 +605,14 @@ print_text(struct html *h, const char *word)
assert(NULL == h->metaf);
switch (h->metac) {
case HTMLFONT_ITALIC:
- h->metaf = print_otag(h, TAG_I, 0, NULL);
+ h->metaf = print_otag(h, TAG_I, "");
break;
case HTMLFONT_BOLD:
- h->metaf = print_otag(h, TAG_B, 0, NULL);
+ h->metaf = print_otag(h, TAG_B, "");
break;
case HTMLFONT_BI:
- h->metaf = print_otag(h, TAG_B, 0, NULL);
- print_otag(h, TAG_I, 0, NULL);
+ h->metaf = print_otag(h, TAG_B, "");
+ print_otag(h, TAG_I, "");
break;
default:
break;
@@ -590,14 +662,27 @@ void
print_paragraph(struct html *h)
{
struct tag *t;
- struct htmlpair tag;
- PAIR_CLASS_INIT(&tag, "spacer");
- t = print_otag(h, TAG_DIV, 1, &tag);
+ t = print_otag(h, TAG_DIV, "c", "spacer");
print_tagq(h, t);
}
+/*
+ * Calculate the scaling unit passed in a `-width' argument. This uses
+ * either a native scaling unit (e.g., 1i, 2m) or the string length of
+ * the value.
+ */
+static void
+a2width(const char *p, struct roffsu *su)
+{
+ if (a2roffsu(p, su, SCALE_MAX) < 2) {
+ su->unit = SCALE_EN;
+ su->scale = html_strlen(p);
+ } else if (su->scale < 0.0)
+ su->scale = 0.0;
+}
+
void
bufinit(struct html *h)
{
diff --git a/html.h b/html.h
index 89e3f89c..dfcfb534 100644
--- a/html.h
+++ b/html.h
@@ -1,6 +1,7 @@
-/* $Id: html.h,v 1.73 2016/07/19 13:36:13 schwarze Exp $ */
+/* $Id: html.h,v 1.74 2017/01/17 01:47:51 schwarze Exp $ */
/*
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -65,23 +66,6 @@ enum htmltag {
TAG_MAX
};
-enum htmlattr {
- ATTR_NAME,
- ATTR_REL,
- ATTR_HREF,
- ATTR_TYPE,
- ATTR_MEDIA,
- ATTR_CLASS,
- ATTR_STYLE,
- ATTR_ID,
- ATTR_COLSPAN,
- ATTR_CHARSET,
- ATTR_OPEN,
- ATTR_CLOSE,
- ATTR_MATHVARIANT,
- ATTR_MAX
-};
-
enum htmlfont {
HTMLFONT_NONE = 0,
HTMLFONT_BOLD,
@@ -99,22 +83,6 @@ struct tagq {
struct tag *head;
};
-struct htmlpair {
- enum htmlattr key;
- const char *val;
-};
-
-#define PAIR_INIT(p, t, v) \
- do { \
- (p)->key = (t); \
- (p)->val = (v); \
- } while (/* CONSTCOND */ 0)
-
-#define PAIR_ID_INIT(p, v) PAIR_INIT(p, ATTR_ID, v)
-#define PAIR_CLASS_INIT(p, v) PAIR_INIT(p, ATTR_CLASS, v)
-#define PAIR_HREF_INIT(p, v) PAIR_INIT(p, ATTR_HREF, v)
-#define PAIR_STYLE_INIT(p, h) PAIR_INIT(p, ATTR_STYLE, (h)->buf)
-
struct html {
int flags;
#define HTML_NOSPACE (1 << 0) /* suppress next space */
@@ -148,8 +116,7 @@ struct eqn;
void print_gen_decls(struct html *);
void print_gen_head(struct html *);
-struct tag *print_otag(struct html *, enum htmltag,
- int, const struct htmlpair *);
+struct tag *print_otag(struct html *, enum htmltag, const char *, ...);
void print_tagq(struct html *, const struct tag *);
void print_stagq(struct html *, const struct tag *);
void print_text(struct html *, const char *);
diff --git a/man_html.c b/man_html.c
index f425d14d..9afcde06 100644
--- a/man_html.c
+++ b/man_html.c
@@ -1,7 +1,7 @@
-/* $Id: man_html.c,v 1.121 2017/01/10 13:47:00 schwarze Exp $ */
+/* $Id: man_html.c,v 1.122 2017/01/17 01:47:51 schwarze Exp $ */
/*
* Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2013, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -147,24 +147,22 @@ void
html_man(void *arg, const struct roff_man *man)
{
struct mhtml mh;
- struct htmlpair tag;
struct html *h;
struct tag *t, *tt;
memset(&mh, 0, sizeof(mh));
- PAIR_CLASS_INIT(&tag, "mandoc");
h = (struct html *)arg;
if ( ! (HTML_FRAGMENT & h->oflags)) {
print_gen_decls(h);
- t = print_otag(h, TAG_HTML, 0, NULL);
- tt = print_otag(h, TAG_HEAD, 0, NULL);
+ t = print_otag(h, TAG_HTML, "");
+ tt = print_otag(h, TAG_HEAD, "");
print_man_head(&man->meta, man->first, &mh, h);
print_tagq(h, tt);
- print_otag(h, TAG_BODY, 0, NULL);
- print_otag(h, TAG_DIV, 1, &tag);
+ print_otag(h, TAG_BODY, "");
+ print_otag(h, TAG_DIV, "c", "mandoc");
} else
- t = print_otag(h, TAG_DIV, 1, &tag);
+ t = print_otag(h, TAG_DIV, "c", "mandoc");
print_man_nodelist(&man->meta, man->first, &mh, h);
print_tagq(h, t);
@@ -178,8 +176,9 @@ print_man_head(MAN_ARGS)
print_gen_head(h);
assert(man->title);
assert(man->msec);
+ bufinit(h);
bufcat_fmt(h, "%s(%s)", man->title, man->msec);
- print_otag(h, TAG_TITLE, 0, NULL);
+ print_otag(h, TAG_TITLE, "");
print_text(h, h->buf);
}
@@ -214,7 +213,7 @@ print_man_node(MAN_ARGS)
if (n->flags & NODE_LINE && (*n->string == ' ' ||
(n->prev != NULL && mh->fl & MANH_LITERAL &&
! (h->flags & HTML_NONEWLINE))))
- print_otag(h, TAG_BR, 0, NULL);
+ print_otag(h, TAG_BR, "");
print_text(h, n->string);
return;
case ROFFT_EQN:
@@ -288,7 +287,6 @@ a2width(const struct roff_node *n, struct roffsu *su)
static void
man_root_pre(MAN_ARGS)
{
- struct htmlpair tag;
struct tag *t, *tt;
char *title;
@@ -296,26 +294,20 @@ man_root_pre(MAN_ARGS)
assert(man->msec);
mandoc_asprintf(&title, "%s(%s)", man->title, man->msec);
- PAIR_CLASS_INIT(&tag, "head");
- t = print_otag(h, TAG_TABLE, 1, &tag);
-
- print_otag(h, TAG_TBODY, 0, NULL);
-
- tt = print_otag(h, TAG_TR, 0, NULL);
+ t = print_otag(h, TAG_TABLE, "c", "head");
+ print_otag(h, TAG_TBODY, "");
+ tt = print_otag(h, TAG_TR, "");
- PAIR_CLASS_INIT(&tag, "head-ltitle");
- print_otag(h, TAG_TD, 1, &tag);
+ print_otag(h, TAG_TD, "c", "head-ltitle");
print_text(h, title);
print_stagq(h, tt);
- PAIR_CLASS_INIT(&tag, "head-vol");
- print_otag(h, TAG_TD, 1, &tag);
+ print_otag(h, TAG_TD, "c", "head-vol");
if (NULL != man->vol)
print_text(h, man->vol);
print_stagq(h, tt);
- PAIR_CLASS_INIT(&tag, "head-rtitle");
- print_otag(h, TAG_TD, 1, &tag);
+ print_otag(h, TAG_TD, "c", "head-rtitle");
print_text(h, title);
print_tagq(h, t);
free(title);
@@ -324,24 +316,16 @@ man_root_pre(MAN_ARGS)
static void
man_root_post(MAN_ARGS)
{
- struct htmlpair tag;
struct tag *t, *tt;
- PAIR_CLASS_INIT(&tag, "foot");
- t = print_otag(h, TAG_TABLE, 1, &tag);
-
- tt = print_otag(h, TAG_TR, 0, NULL);
-
- PAIR_CLASS_INIT(&tag, "foot-date");
- print_otag(h, TAG_TD, 1, &tag);
+ t = print_otag(h, TAG_TABLE, "c", "foot");
+ tt = print_otag(h, TAG_TR, "");
- assert(man->date);
+ print_otag(h, TAG_TD, "c", "foot-date");
print_text(h, man->date);
print_stagq(h, tt);
- PAIR_CLASS_INIT(&tag, "foot-os");
- print_otag(h, TAG_TD, 1, &tag);
-
+ print_otag(h, TAG_TD, "c", "foot-os");
if (man->os)
print_text(h, man->os);
print_tagq(h, t);
@@ -352,7 +336,6 @@ static int
man_br_pre(MAN_ARGS)
{
struct roffsu su;
- struct htmlpair tag;
SCALE_VS_INIT(&su, 1);
@@ -363,10 +346,7 @@ man_br_pre(MAN_ARGS)
} else
su.scale = 0.0;
- bufinit(h);
- bufcat_su(h, "height", &su);
- PAIR_STYLE_INIT(&tag, h);
- print_otag(h, TAG_DIV, 1, &tag);
+ print_otag(h, TAG_DIV, "suh", &su);
/* So the div isn't empty: */
print_text(h, "\\~");
@@ -377,17 +357,14 @@ man_br_pre(MAN_ARGS)
static int
man_SH_pre(MAN_ARGS)
{
- struct htmlpair tag;
-
if (n->type == ROFFT_BLOCK) {
mh->fl &= ~MANH_LITERAL;
- PAIR_CLASS_INIT(&tag, "section");
- print_otag(h, TAG_DIV, 1, &tag);
+ print_otag(h, TAG_DIV, "c", "section");
return 1;
} else if (n->type == ROFFT_BODY)
return 1;
- print_otag(h, TAG_H1, 0, NULL);
+ print_otag(h, TAG_H1, "");
return 1;
}
@@ -400,7 +377,7 @@ man_alt_pre(MAN_ARGS)
struct tag *t;
if ((savelit = mh->fl & MANH_LITERAL))
- print_otag(h, TAG_BR, 0, NULL);
+ print_otag(h, TAG_BR, "");
mh->fl &= ~MANH_LITERAL;
@@ -433,7 +410,7 @@ man_alt_pre(MAN_ARGS)
h->flags |= HTML_NOSPACE;
if (TAG_MAX != fp)
- t = print_otag(h, fp, 0, NULL);
+ t = print_otag(h, fp, "");
print_man_node(man, nn, mh, h);
@@ -450,27 +427,23 @@ man_alt_pre(MAN_ARGS)
static int
man_SM_pre(MAN_ARGS)
{
-
- print_otag(h, TAG_SMALL, 0, NULL);
+ print_otag(h, TAG_SMALL, "");
if (MAN_SB == n->tok)
- print_otag(h, TAG_B, 0, NULL);
+ print_otag(h, TAG_B, "");
return 1;
}
static int
man_SS_pre(MAN_ARGS)
{
- struct htmlpair tag;
-
if (n->type == ROFFT_BLOCK) {
mh->fl &= ~MANH_LITERAL;
- PAIR_CLASS_INIT(&tag, "subsection");
- print_otag(h, TAG_DIV, 1, &tag);
+ print_otag(h, TAG_DIV, "c", "subsection");
return 1;
} else if (n->type == ROFFT_BODY)
return 1;
- print_otag(h, TAG_H2, 0, NULL);
+ print_otag(h, TAG_H2, "");
return 1;
}
@@ -492,16 +465,16 @@ man_IP_pre(MAN_ARGS)
const struct roff_node *nn;
if (n->type == ROFFT_BODY) {
- print_otag(h, TAG_DD, 0, NULL);
+ print_otag(h, TAG_DD, "");
return 1;
} else if (n->type != ROFFT_HEAD) {
- print_otag(h, TAG_DL, 0, NULL);
+ print_otag(h, TAG_DL, "");
return 1;
}
/* FIXME: width specification. */
- print_otag(h, TAG_DT, 0, NULL);
+ print_otag(h, TAG_DT, "");
/* For IP, only print the first header element. */
@@ -526,8 +499,7 @@ man_IP_pre(MAN_ARGS)
static int
man_HP_pre(MAN_ARGS)
{
- struct htmlpair tag[2];
- struct roffsu su;
+ struct roffsu sum, sui;
const struct roff_node *np;
if (n->type == ROFFT_HEAD)
@@ -537,18 +509,14 @@ man_HP_pre(MAN_ARGS)
np = n->head->child;
- if (NULL == np || ! a2width(np, &su))
- SCALE_HS_INIT(&su, INDENT);
+ if (np == NULL || !a2width(np, &sum))
+ SCALE_HS_INIT(&sum, INDENT);
- bufinit(h);
+ sui.unit = sum.unit;
+ sui.scale = -sum.scale;
print_bvspace(h, n);
- bufcat_su(h, "margin-left", &su);
- su.scale = -su.scale;
- bufcat_su(h, "text-indent", &su);
- PAIR_STYLE_INIT(&tag[0], h);
- PAIR_CLASS_INIT(&tag[1], "spacer");
- print_otag(h, TAG_DIV, 2, tag);
+ print_otag(h, TAG_DIV, "csului", "spacer", &sum, &sui);
return 1;
}
@@ -556,22 +524,20 @@ static int
man_OP_pre(MAN_ARGS)
{
struct tag *tt;
- struct htmlpair tag;
print_text(h, "[");
h->flags |= HTML_NOSPACE;
- PAIR_CLASS_INIT(&tag, "opt");
- tt = print_otag(h, TAG_SPAN, 1, &tag);
+ tt = print_otag(h, TAG_SPAN, "c", "opt");
if (NULL != (n = n->child)) {
- print_otag(h, TAG_B, 0, NULL);
+ print_otag(h, TAG_B, "");
print_text(h, n->string);
}
print_stagq(h, tt);
if (NULL != n && NULL != n->next) {
- print_otag(h, TAG_I, 0, NULL);
+ print_otag(h, TAG_I, "");
print_text(h, n->next->string);
}
@@ -584,16 +550,14 @@ man_OP_pre(MAN_ARGS)
static int
man_B_pre(MAN_ARGS)
{
-
- print_otag(h, TAG_B, 0, NULL);
+ print_otag(h, TAG_B, "");
return 1;
}
static int
man_I_pre(MAN_ARGS)
{
-
- print_otag(h, TAG_I, 0, NULL);
+ print_otag(h, TAG_I, "");
return 1;
}
@@ -602,7 +566,7 @@ man_literal_pre(MAN_ARGS)
{
if (MAN_fi == n->tok || MAN_EE == n->tok) {
- print_otag(h, TAG_BR, 0, NULL);
+ print_otag(h, TAG_BR, "");
mh->fl &= ~MANH_LITERAL;
} else
mh->fl |= MANH_LITERAL;
@@ -613,8 +577,7 @@ man_literal_pre(MAN_ARGS)
static int
man_in_pre(MAN_ARGS)
{
-
- print_otag(h, TAG_BR, 0, NULL);
+ print_otag(h, TAG_BR, "");
return 0;
}
@@ -628,7 +591,6 @@ man_ign_pre(MAN_ARGS)
static int
man_RS_pre(MAN_ARGS)
{
- struct htmlpair tag;
struct roffsu su;
if (n->type == ROFFT_HEAD)
@@ -640,25 +602,18 @@ man_RS_pre(MAN_ARGS)
if (n->head->child)
a2width(n->head->child, &su);
- bufinit(h);
- bufcat_su(h, "margin-left", &su);
- PAIR_STYLE_INIT(&tag, h);
- print_otag(h, TAG_DIV, 1, &tag);
+ print_otag(h, TAG_DIV, "sul", &su);
return 1;
}
static int
man_UR_pre(MAN_ARGS)
{
- struct htmlpair tag[2];
-
n = n->child;
assert(n->type == ROFFT_HEAD);
if (n->child != NULL) {
assert(n->child->type == ROFFT_TEXT);
- PAIR_CLASS_INIT(&tag[0], "link-ext");
- PAIR_HREF_INIT(&tag[1], n->child->string);
- print_otag(h, TAG_A, 2, tag);
+ print_otag(h, TAG_A, "ch", "link-ext", n->child->string);
}
assert(n->next->type == ROFFT_BODY);
diff --git a/mandoc_html.3 b/mandoc_html.3
index 994eb3a2..b9fc7f63 100644
--- a/mandoc_html.3
+++ b/mandoc_html.3
@@ -1,4 +1,4 @@
-.\" $Id: mandoc_html.3,v 1.1 2014/07/23 18:13:09 schwarze Exp $
+.\" $Id: mandoc_html.3,v 1.2 2017/01/17 01:47:51 schwarze Exp $
.\"
.\" Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>
.\"
@@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: July 23 2014 $
+.Dd $Mdocdate: January 17 2017 $
.Dt MANDOC_HTML 3
.Os
.Sh NAME
@@ -30,8 +30,8 @@
.Fo print_otag
.Fa "struct html *h"
.Fa "enum htmltag tag"
-.Fa "int sz"
-.Fa "const struct htmlpair *p"
+.Fa "const char *fmt"
+.Fa ...
.Fc
.Ft void
.Fo print_tagq
@@ -84,15 +84,6 @@ These structures are declared in
.Bl -tag -width Ds
.It Vt struct html
Internal state of the HTML formatter.
-.It Vt struct htmlpair
-Holds one HTML attribute.
-Members are
-.Fa "enum htmlattr key"
-and
-.Fa "const char *val" .
-Helper macros
-.Fn PAIR_*
-are provided to support initialization of such structures.
.It Vt struct tag
One entry for the LIFO stack of HTML elements.
Members are
@@ -134,12 +125,116 @@ The function
.Fn print_otag
prints the start tag of an HTML element with the name
.Fa tag ,
-including the
-.Fa sz
-attributes that can optionally be provided in the
-.Fa p
-array.
-It uses the private function
+optionally including the attributes specified by
+.Fa fmt .
+If
+.Fa fmt
+is the empty string, no attributes are written.
+Each letter of
+.Fa fmt
+specifies one attribute to write.
+Most attributes require one
+.Va char *
+argument which becomes the value of the attribute.
+The arguments have to be given in the same order as the attribute letters.
+.Bl -tag -width 1n -offset indent
+.It Cm c
+Print a
+.Cm class
+attribute.
+.It Cm h
+Print a
+.Cm href
+attribute.
+.It Cm i
+Print an
+.Cm id
+attribute.
+.It Cm \&?
+Print an arbitrary attribute.
+This format letter requires two
+.Vt char *
+arguments, the attribute name and the value.
+.It Cm s
+Print a
+.Cm style
+attribute.
+If present, it must be the last format letter.
+In contrast to the other format letters, this one does not yet
+print the value and does not require an argument.
+Instead, the rest of the format string consists of pairs of
+argument type letters and style name letters.
+.El
+.Pp
+Argument type letters each require on argument as follows:
+.Bl -tag -width 1n -offset indent
+.It Cm h
+Requires one
+.Vt int
+argument, interpreted as a horizontal length in units of
+.Dv SCALE_EN .
+.It Cm s
+Requires one
+.Vt char *
+argument, used as a style value.
+.It Cm u
+Requires one
+.Vt struct roffsu *
+argument, used as a length.
+.It Cm v
+Requires one
+.Vt int
+argument, interpreted as a vertical length in units of
+.Dv SCALE_VS .
+.It Cm w
+Requires one
+.Vt char *
+argument, interpreted as an
+.Xr mdoc 7 Ns -style
+width specifier.
+.El
+.Pp
+Style name letters decide what to do with the preceding argument:
+.Bl -tag -width 1n -offset indent
+.It Cm b
+Set
+.Cm margin-bottom
+to the given length.
+.It Cm h
+Set
+.Cm height
+to the given length.
+.It Cm i
+Set
+.Cm text-indent
+to the given length.
+.It Cm l
+Set
+.Cm margin-left
+to the given length.
+.It Cm t
+Set
+.Cm margin-top
+to the given length.
+.It Cm w
+Set
+.Cm width
+to the given length.
+.It Cm W
+Set
+.Cm min-width
+to the given length.
+.It Cm \&?
+The special pair
+.Cm s?
+requires two
+.Vt char *
+arguments.
+The first is the style name, the second its value.
+.El
+.Pp
+.Fn print_otag
+uses the private function
.Fn print_attr
which in turn uses the private function
.Fn print_encode
diff --git a/mdoc_html.c b/mdoc_html.c
index 81b60cb5..f6994c1a 100644
--- a/mdoc_html.c
+++ b/mdoc_html.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_html.c,v 1.247 2017/01/11 17:39:53 schwarze Exp $ */
+/* $Id: mdoc_html.c,v 1.248 2017/01/17 01:47:51 schwarze Exp $ */
/*
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -54,8 +54,6 @@ static void print_mdoc_nodelist(MDOC_ARGS);
static void synopsis_pre(struct html *,
const struct roff_node *);
-static void a2width(const char *, struct roffsu *);
-
static void mdoc_root_post(MDOC_ARGS);
static int mdoc_root_pre(MDOC_ARGS);
@@ -260,22 +258,6 @@ static const char * const lists[LIST_MAX] = {
/*
- * Calculate the scaling unit passed in a `-width' argument. This uses
- * either a native scaling unit (e.g., 1i, 2m) or the string length of
- * the value.
- */
-static void
-a2width(const char *p, struct roffsu *su)
-{
-
- if (a2roffsu(p, su, SCALE_MAX) < 2) {
- su->unit = SCALE_EN;
- su->scale = html_strlen(p);
- } else if (su->scale < 0.0)
- su->scale = 0.0;
-}
-
-/*
* See the same function in mdoc_term.c for documentation.
*/
static void
@@ -289,7 +271,7 @@ synopsis_pre(struct html *h, const struct roff_node *n)
MDOC_Fo != n->tok &&
MDOC_Ft != n->tok &&
MDOC_Fn != n->tok) {
- print_otag(h, TAG_BR, 0, NULL);
+ print_otag(h, TAG_BR, "");
return;
}
@@ -308,7 +290,7 @@ synopsis_pre(struct html *h, const struct roff_node *n)
}
/* FALLTHROUGH */
default:
- print_otag(h, TAG_BR, 0, NULL);
+ print_otag(h, TAG_BR, "");
break;
}
}
@@ -316,23 +298,21 @@ synopsis_pre(struct html *h, const struct roff_node *n)
void
html_mdoc(void *arg, const struct roff_man *mdoc)
{
- struct htmlpair tag;
struct html *h;
struct tag *t, *tt;
- PAIR_CLASS_INIT(&tag, "mandoc");
h = (struct html *)arg;
if ( ! (HTML_FRAGMENT & h->oflags)) {
print_gen_decls(h);
- t = print_otag(h, TAG_HTML, 0, NULL);
- tt = print_otag(h, TAG_HEAD, 0, NULL);
+ t = print_otag(h, TAG_HTML, "");
+ tt = print_otag(h, TAG_HEAD, "");
print_mdoc_head(&mdoc->meta, mdoc->first->child, h);
print_tagq(h, tt);
- print_otag(h, TAG_BODY, 0, NULL);
- print_otag(h, TAG_DIV, 1, &tag);
+ print_otag(h, TAG_BODY, "");
+ print_otag(h, TAG_DIV, "c", "mandoc");
} else
- t = print_otag(h, TAG_DIV, 1, &tag);
+ t = print_otag(h, TAG_DIV, "c", "mandoc");
mdoc_root_pre(&mdoc->meta, mdoc->first->child, h);
print_mdoc_nodelist(&mdoc->meta, mdoc->first->child, h);
@@ -353,7 +333,7 @@ print_mdoc_head(MDOC_ARGS)
if (meta->arch)
bufcat_fmt(h, " (%s)", meta->arch);
- print_otag(h, TAG_TITLE, 0, NULL);
+ print_otag(h, TAG_TITLE, "");
print_text(h, h->buf);
}
@@ -391,7 +371,7 @@ print_mdoc_node(MDOC_ARGS)
*/
if (' ' == *n->string && NODE_LINE & n->flags)
if ( ! (HTML_LITERAL & h->flags))
- print_otag(h, TAG_BR, 0, NULL);
+ print_otag(h, TAG_BR, "");
if (NODE_DELIMC & n->flags)
h->flags |= HTML_NOSPACE;
print_text(h, n->string);
@@ -455,23 +435,17 @@ print_mdoc_node(MDOC_ARGS)
static void
mdoc_root_post(MDOC_ARGS)
{
- struct htmlpair tag;
struct tag *t, *tt;
- PAIR_CLASS_INIT(&tag, "foot");
- t = print_otag(h, TAG_TABLE, 1, &tag);
-
- print_otag(h, TAG_TBODY, 0, NULL);
+ t = print_otag(h, TAG_TABLE, "c", "foot");
+ print_otag(h, TAG_TBODY, "");
+ tt = print_otag(h, TAG_TR, "");
- tt = print_otag(h, TAG_TR, 0, NULL);
-
- PAIR_CLASS_INIT(&tag, "foot-date");
- print_otag(h, TAG_TD, 1, &tag);
+ print_otag(h, TAG_TD, "c", "foot-date");
print_text(h, meta->date);
print_stagq(h, tt);
- PAIR_CLASS_INIT(&tag, "foot-os");
- print_otag(h, TAG_TD, 1, &tag);
+ print_otag(h, TAG_TD, "c", "foot-os");
print_text(h, meta->os);
print_tagq(h, t);
}
@@ -479,7 +453,6 @@ mdoc_root_post(MDOC_ARGS)
static int
mdoc_root_pre(MDOC_ARGS)
{
- struct htmlpair tag;
struct tag *t, *tt;
char *volume, *title;
@@ -495,25 +468,19 @@ mdoc_root_pre(MDOC_ARGS)
mandoc_asprintf(&title, "%s(%s)",
meta->title, meta->msec);
- PAIR_CLASS_INIT(&tag, "head");
- t = print_otag(h, TAG_TABLE, 1, &tag);
-
- print_otag(h, TAG_TBODY, 0, NULL);
-
- tt = print_otag(h, TAG_TR, 0, NULL);
+ t = print_otag(h, TAG_TABLE, "c", "head");
+ print_otag(h, TAG_TBODY, "");
+ tt = print_otag(h, TAG_TR, "");
- PAIR_CLASS_INIT(&tag, "head-ltitle");
- print_otag(h, TAG_TD, 1, &tag);
+ print_otag(h, TAG_TD, "c", "head-ltitle");
print_text(h, title);
print_stagq(h, tt);
- PAIR_CLASS_INIT(&tag, "head-vol");
- print_otag(h, TAG_TD, 1, &tag);
+ print_otag(h, TAG_TD, "c", "head-vol");
print_text(h, volume);
print_stagq(h, tt);
- PAIR_CLASS_INIT(&tag, "head-rtitle");
- print_otag(h, TAG_TD, 1, &tag);
+ print_otag(h, TAG_TD, "c", "head-rtitle");
print_text(h, title);
print_tagq(h, t);
@@ -525,12 +492,9 @@ mdoc_root_pre(MDOC_ARGS)
static int
mdoc_sh_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
switch (n->type) {
case ROFFT_BLOCK:
- PAIR_CLASS_INIT(&tag, "section");
- print_otag(h, TAG_DIV, 1, &tag);
+ print_otag(h, TAG_DIV, "c", "section");
return 1;
case ROFFT_BODY:
if (n->sec == SEC_AUTHORS)
@@ -548,11 +512,10 @@ mdoc_sh_pre(MDOC_ARGS)
bufcat_id(h, " ");
}
- if (NULL == n) {
- PAIR_ID_INIT(&tag, h->buf);
- print_otag(h, TAG_H1, 1, &tag);
- } else
- print_otag(h, TAG_H1, 0, NULL);
+ if (NULL == n)
+ print_otag(h, TAG_H1, "i", h->buf);
+ else
+ print_otag(h, TAG_H1, "");
return 1;
}
@@ -560,11 +523,8 @@ mdoc_sh_pre(MDOC_ARGS)
static int
mdoc_ss_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
if (n->type == ROFFT_BLOCK) {
- PAIR_CLASS_INIT(&tag, "subsection");
- print_otag(h, TAG_DIV, 1, &tag);
+ print_otag(h, TAG_DIV, "c", "subsection");
return 1;
} else if (n->type == ROFFT_BODY)
return 1;
@@ -577,11 +537,10 @@ mdoc_ss_pre(MDOC_ARGS)
bufcat_id(h, " ");
}
- if (NULL == n) {
- PAIR_ID_INIT(&tag, h->buf);
- print_otag(h, TAG_H2, 1, &tag);
- } else
- print_otag(h, TAG_H2, 0, NULL);
+ if (NULL == n)
+ print_otag(h, TAG_H2, "i", h->buf);
+ else
+ print_otag(h, TAG_H2, "");
return 1;
}
@@ -589,10 +548,7 @@ mdoc_ss_pre(MDOC_ARGS)
static int
mdoc_fl_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "flag");
- print_otag(h, TAG_B, 1, &tag);
+ print_otag(h, TAG_B, "c", "flag");
/* `Cm' has no leading hyphen. */
@@ -613,46 +569,39 @@ mdoc_fl_pre(MDOC_ARGS)
static int
mdoc_nd_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
if (n->type != ROFFT_BODY)
return 1;
/* XXX: this tag in theory can contain block elements. */
print_text(h, "\\(em");
- PAIR_CLASS_INIT(&tag, "desc");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "desc");
return 1;
}
static int
mdoc_nm_pre(MDOC_ARGS)
{
- struct htmlpair tag;
- struct roffsu su;
int len;
switch (n->type) {
case ROFFT_HEAD:
- print_otag(h, TAG_TD, 0, NULL);
+ print_otag(h, TAG_TD, "");
/* FALLTHROUGH */
case ROFFT_ELEM:
- PAIR_CLASS_INIT(&tag, "name");
- print_otag(h, TAG_B, 1, &tag);
+ print_otag(h, TAG_B, "c", "name");
if (n->child == NULL && meta->name != NULL)
print_text(h, meta->name);
return 1;
case ROFFT_BODY:
- print_otag(h, TAG_TD, 0, NULL);
+ print_otag(h, TAG_TD, "");
return 1;
default:
break;
}
synopsis_pre(h, n);
- PAIR_CLASS_INIT(&tag, "synopsis");
- print_otag(h, TAG_TABLE, 1, &tag);
+ print_otag(h, TAG_TABLE, "c", "synopsis");
for (len = 0, n = n->head->child; n; n = n->next)
if (n->type == ROFFT_TEXT)
@@ -661,35 +610,26 @@ mdoc_nm_pre(MDOC_ARGS)
if (len == 0 && meta->name != NULL)
len = html_strlen(meta->name);
- SCALE_HS_INIT(&su, len);
- bufinit(h);
- bufcat_su(h, "width", &su);
- PAIR_STYLE_INIT(&tag, h);
- print_otag(h, TAG_COL, 1, &tag);
- print_otag(h, TAG_COL, 0, NULL);
- print_otag(h, TAG_TBODY, 0, NULL);
- print_otag(h, TAG_TR, 0, NULL);
+ print_otag(h, TAG_COL, "shw", len);
+ print_otag(h, TAG_COL, "");
+ print_otag(h, TAG_TBODY, "");
+ print_otag(h, TAG_TR, "");
return 1;
}
static int
mdoc_xr_pre(MDOC_ARGS)
{
- struct htmlpair tag[2];
-
if (NULL == n->child)
return 0;
- PAIR_CLASS_INIT(&tag[0], "link-man");
-
if (h->base_man) {
buffmt_man(h, n->child->string,
n->child->next ?
n->child->next->string : NULL);
- PAIR_HREF_INIT(&tag[1], h->buf);
- print_otag(h, TAG_A, 2, tag);
+ print_otag(h, TAG_A, "ch", "link-man", h->buf);
} else
- print_otag(h, TAG_A, 1, tag);
+ print_otag(h, TAG_A, "c", "link-man");
n = n->child;
print_text(h, n->string);
@@ -718,44 +658,28 @@ mdoc_ns_pre(MDOC_ARGS)
static int
mdoc_ar_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "arg");
- print_otag(h, TAG_I, 1, &tag);
+ print_otag(h, TAG_I, "c", "arg");
return 1;
}
static int
mdoc_xx_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "unix");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "unix");
return 1;
}
static int
mdoc_it_pre(MDOC_ARGS)
{
- struct roffsu su;
enum mdoc_list type;
- struct htmlpair tag[2];
const struct roff_node *bl;
bl = n->parent;
while (bl && MDOC_Bl != bl->tok)
bl = bl->parent;
-
- assert(bl);
-
type = bl->norm->Bl.type;
- assert(lists[type]);
- PAIR_CLASS_INIT(&tag[0], lists[type]);
-
- bufinit(h);
-
if (n->type == ROFFT_HEAD) {
switch (type) {
case LIST_bullet:
@@ -769,14 +693,11 @@ mdoc_it_pre(MDOC_ARGS)
case LIST_inset:
case LIST_ohang:
case LIST_tag:
- 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);
+ print_otag(h, TAG_DT, "csvt", lists[type],
+ !bl->norm->Bl.comp);
if (LIST_diag != type)
break;
- PAIR_CLASS_INIT(&tag[0], "diag");
- print_otag(h, TAG_B, 1, tag);
+ print_otag(h, TAG_B, "c", "diag");
break;
case LIST_column:
break;
@@ -790,10 +711,8 @@ mdoc_it_pre(MDOC_ARGS)
case LIST_dash:
case LIST_enum:
case LIST_item:
- 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);
+ print_otag(h, TAG_LI, "csvt", lists[type],
+ !bl->norm->Bl.comp);
break;
case LIST_diag:
case LIST_hang:
@@ -801,19 +720,15 @@ mdoc_it_pre(MDOC_ARGS)
case LIST_ohang:
case LIST_tag:
if (NULL == bl->norm->Bl.width) {
- print_otag(h, TAG_DD, 1, tag);
+ print_otag(h, TAG_DD, "c", lists[type]);
break;
}
- 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);
+ print_otag(h, TAG_DD, "cswl", lists[type],
+ bl->norm->Bl.width);
break;
case LIST_column:
- 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);
+ print_otag(h, TAG_TD, "csvt", lists[type],
+ !bl->norm->Bl.comp);
break;
default:
break;
@@ -821,7 +736,7 @@ mdoc_it_pre(MDOC_ARGS)
} else {
switch (type) {
case LIST_column:
- print_otag(h, TAG_TR, 1, tag);
+ print_otag(h, TAG_TR, "c", lists[type]);
break;
default:
break;
@@ -835,13 +750,12 @@ static int
mdoc_bl_pre(MDOC_ARGS)
{
int i;
- struct htmlpair tag[3];
- struct roffsu su;
char buf[BUFSIZ];
+ enum htmltag elemtype;
if (n->type == ROFFT_BODY) {
if (LIST_column == n->norm->Bl.type)
- print_otag(h, TAG_TBODY, 0, NULL);
+ print_otag(h, TAG_TBODY, "");
return 1;
}
@@ -856,62 +770,47 @@ mdoc_bl_pre(MDOC_ARGS)
* screen and we want to preserve that behaviour.
*/
- for (i = 0; i < (int)n->norm->Bl.ncols; i++) {
- bufinit(h);
- a2width(n->norm->Bl.cols[i], &su);
- if (i < (int)n->norm->Bl.ncols - 1)
- bufcat_su(h, "width", &su);
- else
- bufcat_su(h, "min-width", &su);
- PAIR_STYLE_INIT(&tag[0], h);
- print_otag(h, TAG_COL, 1, tag);
- }
+ for (i = 0; i < (int)n->norm->Bl.ncols - 1; i++)
+ print_otag(h, TAG_COL, "sww", n->norm->Bl.cols[i]);
+ print_otag(h, TAG_COL, "swW", n->norm->Bl.cols[i]);
return 0;
}
- 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);
-
assert(lists[n->norm->Bl.type]);
(void)strlcpy(buf, "list ", BUFSIZ);
(void)strlcat(buf, lists[n->norm->Bl.type], BUFSIZ);
- PAIR_INIT(&tag[1], ATTR_CLASS, buf);
-
- /* Set the block's left-hand margin. */
-
- if (n->norm->Bl.offs) {
- a2width(n->norm->Bl.offs, &su);
- bufcat_su(h, "margin-left", &su);
- }
switch (n->norm->Bl.type) {
case LIST_bullet:
case LIST_dash:
case LIST_hyphen:
case LIST_item:
- print_otag(h, TAG_UL, 2, tag);
+ elemtype = TAG_UL;
break;
case LIST_enum:
- print_otag(h, TAG_OL, 2, tag);
+ elemtype = TAG_OL;
break;
case LIST_diag:
case LIST_hang:
case LIST_inset:
case LIST_ohang:
case LIST_tag:
- print_otag(h, TAG_DL, 2, tag);
+ elemtype = TAG_DL;
break;
case LIST_column:
- print_otag(h, TAG_TABLE, 2, tag);
+ elemtype = TAG_TABLE;
break;
default:
abort();
}
+ if (n->norm->Bl.offs)
+ print_otag(h, elemtype, "csvtvbwl", buf, 0, 0,
+ n->norm->Bl.offs);
+ else
+ print_otag(h, elemtype, "csvtvb", buf, 0, 0);
+
return 1;
}
@@ -919,45 +818,31 @@ static int
mdoc_ex_pre(MDOC_ARGS)
{
if (n->prev)
- print_otag(h, TAG_BR, 0, NULL);
+ print_otag(h, TAG_BR, "");
return 1;
}
static int
mdoc_em_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "emph");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "emph");
return 1;
}
static int
mdoc_d1_pre(MDOC_ARGS)
{
- struct htmlpair tag[2];
- struct roffsu su;
-
if (n->type != ROFFT_BLOCK)
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);
- print_otag(h, TAG_BLOCKQUOTE, 1, tag);
+ print_otag(h, TAG_BLOCKQUOTE, "svtvb", 0, 0);
/* BLOCKQUOTE needs a block body. */
- PAIR_CLASS_INIT(&tag[0], "display");
- print_otag(h, TAG_DIV, 1, tag);
+ print_otag(h, TAG_DIV, "c", "display");
- if (MDOC_Dl == n->tok) {
- PAIR_CLASS_INIT(&tag[0], "lit");
- print_otag(h, TAG_CODE, 1, tag);
- }
+ if (MDOC_Dl == n->tok)
+ print_otag(h, TAG_CODE, "c", "lit");
return 1;
}
@@ -965,8 +850,6 @@ mdoc_d1_pre(MDOC_ARGS)
static int
mdoc_sx_pre(MDOC_ARGS)
{
- struct htmlpair tag[2];
-
bufinit(h);
bufcat(h, "#");
@@ -976,21 +859,16 @@ mdoc_sx_pre(MDOC_ARGS)
bufcat_id(h, " ");
}
- PAIR_CLASS_INIT(&tag[0], "link-sec");
- PAIR_HREF_INIT(&tag[1], h->buf);
-
- print_otag(h, TAG_I, 1, tag);
- print_otag(h, TAG_A, 2, tag);
+ print_otag(h, TAG_I, "c", "link-sec");
+ print_otag(h, TAG_A, "ch", "link-sec", h->buf);
return 1;
}
static int
mdoc_bd_pre(MDOC_ARGS)
{
- struct htmlpair tag[2];
- int comp, sv;
+ int comp, offs, sv;
struct roff_node *nn;
- struct roffsu su;
if (n->type == ROFFT_HEAD)
return 0;
@@ -1014,27 +892,24 @@ mdoc_bd_pre(MDOC_ARGS)
if (n->norm->Bd.offs == NULL ||
! strcmp(n->norm->Bd.offs, "left"))
- SCALE_HS_INIT(&su, 0);
+ offs = 0;
else if ( ! strcmp(n->norm->Bd.offs, "indent"))
- SCALE_HS_INIT(&su, INDENT);
+ offs = INDENT;
else if ( ! strcmp(n->norm->Bd.offs, "indent-two"))
- SCALE_HS_INIT(&su, INDENT * 2);
+ offs = INDENT * 2;
else
- a2width(n->norm->Bd.offs, &su);
+ offs = -1;
- bufinit(h);
- bufcat_su(h, "margin-left", &su);
- PAIR_STYLE_INIT(&tag[0], h);
-
- PAIR_CLASS_INIT(&tag[1], "display");
- print_otag(h, TAG_DIV, 2, tag);
+ if (offs == -1)
+ print_otag(h, TAG_DIV, "cswl", "display", n->norm->Bd.offs);
+ else
+ print_otag(h, TAG_DIV, "cshl", "display", offs);
if (n->norm->Bd.type != DISP_unfilled &&
n->norm->Bd.type != DISP_literal)
return 1;
- PAIR_CLASS_INIT(&tag[0], "lit");
- print_otag(h, TAG_PRE, 1, tag);
+ print_otag(h, TAG_PRE, "c", "lit");
/* This can be recursive: save & set our literal state. */
@@ -1080,28 +955,20 @@ mdoc_bd_pre(MDOC_ARGS)
static int
mdoc_pa_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "file");
- print_otag(h, TAG_I, 1, &tag);
+ print_otag(h, TAG_I, "c", "file");
return 1;
}
static int
mdoc_ad_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "addr");
- print_otag(h, TAG_I, 1, &tag);
+ print_otag(h, TAG_I, "c", "addr");
return 1;
}
static int
mdoc_an_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
if (n->norm->An.auth == AUTH_split) {
h->flags &= ~HTML_NOSPLIT;
h->flags |= HTML_SPLIT;
@@ -1114,54 +981,41 @@ mdoc_an_pre(MDOC_ARGS)
}
if (h->flags & HTML_SPLIT)
- print_otag(h, TAG_BR, 0, NULL);
+ print_otag(h, TAG_BR, "");
if (n->sec == SEC_AUTHORS && ! (h->flags & HTML_NOSPLIT))
h->flags |= HTML_SPLIT;
- PAIR_CLASS_INIT(&tag, "author");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "author");
return 1;
}
static int
mdoc_cd_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
synopsis_pre(h, n);
- PAIR_CLASS_INIT(&tag, "config");
- print_otag(h, TAG_B, 1, &tag);
+ print_otag(h, TAG_B, "c", "config");
return 1;
}
static int
mdoc_dv_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "define");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "define");
return 1;
}
static int
mdoc_ev_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "env");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "env");
return 1;
}
static int
mdoc_er_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "errno");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "errno");
return 1;
}
@@ -1169,17 +1023,15 @@ static int
mdoc_fa_pre(MDOC_ARGS)
{
const struct roff_node *nn;
- struct htmlpair tag;
struct tag *t;
- PAIR_CLASS_INIT(&tag, "farg");
if (n->parent->tok != MDOC_Fo) {
- print_otag(h, TAG_I, 1, &tag);
+ print_otag(h, TAG_I, "c", "farg");
return 1;
}
for (nn = n->child; nn; nn = nn->next) {
- t = print_otag(h, TAG_I, 1, &tag);
+ t = print_otag(h, TAG_I, "c", "farg");
print_text(h, nn->string);
print_tagq(h, t);
if (nn->next) {
@@ -1199,10 +1051,8 @@ mdoc_fa_pre(MDOC_ARGS)
static int
mdoc_fd_pre(MDOC_ARGS)
{
- struct htmlpair tag[2];
char buf[BUFSIZ];
size_t sz;
- int i;
struct tag *t;
synopsis_pre(h, n);
@@ -1213,13 +1063,11 @@ mdoc_fd_pre(MDOC_ARGS)
assert(n->type == ROFFT_TEXT);
if (strcmp(n->string, "#include")) {
- PAIR_CLASS_INIT(&tag[0], "macro");
- print_otag(h, TAG_B, 1, tag);
+ print_otag(h, TAG_B, "c", "macro");
return 1;
}
- PAIR_CLASS_INIT(&tag[0], "includes");
- print_otag(h, TAG_B, 1, tag);
+ print_otag(h, TAG_B, "c", "includes");
print_text(h, n->string);
if (NULL != (n = n->next)) {
@@ -1240,16 +1088,13 @@ mdoc_fd_pre(MDOC_ARGS)
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, "ch", "link-includes",
+ h->buf);
+ } else
+ t = print_otag(h, TAG_A, "c", "link-includes");
- t = print_otag(h, TAG_A, i, tag);
print_text(h, n->string);
print_tagq(h, t);
@@ -1267,8 +1112,6 @@ mdoc_fd_pre(MDOC_ARGS)
static int
mdoc_vt_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
if (n->type == ROFFT_BLOCK) {
synopsis_pre(h, n);
return 1;
@@ -1277,19 +1120,15 @@ mdoc_vt_pre(MDOC_ARGS)
} else if (n->type == ROFFT_HEAD)
return 0;
- PAIR_CLASS_INIT(&tag, "type");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "type");
return 1;
}
static int
mdoc_ft_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
synopsis_pre(h, n);
- PAIR_CLASS_INIT(&tag, "ftype");
- print_otag(h, TAG_I, 1, &tag);
+ print_otag(h, TAG_I, "c", "ftype");
return 1;
}
@@ -1297,10 +1136,9 @@ static int
mdoc_fn_pre(MDOC_ARGS)
{
struct tag *t;
- struct htmlpair tag[2];
char nbuf[BUFSIZ];
const char *sp, *ep;
- int sz, i, pretty;
+ int sz, pretty;
pretty = NODE_SYNPRETTY & n->flags;
synopsis_pre(h, n);
@@ -1311,8 +1149,7 @@ mdoc_fn_pre(MDOC_ARGS)
ep = strchr(sp, ' ');
if (NULL != ep) {
- PAIR_CLASS_INIT(&tag[0], "ftype");
- t = print_otag(h, TAG_I, 1, tag);
+ t = print_otag(h, TAG_I, "c", "ftype");
while (ep) {
sz = MIN((int)(ep - sp), BUFSIZ - 1);
@@ -1325,25 +1162,7 @@ mdoc_fn_pre(MDOC_ARGS)
print_tagq(h, t);
}
- PAIR_CLASS_INIT(&tag[0], "fname");
-
- /*
- * FIXME: only refer to IDs that we know exist.
- */
-
-#if 0
- if (NODE_SYNPRETTY & n->flags) {
- nbuf[0] = '\0';
- html_idcat(nbuf, sp, BUFSIZ);
- PAIR_ID_INIT(&tag[1], nbuf);
- } else {
- strlcpy(nbuf, "#", BUFSIZ);
- html_idcat(nbuf, sp, BUFSIZ);
- PAIR_HREF_INIT(&tag[1], nbuf);
- }
-#endif
-
- t = print_otag(h, TAG_B, 1, tag);
+ t = print_otag(h, TAG_B, "c", "fname");
if (sp)
print_text(h, sp);
@@ -1354,16 +1173,12 @@ mdoc_fn_pre(MDOC_ARGS)
print_text(h, "(");
h->flags |= HTML_NOSPACE;
- PAIR_CLASS_INIT(&tag[0], "farg");
- bufinit(h);
- bufcat_style(h, "white-space", "nowrap");
- PAIR_STYLE_INIT(&tag[1], h);
-
for (n = n->child->next; n; n = n->next) {
- i = 1;
if (NODE_SYNPRETTY & n->flags)
- i = 2;
- t = print_otag(h, TAG_I, i, tag);
+ t = print_otag(h, TAG_I, "css?", "farg",
+ "white-space", "nowrap");
+ else
+ t = print_otag(h, TAG_I, "c", "farg");
print_text(h, n->string);
print_tagq(h, t);
if (n->next) {
@@ -1419,7 +1234,6 @@ static int
mdoc_sp_pre(MDOC_ARGS)
{
struct roffsu su;
- struct htmlpair tag;
SCALE_VS_INIT(&su, 1);
@@ -1433,10 +1247,7 @@ mdoc_sp_pre(MDOC_ARGS)
} else
su.scale = 0.0;
- bufinit(h);
- bufcat_su(h, "height", &su);
- PAIR_STYLE_INIT(&tag, h);
- print_otag(h, TAG_DIV, 1, &tag);
+ print_otag(h, TAG_DIV, "suh", &su);
/* So the div isn't empty: */
print_text(h, "\\~");
@@ -1448,17 +1259,12 @@ mdoc_sp_pre(MDOC_ARGS)
static int
mdoc_lk_pre(MDOC_ARGS)
{
- struct htmlpair tag[2];
-
if (NULL == (n = n->child))
return 0;
assert(n->type == ROFFT_TEXT);
- PAIR_CLASS_INIT(&tag[0], "link-ext");
- PAIR_HREF_INIT(&tag[1], n->string);
-
- print_otag(h, TAG_A, 2, tag);
+ print_otag(h, TAG_A, "ch", "link-ext", n->string);
if (NULL == n->next)
print_text(h, n->string);
@@ -1472,20 +1278,15 @@ mdoc_lk_pre(MDOC_ARGS)
static int
mdoc_mt_pre(MDOC_ARGS)
{
- struct htmlpair tag[2];
struct tag *t;
- PAIR_CLASS_INIT(&tag[0], "link-mail");
-
for (n = n->child; n; n = n->next) {
assert(n->type == ROFFT_TEXT);
bufinit(h);
bufcat(h, "mailto:");
bufcat(h, n->string);
-
- PAIR_HREF_INIT(&tag[1], h->buf);
- t = print_otag(h, TAG_A, 2, tag);
+ t = print_otag(h, TAG_A, "ch", "link-mail", h->buf);
print_text(h, n->string);
print_tagq(h, t);
}
@@ -1496,7 +1297,6 @@ mdoc_mt_pre(MDOC_ARGS)
static int
mdoc_fo_pre(MDOC_ARGS)
{
- struct htmlpair tag;
struct tag *t;
if (n->type == ROFFT_BODY) {
@@ -1513,8 +1313,7 @@ mdoc_fo_pre(MDOC_ARGS)
return 0;
assert(n->child->string);
- PAIR_CLASS_INIT(&tag, "fname");
- t = print_otag(h, TAG_B, 1, &tag);
+ t = print_otag(h, TAG_B, "c", "fname");
print_text(h, n->child->string);
print_tagq(h, t);
return 0;
@@ -1536,13 +1335,9 @@ static int
mdoc_in_pre(MDOC_ARGS)
{
struct tag *t;
- struct htmlpair tag[2];
- int i;
synopsis_pre(h, n);
-
- PAIR_CLASS_INIT(&tag[0], "includes");
- print_otag(h, TAG_B, 1, tag);
+ print_otag(h, TAG_B, "c", "includes");
/*
* The first argument of the `In' gets special treatment as
@@ -1560,16 +1355,12 @@ mdoc_in_pre(MDOC_ARGS)
if (NULL != (n = n->child)) {
assert(n->type == ROFFT_TEXT);
- PAIR_CLASS_INIT(&tag[0], "link-includes");
-
- i = 1;
if (h->base_includes) {
buffmt_includes(h, n->string);
- PAIR_HREF_INIT(&tag[i], h->buf);
- i++;
- }
-
- t = print_otag(h, TAG_A, i, tag);
+ t = print_otag(h, TAG_A, "ch", "link-includes",
+ h->buf);
+ } else
+ t = print_otag(h, TAG_A, "c", "link-includes");
print_text(h, n->string);
print_tagq(h, t);
@@ -1590,20 +1381,14 @@ mdoc_in_pre(MDOC_ARGS)
static int
mdoc_ic_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "cmd");
- print_otag(h, TAG_B, 1, &tag);
+ print_otag(h, TAG_B, "c", "cmd");
return 1;
}
static int
mdoc_va_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "var");
- print_otag(h, TAG_B, 1, &tag);
+ print_otag(h, TAG_B, "c", "var");
return 1;
}
@@ -1620,8 +1405,7 @@ mdoc_ap_pre(MDOC_ARGS)
static int
mdoc_bf_pre(MDOC_ARGS)
{
- struct htmlpair tag[2];
- struct roffsu su;
+ const char *cattr;
if (n->type == ROFFT_HEAD)
return 0;
@@ -1629,35 +1413,27 @@ mdoc_bf_pre(MDOC_ARGS)
return 1;
if (FONT_Em == n->norm->Bf.font)
- PAIR_CLASS_INIT(&tag[0], "emph");
+ cattr = "emph";
else if (FONT_Sy == n->norm->Bf.font)
- PAIR_CLASS_INIT(&tag[0], "symb");
+ cattr = "symb";
else if (FONT_Li == n->norm->Bf.font)
- PAIR_CLASS_INIT(&tag[0], "lit");
+ cattr = "lit";
else
- PAIR_CLASS_INIT(&tag[0], "none");
+ cattr = "none";
/*
* 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. */
- bufcat_su(h, "margin-left", &su);
- PAIR_STYLE_INIT(&tag[1], h);
- print_otag(h, TAG_DIV, 2, tag);
+
+ print_otag(h, TAG_DIV, "css?hl", cattr, "display", "inline", 1);
return 1;
}
static int
mdoc_ms_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "symb");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "symb");
return 1;
}
@@ -1680,130 +1456,114 @@ mdoc_pf_post(MDOC_ARGS)
static int
mdoc_rs_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
if (n->type != ROFFT_BLOCK)
return 1;
if (n->prev && SEC_SEE_ALSO == n->sec)
print_paragraph(h);
- PAIR_CLASS_INIT(&tag, "ref");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "ref");
return 1;
}
static int
mdoc_no_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "none");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "none");
return 1;
}
static int
mdoc_li_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "lit");
- print_otag(h, TAG_CODE, 1, &tag);
+ print_otag(h, TAG_CODE, "c", "lit");
return 1;
}
static int
mdoc_sy_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
- PAIR_CLASS_INIT(&tag, "symb");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "symb");
return 1;
}
static int
mdoc_lb_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
if (SEC_LIBRARY == n->sec && NODE_LINE & n->flags && n->prev)
- print_otag(h, TAG_BR, 0, NULL);
+ print_otag(h, TAG_BR, "");
- PAIR_CLASS_INIT(&tag, "lib");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "lib");
return 1;
}
static int
mdoc__x_pre(MDOC_ARGS)
{
- struct htmlpair tag[2];
- enum htmltag t;
+ const char *cattr;
+ enum htmltag t;
t = TAG_SPAN;
switch (n->tok) {
case MDOC__A:
- PAIR_CLASS_INIT(&tag[0], "ref-auth");
+ cattr = "ref-auth";
if (n->prev && MDOC__A == n->prev->tok)
if (NULL == n->next || MDOC__A != n->next->tok)
print_text(h, "and");
break;
case MDOC__B:
- PAIR_CLASS_INIT(&tag[0], "ref-book");
+ cattr = "ref-book";
t = TAG_I;
break;
case MDOC__C:
- PAIR_CLASS_INIT(&tag[0], "ref-city");
+ cattr = "ref-city";
break;
case MDOC__D:
- PAIR_CLASS_INIT(&tag[0], "ref-date");
+ cattr = "ref-date";
break;
case MDOC__I:
- PAIR_CLASS_INIT(&tag[0], "ref-issue");
+ cattr = "ref-issue";
t = TAG_I;
break;
case MDOC__J:
- PAIR_CLASS_INIT(&tag[0], "ref-jrnl");
+ cattr = "ref-jrnl";
t = TAG_I;
break;
case MDOC__N:
- PAIR_CLASS_INIT(&tag[0], "ref-num");
+ cattr = "ref-num";
break;
case MDOC__O:
- PAIR_CLASS_INIT(&tag[0], "ref-opt");
+ cattr = "ref-opt";
break;
case MDOC__P:
- PAIR_CLASS_INIT(&tag[0], "ref-page");
+ cattr = "ref-page";
break;
case MDOC__Q:
- PAIR_CLASS_INIT(&tag[0], "ref-corp");
+ cattr = "ref-corp";
break;
case MDOC__R:
- PAIR_CLASS_INIT(&tag[0], "ref-rep");
+ cattr = "ref-rep";
break;
case MDOC__T:
- PAIR_CLASS_INIT(&tag[0], "ref-title");
+ cattr = "ref-title";
break;
case MDOC__U:
- PAIR_CLASS_INIT(&tag[0], "link-ref");
+ cattr = "link-ref";
break;
case MDOC__V:
- PAIR_CLASS_INIT(&tag[0], "ref-vol");
+ cattr = "ref-vol";
break;
default:
abort();
}
if (MDOC__U != n->tok) {
- print_otag(h, t, 1, tag);
+ print_otag(h, t, "c", cattr);
return 1;
}
- PAIR_HREF_INIT(&tag[1], n->child->string);
- print_otag(h, TAG_A, 2, tag);
+ print_otag(h, TAG_A, "ch", cattr, n->child->string);
return 1;
}
@@ -1857,8 +1617,6 @@ mdoc_bk_post(MDOC_ARGS)
static int
mdoc_quote_pre(MDOC_ARGS)
{
- struct htmlpair tag;
-
if (n->type != ROFFT_BODY)
return 1;
@@ -1880,8 +1638,7 @@ mdoc_quote_pre(MDOC_ARGS)
case MDOC_Op:
print_text(h, "\\(lB");
h->flags |= HTML_NOSPACE;
- PAIR_CLASS_INIT(&tag, "opt");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SPAN, "c", "opt");
break;
case MDOC_En:
if (NULL == n->norm->Es ||
@@ -1902,8 +1659,7 @@ mdoc_quote_pre(MDOC_ARGS)
case MDOC_Ql:
print_text(h, "\\(oq");
h->flags |= HTML_NOSPACE;
- PAIR_CLASS_INIT(&tag, "lit");
- print_otag(h, TAG_CODE, 1, &tag);
+ print_otag(h, TAG_CODE, "c", "lit");
break;
case MDOC_So:
case MDOC_Sq:
diff --git a/tbl_html.c b/tbl_html.c
index 51c43286..962d900e 100644
--- a/tbl_html.c
+++ b/tbl_html.c
@@ -1,7 +1,7 @@
-/* $Id: tbl_html.c,v 1.18 2015/10/12 00:08:16 schwarze Exp $ */
+/* $Id: tbl_html.c,v 1.19 2017/01/17 01:47:51 schwarze Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -50,9 +50,6 @@ html_tbl_strlen(const char *p, void *arg)
static void
html_tblopen(struct html *h, const struct tbl_span *sp)
{
- struct htmlpair tag;
- struct roffsu su;
- struct roffcol *col;
int ic;
if (h->tbl.cols == NULL) {
@@ -62,19 +59,12 @@ html_tblopen(struct html *h, const struct tbl_span *sp)
}
assert(NULL == h->tblt);
- PAIR_CLASS_INIT(&tag, "tbl");
- h->tblt = print_otag(h, TAG_TABLE, 1, &tag);
-
- for (ic = 0; ic < sp->opts->cols; ic++) {
- bufinit(h);
- col = h->tbl.cols + ic;
- SCALE_HS_INIT(&su, col->width);
- bufcat_su(h, "width", &su);
- PAIR_STYLE_INIT(&tag, h);
- print_otag(h, TAG_COL, 1, &tag);
- }
+ h->tblt = print_otag(h, TAG_TABLE, "c", "tbl");
+
+ for (ic = 0; ic < sp->opts->cols; ic++)
+ print_otag(h, TAG_COL, "shw", h->tbl.cols[ic].width);
- print_otag(h, TAG_TBODY, 0, NULL);
+ print_otag(h, TAG_TBODY, "");
}
void
@@ -90,7 +80,6 @@ void
print_tbl(struct html *h, const struct tbl_span *sp)
{
const struct tbl_dat *dp;
- struct htmlpair tag;
struct tag *tt;
int ic;
@@ -104,19 +93,18 @@ print_tbl(struct html *h, const struct tbl_span *sp)
h->flags |= HTML_NONOSPACE;
h->flags |= HTML_NOSPACE;
- tt = print_otag(h, TAG_TR, 0, NULL);
+ tt = print_otag(h, TAG_TR, "");
switch (sp->pos) {
case TBL_SPAN_HORIZ:
case TBL_SPAN_DHORIZ:
- PAIR_INIT(&tag, ATTR_COLSPAN, "0");
- print_otag(h, TAG_TD, 1, &tag);
+ print_otag(h, TAG_TD, "?", "colspan", "0");
break;
default:
dp = sp->first;
for (ic = 0; ic < sp->opts->cols; ic++) {
print_stagq(h, tt);
- print_otag(h, TAG_TD, 0, NULL);
+ print_otag(h, TAG_TD, "");
if (dp == NULL || dp->layout->col > ic)
continue;