1*c1c95addSBrooks Davis /* $Id: mdoc_html.c,v 1.350 2022/07/06 16:05:40 schwarze Exp $ */ 261d06d6bSBaptiste Daroussin /* 3*c1c95addSBrooks Davis * Copyright (c) 2014-2022 Ingo Schwarze <schwarze@openbsd.org> 461d06d6bSBaptiste Daroussin * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> 5*c1c95addSBrooks Davis * Copyright (c) 2022 Anna Vyalkova <cyber@sysrq.in> 661d06d6bSBaptiste Daroussin * 761d06d6bSBaptiste Daroussin * Permission to use, copy, modify, and distribute this software for any 861d06d6bSBaptiste Daroussin * purpose with or without fee is hereby granted, provided that the above 961d06d6bSBaptiste Daroussin * copyright notice and this permission notice appear in all copies. 1061d06d6bSBaptiste Daroussin * 1161d06d6bSBaptiste Daroussin * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES 1261d06d6bSBaptiste Daroussin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1361d06d6bSBaptiste Daroussin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR 1461d06d6bSBaptiste Daroussin * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1561d06d6bSBaptiste Daroussin * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1661d06d6bSBaptiste Daroussin * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1761d06d6bSBaptiste Daroussin * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 186d38604fSBaptiste Daroussin * 196d38604fSBaptiste Daroussin * HTML formatter for mdoc(7) used by mandoc(1). 2061d06d6bSBaptiste Daroussin */ 2161d06d6bSBaptiste Daroussin #include "config.h" 2261d06d6bSBaptiste Daroussin 2361d06d6bSBaptiste Daroussin #include <sys/types.h> 2461d06d6bSBaptiste Daroussin 2561d06d6bSBaptiste Daroussin #include <assert.h> 2661d06d6bSBaptiste Daroussin #include <ctype.h> 2761d06d6bSBaptiste Daroussin #include <stdio.h> 2861d06d6bSBaptiste Daroussin #include <stdlib.h> 2961d06d6bSBaptiste Daroussin #include <string.h> 3061d06d6bSBaptiste Daroussin #include <unistd.h> 3161d06d6bSBaptiste Daroussin 3261d06d6bSBaptiste Daroussin #include "mandoc_aux.h" 3361d06d6bSBaptiste Daroussin #include "mandoc.h" 3461d06d6bSBaptiste Daroussin #include "roff.h" 3561d06d6bSBaptiste Daroussin #include "mdoc.h" 3661d06d6bSBaptiste Daroussin #include "out.h" 3761d06d6bSBaptiste Daroussin #include "html.h" 3861d06d6bSBaptiste Daroussin #include "main.h" 3961d06d6bSBaptiste Daroussin 4061d06d6bSBaptiste Daroussin #define MDOC_ARGS const struct roff_meta *meta, \ 4161d06d6bSBaptiste Daroussin struct roff_node *n, \ 4261d06d6bSBaptiste Daroussin struct html *h 4361d06d6bSBaptiste Daroussin 4461d06d6bSBaptiste Daroussin #ifndef MIN 4561d06d6bSBaptiste Daroussin #define MIN(a,b) ((/*CONSTCOND*/(a)<(b))?(a):(b)) 4661d06d6bSBaptiste Daroussin #endif 4761d06d6bSBaptiste Daroussin 487295610fSBaptiste Daroussin struct mdoc_html_act { 4961d06d6bSBaptiste Daroussin int (*pre)(MDOC_ARGS); 5061d06d6bSBaptiste Daroussin void (*post)(MDOC_ARGS); 5161d06d6bSBaptiste Daroussin }; 5261d06d6bSBaptiste Daroussin 5361d06d6bSBaptiste Daroussin static void print_mdoc_head(const struct roff_meta *, 5461d06d6bSBaptiste Daroussin struct html *); 5561d06d6bSBaptiste Daroussin static void print_mdoc_node(MDOC_ARGS); 5661d06d6bSBaptiste Daroussin static void print_mdoc_nodelist(MDOC_ARGS); 576d38604fSBaptiste Daroussin static void synopsis_pre(struct html *, struct roff_node *); 5861d06d6bSBaptiste Daroussin 5961d06d6bSBaptiste Daroussin static void mdoc_root_post(const struct roff_meta *, 6061d06d6bSBaptiste Daroussin struct html *); 6161d06d6bSBaptiste Daroussin static int mdoc_root_pre(const struct roff_meta *, 6261d06d6bSBaptiste Daroussin struct html *); 6361d06d6bSBaptiste Daroussin 6461d06d6bSBaptiste Daroussin static void mdoc__x_post(MDOC_ARGS); 6561d06d6bSBaptiste Daroussin static int mdoc__x_pre(MDOC_ARGS); 667295610fSBaptiste Daroussin static int mdoc_abort_pre(MDOC_ARGS); 6761d06d6bSBaptiste Daroussin static int mdoc_ad_pre(MDOC_ARGS); 6861d06d6bSBaptiste Daroussin static int mdoc_an_pre(MDOC_ARGS); 6961d06d6bSBaptiste Daroussin static int mdoc_ap_pre(MDOC_ARGS); 7061d06d6bSBaptiste Daroussin static int mdoc_ar_pre(MDOC_ARGS); 7161d06d6bSBaptiste Daroussin static int mdoc_bd_pre(MDOC_ARGS); 7261d06d6bSBaptiste Daroussin static int mdoc_bf_pre(MDOC_ARGS); 7361d06d6bSBaptiste Daroussin static void mdoc_bk_post(MDOC_ARGS); 7461d06d6bSBaptiste Daroussin static int mdoc_bk_pre(MDOC_ARGS); 7561d06d6bSBaptiste Daroussin static int mdoc_bl_pre(MDOC_ARGS); 7661d06d6bSBaptiste Daroussin static int mdoc_cd_pre(MDOC_ARGS); 776d38604fSBaptiste Daroussin static int mdoc_code_pre(MDOC_ARGS); 7861d06d6bSBaptiste Daroussin static int mdoc_d1_pre(MDOC_ARGS); 7961d06d6bSBaptiste Daroussin static int mdoc_fa_pre(MDOC_ARGS); 8061d06d6bSBaptiste Daroussin static int mdoc_fd_pre(MDOC_ARGS); 8161d06d6bSBaptiste Daroussin static int mdoc_fl_pre(MDOC_ARGS); 8261d06d6bSBaptiste Daroussin static int mdoc_fn_pre(MDOC_ARGS); 8361d06d6bSBaptiste Daroussin static int mdoc_ft_pre(MDOC_ARGS); 8461d06d6bSBaptiste Daroussin static int mdoc_em_pre(MDOC_ARGS); 8561d06d6bSBaptiste Daroussin static void mdoc_eo_post(MDOC_ARGS); 8661d06d6bSBaptiste Daroussin static int mdoc_eo_pre(MDOC_ARGS); 8761d06d6bSBaptiste Daroussin static int mdoc_ex_pre(MDOC_ARGS); 8861d06d6bSBaptiste Daroussin static void mdoc_fo_post(MDOC_ARGS); 8961d06d6bSBaptiste Daroussin static int mdoc_fo_pre(MDOC_ARGS); 9061d06d6bSBaptiste Daroussin static int mdoc_igndelim_pre(MDOC_ARGS); 9161d06d6bSBaptiste Daroussin static int mdoc_in_pre(MDOC_ARGS); 9261d06d6bSBaptiste Daroussin static int mdoc_it_pre(MDOC_ARGS); 9361d06d6bSBaptiste Daroussin static int mdoc_lb_pre(MDOC_ARGS); 9461d06d6bSBaptiste Daroussin static int mdoc_lk_pre(MDOC_ARGS); 9561d06d6bSBaptiste Daroussin static int mdoc_mt_pre(MDOC_ARGS); 9661d06d6bSBaptiste Daroussin static int mdoc_nd_pre(MDOC_ARGS); 9761d06d6bSBaptiste Daroussin static int mdoc_nm_pre(MDOC_ARGS); 9861d06d6bSBaptiste Daroussin static int mdoc_no_pre(MDOC_ARGS); 9961d06d6bSBaptiste Daroussin static int mdoc_ns_pre(MDOC_ARGS); 10061d06d6bSBaptiste Daroussin static int mdoc_pa_pre(MDOC_ARGS); 10161d06d6bSBaptiste Daroussin static void mdoc_pf_post(MDOC_ARGS); 10261d06d6bSBaptiste Daroussin static int mdoc_pp_pre(MDOC_ARGS); 10361d06d6bSBaptiste Daroussin static void mdoc_quote_post(MDOC_ARGS); 10461d06d6bSBaptiste Daroussin static int mdoc_quote_pre(MDOC_ARGS); 10561d06d6bSBaptiste Daroussin static int mdoc_rs_pre(MDOC_ARGS); 10661d06d6bSBaptiste Daroussin static int mdoc_sh_pre(MDOC_ARGS); 10761d06d6bSBaptiste Daroussin static int mdoc_skip_pre(MDOC_ARGS); 10861d06d6bSBaptiste Daroussin static int mdoc_sm_pre(MDOC_ARGS); 10961d06d6bSBaptiste Daroussin static int mdoc_ss_pre(MDOC_ARGS); 11061d06d6bSBaptiste Daroussin static int mdoc_st_pre(MDOC_ARGS); 11161d06d6bSBaptiste Daroussin static int mdoc_sx_pre(MDOC_ARGS); 11261d06d6bSBaptiste Daroussin static int mdoc_sy_pre(MDOC_ARGS); 1136d38604fSBaptiste Daroussin static int mdoc_tg_pre(MDOC_ARGS); 11461d06d6bSBaptiste Daroussin static int mdoc_va_pre(MDOC_ARGS); 11561d06d6bSBaptiste Daroussin static int mdoc_vt_pre(MDOC_ARGS); 11661d06d6bSBaptiste Daroussin static int mdoc_xr_pre(MDOC_ARGS); 11761d06d6bSBaptiste Daroussin static int mdoc_xx_pre(MDOC_ARGS); 11861d06d6bSBaptiste Daroussin 1197295610fSBaptiste Daroussin static const struct mdoc_html_act mdoc_html_acts[MDOC_MAX - MDOC_Dd] = { 12061d06d6bSBaptiste Daroussin {NULL, NULL}, /* Dd */ 12161d06d6bSBaptiste Daroussin {NULL, NULL}, /* Dt */ 12261d06d6bSBaptiste Daroussin {NULL, NULL}, /* Os */ 12361d06d6bSBaptiste Daroussin {mdoc_sh_pre, NULL }, /* Sh */ 12461d06d6bSBaptiste Daroussin {mdoc_ss_pre, NULL }, /* Ss */ 12561d06d6bSBaptiste Daroussin {mdoc_pp_pre, NULL}, /* Pp */ 12661d06d6bSBaptiste Daroussin {mdoc_d1_pre, NULL}, /* D1 */ 12761d06d6bSBaptiste Daroussin {mdoc_d1_pre, NULL}, /* Dl */ 12861d06d6bSBaptiste Daroussin {mdoc_bd_pre, NULL}, /* Bd */ 12961d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ed */ 13061d06d6bSBaptiste Daroussin {mdoc_bl_pre, NULL}, /* Bl */ 13161d06d6bSBaptiste Daroussin {NULL, NULL}, /* El */ 13261d06d6bSBaptiste Daroussin {mdoc_it_pre, NULL}, /* It */ 13361d06d6bSBaptiste Daroussin {mdoc_ad_pre, NULL}, /* Ad */ 13461d06d6bSBaptiste Daroussin {mdoc_an_pre, NULL}, /* An */ 13561d06d6bSBaptiste Daroussin {mdoc_ap_pre, NULL}, /* Ap */ 13661d06d6bSBaptiste Daroussin {mdoc_ar_pre, NULL}, /* Ar */ 13761d06d6bSBaptiste Daroussin {mdoc_cd_pre, NULL}, /* Cd */ 1386d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Cm */ 1396d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Dv */ 1406d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Er */ 1416d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Ev */ 14261d06d6bSBaptiste Daroussin {mdoc_ex_pre, NULL}, /* Ex */ 14361d06d6bSBaptiste Daroussin {mdoc_fa_pre, NULL}, /* Fa */ 14461d06d6bSBaptiste Daroussin {mdoc_fd_pre, NULL}, /* Fd */ 14561d06d6bSBaptiste Daroussin {mdoc_fl_pre, NULL}, /* Fl */ 14661d06d6bSBaptiste Daroussin {mdoc_fn_pre, NULL}, /* Fn */ 14761d06d6bSBaptiste Daroussin {mdoc_ft_pre, NULL}, /* Ft */ 1486d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Ic */ 14961d06d6bSBaptiste Daroussin {mdoc_in_pre, NULL}, /* In */ 1506d38604fSBaptiste Daroussin {mdoc_code_pre, NULL}, /* Li */ 15161d06d6bSBaptiste Daroussin {mdoc_nd_pre, NULL}, /* Nd */ 15261d06d6bSBaptiste Daroussin {mdoc_nm_pre, NULL}, /* Nm */ 15361d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Op */ 1547295610fSBaptiste Daroussin {mdoc_abort_pre, NULL}, /* Ot */ 15561d06d6bSBaptiste Daroussin {mdoc_pa_pre, NULL}, /* Pa */ 15661d06d6bSBaptiste Daroussin {mdoc_ex_pre, NULL}, /* Rv */ 15761d06d6bSBaptiste Daroussin {mdoc_st_pre, NULL}, /* St */ 15861d06d6bSBaptiste Daroussin {mdoc_va_pre, NULL}, /* Va */ 15961d06d6bSBaptiste Daroussin {mdoc_vt_pre, NULL}, /* Vt */ 16061d06d6bSBaptiste Daroussin {mdoc_xr_pre, NULL}, /* Xr */ 16161d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %A */ 16261d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %B */ 16361d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %D */ 16461d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %I */ 16561d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %J */ 16661d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %N */ 16761d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %O */ 16861d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %P */ 16961d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %R */ 17061d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %T */ 17161d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %V */ 17261d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ac */ 17361d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Ao */ 17461d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Aq */ 17561d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* At */ 17661d06d6bSBaptiste Daroussin {NULL, NULL}, /* Bc */ 17761d06d6bSBaptiste Daroussin {mdoc_bf_pre, NULL}, /* Bf */ 17861d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Bo */ 17961d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Bq */ 18061d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Bsx */ 18161d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Bx */ 18261d06d6bSBaptiste Daroussin {mdoc_skip_pre, NULL}, /* Db */ 18361d06d6bSBaptiste Daroussin {NULL, NULL}, /* Dc */ 18461d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Do */ 18561d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Dq */ 18661d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ec */ /* FIXME: no space */ 18761d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ef */ 18861d06d6bSBaptiste Daroussin {mdoc_em_pre, NULL}, /* Em */ 18961d06d6bSBaptiste Daroussin {mdoc_eo_pre, mdoc_eo_post}, /* Eo */ 19061d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Fx */ 1916d38604fSBaptiste Daroussin {mdoc_no_pre, NULL}, /* Ms */ 19261d06d6bSBaptiste Daroussin {mdoc_no_pre, NULL}, /* No */ 19361d06d6bSBaptiste Daroussin {mdoc_ns_pre, NULL}, /* Ns */ 19461d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Nx */ 19561d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Ox */ 19661d06d6bSBaptiste Daroussin {NULL, NULL}, /* Pc */ 19761d06d6bSBaptiste Daroussin {mdoc_igndelim_pre, mdoc_pf_post}, /* Pf */ 19861d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Po */ 19961d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Pq */ 20061d06d6bSBaptiste Daroussin {NULL, NULL}, /* Qc */ 20161d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Ql */ 20261d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Qo */ 20361d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Qq */ 20461d06d6bSBaptiste Daroussin {NULL, NULL}, /* Re */ 20561d06d6bSBaptiste Daroussin {mdoc_rs_pre, NULL}, /* Rs */ 20661d06d6bSBaptiste Daroussin {NULL, NULL}, /* Sc */ 20761d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* So */ 20861d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Sq */ 20961d06d6bSBaptiste Daroussin {mdoc_sm_pre, NULL}, /* Sm */ 21061d06d6bSBaptiste Daroussin {mdoc_sx_pre, NULL}, /* Sx */ 21161d06d6bSBaptiste Daroussin {mdoc_sy_pre, NULL}, /* Sy */ 21261d06d6bSBaptiste Daroussin {NULL, NULL}, /* Tn */ 21361d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Ux */ 21461d06d6bSBaptiste Daroussin {NULL, NULL}, /* Xc */ 21561d06d6bSBaptiste Daroussin {NULL, NULL}, /* Xo */ 21661d06d6bSBaptiste Daroussin {mdoc_fo_pre, mdoc_fo_post}, /* Fo */ 21761d06d6bSBaptiste Daroussin {NULL, NULL}, /* Fc */ 21861d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Oo */ 21961d06d6bSBaptiste Daroussin {NULL, NULL}, /* Oc */ 22061d06d6bSBaptiste Daroussin {mdoc_bk_pre, mdoc_bk_post}, /* Bk */ 22161d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ek */ 22261d06d6bSBaptiste Daroussin {NULL, NULL}, /* Bt */ 22361d06d6bSBaptiste Daroussin {NULL, NULL}, /* Hf */ 22461d06d6bSBaptiste Daroussin {mdoc_em_pre, NULL}, /* Fr */ 22561d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ud */ 22661d06d6bSBaptiste Daroussin {mdoc_lb_pre, NULL}, /* Lb */ 2277295610fSBaptiste Daroussin {mdoc_abort_pre, NULL}, /* Lp */ 22861d06d6bSBaptiste Daroussin {mdoc_lk_pre, NULL}, /* Lk */ 22961d06d6bSBaptiste Daroussin {mdoc_mt_pre, NULL}, /* Mt */ 23061d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Brq */ 23161d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* Bro */ 23261d06d6bSBaptiste Daroussin {NULL, NULL}, /* Brc */ 23361d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %C */ 23461d06d6bSBaptiste Daroussin {mdoc_skip_pre, NULL}, /* Es */ 23561d06d6bSBaptiste Daroussin {mdoc_quote_pre, mdoc_quote_post}, /* En */ 23661d06d6bSBaptiste Daroussin {mdoc_xx_pre, NULL}, /* Dx */ 23761d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %Q */ 23861d06d6bSBaptiste Daroussin {mdoc__x_pre, mdoc__x_post}, /* %U */ 23961d06d6bSBaptiste Daroussin {NULL, NULL}, /* Ta */ 2406d38604fSBaptiste Daroussin {mdoc_tg_pre, NULL}, /* Tg */ 24161d06d6bSBaptiste Daroussin }; 24261d06d6bSBaptiste Daroussin 24361d06d6bSBaptiste Daroussin 24461d06d6bSBaptiste Daroussin /* 24561d06d6bSBaptiste Daroussin * See the same function in mdoc_term.c for documentation. 24661d06d6bSBaptiste Daroussin */ 24761d06d6bSBaptiste Daroussin static void 2486d38604fSBaptiste Daroussin synopsis_pre(struct html *h, struct roff_node *n) 24961d06d6bSBaptiste Daroussin { 2506d38604fSBaptiste Daroussin struct roff_node *np; 25161d06d6bSBaptiste Daroussin 2526d38604fSBaptiste Daroussin if ((n->flags & NODE_SYNPRETTY) == 0 || 2536d38604fSBaptiste Daroussin (np = roff_node_prev(n)) == NULL) 25461d06d6bSBaptiste Daroussin return; 25561d06d6bSBaptiste Daroussin 2566d38604fSBaptiste Daroussin if (np->tok == n->tok && 25761d06d6bSBaptiste Daroussin MDOC_Fo != n->tok && 25861d06d6bSBaptiste Daroussin MDOC_Ft != n->tok && 25961d06d6bSBaptiste Daroussin MDOC_Fn != n->tok) { 26061d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 26161d06d6bSBaptiste Daroussin return; 26261d06d6bSBaptiste Daroussin } 26361d06d6bSBaptiste Daroussin 2646d38604fSBaptiste Daroussin switch (np->tok) { 26561d06d6bSBaptiste Daroussin case MDOC_Fd: 26661d06d6bSBaptiste Daroussin case MDOC_Fn: 26761d06d6bSBaptiste Daroussin case MDOC_Fo: 26861d06d6bSBaptiste Daroussin case MDOC_In: 26961d06d6bSBaptiste Daroussin case MDOC_Vt: 27061d06d6bSBaptiste Daroussin break; 27161d06d6bSBaptiste Daroussin case MDOC_Ft: 2727295610fSBaptiste Daroussin if (n->tok != MDOC_Fn && n->tok != MDOC_Fo) 27361d06d6bSBaptiste Daroussin break; 27461d06d6bSBaptiste Daroussin /* FALLTHROUGH */ 27561d06d6bSBaptiste Daroussin default: 27661d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 2777295610fSBaptiste Daroussin return; 27861d06d6bSBaptiste Daroussin } 2797295610fSBaptiste Daroussin html_close_paragraph(h); 2807295610fSBaptiste Daroussin print_otag(h, TAG_P, "c", "Pp"); 28161d06d6bSBaptiste Daroussin } 28261d06d6bSBaptiste Daroussin 28361d06d6bSBaptiste Daroussin void 2847295610fSBaptiste Daroussin html_mdoc(void *arg, const struct roff_meta *mdoc) 28561d06d6bSBaptiste Daroussin { 28661d06d6bSBaptiste Daroussin struct html *h; 28761d06d6bSBaptiste Daroussin struct roff_node *n; 28861d06d6bSBaptiste Daroussin struct tag *t; 28961d06d6bSBaptiste Daroussin 29061d06d6bSBaptiste Daroussin h = (struct html *)arg; 29161d06d6bSBaptiste Daroussin n = mdoc->first->child; 29261d06d6bSBaptiste Daroussin 29361d06d6bSBaptiste Daroussin if ((h->oflags & HTML_FRAGMENT) == 0) { 29461d06d6bSBaptiste Daroussin print_gen_decls(h); 29561d06d6bSBaptiste Daroussin print_otag(h, TAG_HTML, ""); 29661d06d6bSBaptiste Daroussin t = print_otag(h, TAG_HEAD, ""); 2977295610fSBaptiste Daroussin print_mdoc_head(mdoc, h); 29861d06d6bSBaptiste Daroussin print_tagq(h, t); 299*c1c95addSBrooks Davis if (n != NULL && n->type == ROFFT_COMMENT) 300*c1c95addSBrooks Davis print_gen_comment(h, n); 30161d06d6bSBaptiste Daroussin print_otag(h, TAG_BODY, ""); 30261d06d6bSBaptiste Daroussin } 30361d06d6bSBaptiste Daroussin 3047295610fSBaptiste Daroussin mdoc_root_pre(mdoc, h); 305*c1c95addSBrooks Davis t = print_otag(h, TAG_MAIN, "c", "manual-text"); 3067295610fSBaptiste Daroussin print_mdoc_nodelist(mdoc, n, h); 30761d06d6bSBaptiste Daroussin print_tagq(h, t); 3087295610fSBaptiste Daroussin mdoc_root_post(mdoc, h); 30961d06d6bSBaptiste Daroussin print_tagq(h, NULL); 31061d06d6bSBaptiste Daroussin } 31161d06d6bSBaptiste Daroussin 31261d06d6bSBaptiste Daroussin static void 31361d06d6bSBaptiste Daroussin print_mdoc_head(const struct roff_meta *meta, struct html *h) 31461d06d6bSBaptiste Daroussin { 31561d06d6bSBaptiste Daroussin char *cp; 31661d06d6bSBaptiste Daroussin 31761d06d6bSBaptiste Daroussin print_gen_head(h); 31861d06d6bSBaptiste Daroussin 31961d06d6bSBaptiste Daroussin if (meta->arch != NULL && meta->msec != NULL) 32061d06d6bSBaptiste Daroussin mandoc_asprintf(&cp, "%s(%s) (%s)", meta->title, 32161d06d6bSBaptiste Daroussin meta->msec, meta->arch); 32261d06d6bSBaptiste Daroussin else if (meta->msec != NULL) 32361d06d6bSBaptiste Daroussin mandoc_asprintf(&cp, "%s(%s)", meta->title, meta->msec); 32461d06d6bSBaptiste Daroussin else if (meta->arch != NULL) 32561d06d6bSBaptiste Daroussin mandoc_asprintf(&cp, "%s (%s)", meta->title, meta->arch); 32661d06d6bSBaptiste Daroussin else 32761d06d6bSBaptiste Daroussin cp = mandoc_strdup(meta->title); 32861d06d6bSBaptiste Daroussin 32961d06d6bSBaptiste Daroussin print_otag(h, TAG_TITLE, ""); 33061d06d6bSBaptiste Daroussin print_text(h, cp); 33161d06d6bSBaptiste Daroussin free(cp); 33261d06d6bSBaptiste Daroussin } 33361d06d6bSBaptiste Daroussin 33461d06d6bSBaptiste Daroussin static void 33561d06d6bSBaptiste Daroussin print_mdoc_nodelist(MDOC_ARGS) 33661d06d6bSBaptiste Daroussin { 33761d06d6bSBaptiste Daroussin 33861d06d6bSBaptiste Daroussin while (n != NULL) { 33961d06d6bSBaptiste Daroussin print_mdoc_node(meta, n, h); 34061d06d6bSBaptiste Daroussin n = n->next; 34161d06d6bSBaptiste Daroussin } 34261d06d6bSBaptiste Daroussin } 34361d06d6bSBaptiste Daroussin 34461d06d6bSBaptiste Daroussin static void 34561d06d6bSBaptiste Daroussin print_mdoc_node(MDOC_ARGS) 34661d06d6bSBaptiste Daroussin { 34761d06d6bSBaptiste Daroussin struct tag *t; 3487295610fSBaptiste Daroussin int child; 34961d06d6bSBaptiste Daroussin 35061d06d6bSBaptiste Daroussin if (n->type == ROFFT_COMMENT || n->flags & NODE_NOPRT) 35161d06d6bSBaptiste Daroussin return; 35261d06d6bSBaptiste Daroussin 3536d38604fSBaptiste Daroussin if ((n->flags & NODE_NOFILL) == 0) 3546d38604fSBaptiste Daroussin html_fillmode(h, ROFF_fi); 3556d38604fSBaptiste Daroussin else if (html_fillmode(h, ROFF_nf) == ROFF_nf && 3566d38604fSBaptiste Daroussin n->tok != ROFF_fi && n->flags & NODE_LINE) 3576d38604fSBaptiste Daroussin print_endline(h); 35861d06d6bSBaptiste Daroussin 3597295610fSBaptiste Daroussin child = 1; 3607295610fSBaptiste Daroussin n->flags &= ~NODE_ENDED; 36161d06d6bSBaptiste Daroussin switch (n->type) { 36261d06d6bSBaptiste Daroussin case ROFFT_TEXT: 3636d38604fSBaptiste Daroussin if (n->flags & NODE_LINE) { 3646d38604fSBaptiste Daroussin switch (*n->string) { 3656d38604fSBaptiste Daroussin case '\0': 3666d38604fSBaptiste Daroussin h->col = 1; 3676d38604fSBaptiste Daroussin print_endline(h); 3686d38604fSBaptiste Daroussin return; 3696d38604fSBaptiste Daroussin case ' ': 3706d38604fSBaptiste Daroussin if ((h->flags & HTML_NONEWLINE) == 0 && 3717295610fSBaptiste Daroussin (n->flags & NODE_NOFILL) == 0) 37261d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 3736d38604fSBaptiste Daroussin break; 3746d38604fSBaptiste Daroussin default: 3756d38604fSBaptiste Daroussin break; 3766d38604fSBaptiste Daroussin } 3776d38604fSBaptiste Daroussin } 3786d38604fSBaptiste Daroussin t = h->tag; 3796d38604fSBaptiste Daroussin t->refcnt++; 3806d38604fSBaptiste Daroussin if (n->flags & NODE_DELIMC) 38161d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 3826d38604fSBaptiste Daroussin if (n->flags & NODE_HREF) 3836d38604fSBaptiste Daroussin print_tagged_text(h, n->string, n); 3846d38604fSBaptiste Daroussin else 38561d06d6bSBaptiste Daroussin print_text(h, n->string); 3866d38604fSBaptiste Daroussin if (n->flags & NODE_DELIMO) 38761d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 3887295610fSBaptiste Daroussin break; 38961d06d6bSBaptiste Daroussin case ROFFT_EQN: 3907295610fSBaptiste Daroussin t = h->tag; 3917295610fSBaptiste Daroussin t->refcnt++; 39261d06d6bSBaptiste Daroussin print_eqn(h, n->eqn); 39361d06d6bSBaptiste Daroussin break; 39461d06d6bSBaptiste Daroussin case ROFFT_TBL: 39561d06d6bSBaptiste Daroussin /* 39661d06d6bSBaptiste Daroussin * This will take care of initialising all of the table 39761d06d6bSBaptiste Daroussin * state data for the first table, then tearing it down 39861d06d6bSBaptiste Daroussin * for the last one. 39961d06d6bSBaptiste Daroussin */ 40061d06d6bSBaptiste Daroussin print_tbl(h, n->span); 40161d06d6bSBaptiste Daroussin return; 40261d06d6bSBaptiste Daroussin default: 40361d06d6bSBaptiste Daroussin /* 40461d06d6bSBaptiste Daroussin * Close out the current table, if it's open, and unset 40561d06d6bSBaptiste Daroussin * the "meta" table state. This will be reopened on the 40661d06d6bSBaptiste Daroussin * next table element. 40761d06d6bSBaptiste Daroussin */ 4087295610fSBaptiste Daroussin if (h->tblt != NULL) 40961d06d6bSBaptiste Daroussin print_tblclose(h); 41061d06d6bSBaptiste Daroussin assert(h->tblt == NULL); 4117295610fSBaptiste Daroussin t = h->tag; 4127295610fSBaptiste Daroussin t->refcnt++; 41361d06d6bSBaptiste Daroussin if (n->tok < ROFF_MAX) { 41461d06d6bSBaptiste Daroussin roff_html_pre(h, n); 4157295610fSBaptiste Daroussin t->refcnt--; 4167295610fSBaptiste Daroussin print_stagq(h, t); 4177295610fSBaptiste Daroussin return; 41861d06d6bSBaptiste Daroussin } 41961d06d6bSBaptiste Daroussin assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX); 4207295610fSBaptiste Daroussin if (mdoc_html_acts[n->tok - MDOC_Dd].pre != NULL && 42161d06d6bSBaptiste Daroussin (n->end == ENDBODY_NOT || n->child != NULL)) 4227295610fSBaptiste Daroussin child = (*mdoc_html_acts[n->tok - MDOC_Dd].pre)(meta, 4237295610fSBaptiste Daroussin n, h); 42461d06d6bSBaptiste Daroussin break; 42561d06d6bSBaptiste Daroussin } 42661d06d6bSBaptiste Daroussin 42761d06d6bSBaptiste Daroussin if (h->flags & HTML_KEEP && n->flags & NODE_LINE) { 42861d06d6bSBaptiste Daroussin h->flags &= ~HTML_KEEP; 42961d06d6bSBaptiste Daroussin h->flags |= HTML_PREKEEP; 43061d06d6bSBaptiste Daroussin } 43161d06d6bSBaptiste Daroussin 4327295610fSBaptiste Daroussin if (child && n->child != NULL) 43361d06d6bSBaptiste Daroussin print_mdoc_nodelist(meta, n->child, h); 43461d06d6bSBaptiste Daroussin 4357295610fSBaptiste Daroussin t->refcnt--; 43661d06d6bSBaptiste Daroussin print_stagq(h, t); 43761d06d6bSBaptiste Daroussin 43861d06d6bSBaptiste Daroussin switch (n->type) { 4397295610fSBaptiste Daroussin case ROFFT_TEXT: 44061d06d6bSBaptiste Daroussin case ROFFT_EQN: 44161d06d6bSBaptiste Daroussin break; 44261d06d6bSBaptiste Daroussin default: 4437295610fSBaptiste Daroussin if (mdoc_html_acts[n->tok - MDOC_Dd].post == NULL || 44461d06d6bSBaptiste Daroussin n->flags & NODE_ENDED) 44561d06d6bSBaptiste Daroussin break; 4467295610fSBaptiste Daroussin (*mdoc_html_acts[n->tok - MDOC_Dd].post)(meta, n, h); 44761d06d6bSBaptiste Daroussin if (n->end != ENDBODY_NOT) 44861d06d6bSBaptiste Daroussin n->body->flags |= NODE_ENDED; 44961d06d6bSBaptiste Daroussin break; 45061d06d6bSBaptiste Daroussin } 45161d06d6bSBaptiste Daroussin } 45261d06d6bSBaptiste Daroussin 45361d06d6bSBaptiste Daroussin static void 45461d06d6bSBaptiste Daroussin mdoc_root_post(const struct roff_meta *meta, struct html *h) 45561d06d6bSBaptiste Daroussin { 456*c1c95addSBrooks Davis struct tag *t; 45761d06d6bSBaptiste Daroussin 458*c1c95addSBrooks Davis t = print_otag(h, TAG_DIV, "cr?", "foot", "doc-pagefooter", 459*c1c95addSBrooks Davis "aria-label", "Manual footer line"); 46061d06d6bSBaptiste Daroussin 461*c1c95addSBrooks Davis print_otag(h, TAG_SPAN, "c", "foot-left"); 462*c1c95addSBrooks Davis print_stagq(h, t); 463*c1c95addSBrooks Davis 464*c1c95addSBrooks Davis print_otag(h, TAG_SPAN, "c", "foot-date"); 46561d06d6bSBaptiste Daroussin print_text(h, meta->date); 466*c1c95addSBrooks Davis print_stagq(h, t); 46761d06d6bSBaptiste Daroussin 468*c1c95addSBrooks Davis print_otag(h, TAG_SPAN, "c", "foot-os"); 46961d06d6bSBaptiste Daroussin print_text(h, meta->os); 47061d06d6bSBaptiste Daroussin print_tagq(h, t); 47161d06d6bSBaptiste Daroussin } 47261d06d6bSBaptiste Daroussin 47361d06d6bSBaptiste Daroussin static int 47461d06d6bSBaptiste Daroussin mdoc_root_pre(const struct roff_meta *meta, struct html *h) 47561d06d6bSBaptiste Daroussin { 476*c1c95addSBrooks Davis struct tag *t; 47761d06d6bSBaptiste Daroussin char *volume, *title; 47861d06d6bSBaptiste Daroussin 47961d06d6bSBaptiste Daroussin if (NULL == meta->arch) 48061d06d6bSBaptiste Daroussin volume = mandoc_strdup(meta->vol); 48161d06d6bSBaptiste Daroussin else 48261d06d6bSBaptiste Daroussin mandoc_asprintf(&volume, "%s (%s)", 48361d06d6bSBaptiste Daroussin meta->vol, meta->arch); 48461d06d6bSBaptiste Daroussin 48561d06d6bSBaptiste Daroussin if (NULL == meta->msec) 48661d06d6bSBaptiste Daroussin title = mandoc_strdup(meta->title); 48761d06d6bSBaptiste Daroussin else 48861d06d6bSBaptiste Daroussin mandoc_asprintf(&title, "%s(%s)", 48961d06d6bSBaptiste Daroussin meta->title, meta->msec); 49061d06d6bSBaptiste Daroussin 491*c1c95addSBrooks Davis t = print_otag(h, TAG_DIV, "cr?", "head", "doc-pageheader", 492*c1c95addSBrooks Davis "aria-label", "Manual header line"); 49361d06d6bSBaptiste Daroussin 494*c1c95addSBrooks Davis print_otag(h, TAG_SPAN, "c", "head-ltitle"); 49561d06d6bSBaptiste Daroussin print_text(h, title); 496*c1c95addSBrooks Davis print_stagq(h, t); 49761d06d6bSBaptiste Daroussin 498*c1c95addSBrooks Davis print_otag(h, TAG_SPAN, "c", "head-vol"); 49961d06d6bSBaptiste Daroussin print_text(h, volume); 500*c1c95addSBrooks Davis print_stagq(h, t); 50161d06d6bSBaptiste Daroussin 502*c1c95addSBrooks Davis print_otag(h, TAG_SPAN, "c", "head-rtitle"); 50361d06d6bSBaptiste Daroussin print_text(h, title); 50461d06d6bSBaptiste Daroussin print_tagq(h, t); 50561d06d6bSBaptiste Daroussin 50661d06d6bSBaptiste Daroussin free(title); 50761d06d6bSBaptiste Daroussin free(volume); 50861d06d6bSBaptiste Daroussin return 1; 50961d06d6bSBaptiste Daroussin } 51061d06d6bSBaptiste Daroussin 5116d38604fSBaptiste Daroussin static int 5126d38604fSBaptiste Daroussin mdoc_code_pre(MDOC_ARGS) 51361d06d6bSBaptiste Daroussin { 5146d38604fSBaptiste Daroussin print_otag_id(h, TAG_CODE, roff_name[n->tok], n); 5156d38604fSBaptiste Daroussin return 1; 51661d06d6bSBaptiste Daroussin } 51761d06d6bSBaptiste Daroussin 51861d06d6bSBaptiste Daroussin static int 51961d06d6bSBaptiste Daroussin mdoc_sh_pre(MDOC_ARGS) 52061d06d6bSBaptiste Daroussin { 5217295610fSBaptiste Daroussin struct roff_node *sn, *subn; 522*c1c95addSBrooks Davis struct tag *t, *tnav, *tsec, *tsub; 52361d06d6bSBaptiste Daroussin char *id; 5247295610fSBaptiste Daroussin int sc; 52561d06d6bSBaptiste Daroussin 52661d06d6bSBaptiste Daroussin switch (n->type) { 5277295610fSBaptiste Daroussin case ROFFT_BLOCK: 5287295610fSBaptiste Daroussin html_close_paragraph(h); 5297295610fSBaptiste Daroussin if ((h->oflags & HTML_TOC) == 0 || 5307295610fSBaptiste Daroussin h->flags & HTML_TOCDONE || 5317295610fSBaptiste Daroussin n->sec <= SEC_SYNOPSIS) { 5327295610fSBaptiste Daroussin print_otag(h, TAG_SECTION, "c", "Sh"); 5337295610fSBaptiste Daroussin break; 5347295610fSBaptiste Daroussin } 5357295610fSBaptiste Daroussin h->flags |= HTML_TOCDONE; 5367295610fSBaptiste Daroussin sc = 0; 5377295610fSBaptiste Daroussin for (sn = n->next; sn != NULL; sn = sn->next) 5387295610fSBaptiste Daroussin if (sn->sec == SEC_CUSTOM) 5397295610fSBaptiste Daroussin if (++sc == 2) 5407295610fSBaptiste Daroussin break; 5417295610fSBaptiste Daroussin if (sc < 2) 5427295610fSBaptiste Daroussin break; 543*c1c95addSBrooks Davis tnav = print_otag(h, TAG_NAV, "r", "doc-toc"); 544*c1c95addSBrooks Davis t = print_otag(h, TAG_H2, "c", "Sh"); 5457295610fSBaptiste Daroussin print_text(h, "TABLE OF CONTENTS"); 5467295610fSBaptiste Daroussin print_tagq(h, t); 5477295610fSBaptiste Daroussin t = print_otag(h, TAG_UL, "c", "Bl-compact"); 5487295610fSBaptiste Daroussin for (sn = n; sn != NULL; sn = sn->next) { 5497295610fSBaptiste Daroussin tsec = print_otag(h, TAG_LI, ""); 5507295610fSBaptiste Daroussin id = html_make_id(sn->head, 0); 5517295610fSBaptiste Daroussin tsub = print_otag(h, TAG_A, "hR", id); 5527295610fSBaptiste Daroussin free(id); 5537295610fSBaptiste Daroussin print_mdoc_nodelist(meta, sn->head->child, h); 5547295610fSBaptiste Daroussin print_tagq(h, tsub); 5557295610fSBaptiste Daroussin tsub = NULL; 5567295610fSBaptiste Daroussin for (subn = sn->body->child; subn != NULL; 5577295610fSBaptiste Daroussin subn = subn->next) { 5587295610fSBaptiste Daroussin if (subn->tok != MDOC_Ss) 5597295610fSBaptiste Daroussin continue; 5607295610fSBaptiste Daroussin id = html_make_id(subn->head, 0); 5617295610fSBaptiste Daroussin if (id == NULL) 5627295610fSBaptiste Daroussin continue; 5637295610fSBaptiste Daroussin if (tsub == NULL) 5647295610fSBaptiste Daroussin print_otag(h, TAG_UL, 5657295610fSBaptiste Daroussin "c", "Bl-compact"); 5667295610fSBaptiste Daroussin tsub = print_otag(h, TAG_LI, ""); 5677295610fSBaptiste Daroussin print_otag(h, TAG_A, "hR", id); 5687295610fSBaptiste Daroussin free(id); 5697295610fSBaptiste Daroussin print_mdoc_nodelist(meta, 5707295610fSBaptiste Daroussin subn->head->child, h); 5717295610fSBaptiste Daroussin print_tagq(h, tsub); 5727295610fSBaptiste Daroussin } 5737295610fSBaptiste Daroussin print_tagq(h, tsec); 5747295610fSBaptiste Daroussin } 575*c1c95addSBrooks Davis print_tagq(h, tnav); 5767295610fSBaptiste Daroussin print_otag(h, TAG_SECTION, "c", "Sh"); 5777295610fSBaptiste Daroussin break; 57861d06d6bSBaptiste Daroussin case ROFFT_HEAD: 579*c1c95addSBrooks Davis print_otag_id(h, TAG_H2, "Sh", n); 58061d06d6bSBaptiste Daroussin break; 58161d06d6bSBaptiste Daroussin case ROFFT_BODY: 58261d06d6bSBaptiste Daroussin if (n->sec == SEC_AUTHORS) 58361d06d6bSBaptiste Daroussin h->flags &= ~(HTML_SPLIT|HTML_NOSPLIT); 58461d06d6bSBaptiste Daroussin break; 58561d06d6bSBaptiste Daroussin default: 58661d06d6bSBaptiste Daroussin break; 58761d06d6bSBaptiste Daroussin } 58861d06d6bSBaptiste Daroussin return 1; 58961d06d6bSBaptiste Daroussin } 59061d06d6bSBaptiste Daroussin 59161d06d6bSBaptiste Daroussin static int 59261d06d6bSBaptiste Daroussin mdoc_ss_pre(MDOC_ARGS) 59361d06d6bSBaptiste Daroussin { 5947295610fSBaptiste Daroussin switch (n->type) { 5957295610fSBaptiste Daroussin case ROFFT_BLOCK: 5967295610fSBaptiste Daroussin html_close_paragraph(h); 5977295610fSBaptiste Daroussin print_otag(h, TAG_SECTION, "c", "Ss"); 5986d38604fSBaptiste Daroussin break; 5997295610fSBaptiste Daroussin case ROFFT_HEAD: 600*c1c95addSBrooks Davis print_otag_id(h, TAG_H3, "Ss", n); 6017295610fSBaptiste Daroussin break; 6027295610fSBaptiste Daroussin case ROFFT_BODY: 6036d38604fSBaptiste Daroussin break; 6047295610fSBaptiste Daroussin default: 6057295610fSBaptiste Daroussin abort(); 6067295610fSBaptiste Daroussin } 60761d06d6bSBaptiste Daroussin return 1; 60861d06d6bSBaptiste Daroussin } 60961d06d6bSBaptiste Daroussin 61061d06d6bSBaptiste Daroussin static int 61161d06d6bSBaptiste Daroussin mdoc_fl_pre(MDOC_ARGS) 61261d06d6bSBaptiste Daroussin { 6136d38604fSBaptiste Daroussin struct roff_node *nn; 61461d06d6bSBaptiste Daroussin 6156d38604fSBaptiste Daroussin print_otag_id(h, TAG_CODE, "Fl", n); 61661d06d6bSBaptiste Daroussin print_text(h, "\\-"); 6176d38604fSBaptiste Daroussin if (n->child != NULL || 6186d38604fSBaptiste Daroussin ((nn = roff_node_next(n)) != NULL && 6196d38604fSBaptiste Daroussin nn->type != ROFFT_TEXT && 6206d38604fSBaptiste Daroussin (nn->flags & NODE_LINE) == 0)) 62161d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 62261d06d6bSBaptiste Daroussin 62361d06d6bSBaptiste Daroussin return 1; 62461d06d6bSBaptiste Daroussin } 62561d06d6bSBaptiste Daroussin 62661d06d6bSBaptiste Daroussin static int 62761d06d6bSBaptiste Daroussin mdoc_nd_pre(MDOC_ARGS) 62861d06d6bSBaptiste Daroussin { 6297295610fSBaptiste Daroussin switch (n->type) { 6307295610fSBaptiste Daroussin case ROFFT_BLOCK: 63161d06d6bSBaptiste Daroussin return 1; 6327295610fSBaptiste Daroussin case ROFFT_HEAD: 6337295610fSBaptiste Daroussin return 0; 6347295610fSBaptiste Daroussin case ROFFT_BODY: 6357295610fSBaptiste Daroussin break; 6367295610fSBaptiste Daroussin default: 6377295610fSBaptiste Daroussin abort(); 6387295610fSBaptiste Daroussin } 63961d06d6bSBaptiste Daroussin print_text(h, "\\(em"); 640*c1c95addSBrooks Davis print_otag(h, TAG_SPAN, "cr", "Nd", "doc-subtitle"); 64161d06d6bSBaptiste Daroussin return 1; 64261d06d6bSBaptiste Daroussin } 64361d06d6bSBaptiste Daroussin 64461d06d6bSBaptiste Daroussin static int 64561d06d6bSBaptiste Daroussin mdoc_nm_pre(MDOC_ARGS) 64661d06d6bSBaptiste Daroussin { 64761d06d6bSBaptiste Daroussin switch (n->type) { 6487295610fSBaptiste Daroussin case ROFFT_BLOCK: 6497295610fSBaptiste Daroussin break; 65061d06d6bSBaptiste Daroussin case ROFFT_HEAD: 65161d06d6bSBaptiste Daroussin print_otag(h, TAG_TD, ""); 65261d06d6bSBaptiste Daroussin /* FALLTHROUGH */ 65361d06d6bSBaptiste Daroussin case ROFFT_ELEM: 6547295610fSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "Nm"); 65561d06d6bSBaptiste Daroussin return 1; 65661d06d6bSBaptiste Daroussin case ROFFT_BODY: 65761d06d6bSBaptiste Daroussin print_otag(h, TAG_TD, ""); 65861d06d6bSBaptiste Daroussin return 1; 65961d06d6bSBaptiste Daroussin default: 6607295610fSBaptiste Daroussin abort(); 66161d06d6bSBaptiste Daroussin } 6627295610fSBaptiste Daroussin html_close_paragraph(h); 66361d06d6bSBaptiste Daroussin synopsis_pre(h, n); 66461d06d6bSBaptiste Daroussin print_otag(h, TAG_TABLE, "c", "Nm"); 66561d06d6bSBaptiste Daroussin print_otag(h, TAG_TR, ""); 66661d06d6bSBaptiste Daroussin return 1; 66761d06d6bSBaptiste Daroussin } 66861d06d6bSBaptiste Daroussin 66961d06d6bSBaptiste Daroussin static int 67061d06d6bSBaptiste Daroussin mdoc_xr_pre(MDOC_ARGS) 67161d06d6bSBaptiste Daroussin { 672*c1c95addSBrooks Davis char *name, *section, *label; 673*c1c95addSBrooks Davis 674*c1c95addSBrooks Davis if (n->child == NULL) 67561d06d6bSBaptiste Daroussin return 0; 67661d06d6bSBaptiste Daroussin 677*c1c95addSBrooks Davis name = n->child->string; 678*c1c95addSBrooks Davis if (n->child->next != NULL) { 679*c1c95addSBrooks Davis section = n->child->next->string; 680*c1c95addSBrooks Davis mandoc_asprintf(&label, "%s, section %s", name, section); 681*c1c95addSBrooks Davis } else 682*c1c95addSBrooks Davis section = label = NULL; 683*c1c95addSBrooks Davis 6847295610fSBaptiste Daroussin if (h->base_man1) 685*c1c95addSBrooks Davis print_otag(h, TAG_A, "chM?", "Xr", 686*c1c95addSBrooks Davis name, section, "aria-label", label); 68761d06d6bSBaptiste Daroussin else 688*c1c95addSBrooks Davis print_otag(h, TAG_A, "c?", "Xr", "aria-label", label); 68961d06d6bSBaptiste Daroussin 690*c1c95addSBrooks Davis free(label); 691*c1c95addSBrooks Davis print_text(h, name); 69261d06d6bSBaptiste Daroussin 693*c1c95addSBrooks Davis if (section == NULL) 69461d06d6bSBaptiste Daroussin return 0; 69561d06d6bSBaptiste Daroussin 69661d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 69761d06d6bSBaptiste Daroussin print_text(h, "("); 69861d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 699*c1c95addSBrooks Davis print_text(h, section); 70061d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 70161d06d6bSBaptiste Daroussin print_text(h, ")"); 70261d06d6bSBaptiste Daroussin return 0; 70361d06d6bSBaptiste Daroussin } 70461d06d6bSBaptiste Daroussin 70561d06d6bSBaptiste Daroussin static int 7066d38604fSBaptiste Daroussin mdoc_tg_pre(MDOC_ARGS) 7076d38604fSBaptiste Daroussin { 7086d38604fSBaptiste Daroussin char *id; 7096d38604fSBaptiste Daroussin 7106d38604fSBaptiste Daroussin if ((id = html_make_id(n, 1)) != NULL) { 7116d38604fSBaptiste Daroussin print_tagq(h, print_otag(h, TAG_MARK, "i", id)); 7126d38604fSBaptiste Daroussin free(id); 7136d38604fSBaptiste Daroussin } 7146d38604fSBaptiste Daroussin return 0; 7156d38604fSBaptiste Daroussin } 7166d38604fSBaptiste Daroussin 7176d38604fSBaptiste Daroussin static int 71861d06d6bSBaptiste Daroussin mdoc_ns_pre(MDOC_ARGS) 71961d06d6bSBaptiste Daroussin { 72061d06d6bSBaptiste Daroussin 72161d06d6bSBaptiste Daroussin if ( ! (NODE_LINE & n->flags)) 72261d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 72361d06d6bSBaptiste Daroussin return 1; 72461d06d6bSBaptiste Daroussin } 72561d06d6bSBaptiste Daroussin 72661d06d6bSBaptiste Daroussin static int 72761d06d6bSBaptiste Daroussin mdoc_ar_pre(MDOC_ARGS) 72861d06d6bSBaptiste Daroussin { 7297295610fSBaptiste Daroussin print_otag(h, TAG_VAR, "c", "Ar"); 73061d06d6bSBaptiste Daroussin return 1; 73161d06d6bSBaptiste Daroussin } 73261d06d6bSBaptiste Daroussin 73361d06d6bSBaptiste Daroussin static int 73461d06d6bSBaptiste Daroussin mdoc_xx_pre(MDOC_ARGS) 73561d06d6bSBaptiste Daroussin { 73661d06d6bSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "Ux"); 73761d06d6bSBaptiste Daroussin return 1; 73861d06d6bSBaptiste Daroussin } 73961d06d6bSBaptiste Daroussin 74061d06d6bSBaptiste Daroussin static int 74161d06d6bSBaptiste Daroussin mdoc_it_pre(MDOC_ARGS) 74261d06d6bSBaptiste Daroussin { 74361d06d6bSBaptiste Daroussin const struct roff_node *bl; 74461d06d6bSBaptiste Daroussin enum mdoc_list type; 74561d06d6bSBaptiste Daroussin 74661d06d6bSBaptiste Daroussin bl = n->parent; 74761d06d6bSBaptiste Daroussin while (bl->tok != MDOC_Bl) 74861d06d6bSBaptiste Daroussin bl = bl->parent; 74961d06d6bSBaptiste Daroussin type = bl->norm->Bl.type; 75061d06d6bSBaptiste Daroussin 75161d06d6bSBaptiste Daroussin switch (type) { 75261d06d6bSBaptiste Daroussin case LIST_bullet: 75361d06d6bSBaptiste Daroussin case LIST_dash: 75461d06d6bSBaptiste Daroussin case LIST_hyphen: 75561d06d6bSBaptiste Daroussin case LIST_item: 75661d06d6bSBaptiste Daroussin case LIST_enum: 75761d06d6bSBaptiste Daroussin switch (n->type) { 75861d06d6bSBaptiste Daroussin case ROFFT_HEAD: 75961d06d6bSBaptiste Daroussin return 0; 76061d06d6bSBaptiste Daroussin case ROFFT_BODY: 7616d38604fSBaptiste Daroussin print_otag_id(h, TAG_LI, NULL, n); 76261d06d6bSBaptiste Daroussin break; 76361d06d6bSBaptiste Daroussin default: 76461d06d6bSBaptiste Daroussin break; 76561d06d6bSBaptiste Daroussin } 76661d06d6bSBaptiste Daroussin break; 76761d06d6bSBaptiste Daroussin case LIST_diag: 76861d06d6bSBaptiste Daroussin case LIST_hang: 76961d06d6bSBaptiste Daroussin case LIST_inset: 77061d06d6bSBaptiste Daroussin case LIST_ohang: 77161d06d6bSBaptiste Daroussin switch (n->type) { 77261d06d6bSBaptiste Daroussin case ROFFT_HEAD: 7736d38604fSBaptiste Daroussin print_otag_id(h, TAG_DT, NULL, n); 77461d06d6bSBaptiste Daroussin break; 77561d06d6bSBaptiste Daroussin case ROFFT_BODY: 77661d06d6bSBaptiste Daroussin print_otag(h, TAG_DD, ""); 77761d06d6bSBaptiste Daroussin break; 77861d06d6bSBaptiste Daroussin default: 77961d06d6bSBaptiste Daroussin break; 78061d06d6bSBaptiste Daroussin } 78161d06d6bSBaptiste Daroussin break; 78261d06d6bSBaptiste Daroussin case LIST_tag: 78361d06d6bSBaptiste Daroussin switch (n->type) { 78461d06d6bSBaptiste Daroussin case ROFFT_HEAD: 7856d38604fSBaptiste Daroussin print_otag_id(h, TAG_DT, NULL, n); 78661d06d6bSBaptiste Daroussin break; 78761d06d6bSBaptiste Daroussin case ROFFT_BODY: 78861d06d6bSBaptiste Daroussin if (n->child == NULL) { 78961d06d6bSBaptiste Daroussin print_otag(h, TAG_DD, "s", "width", "auto"); 79061d06d6bSBaptiste Daroussin print_text(h, "\\ "); 79161d06d6bSBaptiste Daroussin } else 79261d06d6bSBaptiste Daroussin print_otag(h, TAG_DD, ""); 79361d06d6bSBaptiste Daroussin break; 79461d06d6bSBaptiste Daroussin default: 79561d06d6bSBaptiste Daroussin break; 79661d06d6bSBaptiste Daroussin } 79761d06d6bSBaptiste Daroussin break; 79861d06d6bSBaptiste Daroussin case LIST_column: 79961d06d6bSBaptiste Daroussin switch (n->type) { 80061d06d6bSBaptiste Daroussin case ROFFT_HEAD: 80161d06d6bSBaptiste Daroussin break; 80261d06d6bSBaptiste Daroussin case ROFFT_BODY: 80361d06d6bSBaptiste Daroussin print_otag(h, TAG_TD, ""); 80461d06d6bSBaptiste Daroussin break; 80561d06d6bSBaptiste Daroussin default: 8066d38604fSBaptiste Daroussin print_otag_id(h, TAG_TR, NULL, n); 80761d06d6bSBaptiste Daroussin } 80861d06d6bSBaptiste Daroussin default: 80961d06d6bSBaptiste Daroussin break; 81061d06d6bSBaptiste Daroussin } 81161d06d6bSBaptiste Daroussin 81261d06d6bSBaptiste Daroussin return 1; 81361d06d6bSBaptiste Daroussin } 81461d06d6bSBaptiste Daroussin 81561d06d6bSBaptiste Daroussin static int 81661d06d6bSBaptiste Daroussin mdoc_bl_pre(MDOC_ARGS) 81761d06d6bSBaptiste Daroussin { 8187295610fSBaptiste Daroussin char cattr[32]; 81961d06d6bSBaptiste Daroussin struct mdoc_bl *bl; 82061d06d6bSBaptiste Daroussin enum htmltag elemtype; 82161d06d6bSBaptiste Daroussin 82261d06d6bSBaptiste Daroussin switch (n->type) { 8237295610fSBaptiste Daroussin case ROFFT_BLOCK: 8247295610fSBaptiste Daroussin html_close_paragraph(h); 8257295610fSBaptiste Daroussin break; 82661d06d6bSBaptiste Daroussin case ROFFT_HEAD: 82761d06d6bSBaptiste Daroussin return 0; 8287295610fSBaptiste Daroussin case ROFFT_BODY: 8297295610fSBaptiste Daroussin return 1; 83061d06d6bSBaptiste Daroussin default: 8317295610fSBaptiste Daroussin abort(); 83261d06d6bSBaptiste Daroussin } 83361d06d6bSBaptiste Daroussin 83461d06d6bSBaptiste Daroussin bl = &n->norm->Bl; 83561d06d6bSBaptiste Daroussin switch (bl->type) { 83661d06d6bSBaptiste Daroussin case LIST_bullet: 83761d06d6bSBaptiste Daroussin elemtype = TAG_UL; 83861d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-bullet", sizeof(cattr)); 83961d06d6bSBaptiste Daroussin break; 84061d06d6bSBaptiste Daroussin case LIST_dash: 84161d06d6bSBaptiste Daroussin case LIST_hyphen: 84261d06d6bSBaptiste Daroussin elemtype = TAG_UL; 84361d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-dash", sizeof(cattr)); 84461d06d6bSBaptiste Daroussin break; 84561d06d6bSBaptiste Daroussin case LIST_item: 84661d06d6bSBaptiste Daroussin elemtype = TAG_UL; 84761d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-item", sizeof(cattr)); 84861d06d6bSBaptiste Daroussin break; 84961d06d6bSBaptiste Daroussin case LIST_enum: 85061d06d6bSBaptiste Daroussin elemtype = TAG_OL; 85161d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-enum", sizeof(cattr)); 85261d06d6bSBaptiste Daroussin break; 85361d06d6bSBaptiste Daroussin case LIST_diag: 85461d06d6bSBaptiste Daroussin elemtype = TAG_DL; 85561d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-diag", sizeof(cattr)); 85661d06d6bSBaptiste Daroussin break; 85761d06d6bSBaptiste Daroussin case LIST_hang: 85861d06d6bSBaptiste Daroussin elemtype = TAG_DL; 85961d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-hang", sizeof(cattr)); 86061d06d6bSBaptiste Daroussin break; 86161d06d6bSBaptiste Daroussin case LIST_inset: 86261d06d6bSBaptiste Daroussin elemtype = TAG_DL; 86361d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-inset", sizeof(cattr)); 86461d06d6bSBaptiste Daroussin break; 86561d06d6bSBaptiste Daroussin case LIST_ohang: 86661d06d6bSBaptiste Daroussin elemtype = TAG_DL; 86761d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-ohang", sizeof(cattr)); 86861d06d6bSBaptiste Daroussin break; 86961d06d6bSBaptiste Daroussin case LIST_tag: 87061d06d6bSBaptiste Daroussin if (bl->offs) 87161d06d6bSBaptiste Daroussin print_otag(h, TAG_DIV, "c", "Bd-indent"); 8726d38604fSBaptiste Daroussin print_otag_id(h, TAG_DL, 8736d38604fSBaptiste Daroussin bl->comp ? "Bl-tag Bl-compact" : "Bl-tag", n->body); 87461d06d6bSBaptiste Daroussin return 1; 87561d06d6bSBaptiste Daroussin case LIST_column: 87661d06d6bSBaptiste Daroussin elemtype = TAG_TABLE; 87761d06d6bSBaptiste Daroussin (void)strlcpy(cattr, "Bl-column", sizeof(cattr)); 87861d06d6bSBaptiste Daroussin break; 87961d06d6bSBaptiste Daroussin default: 88061d06d6bSBaptiste Daroussin abort(); 88161d06d6bSBaptiste Daroussin } 88261d06d6bSBaptiste Daroussin if (bl->offs != NULL) 88361d06d6bSBaptiste Daroussin (void)strlcat(cattr, " Bd-indent", sizeof(cattr)); 88461d06d6bSBaptiste Daroussin if (bl->comp) 88561d06d6bSBaptiste Daroussin (void)strlcat(cattr, " Bl-compact", sizeof(cattr)); 8866d38604fSBaptiste Daroussin print_otag_id(h, elemtype, cattr, n->body); 88761d06d6bSBaptiste Daroussin return 1; 88861d06d6bSBaptiste Daroussin } 88961d06d6bSBaptiste Daroussin 89061d06d6bSBaptiste Daroussin static int 89161d06d6bSBaptiste Daroussin mdoc_ex_pre(MDOC_ARGS) 89261d06d6bSBaptiste Daroussin { 8936d38604fSBaptiste Daroussin if (roff_node_prev(n) != NULL) 89461d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 89561d06d6bSBaptiste Daroussin return 1; 89661d06d6bSBaptiste Daroussin } 89761d06d6bSBaptiste Daroussin 89861d06d6bSBaptiste Daroussin static int 89961d06d6bSBaptiste Daroussin mdoc_st_pre(MDOC_ARGS) 90061d06d6bSBaptiste Daroussin { 9017295610fSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "St"); 90261d06d6bSBaptiste Daroussin return 1; 90361d06d6bSBaptiste Daroussin } 90461d06d6bSBaptiste Daroussin 90561d06d6bSBaptiste Daroussin static int 90661d06d6bSBaptiste Daroussin mdoc_em_pre(MDOC_ARGS) 90761d06d6bSBaptiste Daroussin { 9086d38604fSBaptiste Daroussin print_otag_id(h, TAG_I, "Em", n); 90961d06d6bSBaptiste Daroussin return 1; 91061d06d6bSBaptiste Daroussin } 91161d06d6bSBaptiste Daroussin 91261d06d6bSBaptiste Daroussin static int 91361d06d6bSBaptiste Daroussin mdoc_d1_pre(MDOC_ARGS) 91461d06d6bSBaptiste Daroussin { 9157295610fSBaptiste Daroussin switch (n->type) { 9167295610fSBaptiste Daroussin case ROFFT_BLOCK: 9177295610fSBaptiste Daroussin html_close_paragraph(h); 9186d38604fSBaptiste Daroussin return 1; 9197295610fSBaptiste Daroussin case ROFFT_HEAD: 9207295610fSBaptiste Daroussin return 0; 9217295610fSBaptiste Daroussin case ROFFT_BODY: 9226d38604fSBaptiste Daroussin break; 9237295610fSBaptiste Daroussin default: 9247295610fSBaptiste Daroussin abort(); 9257295610fSBaptiste Daroussin } 9266d38604fSBaptiste Daroussin print_otag_id(h, TAG_DIV, "Bd Bd-indent", n); 92761d06d6bSBaptiste Daroussin if (n->tok == MDOC_Dl) 92861d06d6bSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "Li"); 92961d06d6bSBaptiste Daroussin return 1; 93061d06d6bSBaptiste Daroussin } 93161d06d6bSBaptiste Daroussin 93261d06d6bSBaptiste Daroussin static int 93361d06d6bSBaptiste Daroussin mdoc_sx_pre(MDOC_ARGS) 93461d06d6bSBaptiste Daroussin { 93561d06d6bSBaptiste Daroussin char *id; 93661d06d6bSBaptiste Daroussin 93761d06d6bSBaptiste Daroussin id = html_make_id(n, 0); 9387295610fSBaptiste Daroussin print_otag(h, TAG_A, "chR", "Sx", id); 93961d06d6bSBaptiste Daroussin free(id); 94061d06d6bSBaptiste Daroussin return 1; 94161d06d6bSBaptiste Daroussin } 94261d06d6bSBaptiste Daroussin 94361d06d6bSBaptiste Daroussin static int 94461d06d6bSBaptiste Daroussin mdoc_bd_pre(MDOC_ARGS) 94561d06d6bSBaptiste Daroussin { 9466d38604fSBaptiste Daroussin char buf[20]; 94761d06d6bSBaptiste Daroussin struct roff_node *nn; 9487295610fSBaptiste Daroussin int comp; 94961d06d6bSBaptiste Daroussin 9507295610fSBaptiste Daroussin switch (n->type) { 9517295610fSBaptiste Daroussin case ROFFT_BLOCK: 9527295610fSBaptiste Daroussin html_close_paragraph(h); 9537295610fSBaptiste Daroussin return 1; 9547295610fSBaptiste Daroussin case ROFFT_HEAD: 95561d06d6bSBaptiste Daroussin return 0; 9567295610fSBaptiste Daroussin case ROFFT_BODY: 9577295610fSBaptiste Daroussin break; 9587295610fSBaptiste Daroussin default: 9597295610fSBaptiste Daroussin abort(); 9607295610fSBaptiste Daroussin } 96161d06d6bSBaptiste Daroussin 9627295610fSBaptiste Daroussin /* Handle preceding whitespace. */ 9637295610fSBaptiste Daroussin 96461d06d6bSBaptiste Daroussin comp = n->norm->Bd.comp; 9657295610fSBaptiste Daroussin for (nn = n; nn != NULL && comp == 0; nn = nn->parent) { 96661d06d6bSBaptiste Daroussin if (nn->type != ROFFT_BLOCK) 96761d06d6bSBaptiste Daroussin continue; 9687295610fSBaptiste Daroussin if (nn->tok == MDOC_Sh || nn->tok == MDOC_Ss) 96961d06d6bSBaptiste Daroussin comp = 1; 9706d38604fSBaptiste Daroussin if (roff_node_prev(nn) != NULL) 97161d06d6bSBaptiste Daroussin break; 97261d06d6bSBaptiste Daroussin } 9737295610fSBaptiste Daroussin (void)strlcpy(buf, "Bd", sizeof(buf)); 9747295610fSBaptiste Daroussin if (comp == 0) 9757295610fSBaptiste Daroussin (void)strlcat(buf, " Pp", sizeof(buf)); 97661d06d6bSBaptiste Daroussin 97761d06d6bSBaptiste Daroussin /* Handle the -offset argument. */ 97861d06d6bSBaptiste Daroussin 9797295610fSBaptiste Daroussin if (n->norm->Bd.offs != NULL && 9807295610fSBaptiste Daroussin strcmp(n->norm->Bd.offs, "left") != 0) 9817295610fSBaptiste Daroussin (void)strlcat(buf, " Bd-indent", sizeof(buf)); 98261d06d6bSBaptiste Daroussin 9836d38604fSBaptiste Daroussin if (n->norm->Bd.type == DISP_literal) 9846d38604fSBaptiste Daroussin (void)strlcat(buf, " Li", sizeof(buf)); 9856d38604fSBaptiste Daroussin 9866d38604fSBaptiste Daroussin print_otag_id(h, TAG_DIV, buf, n); 98761d06d6bSBaptiste Daroussin return 1; 98861d06d6bSBaptiste Daroussin } 98961d06d6bSBaptiste Daroussin 99061d06d6bSBaptiste Daroussin static int 99161d06d6bSBaptiste Daroussin mdoc_pa_pre(MDOC_ARGS) 99261d06d6bSBaptiste Daroussin { 9937295610fSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "Pa"); 99461d06d6bSBaptiste Daroussin return 1; 99561d06d6bSBaptiste Daroussin } 99661d06d6bSBaptiste Daroussin 99761d06d6bSBaptiste Daroussin static int 99861d06d6bSBaptiste Daroussin mdoc_ad_pre(MDOC_ARGS) 99961d06d6bSBaptiste Daroussin { 100061d06d6bSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "Ad"); 100161d06d6bSBaptiste Daroussin return 1; 100261d06d6bSBaptiste Daroussin } 100361d06d6bSBaptiste Daroussin 100461d06d6bSBaptiste Daroussin static int 100561d06d6bSBaptiste Daroussin mdoc_an_pre(MDOC_ARGS) 100661d06d6bSBaptiste Daroussin { 100761d06d6bSBaptiste Daroussin if (n->norm->An.auth == AUTH_split) { 100861d06d6bSBaptiste Daroussin h->flags &= ~HTML_NOSPLIT; 100961d06d6bSBaptiste Daroussin h->flags |= HTML_SPLIT; 101061d06d6bSBaptiste Daroussin return 0; 101161d06d6bSBaptiste Daroussin } 101261d06d6bSBaptiste Daroussin if (n->norm->An.auth == AUTH_nosplit) { 101361d06d6bSBaptiste Daroussin h->flags &= ~HTML_SPLIT; 101461d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPLIT; 101561d06d6bSBaptiste Daroussin return 0; 101661d06d6bSBaptiste Daroussin } 101761d06d6bSBaptiste Daroussin 101861d06d6bSBaptiste Daroussin if (h->flags & HTML_SPLIT) 101961d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 102061d06d6bSBaptiste Daroussin 102161d06d6bSBaptiste Daroussin if (n->sec == SEC_AUTHORS && ! (h->flags & HTML_NOSPLIT)) 102261d06d6bSBaptiste Daroussin h->flags |= HTML_SPLIT; 102361d06d6bSBaptiste Daroussin 10247295610fSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "An"); 102561d06d6bSBaptiste Daroussin return 1; 102661d06d6bSBaptiste Daroussin } 102761d06d6bSBaptiste Daroussin 102861d06d6bSBaptiste Daroussin static int 102961d06d6bSBaptiste Daroussin mdoc_cd_pre(MDOC_ARGS) 103061d06d6bSBaptiste Daroussin { 103161d06d6bSBaptiste Daroussin synopsis_pre(h, n); 10327295610fSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "Cd"); 103361d06d6bSBaptiste Daroussin return 1; 103461d06d6bSBaptiste Daroussin } 103561d06d6bSBaptiste Daroussin 103661d06d6bSBaptiste Daroussin static int 103761d06d6bSBaptiste Daroussin mdoc_fa_pre(MDOC_ARGS) 103861d06d6bSBaptiste Daroussin { 103961d06d6bSBaptiste Daroussin const struct roff_node *nn; 104061d06d6bSBaptiste Daroussin struct tag *t; 104161d06d6bSBaptiste Daroussin 104261d06d6bSBaptiste Daroussin if (n->parent->tok != MDOC_Fo) { 10437295610fSBaptiste Daroussin print_otag(h, TAG_VAR, "c", "Fa"); 104461d06d6bSBaptiste Daroussin return 1; 104561d06d6bSBaptiste Daroussin } 10466d38604fSBaptiste Daroussin for (nn = n->child; nn != NULL; nn = nn->next) { 10477295610fSBaptiste Daroussin t = print_otag(h, TAG_VAR, "c", "Fa"); 104861d06d6bSBaptiste Daroussin print_text(h, nn->string); 104961d06d6bSBaptiste Daroussin print_tagq(h, t); 10506d38604fSBaptiste Daroussin if (nn->next != NULL) { 105161d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 105261d06d6bSBaptiste Daroussin print_text(h, ","); 105361d06d6bSBaptiste Daroussin } 105461d06d6bSBaptiste Daroussin } 10556d38604fSBaptiste Daroussin if (n->child != NULL && 10566d38604fSBaptiste Daroussin (nn = roff_node_next(n)) != NULL && 10576d38604fSBaptiste Daroussin nn->tok == MDOC_Fa) { 105861d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 105961d06d6bSBaptiste Daroussin print_text(h, ","); 106061d06d6bSBaptiste Daroussin } 106161d06d6bSBaptiste Daroussin return 0; 106261d06d6bSBaptiste Daroussin } 106361d06d6bSBaptiste Daroussin 106461d06d6bSBaptiste Daroussin static int 106561d06d6bSBaptiste Daroussin mdoc_fd_pre(MDOC_ARGS) 106661d06d6bSBaptiste Daroussin { 106761d06d6bSBaptiste Daroussin struct tag *t; 106861d06d6bSBaptiste Daroussin char *buf, *cp; 106961d06d6bSBaptiste Daroussin 107061d06d6bSBaptiste Daroussin synopsis_pre(h, n); 107161d06d6bSBaptiste Daroussin 107261d06d6bSBaptiste Daroussin if (NULL == (n = n->child)) 107361d06d6bSBaptiste Daroussin return 0; 107461d06d6bSBaptiste Daroussin 107561d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 107661d06d6bSBaptiste Daroussin 107761d06d6bSBaptiste Daroussin if (strcmp(n->string, "#include")) { 10787295610fSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "Fd"); 107961d06d6bSBaptiste Daroussin return 1; 108061d06d6bSBaptiste Daroussin } 108161d06d6bSBaptiste Daroussin 10827295610fSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "In"); 108361d06d6bSBaptiste Daroussin print_text(h, n->string); 108461d06d6bSBaptiste Daroussin 108561d06d6bSBaptiste Daroussin if (NULL != (n = n->next)) { 108661d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 108761d06d6bSBaptiste Daroussin 108861d06d6bSBaptiste Daroussin if (h->base_includes) { 108961d06d6bSBaptiste Daroussin cp = n->string; 109061d06d6bSBaptiste Daroussin if (*cp == '<' || *cp == '"') 109161d06d6bSBaptiste Daroussin cp++; 109261d06d6bSBaptiste Daroussin buf = mandoc_strdup(cp); 109361d06d6bSBaptiste Daroussin cp = strchr(buf, '\0') - 1; 109461d06d6bSBaptiste Daroussin if (cp >= buf && (*cp == '>' || *cp == '"')) 109561d06d6bSBaptiste Daroussin *cp = '\0'; 10967295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "chI", "In", buf); 109761d06d6bSBaptiste Daroussin free(buf); 109861d06d6bSBaptiste Daroussin } else 10997295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "c", "In"); 110061d06d6bSBaptiste Daroussin 110161d06d6bSBaptiste Daroussin print_text(h, n->string); 110261d06d6bSBaptiste Daroussin print_tagq(h, t); 110361d06d6bSBaptiste Daroussin 110461d06d6bSBaptiste Daroussin n = n->next; 110561d06d6bSBaptiste Daroussin } 110661d06d6bSBaptiste Daroussin 110761d06d6bSBaptiste Daroussin for ( ; n; n = n->next) { 110861d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 110961d06d6bSBaptiste Daroussin print_text(h, n->string); 111061d06d6bSBaptiste Daroussin } 111161d06d6bSBaptiste Daroussin 111261d06d6bSBaptiste Daroussin return 0; 111361d06d6bSBaptiste Daroussin } 111461d06d6bSBaptiste Daroussin 111561d06d6bSBaptiste Daroussin static int 111661d06d6bSBaptiste Daroussin mdoc_vt_pre(MDOC_ARGS) 111761d06d6bSBaptiste Daroussin { 111861d06d6bSBaptiste Daroussin if (n->type == ROFFT_BLOCK) { 111961d06d6bSBaptiste Daroussin synopsis_pre(h, n); 112061d06d6bSBaptiste Daroussin return 1; 112161d06d6bSBaptiste Daroussin } else if (n->type == ROFFT_ELEM) { 112261d06d6bSBaptiste Daroussin synopsis_pre(h, n); 112361d06d6bSBaptiste Daroussin } else if (n->type == ROFFT_HEAD) 112461d06d6bSBaptiste Daroussin return 0; 112561d06d6bSBaptiste Daroussin 11267295610fSBaptiste Daroussin print_otag(h, TAG_VAR, "c", "Vt"); 112761d06d6bSBaptiste Daroussin return 1; 112861d06d6bSBaptiste Daroussin } 112961d06d6bSBaptiste Daroussin 113061d06d6bSBaptiste Daroussin static int 113161d06d6bSBaptiste Daroussin mdoc_ft_pre(MDOC_ARGS) 113261d06d6bSBaptiste Daroussin { 113361d06d6bSBaptiste Daroussin synopsis_pre(h, n); 11347295610fSBaptiste Daroussin print_otag(h, TAG_VAR, "c", "Ft"); 113561d06d6bSBaptiste Daroussin return 1; 113661d06d6bSBaptiste Daroussin } 113761d06d6bSBaptiste Daroussin 113861d06d6bSBaptiste Daroussin static int 113961d06d6bSBaptiste Daroussin mdoc_fn_pre(MDOC_ARGS) 114061d06d6bSBaptiste Daroussin { 114161d06d6bSBaptiste Daroussin struct tag *t; 114261d06d6bSBaptiste Daroussin char nbuf[BUFSIZ]; 114361d06d6bSBaptiste Daroussin const char *sp, *ep; 114461d06d6bSBaptiste Daroussin int sz, pretty; 114561d06d6bSBaptiste Daroussin 114661d06d6bSBaptiste Daroussin pretty = NODE_SYNPRETTY & n->flags; 114761d06d6bSBaptiste Daroussin synopsis_pre(h, n); 114861d06d6bSBaptiste Daroussin 114961d06d6bSBaptiste Daroussin /* Split apart into type and name. */ 115061d06d6bSBaptiste Daroussin assert(n->child->string); 115161d06d6bSBaptiste Daroussin sp = n->child->string; 115261d06d6bSBaptiste Daroussin 115361d06d6bSBaptiste Daroussin ep = strchr(sp, ' '); 115461d06d6bSBaptiste Daroussin if (NULL != ep) { 11557295610fSBaptiste Daroussin t = print_otag(h, TAG_VAR, "c", "Ft"); 115661d06d6bSBaptiste Daroussin 115761d06d6bSBaptiste Daroussin while (ep) { 115861d06d6bSBaptiste Daroussin sz = MIN((int)(ep - sp), BUFSIZ - 1); 115961d06d6bSBaptiste Daroussin (void)memcpy(nbuf, sp, (size_t)sz); 116061d06d6bSBaptiste Daroussin nbuf[sz] = '\0'; 116161d06d6bSBaptiste Daroussin print_text(h, nbuf); 116261d06d6bSBaptiste Daroussin sp = ++ep; 116361d06d6bSBaptiste Daroussin ep = strchr(sp, ' '); 116461d06d6bSBaptiste Daroussin } 116561d06d6bSBaptiste Daroussin print_tagq(h, t); 116661d06d6bSBaptiste Daroussin } 116761d06d6bSBaptiste Daroussin 11686d38604fSBaptiste Daroussin t = print_otag_id(h, TAG_CODE, "Fn", n); 116961d06d6bSBaptiste Daroussin 117061d06d6bSBaptiste Daroussin if (sp) 117161d06d6bSBaptiste Daroussin print_text(h, sp); 117261d06d6bSBaptiste Daroussin 117361d06d6bSBaptiste Daroussin print_tagq(h, t); 117461d06d6bSBaptiste Daroussin 117561d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 117661d06d6bSBaptiste Daroussin print_text(h, "("); 117761d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 117861d06d6bSBaptiste Daroussin 117961d06d6bSBaptiste Daroussin for (n = n->child->next; n; n = n->next) { 118061d06d6bSBaptiste Daroussin if (NODE_SYNPRETTY & n->flags) 11817295610fSBaptiste Daroussin t = print_otag(h, TAG_VAR, "cs", "Fa", 118261d06d6bSBaptiste Daroussin "white-space", "nowrap"); 118361d06d6bSBaptiste Daroussin else 11847295610fSBaptiste Daroussin t = print_otag(h, TAG_VAR, "c", "Fa"); 118561d06d6bSBaptiste Daroussin print_text(h, n->string); 118661d06d6bSBaptiste Daroussin print_tagq(h, t); 118761d06d6bSBaptiste Daroussin if (n->next) { 118861d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 118961d06d6bSBaptiste Daroussin print_text(h, ","); 119061d06d6bSBaptiste Daroussin } 119161d06d6bSBaptiste Daroussin } 119261d06d6bSBaptiste Daroussin 119361d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 119461d06d6bSBaptiste Daroussin print_text(h, ")"); 119561d06d6bSBaptiste Daroussin 119661d06d6bSBaptiste Daroussin if (pretty) { 119761d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 119861d06d6bSBaptiste Daroussin print_text(h, ";"); 119961d06d6bSBaptiste Daroussin } 120061d06d6bSBaptiste Daroussin 120161d06d6bSBaptiste Daroussin return 0; 120261d06d6bSBaptiste Daroussin } 120361d06d6bSBaptiste Daroussin 120461d06d6bSBaptiste Daroussin static int 120561d06d6bSBaptiste Daroussin mdoc_sm_pre(MDOC_ARGS) 120661d06d6bSBaptiste Daroussin { 120761d06d6bSBaptiste Daroussin 120861d06d6bSBaptiste Daroussin if (NULL == n->child) 120961d06d6bSBaptiste Daroussin h->flags ^= HTML_NONOSPACE; 121061d06d6bSBaptiste Daroussin else if (0 == strcmp("on", n->child->string)) 121161d06d6bSBaptiste Daroussin h->flags &= ~HTML_NONOSPACE; 121261d06d6bSBaptiste Daroussin else 121361d06d6bSBaptiste Daroussin h->flags |= HTML_NONOSPACE; 121461d06d6bSBaptiste Daroussin 121561d06d6bSBaptiste Daroussin if ( ! (HTML_NONOSPACE & h->flags)) 121661d06d6bSBaptiste Daroussin h->flags &= ~HTML_NOSPACE; 121761d06d6bSBaptiste Daroussin 121861d06d6bSBaptiste Daroussin return 0; 121961d06d6bSBaptiste Daroussin } 122061d06d6bSBaptiste Daroussin 122161d06d6bSBaptiste Daroussin static int 122261d06d6bSBaptiste Daroussin mdoc_skip_pre(MDOC_ARGS) 122361d06d6bSBaptiste Daroussin { 122461d06d6bSBaptiste Daroussin 122561d06d6bSBaptiste Daroussin return 0; 122661d06d6bSBaptiste Daroussin } 122761d06d6bSBaptiste Daroussin 122861d06d6bSBaptiste Daroussin static int 122961d06d6bSBaptiste Daroussin mdoc_pp_pre(MDOC_ARGS) 123061d06d6bSBaptiste Daroussin { 12316d38604fSBaptiste Daroussin char *id; 12326d38604fSBaptiste Daroussin 12336d38604fSBaptiste Daroussin if (n->flags & NODE_NOFILL) { 12346d38604fSBaptiste Daroussin print_endline(h); 12356d38604fSBaptiste Daroussin if (n->flags & NODE_ID) 12366d38604fSBaptiste Daroussin mdoc_tg_pre(meta, n, h); 12376d38604fSBaptiste Daroussin else { 12386d38604fSBaptiste Daroussin h->col = 1; 12396d38604fSBaptiste Daroussin print_endline(h); 12406d38604fSBaptiste Daroussin } 12416d38604fSBaptiste Daroussin } else { 12427295610fSBaptiste Daroussin html_close_paragraph(h); 12436d38604fSBaptiste Daroussin id = n->flags & NODE_ID ? html_make_id(n, 1) : NULL; 12446d38604fSBaptiste Daroussin print_otag(h, TAG_P, "ci", "Pp", id); 12456d38604fSBaptiste Daroussin free(id); 12467295610fSBaptiste Daroussin } 124761d06d6bSBaptiste Daroussin return 0; 124861d06d6bSBaptiste Daroussin } 124961d06d6bSBaptiste Daroussin 125061d06d6bSBaptiste Daroussin static int 125161d06d6bSBaptiste Daroussin mdoc_lk_pre(MDOC_ARGS) 125261d06d6bSBaptiste Daroussin { 125361d06d6bSBaptiste Daroussin const struct roff_node *link, *descr, *punct; 125461d06d6bSBaptiste Daroussin struct tag *t; 125561d06d6bSBaptiste Daroussin 125661d06d6bSBaptiste Daroussin if ((link = n->child) == NULL) 125761d06d6bSBaptiste Daroussin return 0; 125861d06d6bSBaptiste Daroussin 125961d06d6bSBaptiste Daroussin /* Find beginning of trailing punctuation. */ 126061d06d6bSBaptiste Daroussin punct = n->last; 126161d06d6bSBaptiste Daroussin while (punct != link && punct->flags & NODE_DELIMC) 126261d06d6bSBaptiste Daroussin punct = punct->prev; 126361d06d6bSBaptiste Daroussin punct = punct->next; 126461d06d6bSBaptiste Daroussin 126561d06d6bSBaptiste Daroussin /* Link target and link text. */ 126661d06d6bSBaptiste Daroussin descr = link->next; 126761d06d6bSBaptiste Daroussin if (descr == punct) 126861d06d6bSBaptiste Daroussin descr = link; /* no text */ 12697295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "ch", "Lk", link->string); 127061d06d6bSBaptiste Daroussin do { 127161d06d6bSBaptiste Daroussin if (descr->flags & (NODE_DELIMC | NODE_DELIMO)) 127261d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 127361d06d6bSBaptiste Daroussin print_text(h, descr->string); 127461d06d6bSBaptiste Daroussin descr = descr->next; 127561d06d6bSBaptiste Daroussin } while (descr != punct); 127661d06d6bSBaptiste Daroussin print_tagq(h, t); 127761d06d6bSBaptiste Daroussin 127861d06d6bSBaptiste Daroussin /* Trailing punctuation. */ 127961d06d6bSBaptiste Daroussin while (punct != NULL) { 128061d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 128161d06d6bSBaptiste Daroussin print_text(h, punct->string); 128261d06d6bSBaptiste Daroussin punct = punct->next; 128361d06d6bSBaptiste Daroussin } 128461d06d6bSBaptiste Daroussin return 0; 128561d06d6bSBaptiste Daroussin } 128661d06d6bSBaptiste Daroussin 128761d06d6bSBaptiste Daroussin static int 128861d06d6bSBaptiste Daroussin mdoc_mt_pre(MDOC_ARGS) 128961d06d6bSBaptiste Daroussin { 129061d06d6bSBaptiste Daroussin struct tag *t; 129161d06d6bSBaptiste Daroussin char *cp; 129261d06d6bSBaptiste Daroussin 129361d06d6bSBaptiste Daroussin for (n = n->child; n; n = n->next) { 129461d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 129561d06d6bSBaptiste Daroussin mandoc_asprintf(&cp, "mailto:%s", n->string); 12967295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "ch", "Mt", cp); 129761d06d6bSBaptiste Daroussin print_text(h, n->string); 129861d06d6bSBaptiste Daroussin print_tagq(h, t); 129961d06d6bSBaptiste Daroussin free(cp); 130061d06d6bSBaptiste Daroussin } 130161d06d6bSBaptiste Daroussin return 0; 130261d06d6bSBaptiste Daroussin } 130361d06d6bSBaptiste Daroussin 130461d06d6bSBaptiste Daroussin static int 130561d06d6bSBaptiste Daroussin mdoc_fo_pre(MDOC_ARGS) 130661d06d6bSBaptiste Daroussin { 130761d06d6bSBaptiste Daroussin struct tag *t; 130861d06d6bSBaptiste Daroussin 13096d38604fSBaptiste Daroussin switch (n->type) { 13106d38604fSBaptiste Daroussin case ROFFT_BLOCK: 13116d38604fSBaptiste Daroussin synopsis_pre(h, n); 13126d38604fSBaptiste Daroussin return 1; 13136d38604fSBaptiste Daroussin case ROFFT_HEAD: 13146d38604fSBaptiste Daroussin if (n->child != NULL) { 13156d38604fSBaptiste Daroussin t = print_otag_id(h, TAG_CODE, "Fn", n); 13166d38604fSBaptiste Daroussin print_text(h, n->child->string); 13176d38604fSBaptiste Daroussin print_tagq(h, t); 13186d38604fSBaptiste Daroussin } 13196d38604fSBaptiste Daroussin return 0; 13206d38604fSBaptiste Daroussin case ROFFT_BODY: 132161d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 132261d06d6bSBaptiste Daroussin print_text(h, "("); 132361d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 132461d06d6bSBaptiste Daroussin return 1; 13256d38604fSBaptiste Daroussin default: 13266d38604fSBaptiste Daroussin abort(); 132761d06d6bSBaptiste Daroussin } 132861d06d6bSBaptiste Daroussin } 132961d06d6bSBaptiste Daroussin 133061d06d6bSBaptiste Daroussin static void 133161d06d6bSBaptiste Daroussin mdoc_fo_post(MDOC_ARGS) 133261d06d6bSBaptiste Daroussin { 133361d06d6bSBaptiste Daroussin if (n->type != ROFFT_BODY) 133461d06d6bSBaptiste Daroussin return; 133561d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 133661d06d6bSBaptiste Daroussin print_text(h, ")"); 133761d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 133861d06d6bSBaptiste Daroussin print_text(h, ";"); 133961d06d6bSBaptiste Daroussin } 134061d06d6bSBaptiste Daroussin 134161d06d6bSBaptiste Daroussin static int 134261d06d6bSBaptiste Daroussin mdoc_in_pre(MDOC_ARGS) 134361d06d6bSBaptiste Daroussin { 134461d06d6bSBaptiste Daroussin struct tag *t; 134561d06d6bSBaptiste Daroussin 134661d06d6bSBaptiste Daroussin synopsis_pre(h, n); 13477295610fSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "In"); 134861d06d6bSBaptiste Daroussin 134961d06d6bSBaptiste Daroussin /* 135061d06d6bSBaptiste Daroussin * The first argument of the `In' gets special treatment as 135161d06d6bSBaptiste Daroussin * being a linked value. Subsequent values are printed 135261d06d6bSBaptiste Daroussin * afterward. groff does similarly. This also handles the case 135361d06d6bSBaptiste Daroussin * of no children. 135461d06d6bSBaptiste Daroussin */ 135561d06d6bSBaptiste Daroussin 135661d06d6bSBaptiste Daroussin if (NODE_SYNPRETTY & n->flags && NODE_LINE & n->flags) 135761d06d6bSBaptiste Daroussin print_text(h, "#include"); 135861d06d6bSBaptiste Daroussin 135961d06d6bSBaptiste Daroussin print_text(h, "<"); 136061d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 136161d06d6bSBaptiste Daroussin 136261d06d6bSBaptiste Daroussin if (NULL != (n = n->child)) { 136361d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 136461d06d6bSBaptiste Daroussin 136561d06d6bSBaptiste Daroussin if (h->base_includes) 13667295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "chI", "In", n->string); 136761d06d6bSBaptiste Daroussin else 13687295610fSBaptiste Daroussin t = print_otag(h, TAG_A, "c", "In"); 136961d06d6bSBaptiste Daroussin print_text(h, n->string); 137061d06d6bSBaptiste Daroussin print_tagq(h, t); 137161d06d6bSBaptiste Daroussin 137261d06d6bSBaptiste Daroussin n = n->next; 137361d06d6bSBaptiste Daroussin } 137461d06d6bSBaptiste Daroussin 137561d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 137661d06d6bSBaptiste Daroussin print_text(h, ">"); 137761d06d6bSBaptiste Daroussin 137861d06d6bSBaptiste Daroussin for ( ; n; n = n->next) { 137961d06d6bSBaptiste Daroussin assert(n->type == ROFFT_TEXT); 138061d06d6bSBaptiste Daroussin print_text(h, n->string); 138161d06d6bSBaptiste Daroussin } 138261d06d6bSBaptiste Daroussin return 0; 138361d06d6bSBaptiste Daroussin } 138461d06d6bSBaptiste Daroussin 138561d06d6bSBaptiste Daroussin static int 138661d06d6bSBaptiste Daroussin mdoc_va_pre(MDOC_ARGS) 138761d06d6bSBaptiste Daroussin { 13887295610fSBaptiste Daroussin print_otag(h, TAG_VAR, "c", "Va"); 138961d06d6bSBaptiste Daroussin return 1; 139061d06d6bSBaptiste Daroussin } 139161d06d6bSBaptiste Daroussin 139261d06d6bSBaptiste Daroussin static int 139361d06d6bSBaptiste Daroussin mdoc_ap_pre(MDOC_ARGS) 139461d06d6bSBaptiste Daroussin { 139561d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 139661d06d6bSBaptiste Daroussin print_text(h, "\\(aq"); 139761d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 139861d06d6bSBaptiste Daroussin return 1; 139961d06d6bSBaptiste Daroussin } 140061d06d6bSBaptiste Daroussin 140161d06d6bSBaptiste Daroussin static int 140261d06d6bSBaptiste Daroussin mdoc_bf_pre(MDOC_ARGS) 140361d06d6bSBaptiste Daroussin { 140461d06d6bSBaptiste Daroussin const char *cattr; 140561d06d6bSBaptiste Daroussin 14067295610fSBaptiste Daroussin switch (n->type) { 14077295610fSBaptiste Daroussin case ROFFT_BLOCK: 14087295610fSBaptiste Daroussin html_close_paragraph(h); 140961d06d6bSBaptiste Daroussin return 1; 14107295610fSBaptiste Daroussin case ROFFT_HEAD: 14117295610fSBaptiste Daroussin return 0; 14127295610fSBaptiste Daroussin case ROFFT_BODY: 14137295610fSBaptiste Daroussin break; 14147295610fSBaptiste Daroussin default: 14157295610fSBaptiste Daroussin abort(); 14167295610fSBaptiste Daroussin } 141761d06d6bSBaptiste Daroussin 141861d06d6bSBaptiste Daroussin if (FONT_Em == n->norm->Bf.font) 141961d06d6bSBaptiste Daroussin cattr = "Bf Em"; 142061d06d6bSBaptiste Daroussin else if (FONT_Sy == n->norm->Bf.font) 142161d06d6bSBaptiste Daroussin cattr = "Bf Sy"; 142261d06d6bSBaptiste Daroussin else if (FONT_Li == n->norm->Bf.font) 142361d06d6bSBaptiste Daroussin cattr = "Bf Li"; 142461d06d6bSBaptiste Daroussin else 142561d06d6bSBaptiste Daroussin cattr = "Bf No"; 142661d06d6bSBaptiste Daroussin 142761d06d6bSBaptiste Daroussin /* Cannot use TAG_SPAN because it may contain blocks. */ 142861d06d6bSBaptiste Daroussin print_otag(h, TAG_DIV, "c", cattr); 142961d06d6bSBaptiste Daroussin return 1; 143061d06d6bSBaptiste Daroussin } 143161d06d6bSBaptiste Daroussin 143261d06d6bSBaptiste Daroussin static int 143361d06d6bSBaptiste Daroussin mdoc_igndelim_pre(MDOC_ARGS) 143461d06d6bSBaptiste Daroussin { 143561d06d6bSBaptiste Daroussin h->flags |= HTML_IGNDELIM; 143661d06d6bSBaptiste Daroussin return 1; 143761d06d6bSBaptiste Daroussin } 143861d06d6bSBaptiste Daroussin 143961d06d6bSBaptiste Daroussin static void 144061d06d6bSBaptiste Daroussin mdoc_pf_post(MDOC_ARGS) 144161d06d6bSBaptiste Daroussin { 144261d06d6bSBaptiste Daroussin if ( ! (n->next == NULL || n->next->flags & NODE_LINE)) 144361d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 144461d06d6bSBaptiste Daroussin } 144561d06d6bSBaptiste Daroussin 144661d06d6bSBaptiste Daroussin static int 144761d06d6bSBaptiste Daroussin mdoc_rs_pre(MDOC_ARGS) 144861d06d6bSBaptiste Daroussin { 14497295610fSBaptiste Daroussin switch (n->type) { 14507295610fSBaptiste Daroussin case ROFFT_BLOCK: 14517295610fSBaptiste Daroussin if (n->sec == SEC_SEE_ALSO) 14527295610fSBaptiste Daroussin html_close_paragraph(h); 14537295610fSBaptiste Daroussin break; 14547295610fSBaptiste Daroussin case ROFFT_HEAD: 14557295610fSBaptiste Daroussin return 0; 14567295610fSBaptiste Daroussin case ROFFT_BODY: 14577295610fSBaptiste Daroussin if (n->sec == SEC_SEE_ALSO) 14587295610fSBaptiste Daroussin print_otag(h, TAG_P, "c", "Pp"); 14597295610fSBaptiste Daroussin print_otag(h, TAG_CITE, "c", "Rs"); 14607295610fSBaptiste Daroussin break; 14617295610fSBaptiste Daroussin default: 14627295610fSBaptiste Daroussin abort(); 14637295610fSBaptiste Daroussin } 146461d06d6bSBaptiste Daroussin return 1; 146561d06d6bSBaptiste Daroussin } 146661d06d6bSBaptiste Daroussin 146761d06d6bSBaptiste Daroussin static int 146861d06d6bSBaptiste Daroussin mdoc_no_pre(MDOC_ARGS) 146961d06d6bSBaptiste Daroussin { 14706d38604fSBaptiste Daroussin print_otag_id(h, TAG_SPAN, roff_name[n->tok], n); 147161d06d6bSBaptiste Daroussin return 1; 147261d06d6bSBaptiste Daroussin } 147361d06d6bSBaptiste Daroussin 147461d06d6bSBaptiste Daroussin static int 147561d06d6bSBaptiste Daroussin mdoc_sy_pre(MDOC_ARGS) 147661d06d6bSBaptiste Daroussin { 14776d38604fSBaptiste Daroussin print_otag_id(h, TAG_B, "Sy", n); 147861d06d6bSBaptiste Daroussin return 1; 147961d06d6bSBaptiste Daroussin } 148061d06d6bSBaptiste Daroussin 148161d06d6bSBaptiste Daroussin static int 148261d06d6bSBaptiste Daroussin mdoc_lb_pre(MDOC_ARGS) 148361d06d6bSBaptiste Daroussin { 14846d38604fSBaptiste Daroussin if (n->sec == SEC_LIBRARY && 14856d38604fSBaptiste Daroussin n->flags & NODE_LINE && 14866d38604fSBaptiste Daroussin roff_node_prev(n) != NULL) 148761d06d6bSBaptiste Daroussin print_otag(h, TAG_BR, ""); 148861d06d6bSBaptiste Daroussin 14897295610fSBaptiste Daroussin print_otag(h, TAG_SPAN, "c", "Lb"); 149061d06d6bSBaptiste Daroussin return 1; 149161d06d6bSBaptiste Daroussin } 149261d06d6bSBaptiste Daroussin 149361d06d6bSBaptiste Daroussin static int 149461d06d6bSBaptiste Daroussin mdoc__x_pre(MDOC_ARGS) 149561d06d6bSBaptiste Daroussin { 14966d38604fSBaptiste Daroussin struct roff_node *nn; 149761d06d6bSBaptiste Daroussin const char *cattr; 149861d06d6bSBaptiste Daroussin enum htmltag t; 149961d06d6bSBaptiste Daroussin 150061d06d6bSBaptiste Daroussin t = TAG_SPAN; 150161d06d6bSBaptiste Daroussin 150261d06d6bSBaptiste Daroussin switch (n->tok) { 150361d06d6bSBaptiste Daroussin case MDOC__A: 150461d06d6bSBaptiste Daroussin cattr = "RsA"; 15056d38604fSBaptiste Daroussin if ((nn = roff_node_prev(n)) != NULL && nn->tok == MDOC__A && 15066d38604fSBaptiste Daroussin ((nn = roff_node_next(n)) == NULL || nn->tok != MDOC__A)) 150761d06d6bSBaptiste Daroussin print_text(h, "and"); 150861d06d6bSBaptiste Daroussin break; 150961d06d6bSBaptiste Daroussin case MDOC__B: 151061d06d6bSBaptiste Daroussin t = TAG_I; 151161d06d6bSBaptiste Daroussin cattr = "RsB"; 151261d06d6bSBaptiste Daroussin break; 151361d06d6bSBaptiste Daroussin case MDOC__C: 151461d06d6bSBaptiste Daroussin cattr = "RsC"; 151561d06d6bSBaptiste Daroussin break; 151661d06d6bSBaptiste Daroussin case MDOC__D: 151761d06d6bSBaptiste Daroussin cattr = "RsD"; 151861d06d6bSBaptiste Daroussin break; 151961d06d6bSBaptiste Daroussin case MDOC__I: 152061d06d6bSBaptiste Daroussin t = TAG_I; 152161d06d6bSBaptiste Daroussin cattr = "RsI"; 152261d06d6bSBaptiste Daroussin break; 152361d06d6bSBaptiste Daroussin case MDOC__J: 152461d06d6bSBaptiste Daroussin t = TAG_I; 152561d06d6bSBaptiste Daroussin cattr = "RsJ"; 152661d06d6bSBaptiste Daroussin break; 152761d06d6bSBaptiste Daroussin case MDOC__N: 152861d06d6bSBaptiste Daroussin cattr = "RsN"; 152961d06d6bSBaptiste Daroussin break; 153061d06d6bSBaptiste Daroussin case MDOC__O: 153161d06d6bSBaptiste Daroussin cattr = "RsO"; 153261d06d6bSBaptiste Daroussin break; 153361d06d6bSBaptiste Daroussin case MDOC__P: 153461d06d6bSBaptiste Daroussin cattr = "RsP"; 153561d06d6bSBaptiste Daroussin break; 153661d06d6bSBaptiste Daroussin case MDOC__Q: 153761d06d6bSBaptiste Daroussin cattr = "RsQ"; 153861d06d6bSBaptiste Daroussin break; 153961d06d6bSBaptiste Daroussin case MDOC__R: 154061d06d6bSBaptiste Daroussin cattr = "RsR"; 154161d06d6bSBaptiste Daroussin break; 154261d06d6bSBaptiste Daroussin case MDOC__T: 154361d06d6bSBaptiste Daroussin cattr = "RsT"; 154461d06d6bSBaptiste Daroussin break; 154561d06d6bSBaptiste Daroussin case MDOC__U: 154661d06d6bSBaptiste Daroussin print_otag(h, TAG_A, "ch", "RsU", n->child->string); 154761d06d6bSBaptiste Daroussin return 1; 154861d06d6bSBaptiste Daroussin case MDOC__V: 154961d06d6bSBaptiste Daroussin cattr = "RsV"; 155061d06d6bSBaptiste Daroussin break; 155161d06d6bSBaptiste Daroussin default: 155261d06d6bSBaptiste Daroussin abort(); 155361d06d6bSBaptiste Daroussin } 155461d06d6bSBaptiste Daroussin 155561d06d6bSBaptiste Daroussin print_otag(h, t, "c", cattr); 155661d06d6bSBaptiste Daroussin return 1; 155761d06d6bSBaptiste Daroussin } 155861d06d6bSBaptiste Daroussin 155961d06d6bSBaptiste Daroussin static void 156061d06d6bSBaptiste Daroussin mdoc__x_post(MDOC_ARGS) 156161d06d6bSBaptiste Daroussin { 15626d38604fSBaptiste Daroussin struct roff_node *nn; 156361d06d6bSBaptiste Daroussin 15646d38604fSBaptiste Daroussin if (n->tok == MDOC__A && 15656d38604fSBaptiste Daroussin (nn = roff_node_next(n)) != NULL && nn->tok == MDOC__A && 15666d38604fSBaptiste Daroussin ((nn = roff_node_next(nn)) == NULL || nn->tok != MDOC__A) && 15676d38604fSBaptiste Daroussin ((nn = roff_node_prev(n)) == NULL || nn->tok != MDOC__A)) 156861d06d6bSBaptiste Daroussin return; 156961d06d6bSBaptiste Daroussin 157061d06d6bSBaptiste Daroussin /* TODO: %U */ 157161d06d6bSBaptiste Daroussin 15726d38604fSBaptiste Daroussin if (n->parent == NULL || n->parent->tok != MDOC_Rs) 157361d06d6bSBaptiste Daroussin return; 157461d06d6bSBaptiste Daroussin 157561d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 15766d38604fSBaptiste Daroussin print_text(h, roff_node_next(n) ? "," : "."); 157761d06d6bSBaptiste Daroussin } 157861d06d6bSBaptiste Daroussin 157961d06d6bSBaptiste Daroussin static int 158061d06d6bSBaptiste Daroussin mdoc_bk_pre(MDOC_ARGS) 158161d06d6bSBaptiste Daroussin { 158261d06d6bSBaptiste Daroussin 158361d06d6bSBaptiste Daroussin switch (n->type) { 158461d06d6bSBaptiste Daroussin case ROFFT_BLOCK: 158561d06d6bSBaptiste Daroussin break; 158661d06d6bSBaptiste Daroussin case ROFFT_HEAD: 158761d06d6bSBaptiste Daroussin return 0; 158861d06d6bSBaptiste Daroussin case ROFFT_BODY: 158961d06d6bSBaptiste Daroussin if (n->parent->args != NULL || n->prev->child == NULL) 159061d06d6bSBaptiste Daroussin h->flags |= HTML_PREKEEP; 159161d06d6bSBaptiste Daroussin break; 159261d06d6bSBaptiste Daroussin default: 159361d06d6bSBaptiste Daroussin abort(); 159461d06d6bSBaptiste Daroussin } 159561d06d6bSBaptiste Daroussin 159661d06d6bSBaptiste Daroussin return 1; 159761d06d6bSBaptiste Daroussin } 159861d06d6bSBaptiste Daroussin 159961d06d6bSBaptiste Daroussin static void 160061d06d6bSBaptiste Daroussin mdoc_bk_post(MDOC_ARGS) 160161d06d6bSBaptiste Daroussin { 160261d06d6bSBaptiste Daroussin 160361d06d6bSBaptiste Daroussin if (n->type == ROFFT_BODY) 160461d06d6bSBaptiste Daroussin h->flags &= ~(HTML_KEEP | HTML_PREKEEP); 160561d06d6bSBaptiste Daroussin } 160661d06d6bSBaptiste Daroussin 160761d06d6bSBaptiste Daroussin static int 160861d06d6bSBaptiste Daroussin mdoc_quote_pre(MDOC_ARGS) 160961d06d6bSBaptiste Daroussin { 161061d06d6bSBaptiste Daroussin if (n->type != ROFFT_BODY) 161161d06d6bSBaptiste Daroussin return 1; 161261d06d6bSBaptiste Daroussin 161361d06d6bSBaptiste Daroussin switch (n->tok) { 161461d06d6bSBaptiste Daroussin case MDOC_Ao: 161561d06d6bSBaptiste Daroussin case MDOC_Aq: 161661d06d6bSBaptiste Daroussin print_text(h, n->child != NULL && n->child->next == NULL && 161761d06d6bSBaptiste Daroussin n->child->tok == MDOC_Mt ? "<" : "\\(la"); 161861d06d6bSBaptiste Daroussin break; 161961d06d6bSBaptiste Daroussin case MDOC_Bro: 162061d06d6bSBaptiste Daroussin case MDOC_Brq: 162161d06d6bSBaptiste Daroussin print_text(h, "\\(lC"); 162261d06d6bSBaptiste Daroussin break; 162361d06d6bSBaptiste Daroussin case MDOC_Bo: 162461d06d6bSBaptiste Daroussin case MDOC_Bq: 162561d06d6bSBaptiste Daroussin print_text(h, "\\(lB"); 162661d06d6bSBaptiste Daroussin break; 162761d06d6bSBaptiste Daroussin case MDOC_Oo: 162861d06d6bSBaptiste Daroussin case MDOC_Op: 162961d06d6bSBaptiste Daroussin print_text(h, "\\(lB"); 16307295610fSBaptiste Daroussin /* 16317295610fSBaptiste Daroussin * Give up on semantic markup for now. 16327295610fSBaptiste Daroussin * We cannot use TAG_SPAN because .Oo may contain blocks. 16336d38604fSBaptiste Daroussin * We cannot use TAG_DIV because we might be in a 16347295610fSBaptiste Daroussin * phrasing context (like .Dl or .Pp); we cannot 16357295610fSBaptiste Daroussin * close out a .Pp at this point either because 16367295610fSBaptiste Daroussin * that would break the line. 16377295610fSBaptiste Daroussin */ 16387295610fSBaptiste Daroussin /* XXX print_otag(h, TAG_???, "c", "Op"); */ 163961d06d6bSBaptiste Daroussin break; 164061d06d6bSBaptiste Daroussin case MDOC_En: 164161d06d6bSBaptiste Daroussin if (NULL == n->norm->Es || 164261d06d6bSBaptiste Daroussin NULL == n->norm->Es->child) 164361d06d6bSBaptiste Daroussin return 1; 164461d06d6bSBaptiste Daroussin print_text(h, n->norm->Es->child->string); 164561d06d6bSBaptiste Daroussin break; 164661d06d6bSBaptiste Daroussin case MDOC_Do: 164761d06d6bSBaptiste Daroussin case MDOC_Dq: 16486d38604fSBaptiste Daroussin print_text(h, "\\(lq"); 16496d38604fSBaptiste Daroussin break; 165061d06d6bSBaptiste Daroussin case MDOC_Qo: 165161d06d6bSBaptiste Daroussin case MDOC_Qq: 16526d38604fSBaptiste Daroussin print_text(h, "\""); 165361d06d6bSBaptiste Daroussin break; 165461d06d6bSBaptiste Daroussin case MDOC_Po: 165561d06d6bSBaptiste Daroussin case MDOC_Pq: 165661d06d6bSBaptiste Daroussin print_text(h, "("); 165761d06d6bSBaptiste Daroussin break; 165861d06d6bSBaptiste Daroussin case MDOC_Ql: 165961d06d6bSBaptiste Daroussin print_text(h, "\\(oq"); 166061d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 166161d06d6bSBaptiste Daroussin print_otag(h, TAG_CODE, "c", "Li"); 166261d06d6bSBaptiste Daroussin break; 166361d06d6bSBaptiste Daroussin case MDOC_So: 166461d06d6bSBaptiste Daroussin case MDOC_Sq: 166561d06d6bSBaptiste Daroussin print_text(h, "\\(oq"); 166661d06d6bSBaptiste Daroussin break; 166761d06d6bSBaptiste Daroussin default: 166861d06d6bSBaptiste Daroussin abort(); 166961d06d6bSBaptiste Daroussin } 167061d06d6bSBaptiste Daroussin 167161d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 167261d06d6bSBaptiste Daroussin return 1; 167361d06d6bSBaptiste Daroussin } 167461d06d6bSBaptiste Daroussin 167561d06d6bSBaptiste Daroussin static void 167661d06d6bSBaptiste Daroussin mdoc_quote_post(MDOC_ARGS) 167761d06d6bSBaptiste Daroussin { 167861d06d6bSBaptiste Daroussin 167961d06d6bSBaptiste Daroussin if (n->type != ROFFT_BODY && n->type != ROFFT_ELEM) 168061d06d6bSBaptiste Daroussin return; 168161d06d6bSBaptiste Daroussin 168261d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 168361d06d6bSBaptiste Daroussin 168461d06d6bSBaptiste Daroussin switch (n->tok) { 168561d06d6bSBaptiste Daroussin case MDOC_Ao: 168661d06d6bSBaptiste Daroussin case MDOC_Aq: 168761d06d6bSBaptiste Daroussin print_text(h, n->child != NULL && n->child->next == NULL && 168861d06d6bSBaptiste Daroussin n->child->tok == MDOC_Mt ? ">" : "\\(ra"); 168961d06d6bSBaptiste Daroussin break; 169061d06d6bSBaptiste Daroussin case MDOC_Bro: 169161d06d6bSBaptiste Daroussin case MDOC_Brq: 169261d06d6bSBaptiste Daroussin print_text(h, "\\(rC"); 169361d06d6bSBaptiste Daroussin break; 169461d06d6bSBaptiste Daroussin case MDOC_Oo: 169561d06d6bSBaptiste Daroussin case MDOC_Op: 169661d06d6bSBaptiste Daroussin case MDOC_Bo: 169761d06d6bSBaptiste Daroussin case MDOC_Bq: 169861d06d6bSBaptiste Daroussin print_text(h, "\\(rB"); 169961d06d6bSBaptiste Daroussin break; 170061d06d6bSBaptiste Daroussin case MDOC_En: 170161d06d6bSBaptiste Daroussin if (n->norm->Es == NULL || 170261d06d6bSBaptiste Daroussin n->norm->Es->child == NULL || 170361d06d6bSBaptiste Daroussin n->norm->Es->child->next == NULL) 170461d06d6bSBaptiste Daroussin h->flags &= ~HTML_NOSPACE; 170561d06d6bSBaptiste Daroussin else 170661d06d6bSBaptiste Daroussin print_text(h, n->norm->Es->child->next->string); 170761d06d6bSBaptiste Daroussin break; 170861d06d6bSBaptiste Daroussin case MDOC_Do: 170961d06d6bSBaptiste Daroussin case MDOC_Dq: 171061d06d6bSBaptiste Daroussin print_text(h, "\\(rq"); 171161d06d6bSBaptiste Daroussin break; 17126d38604fSBaptiste Daroussin case MDOC_Qo: 17136d38604fSBaptiste Daroussin case MDOC_Qq: 17146d38604fSBaptiste Daroussin print_text(h, "\""); 17156d38604fSBaptiste Daroussin break; 171661d06d6bSBaptiste Daroussin case MDOC_Po: 171761d06d6bSBaptiste Daroussin case MDOC_Pq: 171861d06d6bSBaptiste Daroussin print_text(h, ")"); 171961d06d6bSBaptiste Daroussin break; 172061d06d6bSBaptiste Daroussin case MDOC_Ql: 172161d06d6bSBaptiste Daroussin case MDOC_So: 172261d06d6bSBaptiste Daroussin case MDOC_Sq: 172361d06d6bSBaptiste Daroussin print_text(h, "\\(cq"); 172461d06d6bSBaptiste Daroussin break; 172561d06d6bSBaptiste Daroussin default: 172661d06d6bSBaptiste Daroussin abort(); 172761d06d6bSBaptiste Daroussin } 172861d06d6bSBaptiste Daroussin } 172961d06d6bSBaptiste Daroussin 173061d06d6bSBaptiste Daroussin static int 173161d06d6bSBaptiste Daroussin mdoc_eo_pre(MDOC_ARGS) 173261d06d6bSBaptiste Daroussin { 173361d06d6bSBaptiste Daroussin 173461d06d6bSBaptiste Daroussin if (n->type != ROFFT_BODY) 173561d06d6bSBaptiste Daroussin return 1; 173661d06d6bSBaptiste Daroussin 173761d06d6bSBaptiste Daroussin if (n->end == ENDBODY_NOT && 173861d06d6bSBaptiste Daroussin n->parent->head->child == NULL && 173961d06d6bSBaptiste Daroussin n->child != NULL && 174061d06d6bSBaptiste Daroussin n->child->end != ENDBODY_NOT) 174161d06d6bSBaptiste Daroussin print_text(h, "\\&"); 174261d06d6bSBaptiste Daroussin else if (n->end != ENDBODY_NOT ? n->child != NULL : 174361d06d6bSBaptiste Daroussin n->parent->head->child != NULL && (n->child != NULL || 174461d06d6bSBaptiste Daroussin (n->parent->tail != NULL && n->parent->tail->child != NULL))) 174561d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 174661d06d6bSBaptiste Daroussin return 1; 174761d06d6bSBaptiste Daroussin } 174861d06d6bSBaptiste Daroussin 174961d06d6bSBaptiste Daroussin static void 175061d06d6bSBaptiste Daroussin mdoc_eo_post(MDOC_ARGS) 175161d06d6bSBaptiste Daroussin { 175261d06d6bSBaptiste Daroussin int body, tail; 175361d06d6bSBaptiste Daroussin 175461d06d6bSBaptiste Daroussin if (n->type != ROFFT_BODY) 175561d06d6bSBaptiste Daroussin return; 175661d06d6bSBaptiste Daroussin 175761d06d6bSBaptiste Daroussin if (n->end != ENDBODY_NOT) { 175861d06d6bSBaptiste Daroussin h->flags &= ~HTML_NOSPACE; 175961d06d6bSBaptiste Daroussin return; 176061d06d6bSBaptiste Daroussin } 176161d06d6bSBaptiste Daroussin 176261d06d6bSBaptiste Daroussin body = n->child != NULL || n->parent->head->child != NULL; 176361d06d6bSBaptiste Daroussin tail = n->parent->tail != NULL && n->parent->tail->child != NULL; 176461d06d6bSBaptiste Daroussin 176561d06d6bSBaptiste Daroussin if (body && tail) 176661d06d6bSBaptiste Daroussin h->flags |= HTML_NOSPACE; 176761d06d6bSBaptiste Daroussin else if ( ! tail) 176861d06d6bSBaptiste Daroussin h->flags &= ~HTML_NOSPACE; 176961d06d6bSBaptiste Daroussin } 17707295610fSBaptiste Daroussin 17717295610fSBaptiste Daroussin static int 17727295610fSBaptiste Daroussin mdoc_abort_pre(MDOC_ARGS) 17737295610fSBaptiste Daroussin { 17747295610fSBaptiste Daroussin abort(); 17757295610fSBaptiste Daroussin } 1776