1*6d38604fSBaptiste Daroussin /* $Id: mdoc_html.c,v 1.342 2021/03/30 19:26:20 schwarze Exp $ */ 261d06d6bSBaptiste Daroussin /* 3*6d38604fSBaptiste Daroussin * Copyright (c) 2014-2021 Ingo Schwarze <schwarze@openbsd.org> 461d06d6bSBaptiste Daroussin * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> 561d06d6bSBaptiste Daroussin * 661d06d6bSBaptiste Daroussin * Permission to use, copy, modify, and distribute this software for any 761d06d6bSBaptiste Daroussin * purpose with or without fee is hereby granted, provided that the above 861d06d6bSBaptiste Daroussin * copyright notice and this permission notice appear in all copies. 961d06d6bSBaptiste Daroussin * 1061d06d6bSBaptiste Daroussin * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES 1161d06d6bSBaptiste Daroussin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1261d06d6bSBaptiste Daroussin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR 1361d06d6bSBaptiste Daroussin * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1461d06d6bSBaptiste Daroussin * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1561d06d6bSBaptiste Daroussin * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1661d06d6bSBaptiste Daroussin * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17*6d38604fSBaptiste Daroussin * 18*6d38604fSBaptiste Daroussin * HTML formatter for mdoc(7) used by mandoc(1). 1961d06d6bSBaptiste Daroussin */ 2061d06d6bSBaptiste Daroussin #include "config.h" 2161d06d6bSBaptiste Daroussin 2261d06d6bSBaptiste Daroussin #include <sys/types.h> 2361d06d6bSBaptiste Daroussin 2461d06d6bSBaptiste Daroussin #include <assert.h> 2561d06d6bSBaptiste Daroussin #include <ctype.h> 2661d06d6bSBaptiste Daroussin #include <stdio.h> 2761d06d6bSBaptiste Daroussin #include <stdlib.h> 2861d06d6bSBaptiste Daroussin #include <string.h> 2961d06d6bSBaptiste Daroussin #include <unistd.h> 3061d06d6bSBaptiste Daroussin 3161d06d6bSBaptiste Daroussin #include "mandoc_aux.h" 3261d06d6bSBaptiste Daroussin #include "mandoc.h" 3361d06d6bSBaptiste Daroussin #include "roff.h" 3461d06d6bSBaptiste Daroussin #include "mdoc.h" 3561d06d6bSBaptiste Daroussin #include "out.h" 3661d06d6bSBaptiste Daroussin #include "html.h" 3761d06d6bSBaptiste Daroussin #include "main.h" 3861d06d6bSBaptiste Daroussin 3961d06d6bSBaptiste Daroussin #define MDOC_ARGS const struct roff_meta *meta, \ 4061d06d6bSBaptiste Daroussin struct roff_node *n, \ 4161d06d6bSBaptiste Daroussin struct html *h 4261d06d6bSBaptiste Daroussin 4361d06d6bSBaptiste Daroussin #ifndef MIN 4461d06d6bSBaptiste Daroussin #define MIN(a,b) ((/*CONSTCOND*/(a)<(b))?(a):(b)) 4561d06d6bSBaptiste Daroussin #endif 4661d06d6bSBaptiste Daroussin 477295610fSBaptiste Daroussin struct mdoc_html_act { 4861d06d6bSBaptiste Daroussin int (*pre)(MDOC_ARGS); 4961d06d6bSBaptiste Daroussin void (*post)(MDOC_ARGS); 5061d06d6bSBaptiste Daroussin }; 5161d06d6bSBaptiste Daroussin 5261d06d6bSBaptiste Daroussin static void print_mdoc_head(const struct roff_meta *, 5361d06d6bSBaptiste Daroussin struct html *); 5461d06d6bSBaptiste Daroussin static void print_mdoc_node(MDOC_ARGS); 5561d06d6bSBaptiste Daroussin static void print_mdoc_nodelist(MDOC_ARGS); 56*6d38604fSBaptiste Daroussin static void synopsis_pre(struct html *, struct roff_node *); 5761d06d6bSBaptiste Daroussin 5861d06d6bSBaptiste Daroussin static void mdoc_root_post(const struct roff_meta *, 5961d06d6bSBaptiste Daroussin struct html *); 6061d06d6bSBaptiste Daroussin static int mdoc_root_pre(const struct roff_meta *, 6161d06d6bSBaptiste Daroussin struct html *); 6261d06d6bSBaptiste Daroussin 6361d06d6bSBaptiste Daroussin static void mdoc__x_post(MDOC_ARGS); 6461d06d6bSBaptiste Daroussin static int mdoc__x_pre(MDOC_ARGS); 657295610fSBaptiste Daroussin static int mdoc_abort_pre(MDOC_ARGS); 6661d06d6bSBaptiste Daroussin static int mdoc_ad_pre(MDOC_ARGS); 6761d06d6bSBaptiste Daroussin static int mdoc_an_pre(MDOC_ARGS); 6861d06d6bSBaptiste Daroussin static int mdoc_ap_pre(MDOC_ARGS); 6961d06d6bSBaptiste Daroussin static int mdoc_ar_pre(MDOC_ARGS); 7061d06d6bSBaptiste Daroussin static int mdoc_bd_pre(MDOC_ARGS); 7161d06d6bSBaptiste Daroussin static int mdoc_bf_pre(MDOC_ARGS); 7261d06d6bSBaptiste Daroussin static void mdoc_bk_post(MDOC_ARGS); 7361d06d6bSBaptiste Daroussin static int mdoc_bk_pre(MDOC_ARGS); 7461d06d6bSBaptiste Daroussin static int mdoc_bl_pre(MDOC_ARGS); 7561d06d6bSBaptiste Daroussin static int mdoc_cd_pre(MDOC_ARGS); 76*6d38604fSBaptiste Daroussin static int mdoc_code_pre(MDOC_ARGS); 7761d06d6bSBaptiste Daroussin static int mdoc_d1_pre(MDOC_ARGS); 7861d06d6bSBaptiste Daroussin static int mdoc_fa_pre(MDOC_ARGS); 7961d06d6bSBaptiste Daroussin static int mdoc_fd_pre(MDOC_ARGS); 8061d06d6bSBaptiste Daroussin static int mdoc_fl_pre(MDOC_ARGS); 8161d06d6bSBaptiste Daroussin static int mdoc_fn_pre(MDOC_ARGS); 8261d06d6bSBaptiste Daroussin static int mdoc_ft_pre(MDOC_ARGS); 8361d06d6bSBaptiste Daroussin static int mdoc_em_pre(MDOC_ARGS); 8461d06d6bSBaptiste Daroussin static void mdoc_eo_post(MDOC_ARGS); 8561d06d6bSBaptiste Daroussin static int mdoc_eo_pre(MDOC_ARGS); 8661d06d6bSBaptiste Daroussin static int mdoc_ex_pre(MDOC_ARGS); 8761d06d6bSBaptiste Daroussin static void mdoc_fo_post(MDOC_ARGS); 8861d06d6bSBaptiste Daroussin static int mdoc_fo_pre(MDOC_ARGS); 8961d06d6bSBaptiste Daroussin static int mdoc_igndelim_pre(MDOC_ARGS); 9061d06d6bSBaptiste Daroussin static int mdoc_in_pre(MDOC_ARGS); 9161d06d6bSBaptiste Daroussin static int mdoc_it_pre(MDOC_ARGS); 9261d06d6bSBaptiste Daroussin static int mdoc_lb_pre(MDOC_ARGS); 9361d06d6bSBaptiste Daroussin static int mdoc_lk_pre(MDOC_ARGS); 9461d06d6bSBaptiste Daroussin static int mdoc_mt_pre(MDOC_ARGS); 9561d06d6bSBaptiste Daroussin static int mdoc_nd_pre(MDOC_ARGS); 9661d06d6bSBaptiste Daroussin static int mdoc_nm_pre(MDOC_ARGS); 9761d06d6bSBaptiste Daroussin static int mdoc_no_pre(MDOC_ARGS); 9861d06d6bSBaptiste Daroussin static int mdoc_ns_pre(MDOC_ARGS); 9961d06d6bSBaptiste Daroussin static int mdoc_pa_pre(MDOC_ARGS); 10061d06d6bSBaptiste Daroussin static void mdoc_pf_post(MDOC_ARGS); 10161d06d6bSBaptiste Daroussin static int mdoc_pp_pre(MDOC_ARGS); 10261d06d6bSBaptiste Daroussin static void mdoc_quote_post(MDOC_ARGS); 10361d06d6bSBaptiste Daroussin static int mdoc_quote_pre(MDOC_ARGS); 10461d06d6bSBaptiste Daroussin static int mdoc_rs_pre(MDOC_ARGS); 10561d06d6bSBaptiste Daroussin static int mdoc_sh_pre(MDOC_ARGS); 10661d06d6bSBaptiste Daroussin static int mdoc_skip_pre(MDOC_ARGS); 10761d06d6bSBaptiste Daroussin static int mdoc_sm_pre(MDOC_ARGS); 10861d06d6bSBaptiste Daroussin static int mdoc_ss_pre(MDOC_ARGS); 10961d06d6bSBaptiste Daroussin static int mdoc_st_pre(MDOC_ARGS); 11061d06d6bSBaptiste Daroussin static int mdoc_sx_pre(MDOC_ARGS); 11161d06d6bSBaptiste Daroussin static int mdoc_sy_pre(MDOC_ARGS); 112*6d38604fSBaptiste Daroussin static int mdoc_tg_pre(MDOC_ARGS); 11361d06d6bSBaptiste Daroussin static int mdoc_va_pre(MDOC_ARGS); 11461d06d6bSBaptiste Daroussin static int mdoc_vt_pre(MDOC_ARGS); 11561d06d6bSBaptiste Daroussin static int mdoc_xr_pre(MDOC_ARGS); 11661d06d6bSBaptiste Daroussin static int mdoc_xx_pre(MDOC_ARGS); 11761d06d6bSBaptiste Daroussin 1187295610fSBaptiste Daroussin static const struct mdoc_html_act mdoc_html_acts[MDOC_MAX - MDOC_Dd] = { 11961d06d6bSBaptiste Daroussin {NULL, NULL}, /* Dd */ 12061d06d6bSBaptiste Daroussin {NULL, NULL}, /* Dt */ 12161d06d6bSBaptiste Daroussin {NULL, NULL}, /* Os */ 12261d06d6bSBaptiste Daroussin {mdoc_sh_pre, NULL }, /* Sh */ 12361d06d6bSBaptiste Daroussin {mdoc_ss_pre, NULL }, /* Ss */ 12461d06d6bSBaptiste Daroussin {mdoc_pp_pre, NULL}, /* Pp */ 12561d06d6bSBaptiste Daroussin {mdoc_d1_pre, NULL}, /* D1 */ 12661d06d6bSBaptiste Daroussin {mdoc_d1_pre, NULL}, /* Dl */ 12761d06d6bSBaptiste Daroussin {mdoc_bd_pre, NULL}, /* Bd */ 12861d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ed */ 12961d06d6bSBaptiste Daroussin {mdoc_bl_pre, NULL}, /* Bl */ 13061d06d6bSBaptiste Daroussin {NULL, NULL}, /* El */ 13161d06d6bSBaptiste Daroussin {mdoc_it_pre, NULL}, /* It */ 13261d06d6bSBaptiste Daroussin {mdoc_ad_pre, NULL}, /* Ad */ 13361d06d6bSBaptiste Daroussin {mdoc_an_pre, NULL}, /* An */ 13461d06d6bSBaptiste Daroussin {mdoc_ap_pre, NULL}, /* Ap */ 13561d06d6bSBaptiste Daroussin {mdoc_ar_pre, NULL}, /* Ar */ 13661d06d6bSBaptiste Daroussin {mdoc_cd_pre, NULL}, /* Cd */ 137*6d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Cm */ 138*6d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Dv */ 139*6d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Er */ 140*6d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Ev */ 14161d06d6bSBaptiste Daroussin {mdoc_ex_pre, NULL}, /* Ex */ 14261d06d6bSBaptiste Daroussin {mdoc_fa_pre, NULL}, /* Fa */ 14361d06d6bSBaptiste Daroussin {mdoc_fd_pre, NULL}, /* Fd */ 14461d06d6bSBaptiste Daroussin {mdoc_fl_pre, NULL}, /* Fl */ 14561d06d6bSBaptiste Daroussin {mdoc_fn_pre, NULL}, /* Fn */ 14661d06d6bSBaptiste Daroussin {mdoc_ft_pre, NULL}, /* Ft */ 147*6d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Ic */ 14861d06d6bSBaptiste Daroussin {mdoc_in_pre, NULL}, /* In */ 149*6d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Li */ 15061d06d6bSBaptiste Daroussin {mdoc_nd_pre, NULL}, /* Nd */ 15161d06d6bSBaptiste Daroussin {mdoc_nm_pre, NULL}, /* Nm */ 15261d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Op */ 1537295610fSBaptiste Daroussin {mdoc_abort_pre, NULL}, /* Ot */ 15461d06d6bSBaptiste Daroussin {mdoc_pa_pre, NULL}, /* Pa */ 15561d06d6bSBaptiste Daroussin {mdoc_ex_pre, NULL}, /* Rv */ 15661d06d6bSBaptiste Daroussin {mdoc_st_pre, NULL}, /* St */ 15761d06d6bSBaptiste Daroussin {mdoc_va_pre, NULL}, /* Va */ 15861d06d6bSBaptiste Daroussin {mdoc_vt_pre, NULL}, /* Vt */ 15961d06d6bSBaptiste Daroussin {mdoc_xr_pre, NULL}, /* Xr */ 16061d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %A */ 16161d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %B */ 16261d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %D */ 16361d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %I */ 16461d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %J */ 16561d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %N */ 16661d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %O */ 16761d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %P */ 16861d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %R */ 16961d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %T */ 17061d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %V */ 17161d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ac */ 17261d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Ao */ 17361d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Aq */ 17461d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* At */ 17561d06d6bSBaptiste Daroussin {NULL, NULL}, /* Bc */ 17661d06d6bSBaptiste Daroussin {mdoc_bf_pre, NULL}, /* Bf */ 17761d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Bo */ 17861d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Bq */ 17961d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Bsx */ 18061d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Bx */ 18161d06d6bSBaptiste Daroussin {mdoc_skip_pre, NULL}, /* Db */ 18261d06d6bSBaptiste Daroussin {NULL, NULL}, /* Dc */ 18361d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Do */ 18461d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Dq */ 18561d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ec */ /* FIXME: no space */ 18661d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ef */ 18761d06d6bSBaptiste Daroussin {mdoc_em_pre, NULL}, /* Em */ 18861d06d6bSBaptiste Daroussin {mdoc_eo_pre, mdoc_eo_post}, /* Eo */ 18961d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Fx */ 190*6d38604fSBaptiste Daroussin {mdoc_no_pre, NULL}, /* Ms */ 19161d06d6bSBaptiste Daroussin {mdoc_no_pre, NULL}, /* No */ 19261d06d6bSBaptiste Daroussin {mdoc_ns_pre, NULL}, /* Ns */ 19361d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Nx */ 19461d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Ox */ 19561d06d6bSBaptiste Daroussin {NULL, NULL}, /* Pc */ 19661d06d6bSBaptiste Daroussin {mdoc_igndelim_pre, mdoc_pf_post}, /* Pf */ 19761d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Po */ 19861d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Pq */ 19961d06d6bSBaptiste Daroussin {NULL, NULL}, /* Qc */ 20061d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Ql */ 20161d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Qo */ 20261d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Qq */ 20361d06d6bSBaptiste Daroussin {NULL, NULL}, /* Re */ 20461d06d6bSBaptiste Daroussin {mdoc_rs_pre, NULL}, /* Rs */ 20561d06d6bSBaptiste Daroussin {NULL, NULL}, /* Sc */ 20661d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* So */ 20761d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Sq */ 20861d06d6bSBaptiste Daroussin {mdoc_sm_pre, NULL}, /* Sm */ 20961d06d6bSBaptiste Daroussin {mdoc_sx_pre, NULL}, /* Sx */ 21061d06d6bSBaptiste Daroussin {mdoc_sy_pre, NULL}, /* Sy */ 21161d06d6bSBaptiste Daroussin {NULL, NULL}, /* Tn */ 21261d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Ux */ 21361d06d6bSBaptiste Daroussin {NULL, NULL}, /* Xc */ 21461d06d6bSBaptiste Daroussin {NULL, NULL}, /* Xo */ 21561d06d6bSBaptiste Daroussin {mdoc_fo_pre, mdoc_fo_post}, /* Fo */ 21661d06d6bSBaptiste Daroussin {NULL, NULL}, /* Fc */ 21761d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Oo */ 21861d06d6bSBaptiste Daroussin {NULL, NULL}, /* Oc */ 21961d06d6bSBaptiste Daroussin {mdoc_bk_pre, mdoc_bk_post}, /* Bk */ 22061d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ek */ 22161d06d6bSBaptiste Daroussin {NULL, NULL}, /* Bt */ 22261d06d6bSBaptiste Daroussin {NULL, NULL}, /* Hf */ 22361d06d6bSBaptiste Daroussin {mdoc_em_pre, NULL}, /* Fr */ 22461d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ud */ 22561d06d6bSBaptiste Daroussin {mdoc_lb_pre, NULL}, /* Lb */ 2267295610fSBaptiste Daroussin {mdoc_abort_pre, NULL}, /* Lp */ 22761d06d6bSBaptiste Daroussin {mdoc_lk_pre, NULL}, /* Lk */ 22861d06d6bSBaptiste Daroussin {mdoc_mt_pre, NULL}, /* Mt */ 22961d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Brq */ 23061d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Bro */ 23161d06d6bSBaptiste Daroussin {NULL, NULL}, /* Brc */ 23261d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %C */ 23361d06d6bSBaptiste Daroussin {mdoc_skip_pre, NULL}, /* Es */ 23461d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* En */ 23561d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Dx */ 23661d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %Q */ 23761d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %U */ 23861d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ta */ 239*6d38604fSBaptiste Daroussin {mdoc_tg_pre, NULL}, /* Tg */ 24061d06d6bSBaptiste Daroussin }; 24161d06d6bSBaptiste Daroussin 24261d06d6bSBaptiste Daroussin 24361d06d6bSBaptiste Daroussin /* 24461d06d6bSBaptiste Daroussin * See the same function in mdoc_term.c for documentation. 24561d06d6bSBaptiste Daroussin */ 24661d06d6bSBaptiste Daroussin static void 247*6d38604fSBaptiste Daroussin synopsis_pre(struct html *h, struct roff_node *n) 24861d06d6bSBaptiste Daroussin { 249*6d38604fSBaptiste Daroussin struct roff_node *np; 25061d06d6bSBaptiste Daroussin 251*6d38604fSBaptiste Daroussin if ((n->flags & NODE_SYNPRETTY) == 0 || 252*6d38604fSBaptiste Daroussin (np = roff_node_prev(n)) == NULL) 25361d06d6bSBaptiste Daroussin return; 25461d06d6bSBaptiste Daroussin 255*6d38604fSBaptiste Daroussin if (np->tok == n->tok && 25661d06d6bSBaptiste Daroussin MDOC_Fo != n->tok && 25761d06d6bSBaptiste Daroussin MDOC_Ft != n->tok && 25861d06d6bSBaptiste Daroussin MDOC_Fn != n->tok) { 25961d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 26061d06d6bSBaptiste Daroussin return; 26161d06d6bSBaptiste Daroussin } 26261d06d6bSBaptiste Daroussin 263*6d38604fSBaptiste Daroussin switch (np->tok) { 26461d06d6bSBaptiste Daroussin case MDOC_Fd: 26561d06d6bSBaptiste Daroussin case MDOC_Fn: 26661d06d6bSBaptiste Daroussin case MDOC_Fo: 26761d06d6bSBaptiste Daroussin case MDOC_In: 26861d06d6bSBaptiste Daroussin case MDOC_Vt: 26961d06d6bSBaptiste Daroussin break; 27061d06d6bSBaptiste Daroussin case MDOC_Ft: 2717295610fSBaptiste Daroussin if (n->tok != MDOC_Fn && n->tok != MDOC_Fo) 27261d06d6bSBaptiste Daroussin break; 27361d06d6bSBaptiste Daroussin /* FALLTHROUGH */ 27461d06d6bSBaptiste Daroussin default: 27561d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 2767295610fSBaptiste Daroussin return; 27761d06d6bSBaptiste Daroussin } 2787295610fSBaptiste Daroussin html_close_paragraph(h); 2797295610fSBaptiste Daroussin print_otag(h, TAG_P, "c", "Pp"); 28061d06d6bSBaptiste Daroussin } 28161d06d6bSBaptiste Daroussin 28261d06d6bSBaptiste Daroussin void 2837295610fSBaptiste Daroussin html_mdoc(void *arg, const struct roff_meta *mdoc) 28461d06d6bSBaptiste Daroussin { 28561d06d6bSBaptiste Daroussin struct html *h; 28661d06d6bSBaptiste Daroussin struct roff_node *n; 28761d06d6bSBaptiste Daroussin struct tag *t; 28861d06d6bSBaptiste Daroussin 28961d06d6bSBaptiste Daroussin h = (struct html *)arg; 29061d06d6bSBaptiste Daroussin n = mdoc->first->child; 29161d06d6bSBaptiste Daroussin 29261d06d6bSBaptiste Daroussin if ((h->oflags & HTML_FRAGMENT) == 0) { 29361d06d6bSBaptiste Daroussin print_gen_decls(h); 29461d06d6bSBaptiste Daroussin print_otag(h, TAG_HTML, ""); 2957295610fSBaptiste Daroussin if (n != NULL && n->type == ROFFT_COMMENT) 29661d06d6bSBaptiste Daroussin print_gen_comment(h, n); 29761d06d6bSBaptiste Daroussin t = print_otag(h, TAG_HEAD, ""); 2987295610fSBaptiste Daroussin print_mdoc_head(mdoc, h); 29961d06d6bSBaptiste Daroussin print_tagq(h, t); 30061d06d6bSBaptiste Daroussin print_otag(h, TAG_BODY, ""); 30161d06d6bSBaptiste Daroussin } 30261d06d6bSBaptiste Daroussin 3037295610fSBaptiste Daroussin mdoc_root_pre(mdoc, h); 30461d06d6bSBaptiste Daroussin t = print_otag(h, TAG_DIV, "c", "manual-text"); 3057295610fSBaptiste Daroussin print_mdoc_nodelist(mdoc, n, h); 30661d06d6bSBaptiste Daroussin print_tagq(h, t); 3077295610fSBaptiste Daroussin mdoc_root_post(mdoc, h); 30861d06d6bSBaptiste Daroussin print_tagq(h, NULL); 30961d06d6bSBaptiste Daroussin } 31061d06d6bSBaptiste Daroussin 31161d06d6bSBaptiste Daroussin static void 31261d06d6bSBaptiste Daroussin print_mdoc_head(const struct roff_meta *meta, struct html *h) 31361d06d6bSBaptiste Daroussin { 31461d06d6bSBaptiste Daroussin char *cp; 31561d06d6bSBaptiste Daroussin 31661d06d6bSBaptiste Daroussin print_gen_head(h); 31761d06d6bSBaptiste Daroussin 31861d06d6bSBaptiste Daroussin if (meta->arch != NULL && meta->msec != NULL) 31961d06d6bSBaptiste Daroussin mandoc_asprintf(&cp, "%s(%s) (%s)", meta->title, 32061d06d6bSBaptiste Daroussin meta->msec, meta->arch); 32161d06d6bSBaptiste Daroussin else if (meta->msec != NULL) 32261d06d6bSBaptiste Daroussin mandoc_asprintf(&cp, "%s(%s)", meta->title, meta->msec); 32361d06d6bSBaptiste Daroussin else if (meta->arch != NULL) 32461d06d6bSBaptiste Daroussin mandoc_asprintf(&cp, "%s (%s)", meta->title, meta->arch); 32561d06d6bSBaptiste Daroussin else 32661d06d6bSBaptiste Daroussin cp = mandoc_strdup(meta->title); 32761d06d6bSBaptiste Daroussin 32861d06d6bSBaptiste Daroussin print_otag(h, TAG_TITLE, ""); 32961d06d6bSBaptiste Daroussin print_text(h, cp); 33061d06d6bSBaptiste Daroussin free(cp); 33161d06d6bSBaptiste Daroussin } 33261d06d6bSBaptiste Daroussin 33361d06d6bSBaptiste Daroussin static void 33461d06d6bSBaptiste Daroussin print_mdoc_nodelist(MDOC_ARGS) 33561d06d6bSBaptiste Daroussin { 33661d06d6bSBaptiste Daroussin 33761d06d6bSBaptiste Daroussin while (n != NULL) { 33861d06d6bSBaptiste Daroussin print_mdoc_node(meta, n, h); 33961d06d6bSBaptiste Daroussin n = n->next; 34061d06d6bSBaptiste Daroussin } 34161d06d6bSBaptiste Daroussin } 34261d06d6bSBaptiste Daroussin 34361d06d6bSBaptiste Daroussin static void 34461d06d6bSBaptiste Daroussin print_mdoc_node(MDOC_ARGS) 34561d06d6bSBaptiste Daroussin { 34661d06d6bSBaptiste Daroussin struct tag *t; 3477295610fSBaptiste Daroussin int child; 34861d06d6bSBaptiste Daroussin 34961d06d6bSBaptiste Daroussin if (n->type == ROFFT_COMMENT || n->flags & NODE_NOPRT) 35061d06d6bSBaptiste Daroussin return; 35161d06d6bSBaptiste Daroussin 352*6d38604fSBaptiste Daroussin if ((n->flags & NODE_NOFILL) == 0) 353*6d38604fSBaptiste Daroussin html_fillmode(h, ROFF_fi); 354*6d38604fSBaptiste Daroussin else if (html_fillmode(h, ROFF_nf) == ROFF_nf && 355*6d38604fSBaptiste Daroussin n->tok != ROFF_fi && n->flags & NODE_LINE) 356*6d38604fSBaptiste Daroussin print_endline(h); 35761d06d6bSBaptiste Daroussin 3587295610fSBaptiste Daroussin child = 1; 3597295610fSBaptiste Daroussin n->flags &= ~NODE_ENDED; 36061d06d6bSBaptiste Daroussin switch (n->type) { 36161d06d6bSBaptiste Daroussin case ROFFT_TEXT: 362*6d38604fSBaptiste Daroussin if (n->flags & NODE_LINE) { 363*6d38604fSBaptiste Daroussin switch (*n->string) { 364*6d38604fSBaptiste Daroussin case '\0': 365*6d38604fSBaptiste Daroussin h->col = 1; 366*6d38604fSBaptiste Daroussin print_endline(h); 367*6d38604fSBaptiste Daroussin return; 368*6d38604fSBaptiste Daroussin case ' ': 369*6d38604fSBaptiste Daroussin if ((h->flags & HTML_NONEWLINE) == 0 && 3707295610fSBaptiste Daroussin (n->flags & NODE_NOFILL) == 0) 37161d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 372*6d38604fSBaptiste Daroussin break; 373*6d38604fSBaptiste Daroussin default: 374*6d38604fSBaptiste Daroussin break; 375*6d38604fSBaptiste Daroussin } 376*6d38604fSBaptiste Daroussin } 377*6d38604fSBaptiste Daroussin t = h->tag; 378*6d38604fSBaptiste Daroussin t->refcnt++; 379*6d38604fSBaptiste Daroussin if (n->flags & NODE_DELIMC) 38061d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 381*6d38604fSBaptiste Daroussin if (n->flags & NODE_HREF) 382*6d38604fSBaptiste Daroussin print_tagged_text(h, n->string, n); 383*6d38604fSBaptiste Daroussin else 38461d06d6bSBaptiste Daroussin print_text(h, n->string); 385*6d38604fSBaptiste Daroussin if (n->flags & NODE_DELIMO) 38661d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 3877295610fSBaptiste Daroussin break; 38861d06d6bSBaptiste Daroussin case ROFFT_EQN: 3897295610fSBaptiste Daroussin t = h->tag; 3907295610fSBaptiste Daroussin t->refcnt++; 39161d06d6bSBaptiste Daroussin print_eqn(h, n->eqn); 39261d06d6bSBaptiste Daroussin break; 39361d06d6bSBaptiste Daroussin case ROFFT_TBL: 39461d06d6bSBaptiste Daroussin /* 39561d06d6bSBaptiste Daroussin * This will take care of initialising all of the table 39661d06d6bSBaptiste Daroussin * state data for the first table, then tearing it down 39761d06d6bSBaptiste Daroussin * for the last one. 39861d06d6bSBaptiste Daroussin */ 39961d06d6bSBaptiste Daroussin print_tbl(h, n->span); 40061d06d6bSBaptiste Daroussin return; 40161d06d6bSBaptiste Daroussin default: 40261d06d6bSBaptiste Daroussin /* 40361d06d6bSBaptiste Daroussin * Close out the current table, if it's open, and unset 40461d06d6bSBaptiste Daroussin * the "meta" table state. This will be reopened on the 40561d06d6bSBaptiste Daroussin * next table element. 40661d06d6bSBaptiste Daroussin */ 4077295610fSBaptiste Daroussin if (h->tblt != NULL) 40861d06d6bSBaptiste Daroussin print_tblclose(h); 40961d06d6bSBaptiste Daroussin assert(h->tblt == NULL); 4107295610fSBaptiste Daroussin t = h->tag; 4117295610fSBaptiste Daroussin t->refcnt++; 41261d06d6bSBaptiste Daroussin if (n->tok < ROFF_MAX) { 41361d06d6bSBaptiste Daroussin roff_html_pre(h, n); 4147295610fSBaptiste Daroussin t->refcnt--; 4157295610fSBaptiste Daroussin print_stagq(h, t); 4167295610fSBaptiste Daroussin return; 41761d06d6bSBaptiste Daroussin } 41861d06d6bSBaptiste Daroussin assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX); 4197295610fSBaptiste Daroussin if (mdoc_html_acts[n->tok - MDOC_Dd].pre != NULL && 42061d06d6bSBaptiste Daroussin (n->end == ENDBODY_NOT || n->child != NULL)) 4217295610fSBaptiste Daroussin child = (*mdoc_html_acts[n->tok - MDOC_Dd].pre)(meta, 4227295610fSBaptiste Daroussin n, h); 42361d06d6bSBaptiste Daroussin break; 42461d06d6bSBaptiste Daroussin } 42561d06d6bSBaptiste Daroussin 42661d06d6bSBaptiste Daroussin if (h->flags & HTML_KEEP && n->flags & NODE_LINE) { 42761d06d6bSBaptiste Daroussin h->flags &= ~HTML_KEEP; 42861d06d6bSBaptiste Daroussin h->flags |= HTML_PREKEEP; 42961d06d6bSBaptiste Daroussin } 43061d06d6bSBaptiste Daroussin 4317295610fSBaptiste Daroussin if (child && n->child != NULL) 43261d06d6bSBaptiste Daroussin print_mdoc_nodelist(meta, n->child, h); 43361d06d6bSBaptiste Daroussin 4347295610fSBaptiste Daroussin t->refcnt--; 43561d06d6bSBaptiste Daroussin print_stagq(h, t); 43661d06d6bSBaptiste Daroussin 43761d06d6bSBaptiste Daroussin switch (n->type) { 4387295610fSBaptiste Daroussin case ROFFT_TEXT: 43961d06d6bSBaptiste Daroussin case ROFFT_EQN: 44061d06d6bSBaptiste Daroussin break; 44161d06d6bSBaptiste Daroussin default: 4427295610fSBaptiste Daroussin if (mdoc_html_acts[n->tok - MDOC_Dd].post == NULL || 44361d06d6bSBaptiste Daroussin n->flags & NODE_ENDED) 44461d06d6bSBaptiste Daroussin break; 4457295610fSBaptiste Daroussin (*mdoc_html_acts[n->tok - MDOC_Dd].post)(meta, n, h); 44661d06d6bSBaptiste Daroussin if (n->end != ENDBODY_NOT) 44761d06d6bSBaptiste Daroussin n->body->flags |= NODE_ENDED; 44861d06d6bSBaptiste Daroussin break; 44961d06d6bSBaptiste Daroussin } 45061d06d6bSBaptiste Daroussin } 45161d06d6bSBaptiste Daroussin 45261d06d6bSBaptiste Daroussin static void 45361d06d6bSBaptiste Daroussin mdoc_root_post(const struct roff_meta *meta, struct html *h) 45461d06d6bSBaptiste Daroussin { 45561d06d6bSBaptiste Daroussin struct tag *t, *tt; 45661d06d6bSBaptiste Daroussin 45761d06d6bSBaptiste Daroussin t = print_otag(h, TAG_TABLE, "c", "foot"); 45861d06d6bSBaptiste Daroussin tt = print_otag(h, TAG_TR, ""); 45961d06d6bSBaptiste Daroussin 46061d06d6bSBaptiste Daroussin print_otag(h, TAG_TD, "c", "foot-date"); 46161d06d6bSBaptiste Daroussin print_text(h, meta->date); 46261d06d6bSBaptiste Daroussin print_stagq(h, tt); 46361d06d6bSBaptiste Daroussin 46461d06d6bSBaptiste Daroussin print_otag(h, TAG_TD, "c", "foot-os"); 46561d06d6bSBaptiste Daroussin print_text(h, meta->os); 46661d06d6bSBaptiste Daroussin print_tagq(h, t); 46761d06d6bSBaptiste Daroussin } 46861d06d6bSBaptiste Daroussin 46961d06d6bSBaptiste Daroussin static int 47061d06d6bSBaptiste Daroussin mdoc_root_pre(const struct roff_meta *meta, struct html *h) 47161d06d6bSBaptiste Daroussin { 47261d06d6bSBaptiste Daroussin struct tag *t, *tt; 47361d06d6bSBaptiste Daroussin char *volume, *title; 47461d06d6bSBaptiste Daroussin 47561d06d6bSBaptiste Daroussin if (NULL == meta->arch) 47661d06d6bSBaptiste Daroussin volume = mandoc_strdup(meta->vol); 47761d06d6bSBaptiste Daroussin else 47861d06d6bSBaptiste Daroussin mandoc_asprintf(&volume, "%s (%s)", 47961d06d6bSBaptiste Daroussin meta->vol, meta->arch); 48061d06d6bSBaptiste Daroussin 48161d06d6bSBaptiste Daroussin if (NULL == meta->msec) 48261d06d6bSBaptiste Daroussin title = mandoc_strdup(meta->title); 48361d06d6bSBaptiste Daroussin else 48461d06d6bSBaptiste Daroussin mandoc_asprintf(&title, "%s(%s)", 48561d06d6bSBaptiste Daroussin meta->title, meta->msec); 48661d06d6bSBaptiste Daroussin 48761d06d6bSBaptiste Daroussin t = print_otag(h, TAG_TABLE, "c", "head"); 48861d06d6bSBaptiste Daroussin tt = print_otag(h, TAG_TR, ""); 48961d06d6bSBaptiste Daroussin 49061d06d6bSBaptiste Daroussin print_otag(h, TAG_TD, "c", "head-ltitle"); 49161d06d6bSBaptiste Daroussin print_text(h, title); 49261d06d6bSBaptiste Daroussin print_stagq(h, tt); 49361d06d6bSBaptiste Daroussin 49461d06d6bSBaptiste Daroussin print_otag(h, TAG_TD, "c", "head-vol"); 49561d06d6bSBaptiste Daroussin print_text(h, volume); 49661d06d6bSBaptiste Daroussin print_stagq(h, tt); 49761d06d6bSBaptiste Daroussin 49861d06d6bSBaptiste Daroussin print_otag(h, TAG_TD, "c", "head-rtitle"); 49961d06d6bSBaptiste Daroussin print_text(h, title); 50061d06d6bSBaptiste Daroussin print_tagq(h, t); 50161d06d6bSBaptiste Daroussin 50261d06d6bSBaptiste Daroussin free(title); 50361d06d6bSBaptiste Daroussin free(volume); 50461d06d6bSBaptiste Daroussin return 1; 50561d06d6bSBaptiste Daroussin } 50661d06d6bSBaptiste Daroussin 507*6d38604fSBaptiste Daroussin static int 508*6d38604fSBaptiste Daroussin mdoc_code_pre(MDOC_ARGS) 50961d06d6bSBaptiste Daroussin { 510*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_CODE, roff_name[n->tok], n); 511*6d38604fSBaptiste Daroussin return 1; 51261d06d6bSBaptiste Daroussin } 51361d06d6bSBaptiste Daroussin 51461d06d6bSBaptiste Daroussin static int 51561d06d6bSBaptiste Daroussin mdoc_sh_pre(MDOC_ARGS) 51661d06d6bSBaptiste Daroussin { 5177295610fSBaptiste Daroussin struct roff_node *sn, *subn; 5187295610fSBaptiste Daroussin struct tag *t, *tsec, *tsub; 51961d06d6bSBaptiste Daroussin char *id; 5207295610fSBaptiste Daroussin int sc; 52161d06d6bSBaptiste Daroussin 52261d06d6bSBaptiste Daroussin switch (n->type) { 5237295610fSBaptiste Daroussin case ROFFT_BLOCK: 5247295610fSBaptiste Daroussin html_close_paragraph(h); 5257295610fSBaptiste Daroussin if ((h->oflags & HTML_TOC) == 0 || 5267295610fSBaptiste Daroussin h->flags & HTML_TOCDONE || 5277295610fSBaptiste Daroussin n->sec <= SEC_SYNOPSIS) { 5287295610fSBaptiste Daroussin print_otag(h, TAG_SECTION, "c", "Sh"); 5297295610fSBaptiste Daroussin break; 5307295610fSBaptiste Daroussin } 5317295610fSBaptiste Daroussin h->flags |= HTML_TOCDONE; 5327295610fSBaptiste Daroussin sc = 0; 5337295610fSBaptiste Daroussin for (sn = n->next; sn != NULL; sn = sn->next) 5347295610fSBaptiste Daroussin if (sn->sec == SEC_CUSTOM) 5357295610fSBaptiste Daroussin if (++sc == 2) 5367295610fSBaptiste Daroussin break; 5377295610fSBaptiste Daroussin if (sc < 2) 5387295610fSBaptiste Daroussin break; 5397295610fSBaptiste Daroussin t = print_otag(h, TAG_H1, "c", "Sh"); 5407295610fSBaptiste Daroussin print_text(h, "TABLE OF CONTENTS"); 5417295610fSBaptiste Daroussin print_tagq(h, t); 5427295610fSBaptiste Daroussin t = print_otag(h, TAG_UL, "c", "Bl-compact"); 5437295610fSBaptiste Daroussin for (sn = n; sn != NULL; sn = sn->next) { 5447295610fSBaptiste Daroussin tsec = print_otag(h, TAG_LI, ""); 5457295610fSBaptiste Daroussin id = html_make_id(sn->head, 0); 5467295610fSBaptiste Daroussin tsub = print_otag(h, TAG_A, "hR", id); 5477295610fSBaptiste Daroussin free(id); 5487295610fSBaptiste Daroussin print_mdoc_nodelist(meta, sn->head->child, h); 5497295610fSBaptiste Daroussin print_tagq(h, tsub); 5507295610fSBaptiste Daroussin tsub = NULL; 5517295610fSBaptiste Daroussin for (subn = sn->body->child; subn != NULL; 5527295610fSBaptiste Daroussin subn = subn->next) { 5537295610fSBaptiste Daroussin if (subn->tok != MDOC_Ss) 5547295610fSBaptiste Daroussin continue; 5557295610fSBaptiste Daroussin id = html_make_id(subn->head, 0); 5567295610fSBaptiste Daroussin if (id == NULL) 5577295610fSBaptiste Daroussin continue; 5587295610fSBaptiste Daroussin if (tsub == NULL) 5597295610fSBaptiste Daroussin print_otag(h, TAG_UL, 5607295610fSBaptiste Daroussin "c", "Bl-compact"); 5617295610fSBaptiste Daroussin tsub = print_otag(h, TAG_LI, ""); 5627295610fSBaptiste Daroussin print_otag(h, TAG_A, "hR", id); 5637295610fSBaptiste Daroussin free(id); 5647295610fSBaptiste Daroussin print_mdoc_nodelist(meta, 5657295610fSBaptiste Daroussin subn->head->child, h); 5667295610fSBaptiste Daroussin print_tagq(h, tsub); 5677295610fSBaptiste Daroussin } 5687295610fSBaptiste Daroussin print_tagq(h, tsec); 5697295610fSBaptiste Daroussin } 5707295610fSBaptiste Daroussin print_tagq(h, t); 5717295610fSBaptiste Daroussin print_otag(h, TAG_SECTION, "c", "Sh"); 5727295610fSBaptiste Daroussin break; 57361d06d6bSBaptiste Daroussin case ROFFT_HEAD: 574*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_H1, "Sh", n); 57561d06d6bSBaptiste Daroussin break; 57661d06d6bSBaptiste Daroussin case ROFFT_BODY: 57761d06d6bSBaptiste Daroussin if (n->sec == SEC_AUTHORS) 57861d06d6bSBaptiste Daroussin h->flags &= ~(HTML_SPLIT|HTML_NOSPLIT); 57961d06d6bSBaptiste Daroussin break; 58061d06d6bSBaptiste Daroussin default: 58161d06d6bSBaptiste Daroussin break; 58261d06d6bSBaptiste Daroussin } 58361d06d6bSBaptiste Daroussin return 1; 58461d06d6bSBaptiste Daroussin } 58561d06d6bSBaptiste Daroussin 58661d06d6bSBaptiste Daroussin static int 58761d06d6bSBaptiste Daroussin mdoc_ss_pre(MDOC_ARGS) 58861d06d6bSBaptiste Daroussin { 5897295610fSBaptiste Daroussin switch (n->type) { 5907295610fSBaptiste Daroussin case ROFFT_BLOCK: 5917295610fSBaptiste Daroussin html_close_paragraph(h); 5927295610fSBaptiste Daroussin print_otag(h, TAG_SECTION, "c", "Ss"); 593*6d38604fSBaptiste Daroussin break; 5947295610fSBaptiste Daroussin case ROFFT_HEAD: 595*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_H2, "Ss", n); 5967295610fSBaptiste Daroussin break; 5977295610fSBaptiste Daroussin case ROFFT_BODY: 598*6d38604fSBaptiste Daroussin break; 5997295610fSBaptiste Daroussin default: 6007295610fSBaptiste Daroussin abort(); 6017295610fSBaptiste Daroussin } 60261d06d6bSBaptiste Daroussin return 1; 60361d06d6bSBaptiste Daroussin } 60461d06d6bSBaptiste Daroussin 60561d06d6bSBaptiste Daroussin static int 60661d06d6bSBaptiste Daroussin mdoc_fl_pre(MDOC_ARGS) 60761d06d6bSBaptiste Daroussin { 608*6d38604fSBaptiste Daroussin struct roff_node *nn; 60961d06d6bSBaptiste Daroussin 610*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_CODE, "Fl", n); 61161d06d6bSBaptiste Daroussin print_text(h, "\\-"); 612*6d38604fSBaptiste Daroussin if (n->child != NULL || 613*6d38604fSBaptiste Daroussin ((nn = roff_node_next(n)) != NULL && 614*6d38604fSBaptiste Daroussin nn->type != ROFFT_TEXT && 615*6d38604fSBaptiste Daroussin (nn->flags & NODE_LINE) == 0)) 61661d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 61761d06d6bSBaptiste Daroussin 61861d06d6bSBaptiste Daroussin return 1; 61961d06d6bSBaptiste Daroussin } 62061d06d6bSBaptiste Daroussin 62161d06d6bSBaptiste Daroussin static int 62261d06d6bSBaptiste Daroussin mdoc_nd_pre(MDOC_ARGS) 62361d06d6bSBaptiste Daroussin { 6247295610fSBaptiste Daroussin switch (n->type) { 6257295610fSBaptiste Daroussin case ROFFT_BLOCK: 62661d06d6bSBaptiste Daroussin return 1; 6277295610fSBaptiste Daroussin case ROFFT_HEAD: 6287295610fSBaptiste Daroussin return 0; 6297295610fSBaptiste Daroussin case ROFFT_BODY: 6307295610fSBaptiste Daroussin break; 6317295610fSBaptiste Daroussin default: 6327295610fSBaptiste Daroussin abort(); 6337295610fSBaptiste Daroussin } 63461d06d6bSBaptiste Daroussin print_text(h, "\\(em"); 635*6d38604fSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "Nd"); 63661d06d6bSBaptiste Daroussin return 1; 63761d06d6bSBaptiste Daroussin } 63861d06d6bSBaptiste Daroussin 63961d06d6bSBaptiste Daroussin static int 64061d06d6bSBaptiste Daroussin mdoc_nm_pre(MDOC_ARGS) 64161d06d6bSBaptiste Daroussin { 64261d06d6bSBaptiste Daroussin switch (n->type) { 6437295610fSBaptiste Daroussin case ROFFT_BLOCK: 6447295610fSBaptiste Daroussin break; 64561d06d6bSBaptiste Daroussin case ROFFT_HEAD: 64661d06d6bSBaptiste Daroussin print_otag(h, TAG_TD, ""); 64761d06d6bSBaptiste Daroussin /* FALLTHROUGH */ 64861d06d6bSBaptiste Daroussin case ROFFT_ELEM: 6497295610fSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "Nm"); 65061d06d6bSBaptiste Daroussin return 1; 65161d06d6bSBaptiste Daroussin case ROFFT_BODY: 65261d06d6bSBaptiste Daroussin print_otag(h, TAG_TD, ""); 65361d06d6bSBaptiste Daroussin return 1; 65461d06d6bSBaptiste Daroussin default: 6557295610fSBaptiste Daroussin abort(); 65661d06d6bSBaptiste Daroussin } 6577295610fSBaptiste Daroussin html_close_paragraph(h); 65861d06d6bSBaptiste Daroussin synopsis_pre(h, n); 65961d06d6bSBaptiste Daroussin print_otag(h, TAG_TABLE, "c", "Nm"); 66061d06d6bSBaptiste Daroussin print_otag(h, TAG_TR, ""); 66161d06d6bSBaptiste Daroussin return 1; 66261d06d6bSBaptiste Daroussin } 66361d06d6bSBaptiste Daroussin 66461d06d6bSBaptiste Daroussin static int 66561d06d6bSBaptiste Daroussin mdoc_xr_pre(MDOC_ARGS) 66661d06d6bSBaptiste Daroussin { 66761d06d6bSBaptiste Daroussin if (NULL == n->child) 66861d06d6bSBaptiste Daroussin return 0; 66961d06d6bSBaptiste Daroussin 6707295610fSBaptiste Daroussin if (h->base_man1) 6717295610fSBaptiste Daroussin print_otag(h, TAG_A, "chM", "Xr", 67261d06d6bSBaptiste Daroussin n->child->string, n->child->next == NULL ? 67361d06d6bSBaptiste Daroussin NULL : n->child->next->string); 67461d06d6bSBaptiste Daroussin else 6757295610fSBaptiste Daroussin print_otag(h, TAG_A, "c", "Xr"); 67661d06d6bSBaptiste Daroussin 67761d06d6bSBaptiste Daroussin n = n->child; 67861d06d6bSBaptiste Daroussin print_text(h, n->string); 67961d06d6bSBaptiste Daroussin 68061d06d6bSBaptiste Daroussin if (NULL == (n = n->next)) 68161d06d6bSBaptiste Daroussin return 0; 68261d06d6bSBaptiste Daroussin 68361d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 68461d06d6bSBaptiste Daroussin print_text(h, "("); 68561d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 68661d06d6bSBaptiste Daroussin print_text(h, n->string); 68761d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 68861d06d6bSBaptiste Daroussin print_text(h, ")"); 68961d06d6bSBaptiste Daroussin return 0; 69061d06d6bSBaptiste Daroussin } 69161d06d6bSBaptiste Daroussin 69261d06d6bSBaptiste Daroussin static int 693*6d38604fSBaptiste Daroussin mdoc_tg_pre(MDOC_ARGS) 694*6d38604fSBaptiste Daroussin { 695*6d38604fSBaptiste Daroussin char *id; 696*6d38604fSBaptiste Daroussin 697*6d38604fSBaptiste Daroussin if ((id = html_make_id(n, 1)) != NULL) { 698*6d38604fSBaptiste Daroussin print_tagq(h, print_otag(h, TAG_MARK, "i", id)); 699*6d38604fSBaptiste Daroussin free(id); 700*6d38604fSBaptiste Daroussin } 701*6d38604fSBaptiste Daroussin return 0; 702*6d38604fSBaptiste Daroussin } 703*6d38604fSBaptiste Daroussin 704*6d38604fSBaptiste Daroussin static int 70561d06d6bSBaptiste Daroussin mdoc_ns_pre(MDOC_ARGS) 70661d06d6bSBaptiste Daroussin { 70761d06d6bSBaptiste Daroussin 70861d06d6bSBaptiste Daroussin if ( ! (NODE_LINE & n->flags)) 70961d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 71061d06d6bSBaptiste Daroussin return 1; 71161d06d6bSBaptiste Daroussin } 71261d06d6bSBaptiste Daroussin 71361d06d6bSBaptiste Daroussin static int 71461d06d6bSBaptiste Daroussin mdoc_ar_pre(MDOC_ARGS) 71561d06d6bSBaptiste Daroussin { 7167295610fSBaptiste Daroussin print_otag(h, TAG_VAR, "c", "Ar"); 71761d06d6bSBaptiste Daroussin return 1; 71861d06d6bSBaptiste Daroussin } 71961d06d6bSBaptiste Daroussin 72061d06d6bSBaptiste Daroussin static int 72161d06d6bSBaptiste Daroussin mdoc_xx_pre(MDOC_ARGS) 72261d06d6bSBaptiste Daroussin { 72361d06d6bSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "Ux"); 72461d06d6bSBaptiste Daroussin return 1; 72561d06d6bSBaptiste Daroussin } 72661d06d6bSBaptiste Daroussin 72761d06d6bSBaptiste Daroussin static int 72861d06d6bSBaptiste Daroussin mdoc_it_pre(MDOC_ARGS) 72961d06d6bSBaptiste Daroussin { 73061d06d6bSBaptiste Daroussin const struct roff_node *bl; 73161d06d6bSBaptiste Daroussin enum mdoc_list type; 73261d06d6bSBaptiste Daroussin 73361d06d6bSBaptiste Daroussin bl = n->parent; 73461d06d6bSBaptiste Daroussin while (bl->tok != MDOC_Bl) 73561d06d6bSBaptiste Daroussin bl = bl->parent; 73661d06d6bSBaptiste Daroussin type = bl->norm->Bl.type; 73761d06d6bSBaptiste Daroussin 73861d06d6bSBaptiste Daroussin switch (type) { 73961d06d6bSBaptiste Daroussin case LIST_bullet: 74061d06d6bSBaptiste Daroussin case LIST_dash: 74161d06d6bSBaptiste Daroussin case LIST_hyphen: 74261d06d6bSBaptiste Daroussin case LIST_item: 74361d06d6bSBaptiste Daroussin case LIST_enum: 74461d06d6bSBaptiste Daroussin switch (n->type) { 74561d06d6bSBaptiste Daroussin case ROFFT_HEAD: 74661d06d6bSBaptiste Daroussin return 0; 74761d06d6bSBaptiste Daroussin case ROFFT_BODY: 748*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_LI, NULL, n); 74961d06d6bSBaptiste Daroussin break; 75061d06d6bSBaptiste Daroussin default: 75161d06d6bSBaptiste Daroussin break; 75261d06d6bSBaptiste Daroussin } 75361d06d6bSBaptiste Daroussin break; 75461d06d6bSBaptiste Daroussin case LIST_diag: 75561d06d6bSBaptiste Daroussin case LIST_hang: 75661d06d6bSBaptiste Daroussin case LIST_inset: 75761d06d6bSBaptiste Daroussin case LIST_ohang: 75861d06d6bSBaptiste Daroussin switch (n->type) { 75961d06d6bSBaptiste Daroussin case ROFFT_HEAD: 760*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_DT, NULL, n); 76161d06d6bSBaptiste Daroussin break; 76261d06d6bSBaptiste Daroussin case ROFFT_BODY: 76361d06d6bSBaptiste Daroussin print_otag(h, TAG_DD, ""); 76461d06d6bSBaptiste Daroussin break; 76561d06d6bSBaptiste Daroussin default: 76661d06d6bSBaptiste Daroussin break; 76761d06d6bSBaptiste Daroussin } 76861d06d6bSBaptiste Daroussin break; 76961d06d6bSBaptiste Daroussin case LIST_tag: 77061d06d6bSBaptiste Daroussin switch (n->type) { 77161d06d6bSBaptiste Daroussin case ROFFT_HEAD: 772*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_DT, NULL, n); 77361d06d6bSBaptiste Daroussin break; 77461d06d6bSBaptiste Daroussin case ROFFT_BODY: 77561d06d6bSBaptiste Daroussin if (n->child == NULL) { 77661d06d6bSBaptiste Daroussin print_otag(h, TAG_DD, "s", "width", "auto"); 77761d06d6bSBaptiste Daroussin print_text(h, "\\ "); 77861d06d6bSBaptiste Daroussin } else 77961d06d6bSBaptiste Daroussin print_otag(h, TAG_DD, ""); 78061d06d6bSBaptiste Daroussin break; 78161d06d6bSBaptiste Daroussin default: 78261d06d6bSBaptiste Daroussin break; 78361d06d6bSBaptiste Daroussin } 78461d06d6bSBaptiste Daroussin break; 78561d06d6bSBaptiste Daroussin case LIST_column: 78661d06d6bSBaptiste Daroussin switch (n->type) { 78761d06d6bSBaptiste Daroussin case ROFFT_HEAD: 78861d06d6bSBaptiste Daroussin break; 78961d06d6bSBaptiste Daroussin case ROFFT_BODY: 79061d06d6bSBaptiste Daroussin print_otag(h, TAG_TD, ""); 79161d06d6bSBaptiste Daroussin break; 79261d06d6bSBaptiste Daroussin default: 793*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_TR, NULL, n); 79461d06d6bSBaptiste Daroussin } 79561d06d6bSBaptiste Daroussin default: 79661d06d6bSBaptiste Daroussin break; 79761d06d6bSBaptiste Daroussin } 79861d06d6bSBaptiste Daroussin 79961d06d6bSBaptiste Daroussin return 1; 80061d06d6bSBaptiste Daroussin } 80161d06d6bSBaptiste Daroussin 80261d06d6bSBaptiste Daroussin static int 80361d06d6bSBaptiste Daroussin mdoc_bl_pre(MDOC_ARGS) 80461d06d6bSBaptiste Daroussin { 8057295610fSBaptiste Daroussin char cattr[32]; 80661d06d6bSBaptiste Daroussin struct mdoc_bl *bl; 80761d06d6bSBaptiste Daroussin enum htmltag elemtype; 80861d06d6bSBaptiste Daroussin 80961d06d6bSBaptiste Daroussin switch (n->type) { 8107295610fSBaptiste Daroussin case ROFFT_BLOCK: 8117295610fSBaptiste Daroussin html_close_paragraph(h); 8127295610fSBaptiste Daroussin break; 81361d06d6bSBaptiste Daroussin case ROFFT_HEAD: 81461d06d6bSBaptiste Daroussin return 0; 8157295610fSBaptiste Daroussin case ROFFT_BODY: 8167295610fSBaptiste Daroussin return 1; 81761d06d6bSBaptiste Daroussin default: 8187295610fSBaptiste Daroussin abort(); 81961d06d6bSBaptiste Daroussin } 82061d06d6bSBaptiste Daroussin 82161d06d6bSBaptiste Daroussin bl = &n->norm->Bl; 82261d06d6bSBaptiste Daroussin switch (bl->type) { 82361d06d6bSBaptiste Daroussin case LIST_bullet: 82461d06d6bSBaptiste Daroussin elemtype = TAG_UL; 82561d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-bullet", sizeof(cattr)); 82661d06d6bSBaptiste Daroussin break; 82761d06d6bSBaptiste Daroussin case LIST_dash: 82861d06d6bSBaptiste Daroussin case LIST_hyphen: 82961d06d6bSBaptiste Daroussin elemtype = TAG_UL; 83061d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-dash", sizeof(cattr)); 83161d06d6bSBaptiste Daroussin break; 83261d06d6bSBaptiste Daroussin case LIST_item: 83361d06d6bSBaptiste Daroussin elemtype = TAG_UL; 83461d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-item", sizeof(cattr)); 83561d06d6bSBaptiste Daroussin break; 83661d06d6bSBaptiste Daroussin case LIST_enum: 83761d06d6bSBaptiste Daroussin elemtype = TAG_OL; 83861d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-enum", sizeof(cattr)); 83961d06d6bSBaptiste Daroussin break; 84061d06d6bSBaptiste Daroussin case LIST_diag: 84161d06d6bSBaptiste Daroussin elemtype = TAG_DL; 84261d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-diag", sizeof(cattr)); 84361d06d6bSBaptiste Daroussin break; 84461d06d6bSBaptiste Daroussin case LIST_hang: 84561d06d6bSBaptiste Daroussin elemtype = TAG_DL; 84661d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-hang", sizeof(cattr)); 84761d06d6bSBaptiste Daroussin break; 84861d06d6bSBaptiste Daroussin case LIST_inset: 84961d06d6bSBaptiste Daroussin elemtype = TAG_DL; 85061d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-inset", sizeof(cattr)); 85161d06d6bSBaptiste Daroussin break; 85261d06d6bSBaptiste Daroussin case LIST_ohang: 85361d06d6bSBaptiste Daroussin elemtype = TAG_DL; 85461d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-ohang", sizeof(cattr)); 85561d06d6bSBaptiste Daroussin break; 85661d06d6bSBaptiste Daroussin case LIST_tag: 85761d06d6bSBaptiste Daroussin if (bl->offs) 85861d06d6bSBaptiste Daroussin print_otag(h, TAG_DIV, "c", "Bd-indent"); 859*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_DL, 860*6d38604fSBaptiste Daroussin bl->comp ? "Bl-tag Bl-compact" : "Bl-tag", n->body); 86161d06d6bSBaptiste Daroussin return 1; 86261d06d6bSBaptiste Daroussin case LIST_column: 86361d06d6bSBaptiste Daroussin elemtype = TAG_TABLE; 86461d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-column", sizeof(cattr)); 86561d06d6bSBaptiste Daroussin break; 86661d06d6bSBaptiste Daroussin default: 86761d06d6bSBaptiste Daroussin abort(); 86861d06d6bSBaptiste Daroussin } 86961d06d6bSBaptiste Daroussin if (bl->offs != NULL) 87061d06d6bSBaptiste Daroussin (void)strlcat(cattr, " Bd-indent", sizeof(cattr)); 87161d06d6bSBaptiste Daroussin if (bl->comp) 87261d06d6bSBaptiste Daroussin (void)strlcat(cattr, " Bl-compact", sizeof(cattr)); 873*6d38604fSBaptiste Daroussin print_otag_id(h, elemtype, cattr, n->body); 87461d06d6bSBaptiste Daroussin return 1; 87561d06d6bSBaptiste Daroussin } 87661d06d6bSBaptiste Daroussin 87761d06d6bSBaptiste Daroussin static int 87861d06d6bSBaptiste Daroussin mdoc_ex_pre(MDOC_ARGS) 87961d06d6bSBaptiste Daroussin { 880*6d38604fSBaptiste Daroussin if (roff_node_prev(n) != NULL) 88161d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 88261d06d6bSBaptiste Daroussin return 1; 88361d06d6bSBaptiste Daroussin } 88461d06d6bSBaptiste Daroussin 88561d06d6bSBaptiste Daroussin static int 88661d06d6bSBaptiste Daroussin mdoc_st_pre(MDOC_ARGS) 88761d06d6bSBaptiste Daroussin { 8887295610fSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "St"); 88961d06d6bSBaptiste Daroussin return 1; 89061d06d6bSBaptiste Daroussin } 89161d06d6bSBaptiste Daroussin 89261d06d6bSBaptiste Daroussin static int 89361d06d6bSBaptiste Daroussin mdoc_em_pre(MDOC_ARGS) 89461d06d6bSBaptiste Daroussin { 895*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_I, "Em", n); 89661d06d6bSBaptiste Daroussin return 1; 89761d06d6bSBaptiste Daroussin } 89861d06d6bSBaptiste Daroussin 89961d06d6bSBaptiste Daroussin static int 90061d06d6bSBaptiste Daroussin mdoc_d1_pre(MDOC_ARGS) 90161d06d6bSBaptiste Daroussin { 9027295610fSBaptiste Daroussin switch (n->type) { 9037295610fSBaptiste Daroussin case ROFFT_BLOCK: 9047295610fSBaptiste Daroussin html_close_paragraph(h); 905*6d38604fSBaptiste Daroussin return 1; 9067295610fSBaptiste Daroussin case ROFFT_HEAD: 9077295610fSBaptiste Daroussin return 0; 9087295610fSBaptiste Daroussin case ROFFT_BODY: 909*6d38604fSBaptiste Daroussin break; 9107295610fSBaptiste Daroussin default: 9117295610fSBaptiste Daroussin abort(); 9127295610fSBaptiste Daroussin } 913*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_DIV, "Bd Bd-indent", n); 91461d06d6bSBaptiste Daroussin if (n->tok == MDOC_Dl) 91561d06d6bSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "Li"); 91661d06d6bSBaptiste Daroussin return 1; 91761d06d6bSBaptiste Daroussin } 91861d06d6bSBaptiste Daroussin 91961d06d6bSBaptiste Daroussin static int 92061d06d6bSBaptiste Daroussin mdoc_sx_pre(MDOC_ARGS) 92161d06d6bSBaptiste Daroussin { 92261d06d6bSBaptiste Daroussin char *id; 92361d06d6bSBaptiste Daroussin 92461d06d6bSBaptiste Daroussin id = html_make_id(n, 0); 9257295610fSBaptiste Daroussin print_otag(h, TAG_A, "chR", "Sx", id); 92661d06d6bSBaptiste Daroussin free(id); 92761d06d6bSBaptiste Daroussin return 1; 92861d06d6bSBaptiste Daroussin } 92961d06d6bSBaptiste Daroussin 93061d06d6bSBaptiste Daroussin static int 93161d06d6bSBaptiste Daroussin mdoc_bd_pre(MDOC_ARGS) 93261d06d6bSBaptiste Daroussin { 933*6d38604fSBaptiste Daroussin char buf[20]; 93461d06d6bSBaptiste Daroussin struct roff_node *nn; 9357295610fSBaptiste Daroussin int comp; 93661d06d6bSBaptiste Daroussin 9377295610fSBaptiste Daroussin switch (n->type) { 9387295610fSBaptiste Daroussin case ROFFT_BLOCK: 9397295610fSBaptiste Daroussin html_close_paragraph(h); 9407295610fSBaptiste Daroussin return 1; 9417295610fSBaptiste Daroussin case ROFFT_HEAD: 94261d06d6bSBaptiste Daroussin return 0; 9437295610fSBaptiste Daroussin case ROFFT_BODY: 9447295610fSBaptiste Daroussin break; 9457295610fSBaptiste Daroussin default: 9467295610fSBaptiste Daroussin abort(); 9477295610fSBaptiste Daroussin } 94861d06d6bSBaptiste Daroussin 9497295610fSBaptiste Daroussin /* Handle preceding whitespace. */ 9507295610fSBaptiste Daroussin 95161d06d6bSBaptiste Daroussin comp = n->norm->Bd.comp; 9527295610fSBaptiste Daroussin for (nn = n; nn != NULL && comp == 0; nn = nn->parent) { 95361d06d6bSBaptiste Daroussin if (nn->type != ROFFT_BLOCK) 95461d06d6bSBaptiste Daroussin continue; 9557295610fSBaptiste Daroussin if (nn->tok == MDOC_Sh || nn->tok == MDOC_Ss) 95661d06d6bSBaptiste Daroussin comp = 1; 957*6d38604fSBaptiste Daroussin if (roff_node_prev(nn) != NULL) 95861d06d6bSBaptiste Daroussin break; 95961d06d6bSBaptiste Daroussin } 9607295610fSBaptiste Daroussin (void)strlcpy(buf, "Bd", sizeof(buf)); 9617295610fSBaptiste Daroussin if (comp == 0) 9627295610fSBaptiste Daroussin (void)strlcat(buf, " Pp", sizeof(buf)); 96361d06d6bSBaptiste Daroussin 96461d06d6bSBaptiste Daroussin /* Handle the -offset argument. */ 96561d06d6bSBaptiste Daroussin 9667295610fSBaptiste Daroussin if (n->norm->Bd.offs != NULL && 9677295610fSBaptiste Daroussin strcmp(n->norm->Bd.offs, "left") != 0) 9687295610fSBaptiste Daroussin (void)strlcat(buf, " Bd-indent", sizeof(buf)); 96961d06d6bSBaptiste Daroussin 970*6d38604fSBaptiste Daroussin if (n->norm->Bd.type == DISP_literal) 971*6d38604fSBaptiste Daroussin (void)strlcat(buf, " Li", sizeof(buf)); 972*6d38604fSBaptiste Daroussin 973*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_DIV, buf, n); 97461d06d6bSBaptiste Daroussin return 1; 97561d06d6bSBaptiste Daroussin } 97661d06d6bSBaptiste Daroussin 97761d06d6bSBaptiste Daroussin static int 97861d06d6bSBaptiste Daroussin mdoc_pa_pre(MDOC_ARGS) 97961d06d6bSBaptiste Daroussin { 9807295610fSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "Pa"); 98161d06d6bSBaptiste Daroussin return 1; 98261d06d6bSBaptiste Daroussin } 98361d06d6bSBaptiste Daroussin 98461d06d6bSBaptiste Daroussin static int 98561d06d6bSBaptiste Daroussin mdoc_ad_pre(MDOC_ARGS) 98661d06d6bSBaptiste Daroussin { 98761d06d6bSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "Ad"); 98861d06d6bSBaptiste Daroussin return 1; 98961d06d6bSBaptiste Daroussin } 99061d06d6bSBaptiste Daroussin 99161d06d6bSBaptiste Daroussin static int 99261d06d6bSBaptiste Daroussin mdoc_an_pre(MDOC_ARGS) 99361d06d6bSBaptiste Daroussin { 99461d06d6bSBaptiste Daroussin if (n->norm->An.auth == AUTH_split) { 99561d06d6bSBaptiste Daroussin h->flags &= ~HTML_NOSPLIT; 99661d06d6bSBaptiste Daroussin h->flags |= HTML_SPLIT; 99761d06d6bSBaptiste Daroussin return 0; 99861d06d6bSBaptiste Daroussin } 99961d06d6bSBaptiste Daroussin if (n->norm->An.auth == AUTH_nosplit) { 100061d06d6bSBaptiste Daroussin h->flags &= ~HTML_SPLIT; 100161d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPLIT; 100261d06d6bSBaptiste Daroussin return 0; 100361d06d6bSBaptiste Daroussin } 100461d06d6bSBaptiste Daroussin 100561d06d6bSBaptiste Daroussin if (h->flags & HTML_SPLIT) 100661d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 100761d06d6bSBaptiste Daroussin 100861d06d6bSBaptiste Daroussin if (n->sec == SEC_AUTHORS && ! (h->flags & HTML_NOSPLIT)) 100961d06d6bSBaptiste Daroussin h->flags |= HTML_SPLIT; 101061d06d6bSBaptiste Daroussin 10117295610fSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "An"); 101261d06d6bSBaptiste Daroussin return 1; 101361d06d6bSBaptiste Daroussin } 101461d06d6bSBaptiste Daroussin 101561d06d6bSBaptiste Daroussin static int 101661d06d6bSBaptiste Daroussin mdoc_cd_pre(MDOC_ARGS) 101761d06d6bSBaptiste Daroussin { 101861d06d6bSBaptiste Daroussin synopsis_pre(h, n); 10197295610fSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "Cd"); 102061d06d6bSBaptiste Daroussin return 1; 102161d06d6bSBaptiste Daroussin } 102261d06d6bSBaptiste Daroussin 102361d06d6bSBaptiste Daroussin static int 102461d06d6bSBaptiste Daroussin mdoc_fa_pre(MDOC_ARGS) 102561d06d6bSBaptiste Daroussin { 102661d06d6bSBaptiste Daroussin const struct roff_node *nn; 102761d06d6bSBaptiste Daroussin struct tag *t; 102861d06d6bSBaptiste Daroussin 102961d06d6bSBaptiste Daroussin if (n->parent->tok != MDOC_Fo) { 10307295610fSBaptiste Daroussin print_otag(h, TAG_VAR, "c", "Fa"); 103161d06d6bSBaptiste Daroussin return 1; 103261d06d6bSBaptiste Daroussin } 1033*6d38604fSBaptiste Daroussin for (nn = n->child; nn != NULL; nn = nn->next) { 10347295610fSBaptiste Daroussin t = print_otag(h, TAG_VAR, "c", "Fa"); 103561d06d6bSBaptiste Daroussin print_text(h, nn->string); 103661d06d6bSBaptiste Daroussin print_tagq(h, t); 1037*6d38604fSBaptiste Daroussin if (nn->next != NULL) { 103861d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 103961d06d6bSBaptiste Daroussin print_text(h, ","); 104061d06d6bSBaptiste Daroussin } 104161d06d6bSBaptiste Daroussin } 1042*6d38604fSBaptiste Daroussin if (n->child != NULL && 1043*6d38604fSBaptiste Daroussin (nn = roff_node_next(n)) != NULL && 1044*6d38604fSBaptiste Daroussin nn->tok == MDOC_Fa) { 104561d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 104661d06d6bSBaptiste Daroussin print_text(h, ","); 104761d06d6bSBaptiste Daroussin } 104861d06d6bSBaptiste Daroussin return 0; 104961d06d6bSBaptiste Daroussin } 105061d06d6bSBaptiste Daroussin 105161d06d6bSBaptiste Daroussin static int 105261d06d6bSBaptiste Daroussin mdoc_fd_pre(MDOC_ARGS) 105361d06d6bSBaptiste Daroussin { 105461d06d6bSBaptiste Daroussin struct tag *t; 105561d06d6bSBaptiste Daroussin char *buf, *cp; 105661d06d6bSBaptiste Daroussin 105761d06d6bSBaptiste Daroussin synopsis_pre(h, n); 105861d06d6bSBaptiste Daroussin 105961d06d6bSBaptiste Daroussin if (NULL == (n = n->child)) 106061d06d6bSBaptiste Daroussin return 0; 106161d06d6bSBaptiste Daroussin 106261d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 106361d06d6bSBaptiste Daroussin 106461d06d6bSBaptiste Daroussin if (strcmp(n->string, "#include")) { 10657295610fSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "Fd"); 106661d06d6bSBaptiste Daroussin return 1; 106761d06d6bSBaptiste Daroussin } 106861d06d6bSBaptiste Daroussin 10697295610fSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "In"); 107061d06d6bSBaptiste Daroussin print_text(h, n->string); 107161d06d6bSBaptiste Daroussin 107261d06d6bSBaptiste Daroussin if (NULL != (n = n->next)) { 107361d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 107461d06d6bSBaptiste Daroussin 107561d06d6bSBaptiste Daroussin if (h->base_includes) { 107661d06d6bSBaptiste Daroussin cp = n->string; 107761d06d6bSBaptiste Daroussin if (*cp == '<' || *cp == '"') 107861d06d6bSBaptiste Daroussin cp++; 107961d06d6bSBaptiste Daroussin buf = mandoc_strdup(cp); 108061d06d6bSBaptiste Daroussin cp = strchr(buf, '\0') - 1; 108161d06d6bSBaptiste Daroussin if (cp >= buf && (*cp == '>' || *cp == '"')) 108261d06d6bSBaptiste Daroussin *cp = '\0'; 10837295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "chI", "In", buf); 108461d06d6bSBaptiste Daroussin free(buf); 108561d06d6bSBaptiste Daroussin } else 10867295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "c", "In"); 108761d06d6bSBaptiste Daroussin 108861d06d6bSBaptiste Daroussin print_text(h, n->string); 108961d06d6bSBaptiste Daroussin print_tagq(h, t); 109061d06d6bSBaptiste Daroussin 109161d06d6bSBaptiste Daroussin n = n->next; 109261d06d6bSBaptiste Daroussin } 109361d06d6bSBaptiste Daroussin 109461d06d6bSBaptiste Daroussin for ( ; n; n = n->next) { 109561d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 109661d06d6bSBaptiste Daroussin print_text(h, n->string); 109761d06d6bSBaptiste Daroussin } 109861d06d6bSBaptiste Daroussin 109961d06d6bSBaptiste Daroussin return 0; 110061d06d6bSBaptiste Daroussin } 110161d06d6bSBaptiste Daroussin 110261d06d6bSBaptiste Daroussin static int 110361d06d6bSBaptiste Daroussin mdoc_vt_pre(MDOC_ARGS) 110461d06d6bSBaptiste Daroussin { 110561d06d6bSBaptiste Daroussin if (n->type == ROFFT_BLOCK) { 110661d06d6bSBaptiste Daroussin synopsis_pre(h, n); 110761d06d6bSBaptiste Daroussin return 1; 110861d06d6bSBaptiste Daroussin } else if (n->type == ROFFT_ELEM) { 110961d06d6bSBaptiste Daroussin synopsis_pre(h, n); 111061d06d6bSBaptiste Daroussin } else if (n->type == ROFFT_HEAD) 111161d06d6bSBaptiste Daroussin return 0; 111261d06d6bSBaptiste Daroussin 11137295610fSBaptiste Daroussin print_otag(h, TAG_VAR, "c", "Vt"); 111461d06d6bSBaptiste Daroussin return 1; 111561d06d6bSBaptiste Daroussin } 111661d06d6bSBaptiste Daroussin 111761d06d6bSBaptiste Daroussin static int 111861d06d6bSBaptiste Daroussin mdoc_ft_pre(MDOC_ARGS) 111961d06d6bSBaptiste Daroussin { 112061d06d6bSBaptiste Daroussin synopsis_pre(h, n); 11217295610fSBaptiste Daroussin print_otag(h, TAG_VAR, "c", "Ft"); 112261d06d6bSBaptiste Daroussin return 1; 112361d06d6bSBaptiste Daroussin } 112461d06d6bSBaptiste Daroussin 112561d06d6bSBaptiste Daroussin static int 112661d06d6bSBaptiste Daroussin mdoc_fn_pre(MDOC_ARGS) 112761d06d6bSBaptiste Daroussin { 112861d06d6bSBaptiste Daroussin struct tag *t; 112961d06d6bSBaptiste Daroussin char nbuf[BUFSIZ]; 113061d06d6bSBaptiste Daroussin const char *sp, *ep; 113161d06d6bSBaptiste Daroussin int sz, pretty; 113261d06d6bSBaptiste Daroussin 113361d06d6bSBaptiste Daroussin pretty = NODE_SYNPRETTY & n->flags; 113461d06d6bSBaptiste Daroussin synopsis_pre(h, n); 113561d06d6bSBaptiste Daroussin 113661d06d6bSBaptiste Daroussin /* Split apart into type and name. */ 113761d06d6bSBaptiste Daroussin assert(n->child->string); 113861d06d6bSBaptiste Daroussin sp = n->child->string; 113961d06d6bSBaptiste Daroussin 114061d06d6bSBaptiste Daroussin ep = strchr(sp, ' '); 114161d06d6bSBaptiste Daroussin if (NULL != ep) { 11427295610fSBaptiste Daroussin t = print_otag(h, TAG_VAR, "c", "Ft"); 114361d06d6bSBaptiste Daroussin 114461d06d6bSBaptiste Daroussin while (ep) { 114561d06d6bSBaptiste Daroussin sz = MIN((int)(ep - sp), BUFSIZ - 1); 114661d06d6bSBaptiste Daroussin (void)memcpy(nbuf, sp, (size_t)sz); 114761d06d6bSBaptiste Daroussin nbuf[sz] = '\0'; 114861d06d6bSBaptiste Daroussin print_text(h, nbuf); 114961d06d6bSBaptiste Daroussin sp = ++ep; 115061d06d6bSBaptiste Daroussin ep = strchr(sp, ' '); 115161d06d6bSBaptiste Daroussin } 115261d06d6bSBaptiste Daroussin print_tagq(h, t); 115361d06d6bSBaptiste Daroussin } 115461d06d6bSBaptiste Daroussin 1155*6d38604fSBaptiste Daroussin t = print_otag_id(h, TAG_CODE, "Fn", n); 115661d06d6bSBaptiste Daroussin 115761d06d6bSBaptiste Daroussin if (sp) 115861d06d6bSBaptiste Daroussin print_text(h, sp); 115961d06d6bSBaptiste Daroussin 116061d06d6bSBaptiste Daroussin print_tagq(h, t); 116161d06d6bSBaptiste Daroussin 116261d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 116361d06d6bSBaptiste Daroussin print_text(h, "("); 116461d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 116561d06d6bSBaptiste Daroussin 116661d06d6bSBaptiste Daroussin for (n = n->child->next; n; n = n->next) { 116761d06d6bSBaptiste Daroussin if (NODE_SYNPRETTY & n->flags) 11687295610fSBaptiste Daroussin t = print_otag(h, TAG_VAR, "cs", "Fa", 116961d06d6bSBaptiste Daroussin "white-space", "nowrap"); 117061d06d6bSBaptiste Daroussin else 11717295610fSBaptiste Daroussin t = print_otag(h, TAG_VAR, "c", "Fa"); 117261d06d6bSBaptiste Daroussin print_text(h, n->string); 117361d06d6bSBaptiste Daroussin print_tagq(h, t); 117461d06d6bSBaptiste Daroussin if (n->next) { 117561d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 117661d06d6bSBaptiste Daroussin print_text(h, ","); 117761d06d6bSBaptiste Daroussin } 117861d06d6bSBaptiste Daroussin } 117961d06d6bSBaptiste Daroussin 118061d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 118161d06d6bSBaptiste Daroussin print_text(h, ")"); 118261d06d6bSBaptiste Daroussin 118361d06d6bSBaptiste Daroussin if (pretty) { 118461d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 118561d06d6bSBaptiste Daroussin print_text(h, ";"); 118661d06d6bSBaptiste Daroussin } 118761d06d6bSBaptiste Daroussin 118861d06d6bSBaptiste Daroussin return 0; 118961d06d6bSBaptiste Daroussin } 119061d06d6bSBaptiste Daroussin 119161d06d6bSBaptiste Daroussin static int 119261d06d6bSBaptiste Daroussin mdoc_sm_pre(MDOC_ARGS) 119361d06d6bSBaptiste Daroussin { 119461d06d6bSBaptiste Daroussin 119561d06d6bSBaptiste Daroussin if (NULL == n->child) 119661d06d6bSBaptiste Daroussin h->flags ^= HTML_NONOSPACE; 119761d06d6bSBaptiste Daroussin else if (0 == strcmp("on", n->child->string)) 119861d06d6bSBaptiste Daroussin h->flags &= ~HTML_NONOSPACE; 119961d06d6bSBaptiste Daroussin else 120061d06d6bSBaptiste Daroussin h->flags |= HTML_NONOSPACE; 120161d06d6bSBaptiste Daroussin 120261d06d6bSBaptiste Daroussin if ( ! (HTML_NONOSPACE & h->flags)) 120361d06d6bSBaptiste Daroussin h->flags &= ~HTML_NOSPACE; 120461d06d6bSBaptiste Daroussin 120561d06d6bSBaptiste Daroussin return 0; 120661d06d6bSBaptiste Daroussin } 120761d06d6bSBaptiste Daroussin 120861d06d6bSBaptiste Daroussin static int 120961d06d6bSBaptiste Daroussin mdoc_skip_pre(MDOC_ARGS) 121061d06d6bSBaptiste Daroussin { 121161d06d6bSBaptiste Daroussin 121261d06d6bSBaptiste Daroussin return 0; 121361d06d6bSBaptiste Daroussin } 121461d06d6bSBaptiste Daroussin 121561d06d6bSBaptiste Daroussin static int 121661d06d6bSBaptiste Daroussin mdoc_pp_pre(MDOC_ARGS) 121761d06d6bSBaptiste Daroussin { 1218*6d38604fSBaptiste Daroussin char *id; 1219*6d38604fSBaptiste Daroussin 1220*6d38604fSBaptiste Daroussin if (n->flags & NODE_NOFILL) { 1221*6d38604fSBaptiste Daroussin print_endline(h); 1222*6d38604fSBaptiste Daroussin if (n->flags & NODE_ID) 1223*6d38604fSBaptiste Daroussin mdoc_tg_pre(meta, n, h); 1224*6d38604fSBaptiste Daroussin else { 1225*6d38604fSBaptiste Daroussin h->col = 1; 1226*6d38604fSBaptiste Daroussin print_endline(h); 1227*6d38604fSBaptiste Daroussin } 1228*6d38604fSBaptiste Daroussin } else { 12297295610fSBaptiste Daroussin html_close_paragraph(h); 1230*6d38604fSBaptiste Daroussin id = n->flags & NODE_ID ? html_make_id(n, 1) : NULL; 1231*6d38604fSBaptiste Daroussin print_otag(h, TAG_P, "ci", "Pp", id); 1232*6d38604fSBaptiste Daroussin free(id); 12337295610fSBaptiste Daroussin } 123461d06d6bSBaptiste Daroussin return 0; 123561d06d6bSBaptiste Daroussin } 123661d06d6bSBaptiste Daroussin 123761d06d6bSBaptiste Daroussin static int 123861d06d6bSBaptiste Daroussin mdoc_lk_pre(MDOC_ARGS) 123961d06d6bSBaptiste Daroussin { 124061d06d6bSBaptiste Daroussin const struct roff_node *link, *descr, *punct; 124161d06d6bSBaptiste Daroussin struct tag *t; 124261d06d6bSBaptiste Daroussin 124361d06d6bSBaptiste Daroussin if ((link = n->child) == NULL) 124461d06d6bSBaptiste Daroussin return 0; 124561d06d6bSBaptiste Daroussin 124661d06d6bSBaptiste Daroussin /* Find beginning of trailing punctuation. */ 124761d06d6bSBaptiste Daroussin punct = n->last; 124861d06d6bSBaptiste Daroussin while (punct != link && punct->flags & NODE_DELIMC) 124961d06d6bSBaptiste Daroussin punct = punct->prev; 125061d06d6bSBaptiste Daroussin punct = punct->next; 125161d06d6bSBaptiste Daroussin 125261d06d6bSBaptiste Daroussin /* Link target and link text. */ 125361d06d6bSBaptiste Daroussin descr = link->next; 125461d06d6bSBaptiste Daroussin if (descr == punct) 125561d06d6bSBaptiste Daroussin descr = link; /* no text */ 12567295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "ch", "Lk", link->string); 125761d06d6bSBaptiste Daroussin do { 125861d06d6bSBaptiste Daroussin if (descr->flags & (NODE_DELIMC | NODE_DELIMO)) 125961d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 126061d06d6bSBaptiste Daroussin print_text(h, descr->string); 126161d06d6bSBaptiste Daroussin descr = descr->next; 126261d06d6bSBaptiste Daroussin } while (descr != punct); 126361d06d6bSBaptiste Daroussin print_tagq(h, t); 126461d06d6bSBaptiste Daroussin 126561d06d6bSBaptiste Daroussin /* Trailing punctuation. */ 126661d06d6bSBaptiste Daroussin while (punct != NULL) { 126761d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 126861d06d6bSBaptiste Daroussin print_text(h, punct->string); 126961d06d6bSBaptiste Daroussin punct = punct->next; 127061d06d6bSBaptiste Daroussin } 127161d06d6bSBaptiste Daroussin return 0; 127261d06d6bSBaptiste Daroussin } 127361d06d6bSBaptiste Daroussin 127461d06d6bSBaptiste Daroussin static int 127561d06d6bSBaptiste Daroussin mdoc_mt_pre(MDOC_ARGS) 127661d06d6bSBaptiste Daroussin { 127761d06d6bSBaptiste Daroussin struct tag *t; 127861d06d6bSBaptiste Daroussin char *cp; 127961d06d6bSBaptiste Daroussin 128061d06d6bSBaptiste Daroussin for (n = n->child; n; n = n->next) { 128161d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 128261d06d6bSBaptiste Daroussin mandoc_asprintf(&cp, "mailto:%s", n->string); 12837295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "ch", "Mt", cp); 128461d06d6bSBaptiste Daroussin print_text(h, n->string); 128561d06d6bSBaptiste Daroussin print_tagq(h, t); 128661d06d6bSBaptiste Daroussin free(cp); 128761d06d6bSBaptiste Daroussin } 128861d06d6bSBaptiste Daroussin return 0; 128961d06d6bSBaptiste Daroussin } 129061d06d6bSBaptiste Daroussin 129161d06d6bSBaptiste Daroussin static int 129261d06d6bSBaptiste Daroussin mdoc_fo_pre(MDOC_ARGS) 129361d06d6bSBaptiste Daroussin { 129461d06d6bSBaptiste Daroussin struct tag *t; 129561d06d6bSBaptiste Daroussin 1296*6d38604fSBaptiste Daroussin switch (n->type) { 1297*6d38604fSBaptiste Daroussin case ROFFT_BLOCK: 1298*6d38604fSBaptiste Daroussin synopsis_pre(h, n); 1299*6d38604fSBaptiste Daroussin return 1; 1300*6d38604fSBaptiste Daroussin case ROFFT_HEAD: 1301*6d38604fSBaptiste Daroussin if (n->child != NULL) { 1302*6d38604fSBaptiste Daroussin t = print_otag_id(h, TAG_CODE, "Fn", n); 1303*6d38604fSBaptiste Daroussin print_text(h, n->child->string); 1304*6d38604fSBaptiste Daroussin print_tagq(h, t); 1305*6d38604fSBaptiste Daroussin } 1306*6d38604fSBaptiste Daroussin return 0; 1307*6d38604fSBaptiste Daroussin case ROFFT_BODY: 130861d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 130961d06d6bSBaptiste Daroussin print_text(h, "("); 131061d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 131161d06d6bSBaptiste Daroussin return 1; 1312*6d38604fSBaptiste Daroussin default: 1313*6d38604fSBaptiste Daroussin abort(); 131461d06d6bSBaptiste Daroussin } 131561d06d6bSBaptiste Daroussin } 131661d06d6bSBaptiste Daroussin 131761d06d6bSBaptiste Daroussin static void 131861d06d6bSBaptiste Daroussin mdoc_fo_post(MDOC_ARGS) 131961d06d6bSBaptiste Daroussin { 132061d06d6bSBaptiste Daroussin if (n->type != ROFFT_BODY) 132161d06d6bSBaptiste Daroussin return; 132261d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 132361d06d6bSBaptiste Daroussin print_text(h, ")"); 132461d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 132561d06d6bSBaptiste Daroussin print_text(h, ";"); 132661d06d6bSBaptiste Daroussin } 132761d06d6bSBaptiste Daroussin 132861d06d6bSBaptiste Daroussin static int 132961d06d6bSBaptiste Daroussin mdoc_in_pre(MDOC_ARGS) 133061d06d6bSBaptiste Daroussin { 133161d06d6bSBaptiste Daroussin struct tag *t; 133261d06d6bSBaptiste Daroussin 133361d06d6bSBaptiste Daroussin synopsis_pre(h, n); 13347295610fSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "In"); 133561d06d6bSBaptiste Daroussin 133661d06d6bSBaptiste Daroussin /* 133761d06d6bSBaptiste Daroussin * The first argument of the `In' gets special treatment as 133861d06d6bSBaptiste Daroussin * being a linked value. Subsequent values are printed 133961d06d6bSBaptiste Daroussin * afterward. groff does similarly. This also handles the case 134061d06d6bSBaptiste Daroussin * of no children. 134161d06d6bSBaptiste Daroussin */ 134261d06d6bSBaptiste Daroussin 134361d06d6bSBaptiste Daroussin if (NODE_SYNPRETTY & n->flags && NODE_LINE & n->flags) 134461d06d6bSBaptiste Daroussin print_text(h, "#include"); 134561d06d6bSBaptiste Daroussin 134661d06d6bSBaptiste Daroussin print_text(h, "<"); 134761d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 134861d06d6bSBaptiste Daroussin 134961d06d6bSBaptiste Daroussin if (NULL != (n = n->child)) { 135061d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 135161d06d6bSBaptiste Daroussin 135261d06d6bSBaptiste Daroussin if (h->base_includes) 13537295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "chI", "In", n->string); 135461d06d6bSBaptiste Daroussin else 13557295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "c", "In"); 135661d06d6bSBaptiste Daroussin print_text(h, n->string); 135761d06d6bSBaptiste Daroussin print_tagq(h, t); 135861d06d6bSBaptiste Daroussin 135961d06d6bSBaptiste Daroussin n = n->next; 136061d06d6bSBaptiste Daroussin } 136161d06d6bSBaptiste Daroussin 136261d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 136361d06d6bSBaptiste Daroussin print_text(h, ">"); 136461d06d6bSBaptiste Daroussin 136561d06d6bSBaptiste Daroussin for ( ; n; n = n->next) { 136661d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 136761d06d6bSBaptiste Daroussin print_text(h, n->string); 136861d06d6bSBaptiste Daroussin } 136961d06d6bSBaptiste Daroussin return 0; 137061d06d6bSBaptiste Daroussin } 137161d06d6bSBaptiste Daroussin 137261d06d6bSBaptiste Daroussin static int 137361d06d6bSBaptiste Daroussin mdoc_va_pre(MDOC_ARGS) 137461d06d6bSBaptiste Daroussin { 13757295610fSBaptiste Daroussin print_otag(h, TAG_VAR, "c", "Va"); 137661d06d6bSBaptiste Daroussin return 1; 137761d06d6bSBaptiste Daroussin } 137861d06d6bSBaptiste Daroussin 137961d06d6bSBaptiste Daroussin static int 138061d06d6bSBaptiste Daroussin mdoc_ap_pre(MDOC_ARGS) 138161d06d6bSBaptiste Daroussin { 138261d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 138361d06d6bSBaptiste Daroussin print_text(h, "\\(aq"); 138461d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 138561d06d6bSBaptiste Daroussin return 1; 138661d06d6bSBaptiste Daroussin } 138761d06d6bSBaptiste Daroussin 138861d06d6bSBaptiste Daroussin static int 138961d06d6bSBaptiste Daroussin mdoc_bf_pre(MDOC_ARGS) 139061d06d6bSBaptiste Daroussin { 139161d06d6bSBaptiste Daroussin const char *cattr; 139261d06d6bSBaptiste Daroussin 13937295610fSBaptiste Daroussin switch (n->type) { 13947295610fSBaptiste Daroussin case ROFFT_BLOCK: 13957295610fSBaptiste Daroussin html_close_paragraph(h); 139661d06d6bSBaptiste Daroussin return 1; 13977295610fSBaptiste Daroussin case ROFFT_HEAD: 13987295610fSBaptiste Daroussin return 0; 13997295610fSBaptiste Daroussin case ROFFT_BODY: 14007295610fSBaptiste Daroussin break; 14017295610fSBaptiste Daroussin default: 14027295610fSBaptiste Daroussin abort(); 14037295610fSBaptiste Daroussin } 140461d06d6bSBaptiste Daroussin 140561d06d6bSBaptiste Daroussin if (FONT_Em == n->norm->Bf.font) 140661d06d6bSBaptiste Daroussin cattr = "Bf Em"; 140761d06d6bSBaptiste Daroussin else if (FONT_Sy == n->norm->Bf.font) 140861d06d6bSBaptiste Daroussin cattr = "Bf Sy"; 140961d06d6bSBaptiste Daroussin else if (FONT_Li == n->norm->Bf.font) 141061d06d6bSBaptiste Daroussin cattr = "Bf Li"; 141161d06d6bSBaptiste Daroussin else 141261d06d6bSBaptiste Daroussin cattr = "Bf No"; 141361d06d6bSBaptiste Daroussin 141461d06d6bSBaptiste Daroussin /* Cannot use TAG_SPAN because it may contain blocks. */ 141561d06d6bSBaptiste Daroussin print_otag(h, TAG_DIV, "c", cattr); 141661d06d6bSBaptiste Daroussin return 1; 141761d06d6bSBaptiste Daroussin } 141861d06d6bSBaptiste Daroussin 141961d06d6bSBaptiste Daroussin static int 142061d06d6bSBaptiste Daroussin mdoc_igndelim_pre(MDOC_ARGS) 142161d06d6bSBaptiste Daroussin { 142261d06d6bSBaptiste Daroussin h->flags |= HTML_IGNDELIM; 142361d06d6bSBaptiste Daroussin return 1; 142461d06d6bSBaptiste Daroussin } 142561d06d6bSBaptiste Daroussin 142661d06d6bSBaptiste Daroussin static void 142761d06d6bSBaptiste Daroussin mdoc_pf_post(MDOC_ARGS) 142861d06d6bSBaptiste Daroussin { 142961d06d6bSBaptiste Daroussin if ( ! (n->next == NULL || n->next->flags & NODE_LINE)) 143061d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 143161d06d6bSBaptiste Daroussin } 143261d06d6bSBaptiste Daroussin 143361d06d6bSBaptiste Daroussin static int 143461d06d6bSBaptiste Daroussin mdoc_rs_pre(MDOC_ARGS) 143561d06d6bSBaptiste Daroussin { 14367295610fSBaptiste Daroussin switch (n->type) { 14377295610fSBaptiste Daroussin case ROFFT_BLOCK: 14387295610fSBaptiste Daroussin if (n->sec == SEC_SEE_ALSO) 14397295610fSBaptiste Daroussin html_close_paragraph(h); 14407295610fSBaptiste Daroussin break; 14417295610fSBaptiste Daroussin case ROFFT_HEAD: 14427295610fSBaptiste Daroussin return 0; 14437295610fSBaptiste Daroussin case ROFFT_BODY: 14447295610fSBaptiste Daroussin if (n->sec == SEC_SEE_ALSO) 14457295610fSBaptiste Daroussin print_otag(h, TAG_P, "c", "Pp"); 14467295610fSBaptiste Daroussin print_otag(h, TAG_CITE, "c", "Rs"); 14477295610fSBaptiste Daroussin break; 14487295610fSBaptiste Daroussin default: 14497295610fSBaptiste Daroussin abort(); 14507295610fSBaptiste Daroussin } 145161d06d6bSBaptiste Daroussin return 1; 145261d06d6bSBaptiste Daroussin } 145361d06d6bSBaptiste Daroussin 145461d06d6bSBaptiste Daroussin static int 145561d06d6bSBaptiste Daroussin mdoc_no_pre(MDOC_ARGS) 145661d06d6bSBaptiste Daroussin { 1457*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_SPAN, roff_name[n->tok], n); 145861d06d6bSBaptiste Daroussin return 1; 145961d06d6bSBaptiste Daroussin } 146061d06d6bSBaptiste Daroussin 146161d06d6bSBaptiste Daroussin static int 146261d06d6bSBaptiste Daroussin mdoc_sy_pre(MDOC_ARGS) 146361d06d6bSBaptiste Daroussin { 1464*6d38604fSBaptiste Daroussin print_otag_id(h, TAG_B, "Sy", n); 146561d06d6bSBaptiste Daroussin return 1; 146661d06d6bSBaptiste Daroussin } 146761d06d6bSBaptiste Daroussin 146861d06d6bSBaptiste Daroussin static int 146961d06d6bSBaptiste Daroussin mdoc_lb_pre(MDOC_ARGS) 147061d06d6bSBaptiste Daroussin { 1471*6d38604fSBaptiste Daroussin if (n->sec == SEC_LIBRARY && 1472*6d38604fSBaptiste Daroussin n->flags & NODE_LINE && 1473*6d38604fSBaptiste Daroussin roff_node_prev(n) != NULL) 147461d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 147561d06d6bSBaptiste Daroussin 14767295610fSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "Lb"); 147761d06d6bSBaptiste Daroussin return 1; 147861d06d6bSBaptiste Daroussin } 147961d06d6bSBaptiste Daroussin 148061d06d6bSBaptiste Daroussin static int 148161d06d6bSBaptiste Daroussin mdoc__x_pre(MDOC_ARGS) 148261d06d6bSBaptiste Daroussin { 1483*6d38604fSBaptiste Daroussin struct roff_node *nn; 148461d06d6bSBaptiste Daroussin const char *cattr; 148561d06d6bSBaptiste Daroussin enum htmltag t; 148661d06d6bSBaptiste Daroussin 148761d06d6bSBaptiste Daroussin t = TAG_SPAN; 148861d06d6bSBaptiste Daroussin 148961d06d6bSBaptiste Daroussin switch (n->tok) { 149061d06d6bSBaptiste Daroussin case MDOC__A: 149161d06d6bSBaptiste Daroussin cattr = "RsA"; 1492*6d38604fSBaptiste Daroussin if ((nn = roff_node_prev(n)) != NULL && nn->tok == MDOC__A && 1493*6d38604fSBaptiste Daroussin ((nn = roff_node_next(n)) == NULL || nn->tok != MDOC__A)) 149461d06d6bSBaptiste Daroussin print_text(h, "and"); 149561d06d6bSBaptiste Daroussin break; 149661d06d6bSBaptiste Daroussin case MDOC__B: 149761d06d6bSBaptiste Daroussin t = TAG_I; 149861d06d6bSBaptiste Daroussin cattr = "RsB"; 149961d06d6bSBaptiste Daroussin break; 150061d06d6bSBaptiste Daroussin case MDOC__C: 150161d06d6bSBaptiste Daroussin cattr = "RsC"; 150261d06d6bSBaptiste Daroussin break; 150361d06d6bSBaptiste Daroussin case MDOC__D: 150461d06d6bSBaptiste Daroussin cattr = "RsD"; 150561d06d6bSBaptiste Daroussin break; 150661d06d6bSBaptiste Daroussin case MDOC__I: 150761d06d6bSBaptiste Daroussin t = TAG_I; 150861d06d6bSBaptiste Daroussin cattr = "RsI"; 150961d06d6bSBaptiste Daroussin break; 151061d06d6bSBaptiste Daroussin case MDOC__J: 151161d06d6bSBaptiste Daroussin t = TAG_I; 151261d06d6bSBaptiste Daroussin cattr = "RsJ"; 151361d06d6bSBaptiste Daroussin break; 151461d06d6bSBaptiste Daroussin case MDOC__N: 151561d06d6bSBaptiste Daroussin cattr = "RsN"; 151661d06d6bSBaptiste Daroussin break; 151761d06d6bSBaptiste Daroussin case MDOC__O: 151861d06d6bSBaptiste Daroussin cattr = "RsO"; 151961d06d6bSBaptiste Daroussin break; 152061d06d6bSBaptiste Daroussin case MDOC__P: 152161d06d6bSBaptiste Daroussin cattr = "RsP"; 152261d06d6bSBaptiste Daroussin break; 152361d06d6bSBaptiste Daroussin case MDOC__Q: 152461d06d6bSBaptiste Daroussin cattr = "RsQ"; 152561d06d6bSBaptiste Daroussin break; 152661d06d6bSBaptiste Daroussin case MDOC__R: 152761d06d6bSBaptiste Daroussin cattr = "RsR"; 152861d06d6bSBaptiste Daroussin break; 152961d06d6bSBaptiste Daroussin case MDOC__T: 153061d06d6bSBaptiste Daroussin cattr = "RsT"; 153161d06d6bSBaptiste Daroussin break; 153261d06d6bSBaptiste Daroussin case MDOC__U: 153361d06d6bSBaptiste Daroussin print_otag(h, TAG_A, "ch", "RsU", n->child->string); 153461d06d6bSBaptiste Daroussin return 1; 153561d06d6bSBaptiste Daroussin case MDOC__V: 153661d06d6bSBaptiste Daroussin cattr = "RsV"; 153761d06d6bSBaptiste Daroussin break; 153861d06d6bSBaptiste Daroussin default: 153961d06d6bSBaptiste Daroussin abort(); 154061d06d6bSBaptiste Daroussin } 154161d06d6bSBaptiste Daroussin 154261d06d6bSBaptiste Daroussin print_otag(h, t, "c", cattr); 154361d06d6bSBaptiste Daroussin return 1; 154461d06d6bSBaptiste Daroussin } 154561d06d6bSBaptiste Daroussin 154661d06d6bSBaptiste Daroussin static void 154761d06d6bSBaptiste Daroussin mdoc__x_post(MDOC_ARGS) 154861d06d6bSBaptiste Daroussin { 1549*6d38604fSBaptiste Daroussin struct roff_node *nn; 155061d06d6bSBaptiste Daroussin 1551*6d38604fSBaptiste Daroussin if (n->tok == MDOC__A && 1552*6d38604fSBaptiste Daroussin (nn = roff_node_next(n)) != NULL && nn->tok == MDOC__A && 1553*6d38604fSBaptiste Daroussin ((nn = roff_node_next(nn)) == NULL || nn->tok != MDOC__A) && 1554*6d38604fSBaptiste Daroussin ((nn = roff_node_prev(n)) == NULL || nn->tok != MDOC__A)) 155561d06d6bSBaptiste Daroussin return; 155661d06d6bSBaptiste Daroussin 155761d06d6bSBaptiste Daroussin /* TODO: %U */ 155861d06d6bSBaptiste Daroussin 1559*6d38604fSBaptiste Daroussin if (n->parent == NULL || n->parent->tok != MDOC_Rs) 156061d06d6bSBaptiste Daroussin return; 156161d06d6bSBaptiste Daroussin 156261d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 1563*6d38604fSBaptiste Daroussin print_text(h, roff_node_next(n) ? "," : "."); 156461d06d6bSBaptiste Daroussin } 156561d06d6bSBaptiste Daroussin 156661d06d6bSBaptiste Daroussin static int 156761d06d6bSBaptiste Daroussin mdoc_bk_pre(MDOC_ARGS) 156861d06d6bSBaptiste Daroussin { 156961d06d6bSBaptiste Daroussin 157061d06d6bSBaptiste Daroussin switch (n->type) { 157161d06d6bSBaptiste Daroussin case ROFFT_BLOCK: 157261d06d6bSBaptiste Daroussin break; 157361d06d6bSBaptiste Daroussin case ROFFT_HEAD: 157461d06d6bSBaptiste Daroussin return 0; 157561d06d6bSBaptiste Daroussin case ROFFT_BODY: 157661d06d6bSBaptiste Daroussin if (n->parent->args != NULL || n->prev->child == NULL) 157761d06d6bSBaptiste Daroussin h->flags |= HTML_PREKEEP; 157861d06d6bSBaptiste Daroussin break; 157961d06d6bSBaptiste Daroussin default: 158061d06d6bSBaptiste Daroussin abort(); 158161d06d6bSBaptiste Daroussin } 158261d06d6bSBaptiste Daroussin 158361d06d6bSBaptiste Daroussin return 1; 158461d06d6bSBaptiste Daroussin } 158561d06d6bSBaptiste Daroussin 158661d06d6bSBaptiste Daroussin static void 158761d06d6bSBaptiste Daroussin mdoc_bk_post(MDOC_ARGS) 158861d06d6bSBaptiste Daroussin { 158961d06d6bSBaptiste Daroussin 159061d06d6bSBaptiste Daroussin if (n->type == ROFFT_BODY) 159161d06d6bSBaptiste Daroussin h->flags &= ~(HTML_KEEP | HTML_PREKEEP); 159261d06d6bSBaptiste Daroussin } 159361d06d6bSBaptiste Daroussin 159461d06d6bSBaptiste Daroussin static int 159561d06d6bSBaptiste Daroussin mdoc_quote_pre(MDOC_ARGS) 159661d06d6bSBaptiste Daroussin { 159761d06d6bSBaptiste Daroussin if (n->type != ROFFT_BODY) 159861d06d6bSBaptiste Daroussin return 1; 159961d06d6bSBaptiste Daroussin 160061d06d6bSBaptiste Daroussin switch (n->tok) { 160161d06d6bSBaptiste Daroussin case MDOC_Ao: 160261d06d6bSBaptiste Daroussin case MDOC_Aq: 160361d06d6bSBaptiste Daroussin print_text(h, n->child != NULL && n->child->next == NULL && 160461d06d6bSBaptiste Daroussin n->child->tok == MDOC_Mt ? "<" : "\\(la"); 160561d06d6bSBaptiste Daroussin break; 160661d06d6bSBaptiste Daroussin case MDOC_Bro: 160761d06d6bSBaptiste Daroussin case MDOC_Brq: 160861d06d6bSBaptiste Daroussin print_text(h, "\\(lC"); 160961d06d6bSBaptiste Daroussin break; 161061d06d6bSBaptiste Daroussin case MDOC_Bo: 161161d06d6bSBaptiste Daroussin case MDOC_Bq: 161261d06d6bSBaptiste Daroussin print_text(h, "\\(lB"); 161361d06d6bSBaptiste Daroussin break; 161461d06d6bSBaptiste Daroussin case MDOC_Oo: 161561d06d6bSBaptiste Daroussin case MDOC_Op: 161661d06d6bSBaptiste Daroussin print_text(h, "\\(lB"); 16177295610fSBaptiste Daroussin /* 16187295610fSBaptiste Daroussin * Give up on semantic markup for now. 16197295610fSBaptiste Daroussin * We cannot use TAG_SPAN because .Oo may contain blocks. 1620*6d38604fSBaptiste Daroussin * We cannot use TAG_DIV because we might be in a 16217295610fSBaptiste Daroussin * phrasing context (like .Dl or .Pp); we cannot 16227295610fSBaptiste Daroussin * close out a .Pp at this point either because 16237295610fSBaptiste Daroussin * that would break the line. 16247295610fSBaptiste Daroussin */ 16257295610fSBaptiste Daroussin /* XXX print_otag(h, TAG_???, "c", "Op"); */ 162661d06d6bSBaptiste Daroussin break; 162761d06d6bSBaptiste Daroussin case MDOC_En: 162861d06d6bSBaptiste Daroussin if (NULL == n->norm->Es || 162961d06d6bSBaptiste Daroussin NULL == n->norm->Es->child) 163061d06d6bSBaptiste Daroussin return 1; 163161d06d6bSBaptiste Daroussin print_text(h, n->norm->Es->child->string); 163261d06d6bSBaptiste Daroussin break; 163361d06d6bSBaptiste Daroussin case MDOC_Do: 163461d06d6bSBaptiste Daroussin case MDOC_Dq: 1635*6d38604fSBaptiste Daroussin print_text(h, "\\(lq"); 1636*6d38604fSBaptiste Daroussin break; 163761d06d6bSBaptiste Daroussin case MDOC_Qo: 163861d06d6bSBaptiste Daroussin case MDOC_Qq: 1639*6d38604fSBaptiste Daroussin print_text(h, "\""); 164061d06d6bSBaptiste Daroussin break; 164161d06d6bSBaptiste Daroussin case MDOC_Po: 164261d06d6bSBaptiste Daroussin case MDOC_Pq: 164361d06d6bSBaptiste Daroussin print_text(h, "("); 164461d06d6bSBaptiste Daroussin break; 164561d06d6bSBaptiste Daroussin case MDOC_Ql: 164661d06d6bSBaptiste Daroussin print_text(h, "\\(oq"); 164761d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 164861d06d6bSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "Li"); 164961d06d6bSBaptiste Daroussin break; 165061d06d6bSBaptiste Daroussin case MDOC_So: 165161d06d6bSBaptiste Daroussin case MDOC_Sq: 165261d06d6bSBaptiste Daroussin print_text(h, "\\(oq"); 165361d06d6bSBaptiste Daroussin break; 165461d06d6bSBaptiste Daroussin default: 165561d06d6bSBaptiste Daroussin abort(); 165661d06d6bSBaptiste Daroussin } 165761d06d6bSBaptiste Daroussin 165861d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 165961d06d6bSBaptiste Daroussin return 1; 166061d06d6bSBaptiste Daroussin } 166161d06d6bSBaptiste Daroussin 166261d06d6bSBaptiste Daroussin static void 166361d06d6bSBaptiste Daroussin mdoc_quote_post(MDOC_ARGS) 166461d06d6bSBaptiste Daroussin { 166561d06d6bSBaptiste Daroussin 166661d06d6bSBaptiste Daroussin if (n->type != ROFFT_BODY && n->type != ROFFT_ELEM) 166761d06d6bSBaptiste Daroussin return; 166861d06d6bSBaptiste Daroussin 166961d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 167061d06d6bSBaptiste Daroussin 167161d06d6bSBaptiste Daroussin switch (n->tok) { 167261d06d6bSBaptiste Daroussin case MDOC_Ao: 167361d06d6bSBaptiste Daroussin case MDOC_Aq: 167461d06d6bSBaptiste Daroussin print_text(h, n->child != NULL && n->child->next == NULL && 167561d06d6bSBaptiste Daroussin n->child->tok == MDOC_Mt ? ">" : "\\(ra"); 167661d06d6bSBaptiste Daroussin break; 167761d06d6bSBaptiste Daroussin case MDOC_Bro: 167861d06d6bSBaptiste Daroussin case MDOC_Brq: 167961d06d6bSBaptiste Daroussin print_text(h, "\\(rC"); 168061d06d6bSBaptiste Daroussin break; 168161d06d6bSBaptiste Daroussin case MDOC_Oo: 168261d06d6bSBaptiste Daroussin case MDOC_Op: 168361d06d6bSBaptiste Daroussin case MDOC_Bo: 168461d06d6bSBaptiste Daroussin case MDOC_Bq: 168561d06d6bSBaptiste Daroussin print_text(h, "\\(rB"); 168661d06d6bSBaptiste Daroussin break; 168761d06d6bSBaptiste Daroussin case MDOC_En: 168861d06d6bSBaptiste Daroussin if (n->norm->Es == NULL || 168961d06d6bSBaptiste Daroussin n->norm->Es->child == NULL || 169061d06d6bSBaptiste Daroussin n->norm->Es->child->next == NULL) 169161d06d6bSBaptiste Daroussin h->flags &= ~HTML_NOSPACE; 169261d06d6bSBaptiste Daroussin else 169361d06d6bSBaptiste Daroussin print_text(h, n->norm->Es->child->next->string); 169461d06d6bSBaptiste Daroussin break; 169561d06d6bSBaptiste Daroussin case MDOC_Do: 169661d06d6bSBaptiste Daroussin case MDOC_Dq: 169761d06d6bSBaptiste Daroussin print_text(h, "\\(rq"); 169861d06d6bSBaptiste Daroussin break; 1699*6d38604fSBaptiste Daroussin case MDOC_Qo: 1700*6d38604fSBaptiste Daroussin case MDOC_Qq: 1701*6d38604fSBaptiste Daroussin print_text(h, "\""); 1702*6d38604fSBaptiste Daroussin break; 170361d06d6bSBaptiste Daroussin case MDOC_Po: 170461d06d6bSBaptiste Daroussin case MDOC_Pq: 170561d06d6bSBaptiste Daroussin print_text(h, ")"); 170661d06d6bSBaptiste Daroussin break; 170761d06d6bSBaptiste Daroussin case MDOC_Ql: 170861d06d6bSBaptiste Daroussin case MDOC_So: 170961d06d6bSBaptiste Daroussin case MDOC_Sq: 171061d06d6bSBaptiste Daroussin print_text(h, "\\(cq"); 171161d06d6bSBaptiste Daroussin break; 171261d06d6bSBaptiste Daroussin default: 171361d06d6bSBaptiste Daroussin abort(); 171461d06d6bSBaptiste Daroussin } 171561d06d6bSBaptiste Daroussin } 171661d06d6bSBaptiste Daroussin 171761d06d6bSBaptiste Daroussin static int 171861d06d6bSBaptiste Daroussin mdoc_eo_pre(MDOC_ARGS) 171961d06d6bSBaptiste Daroussin { 172061d06d6bSBaptiste Daroussin 172161d06d6bSBaptiste Daroussin if (n->type != ROFFT_BODY) 172261d06d6bSBaptiste Daroussin return 1; 172361d06d6bSBaptiste Daroussin 172461d06d6bSBaptiste Daroussin if (n->end == ENDBODY_NOT && 172561d06d6bSBaptiste Daroussin n->parent->head->child == NULL && 172661d06d6bSBaptiste Daroussin n->child != NULL && 172761d06d6bSBaptiste Daroussin n->child->end != ENDBODY_NOT) 172861d06d6bSBaptiste Daroussin print_text(h, "\\&"); 172961d06d6bSBaptiste Daroussin else if (n->end != ENDBODY_NOT ? n->child != NULL : 173061d06d6bSBaptiste Daroussin n->parent->head->child != NULL && (n->child != NULL || 173161d06d6bSBaptiste Daroussin (n->parent->tail != NULL && n->parent->tail->child != NULL))) 173261d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 173361d06d6bSBaptiste Daroussin return 1; 173461d06d6bSBaptiste Daroussin } 173561d06d6bSBaptiste Daroussin 173661d06d6bSBaptiste Daroussin static void 173761d06d6bSBaptiste Daroussin mdoc_eo_post(MDOC_ARGS) 173861d06d6bSBaptiste Daroussin { 173961d06d6bSBaptiste Daroussin int body, tail; 174061d06d6bSBaptiste Daroussin 174161d06d6bSBaptiste Daroussin if (n->type != ROFFT_BODY) 174261d06d6bSBaptiste Daroussin return; 174361d06d6bSBaptiste Daroussin 174461d06d6bSBaptiste Daroussin if (n->end != ENDBODY_NOT) { 174561d06d6bSBaptiste Daroussin h->flags &= ~HTML_NOSPACE; 174661d06d6bSBaptiste Daroussin return; 174761d06d6bSBaptiste Daroussin } 174861d06d6bSBaptiste Daroussin 174961d06d6bSBaptiste Daroussin body = n->child != NULL || n->parent->head->child != NULL; 175061d06d6bSBaptiste Daroussin tail = n->parent->tail != NULL && n->parent->tail->child != NULL; 175161d06d6bSBaptiste Daroussin 175261d06d6bSBaptiste Daroussin if (body && tail) 175361d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 175461d06d6bSBaptiste Daroussin else if ( ! tail) 175561d06d6bSBaptiste Daroussin h->flags &= ~HTML_NOSPACE; 175661d06d6bSBaptiste Daroussin } 17577295610fSBaptiste Daroussin 17587295610fSBaptiste Daroussin static int 17597295610fSBaptiste Daroussin mdoc_abort_pre(MDOC_ARGS) 17607295610fSBaptiste Daroussin { 17617295610fSBaptiste Daroussin abort(); 17627295610fSBaptiste Daroussin } 1763