1*0a6a1f1dSLionel Sambuc /* Id: mdoc_html.c,v 1.186 2013/12/24 20:45:27 schwarze Exp */
2d65f6f70SBen Gras /*
392395e9cSLionel Sambuc * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
4d65f6f70SBen Gras *
5d65f6f70SBen Gras * Permission to use, copy, modify, and distribute this software for any
6d65f6f70SBen Gras * purpose with or without fee is hereby granted, provided that the above
7d65f6f70SBen Gras * copyright notice and this permission notice appear in all copies.
8d65f6f70SBen Gras *
9d65f6f70SBen Gras * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10d65f6f70SBen Gras * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11d65f6f70SBen Gras * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12d65f6f70SBen Gras * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13d65f6f70SBen Gras * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14d65f6f70SBen Gras * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15d65f6f70SBen Gras * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16d65f6f70SBen Gras */
17d65f6f70SBen Gras #ifdef HAVE_CONFIG_H
18d65f6f70SBen Gras #include "config.h"
19d65f6f70SBen Gras #endif
20d65f6f70SBen Gras
21d65f6f70SBen Gras #include <sys/types.h>
22d65f6f70SBen Gras
23d65f6f70SBen Gras #include <assert.h>
24d65f6f70SBen Gras #include <ctype.h>
25d65f6f70SBen Gras #include <stdio.h>
26d65f6f70SBen Gras #include <stdlib.h>
27d65f6f70SBen Gras #include <string.h>
28d65f6f70SBen Gras #include <unistd.h>
29d65f6f70SBen Gras
30d65f6f70SBen Gras #include "mandoc.h"
31d65f6f70SBen Gras #include "out.h"
32d65f6f70SBen Gras #include "html.h"
33d65f6f70SBen Gras #include "mdoc.h"
34d65f6f70SBen Gras #include "main.h"
35d65f6f70SBen Gras
36d65f6f70SBen Gras #define INDENT 5
37d65f6f70SBen Gras
38*0a6a1f1dSLionel Sambuc #define MDOC_ARGS const struct mdoc_meta *meta, \
39d65f6f70SBen Gras const struct mdoc_node *n, \
40d65f6f70SBen Gras struct html *h
41d65f6f70SBen Gras
42d65f6f70SBen Gras #ifndef MIN
43d65f6f70SBen Gras #define MIN(a,b) ((/*CONSTCOND*/(a)<(b))?(a):(b))
44d65f6f70SBen Gras #endif
45d65f6f70SBen Gras
46d65f6f70SBen Gras struct htmlmdoc {
47d65f6f70SBen Gras int (*pre)(MDOC_ARGS);
48d65f6f70SBen Gras void (*post)(MDOC_ARGS);
49d65f6f70SBen Gras };
50d65f6f70SBen Gras
51d65f6f70SBen Gras static void print_mdoc(MDOC_ARGS);
52d65f6f70SBen Gras static void print_mdoc_head(MDOC_ARGS);
53d65f6f70SBen Gras static void print_mdoc_node(MDOC_ARGS);
54d65f6f70SBen Gras static void print_mdoc_nodelist(MDOC_ARGS);
55d65f6f70SBen Gras static void synopsis_pre(struct html *,
56d65f6f70SBen Gras const struct mdoc_node *);
57d65f6f70SBen Gras
58d65f6f70SBen Gras static void a2width(const char *, struct roffsu *);
59d65f6f70SBen Gras static void a2offs(const char *, struct roffsu *);
60d65f6f70SBen Gras
61d65f6f70SBen Gras static void mdoc_root_post(MDOC_ARGS);
62d65f6f70SBen Gras static int mdoc_root_pre(MDOC_ARGS);
63d65f6f70SBen Gras
64d65f6f70SBen Gras static void mdoc__x_post(MDOC_ARGS);
65d65f6f70SBen Gras static int mdoc__x_pre(MDOC_ARGS);
66d65f6f70SBen Gras static int mdoc_ad_pre(MDOC_ARGS);
67d65f6f70SBen Gras static int mdoc_an_pre(MDOC_ARGS);
68d65f6f70SBen Gras static int mdoc_ap_pre(MDOC_ARGS);
69d65f6f70SBen Gras static int mdoc_ar_pre(MDOC_ARGS);
70d65f6f70SBen Gras static int mdoc_bd_pre(MDOC_ARGS);
71d65f6f70SBen Gras static int mdoc_bf_pre(MDOC_ARGS);
72d65f6f70SBen Gras static void mdoc_bk_post(MDOC_ARGS);
73d65f6f70SBen Gras static int mdoc_bk_pre(MDOC_ARGS);
74d65f6f70SBen Gras static int mdoc_bl_pre(MDOC_ARGS);
75d65f6f70SBen Gras static int mdoc_bt_pre(MDOC_ARGS);
76d65f6f70SBen Gras static int mdoc_bx_pre(MDOC_ARGS);
77d65f6f70SBen Gras static int mdoc_cd_pre(MDOC_ARGS);
78d65f6f70SBen Gras static int mdoc_d1_pre(MDOC_ARGS);
79d65f6f70SBen Gras static int mdoc_dv_pre(MDOC_ARGS);
80d65f6f70SBen Gras static int mdoc_fa_pre(MDOC_ARGS);
81d65f6f70SBen Gras static int mdoc_fd_pre(MDOC_ARGS);
82d65f6f70SBen Gras static int mdoc_fl_pre(MDOC_ARGS);
83d65f6f70SBen Gras static int mdoc_fn_pre(MDOC_ARGS);
84d65f6f70SBen Gras static int mdoc_ft_pre(MDOC_ARGS);
85d65f6f70SBen Gras static int mdoc_em_pre(MDOC_ARGS);
86d65f6f70SBen Gras static int mdoc_er_pre(MDOC_ARGS);
87d65f6f70SBen Gras static int mdoc_ev_pre(MDOC_ARGS);
88d65f6f70SBen Gras static int mdoc_ex_pre(MDOC_ARGS);
89d65f6f70SBen Gras static void mdoc_fo_post(MDOC_ARGS);
90d65f6f70SBen Gras static int mdoc_fo_pre(MDOC_ARGS);
91d65f6f70SBen Gras static int mdoc_ic_pre(MDOC_ARGS);
92d65f6f70SBen Gras static int mdoc_igndelim_pre(MDOC_ARGS);
93d65f6f70SBen Gras static int mdoc_in_pre(MDOC_ARGS);
94d65f6f70SBen Gras static int mdoc_it_pre(MDOC_ARGS);
95d65f6f70SBen Gras static int mdoc_lb_pre(MDOC_ARGS);
96d65f6f70SBen Gras static int mdoc_li_pre(MDOC_ARGS);
97d65f6f70SBen Gras static int mdoc_lk_pre(MDOC_ARGS);
98d65f6f70SBen Gras static int mdoc_mt_pre(MDOC_ARGS);
99d65f6f70SBen Gras static int mdoc_ms_pre(MDOC_ARGS);
100d65f6f70SBen Gras static int mdoc_nd_pre(MDOC_ARGS);
101d65f6f70SBen Gras static int mdoc_nm_pre(MDOC_ARGS);
102d65f6f70SBen Gras static int mdoc_ns_pre(MDOC_ARGS);
103d65f6f70SBen Gras static int mdoc_pa_pre(MDOC_ARGS);
104d65f6f70SBen Gras static void mdoc_pf_post(MDOC_ARGS);
105d65f6f70SBen Gras static int mdoc_pp_pre(MDOC_ARGS);
106d65f6f70SBen Gras static void mdoc_quote_post(MDOC_ARGS);
107d65f6f70SBen Gras static int mdoc_quote_pre(MDOC_ARGS);
108d65f6f70SBen Gras static int mdoc_rs_pre(MDOC_ARGS);
109d65f6f70SBen Gras static int mdoc_rv_pre(MDOC_ARGS);
110d65f6f70SBen Gras static int mdoc_sh_pre(MDOC_ARGS);
111d65f6f70SBen Gras static int mdoc_sm_pre(MDOC_ARGS);
112d65f6f70SBen Gras static int mdoc_sp_pre(MDOC_ARGS);
113d65f6f70SBen Gras static int mdoc_ss_pre(MDOC_ARGS);
114d65f6f70SBen Gras static int mdoc_sx_pre(MDOC_ARGS);
115d65f6f70SBen Gras static int mdoc_sy_pre(MDOC_ARGS);
116d65f6f70SBen Gras static int mdoc_ud_pre(MDOC_ARGS);
117d65f6f70SBen Gras static int mdoc_va_pre(MDOC_ARGS);
118d65f6f70SBen Gras static int mdoc_vt_pre(MDOC_ARGS);
119d65f6f70SBen Gras static int mdoc_xr_pre(MDOC_ARGS);
120d65f6f70SBen Gras static int mdoc_xx_pre(MDOC_ARGS);
121d65f6f70SBen Gras
122d65f6f70SBen Gras static const struct htmlmdoc mdocs[MDOC_MAX] = {
123d65f6f70SBen Gras {mdoc_ap_pre, NULL}, /* Ap */
124d65f6f70SBen Gras {NULL, NULL}, /* Dd */
125d65f6f70SBen Gras {NULL, NULL}, /* Dt */
126d65f6f70SBen Gras {NULL, NULL}, /* Os */
127d65f6f70SBen Gras {mdoc_sh_pre, NULL }, /* Sh */
128d65f6f70SBen Gras {mdoc_ss_pre, NULL }, /* Ss */
129d65f6f70SBen Gras {mdoc_pp_pre, NULL}, /* Pp */
130d65f6f70SBen Gras {mdoc_d1_pre, NULL}, /* D1 */
131d65f6f70SBen Gras {mdoc_d1_pre, NULL}, /* Dl */
132d65f6f70SBen Gras {mdoc_bd_pre, NULL}, /* Bd */
133d65f6f70SBen Gras {NULL, NULL}, /* Ed */
134d65f6f70SBen Gras {mdoc_bl_pre, NULL}, /* Bl */
135d65f6f70SBen Gras {NULL, NULL}, /* El */
136d65f6f70SBen Gras {mdoc_it_pre, NULL}, /* It */
137d65f6f70SBen Gras {mdoc_ad_pre, NULL}, /* Ad */
138d65f6f70SBen Gras {mdoc_an_pre, NULL}, /* An */
139d65f6f70SBen Gras {mdoc_ar_pre, NULL}, /* Ar */
140d65f6f70SBen Gras {mdoc_cd_pre, NULL}, /* Cd */
141d65f6f70SBen Gras {mdoc_fl_pre, NULL}, /* Cm */
142d65f6f70SBen Gras {mdoc_dv_pre, NULL}, /* Dv */
143d65f6f70SBen Gras {mdoc_er_pre, NULL}, /* Er */
144d65f6f70SBen Gras {mdoc_ev_pre, NULL}, /* Ev */
145d65f6f70SBen Gras {mdoc_ex_pre, NULL}, /* Ex */
146d65f6f70SBen Gras {mdoc_fa_pre, NULL}, /* Fa */
147d65f6f70SBen Gras {mdoc_fd_pre, NULL}, /* Fd */
148d65f6f70SBen Gras {mdoc_fl_pre, NULL}, /* Fl */
149d65f6f70SBen Gras {mdoc_fn_pre, NULL}, /* Fn */
150d65f6f70SBen Gras {mdoc_ft_pre, NULL}, /* Ft */
151d65f6f70SBen Gras {mdoc_ic_pre, NULL}, /* Ic */
152d65f6f70SBen Gras {mdoc_in_pre, NULL}, /* In */
153d65f6f70SBen Gras {mdoc_li_pre, NULL}, /* Li */
154d65f6f70SBen Gras {mdoc_nd_pre, NULL}, /* Nd */
155d65f6f70SBen Gras {mdoc_nm_pre, NULL}, /* Nm */
156d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Op */
157d65f6f70SBen Gras {NULL, NULL}, /* Ot */
158d65f6f70SBen Gras {mdoc_pa_pre, NULL}, /* Pa */
159d65f6f70SBen Gras {mdoc_rv_pre, NULL}, /* Rv */
160d65f6f70SBen Gras {NULL, NULL}, /* St */
161d65f6f70SBen Gras {mdoc_va_pre, NULL}, /* Va */
162d65f6f70SBen Gras {mdoc_vt_pre, NULL}, /* Vt */
163d65f6f70SBen Gras {mdoc_xr_pre, NULL}, /* Xr */
164d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %A */
165d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %B */
166d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %D */
167d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %I */
168d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %J */
169d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %N */
170d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %O */
171d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %P */
172d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %R */
173d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %T */
174d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %V */
175d65f6f70SBen Gras {NULL, NULL}, /* Ac */
176d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Ao */
177d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Aq */
178d65f6f70SBen Gras {NULL, NULL}, /* At */
179d65f6f70SBen Gras {NULL, NULL}, /* Bc */
180d65f6f70SBen Gras {mdoc_bf_pre, NULL}, /* Bf */
181d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Bo */
182d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Bq */
183d65f6f70SBen Gras {mdoc_xx_pre, NULL}, /* Bsx */
184d65f6f70SBen Gras {mdoc_bx_pre, NULL}, /* Bx */
185d65f6f70SBen Gras {NULL, NULL}, /* Db */
186d65f6f70SBen Gras {NULL, NULL}, /* Dc */
187d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Do */
188d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Dq */
189d65f6f70SBen Gras {NULL, NULL}, /* Ec */ /* FIXME: no space */
190d65f6f70SBen Gras {NULL, NULL}, /* Ef */
191d65f6f70SBen Gras {mdoc_em_pre, NULL}, /* Em */
19292395e9cSLionel Sambuc {mdoc_quote_pre, mdoc_quote_post}, /* Eo */
193d65f6f70SBen Gras {mdoc_xx_pre, NULL}, /* Fx */
194d65f6f70SBen Gras {mdoc_ms_pre, NULL}, /* Ms */
195d65f6f70SBen Gras {mdoc_igndelim_pre, NULL}, /* No */
196d65f6f70SBen Gras {mdoc_ns_pre, NULL}, /* Ns */
197d65f6f70SBen Gras {mdoc_xx_pre, NULL}, /* Nx */
198d65f6f70SBen Gras {mdoc_xx_pre, NULL}, /* Ox */
199d65f6f70SBen Gras {NULL, NULL}, /* Pc */
200d65f6f70SBen Gras {mdoc_igndelim_pre, mdoc_pf_post}, /* Pf */
201d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Po */
202d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Pq */
203d65f6f70SBen Gras {NULL, NULL}, /* Qc */
204d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Ql */
205d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Qo */
206d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Qq */
207d65f6f70SBen Gras {NULL, NULL}, /* Re */
208d65f6f70SBen Gras {mdoc_rs_pre, NULL}, /* Rs */
209d65f6f70SBen Gras {NULL, NULL}, /* Sc */
210d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* So */
211d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Sq */
212d65f6f70SBen Gras {mdoc_sm_pre, NULL}, /* Sm */
213d65f6f70SBen Gras {mdoc_sx_pre, NULL}, /* Sx */
214d65f6f70SBen Gras {mdoc_sy_pre, NULL}, /* Sy */
215d65f6f70SBen Gras {NULL, NULL}, /* Tn */
216d65f6f70SBen Gras {mdoc_xx_pre, NULL}, /* Ux */
217d65f6f70SBen Gras {NULL, NULL}, /* Xc */
218d65f6f70SBen Gras {NULL, NULL}, /* Xo */
219d65f6f70SBen Gras {mdoc_fo_pre, mdoc_fo_post}, /* Fo */
220d65f6f70SBen Gras {NULL, NULL}, /* Fc */
221d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Oo */
222d65f6f70SBen Gras {NULL, NULL}, /* Oc */
223d65f6f70SBen Gras {mdoc_bk_pre, mdoc_bk_post}, /* Bk */
224d65f6f70SBen Gras {NULL, NULL}, /* Ek */
225d65f6f70SBen Gras {mdoc_bt_pre, NULL}, /* Bt */
226d65f6f70SBen Gras {NULL, NULL}, /* Hf */
227d65f6f70SBen Gras {NULL, NULL}, /* Fr */
228d65f6f70SBen Gras {mdoc_ud_pre, NULL}, /* Ud */
229d65f6f70SBen Gras {mdoc_lb_pre, NULL}, /* Lb */
230d65f6f70SBen Gras {mdoc_pp_pre, NULL}, /* Lp */
231d65f6f70SBen Gras {mdoc_lk_pre, NULL}, /* Lk */
232d65f6f70SBen Gras {mdoc_mt_pre, NULL}, /* Mt */
233d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Brq */
234d65f6f70SBen Gras {mdoc_quote_pre, mdoc_quote_post}, /* Bro */
235d65f6f70SBen Gras {NULL, NULL}, /* Brc */
236d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %C */
237d65f6f70SBen Gras {NULL, NULL}, /* Es */ /* TODO */
238d65f6f70SBen Gras {NULL, NULL}, /* En */ /* TODO */
239d65f6f70SBen Gras {mdoc_xx_pre, NULL}, /* Dx */
240d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %Q */
241d65f6f70SBen Gras {mdoc_sp_pre, NULL}, /* br */
242d65f6f70SBen Gras {mdoc_sp_pre, NULL}, /* sp */
243d65f6f70SBen Gras {mdoc__x_pre, mdoc__x_post}, /* %U */
244d65f6f70SBen Gras {NULL, NULL}, /* Ta */
245d65f6f70SBen Gras };
246d65f6f70SBen Gras
247d65f6f70SBen Gras static const char * const lists[LIST_MAX] = {
248d65f6f70SBen Gras NULL,
249d65f6f70SBen Gras "list-bul",
250d65f6f70SBen Gras "list-col",
251d65f6f70SBen Gras "list-dash",
252d65f6f70SBen Gras "list-diag",
253d65f6f70SBen Gras "list-enum",
254d65f6f70SBen Gras "list-hang",
255d65f6f70SBen Gras "list-hyph",
256d65f6f70SBen Gras "list-inset",
257d65f6f70SBen Gras "list-item",
258d65f6f70SBen Gras "list-ohang",
259d65f6f70SBen Gras "list-tag"
260d65f6f70SBen Gras };
261d65f6f70SBen Gras
262d65f6f70SBen Gras void
html_mdoc(void * arg,const struct mdoc * mdoc)263*0a6a1f1dSLionel Sambuc html_mdoc(void *arg, const struct mdoc *mdoc)
264d65f6f70SBen Gras {
265d65f6f70SBen Gras
266*0a6a1f1dSLionel Sambuc print_mdoc(mdoc_meta(mdoc), mdoc_node(mdoc),
267*0a6a1f1dSLionel Sambuc (struct html *)arg);
26892395e9cSLionel Sambuc putchar('\n');
269d65f6f70SBen Gras }
270d65f6f70SBen Gras
271d65f6f70SBen Gras
272d65f6f70SBen Gras /*
273d65f6f70SBen Gras * Calculate the scaling unit passed in a `-width' argument. This uses
274d65f6f70SBen Gras * either a native scaling unit (e.g., 1i, 2m) or the string length of
275d65f6f70SBen Gras * the value.
276d65f6f70SBen Gras */
277d65f6f70SBen Gras static void
a2width(const char * p,struct roffsu * su)278d65f6f70SBen Gras a2width(const char *p, struct roffsu *su)
279d65f6f70SBen Gras {
280d65f6f70SBen Gras
281d65f6f70SBen Gras if ( ! a2roffsu(p, su, SCALE_MAX)) {
282d65f6f70SBen Gras su->unit = SCALE_BU;
28392395e9cSLionel Sambuc su->scale = html_strlen(p);
284d65f6f70SBen Gras }
285d65f6f70SBen Gras }
286d65f6f70SBen Gras
287d65f6f70SBen Gras
288d65f6f70SBen Gras /*
289d65f6f70SBen Gras * See the same function in mdoc_term.c for documentation.
290d65f6f70SBen Gras */
291d65f6f70SBen Gras static void
synopsis_pre(struct html * h,const struct mdoc_node * n)292d65f6f70SBen Gras synopsis_pre(struct html *h, const struct mdoc_node *n)
293d65f6f70SBen Gras {
294d65f6f70SBen Gras
295d65f6f70SBen Gras if (NULL == n->prev || ! (MDOC_SYNPRETTY & n->flags))
296d65f6f70SBen Gras return;
297d65f6f70SBen Gras
298d65f6f70SBen Gras if (n->prev->tok == n->tok &&
299d65f6f70SBen Gras MDOC_Fo != n->tok &&
300d65f6f70SBen Gras MDOC_Ft != n->tok &&
301d65f6f70SBen Gras MDOC_Fn != n->tok) {
302d65f6f70SBen Gras print_otag(h, TAG_BR, 0, NULL);
303d65f6f70SBen Gras return;
304d65f6f70SBen Gras }
305d65f6f70SBen Gras
306d65f6f70SBen Gras switch (n->prev->tok) {
307d65f6f70SBen Gras case (MDOC_Fd):
308d65f6f70SBen Gras /* FALLTHROUGH */
309d65f6f70SBen Gras case (MDOC_Fn):
310d65f6f70SBen Gras /* FALLTHROUGH */
311d65f6f70SBen Gras case (MDOC_Fo):
312d65f6f70SBen Gras /* FALLTHROUGH */
313d65f6f70SBen Gras case (MDOC_In):
314d65f6f70SBen Gras /* FALLTHROUGH */
315d65f6f70SBen Gras case (MDOC_Vt):
316d65f6f70SBen Gras print_otag(h, TAG_P, 0, NULL);
317d65f6f70SBen Gras break;
318d65f6f70SBen Gras case (MDOC_Ft):
319d65f6f70SBen Gras if (MDOC_Fn != n->tok && MDOC_Fo != n->tok) {
320d65f6f70SBen Gras print_otag(h, TAG_P, 0, NULL);
321d65f6f70SBen Gras break;
322d65f6f70SBen Gras }
323d65f6f70SBen Gras /* FALLTHROUGH */
324d65f6f70SBen Gras default:
325d65f6f70SBen Gras print_otag(h, TAG_BR, 0, NULL);
326d65f6f70SBen Gras break;
327d65f6f70SBen Gras }
328d65f6f70SBen Gras }
329d65f6f70SBen Gras
330d65f6f70SBen Gras
331d65f6f70SBen Gras /*
332d65f6f70SBen Gras * Calculate the scaling unit passed in an `-offset' argument. This
333d65f6f70SBen Gras * uses either a native scaling unit (e.g., 1i, 2m), one of a set of
334d65f6f70SBen Gras * predefined strings (indent, etc.), or the string length of the value.
335d65f6f70SBen Gras */
336d65f6f70SBen Gras static void
a2offs(const char * p,struct roffsu * su)337d65f6f70SBen Gras a2offs(const char *p, struct roffsu *su)
338d65f6f70SBen Gras {
339d65f6f70SBen Gras
340d65f6f70SBen Gras /* FIXME: "right"? */
341d65f6f70SBen Gras
342d65f6f70SBen Gras if (0 == strcmp(p, "left"))
343d65f6f70SBen Gras SCALE_HS_INIT(su, 0);
344d65f6f70SBen Gras else if (0 == strcmp(p, "indent"))
345d65f6f70SBen Gras SCALE_HS_INIT(su, INDENT);
346d65f6f70SBen Gras else if (0 == strcmp(p, "indent-two"))
347d65f6f70SBen Gras SCALE_HS_INIT(su, INDENT * 2);
34892395e9cSLionel Sambuc else if ( ! a2roffsu(p, su, SCALE_MAX))
34992395e9cSLionel Sambuc SCALE_HS_INIT(su, html_strlen(p));
350d65f6f70SBen Gras }
351d65f6f70SBen Gras
352d65f6f70SBen Gras
353d65f6f70SBen Gras static void
print_mdoc(MDOC_ARGS)354d65f6f70SBen Gras print_mdoc(MDOC_ARGS)
355d65f6f70SBen Gras {
35692395e9cSLionel Sambuc struct tag *t, *tt;
35792395e9cSLionel Sambuc struct htmlpair tag;
358d65f6f70SBen Gras
35992395e9cSLionel Sambuc PAIR_CLASS_INIT(&tag, "mandoc");
36092395e9cSLionel Sambuc
36192395e9cSLionel Sambuc if ( ! (HTML_FRAGMENT & h->oflags)) {
36292395e9cSLionel Sambuc print_gen_decls(h);
36392395e9cSLionel Sambuc t = print_otag(h, TAG_HTML, 0, NULL);
36492395e9cSLionel Sambuc tt = print_otag(h, TAG_HEAD, 0, NULL);
365*0a6a1f1dSLionel Sambuc print_mdoc_head(meta, n, h);
36692395e9cSLionel Sambuc print_tagq(h, tt);
36792395e9cSLionel Sambuc print_otag(h, TAG_BODY, 0, NULL);
36892395e9cSLionel Sambuc print_otag(h, TAG_DIV, 1, &tag);
36992395e9cSLionel Sambuc } else
37092395e9cSLionel Sambuc t = print_otag(h, TAG_DIV, 1, &tag);
371d65f6f70SBen Gras
372*0a6a1f1dSLionel Sambuc print_mdoc_nodelist(meta, n, h);
373d65f6f70SBen Gras print_tagq(h, t);
374d65f6f70SBen Gras }
375d65f6f70SBen Gras
376d65f6f70SBen Gras
377d65f6f70SBen Gras /* ARGSUSED */
378d65f6f70SBen Gras static void
print_mdoc_head(MDOC_ARGS)379d65f6f70SBen Gras print_mdoc_head(MDOC_ARGS)
380d65f6f70SBen Gras {
381d65f6f70SBen Gras
382d65f6f70SBen Gras print_gen_head(h);
383d65f6f70SBen Gras bufinit(h);
384*0a6a1f1dSLionel Sambuc bufcat_fmt(h, "%s(%s)", meta->title, meta->msec);
385d65f6f70SBen Gras
386*0a6a1f1dSLionel Sambuc if (meta->arch)
387*0a6a1f1dSLionel Sambuc bufcat_fmt(h, " (%s)", meta->arch);
388d65f6f70SBen Gras
389d65f6f70SBen Gras print_otag(h, TAG_TITLE, 0, NULL);
390d65f6f70SBen Gras print_text(h, h->buf);
391d65f6f70SBen Gras }
392d65f6f70SBen Gras
393d65f6f70SBen Gras
394d65f6f70SBen Gras static void
print_mdoc_nodelist(MDOC_ARGS)395d65f6f70SBen Gras print_mdoc_nodelist(MDOC_ARGS)
396d65f6f70SBen Gras {
397d65f6f70SBen Gras
398*0a6a1f1dSLionel Sambuc print_mdoc_node(meta, n, h);
399d65f6f70SBen Gras if (n->next)
400*0a6a1f1dSLionel Sambuc print_mdoc_nodelist(meta, n->next, h);
401d65f6f70SBen Gras }
402d65f6f70SBen Gras
403d65f6f70SBen Gras
404d65f6f70SBen Gras static void
print_mdoc_node(MDOC_ARGS)405d65f6f70SBen Gras print_mdoc_node(MDOC_ARGS)
406d65f6f70SBen Gras {
407d65f6f70SBen Gras int child;
408d65f6f70SBen Gras struct tag *t;
409d65f6f70SBen Gras
410d65f6f70SBen Gras child = 1;
411d65f6f70SBen Gras t = h->tags.head;
412d65f6f70SBen Gras
413d65f6f70SBen Gras switch (n->type) {
414d65f6f70SBen Gras case (MDOC_ROOT):
415*0a6a1f1dSLionel Sambuc child = mdoc_root_pre(meta, n, h);
416d65f6f70SBen Gras break;
417d65f6f70SBen Gras case (MDOC_TEXT):
41892395e9cSLionel Sambuc /* No tables in this mode... */
41992395e9cSLionel Sambuc assert(NULL == h->tblt);
42092395e9cSLionel Sambuc
42192395e9cSLionel Sambuc /*
42292395e9cSLionel Sambuc * Make sure that if we're in a literal mode already
42392395e9cSLionel Sambuc * (i.e., within a <PRE>) don't print the newline.
42492395e9cSLionel Sambuc */
42592395e9cSLionel Sambuc if (' ' == *n->string && MDOC_LINE & n->flags)
42692395e9cSLionel Sambuc if ( ! (HTML_LITERAL & h->flags))
42792395e9cSLionel Sambuc print_otag(h, TAG_BR, 0, NULL);
42892395e9cSLionel Sambuc if (MDOC_DELIMC & n->flags)
42992395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
430d65f6f70SBen Gras print_text(h, n->string);
43192395e9cSLionel Sambuc if (MDOC_DELIMO & n->flags)
43292395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
433d65f6f70SBen Gras return;
43492395e9cSLionel Sambuc case (MDOC_EQN):
43592395e9cSLionel Sambuc print_eqn(h, n->eqn);
436d65f6f70SBen Gras break;
43792395e9cSLionel Sambuc case (MDOC_TBL):
43892395e9cSLionel Sambuc /*
43992395e9cSLionel Sambuc * This will take care of initialising all of the table
44092395e9cSLionel Sambuc * state data for the first table, then tearing it down
44192395e9cSLionel Sambuc * for the last one.
44292395e9cSLionel Sambuc */
44392395e9cSLionel Sambuc print_tbl(h, n->span);
44492395e9cSLionel Sambuc return;
445d65f6f70SBen Gras default:
44692395e9cSLionel Sambuc /*
44792395e9cSLionel Sambuc * Close out the current table, if it's open, and unset
44892395e9cSLionel Sambuc * the "meta" table state. This will be reopened on the
44992395e9cSLionel Sambuc * next table element.
45092395e9cSLionel Sambuc */
45192395e9cSLionel Sambuc if (h->tblt) {
45292395e9cSLionel Sambuc print_tblclose(h);
45392395e9cSLionel Sambuc t = h->tags.head;
45492395e9cSLionel Sambuc }
45592395e9cSLionel Sambuc
45692395e9cSLionel Sambuc assert(NULL == h->tblt);
457d65f6f70SBen Gras if (mdocs[n->tok].pre && ENDBODY_NOT == n->end)
458*0a6a1f1dSLionel Sambuc child = (*mdocs[n->tok].pre)(meta, n, h);
459d65f6f70SBen Gras break;
460d65f6f70SBen Gras }
461d65f6f70SBen Gras
462d65f6f70SBen Gras if (HTML_KEEP & h->flags) {
463*0a6a1f1dSLionel Sambuc if (n->prev ? (n->prev->lastline != n->line) :
464*0a6a1f1dSLionel Sambuc (n->parent && n->parent->line != n->line)) {
465d65f6f70SBen Gras h->flags &= ~HTML_KEEP;
466d65f6f70SBen Gras h->flags |= HTML_PREKEEP;
467d65f6f70SBen Gras }
468d65f6f70SBen Gras }
469d65f6f70SBen Gras
470d65f6f70SBen Gras if (child && n->child)
471*0a6a1f1dSLionel Sambuc print_mdoc_nodelist(meta, n->child, h);
472d65f6f70SBen Gras
473d65f6f70SBen Gras print_stagq(h, t);
474d65f6f70SBen Gras
475d65f6f70SBen Gras switch (n->type) {
476d65f6f70SBen Gras case (MDOC_ROOT):
477*0a6a1f1dSLionel Sambuc mdoc_root_post(meta, n, h);
478d65f6f70SBen Gras break;
47992395e9cSLionel Sambuc case (MDOC_EQN):
480d65f6f70SBen Gras break;
481d65f6f70SBen Gras default:
482d65f6f70SBen Gras if (mdocs[n->tok].post && ENDBODY_NOT == n->end)
483*0a6a1f1dSLionel Sambuc (*mdocs[n->tok].post)(meta, n, h);
484d65f6f70SBen Gras break;
485d65f6f70SBen Gras }
486d65f6f70SBen Gras }
487d65f6f70SBen Gras
488d65f6f70SBen Gras /* ARGSUSED */
489d65f6f70SBen Gras static void
mdoc_root_post(MDOC_ARGS)490d65f6f70SBen Gras mdoc_root_post(MDOC_ARGS)
491d65f6f70SBen Gras {
492d65f6f70SBen Gras struct htmlpair tag[3];
493d65f6f70SBen Gras struct tag *t, *tt;
494d65f6f70SBen Gras
495d65f6f70SBen Gras PAIR_SUMMARY_INIT(&tag[0], "Document Footer");
496d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[1], "foot");
497d65f6f70SBen Gras PAIR_INIT(&tag[2], ATTR_WIDTH, "100%");
498d65f6f70SBen Gras t = print_otag(h, TAG_TABLE, 3, tag);
499d65f6f70SBen Gras PAIR_INIT(&tag[0], ATTR_WIDTH, "50%");
500d65f6f70SBen Gras print_otag(h, TAG_COL, 1, tag);
501d65f6f70SBen Gras print_otag(h, TAG_COL, 1, tag);
502d65f6f70SBen Gras
50392395e9cSLionel Sambuc print_otag(h, TAG_TBODY, 0, NULL);
504d65f6f70SBen Gras
505d65f6f70SBen Gras tt = print_otag(h, TAG_TR, 0, NULL);
506d65f6f70SBen Gras
507d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "foot-date");
508d65f6f70SBen Gras print_otag(h, TAG_TD, 1, tag);
509*0a6a1f1dSLionel Sambuc print_text(h, meta->date);
510d65f6f70SBen Gras print_stagq(h, tt);
511d65f6f70SBen Gras
512d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "foot-os");
513d65f6f70SBen Gras PAIR_INIT(&tag[1], ATTR_ALIGN, "right");
514d65f6f70SBen Gras print_otag(h, TAG_TD, 2, tag);
515*0a6a1f1dSLionel Sambuc print_text(h, meta->os);
516d65f6f70SBen Gras print_tagq(h, t);
517d65f6f70SBen Gras }
518d65f6f70SBen Gras
519d65f6f70SBen Gras
520d65f6f70SBen Gras /* ARGSUSED */
521d65f6f70SBen Gras static int
mdoc_root_pre(MDOC_ARGS)522d65f6f70SBen Gras mdoc_root_pre(MDOC_ARGS)
523d65f6f70SBen Gras {
524d65f6f70SBen Gras struct htmlpair tag[3];
525d65f6f70SBen Gras struct tag *t, *tt;
526d65f6f70SBen Gras char b[BUFSIZ], title[BUFSIZ];
527d65f6f70SBen Gras
528*0a6a1f1dSLionel Sambuc strlcpy(b, meta->vol, BUFSIZ);
529d65f6f70SBen Gras
530*0a6a1f1dSLionel Sambuc if (meta->arch) {
531d65f6f70SBen Gras strlcat(b, " (", BUFSIZ);
532*0a6a1f1dSLionel Sambuc strlcat(b, meta->arch, BUFSIZ);
533d65f6f70SBen Gras strlcat(b, ")", BUFSIZ);
534d65f6f70SBen Gras }
535d65f6f70SBen Gras
536*0a6a1f1dSLionel Sambuc snprintf(title, BUFSIZ - 1, "%s(%s)", meta->title, meta->msec);
537d65f6f70SBen Gras
538d65f6f70SBen Gras PAIR_SUMMARY_INIT(&tag[0], "Document Header");
539d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[1], "head");
540d65f6f70SBen Gras PAIR_INIT(&tag[2], ATTR_WIDTH, "100%");
541d65f6f70SBen Gras t = print_otag(h, TAG_TABLE, 3, tag);
542d65f6f70SBen Gras PAIR_INIT(&tag[0], ATTR_WIDTH, "30%");
543d65f6f70SBen Gras print_otag(h, TAG_COL, 1, tag);
544d65f6f70SBen Gras print_otag(h, TAG_COL, 1, tag);
545d65f6f70SBen Gras print_otag(h, TAG_COL, 1, tag);
546d65f6f70SBen Gras
547d65f6f70SBen Gras print_otag(h, TAG_TBODY, 0, NULL);
548d65f6f70SBen Gras
549d65f6f70SBen Gras tt = print_otag(h, TAG_TR, 0, NULL);
550d65f6f70SBen Gras
551d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "head-ltitle");
552d65f6f70SBen Gras print_otag(h, TAG_TD, 1, tag);
553d65f6f70SBen Gras print_text(h, title);
554d65f6f70SBen Gras print_stagq(h, tt);
555d65f6f70SBen Gras
556d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "head-vol");
557d65f6f70SBen Gras PAIR_INIT(&tag[1], ATTR_ALIGN, "center");
558d65f6f70SBen Gras print_otag(h, TAG_TD, 2, tag);
559d65f6f70SBen Gras print_text(h, b);
560d65f6f70SBen Gras print_stagq(h, tt);
561d65f6f70SBen Gras
562d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "head-rtitle");
563d65f6f70SBen Gras PAIR_INIT(&tag[1], ATTR_ALIGN, "right");
564d65f6f70SBen Gras print_otag(h, TAG_TD, 2, tag);
565d65f6f70SBen Gras print_text(h, title);
566d65f6f70SBen Gras print_tagq(h, t);
567d65f6f70SBen Gras return(1);
568d65f6f70SBen Gras }
569d65f6f70SBen Gras
570d65f6f70SBen Gras
571d65f6f70SBen Gras /* ARGSUSED */
572d65f6f70SBen Gras static int
mdoc_sh_pre(MDOC_ARGS)573d65f6f70SBen Gras mdoc_sh_pre(MDOC_ARGS)
574d65f6f70SBen Gras {
575d65f6f70SBen Gras struct htmlpair tag;
576d65f6f70SBen Gras
577d65f6f70SBen Gras if (MDOC_BLOCK == n->type) {
578d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "section");
579d65f6f70SBen Gras print_otag(h, TAG_DIV, 1, &tag);
580d65f6f70SBen Gras return(1);
581d65f6f70SBen Gras } else if (MDOC_BODY == n->type)
582d65f6f70SBen Gras return(1);
583d65f6f70SBen Gras
58492395e9cSLionel Sambuc bufinit(h);
58592395e9cSLionel Sambuc bufcat(h, "x");
58692395e9cSLionel Sambuc
58792395e9cSLionel Sambuc for (n = n->child; n && MDOC_TEXT == n->type; ) {
58892395e9cSLionel Sambuc bufcat_id(h, n->string);
58992395e9cSLionel Sambuc if (NULL != (n = n->next))
59092395e9cSLionel Sambuc bufcat_id(h, " ");
591d65f6f70SBen Gras }
592d65f6f70SBen Gras
59392395e9cSLionel Sambuc if (NULL == n) {
59492395e9cSLionel Sambuc PAIR_ID_INIT(&tag, h->buf);
595d65f6f70SBen Gras print_otag(h, TAG_H1, 1, &tag);
59692395e9cSLionel Sambuc } else
59792395e9cSLionel Sambuc print_otag(h, TAG_H1, 0, NULL);
59892395e9cSLionel Sambuc
599d65f6f70SBen Gras return(1);
600d65f6f70SBen Gras }
601d65f6f70SBen Gras
602d65f6f70SBen Gras /* ARGSUSED */
603d65f6f70SBen Gras static int
mdoc_ss_pre(MDOC_ARGS)604d65f6f70SBen Gras mdoc_ss_pre(MDOC_ARGS)
605d65f6f70SBen Gras {
606d65f6f70SBen Gras struct htmlpair tag;
607d65f6f70SBen Gras
608d65f6f70SBen Gras if (MDOC_BLOCK == n->type) {
609d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "subsection");
610d65f6f70SBen Gras print_otag(h, TAG_DIV, 1, &tag);
611d65f6f70SBen Gras return(1);
612d65f6f70SBen Gras } else if (MDOC_BODY == n->type)
613d65f6f70SBen Gras return(1);
614d65f6f70SBen Gras
61592395e9cSLionel Sambuc bufinit(h);
61692395e9cSLionel Sambuc bufcat(h, "x");
61792395e9cSLionel Sambuc
61892395e9cSLionel Sambuc for (n = n->child; n && MDOC_TEXT == n->type; ) {
61992395e9cSLionel Sambuc bufcat_id(h, n->string);
62092395e9cSLionel Sambuc if (NULL != (n = n->next))
62192395e9cSLionel Sambuc bufcat_id(h, " ");
622d65f6f70SBen Gras }
623d65f6f70SBen Gras
62492395e9cSLionel Sambuc if (NULL == n) {
62592395e9cSLionel Sambuc PAIR_ID_INIT(&tag, h->buf);
626d65f6f70SBen Gras print_otag(h, TAG_H2, 1, &tag);
62792395e9cSLionel Sambuc } else
62892395e9cSLionel Sambuc print_otag(h, TAG_H2, 0, NULL);
62992395e9cSLionel Sambuc
630d65f6f70SBen Gras return(1);
631d65f6f70SBen Gras }
632d65f6f70SBen Gras
633d65f6f70SBen Gras
634d65f6f70SBen Gras /* ARGSUSED */
635d65f6f70SBen Gras static int
mdoc_fl_pre(MDOC_ARGS)636d65f6f70SBen Gras mdoc_fl_pre(MDOC_ARGS)
637d65f6f70SBen Gras {
638d65f6f70SBen Gras struct htmlpair tag;
639d65f6f70SBen Gras
640d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "flag");
641d65f6f70SBen Gras print_otag(h, TAG_B, 1, &tag);
642d65f6f70SBen Gras
643d65f6f70SBen Gras /* `Cm' has no leading hyphen. */
644d65f6f70SBen Gras
645d65f6f70SBen Gras if (MDOC_Cm == n->tok)
646d65f6f70SBen Gras return(1);
647d65f6f70SBen Gras
648d65f6f70SBen Gras print_text(h, "\\-");
649d65f6f70SBen Gras
650d65f6f70SBen Gras if (n->child)
651d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
652d65f6f70SBen Gras else if (n->next && n->next->line == n->line)
653d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
654d65f6f70SBen Gras
655d65f6f70SBen Gras return(1);
656d65f6f70SBen Gras }
657d65f6f70SBen Gras
658d65f6f70SBen Gras
659d65f6f70SBen Gras /* ARGSUSED */
660d65f6f70SBen Gras static int
mdoc_nd_pre(MDOC_ARGS)661d65f6f70SBen Gras mdoc_nd_pre(MDOC_ARGS)
662d65f6f70SBen Gras {
663d65f6f70SBen Gras struct htmlpair tag;
664d65f6f70SBen Gras
665d65f6f70SBen Gras if (MDOC_BODY != n->type)
666d65f6f70SBen Gras return(1);
667d65f6f70SBen Gras
668d65f6f70SBen Gras /* XXX: this tag in theory can contain block elements. */
669d65f6f70SBen Gras
670d65f6f70SBen Gras print_text(h, "\\(em");
671d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "desc");
672d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
673d65f6f70SBen Gras return(1);
674d65f6f70SBen Gras }
675d65f6f70SBen Gras
676d65f6f70SBen Gras
677d65f6f70SBen Gras static int
mdoc_nm_pre(MDOC_ARGS)678d65f6f70SBen Gras mdoc_nm_pre(MDOC_ARGS)
679d65f6f70SBen Gras {
680d65f6f70SBen Gras struct htmlpair tag;
681d65f6f70SBen Gras struct roffsu su;
68292395e9cSLionel Sambuc int len;
683d65f6f70SBen Gras
684d65f6f70SBen Gras switch (n->type) {
685d65f6f70SBen Gras case (MDOC_ELEM):
686d65f6f70SBen Gras synopsis_pre(h, n);
687d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "name");
688d65f6f70SBen Gras print_otag(h, TAG_B, 1, &tag);
689*0a6a1f1dSLionel Sambuc if (NULL == n->child && meta->name)
690*0a6a1f1dSLionel Sambuc print_text(h, meta->name);
691d65f6f70SBen Gras return(1);
692d65f6f70SBen Gras case (MDOC_HEAD):
693d65f6f70SBen Gras print_otag(h, TAG_TD, 0, NULL);
694*0a6a1f1dSLionel Sambuc if (NULL == n->child && meta->name)
695*0a6a1f1dSLionel Sambuc print_text(h, meta->name);
696d65f6f70SBen Gras return(1);
697d65f6f70SBen Gras case (MDOC_BODY):
698d65f6f70SBen Gras print_otag(h, TAG_TD, 0, NULL);
699d65f6f70SBen Gras return(1);
700d65f6f70SBen Gras default:
701d65f6f70SBen Gras break;
702d65f6f70SBen Gras }
703d65f6f70SBen Gras
704d65f6f70SBen Gras synopsis_pre(h, n);
705d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "synopsis");
706d65f6f70SBen Gras print_otag(h, TAG_TABLE, 1, &tag);
707d65f6f70SBen Gras
708d65f6f70SBen Gras for (len = 0, n = n->child; n; n = n->next)
709d65f6f70SBen Gras if (MDOC_TEXT == n->type)
71092395e9cSLionel Sambuc len += html_strlen(n->string);
711d65f6f70SBen Gras
712*0a6a1f1dSLionel Sambuc if (0 == len && meta->name)
713*0a6a1f1dSLionel Sambuc len = html_strlen(meta->name);
714d65f6f70SBen Gras
715d65f6f70SBen Gras SCALE_HS_INIT(&su, (double)len);
71692395e9cSLionel Sambuc bufinit(h);
717d65f6f70SBen Gras bufcat_su(h, "width", &su);
718d65f6f70SBen Gras PAIR_STYLE_INIT(&tag, h);
719d65f6f70SBen Gras print_otag(h, TAG_COL, 1, &tag);
720d65f6f70SBen Gras print_otag(h, TAG_COL, 0, NULL);
721d65f6f70SBen Gras print_otag(h, TAG_TBODY, 0, NULL);
722d65f6f70SBen Gras print_otag(h, TAG_TR, 0, NULL);
723d65f6f70SBen Gras return(1);
724d65f6f70SBen Gras }
725d65f6f70SBen Gras
726d65f6f70SBen Gras
727d65f6f70SBen Gras /* ARGSUSED */
728d65f6f70SBen Gras static int
mdoc_xr_pre(MDOC_ARGS)729d65f6f70SBen Gras mdoc_xr_pre(MDOC_ARGS)
730d65f6f70SBen Gras {
731d65f6f70SBen Gras struct htmlpair tag[2];
732d65f6f70SBen Gras
733d65f6f70SBen Gras if (NULL == n->child)
734d65f6f70SBen Gras return(0);
735d65f6f70SBen Gras
736d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "link-man");
737d65f6f70SBen Gras
738d65f6f70SBen Gras if (h->base_man) {
739d65f6f70SBen Gras buffmt_man(h, n->child->string,
740d65f6f70SBen Gras n->child->next ?
741d65f6f70SBen Gras n->child->next->string : NULL);
742d65f6f70SBen Gras PAIR_HREF_INIT(&tag[1], h->buf);
743d65f6f70SBen Gras print_otag(h, TAG_A, 2, tag);
744d65f6f70SBen Gras } else
745d65f6f70SBen Gras print_otag(h, TAG_A, 1, tag);
746d65f6f70SBen Gras
74792395e9cSLionel Sambuc n = n->child;
74892395e9cSLionel Sambuc print_text(h, n->string);
749d65f6f70SBen Gras
75092395e9cSLionel Sambuc if (NULL == (n = n->next))
751d65f6f70SBen Gras return(0);
752d65f6f70SBen Gras
753d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
754d65f6f70SBen Gras print_text(h, "(");
755d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
75692395e9cSLionel Sambuc print_text(h, n->string);
757d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
758d65f6f70SBen Gras print_text(h, ")");
759d65f6f70SBen Gras return(0);
760d65f6f70SBen Gras }
761d65f6f70SBen Gras
762d65f6f70SBen Gras
763d65f6f70SBen Gras /* ARGSUSED */
764d65f6f70SBen Gras static int
mdoc_ns_pre(MDOC_ARGS)765d65f6f70SBen Gras mdoc_ns_pre(MDOC_ARGS)
766d65f6f70SBen Gras {
767d65f6f70SBen Gras
76892395e9cSLionel Sambuc if ( ! (MDOC_LINE & n->flags))
769d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
770d65f6f70SBen Gras return(1);
771d65f6f70SBen Gras }
772d65f6f70SBen Gras
773d65f6f70SBen Gras
774d65f6f70SBen Gras /* ARGSUSED */
775d65f6f70SBen Gras static int
mdoc_ar_pre(MDOC_ARGS)776d65f6f70SBen Gras mdoc_ar_pre(MDOC_ARGS)
777d65f6f70SBen Gras {
778d65f6f70SBen Gras struct htmlpair tag;
779d65f6f70SBen Gras
780d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "arg");
781d65f6f70SBen Gras print_otag(h, TAG_I, 1, &tag);
782d65f6f70SBen Gras return(1);
783d65f6f70SBen Gras }
784d65f6f70SBen Gras
785d65f6f70SBen Gras
786d65f6f70SBen Gras /* ARGSUSED */
787d65f6f70SBen Gras static int
mdoc_xx_pre(MDOC_ARGS)788d65f6f70SBen Gras mdoc_xx_pre(MDOC_ARGS)
789d65f6f70SBen Gras {
790d65f6f70SBen Gras const char *pp;
791d65f6f70SBen Gras struct htmlpair tag;
79292395e9cSLionel Sambuc int flags;
793d65f6f70SBen Gras
794d65f6f70SBen Gras switch (n->tok) {
795d65f6f70SBen Gras case (MDOC_Bsx):
796d65f6f70SBen Gras pp = "BSD/OS";
797d65f6f70SBen Gras break;
798d65f6f70SBen Gras case (MDOC_Dx):
799d65f6f70SBen Gras pp = "DragonFly";
800d65f6f70SBen Gras break;
801d65f6f70SBen Gras case (MDOC_Fx):
802d65f6f70SBen Gras pp = "FreeBSD";
803d65f6f70SBen Gras break;
804d65f6f70SBen Gras case (MDOC_Nx):
805d65f6f70SBen Gras pp = "NetBSD";
806d65f6f70SBen Gras break;
807d65f6f70SBen Gras case (MDOC_Ox):
808d65f6f70SBen Gras pp = "OpenBSD";
809d65f6f70SBen Gras break;
810d65f6f70SBen Gras case (MDOC_Ux):
811d65f6f70SBen Gras pp = "UNIX";
812d65f6f70SBen Gras break;
813d65f6f70SBen Gras default:
814d65f6f70SBen Gras return(1);
815d65f6f70SBen Gras }
816d65f6f70SBen Gras
817d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "unix");
818d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
81992395e9cSLionel Sambuc
820d65f6f70SBen Gras print_text(h, pp);
82192395e9cSLionel Sambuc if (n->child) {
82292395e9cSLionel Sambuc flags = h->flags;
82392395e9cSLionel Sambuc h->flags |= HTML_KEEP;
82492395e9cSLionel Sambuc print_text(h, n->child->string);
82592395e9cSLionel Sambuc h->flags = flags;
82692395e9cSLionel Sambuc }
82792395e9cSLionel Sambuc return(0);
828d65f6f70SBen Gras }
829d65f6f70SBen Gras
830d65f6f70SBen Gras
831d65f6f70SBen Gras /* ARGSUSED */
832d65f6f70SBen Gras static int
mdoc_bx_pre(MDOC_ARGS)833d65f6f70SBen Gras mdoc_bx_pre(MDOC_ARGS)
834d65f6f70SBen Gras {
835d65f6f70SBen Gras struct htmlpair tag;
836d65f6f70SBen Gras
837d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "unix");
838d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
839d65f6f70SBen Gras
84092395e9cSLionel Sambuc if (NULL != (n = n->child)) {
84192395e9cSLionel Sambuc print_text(h, n->string);
842d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
843d65f6f70SBen Gras print_text(h, "BSD");
84492395e9cSLionel Sambuc } else {
84592395e9cSLionel Sambuc print_text(h, "BSD");
84692395e9cSLionel Sambuc return(0);
84792395e9cSLionel Sambuc }
84892395e9cSLionel Sambuc
84992395e9cSLionel Sambuc if (NULL != (n = n->next)) {
85092395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
85192395e9cSLionel Sambuc print_text(h, "-");
85292395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
85392395e9cSLionel Sambuc print_text(h, n->string);
85492395e9cSLionel Sambuc }
85592395e9cSLionel Sambuc
856d65f6f70SBen Gras return(0);
857d65f6f70SBen Gras }
858d65f6f70SBen Gras
859d65f6f70SBen Gras /* ARGSUSED */
860d65f6f70SBen Gras static int
mdoc_it_pre(MDOC_ARGS)861d65f6f70SBen Gras mdoc_it_pre(MDOC_ARGS)
862d65f6f70SBen Gras {
863d65f6f70SBen Gras struct roffsu su;
864d65f6f70SBen Gras enum mdoc_list type;
865d65f6f70SBen Gras struct htmlpair tag[2];
866d65f6f70SBen Gras const struct mdoc_node *bl;
867d65f6f70SBen Gras
868d65f6f70SBen Gras bl = n->parent;
869d65f6f70SBen Gras while (bl && MDOC_Bl != bl->tok)
870d65f6f70SBen Gras bl = bl->parent;
871d65f6f70SBen Gras
872d65f6f70SBen Gras assert(bl);
873d65f6f70SBen Gras
874d65f6f70SBen Gras type = bl->norm->Bl.type;
875d65f6f70SBen Gras
876d65f6f70SBen Gras assert(lists[type]);
877d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], lists[type]);
878d65f6f70SBen Gras
87992395e9cSLionel Sambuc bufinit(h);
88092395e9cSLionel Sambuc
881d65f6f70SBen Gras if (MDOC_HEAD == n->type) {
882d65f6f70SBen Gras switch (type) {
883d65f6f70SBen Gras case(LIST_bullet):
884d65f6f70SBen Gras /* FALLTHROUGH */
885d65f6f70SBen Gras case(LIST_dash):
886d65f6f70SBen Gras /* FALLTHROUGH */
887d65f6f70SBen Gras case(LIST_item):
888d65f6f70SBen Gras /* FALLTHROUGH */
889d65f6f70SBen Gras case(LIST_hyphen):
890d65f6f70SBen Gras /* FALLTHROUGH */
891d65f6f70SBen Gras case(LIST_enum):
892d65f6f70SBen Gras return(0);
893d65f6f70SBen Gras case(LIST_diag):
894d65f6f70SBen Gras /* FALLTHROUGH */
895d65f6f70SBen Gras case(LIST_hang):
896d65f6f70SBen Gras /* FALLTHROUGH */
897d65f6f70SBen Gras case(LIST_inset):
898d65f6f70SBen Gras /* FALLTHROUGH */
899d65f6f70SBen Gras case(LIST_ohang):
900d65f6f70SBen Gras /* FALLTHROUGH */
901d65f6f70SBen Gras case(LIST_tag):
902d65f6f70SBen Gras SCALE_VS_INIT(&su, ! bl->norm->Bl.comp);
903d65f6f70SBen Gras bufcat_su(h, "margin-top", &su);
904d65f6f70SBen Gras PAIR_STYLE_INIT(&tag[1], h);
905d65f6f70SBen Gras print_otag(h, TAG_DT, 2, tag);
906d65f6f70SBen Gras if (LIST_diag != type)
907d65f6f70SBen Gras break;
908d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "diag");
909d65f6f70SBen Gras print_otag(h, TAG_B, 1, tag);
910d65f6f70SBen Gras break;
911d65f6f70SBen Gras case(LIST_column):
912d65f6f70SBen Gras break;
913d65f6f70SBen Gras default:
914d65f6f70SBen Gras break;
915d65f6f70SBen Gras }
916d65f6f70SBen Gras } else if (MDOC_BODY == n->type) {
917d65f6f70SBen Gras switch (type) {
918d65f6f70SBen Gras case(LIST_bullet):
919d65f6f70SBen Gras /* FALLTHROUGH */
920d65f6f70SBen Gras case(LIST_hyphen):
921d65f6f70SBen Gras /* FALLTHROUGH */
922d65f6f70SBen Gras case(LIST_dash):
923d65f6f70SBen Gras /* FALLTHROUGH */
924d65f6f70SBen Gras case(LIST_enum):
925d65f6f70SBen Gras /* FALLTHROUGH */
926d65f6f70SBen Gras case(LIST_item):
927d65f6f70SBen Gras SCALE_VS_INIT(&su, ! bl->norm->Bl.comp);
928d65f6f70SBen Gras bufcat_su(h, "margin-top", &su);
929d65f6f70SBen Gras PAIR_STYLE_INIT(&tag[1], h);
930d65f6f70SBen Gras print_otag(h, TAG_LI, 2, tag);
931d65f6f70SBen Gras break;
932d65f6f70SBen Gras case(LIST_diag):
933d65f6f70SBen Gras /* FALLTHROUGH */
934d65f6f70SBen Gras case(LIST_hang):
935d65f6f70SBen Gras /* FALLTHROUGH */
936d65f6f70SBen Gras case(LIST_inset):
937d65f6f70SBen Gras /* FALLTHROUGH */
938d65f6f70SBen Gras case(LIST_ohang):
939d65f6f70SBen Gras /* FALLTHROUGH */
940d65f6f70SBen Gras case(LIST_tag):
941d65f6f70SBen Gras if (NULL == bl->norm->Bl.width) {
942d65f6f70SBen Gras print_otag(h, TAG_DD, 1, tag);
943d65f6f70SBen Gras break;
944d65f6f70SBen Gras }
945d65f6f70SBen Gras a2width(bl->norm->Bl.width, &su);
946d65f6f70SBen Gras bufcat_su(h, "margin-left", &su);
947d65f6f70SBen Gras PAIR_STYLE_INIT(&tag[1], h);
948d65f6f70SBen Gras print_otag(h, TAG_DD, 2, tag);
949d65f6f70SBen Gras break;
950d65f6f70SBen Gras case(LIST_column):
951d65f6f70SBen Gras SCALE_VS_INIT(&su, ! bl->norm->Bl.comp);
952d65f6f70SBen Gras bufcat_su(h, "margin-top", &su);
953d65f6f70SBen Gras PAIR_STYLE_INIT(&tag[1], h);
954d65f6f70SBen Gras print_otag(h, TAG_TD, 2, tag);
955d65f6f70SBen Gras break;
956d65f6f70SBen Gras default:
957d65f6f70SBen Gras break;
958d65f6f70SBen Gras }
959d65f6f70SBen Gras } else {
960d65f6f70SBen Gras switch (type) {
961d65f6f70SBen Gras case (LIST_column):
962d65f6f70SBen Gras print_otag(h, TAG_TR, 1, tag);
963d65f6f70SBen Gras break;
964d65f6f70SBen Gras default:
965d65f6f70SBen Gras break;
966d65f6f70SBen Gras }
967d65f6f70SBen Gras }
968d65f6f70SBen Gras
969d65f6f70SBen Gras return(1);
970d65f6f70SBen Gras }
971d65f6f70SBen Gras
972d65f6f70SBen Gras /* ARGSUSED */
973d65f6f70SBen Gras static int
mdoc_bl_pre(MDOC_ARGS)974d65f6f70SBen Gras mdoc_bl_pre(MDOC_ARGS)
975d65f6f70SBen Gras {
976d65f6f70SBen Gras int i;
977d65f6f70SBen Gras struct htmlpair tag[3];
978d65f6f70SBen Gras struct roffsu su;
979d65f6f70SBen Gras char buf[BUFSIZ];
980d65f6f70SBen Gras
981d65f6f70SBen Gras if (MDOC_BODY == n->type) {
982d65f6f70SBen Gras if (LIST_column == n->norm->Bl.type)
983d65f6f70SBen Gras print_otag(h, TAG_TBODY, 0, NULL);
984d65f6f70SBen Gras return(1);
985d65f6f70SBen Gras }
986d65f6f70SBen Gras
987d65f6f70SBen Gras if (MDOC_HEAD == n->type) {
988d65f6f70SBen Gras if (LIST_column != n->norm->Bl.type)
989d65f6f70SBen Gras return(0);
990d65f6f70SBen Gras
991d65f6f70SBen Gras /*
992d65f6f70SBen Gras * For each column, print out the <COL> tag with our
993d65f6f70SBen Gras * suggested width. The last column gets min-width, as
994d65f6f70SBen Gras * in terminal mode it auto-sizes to the width of the
995d65f6f70SBen Gras * screen and we want to preserve that behaviour.
996d65f6f70SBen Gras */
997d65f6f70SBen Gras
998d65f6f70SBen Gras for (i = 0; i < (int)n->norm->Bl.ncols; i++) {
999*0a6a1f1dSLionel Sambuc bufinit(h);
1000d65f6f70SBen Gras a2width(n->norm->Bl.cols[i], &su);
1001d65f6f70SBen Gras if (i < (int)n->norm->Bl.ncols - 1)
1002d65f6f70SBen Gras bufcat_su(h, "width", &su);
1003d65f6f70SBen Gras else
1004d65f6f70SBen Gras bufcat_su(h, "min-width", &su);
1005d65f6f70SBen Gras PAIR_STYLE_INIT(&tag[0], h);
1006d65f6f70SBen Gras print_otag(h, TAG_COL, 1, tag);
1007d65f6f70SBen Gras }
1008d65f6f70SBen Gras
1009d65f6f70SBen Gras return(0);
1010d65f6f70SBen Gras }
1011d65f6f70SBen Gras
1012d65f6f70SBen Gras SCALE_VS_INIT(&su, 0);
1013*0a6a1f1dSLionel Sambuc bufinit(h);
1014d65f6f70SBen Gras bufcat_su(h, "margin-top", &su);
1015d65f6f70SBen Gras bufcat_su(h, "margin-bottom", &su);
1016d65f6f70SBen Gras PAIR_STYLE_INIT(&tag[0], h);
1017d65f6f70SBen Gras
1018d65f6f70SBen Gras assert(lists[n->norm->Bl.type]);
1019d65f6f70SBen Gras strlcpy(buf, "list ", BUFSIZ);
1020d65f6f70SBen Gras strlcat(buf, lists[n->norm->Bl.type], BUFSIZ);
1021d65f6f70SBen Gras PAIR_INIT(&tag[1], ATTR_CLASS, buf);
1022d65f6f70SBen Gras
1023d65f6f70SBen Gras /* Set the block's left-hand margin. */
1024d65f6f70SBen Gras
1025d65f6f70SBen Gras if (n->norm->Bl.offs) {
1026d65f6f70SBen Gras a2offs(n->norm->Bl.offs, &su);
1027d65f6f70SBen Gras bufcat_su(h, "margin-left", &su);
1028d65f6f70SBen Gras }
1029d65f6f70SBen Gras
1030d65f6f70SBen Gras switch (n->norm->Bl.type) {
1031d65f6f70SBen Gras case(LIST_bullet):
1032d65f6f70SBen Gras /* FALLTHROUGH */
1033d65f6f70SBen Gras case(LIST_dash):
1034d65f6f70SBen Gras /* FALLTHROUGH */
1035d65f6f70SBen Gras case(LIST_hyphen):
1036d65f6f70SBen Gras /* FALLTHROUGH */
1037d65f6f70SBen Gras case(LIST_item):
1038d65f6f70SBen Gras print_otag(h, TAG_UL, 2, tag);
1039d65f6f70SBen Gras break;
1040d65f6f70SBen Gras case(LIST_enum):
1041d65f6f70SBen Gras print_otag(h, TAG_OL, 2, tag);
1042d65f6f70SBen Gras break;
1043d65f6f70SBen Gras case(LIST_diag):
1044d65f6f70SBen Gras /* FALLTHROUGH */
1045d65f6f70SBen Gras case(LIST_hang):
1046d65f6f70SBen Gras /* FALLTHROUGH */
1047d65f6f70SBen Gras case(LIST_inset):
1048d65f6f70SBen Gras /* FALLTHROUGH */
1049d65f6f70SBen Gras case(LIST_ohang):
1050d65f6f70SBen Gras /* FALLTHROUGH */
1051d65f6f70SBen Gras case(LIST_tag):
1052d65f6f70SBen Gras print_otag(h, TAG_DL, 2, tag);
1053d65f6f70SBen Gras break;
1054d65f6f70SBen Gras case(LIST_column):
1055d65f6f70SBen Gras print_otag(h, TAG_TABLE, 2, tag);
1056d65f6f70SBen Gras break;
1057d65f6f70SBen Gras default:
1058d65f6f70SBen Gras abort();
1059d65f6f70SBen Gras /* NOTREACHED */
1060d65f6f70SBen Gras }
1061d65f6f70SBen Gras
1062d65f6f70SBen Gras return(1);
1063d65f6f70SBen Gras }
1064d65f6f70SBen Gras
1065d65f6f70SBen Gras /* ARGSUSED */
1066d65f6f70SBen Gras static int
mdoc_ex_pre(MDOC_ARGS)1067d65f6f70SBen Gras mdoc_ex_pre(MDOC_ARGS)
1068d65f6f70SBen Gras {
1069d65f6f70SBen Gras struct tag *t;
1070d65f6f70SBen Gras struct htmlpair tag;
107192395e9cSLionel Sambuc int nchild;
1072d65f6f70SBen Gras
1073d65f6f70SBen Gras if (n->prev)
1074d65f6f70SBen Gras print_otag(h, TAG_BR, 0, NULL);
1075d65f6f70SBen Gras
1076d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "utility");
1077d65f6f70SBen Gras
1078d65f6f70SBen Gras print_text(h, "The");
107992395e9cSLionel Sambuc
108092395e9cSLionel Sambuc nchild = n->nchild;
108192395e9cSLionel Sambuc for (n = n->child; n; n = n->next) {
108292395e9cSLionel Sambuc assert(MDOC_TEXT == n->type);
108392395e9cSLionel Sambuc
1084d65f6f70SBen Gras t = print_otag(h, TAG_B, 1, &tag);
108592395e9cSLionel Sambuc print_text(h, n->string);
1086d65f6f70SBen Gras print_tagq(h, t);
1087d65f6f70SBen Gras
108892395e9cSLionel Sambuc if (nchild > 2 && n->next) {
1089d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
1090d65f6f70SBen Gras print_text(h, ",");
1091d65f6f70SBen Gras }
1092d65f6f70SBen Gras
109392395e9cSLionel Sambuc if (n->next && NULL == n->next->next)
109492395e9cSLionel Sambuc print_text(h, "and");
109592395e9cSLionel Sambuc }
109692395e9cSLionel Sambuc
109792395e9cSLionel Sambuc if (nchild > 1)
1098d65f6f70SBen Gras print_text(h, "utilities exit");
1099d65f6f70SBen Gras else
1100d65f6f70SBen Gras print_text(h, "utility exits");
1101d65f6f70SBen Gras
1102d65f6f70SBen Gras print_text(h, "0 on success, and >0 if an error occurs.");
1103d65f6f70SBen Gras return(0);
1104d65f6f70SBen Gras }
1105d65f6f70SBen Gras
1106d65f6f70SBen Gras
1107d65f6f70SBen Gras /* ARGSUSED */
1108d65f6f70SBen Gras static int
mdoc_em_pre(MDOC_ARGS)1109d65f6f70SBen Gras mdoc_em_pre(MDOC_ARGS)
1110d65f6f70SBen Gras {
1111d65f6f70SBen Gras struct htmlpair tag;
1112d65f6f70SBen Gras
1113d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "emph");
1114d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
1115d65f6f70SBen Gras return(1);
1116d65f6f70SBen Gras }
1117d65f6f70SBen Gras
1118d65f6f70SBen Gras
1119d65f6f70SBen Gras /* ARGSUSED */
1120d65f6f70SBen Gras static int
mdoc_d1_pre(MDOC_ARGS)1121d65f6f70SBen Gras mdoc_d1_pre(MDOC_ARGS)
1122d65f6f70SBen Gras {
1123d65f6f70SBen Gras struct htmlpair tag[2];
1124d65f6f70SBen Gras struct roffsu su;
1125d65f6f70SBen Gras
1126d65f6f70SBen Gras if (MDOC_BLOCK != n->type)
1127d65f6f70SBen Gras return(1);
1128d65f6f70SBen Gras
1129d65f6f70SBen Gras SCALE_VS_INIT(&su, 0);
113092395e9cSLionel Sambuc bufinit(h);
1131d65f6f70SBen Gras bufcat_su(h, "margin-top", &su);
1132d65f6f70SBen Gras bufcat_su(h, "margin-bottom", &su);
1133d65f6f70SBen Gras PAIR_STYLE_INIT(&tag[0], h);
1134d65f6f70SBen Gras print_otag(h, TAG_BLOCKQUOTE, 1, tag);
1135d65f6f70SBen Gras
1136d65f6f70SBen Gras /* BLOCKQUOTE needs a block body. */
1137d65f6f70SBen Gras
1138d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "display");
1139d65f6f70SBen Gras print_otag(h, TAG_DIV, 1, tag);
1140d65f6f70SBen Gras
1141d65f6f70SBen Gras if (MDOC_Dl == n->tok) {
1142d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "lit");
1143d65f6f70SBen Gras print_otag(h, TAG_CODE, 1, tag);
1144d65f6f70SBen Gras }
1145d65f6f70SBen Gras
1146d65f6f70SBen Gras return(1);
1147d65f6f70SBen Gras }
1148d65f6f70SBen Gras
1149d65f6f70SBen Gras
1150d65f6f70SBen Gras /* ARGSUSED */
1151d65f6f70SBen Gras static int
mdoc_sx_pre(MDOC_ARGS)1152d65f6f70SBen Gras mdoc_sx_pre(MDOC_ARGS)
1153d65f6f70SBen Gras {
1154d65f6f70SBen Gras struct htmlpair tag[2];
1155d65f6f70SBen Gras
115692395e9cSLionel Sambuc bufinit(h);
115792395e9cSLionel Sambuc bufcat(h, "#x");
115892395e9cSLionel Sambuc
115992395e9cSLionel Sambuc for (n = n->child; n; ) {
116092395e9cSLionel Sambuc bufcat_id(h, n->string);
116192395e9cSLionel Sambuc if (NULL != (n = n->next))
116292395e9cSLionel Sambuc bufcat_id(h, " ");
1163d65f6f70SBen Gras }
1164d65f6f70SBen Gras
1165d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "link-sec");
116692395e9cSLionel Sambuc PAIR_HREF_INIT(&tag[1], h->buf);
1167d65f6f70SBen Gras
1168d65f6f70SBen Gras print_otag(h, TAG_I, 1, tag);
1169d65f6f70SBen Gras print_otag(h, TAG_A, 2, tag);
1170d65f6f70SBen Gras return(1);
1171d65f6f70SBen Gras }
1172d65f6f70SBen Gras
1173d65f6f70SBen Gras
1174d65f6f70SBen Gras /* ARGSUSED */
1175d65f6f70SBen Gras static int
mdoc_bd_pre(MDOC_ARGS)1176d65f6f70SBen Gras mdoc_bd_pre(MDOC_ARGS)
1177d65f6f70SBen Gras {
1178d65f6f70SBen Gras struct htmlpair tag[2];
117992395e9cSLionel Sambuc int comp, sv;
1180d65f6f70SBen Gras const struct mdoc_node *nn;
1181d65f6f70SBen Gras struct roffsu su;
1182d65f6f70SBen Gras
1183d65f6f70SBen Gras if (MDOC_HEAD == n->type)
1184d65f6f70SBen Gras return(0);
1185d65f6f70SBen Gras
1186d65f6f70SBen Gras if (MDOC_BLOCK == n->type) {
1187d65f6f70SBen Gras comp = n->norm->Bd.comp;
1188d65f6f70SBen Gras for (nn = n; nn && ! comp; nn = nn->parent) {
1189d65f6f70SBen Gras if (MDOC_BLOCK != nn->type)
1190d65f6f70SBen Gras continue;
1191d65f6f70SBen Gras if (MDOC_Ss == nn->tok || MDOC_Sh == nn->tok)
1192d65f6f70SBen Gras comp = 1;
1193d65f6f70SBen Gras if (nn->prev)
1194d65f6f70SBen Gras break;
1195d65f6f70SBen Gras }
1196d65f6f70SBen Gras if ( ! comp)
1197d65f6f70SBen Gras print_otag(h, TAG_P, 0, NULL);
1198d65f6f70SBen Gras return(1);
1199d65f6f70SBen Gras }
1200d65f6f70SBen Gras
1201d65f6f70SBen Gras SCALE_HS_INIT(&su, 0);
1202d65f6f70SBen Gras if (n->norm->Bd.offs)
1203d65f6f70SBen Gras a2offs(n->norm->Bd.offs, &su);
1204d65f6f70SBen Gras
120592395e9cSLionel Sambuc bufinit(h);
1206d65f6f70SBen Gras bufcat_su(h, "margin-left", &su);
1207d65f6f70SBen Gras PAIR_STYLE_INIT(&tag[0], h);
1208d65f6f70SBen Gras
1209d65f6f70SBen Gras if (DISP_unfilled != n->norm->Bd.type &&
1210d65f6f70SBen Gras DISP_literal != n->norm->Bd.type) {
1211d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[1], "display");
1212d65f6f70SBen Gras print_otag(h, TAG_DIV, 2, tag);
1213d65f6f70SBen Gras return(1);
1214d65f6f70SBen Gras }
1215d65f6f70SBen Gras
1216d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[1], "lit display");
1217d65f6f70SBen Gras print_otag(h, TAG_PRE, 2, tag);
1218d65f6f70SBen Gras
121992395e9cSLionel Sambuc /* This can be recursive: save & set our literal state. */
122092395e9cSLionel Sambuc
122192395e9cSLionel Sambuc sv = h->flags & HTML_LITERAL;
122292395e9cSLionel Sambuc h->flags |= HTML_LITERAL;
122392395e9cSLionel Sambuc
1224d65f6f70SBen Gras for (nn = n->child; nn; nn = nn->next) {
1225*0a6a1f1dSLionel Sambuc print_mdoc_node(meta, nn, h);
1226d65f6f70SBen Gras /*
1227d65f6f70SBen Gras * If the printed node flushes its own line, then we
1228d65f6f70SBen Gras * needn't do it here as well. This is hacky, but the
1229d65f6f70SBen Gras * notion of selective eoln whitespace is pretty dumb
1230d65f6f70SBen Gras * anyway, so don't sweat it.
1231d65f6f70SBen Gras */
1232d65f6f70SBen Gras switch (nn->tok) {
1233d65f6f70SBen Gras case (MDOC_Sm):
1234d65f6f70SBen Gras /* FALLTHROUGH */
1235d65f6f70SBen Gras case (MDOC_br):
1236d65f6f70SBen Gras /* FALLTHROUGH */
1237d65f6f70SBen Gras case (MDOC_sp):
1238d65f6f70SBen Gras /* FALLTHROUGH */
1239d65f6f70SBen Gras case (MDOC_Bl):
1240d65f6f70SBen Gras /* FALLTHROUGH */
1241d65f6f70SBen Gras case (MDOC_D1):
1242d65f6f70SBen Gras /* FALLTHROUGH */
1243d65f6f70SBen Gras case (MDOC_Dl):
1244d65f6f70SBen Gras /* FALLTHROUGH */
1245d65f6f70SBen Gras case (MDOC_Lp):
1246d65f6f70SBen Gras /* FALLTHROUGH */
1247d65f6f70SBen Gras case (MDOC_Pp):
1248d65f6f70SBen Gras continue;
1249d65f6f70SBen Gras default:
1250d65f6f70SBen Gras break;
1251d65f6f70SBen Gras }
1252d65f6f70SBen Gras if (nn->next && nn->next->line == nn->line)
1253d65f6f70SBen Gras continue;
1254d65f6f70SBen Gras else if (nn->next)
1255d65f6f70SBen Gras print_text(h, "\n");
1256d65f6f70SBen Gras
1257d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
1258d65f6f70SBen Gras }
1259d65f6f70SBen Gras
126092395e9cSLionel Sambuc if (0 == sv)
126192395e9cSLionel Sambuc h->flags &= ~HTML_LITERAL;
126292395e9cSLionel Sambuc
1263d65f6f70SBen Gras return(0);
1264d65f6f70SBen Gras }
1265d65f6f70SBen Gras
1266d65f6f70SBen Gras
1267d65f6f70SBen Gras /* ARGSUSED */
1268d65f6f70SBen Gras static int
mdoc_pa_pre(MDOC_ARGS)1269d65f6f70SBen Gras mdoc_pa_pre(MDOC_ARGS)
1270d65f6f70SBen Gras {
1271d65f6f70SBen Gras struct htmlpair tag;
1272d65f6f70SBen Gras
1273d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "file");
1274d65f6f70SBen Gras print_otag(h, TAG_I, 1, &tag);
1275d65f6f70SBen Gras return(1);
1276d65f6f70SBen Gras }
1277d65f6f70SBen Gras
1278d65f6f70SBen Gras
1279d65f6f70SBen Gras /* ARGSUSED */
1280d65f6f70SBen Gras static int
mdoc_ad_pre(MDOC_ARGS)1281d65f6f70SBen Gras mdoc_ad_pre(MDOC_ARGS)
1282d65f6f70SBen Gras {
1283d65f6f70SBen Gras struct htmlpair tag;
1284d65f6f70SBen Gras
1285d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "addr");
1286d65f6f70SBen Gras print_otag(h, TAG_I, 1, &tag);
1287d65f6f70SBen Gras return(1);
1288d65f6f70SBen Gras }
1289d65f6f70SBen Gras
1290d65f6f70SBen Gras
1291d65f6f70SBen Gras /* ARGSUSED */
1292d65f6f70SBen Gras static int
mdoc_an_pre(MDOC_ARGS)1293d65f6f70SBen Gras mdoc_an_pre(MDOC_ARGS)
1294d65f6f70SBen Gras {
1295d65f6f70SBen Gras struct htmlpair tag;
1296d65f6f70SBen Gras
1297d65f6f70SBen Gras /* TODO: -split and -nosplit (see termp_an_pre()). */
1298d65f6f70SBen Gras
1299d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "author");
1300d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
1301d65f6f70SBen Gras return(1);
1302d65f6f70SBen Gras }
1303d65f6f70SBen Gras
1304d65f6f70SBen Gras
1305d65f6f70SBen Gras /* ARGSUSED */
1306d65f6f70SBen Gras static int
mdoc_cd_pre(MDOC_ARGS)1307d65f6f70SBen Gras mdoc_cd_pre(MDOC_ARGS)
1308d65f6f70SBen Gras {
1309d65f6f70SBen Gras struct htmlpair tag;
1310d65f6f70SBen Gras
1311d65f6f70SBen Gras synopsis_pre(h, n);
1312d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "config");
1313d65f6f70SBen Gras print_otag(h, TAG_B, 1, &tag);
1314d65f6f70SBen Gras return(1);
1315d65f6f70SBen Gras }
1316d65f6f70SBen Gras
1317d65f6f70SBen Gras
1318d65f6f70SBen Gras /* ARGSUSED */
1319d65f6f70SBen Gras static int
mdoc_dv_pre(MDOC_ARGS)1320d65f6f70SBen Gras mdoc_dv_pre(MDOC_ARGS)
1321d65f6f70SBen Gras {
1322d65f6f70SBen Gras struct htmlpair tag;
1323d65f6f70SBen Gras
1324d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "define");
1325d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
1326d65f6f70SBen Gras return(1);
1327d65f6f70SBen Gras }
1328d65f6f70SBen Gras
1329d65f6f70SBen Gras
1330d65f6f70SBen Gras /* ARGSUSED */
1331d65f6f70SBen Gras static int
mdoc_ev_pre(MDOC_ARGS)1332d65f6f70SBen Gras mdoc_ev_pre(MDOC_ARGS)
1333d65f6f70SBen Gras {
1334d65f6f70SBen Gras struct htmlpair tag;
1335d65f6f70SBen Gras
1336d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "env");
1337d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
1338d65f6f70SBen Gras return(1);
1339d65f6f70SBen Gras }
1340d65f6f70SBen Gras
1341d65f6f70SBen Gras
1342d65f6f70SBen Gras /* ARGSUSED */
1343d65f6f70SBen Gras static int
mdoc_er_pre(MDOC_ARGS)1344d65f6f70SBen Gras mdoc_er_pre(MDOC_ARGS)
1345d65f6f70SBen Gras {
1346d65f6f70SBen Gras struct htmlpair tag;
1347d65f6f70SBen Gras
1348d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "errno");
1349d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
1350d65f6f70SBen Gras return(1);
1351d65f6f70SBen Gras }
1352d65f6f70SBen Gras
1353d65f6f70SBen Gras
1354d65f6f70SBen Gras /* ARGSUSED */
1355d65f6f70SBen Gras static int
mdoc_fa_pre(MDOC_ARGS)1356d65f6f70SBen Gras mdoc_fa_pre(MDOC_ARGS)
1357d65f6f70SBen Gras {
1358d65f6f70SBen Gras const struct mdoc_node *nn;
1359d65f6f70SBen Gras struct htmlpair tag;
1360d65f6f70SBen Gras struct tag *t;
1361d65f6f70SBen Gras
1362d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "farg");
1363d65f6f70SBen Gras if (n->parent->tok != MDOC_Fo) {
1364d65f6f70SBen Gras print_otag(h, TAG_I, 1, &tag);
1365d65f6f70SBen Gras return(1);
1366d65f6f70SBen Gras }
1367d65f6f70SBen Gras
1368d65f6f70SBen Gras for (nn = n->child; nn; nn = nn->next) {
1369d65f6f70SBen Gras t = print_otag(h, TAG_I, 1, &tag);
1370d65f6f70SBen Gras print_text(h, nn->string);
1371d65f6f70SBen Gras print_tagq(h, t);
137292395e9cSLionel Sambuc if (nn->next) {
137392395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
1374d65f6f70SBen Gras print_text(h, ",");
1375d65f6f70SBen Gras }
137692395e9cSLionel Sambuc }
1377d65f6f70SBen Gras
137892395e9cSLionel Sambuc if (n->child && n->next && n->next->tok == MDOC_Fa) {
137992395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
1380d65f6f70SBen Gras print_text(h, ",");
138192395e9cSLionel Sambuc }
1382d65f6f70SBen Gras
1383d65f6f70SBen Gras return(0);
1384d65f6f70SBen Gras }
1385d65f6f70SBen Gras
1386d65f6f70SBen Gras
1387d65f6f70SBen Gras /* ARGSUSED */
1388d65f6f70SBen Gras static int
mdoc_fd_pre(MDOC_ARGS)1389d65f6f70SBen Gras mdoc_fd_pre(MDOC_ARGS)
1390d65f6f70SBen Gras {
139192395e9cSLionel Sambuc struct htmlpair tag[2];
139292395e9cSLionel Sambuc char buf[BUFSIZ];
139392395e9cSLionel Sambuc size_t sz;
139492395e9cSLionel Sambuc int i;
139592395e9cSLionel Sambuc struct tag *t;
1396d65f6f70SBen Gras
1397d65f6f70SBen Gras synopsis_pre(h, n);
1398d65f6f70SBen Gras
139992395e9cSLionel Sambuc if (NULL == (n = n->child))
140092395e9cSLionel Sambuc return(0);
140192395e9cSLionel Sambuc
140292395e9cSLionel Sambuc assert(MDOC_TEXT == n->type);
140392395e9cSLionel Sambuc
140492395e9cSLionel Sambuc if (strcmp(n->string, "#include")) {
140592395e9cSLionel Sambuc PAIR_CLASS_INIT(&tag[0], "macro");
140692395e9cSLionel Sambuc print_otag(h, TAG_B, 1, tag);
1407d65f6f70SBen Gras return(1);
1408d65f6f70SBen Gras }
1409d65f6f70SBen Gras
141092395e9cSLionel Sambuc PAIR_CLASS_INIT(&tag[0], "includes");
141192395e9cSLionel Sambuc print_otag(h, TAG_B, 1, tag);
141292395e9cSLionel Sambuc print_text(h, n->string);
141392395e9cSLionel Sambuc
141492395e9cSLionel Sambuc if (NULL != (n = n->next)) {
141592395e9cSLionel Sambuc assert(MDOC_TEXT == n->type);
141692395e9cSLionel Sambuc strlcpy(buf, '<' == *n->string || '"' == *n->string ?
141792395e9cSLionel Sambuc n->string + 1 : n->string, BUFSIZ);
141892395e9cSLionel Sambuc
141992395e9cSLionel Sambuc sz = strlen(buf);
142092395e9cSLionel Sambuc if (sz && ('>' == buf[sz - 1] || '"' == buf[sz - 1]))
142192395e9cSLionel Sambuc buf[sz - 1] = '\0';
142292395e9cSLionel Sambuc
142392395e9cSLionel Sambuc PAIR_CLASS_INIT(&tag[0], "link-includes");
142492395e9cSLionel Sambuc
142592395e9cSLionel Sambuc i = 1;
142692395e9cSLionel Sambuc if (h->base_includes) {
142792395e9cSLionel Sambuc buffmt_includes(h, buf);
142892395e9cSLionel Sambuc PAIR_HREF_INIT(&tag[i], h->buf);
142992395e9cSLionel Sambuc i++;
143092395e9cSLionel Sambuc }
143192395e9cSLionel Sambuc
143292395e9cSLionel Sambuc t = print_otag(h, TAG_A, i, tag);
143392395e9cSLionel Sambuc print_text(h, n->string);
143492395e9cSLionel Sambuc print_tagq(h, t);
143592395e9cSLionel Sambuc
143692395e9cSLionel Sambuc n = n->next;
143792395e9cSLionel Sambuc }
143892395e9cSLionel Sambuc
143992395e9cSLionel Sambuc for ( ; n; n = n->next) {
144092395e9cSLionel Sambuc assert(MDOC_TEXT == n->type);
144192395e9cSLionel Sambuc print_text(h, n->string);
144292395e9cSLionel Sambuc }
144392395e9cSLionel Sambuc
144492395e9cSLionel Sambuc return(0);
144592395e9cSLionel Sambuc }
144692395e9cSLionel Sambuc
1447d65f6f70SBen Gras
1448d65f6f70SBen Gras /* ARGSUSED */
1449d65f6f70SBen Gras static int
mdoc_vt_pre(MDOC_ARGS)1450d65f6f70SBen Gras mdoc_vt_pre(MDOC_ARGS)
1451d65f6f70SBen Gras {
1452d65f6f70SBen Gras struct htmlpair tag;
1453d65f6f70SBen Gras
1454d65f6f70SBen Gras if (MDOC_BLOCK == n->type) {
1455d65f6f70SBen Gras synopsis_pre(h, n);
1456d65f6f70SBen Gras return(1);
1457d65f6f70SBen Gras } else if (MDOC_ELEM == n->type) {
1458d65f6f70SBen Gras synopsis_pre(h, n);
1459d65f6f70SBen Gras } else if (MDOC_HEAD == n->type)
1460d65f6f70SBen Gras return(0);
1461d65f6f70SBen Gras
1462d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "type");
1463d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
1464d65f6f70SBen Gras return(1);
1465d65f6f70SBen Gras }
1466d65f6f70SBen Gras
1467d65f6f70SBen Gras
1468d65f6f70SBen Gras /* ARGSUSED */
1469d65f6f70SBen Gras static int
mdoc_ft_pre(MDOC_ARGS)1470d65f6f70SBen Gras mdoc_ft_pre(MDOC_ARGS)
1471d65f6f70SBen Gras {
1472d65f6f70SBen Gras struct htmlpair tag;
1473d65f6f70SBen Gras
1474d65f6f70SBen Gras synopsis_pre(h, n);
1475d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "ftype");
1476d65f6f70SBen Gras print_otag(h, TAG_I, 1, &tag);
1477d65f6f70SBen Gras return(1);
1478d65f6f70SBen Gras }
1479d65f6f70SBen Gras
1480d65f6f70SBen Gras
1481d65f6f70SBen Gras /* ARGSUSED */
1482d65f6f70SBen Gras static int
mdoc_fn_pre(MDOC_ARGS)1483d65f6f70SBen Gras mdoc_fn_pre(MDOC_ARGS)
1484d65f6f70SBen Gras {
1485d65f6f70SBen Gras struct tag *t;
1486d65f6f70SBen Gras struct htmlpair tag[2];
1487d65f6f70SBen Gras char nbuf[BUFSIZ];
1488d65f6f70SBen Gras const char *sp, *ep;
148992395e9cSLionel Sambuc int sz, i, pretty;
1490d65f6f70SBen Gras
149192395e9cSLionel Sambuc pretty = MDOC_SYNPRETTY & n->flags;
1492d65f6f70SBen Gras synopsis_pre(h, n);
1493d65f6f70SBen Gras
1494d65f6f70SBen Gras /* Split apart into type and name. */
1495d65f6f70SBen Gras assert(n->child->string);
1496d65f6f70SBen Gras sp = n->child->string;
1497d65f6f70SBen Gras
1498d65f6f70SBen Gras ep = strchr(sp, ' ');
1499d65f6f70SBen Gras if (NULL != ep) {
1500d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ftype");
1501d65f6f70SBen Gras t = print_otag(h, TAG_I, 1, tag);
1502d65f6f70SBen Gras
1503d65f6f70SBen Gras while (ep) {
1504d65f6f70SBen Gras sz = MIN((int)(ep - sp), BUFSIZ - 1);
1505d65f6f70SBen Gras (void)memcpy(nbuf, sp, (size_t)sz);
1506d65f6f70SBen Gras nbuf[sz] = '\0';
1507d65f6f70SBen Gras print_text(h, nbuf);
1508d65f6f70SBen Gras sp = ++ep;
1509d65f6f70SBen Gras ep = strchr(sp, ' ');
1510d65f6f70SBen Gras }
1511d65f6f70SBen Gras print_tagq(h, t);
1512d65f6f70SBen Gras }
1513d65f6f70SBen Gras
1514d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "fname");
1515d65f6f70SBen Gras
1516d65f6f70SBen Gras /*
1517d65f6f70SBen Gras * FIXME: only refer to IDs that we know exist.
1518d65f6f70SBen Gras */
1519d65f6f70SBen Gras
1520d65f6f70SBen Gras #if 0
1521d65f6f70SBen Gras if (MDOC_SYNPRETTY & n->flags) {
1522d65f6f70SBen Gras nbuf[0] = '\0';
1523d65f6f70SBen Gras html_idcat(nbuf, sp, BUFSIZ);
1524d65f6f70SBen Gras PAIR_ID_INIT(&tag[1], nbuf);
1525d65f6f70SBen Gras } else {
1526d65f6f70SBen Gras strlcpy(nbuf, "#", BUFSIZ);
1527d65f6f70SBen Gras html_idcat(nbuf, sp, BUFSIZ);
1528d65f6f70SBen Gras PAIR_HREF_INIT(&tag[1], nbuf);
1529d65f6f70SBen Gras }
1530d65f6f70SBen Gras #endif
1531d65f6f70SBen Gras
1532d65f6f70SBen Gras t = print_otag(h, TAG_B, 1, tag);
1533d65f6f70SBen Gras
1534d65f6f70SBen Gras if (sp) {
1535d65f6f70SBen Gras strlcpy(nbuf, sp, BUFSIZ);
1536d65f6f70SBen Gras print_text(h, nbuf);
1537d65f6f70SBen Gras }
1538d65f6f70SBen Gras
1539d65f6f70SBen Gras print_tagq(h, t);
1540d65f6f70SBen Gras
1541d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
1542d65f6f70SBen Gras print_text(h, "(");
154392395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
1544d65f6f70SBen Gras
1545d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "farg");
154692395e9cSLionel Sambuc bufinit(h);
1547d65f6f70SBen Gras bufcat_style(h, "white-space", "nowrap");
1548d65f6f70SBen Gras PAIR_STYLE_INIT(&tag[1], h);
1549d65f6f70SBen Gras
155092395e9cSLionel Sambuc for (n = n->child->next; n; n = n->next) {
1551d65f6f70SBen Gras i = 1;
1552d65f6f70SBen Gras if (MDOC_SYNPRETTY & n->flags)
1553d65f6f70SBen Gras i = 2;
1554d65f6f70SBen Gras t = print_otag(h, TAG_I, i, tag);
155592395e9cSLionel Sambuc print_text(h, n->string);
1556d65f6f70SBen Gras print_tagq(h, t);
155792395e9cSLionel Sambuc if (n->next) {
155892395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
1559d65f6f70SBen Gras print_text(h, ",");
1560d65f6f70SBen Gras }
156192395e9cSLionel Sambuc }
1562d65f6f70SBen Gras
156392395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
1564d65f6f70SBen Gras print_text(h, ")");
156592395e9cSLionel Sambuc
156692395e9cSLionel Sambuc if (pretty) {
156792395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
1568d65f6f70SBen Gras print_text(h, ";");
156992395e9cSLionel Sambuc }
1570d65f6f70SBen Gras
1571d65f6f70SBen Gras return(0);
1572d65f6f70SBen Gras }
1573d65f6f70SBen Gras
1574d65f6f70SBen Gras
1575d65f6f70SBen Gras /* ARGSUSED */
1576d65f6f70SBen Gras static int
mdoc_sm_pre(MDOC_ARGS)1577d65f6f70SBen Gras mdoc_sm_pre(MDOC_ARGS)
1578d65f6f70SBen Gras {
1579d65f6f70SBen Gras
1580d65f6f70SBen Gras assert(n->child && MDOC_TEXT == n->child->type);
1581d65f6f70SBen Gras if (0 == strcmp("on", n->child->string)) {
1582d65f6f70SBen Gras /*
1583d65f6f70SBen Gras * FIXME: no p->col to check. Thus, if we have
1584d65f6f70SBen Gras * .Bd -literal
1585d65f6f70SBen Gras * .Sm off
1586d65f6f70SBen Gras * 1 2
1587d65f6f70SBen Gras * .Sm on
1588d65f6f70SBen Gras * 3
1589d65f6f70SBen Gras * .Ed
1590d65f6f70SBen Gras * the "3" is preceded by a space.
1591d65f6f70SBen Gras */
1592d65f6f70SBen Gras h->flags &= ~HTML_NOSPACE;
1593d65f6f70SBen Gras h->flags &= ~HTML_NONOSPACE;
1594d65f6f70SBen Gras } else
1595d65f6f70SBen Gras h->flags |= HTML_NONOSPACE;
1596d65f6f70SBen Gras
1597d65f6f70SBen Gras return(0);
1598d65f6f70SBen Gras }
1599d65f6f70SBen Gras
1600d65f6f70SBen Gras /* ARGSUSED */
1601d65f6f70SBen Gras static int
mdoc_pp_pre(MDOC_ARGS)1602d65f6f70SBen Gras mdoc_pp_pre(MDOC_ARGS)
1603d65f6f70SBen Gras {
1604d65f6f70SBen Gras
1605d65f6f70SBen Gras print_otag(h, TAG_P, 0, NULL);
1606d65f6f70SBen Gras return(0);
1607d65f6f70SBen Gras
1608d65f6f70SBen Gras }
1609d65f6f70SBen Gras
1610d65f6f70SBen Gras /* ARGSUSED */
1611d65f6f70SBen Gras static int
mdoc_sp_pre(MDOC_ARGS)1612d65f6f70SBen Gras mdoc_sp_pre(MDOC_ARGS)
1613d65f6f70SBen Gras {
1614d65f6f70SBen Gras struct roffsu su;
1615d65f6f70SBen Gras struct htmlpair tag;
1616d65f6f70SBen Gras
1617d65f6f70SBen Gras SCALE_VS_INIT(&su, 1);
1618d65f6f70SBen Gras
1619d65f6f70SBen Gras if (MDOC_sp == n->tok) {
162092395e9cSLionel Sambuc if (NULL != (n = n->child))
162192395e9cSLionel Sambuc if ( ! a2roffsu(n->string, &su, SCALE_VS))
162292395e9cSLionel Sambuc SCALE_VS_INIT(&su, atoi(n->string));
1623d65f6f70SBen Gras } else
1624d65f6f70SBen Gras su.scale = 0;
1625d65f6f70SBen Gras
162692395e9cSLionel Sambuc bufinit(h);
1627d65f6f70SBen Gras bufcat_su(h, "height", &su);
1628d65f6f70SBen Gras PAIR_STYLE_INIT(&tag, h);
1629d65f6f70SBen Gras print_otag(h, TAG_DIV, 1, &tag);
1630d65f6f70SBen Gras
1631d65f6f70SBen Gras /* So the div isn't empty: */
1632d65f6f70SBen Gras print_text(h, "\\~");
1633d65f6f70SBen Gras
1634d65f6f70SBen Gras return(0);
1635d65f6f70SBen Gras
1636d65f6f70SBen Gras }
1637d65f6f70SBen Gras
1638d65f6f70SBen Gras /* ARGSUSED */
1639d65f6f70SBen Gras static int
mdoc_lk_pre(MDOC_ARGS)1640d65f6f70SBen Gras mdoc_lk_pre(MDOC_ARGS)
1641d65f6f70SBen Gras {
1642d65f6f70SBen Gras struct htmlpair tag[2];
1643d65f6f70SBen Gras
164492395e9cSLionel Sambuc if (NULL == (n = n->child))
164592395e9cSLionel Sambuc return(0);
164692395e9cSLionel Sambuc
164792395e9cSLionel Sambuc assert(MDOC_TEXT == n->type);
1648d65f6f70SBen Gras
1649d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "link-ext");
165092395e9cSLionel Sambuc PAIR_HREF_INIT(&tag[1], n->string);
165192395e9cSLionel Sambuc
1652d65f6f70SBen Gras print_otag(h, TAG_A, 2, tag);
1653d65f6f70SBen Gras
165492395e9cSLionel Sambuc if (NULL == n->next)
165592395e9cSLionel Sambuc print_text(h, n->string);
1656d65f6f70SBen Gras
165792395e9cSLionel Sambuc for (n = n->next; n; n = n->next)
165892395e9cSLionel Sambuc print_text(h, n->string);
1659d65f6f70SBen Gras
1660d65f6f70SBen Gras return(0);
1661d65f6f70SBen Gras }
1662d65f6f70SBen Gras
1663d65f6f70SBen Gras
1664d65f6f70SBen Gras /* ARGSUSED */
1665d65f6f70SBen Gras static int
mdoc_mt_pre(MDOC_ARGS)1666d65f6f70SBen Gras mdoc_mt_pre(MDOC_ARGS)
1667d65f6f70SBen Gras {
1668d65f6f70SBen Gras struct htmlpair tag[2];
1669d65f6f70SBen Gras struct tag *t;
1670d65f6f70SBen Gras
1671d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "link-mail");
1672d65f6f70SBen Gras
167392395e9cSLionel Sambuc for (n = n->child; n; n = n->next) {
167492395e9cSLionel Sambuc assert(MDOC_TEXT == n->type);
167592395e9cSLionel Sambuc
1676d65f6f70SBen Gras bufinit(h);
1677d65f6f70SBen Gras bufcat(h, "mailto:");
167892395e9cSLionel Sambuc bufcat(h, n->string);
167992395e9cSLionel Sambuc
1680d65f6f70SBen Gras PAIR_HREF_INIT(&tag[1], h->buf);
1681d65f6f70SBen Gras t = print_otag(h, TAG_A, 2, tag);
168292395e9cSLionel Sambuc print_text(h, n->string);
1683d65f6f70SBen Gras print_tagq(h, t);
1684d65f6f70SBen Gras }
1685d65f6f70SBen Gras
1686d65f6f70SBen Gras return(0);
1687d65f6f70SBen Gras }
1688d65f6f70SBen Gras
1689d65f6f70SBen Gras
1690d65f6f70SBen Gras /* ARGSUSED */
1691d65f6f70SBen Gras static int
mdoc_fo_pre(MDOC_ARGS)1692d65f6f70SBen Gras mdoc_fo_pre(MDOC_ARGS)
1693d65f6f70SBen Gras {
1694d65f6f70SBen Gras struct htmlpair tag;
1695d65f6f70SBen Gras struct tag *t;
1696d65f6f70SBen Gras
1697d65f6f70SBen Gras if (MDOC_BODY == n->type) {
1698d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
1699d65f6f70SBen Gras print_text(h, "(");
1700d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
1701d65f6f70SBen Gras return(1);
1702d65f6f70SBen Gras } else if (MDOC_BLOCK == n->type) {
1703d65f6f70SBen Gras synopsis_pre(h, n);
1704d65f6f70SBen Gras return(1);
1705d65f6f70SBen Gras }
1706d65f6f70SBen Gras
1707d65f6f70SBen Gras /* XXX: we drop non-initial arguments as per groff. */
1708d65f6f70SBen Gras
1709d65f6f70SBen Gras assert(n->child);
1710d65f6f70SBen Gras assert(n->child->string);
1711d65f6f70SBen Gras
1712d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "fname");
1713d65f6f70SBen Gras t = print_otag(h, TAG_B, 1, &tag);
1714d65f6f70SBen Gras print_text(h, n->child->string);
1715d65f6f70SBen Gras print_tagq(h, t);
1716d65f6f70SBen Gras return(0);
1717d65f6f70SBen Gras }
1718d65f6f70SBen Gras
1719d65f6f70SBen Gras
1720d65f6f70SBen Gras /* ARGSUSED */
1721d65f6f70SBen Gras static void
mdoc_fo_post(MDOC_ARGS)1722d65f6f70SBen Gras mdoc_fo_post(MDOC_ARGS)
1723d65f6f70SBen Gras {
1724d65f6f70SBen Gras
1725d65f6f70SBen Gras if (MDOC_BODY != n->type)
1726d65f6f70SBen Gras return;
172792395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
1728d65f6f70SBen Gras print_text(h, ")");
172992395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
1730d65f6f70SBen Gras print_text(h, ";");
1731d65f6f70SBen Gras }
1732d65f6f70SBen Gras
1733d65f6f70SBen Gras
1734d65f6f70SBen Gras /* ARGSUSED */
1735d65f6f70SBen Gras static int
mdoc_in_pre(MDOC_ARGS)1736d65f6f70SBen Gras mdoc_in_pre(MDOC_ARGS)
1737d65f6f70SBen Gras {
1738d65f6f70SBen Gras struct tag *t;
1739d65f6f70SBen Gras struct htmlpair tag[2];
1740d65f6f70SBen Gras int i;
1741d65f6f70SBen Gras
1742d65f6f70SBen Gras synopsis_pre(h, n);
1743d65f6f70SBen Gras
1744d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "includes");
1745d65f6f70SBen Gras print_otag(h, TAG_B, 1, tag);
1746d65f6f70SBen Gras
174792395e9cSLionel Sambuc /*
174892395e9cSLionel Sambuc * The first argument of the `In' gets special treatment as
174992395e9cSLionel Sambuc * being a linked value. Subsequent values are printed
175092395e9cSLionel Sambuc * afterward. groff does similarly. This also handles the case
175192395e9cSLionel Sambuc * of no children.
175292395e9cSLionel Sambuc */
175392395e9cSLionel Sambuc
1754d65f6f70SBen Gras if (MDOC_SYNPRETTY & n->flags && MDOC_LINE & n->flags)
1755d65f6f70SBen Gras print_text(h, "#include");
1756d65f6f70SBen Gras
1757d65f6f70SBen Gras print_text(h, "<");
1758d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
1759d65f6f70SBen Gras
176092395e9cSLionel Sambuc if (NULL != (n = n->child)) {
176192395e9cSLionel Sambuc assert(MDOC_TEXT == n->type);
176292395e9cSLionel Sambuc
1763d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "link-includes");
176492395e9cSLionel Sambuc
1765d65f6f70SBen Gras i = 1;
1766d65f6f70SBen Gras if (h->base_includes) {
176792395e9cSLionel Sambuc buffmt_includes(h, n->string);
1768d65f6f70SBen Gras PAIR_HREF_INIT(&tag[i], h->buf);
1769d65f6f70SBen Gras i++;
1770d65f6f70SBen Gras }
177192395e9cSLionel Sambuc
1772d65f6f70SBen Gras t = print_otag(h, TAG_A, i, tag);
177392395e9cSLionel Sambuc print_text(h, n->string);
1774d65f6f70SBen Gras print_tagq(h, t);
177592395e9cSLionel Sambuc
177692395e9cSLionel Sambuc n = n->next;
1777d65f6f70SBen Gras }
1778d65f6f70SBen Gras
1779d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
1780d65f6f70SBen Gras print_text(h, ">");
1781d65f6f70SBen Gras
178292395e9cSLionel Sambuc for ( ; n; n = n->next) {
178392395e9cSLionel Sambuc assert(MDOC_TEXT == n->type);
178492395e9cSLionel Sambuc print_text(h, n->string);
178592395e9cSLionel Sambuc }
178692395e9cSLionel Sambuc
1787d65f6f70SBen Gras return(0);
1788d65f6f70SBen Gras }
1789d65f6f70SBen Gras
1790d65f6f70SBen Gras
1791d65f6f70SBen Gras /* ARGSUSED */
1792d65f6f70SBen Gras static int
mdoc_ic_pre(MDOC_ARGS)1793d65f6f70SBen Gras mdoc_ic_pre(MDOC_ARGS)
1794d65f6f70SBen Gras {
1795d65f6f70SBen Gras struct htmlpair tag;
1796d65f6f70SBen Gras
1797d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "cmd");
1798d65f6f70SBen Gras print_otag(h, TAG_B, 1, &tag);
1799d65f6f70SBen Gras return(1);
1800d65f6f70SBen Gras }
1801d65f6f70SBen Gras
1802d65f6f70SBen Gras
1803d65f6f70SBen Gras /* ARGSUSED */
1804d65f6f70SBen Gras static int
mdoc_rv_pre(MDOC_ARGS)1805d65f6f70SBen Gras mdoc_rv_pre(MDOC_ARGS)
1806d65f6f70SBen Gras {
1807d65f6f70SBen Gras struct htmlpair tag;
1808d65f6f70SBen Gras struct tag *t;
180992395e9cSLionel Sambuc int nchild;
1810d65f6f70SBen Gras
1811d65f6f70SBen Gras if (n->prev)
1812d65f6f70SBen Gras print_otag(h, TAG_BR, 0, NULL);
1813d65f6f70SBen Gras
181492395e9cSLionel Sambuc PAIR_CLASS_INIT(&tag, "fname");
181592395e9cSLionel Sambuc
1816d65f6f70SBen Gras print_text(h, "The");
1817d65f6f70SBen Gras
181892395e9cSLionel Sambuc nchild = n->nchild;
181992395e9cSLionel Sambuc for (n = n->child; n; n = n->next) {
182092395e9cSLionel Sambuc assert(MDOC_TEXT == n->type);
182192395e9cSLionel Sambuc
1822d65f6f70SBen Gras t = print_otag(h, TAG_B, 1, &tag);
182392395e9cSLionel Sambuc print_text(h, n->string);
1824d65f6f70SBen Gras print_tagq(h, t);
1825d65f6f70SBen Gras
1826d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
1827d65f6f70SBen Gras print_text(h, "()");
182892395e9cSLionel Sambuc
182992395e9cSLionel Sambuc if (nchild > 2 && n->next) {
183092395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
183192395e9cSLionel Sambuc print_text(h, ",");
1832d65f6f70SBen Gras }
1833d65f6f70SBen Gras
183492395e9cSLionel Sambuc if (n->next && NULL == n->next->next)
183592395e9cSLionel Sambuc print_text(h, "and");
183692395e9cSLionel Sambuc }
183792395e9cSLionel Sambuc
183892395e9cSLionel Sambuc if (nchild > 1)
1839d65f6f70SBen Gras print_text(h, "functions return");
1840d65f6f70SBen Gras else
1841d65f6f70SBen Gras print_text(h, "function returns");
1842d65f6f70SBen Gras
1843d65f6f70SBen Gras print_text(h, "the value 0 if successful; otherwise the value "
1844d65f6f70SBen Gras "-1 is returned and the global variable");
1845d65f6f70SBen Gras
1846d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "var");
1847d65f6f70SBen Gras t = print_otag(h, TAG_B, 1, &tag);
1848d65f6f70SBen Gras print_text(h, "errno");
1849d65f6f70SBen Gras print_tagq(h, t);
1850d65f6f70SBen Gras print_text(h, "is set to indicate the error.");
1851d65f6f70SBen Gras return(0);
1852d65f6f70SBen Gras }
1853d65f6f70SBen Gras
1854d65f6f70SBen Gras
1855d65f6f70SBen Gras /* ARGSUSED */
1856d65f6f70SBen Gras static int
mdoc_va_pre(MDOC_ARGS)1857d65f6f70SBen Gras mdoc_va_pre(MDOC_ARGS)
1858d65f6f70SBen Gras {
1859d65f6f70SBen Gras struct htmlpair tag;
1860d65f6f70SBen Gras
1861d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "var");
1862d65f6f70SBen Gras print_otag(h, TAG_B, 1, &tag);
1863d65f6f70SBen Gras return(1);
1864d65f6f70SBen Gras }
1865d65f6f70SBen Gras
1866d65f6f70SBen Gras
1867d65f6f70SBen Gras /* ARGSUSED */
1868d65f6f70SBen Gras static int
mdoc_ap_pre(MDOC_ARGS)1869d65f6f70SBen Gras mdoc_ap_pre(MDOC_ARGS)
1870d65f6f70SBen Gras {
1871d65f6f70SBen Gras
1872d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
1873d65f6f70SBen Gras print_text(h, "\\(aq");
1874d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
1875d65f6f70SBen Gras return(1);
1876d65f6f70SBen Gras }
1877d65f6f70SBen Gras
1878d65f6f70SBen Gras
1879d65f6f70SBen Gras /* ARGSUSED */
1880d65f6f70SBen Gras static int
mdoc_bf_pre(MDOC_ARGS)1881d65f6f70SBen Gras mdoc_bf_pre(MDOC_ARGS)
1882d65f6f70SBen Gras {
1883d65f6f70SBen Gras struct htmlpair tag[2];
1884d65f6f70SBen Gras struct roffsu su;
1885d65f6f70SBen Gras
1886d65f6f70SBen Gras if (MDOC_HEAD == n->type)
1887d65f6f70SBen Gras return(0);
1888d65f6f70SBen Gras else if (MDOC_BODY != n->type)
1889d65f6f70SBen Gras return(1);
1890d65f6f70SBen Gras
1891d65f6f70SBen Gras if (FONT_Em == n->norm->Bf.font)
1892d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "emph");
1893d65f6f70SBen Gras else if (FONT_Sy == n->norm->Bf.font)
1894d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "symb");
1895d65f6f70SBen Gras else if (FONT_Li == n->norm->Bf.font)
1896d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "lit");
1897d65f6f70SBen Gras else
1898d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "none");
1899d65f6f70SBen Gras
1900d65f6f70SBen Gras /*
1901d65f6f70SBen Gras * We want this to be inline-formatted, but needs to be div to
1902d65f6f70SBen Gras * accept block children.
1903d65f6f70SBen Gras */
190492395e9cSLionel Sambuc bufinit(h);
1905d65f6f70SBen Gras bufcat_style(h, "display", "inline");
1906d65f6f70SBen Gras SCALE_HS_INIT(&su, 1);
1907d65f6f70SBen Gras /* Needs a left-margin for spacing. */
1908d65f6f70SBen Gras bufcat_su(h, "margin-left", &su);
1909d65f6f70SBen Gras PAIR_STYLE_INIT(&tag[1], h);
1910d65f6f70SBen Gras print_otag(h, TAG_DIV, 2, tag);
1911d65f6f70SBen Gras return(1);
1912d65f6f70SBen Gras }
1913d65f6f70SBen Gras
1914d65f6f70SBen Gras
1915d65f6f70SBen Gras /* ARGSUSED */
1916d65f6f70SBen Gras static int
mdoc_ms_pre(MDOC_ARGS)1917d65f6f70SBen Gras mdoc_ms_pre(MDOC_ARGS)
1918d65f6f70SBen Gras {
1919d65f6f70SBen Gras struct htmlpair tag;
1920d65f6f70SBen Gras
1921d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "symb");
1922d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
1923d65f6f70SBen Gras return(1);
1924d65f6f70SBen Gras }
1925d65f6f70SBen Gras
1926d65f6f70SBen Gras
1927d65f6f70SBen Gras /* ARGSUSED */
1928d65f6f70SBen Gras static int
mdoc_igndelim_pre(MDOC_ARGS)1929d65f6f70SBen Gras mdoc_igndelim_pre(MDOC_ARGS)
1930d65f6f70SBen Gras {
1931d65f6f70SBen Gras
1932d65f6f70SBen Gras h->flags |= HTML_IGNDELIM;
1933d65f6f70SBen Gras return(1);
1934d65f6f70SBen Gras }
1935d65f6f70SBen Gras
1936d65f6f70SBen Gras
1937d65f6f70SBen Gras /* ARGSUSED */
1938d65f6f70SBen Gras static void
mdoc_pf_post(MDOC_ARGS)1939d65f6f70SBen Gras mdoc_pf_post(MDOC_ARGS)
1940d65f6f70SBen Gras {
1941d65f6f70SBen Gras
1942d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
1943d65f6f70SBen Gras }
1944d65f6f70SBen Gras
1945d65f6f70SBen Gras
1946d65f6f70SBen Gras /* ARGSUSED */
1947d65f6f70SBen Gras static int
mdoc_rs_pre(MDOC_ARGS)1948d65f6f70SBen Gras mdoc_rs_pre(MDOC_ARGS)
1949d65f6f70SBen Gras {
1950d65f6f70SBen Gras struct htmlpair tag;
1951d65f6f70SBen Gras
1952d65f6f70SBen Gras if (MDOC_BLOCK != n->type)
1953d65f6f70SBen Gras return(1);
1954d65f6f70SBen Gras
1955d65f6f70SBen Gras if (n->prev && SEC_SEE_ALSO == n->sec)
1956d65f6f70SBen Gras print_otag(h, TAG_P, 0, NULL);
1957d65f6f70SBen Gras
1958d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "ref");
1959d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
1960d65f6f70SBen Gras return(1);
1961d65f6f70SBen Gras }
1962d65f6f70SBen Gras
1963d65f6f70SBen Gras
1964d65f6f70SBen Gras
1965d65f6f70SBen Gras /* ARGSUSED */
1966d65f6f70SBen Gras static int
mdoc_li_pre(MDOC_ARGS)1967d65f6f70SBen Gras mdoc_li_pre(MDOC_ARGS)
1968d65f6f70SBen Gras {
1969d65f6f70SBen Gras struct htmlpair tag;
1970d65f6f70SBen Gras
1971d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "lit");
197292395e9cSLionel Sambuc print_otag(h, TAG_CODE, 1, &tag);
1973d65f6f70SBen Gras return(1);
1974d65f6f70SBen Gras }
1975d65f6f70SBen Gras
1976d65f6f70SBen Gras
1977d65f6f70SBen Gras /* ARGSUSED */
1978d65f6f70SBen Gras static int
mdoc_sy_pre(MDOC_ARGS)1979d65f6f70SBen Gras mdoc_sy_pre(MDOC_ARGS)
1980d65f6f70SBen Gras {
1981d65f6f70SBen Gras struct htmlpair tag;
1982d65f6f70SBen Gras
1983d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "symb");
1984d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
1985d65f6f70SBen Gras return(1);
1986d65f6f70SBen Gras }
1987d65f6f70SBen Gras
1988d65f6f70SBen Gras
1989d65f6f70SBen Gras /* ARGSUSED */
1990d65f6f70SBen Gras static int
mdoc_bt_pre(MDOC_ARGS)1991d65f6f70SBen Gras mdoc_bt_pre(MDOC_ARGS)
1992d65f6f70SBen Gras {
1993d65f6f70SBen Gras
1994d65f6f70SBen Gras print_text(h, "is currently in beta test.");
1995d65f6f70SBen Gras return(0);
1996d65f6f70SBen Gras }
1997d65f6f70SBen Gras
1998d65f6f70SBen Gras
1999d65f6f70SBen Gras /* ARGSUSED */
2000d65f6f70SBen Gras static int
mdoc_ud_pre(MDOC_ARGS)2001d65f6f70SBen Gras mdoc_ud_pre(MDOC_ARGS)
2002d65f6f70SBen Gras {
2003d65f6f70SBen Gras
2004d65f6f70SBen Gras print_text(h, "currently under development.");
2005d65f6f70SBen Gras return(0);
2006d65f6f70SBen Gras }
2007d65f6f70SBen Gras
2008d65f6f70SBen Gras
2009d65f6f70SBen Gras /* ARGSUSED */
2010d65f6f70SBen Gras static int
mdoc_lb_pre(MDOC_ARGS)2011d65f6f70SBen Gras mdoc_lb_pre(MDOC_ARGS)
2012d65f6f70SBen Gras {
2013d65f6f70SBen Gras struct htmlpair tag;
2014d65f6f70SBen Gras
2015d65f6f70SBen Gras if (SEC_LIBRARY == n->sec && MDOC_LINE & n->flags && n->prev)
2016d65f6f70SBen Gras print_otag(h, TAG_BR, 0, NULL);
2017d65f6f70SBen Gras
2018d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "lib");
2019d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
2020d65f6f70SBen Gras return(1);
2021d65f6f70SBen Gras }
2022d65f6f70SBen Gras
2023d65f6f70SBen Gras
2024d65f6f70SBen Gras /* ARGSUSED */
2025d65f6f70SBen Gras static int
mdoc__x_pre(MDOC_ARGS)2026d65f6f70SBen Gras mdoc__x_pre(MDOC_ARGS)
2027d65f6f70SBen Gras {
2028d65f6f70SBen Gras struct htmlpair tag[2];
2029d65f6f70SBen Gras enum htmltag t;
2030d65f6f70SBen Gras
2031d65f6f70SBen Gras t = TAG_SPAN;
2032d65f6f70SBen Gras
2033d65f6f70SBen Gras switch (n->tok) {
2034d65f6f70SBen Gras case(MDOC__A):
2035d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-auth");
2036d65f6f70SBen Gras if (n->prev && MDOC__A == n->prev->tok)
2037d65f6f70SBen Gras if (NULL == n->next || MDOC__A != n->next->tok)
2038d65f6f70SBen Gras print_text(h, "and");
2039d65f6f70SBen Gras break;
2040d65f6f70SBen Gras case(MDOC__B):
2041d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-book");
2042d65f6f70SBen Gras t = TAG_I;
2043d65f6f70SBen Gras break;
2044d65f6f70SBen Gras case(MDOC__C):
2045d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-city");
2046d65f6f70SBen Gras break;
2047d65f6f70SBen Gras case(MDOC__D):
2048d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-date");
2049d65f6f70SBen Gras break;
2050d65f6f70SBen Gras case(MDOC__I):
2051d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-issue");
2052d65f6f70SBen Gras t = TAG_I;
2053d65f6f70SBen Gras break;
2054d65f6f70SBen Gras case(MDOC__J):
2055d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-jrnl");
2056d65f6f70SBen Gras t = TAG_I;
2057d65f6f70SBen Gras break;
2058d65f6f70SBen Gras case(MDOC__N):
2059d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-num");
2060d65f6f70SBen Gras break;
2061d65f6f70SBen Gras case(MDOC__O):
2062d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-opt");
2063d65f6f70SBen Gras break;
2064d65f6f70SBen Gras case(MDOC__P):
2065d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-page");
2066d65f6f70SBen Gras break;
2067d65f6f70SBen Gras case(MDOC__Q):
2068d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-corp");
2069d65f6f70SBen Gras break;
2070d65f6f70SBen Gras case(MDOC__R):
2071d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-rep");
2072d65f6f70SBen Gras break;
2073d65f6f70SBen Gras case(MDOC__T):
2074d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-title");
2075d65f6f70SBen Gras break;
2076d65f6f70SBen Gras case(MDOC__U):
2077d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "link-ref");
2078d65f6f70SBen Gras break;
2079d65f6f70SBen Gras case(MDOC__V):
2080d65f6f70SBen Gras PAIR_CLASS_INIT(&tag[0], "ref-vol");
2081d65f6f70SBen Gras break;
2082d65f6f70SBen Gras default:
2083d65f6f70SBen Gras abort();
2084d65f6f70SBen Gras /* NOTREACHED */
2085d65f6f70SBen Gras }
2086d65f6f70SBen Gras
2087d65f6f70SBen Gras if (MDOC__U != n->tok) {
2088d65f6f70SBen Gras print_otag(h, t, 1, tag);
2089d65f6f70SBen Gras return(1);
2090d65f6f70SBen Gras }
2091d65f6f70SBen Gras
2092d65f6f70SBen Gras PAIR_HREF_INIT(&tag[1], n->child->string);
2093d65f6f70SBen Gras print_otag(h, TAG_A, 2, tag);
2094d65f6f70SBen Gras
2095d65f6f70SBen Gras return(1);
2096d65f6f70SBen Gras }
2097d65f6f70SBen Gras
2098d65f6f70SBen Gras
2099d65f6f70SBen Gras /* ARGSUSED */
2100d65f6f70SBen Gras static void
mdoc__x_post(MDOC_ARGS)2101d65f6f70SBen Gras mdoc__x_post(MDOC_ARGS)
2102d65f6f70SBen Gras {
2103d65f6f70SBen Gras
2104d65f6f70SBen Gras if (MDOC__A == n->tok && n->next && MDOC__A == n->next->tok)
2105d65f6f70SBen Gras if (NULL == n->next->next || MDOC__A != n->next->next->tok)
2106d65f6f70SBen Gras if (NULL == n->prev || MDOC__A != n->prev->tok)
2107d65f6f70SBen Gras return;
2108d65f6f70SBen Gras
2109d65f6f70SBen Gras /* TODO: %U */
2110d65f6f70SBen Gras
2111d65f6f70SBen Gras if (NULL == n->parent || MDOC_Rs != n->parent->tok)
2112d65f6f70SBen Gras return;
2113d65f6f70SBen Gras
211492395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
2115d65f6f70SBen Gras print_text(h, n->next ? "," : ".");
2116d65f6f70SBen Gras }
2117d65f6f70SBen Gras
2118d65f6f70SBen Gras
2119d65f6f70SBen Gras /* ARGSUSED */
2120d65f6f70SBen Gras static int
mdoc_bk_pre(MDOC_ARGS)2121d65f6f70SBen Gras mdoc_bk_pre(MDOC_ARGS)
2122d65f6f70SBen Gras {
2123d65f6f70SBen Gras
2124d65f6f70SBen Gras switch (n->type) {
2125d65f6f70SBen Gras case (MDOC_BLOCK):
2126d65f6f70SBen Gras break;
2127d65f6f70SBen Gras case (MDOC_HEAD):
2128d65f6f70SBen Gras return(0);
2129d65f6f70SBen Gras case (MDOC_BODY):
2130d65f6f70SBen Gras if (n->parent->args || 0 == n->prev->nchild)
2131d65f6f70SBen Gras h->flags |= HTML_PREKEEP;
2132d65f6f70SBen Gras break;
2133d65f6f70SBen Gras default:
2134d65f6f70SBen Gras abort();
2135d65f6f70SBen Gras /* NOTREACHED */
2136d65f6f70SBen Gras }
2137d65f6f70SBen Gras
2138d65f6f70SBen Gras return(1);
2139d65f6f70SBen Gras }
2140d65f6f70SBen Gras
2141d65f6f70SBen Gras
2142d65f6f70SBen Gras /* ARGSUSED */
2143d65f6f70SBen Gras static void
mdoc_bk_post(MDOC_ARGS)2144d65f6f70SBen Gras mdoc_bk_post(MDOC_ARGS)
2145d65f6f70SBen Gras {
2146d65f6f70SBen Gras
2147d65f6f70SBen Gras if (MDOC_BODY == n->type)
2148d65f6f70SBen Gras h->flags &= ~(HTML_KEEP | HTML_PREKEEP);
2149d65f6f70SBen Gras }
2150d65f6f70SBen Gras
2151d65f6f70SBen Gras
2152d65f6f70SBen Gras /* ARGSUSED */
2153d65f6f70SBen Gras static int
mdoc_quote_pre(MDOC_ARGS)2154d65f6f70SBen Gras mdoc_quote_pre(MDOC_ARGS)
2155d65f6f70SBen Gras {
2156d65f6f70SBen Gras struct htmlpair tag;
2157d65f6f70SBen Gras
2158d65f6f70SBen Gras if (MDOC_BODY != n->type)
2159d65f6f70SBen Gras return(1);
2160d65f6f70SBen Gras
2161d65f6f70SBen Gras switch (n->tok) {
2162d65f6f70SBen Gras case (MDOC_Ao):
2163d65f6f70SBen Gras /* FALLTHROUGH */
2164d65f6f70SBen Gras case (MDOC_Aq):
2165d65f6f70SBen Gras print_text(h, "\\(la");
2166d65f6f70SBen Gras break;
2167d65f6f70SBen Gras case (MDOC_Bro):
2168d65f6f70SBen Gras /* FALLTHROUGH */
2169d65f6f70SBen Gras case (MDOC_Brq):
2170d65f6f70SBen Gras print_text(h, "\\(lC");
2171d65f6f70SBen Gras break;
2172d65f6f70SBen Gras case (MDOC_Bo):
2173d65f6f70SBen Gras /* FALLTHROUGH */
2174d65f6f70SBen Gras case (MDOC_Bq):
2175d65f6f70SBen Gras print_text(h, "\\(lB");
2176d65f6f70SBen Gras break;
2177d65f6f70SBen Gras case (MDOC_Oo):
2178d65f6f70SBen Gras /* FALLTHROUGH */
2179d65f6f70SBen Gras case (MDOC_Op):
2180d65f6f70SBen Gras print_text(h, "\\(lB");
2181d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
2182d65f6f70SBen Gras PAIR_CLASS_INIT(&tag, "opt");
2183d65f6f70SBen Gras print_otag(h, TAG_SPAN, 1, &tag);
2184d65f6f70SBen Gras break;
218592395e9cSLionel Sambuc case (MDOC_Eo):
218692395e9cSLionel Sambuc break;
2187d65f6f70SBen Gras case (MDOC_Do):
2188d65f6f70SBen Gras /* FALLTHROUGH */
2189d65f6f70SBen Gras case (MDOC_Dq):
2190d65f6f70SBen Gras /* FALLTHROUGH */
2191d65f6f70SBen Gras case (MDOC_Qo):
2192d65f6f70SBen Gras /* FALLTHROUGH */
2193d65f6f70SBen Gras case (MDOC_Qq):
2194d65f6f70SBen Gras print_text(h, "\\(lq");
2195d65f6f70SBen Gras break;
2196d65f6f70SBen Gras case (MDOC_Po):
2197d65f6f70SBen Gras /* FALLTHROUGH */
2198d65f6f70SBen Gras case (MDOC_Pq):
2199d65f6f70SBen Gras print_text(h, "(");
2200d65f6f70SBen Gras break;
2201d65f6f70SBen Gras case (MDOC_Ql):
220292395e9cSLionel Sambuc print_text(h, "\\(oq");
220392395e9cSLionel Sambuc h->flags |= HTML_NOSPACE;
220492395e9cSLionel Sambuc PAIR_CLASS_INIT(&tag, "lit");
220592395e9cSLionel Sambuc print_otag(h, TAG_CODE, 1, &tag);
220692395e9cSLionel Sambuc break;
2207d65f6f70SBen Gras case (MDOC_So):
2208d65f6f70SBen Gras /* FALLTHROUGH */
2209d65f6f70SBen Gras case (MDOC_Sq):
2210d65f6f70SBen Gras print_text(h, "\\(oq");
2211d65f6f70SBen Gras break;
2212d65f6f70SBen Gras default:
2213d65f6f70SBen Gras abort();
2214d65f6f70SBen Gras /* NOTREACHED */
2215d65f6f70SBen Gras }
2216d65f6f70SBen Gras
2217d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
2218d65f6f70SBen Gras return(1);
2219d65f6f70SBen Gras }
2220d65f6f70SBen Gras
2221d65f6f70SBen Gras
2222d65f6f70SBen Gras /* ARGSUSED */
2223d65f6f70SBen Gras static void
mdoc_quote_post(MDOC_ARGS)2224d65f6f70SBen Gras mdoc_quote_post(MDOC_ARGS)
2225d65f6f70SBen Gras {
2226d65f6f70SBen Gras
2227d65f6f70SBen Gras if (MDOC_BODY != n->type)
2228d65f6f70SBen Gras return;
2229d65f6f70SBen Gras
2230d65f6f70SBen Gras h->flags |= HTML_NOSPACE;
2231d65f6f70SBen Gras
2232d65f6f70SBen Gras switch (n->tok) {
2233d65f6f70SBen Gras case (MDOC_Ao):
2234d65f6f70SBen Gras /* FALLTHROUGH */
2235d65f6f70SBen Gras case (MDOC_Aq):
2236d65f6f70SBen Gras print_text(h, "\\(ra");
2237d65f6f70SBen Gras break;
2238d65f6f70SBen Gras case (MDOC_Bro):
2239d65f6f70SBen Gras /* FALLTHROUGH */
2240d65f6f70SBen Gras case (MDOC_Brq):
2241d65f6f70SBen Gras print_text(h, "\\(rC");
2242d65f6f70SBen Gras break;
2243d65f6f70SBen Gras case (MDOC_Oo):
2244d65f6f70SBen Gras /* FALLTHROUGH */
2245d65f6f70SBen Gras case (MDOC_Op):
2246d65f6f70SBen Gras /* FALLTHROUGH */
2247d65f6f70SBen Gras case (MDOC_Bo):
2248d65f6f70SBen Gras /* FALLTHROUGH */
2249d65f6f70SBen Gras case (MDOC_Bq):
2250d65f6f70SBen Gras print_text(h, "\\(rB");
2251d65f6f70SBen Gras break;
225292395e9cSLionel Sambuc case (MDOC_Eo):
225392395e9cSLionel Sambuc break;
2254d65f6f70SBen Gras case (MDOC_Qo):
2255d65f6f70SBen Gras /* FALLTHROUGH */
2256d65f6f70SBen Gras case (MDOC_Qq):
2257d65f6f70SBen Gras /* FALLTHROUGH */
2258d65f6f70SBen Gras case (MDOC_Do):
2259d65f6f70SBen Gras /* FALLTHROUGH */
2260d65f6f70SBen Gras case (MDOC_Dq):
2261d65f6f70SBen Gras print_text(h, "\\(rq");
2262d65f6f70SBen Gras break;
2263d65f6f70SBen Gras case (MDOC_Po):
2264d65f6f70SBen Gras /* FALLTHROUGH */
2265d65f6f70SBen Gras case (MDOC_Pq):
2266d65f6f70SBen Gras print_text(h, ")");
2267d65f6f70SBen Gras break;
2268d65f6f70SBen Gras case (MDOC_Ql):
2269d65f6f70SBen Gras /* FALLTHROUGH */
2270d65f6f70SBen Gras case (MDOC_So):
2271d65f6f70SBen Gras /* FALLTHROUGH */
2272d65f6f70SBen Gras case (MDOC_Sq):
2273*0a6a1f1dSLionel Sambuc print_text(h, "\\(cq");
2274d65f6f70SBen Gras break;
2275d65f6f70SBen Gras default:
2276d65f6f70SBen Gras abort();
2277d65f6f70SBen Gras /* NOTREACHED */
2278d65f6f70SBen Gras }
2279d65f6f70SBen Gras }
2280d65f6f70SBen Gras
2281d65f6f70SBen Gras
2282