1*6d38604fSBaptiste Daroussin /* $Id: html.h,v 1.109 2021/09/09 14:47:24 schwarze Exp $ */ 261d06d6bSBaptiste Daroussin /* 3*6d38604fSBaptiste 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. 17*6d38604fSBaptiste Daroussin * 18*6d38604fSBaptiste Daroussin * Internal interfaces for mandoc(1) HTML formatters. 19*6d38604fSBaptiste 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, 27*6d38604fSBaptiste Daroussin TAG_STYLE, 28*6d38604fSBaptiste Daroussin TAG_TITLE, 29*6d38604fSBaptiste Daroussin TAG_BODY, 30*6d38604fSBaptiste Daroussin TAG_DIV, 31*6d38604fSBaptiste Daroussin TAG_SECTION, 3261d06d6bSBaptiste Daroussin TAG_TABLE, 3361d06d6bSBaptiste Daroussin TAG_TR, 3461d06d6bSBaptiste Daroussin TAG_TD, 3561d06d6bSBaptiste Daroussin TAG_LI, 3661d06d6bSBaptiste Daroussin TAG_UL, 3761d06d6bSBaptiste Daroussin TAG_OL, 3861d06d6bSBaptiste Daroussin TAG_DL, 3961d06d6bSBaptiste Daroussin TAG_DT, 4061d06d6bSBaptiste Daroussin TAG_DD, 41*6d38604fSBaptiste Daroussin TAG_H1, 42*6d38604fSBaptiste Daroussin TAG_H2, 437295610fSBaptiste Daroussin TAG_P, 4461d06d6bSBaptiste Daroussin TAG_PRE, 45*6d38604fSBaptiste Daroussin TAG_A, 4661d06d6bSBaptiste Daroussin TAG_B, 47*6d38604fSBaptiste Daroussin TAG_CITE, 4861d06d6bSBaptiste Daroussin TAG_CODE, 49*6d38604fSBaptiste Daroussin TAG_I, 5061d06d6bSBaptiste Daroussin TAG_SMALL, 51*6d38604fSBaptiste Daroussin TAG_SPAN, 52*6d38604fSBaptiste Daroussin TAG_VAR, 53*6d38604fSBaptiste Daroussin TAG_BR, 54*6d38604fSBaptiste Daroussin TAG_HR, 55*6d38604fSBaptiste Daroussin TAG_MARK, 5661d06d6bSBaptiste Daroussin TAG_MATH, 5761d06d6bSBaptiste Daroussin TAG_MROW, 5861d06d6bSBaptiste Daroussin TAG_MI, 5961d06d6bSBaptiste Daroussin TAG_MN, 6061d06d6bSBaptiste Daroussin TAG_MO, 6161d06d6bSBaptiste Daroussin TAG_MSUP, 6261d06d6bSBaptiste Daroussin TAG_MSUB, 6361d06d6bSBaptiste Daroussin TAG_MSUBSUP, 6461d06d6bSBaptiste Daroussin TAG_MFRAC, 6561d06d6bSBaptiste Daroussin TAG_MSQRT, 6661d06d6bSBaptiste Daroussin TAG_MFENCED, 6761d06d6bSBaptiste Daroussin TAG_MTABLE, 6861d06d6bSBaptiste Daroussin TAG_MTR, 6961d06d6bSBaptiste Daroussin TAG_MTD, 7061d06d6bSBaptiste Daroussin TAG_MUNDEROVER, 7161d06d6bSBaptiste Daroussin TAG_MUNDER, 7261d06d6bSBaptiste Daroussin TAG_MOVER, 7361d06d6bSBaptiste Daroussin TAG_MAX 7461d06d6bSBaptiste Daroussin }; 7561d06d6bSBaptiste Daroussin 7661d06d6bSBaptiste Daroussin struct tag { 7761d06d6bSBaptiste Daroussin struct tag *next; 787295610fSBaptiste Daroussin int refcnt; 797295610fSBaptiste Daroussin int closed; 8061d06d6bSBaptiste Daroussin enum htmltag tag; 8161d06d6bSBaptiste Daroussin }; 8261d06d6bSBaptiste Daroussin 8361d06d6bSBaptiste Daroussin struct html { 8461d06d6bSBaptiste Daroussin int flags; 8561d06d6bSBaptiste Daroussin #define HTML_NOSPACE (1 << 0) /* suppress next space */ 8661d06d6bSBaptiste Daroussin #define HTML_IGNDELIM (1 << 1) 8761d06d6bSBaptiste Daroussin #define HTML_KEEP (1 << 2) 8861d06d6bSBaptiste Daroussin #define HTML_PREKEEP (1 << 3) 8961d06d6bSBaptiste Daroussin #define HTML_NONOSPACE (1 << 4) /* never add spaces */ 9061d06d6bSBaptiste Daroussin #define HTML_SKIPCHAR (1 << 6) /* skip the next character */ 9161d06d6bSBaptiste Daroussin #define HTML_NOSPLIT (1 << 7) /* do not break line before .An */ 9261d06d6bSBaptiste Daroussin #define HTML_SPLIT (1 << 8) /* break line before .An */ 9361d06d6bSBaptiste Daroussin #define HTML_NONEWLINE (1 << 9) /* No line break in nofill mode. */ 9461d06d6bSBaptiste Daroussin #define HTML_BUFFER (1 << 10) /* Collect a word to see if it fits. */ 957295610fSBaptiste Daroussin #define HTML_TOCDONE (1 << 11) /* The TOC was already written. */ 9661d06d6bSBaptiste Daroussin size_t indent; /* current output indentation level */ 9761d06d6bSBaptiste Daroussin int noindent; /* indent disabled by <pre> */ 9861d06d6bSBaptiste Daroussin size_t col; /* current output byte position */ 9961d06d6bSBaptiste Daroussin size_t bufcol; /* current buf byte position */ 10061d06d6bSBaptiste Daroussin char buf[80]; /* output buffer */ 10161d06d6bSBaptiste Daroussin struct tag *tag; /* last open tag */ 10261d06d6bSBaptiste Daroussin struct rofftbl tbl; /* current table */ 10361d06d6bSBaptiste Daroussin struct tag *tblt; /* current open table scope */ 1047295610fSBaptiste Daroussin char *base_man1; /* bases for manpage href */ 1057295610fSBaptiste Daroussin char *base_man2; 10661d06d6bSBaptiste Daroussin char *base_includes; /* base for include href */ 10761d06d6bSBaptiste Daroussin char *style; /* style-sheet URI */ 10861d06d6bSBaptiste Daroussin struct tag *metaf; /* current open font scope */ 10945a5aec3SBaptiste Daroussin enum mandoc_esc metal; /* last used font */ 11045a5aec3SBaptiste Daroussin enum mandoc_esc metac; /* current font mode */ 11161d06d6bSBaptiste Daroussin int oflags; /* output options */ 11261d06d6bSBaptiste Daroussin #define HTML_FRAGMENT (1 << 0) /* don't emit HTML/HEAD/BODY */ 1137295610fSBaptiste Daroussin #define HTML_TOC (1 << 1) /* emit a table of contents */ 11461d06d6bSBaptiste Daroussin }; 11561d06d6bSBaptiste Daroussin 11661d06d6bSBaptiste Daroussin 11761d06d6bSBaptiste Daroussin struct roff_node; 11861d06d6bSBaptiste Daroussin struct tbl_span; 11961d06d6bSBaptiste Daroussin struct eqn_box; 12061d06d6bSBaptiste Daroussin 12161d06d6bSBaptiste Daroussin void roff_html_pre(struct html *, const struct roff_node *); 12261d06d6bSBaptiste Daroussin 12361d06d6bSBaptiste Daroussin void print_gen_comment(struct html *, struct roff_node *); 12461d06d6bSBaptiste Daroussin void print_gen_decls(struct html *); 12561d06d6bSBaptiste Daroussin void print_gen_head(struct html *); 12661d06d6bSBaptiste Daroussin struct tag *print_otag(struct html *, enum htmltag, const char *, ...); 127*6d38604fSBaptiste Daroussin struct tag *print_otag_id(struct html *, enum htmltag, const char *, 128*6d38604fSBaptiste Daroussin struct roff_node *); 12961d06d6bSBaptiste Daroussin void print_tagq(struct html *, const struct tag *); 13061d06d6bSBaptiste Daroussin void print_stagq(struct html *, const struct tag *); 131*6d38604fSBaptiste Daroussin void print_tagged_text(struct html *, const char *, 132*6d38604fSBaptiste Daroussin struct roff_node *); 13361d06d6bSBaptiste Daroussin void print_text(struct html *, const char *); 13461d06d6bSBaptiste Daroussin void print_tblclose(struct html *); 13561d06d6bSBaptiste Daroussin void print_tbl(struct html *, const struct tbl_span *); 13661d06d6bSBaptiste Daroussin void print_eqn(struct html *, const struct eqn_box *); 13761d06d6bSBaptiste Daroussin void print_endline(struct html *); 13861d06d6bSBaptiste Daroussin 1397295610fSBaptiste Daroussin void html_close_paragraph(struct html *); 1407295610fSBaptiste Daroussin enum roff_tok html_fillmode(struct html *, enum roff_tok); 14161d06d6bSBaptiste Daroussin char *html_make_id(const struct roff_node *, int); 14245a5aec3SBaptiste Daroussin int html_setfont(struct html *, enum mandoc_esc); 143