1*c1c95addSBrooks Davis /* $Id: html.h,v 1.112 2022/07/06 14:34:59 schwarze Exp $ */ 261d06d6bSBaptiste Daroussin /* 36d38604fSBaptiste Daroussin * Copyright (c) 2017, 2018, 2019, 2020 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 AUTHOR DISCLAIMS ALL WARRANTIES 1161d06d6bSBaptiste Daroussin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1261d06d6bSBaptiste Daroussin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. 176d38604fSBaptiste Daroussin * 186d38604fSBaptiste Daroussin * Internal interfaces for mandoc(1) HTML formatters. 196d38604fSBaptiste Daroussin * For use by the individual HTML formatters only. 2061d06d6bSBaptiste Daroussin */ 2161d06d6bSBaptiste Daroussin 2261d06d6bSBaptiste Daroussin enum htmltag { 2361d06d6bSBaptiste Daroussin TAG_HTML, 2461d06d6bSBaptiste Daroussin TAG_HEAD, 2561d06d6bSBaptiste Daroussin TAG_META, 2661d06d6bSBaptiste Daroussin TAG_LINK, 276d38604fSBaptiste Daroussin TAG_STYLE, 286d38604fSBaptiste Daroussin TAG_TITLE, 296d38604fSBaptiste Daroussin TAG_BODY, 30*c1c95addSBrooks Davis TAG_MAIN, 316d38604fSBaptiste Daroussin TAG_DIV, 326d38604fSBaptiste Daroussin TAG_SECTION, 33*c1c95addSBrooks Davis TAG_NAV, 3461d06d6bSBaptiste Daroussin TAG_TABLE, 3561d06d6bSBaptiste Daroussin TAG_TR, 3661d06d6bSBaptiste Daroussin TAG_TD, 3761d06d6bSBaptiste Daroussin TAG_LI, 3861d06d6bSBaptiste Daroussin TAG_UL, 3961d06d6bSBaptiste Daroussin TAG_OL, 4061d06d6bSBaptiste Daroussin TAG_DL, 4161d06d6bSBaptiste Daroussin TAG_DT, 4261d06d6bSBaptiste Daroussin TAG_DD, 436d38604fSBaptiste Daroussin TAG_H2, 44*c1c95addSBrooks Davis TAG_H3, 457295610fSBaptiste Daroussin TAG_P, 4661d06d6bSBaptiste Daroussin TAG_PRE, 476d38604fSBaptiste Daroussin TAG_A, 4861d06d6bSBaptiste Daroussin TAG_B, 496d38604fSBaptiste Daroussin TAG_CITE, 5061d06d6bSBaptiste Daroussin TAG_CODE, 516d38604fSBaptiste Daroussin TAG_I, 5261d06d6bSBaptiste Daroussin TAG_SMALL, 536d38604fSBaptiste Daroussin TAG_SPAN, 546d38604fSBaptiste Daroussin TAG_VAR, 556d38604fSBaptiste Daroussin TAG_BR, 566d38604fSBaptiste Daroussin TAG_HR, 576d38604fSBaptiste Daroussin TAG_MARK, 5861d06d6bSBaptiste Daroussin TAG_MATH, 5961d06d6bSBaptiste Daroussin TAG_MROW, 6061d06d6bSBaptiste Daroussin TAG_MI, 6161d06d6bSBaptiste Daroussin TAG_MN, 6261d06d6bSBaptiste Daroussin TAG_MO, 6361d06d6bSBaptiste Daroussin TAG_MSUP, 6461d06d6bSBaptiste Daroussin TAG_MSUB, 6561d06d6bSBaptiste Daroussin TAG_MSUBSUP, 6661d06d6bSBaptiste Daroussin TAG_MFRAC, 6761d06d6bSBaptiste Daroussin TAG_MSQRT, 6861d06d6bSBaptiste Daroussin TAG_MFENCED, 6961d06d6bSBaptiste Daroussin TAG_MTABLE, 7061d06d6bSBaptiste Daroussin TAG_MTR, 7161d06d6bSBaptiste Daroussin TAG_MTD, 7261d06d6bSBaptiste Daroussin TAG_MUNDEROVER, 7361d06d6bSBaptiste Daroussin TAG_MUNDER, 7461d06d6bSBaptiste Daroussin TAG_MOVER, 7561d06d6bSBaptiste Daroussin TAG_MAX 7661d06d6bSBaptiste Daroussin }; 7761d06d6bSBaptiste Daroussin 7861d06d6bSBaptiste Daroussin struct tag { 7961d06d6bSBaptiste Daroussin struct tag *next; 807295610fSBaptiste Daroussin int refcnt; 817295610fSBaptiste Daroussin int closed; 8261d06d6bSBaptiste Daroussin enum htmltag tag; 8361d06d6bSBaptiste Daroussin }; 8461d06d6bSBaptiste Daroussin 8561d06d6bSBaptiste Daroussin struct html { 8661d06d6bSBaptiste Daroussin int flags; 8761d06d6bSBaptiste Daroussin #define HTML_NOSPACE (1 << 0) /* suppress next space */ 8861d06d6bSBaptiste Daroussin #define HTML_IGNDELIM (1 << 1) 8961d06d6bSBaptiste Daroussin #define HTML_KEEP (1 << 2) 9061d06d6bSBaptiste Daroussin #define HTML_PREKEEP (1 << 3) 9161d06d6bSBaptiste Daroussin #define HTML_NONOSPACE (1 << 4) /* never add spaces */ 9261d06d6bSBaptiste Daroussin #define HTML_SKIPCHAR (1 << 6) /* skip the next character */ 9361d06d6bSBaptiste Daroussin #define HTML_NOSPLIT (1 << 7) /* do not break line before .An */ 9461d06d6bSBaptiste Daroussin #define HTML_SPLIT (1 << 8) /* break line before .An */ 9561d06d6bSBaptiste Daroussin #define HTML_NONEWLINE (1 << 9) /* No line break in nofill mode. */ 9661d06d6bSBaptiste Daroussin #define HTML_BUFFER (1 << 10) /* Collect a word to see if it fits. */ 977295610fSBaptiste Daroussin #define HTML_TOCDONE (1 << 11) /* The TOC was already written. */ 9861d06d6bSBaptiste Daroussin size_t indent; /* current output indentation level */ 9961d06d6bSBaptiste Daroussin int noindent; /* indent disabled by <pre> */ 10061d06d6bSBaptiste Daroussin size_t col; /* current output byte position */ 10161d06d6bSBaptiste Daroussin size_t bufcol; /* current buf byte position */ 10261d06d6bSBaptiste Daroussin char buf[80]; /* output buffer */ 10361d06d6bSBaptiste Daroussin struct tag *tag; /* last open tag */ 10461d06d6bSBaptiste Daroussin struct rofftbl tbl; /* current table */ 10561d06d6bSBaptiste Daroussin struct tag *tblt; /* current open table scope */ 1067295610fSBaptiste Daroussin char *base_man1; /* bases for manpage href */ 1077295610fSBaptiste Daroussin char *base_man2; 10861d06d6bSBaptiste Daroussin char *base_includes; /* base for include href */ 10961d06d6bSBaptiste Daroussin char *style; /* style-sheet URI */ 11061d06d6bSBaptiste Daroussin struct tag *metaf; /* current open font scope */ 11145a5aec3SBaptiste Daroussin enum mandoc_esc metal; /* last used font */ 11245a5aec3SBaptiste Daroussin enum mandoc_esc metac; /* current font mode */ 11361d06d6bSBaptiste Daroussin int oflags; /* output options */ 11461d06d6bSBaptiste Daroussin #define HTML_FRAGMENT (1 << 0) /* don't emit HTML/HEAD/BODY */ 1157295610fSBaptiste Daroussin #define HTML_TOC (1 << 1) /* emit a table of contents */ 11661d06d6bSBaptiste Daroussin }; 11761d06d6bSBaptiste Daroussin 11861d06d6bSBaptiste Daroussin 11961d06d6bSBaptiste Daroussin struct roff_node; 12061d06d6bSBaptiste Daroussin struct tbl_span; 12161d06d6bSBaptiste Daroussin struct eqn_box; 12261d06d6bSBaptiste Daroussin 12361d06d6bSBaptiste Daroussin void roff_html_pre(struct html *, const struct roff_node *); 12461d06d6bSBaptiste Daroussin 12561d06d6bSBaptiste Daroussin void print_gen_comment(struct html *, struct roff_node *); 12661d06d6bSBaptiste Daroussin void print_gen_decls(struct html *); 12761d06d6bSBaptiste Daroussin void print_gen_head(struct html *); 12861d06d6bSBaptiste Daroussin struct tag *print_otag(struct html *, enum htmltag, const char *, ...); 1296d38604fSBaptiste Daroussin struct tag *print_otag_id(struct html *, enum htmltag, const char *, 1306d38604fSBaptiste Daroussin struct roff_node *); 13161d06d6bSBaptiste Daroussin void print_tagq(struct html *, const struct tag *); 13261d06d6bSBaptiste Daroussin void print_stagq(struct html *, const struct tag *); 1336d38604fSBaptiste Daroussin void print_tagged_text(struct html *, const char *, 1346d38604fSBaptiste Daroussin struct roff_node *); 13561d06d6bSBaptiste Daroussin void print_text(struct html *, const char *); 13661d06d6bSBaptiste Daroussin void print_tblclose(struct html *); 13761d06d6bSBaptiste Daroussin void print_tbl(struct html *, const struct tbl_span *); 13861d06d6bSBaptiste Daroussin void print_eqn(struct html *, const struct eqn_box *); 13961d06d6bSBaptiste Daroussin void print_endline(struct html *); 14061d06d6bSBaptiste Daroussin 1417295610fSBaptiste Daroussin void html_close_paragraph(struct html *); 1427295610fSBaptiste Daroussin enum roff_tok html_fillmode(struct html *, enum roff_tok); 14361d06d6bSBaptiste Daroussin char *html_make_id(const struct roff_node *, int); 14445a5aec3SBaptiste Daroussin int html_setfont(struct html *, enum mandoc_esc); 145