1*99db7d0eSSascha Wildner /* $Id: html.h,v 1.109 2021/09/09 14:47:24 schwarze Exp $ */ 280387638SSascha Wildner /* 3*99db7d0eSSascha Wildner * Copyright (c) 2017, 2018, 2019, 2020 Ingo Schwarze <schwarze@openbsd.org> 454ba9607SSascha Wildner * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> 580387638SSascha Wildner * 680387638SSascha Wildner * Permission to use, copy, modify, and distribute this software for any 780387638SSascha Wildner * purpose with or without fee is hereby granted, provided that the above 880387638SSascha Wildner * copyright notice and this permission notice appear in all copies. 980387638SSascha Wildner * 1080387638SSascha Wildner * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1180387638SSascha Wildner * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1280387638SSascha Wildner * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1380387638SSascha Wildner * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1480387638SSascha Wildner * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1580387638SSascha Wildner * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1680387638SSascha Wildner * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17*99db7d0eSSascha Wildner * 18*99db7d0eSSascha Wildner * Internal interfaces for mandoc(1) HTML formatters. 19*99db7d0eSSascha Wildner * For use by the individual HTML formatters only. 2080387638SSascha Wildner */ 2180387638SSascha Wildner 2280387638SSascha Wildner enum htmltag { 2380387638SSascha Wildner TAG_HTML, 2480387638SSascha Wildner TAG_HEAD, 2580387638SSascha Wildner TAG_META, 2680387638SSascha Wildner TAG_LINK, 27*99db7d0eSSascha Wildner TAG_STYLE, 28*99db7d0eSSascha Wildner TAG_TITLE, 29*99db7d0eSSascha Wildner TAG_BODY, 30*99db7d0eSSascha Wildner TAG_DIV, 31*99db7d0eSSascha Wildner TAG_SECTION, 3280387638SSascha Wildner TAG_TABLE, 3380387638SSascha Wildner TAG_TR, 3480387638SSascha Wildner TAG_TD, 3580387638SSascha Wildner TAG_LI, 3680387638SSascha Wildner TAG_UL, 3780387638SSascha Wildner TAG_OL, 3880387638SSascha Wildner TAG_DL, 3980387638SSascha Wildner TAG_DT, 4080387638SSascha Wildner TAG_DD, 41*99db7d0eSSascha Wildner TAG_H1, 42*99db7d0eSSascha Wildner TAG_H2, 4380387638SSascha Wildner TAG_P, 4480387638SSascha Wildner TAG_PRE, 45*99db7d0eSSascha Wildner TAG_A, 4680387638SSascha Wildner TAG_B, 47*99db7d0eSSascha Wildner TAG_CITE, 4880387638SSascha Wildner TAG_CODE, 49*99db7d0eSSascha Wildner TAG_I, 5080387638SSascha Wildner TAG_SMALL, 51*99db7d0eSSascha Wildner TAG_SPAN, 52*99db7d0eSSascha Wildner TAG_VAR, 53*99db7d0eSSascha Wildner TAG_BR, 54*99db7d0eSSascha Wildner TAG_HR, 55*99db7d0eSSascha Wildner TAG_MARK, 5654ba9607SSascha Wildner TAG_MATH, 5754ba9607SSascha Wildner TAG_MROW, 5854ba9607SSascha Wildner TAG_MI, 5954ba9607SSascha Wildner TAG_MN, 6054ba9607SSascha Wildner TAG_MO, 6154ba9607SSascha Wildner TAG_MSUP, 6254ba9607SSascha Wildner TAG_MSUB, 6354ba9607SSascha Wildner TAG_MSUBSUP, 6454ba9607SSascha Wildner TAG_MFRAC, 6554ba9607SSascha Wildner TAG_MSQRT, 6654ba9607SSascha Wildner TAG_MFENCED, 6754ba9607SSascha Wildner TAG_MTABLE, 6854ba9607SSascha Wildner TAG_MTR, 6954ba9607SSascha Wildner TAG_MTD, 7054ba9607SSascha Wildner TAG_MUNDEROVER, 7154ba9607SSascha Wildner TAG_MUNDER, 7254ba9607SSascha Wildner TAG_MOVER, 7380387638SSascha Wildner TAG_MAX 7480387638SSascha Wildner }; 7580387638SSascha Wildner 7680387638SSascha Wildner struct tag { 7780387638SSascha Wildner struct tag *next; 7854ba9607SSascha Wildner int refcnt; 7954ba9607SSascha Wildner int closed; 8080387638SSascha Wildner enum htmltag tag; 8180387638SSascha Wildner }; 8280387638SSascha Wildner 8380387638SSascha Wildner struct html { 8480387638SSascha Wildner int flags; 8560e1e752SSascha Wildner #define HTML_NOSPACE (1 << 0) /* suppress next space */ 8680387638SSascha Wildner #define HTML_IGNDELIM (1 << 1) 8780387638SSascha Wildner #define HTML_KEEP (1 << 2) 8880387638SSascha Wildner #define HTML_PREKEEP (1 << 3) 8960e1e752SSascha Wildner #define HTML_NONOSPACE (1 << 4) /* never add spaces */ 90f88b6c16SFranco Fichtner #define HTML_SKIPCHAR (1 << 6) /* skip the next character */ 9154ba9607SSascha Wildner #define HTML_NOSPLIT (1 << 7) /* do not break line before .An */ 9254ba9607SSascha Wildner #define HTML_SPLIT (1 << 8) /* break line before .An */ 9354ba9607SSascha Wildner #define HTML_NONEWLINE (1 << 9) /* No line break in nofill mode. */ 9454ba9607SSascha Wildner #define HTML_BUFFER (1 << 10) /* Collect a word to see if it fits. */ 9554ba9607SSascha Wildner #define HTML_TOCDONE (1 << 11) /* The TOC was already written. */ 9654ba9607SSascha Wildner size_t indent; /* current output indentation level */ 9754ba9607SSascha Wildner int noindent; /* indent disabled by <pre> */ 9854ba9607SSascha Wildner size_t col; /* current output byte position */ 9954ba9607SSascha Wildner size_t bufcol; /* current buf byte position */ 10054ba9607SSascha Wildner char buf[80]; /* output buffer */ 10154ba9607SSascha Wildner struct tag *tag; /* last open tag */ 10280387638SSascha Wildner struct rofftbl tbl; /* current table */ 10360e1e752SSascha Wildner struct tag *tblt; /* current open table scope */ 10454ba9607SSascha Wildner char *base_man1; /* bases for manpage href */ 10554ba9607SSascha Wildner char *base_man2; 10680387638SSascha Wildner char *base_includes; /* base for include href */ 10780387638SSascha Wildner char *style; /* style-sheet URI */ 10880387638SSascha Wildner struct tag *metaf; /* current open font scope */ 109*99db7d0eSSascha Wildner enum mandoc_esc metal; /* last used font */ 110*99db7d0eSSascha Wildner enum mandoc_esc metac; /* current font mode */ 11136342e81SSascha Wildner int oflags; /* output options */ 11236342e81SSascha Wildner #define HTML_FRAGMENT (1 << 0) /* don't emit HTML/HEAD/BODY */ 11354ba9607SSascha Wildner #define HTML_TOC (1 << 1) /* emit a table of contents */ 11480387638SSascha Wildner }; 11580387638SSascha Wildner 11654ba9607SSascha Wildner 11754ba9607SSascha Wildner struct roff_node; 11854ba9607SSascha Wildner struct tbl_span; 11954ba9607SSascha Wildner struct eqn_box; 12054ba9607SSascha Wildner 12154ba9607SSascha Wildner void roff_html_pre(struct html *, const struct roff_node *); 12254ba9607SSascha Wildner 12354ba9607SSascha Wildner void print_gen_comment(struct html *, struct roff_node *); 12480387638SSascha Wildner void print_gen_decls(struct html *); 12580387638SSascha Wildner void print_gen_head(struct html *); 12654ba9607SSascha Wildner struct tag *print_otag(struct html *, enum htmltag, const char *, ...); 127*99db7d0eSSascha Wildner struct tag *print_otag_id(struct html *, enum htmltag, const char *, 128*99db7d0eSSascha Wildner struct roff_node *); 12980387638SSascha Wildner void print_tagq(struct html *, const struct tag *); 13080387638SSascha Wildner void print_stagq(struct html *, const struct tag *); 131*99db7d0eSSascha Wildner void print_tagged_text(struct html *, const char *, 132*99db7d0eSSascha Wildner struct roff_node *); 13380387638SSascha Wildner void print_text(struct html *, const char *); 13460e1e752SSascha Wildner void print_tblclose(struct html *); 13580387638SSascha Wildner void print_tbl(struct html *, const struct tbl_span *); 13654ba9607SSascha Wildner void print_eqn(struct html *, const struct eqn_box *); 13754ba9607SSascha Wildner void print_endline(struct html *); 13880387638SSascha Wildner 13954ba9607SSascha Wildner void html_close_paragraph(struct html *); 14054ba9607SSascha Wildner enum roff_tok html_fillmode(struct html *, enum roff_tok); 14154ba9607SSascha Wildner char *html_make_id(const struct roff_node *, int); 142*99db7d0eSSascha Wildner int html_setfont(struct html *, enum mandoc_esc); 143