1*6d38604fSBaptiste Daroussin.\" $Id: mandoc_html.3,v 1.23 2020/04/24 13:13:06 schwarze Exp $ 261d06d6bSBaptiste Daroussin.\" 361d06d6bSBaptiste Daroussin.\" Copyright (c) 2014, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> 461d06d6bSBaptiste Daroussin.\" 561d06d6bSBaptiste Daroussin.\" Permission to use, copy, modify, and distribute this software for any 661d06d6bSBaptiste Daroussin.\" purpose with or without fee is hereby granted, provided that the above 761d06d6bSBaptiste Daroussin.\" copyright notice and this permission notice appear in all copies. 861d06d6bSBaptiste Daroussin.\" 961d06d6bSBaptiste Daroussin.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1061d06d6bSBaptiste Daroussin.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1161d06d6bSBaptiste Daroussin.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1261d06d6bSBaptiste Daroussin.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1361d06d6bSBaptiste Daroussin.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1461d06d6bSBaptiste Daroussin.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1561d06d6bSBaptiste Daroussin.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1661d06d6bSBaptiste Daroussin.\" 17*6d38604fSBaptiste Daroussin.Dd $Mdocdate: April 24 2020 $ 1861d06d6bSBaptiste Daroussin.Dt MANDOC_HTML 3 1961d06d6bSBaptiste Daroussin.Os 2061d06d6bSBaptiste Daroussin.Sh NAME 2161d06d6bSBaptiste Daroussin.Nm mandoc_html 2261d06d6bSBaptiste Daroussin.Nd internals of the mandoc HTML formatter 2361d06d6bSBaptiste Daroussin.Sh SYNOPSIS 24*6d38604fSBaptiste Daroussin.In sys/types.h 25*6d38604fSBaptiste Daroussin.Fd #include """mandoc.h""" 26*6d38604fSBaptiste Daroussin.Fd #include """roff.h""" 27*6d38604fSBaptiste Daroussin.Fd #include """out.h""" 28*6d38604fSBaptiste Daroussin.Fd #include """html.h""" 2961d06d6bSBaptiste Daroussin.Ft void 3061d06d6bSBaptiste Daroussin.Fn print_gen_decls "struct html *h" 3161d06d6bSBaptiste Daroussin.Ft void 3261d06d6bSBaptiste Daroussin.Fn print_gen_comment "struct html *h" "struct roff_node *n" 3361d06d6bSBaptiste Daroussin.Ft void 3461d06d6bSBaptiste Daroussin.Fn print_gen_head "struct html *h" 3561d06d6bSBaptiste Daroussin.Ft struct tag * 3661d06d6bSBaptiste Daroussin.Fo print_otag 3761d06d6bSBaptiste Daroussin.Fa "struct html *h" 3861d06d6bSBaptiste Daroussin.Fa "enum htmltag tag" 3961d06d6bSBaptiste Daroussin.Fa "const char *fmt" 4061d06d6bSBaptiste Daroussin.Fa ... 4161d06d6bSBaptiste Daroussin.Fc 4261d06d6bSBaptiste Daroussin.Ft void 4361d06d6bSBaptiste Daroussin.Fo print_tagq 4461d06d6bSBaptiste Daroussin.Fa "struct html *h" 4561d06d6bSBaptiste Daroussin.Fa "const struct tag *until" 4661d06d6bSBaptiste Daroussin.Fc 4761d06d6bSBaptiste Daroussin.Ft void 4861d06d6bSBaptiste Daroussin.Fo print_stagq 4961d06d6bSBaptiste Daroussin.Fa "struct html *h" 5061d06d6bSBaptiste Daroussin.Fa "const struct tag *suntil" 5161d06d6bSBaptiste Daroussin.Fc 5261d06d6bSBaptiste Daroussin.Ft void 53*6d38604fSBaptiste Daroussin.Fn html_close_paragraph "struct html *h" 54*6d38604fSBaptiste Daroussin.Ft enum roff_tok 55*6d38604fSBaptiste Daroussin.Fo html_fillmode 56*6d38604fSBaptiste Daroussin.Fa "struct html *h" 57*6d38604fSBaptiste Daroussin.Fa "enum roff_tok tok" 58*6d38604fSBaptiste Daroussin.Fc 59*6d38604fSBaptiste Daroussin.Ft int 60*6d38604fSBaptiste Daroussin.Fo html_setfont 61*6d38604fSBaptiste Daroussin.Fa "struct html *h" 62*6d38604fSBaptiste Daroussin.Fa "enum mandoc_esc font" 63*6d38604fSBaptiste Daroussin.Fc 64*6d38604fSBaptiste Daroussin.Ft void 6561d06d6bSBaptiste Daroussin.Fo print_text 6661d06d6bSBaptiste Daroussin.Fa "struct html *h" 6761d06d6bSBaptiste Daroussin.Fa "const char *word" 6861d06d6bSBaptiste Daroussin.Fc 69*6d38604fSBaptiste Daroussin.Ft void 70*6d38604fSBaptiste Daroussin.Fo print_tagged_text 71*6d38604fSBaptiste Daroussin.Fa "struct html *h" 72*6d38604fSBaptiste Daroussin.Fa "const char *word" 73*6d38604fSBaptiste Daroussin.Fa "struct roff_node *n" 74*6d38604fSBaptiste Daroussin.Fc 7561d06d6bSBaptiste Daroussin.Ft char * 7661d06d6bSBaptiste Daroussin.Fo html_make_id 7761d06d6bSBaptiste Daroussin.Fa "const struct roff_node *n" 78*6d38604fSBaptiste Daroussin.Fa "int unique" 7961d06d6bSBaptiste Daroussin.Fc 80*6d38604fSBaptiste Daroussin.Ft struct tag * 81*6d38604fSBaptiste Daroussin.Fo print_otag_id 82*6d38604fSBaptiste Daroussin.Fa "struct html *h" 83*6d38604fSBaptiste Daroussin.Fa "enum htmltag tag" 84*6d38604fSBaptiste Daroussin.Fa "const char *cattr" 85*6d38604fSBaptiste Daroussin.Fa "struct roff_node *n" 8661d06d6bSBaptiste Daroussin.Fc 87*6d38604fSBaptiste Daroussin.Ft void 88*6d38604fSBaptiste Daroussin.Fn print_endline "struct html *h" 8961d06d6bSBaptiste Daroussin.Sh DESCRIPTION 9061d06d6bSBaptiste DaroussinThe mandoc HTML formatter is not a formal library. 9161d06d6bSBaptiste DaroussinHowever, as it is compiled into more than one program, in particular 9261d06d6bSBaptiste Daroussin.Xr mandoc 1 9361d06d6bSBaptiste Daroussinand 9461d06d6bSBaptiste Daroussin.Xr man.cgi 8 , 9561d06d6bSBaptiste Daroussinand because it may be security-critical in some contexts, 9661d06d6bSBaptiste Daroussinsome documentation is useful to help to use it correctly and 9761d06d6bSBaptiste Daroussinto prevent XSS vulnerabilities. 9861d06d6bSBaptiste Daroussin.Pp 9961d06d6bSBaptiste DaroussinThe formatter produces HTML output on the standard output. 10061d06d6bSBaptiste DaroussinSince proper escaping is usually required and best taken care of 10161d06d6bSBaptiste Daroussinat one central place, the language-specific formatters 10261d06d6bSBaptiste Daroussin.Po 10361d06d6bSBaptiste Daroussin.Pa *_html.c , 10461d06d6bSBaptiste Daroussinsee 10561d06d6bSBaptiste Daroussin.Sx FILES 10661d06d6bSBaptiste Daroussin.Pc 10761d06d6bSBaptiste Daroussinare not supposed to print directly to 10861d06d6bSBaptiste Daroussin.Dv stdout 10961d06d6bSBaptiste Daroussinusing functions like 11061d06d6bSBaptiste Daroussin.Xr printf 3 , 11161d06d6bSBaptiste Daroussin.Xr putc 3 , 11261d06d6bSBaptiste Daroussin.Xr puts 3 , 11361d06d6bSBaptiste Daroussinor 11461d06d6bSBaptiste Daroussin.Xr write 2 . 11561d06d6bSBaptiste DaroussinInstead, they are expected to use the output functions declared in 11661d06d6bSBaptiste Daroussin.Pa html.h 11761d06d6bSBaptiste Daroussinand implemented as part of the main HTML formatting engine in 11861d06d6bSBaptiste Daroussin.Pa html.c . 11961d06d6bSBaptiste Daroussin.Ss Data structures 12061d06d6bSBaptiste DaroussinThese structures are declared in 12161d06d6bSBaptiste Daroussin.Pa html.h . 12261d06d6bSBaptiste Daroussin.Bl -tag -width Ds 12361d06d6bSBaptiste Daroussin.It Vt struct html 12461d06d6bSBaptiste DaroussinInternal state of the HTML formatter. 12561d06d6bSBaptiste Daroussin.It Vt struct tag 12661d06d6bSBaptiste DaroussinOne entry for the LIFO stack of HTML elements. 127*6d38604fSBaptiste DaroussinMembers include 12861d06d6bSBaptiste Daroussin.Fa "enum htmltag tag" 12961d06d6bSBaptiste Daroussinand 13061d06d6bSBaptiste Daroussin.Fa "struct tag *next" . 13161d06d6bSBaptiste Daroussin.El 13261d06d6bSBaptiste Daroussin.Ss Private interface functions 13361d06d6bSBaptiste DaroussinThe function 13461d06d6bSBaptiste Daroussin.Fn print_gen_decls 13561d06d6bSBaptiste Daroussinprints the opening 13661d06d6bSBaptiste Daroussin.Aq Pf \&! Ic DOCTYPE 137*6d38604fSBaptiste Daroussindeclaration. 13861d06d6bSBaptiste Daroussin.Pp 13961d06d6bSBaptiste DaroussinThe function 14061d06d6bSBaptiste Daroussin.Fn print_gen_comment 14161d06d6bSBaptiste Daroussinprints the leading comments, usually containing a Copyright notice 14261d06d6bSBaptiste Daroussinand license, as an HTML comment. 14361d06d6bSBaptiste DaroussinIt is intended to be called right after opening the 14461d06d6bSBaptiste Daroussin.Aq Ic HTML 14561d06d6bSBaptiste Daroussinelement. 14661d06d6bSBaptiste DaroussinPass the first 14761d06d6bSBaptiste Daroussin.Dv ROFFT_COMMENT 14861d06d6bSBaptiste Daroussinnode in 14961d06d6bSBaptiste Daroussin.Fa n . 15061d06d6bSBaptiste Daroussin.Pp 15161d06d6bSBaptiste DaroussinThe function 15261d06d6bSBaptiste Daroussin.Fn print_gen_head 15361d06d6bSBaptiste Daroussinprints the opening 15461d06d6bSBaptiste Daroussin.Aq Ic META 15561d06d6bSBaptiste Daroussinand 15661d06d6bSBaptiste Daroussin.Aq Ic LINK 15761d06d6bSBaptiste Daroussinelements for the document 15861d06d6bSBaptiste Daroussin.Aq Ic HEAD , 15961d06d6bSBaptiste Daroussinusing the 16061d06d6bSBaptiste Daroussin.Fa style 16161d06d6bSBaptiste Daroussinmember of 16261d06d6bSBaptiste Daroussin.Fa h 16361d06d6bSBaptiste Daroussinunless that is 16461d06d6bSBaptiste Daroussin.Dv NULL . 16561d06d6bSBaptiste DaroussinIt uses 16661d06d6bSBaptiste Daroussin.Fn print_otag 16761d06d6bSBaptiste Daroussinwhich takes care of properly encoding attributes, 16861d06d6bSBaptiste Daroussinwhich is relevant for the 16961d06d6bSBaptiste Daroussin.Fa style 17061d06d6bSBaptiste Daroussinlink in particular. 17161d06d6bSBaptiste Daroussin.Pp 17261d06d6bSBaptiste DaroussinThe function 17361d06d6bSBaptiste Daroussin.Fn print_otag 17461d06d6bSBaptiste Daroussinprints the start tag of an HTML element with the name 17561d06d6bSBaptiste Daroussin.Fa tag , 17661d06d6bSBaptiste Daroussinoptionally including the attributes specified by 17761d06d6bSBaptiste Daroussin.Fa fmt . 17861d06d6bSBaptiste DaroussinIf 17961d06d6bSBaptiste Daroussin.Fa fmt 18061d06d6bSBaptiste Daroussinis the empty string, no attributes are written. 18161d06d6bSBaptiste DaroussinEach letter of 18261d06d6bSBaptiste Daroussin.Fa fmt 18361d06d6bSBaptiste Daroussinspecifies one attribute to write. 18461d06d6bSBaptiste DaroussinMost attributes require one 18561d06d6bSBaptiste Daroussin.Va char * 18661d06d6bSBaptiste Daroussinargument which becomes the value of the attribute. 18761d06d6bSBaptiste DaroussinThe arguments have to be given in the same order as the attribute letters. 18861d06d6bSBaptiste DaroussinIf an argument is 18961d06d6bSBaptiste Daroussin.Dv NULL , 19061d06d6bSBaptiste Daroussinthe respective attribute is not written. 19161d06d6bSBaptiste Daroussin.Bl -tag -width 1n -offset indent 19261d06d6bSBaptiste Daroussin.It Cm c 19361d06d6bSBaptiste DaroussinPrint a 19461d06d6bSBaptiste Daroussin.Cm class 19561d06d6bSBaptiste Daroussinattribute. 19661d06d6bSBaptiste Daroussin.It Cm h 19761d06d6bSBaptiste DaroussinPrint a 19861d06d6bSBaptiste Daroussin.Cm href 19961d06d6bSBaptiste Daroussinattribute. 20061d06d6bSBaptiste DaroussinThis attribute letter can optionally be followed by a modifier letter. 20161d06d6bSBaptiste DaroussinIf followed by 20261d06d6bSBaptiste Daroussin.Cm R , 20361d06d6bSBaptiste Daroussinit formats the link as a local one by prefixing a 20461d06d6bSBaptiste Daroussin.Sq # 20561d06d6bSBaptiste Daroussincharacter. 20661d06d6bSBaptiste DaroussinIf followed by 20761d06d6bSBaptiste Daroussin.Cm I , 20861d06d6bSBaptiste Daroussinit interpretes the argument as a header file name 20961d06d6bSBaptiste Daroussinand generates a link using the 21061d06d6bSBaptiste Daroussin.Xr mandoc 1 21161d06d6bSBaptiste Daroussin.Fl O Cm includes 21261d06d6bSBaptiste Daroussinoption. 21361d06d6bSBaptiste DaroussinIf followed by 21461d06d6bSBaptiste Daroussin.Cm M , 21561d06d6bSBaptiste Daroussinit takes two arguments instead of one, a manual page name and 21661d06d6bSBaptiste Daroussinsection, and formats them as a link to a manual page using the 21761d06d6bSBaptiste Daroussin.Xr mandoc 1 21861d06d6bSBaptiste Daroussin.Fl O Cm man 21961d06d6bSBaptiste Daroussinoption. 22061d06d6bSBaptiste Daroussin.It Cm i 22161d06d6bSBaptiste DaroussinPrint an 22261d06d6bSBaptiste Daroussin.Cm id 22361d06d6bSBaptiste Daroussinattribute. 22461d06d6bSBaptiste Daroussin.It Cm \&? 22561d06d6bSBaptiste DaroussinPrint an arbitrary attribute. 22661d06d6bSBaptiste DaroussinThis format letter requires two 22761d06d6bSBaptiste Daroussin.Vt char * 22861d06d6bSBaptiste Daroussinarguments, the attribute name and the value. 22961d06d6bSBaptiste DaroussinThe name must not be 23061d06d6bSBaptiste Daroussin.Dv NULL . 23161d06d6bSBaptiste Daroussin.It Cm s 23261d06d6bSBaptiste DaroussinPrint a 23361d06d6bSBaptiste Daroussin.Cm style 23461d06d6bSBaptiste Daroussinattribute. 23561d06d6bSBaptiste DaroussinIf present, it must be the last format letter. 23661d06d6bSBaptiste DaroussinIt requires two 23761d06d6bSBaptiste Daroussin.Va char * 23861d06d6bSBaptiste Daroussinarguments. 23961d06d6bSBaptiste DaroussinThe first is the name of the style property, the second its value. 2407295610fSBaptiste DaroussinThe name must not be 2417295610fSBaptiste Daroussin.Dv NULL . 2427295610fSBaptiste DaroussinThe 2437295610fSBaptiste Daroussin.Cm s 2447295610fSBaptiste Daroussin.Ar fmt 2457295610fSBaptiste Daroussinletter can be repeated, each repetition requiring an additional pair of 2467295610fSBaptiste Daroussin.Va char * 2477295610fSBaptiste Daroussinarguments. 24861d06d6bSBaptiste Daroussin.El 24961d06d6bSBaptiste Daroussin.Pp 25061d06d6bSBaptiste Daroussin.Fn print_otag 25161d06d6bSBaptiste Daroussinuses the private function 25261d06d6bSBaptiste Daroussin.Fn print_encode 25361d06d6bSBaptiste Daroussinto take care of HTML encoding. 25461d06d6bSBaptiste DaroussinIf required by the element type, it remembers in 25561d06d6bSBaptiste Daroussin.Fa h 25661d06d6bSBaptiste Daroussinthat the element is open. 25761d06d6bSBaptiste DaroussinThe function 25861d06d6bSBaptiste Daroussin.Fn print_tagq 25961d06d6bSBaptiste Daroussinis used to close out all open elements up to and including 26061d06d6bSBaptiste Daroussin.Fa until ; 26161d06d6bSBaptiste Daroussin.Fn print_stagq 26261d06d6bSBaptiste Daroussinis a variant to close out all open elements up to but excluding 26361d06d6bSBaptiste Daroussin.Fa suntil . 264*6d38604fSBaptiste DaroussinThe function 265*6d38604fSBaptiste Daroussin.Fn html_close_paragraph 266*6d38604fSBaptiste Daroussincloses all open elements that establish phrasing context, 267*6d38604fSBaptiste Daroussinthus returning to the innermost flow context. 268*6d38604fSBaptiste Daroussin.Pp 269*6d38604fSBaptiste DaroussinThe function 270*6d38604fSBaptiste Daroussin.Fn html_fillmode 271*6d38604fSBaptiste Daroussinswitches to fill mode if 272*6d38604fSBaptiste Daroussin.Fa want 273*6d38604fSBaptiste Daroussinis 274*6d38604fSBaptiste Daroussin.Dv ROFF_fi 275*6d38604fSBaptiste Daroussinor to no-fill mode if 276*6d38604fSBaptiste Daroussin.Fa want 277*6d38604fSBaptiste Daroussinis 278*6d38604fSBaptiste Daroussin.Dv ROFF_nf . 279*6d38604fSBaptiste DaroussinSwitching from fill mode to no-fill mode closes the current paragraph 280*6d38604fSBaptiste Daroussinand opens a 281*6d38604fSBaptiste Daroussin.Aq Ic PRE 282*6d38604fSBaptiste Daroussinelement. 283*6d38604fSBaptiste DaroussinSwitching in the opposite direction closes the 284*6d38604fSBaptiste Daroussin.Aq Ic PRE 285*6d38604fSBaptiste Daroussinelement, but does not open a new paragraph. 286*6d38604fSBaptiste DaroussinIf 287*6d38604fSBaptiste Daroussin.Fa want 288*6d38604fSBaptiste Daroussinmatches the mode that is already active, no elements are closed nor opened. 289*6d38604fSBaptiste DaroussinIf 290*6d38604fSBaptiste Daroussin.Fa want 291*6d38604fSBaptiste Daroussinis 292*6d38604fSBaptiste Daroussin.Dv TOKEN_NONE , 293*6d38604fSBaptiste Daroussinthe mode remains as it is. 294*6d38604fSBaptiste Daroussin.Pp 295*6d38604fSBaptiste DaroussinThe function 296*6d38604fSBaptiste Daroussin.Fn html_setfont 297*6d38604fSBaptiste Daroussinselects the 298*6d38604fSBaptiste Daroussin.Fa font , 299*6d38604fSBaptiste Daroussinwhich can be 300*6d38604fSBaptiste Daroussin.Dv ESCAPE_FONTROMAN , 301*6d38604fSBaptiste Daroussin.Dv ESCAPE_FONTBOLD , 302*6d38604fSBaptiste Daroussin.Dv ESCAPE_FONTITALIC , 303*6d38604fSBaptiste Daroussin.Dv ESCAPE_FONTBI , 304*6d38604fSBaptiste Daroussinor 305*6d38604fSBaptiste Daroussin.Dv ESCAPE_FONTCW , 306*6d38604fSBaptiste Daroussinfor future text output and internally remembers 307*6d38604fSBaptiste Daroussinthe font that was active before the change. 308*6d38604fSBaptiste DaroussinIf the 309*6d38604fSBaptiste Daroussin.Fa font 310*6d38604fSBaptiste Daroussinargument is 311*6d38604fSBaptiste Daroussin.Dv ESCAPE_FONTPREV , 312*6d38604fSBaptiste Daroussinthe current and the previous font are exchanged. 313*6d38604fSBaptiste DaroussinThis function only changes the internal state of the 314*6d38604fSBaptiste Daroussin.Fa h 315*6d38604fSBaptiste Daroussinobject; no HTML elements are written yet. 316*6d38604fSBaptiste DaroussinSubsequent text output will write font elements when needed. 31761d06d6bSBaptiste Daroussin.Pp 31861d06d6bSBaptiste DaroussinThe function 31961d06d6bSBaptiste Daroussin.Fn print_text 32061d06d6bSBaptiste Daroussinprints HTML element content. 32161d06d6bSBaptiste DaroussinIt uses the private function 32261d06d6bSBaptiste Daroussin.Fn print_encode 32361d06d6bSBaptiste Daroussinto take care of HTML encoding. 32461d06d6bSBaptiste DaroussinIf the document has requested a non-standard font, for example using a 32561d06d6bSBaptiste Daroussin.Xr roff 7 32661d06d6bSBaptiste Daroussin.Ic \ef 32761d06d6bSBaptiste Daroussinfont escape sequence, 32861d06d6bSBaptiste Daroussin.Fn print_text 32961d06d6bSBaptiste Daroussinwraps 33061d06d6bSBaptiste Daroussin.Fa word 33161d06d6bSBaptiste Daroussinin an HTML font selection element using the 33261d06d6bSBaptiste Daroussin.Fn print_otag 33361d06d6bSBaptiste Daroussinand 33461d06d6bSBaptiste Daroussin.Fn print_tagq 33561d06d6bSBaptiste Daroussinfunctions. 33661d06d6bSBaptiste Daroussin.Pp 33761d06d6bSBaptiste DaroussinThe function 338*6d38604fSBaptiste Daroussin.Fn print_tagged_text 339*6d38604fSBaptiste Daroussinis a variant of 340*6d38604fSBaptiste Daroussin.Fn print_text 341*6d38604fSBaptiste Daroussinthat wraps 342*6d38604fSBaptiste Daroussin.Fa word 343*6d38604fSBaptiste Daroussinin an 344*6d38604fSBaptiste Daroussin.Aq Ic A 345*6d38604fSBaptiste Daroussinelement of class 346*6d38604fSBaptiste Daroussin.Qq permalink 347*6d38604fSBaptiste Daroussinif 34861d06d6bSBaptiste Daroussin.Fa n 349*6d38604fSBaptiste Daroussinis not 35061d06d6bSBaptiste Daroussin.Dv NULL 351*6d38604fSBaptiste Daroussinand yields a segment identifier when passed to 352*6d38604fSBaptiste Daroussin.Fn html_make_id . 35361d06d6bSBaptiste Daroussin.Pp 35461d06d6bSBaptiste DaroussinThe function 355*6d38604fSBaptiste Daroussin.Fn html_make_id 356*6d38604fSBaptiste Daroussinallocates a string to be used for the 357*6d38604fSBaptiste Daroussin.Cm id 358*6d38604fSBaptiste Daroussinattribute of an HTML element and/or as a segment identifier for a URI in an 359*6d38604fSBaptiste Daroussin.Aq Ic A 360*6d38604fSBaptiste Daroussinelement. 361*6d38604fSBaptiste DaroussinIf 362*6d38604fSBaptiste Daroussin.Fa n 363*6d38604fSBaptiste Daroussincontains a 364*6d38604fSBaptiste Daroussin.Fa tag 365*6d38604fSBaptiste Daroussinattribute, it is used; otherwise, child nodes are used. 366*6d38604fSBaptiste DaroussinIf 367*6d38604fSBaptiste Daroussin.Fa n 368*6d38604fSBaptiste Daroussinis an 369*6d38604fSBaptiste Daroussin.Ic \&Sh , 370*6d38604fSBaptiste Daroussin.Ic \&Ss , 371*6d38604fSBaptiste Daroussin.Ic \&Sx , 372*6d38604fSBaptiste Daroussin.Ic SH , 373*6d38604fSBaptiste Daroussinor 374*6d38604fSBaptiste Daroussin.Ic SS 375*6d38604fSBaptiste Daroussinnode, the resulting string is the concatenation of the child strings; 376*6d38604fSBaptiste Daroussinfor other node types, only the first child is used. 377*6d38604fSBaptiste DaroussinBytes not permitted in URI-fragment strings are replaced by underscores. 378*6d38604fSBaptiste DaroussinIf any of the children to be used is not a text node, 379*6d38604fSBaptiste Daroussinno string is generated and 380*6d38604fSBaptiste Daroussin.Dv NULL 381*6d38604fSBaptiste Daroussinis returned instead. 382*6d38604fSBaptiste DaroussinIf the 383*6d38604fSBaptiste Daroussin.Fa unique 384*6d38604fSBaptiste Daroussinargument is non-zero, deduplication is performed by appending an 385*6d38604fSBaptiste Daroussinunderscore and a decimal integer, if necessary. 386*6d38604fSBaptiste DaroussinIf the 387*6d38604fSBaptiste Daroussin.Fa unique 388*6d38604fSBaptiste Daroussinargument is 1, this is assumed to be the first call for this tag 389*6d38604fSBaptiste Daroussinat this location, typically for use by 390*6d38604fSBaptiste Daroussin.Dv NODE_ID , 391*6d38604fSBaptiste Daroussinso the integer is incremented before use. 392*6d38604fSBaptiste DaroussinIf the 393*6d38604fSBaptiste Daroussin.Fa unique 394*6d38604fSBaptiste Daroussinargument is 2, this is ssumed to be the second call for this tag 395*6d38604fSBaptiste Daroussinat this location, typically for use by 396*6d38604fSBaptiste Daroussin.Dv NODE_HREF , 397*6d38604fSBaptiste Daroussinso the existing integer, if any, is used without incrementing it. 398*6d38604fSBaptiste Daroussin.Pp 399*6d38604fSBaptiste DaroussinThe function 400*6d38604fSBaptiste Daroussin.Fn print_otag_id 401*6d38604fSBaptiste Daroussinopens a 402*6d38604fSBaptiste Daroussin.Fa tag 403*6d38604fSBaptiste Daroussinelement of class 404*6d38604fSBaptiste Daroussin.Fa cattr 405*6d38604fSBaptiste Daroussinfor the node 406*6d38604fSBaptiste Daroussin.Fa n . 407*6d38604fSBaptiste DaroussinIf the flag 408*6d38604fSBaptiste Daroussin.Dv NODE_ID 409*6d38604fSBaptiste Daroussinis set in 410*6d38604fSBaptiste Daroussin.Fa n , 411*6d38604fSBaptiste Daroussinit attempts to generate an 412*6d38604fSBaptiste Daroussin.Cm id 413*6d38604fSBaptiste Daroussinattribute with 414*6d38604fSBaptiste Daroussin.Fn html_make_id . 415*6d38604fSBaptiste DaroussinIf the flag 416*6d38604fSBaptiste Daroussin.Dv NODE_HREF 417*6d38604fSBaptiste Daroussinis set in 418*6d38604fSBaptiste Daroussin.Fa n , 419*6d38604fSBaptiste Daroussinan 420*6d38604fSBaptiste Daroussin.Aq Ic A 421*6d38604fSBaptiste Daroussinelement of class 422*6d38604fSBaptiste Daroussin.Qq permalink 423*6d38604fSBaptiste Daroussinis added: 424*6d38604fSBaptiste Daroussinoutside if 425*6d38604fSBaptiste Daroussin.Fa n 426*6d38604fSBaptiste Daroussingenerates an element that can only occur in phrasing context, 427*6d38604fSBaptiste Daroussinor inside otherwise. 428*6d38604fSBaptiste DaroussinThis function is a wrapper around 429*6d38604fSBaptiste Daroussin.Fn html_make_id 430*6d38604fSBaptiste Daroussinand 431*6d38604fSBaptiste Daroussin.Fn print_otag , 432*6d38604fSBaptiste Daroussinautomatically chosing the 433*6d38604fSBaptiste Daroussin.Fa unique 434*6d38604fSBaptiste Daroussinargument appropriately and setting the 435*6d38604fSBaptiste Daroussin.Fa fmt 436*6d38604fSBaptiste Daroussinarguments to 437*6d38604fSBaptiste Daroussin.Qq chR 438*6d38604fSBaptiste Daroussinand 439*6d38604fSBaptiste Daroussin.Qq ci , 440*6d38604fSBaptiste Daroussinrespectively. 441*6d38604fSBaptiste Daroussin.Pp 442*6d38604fSBaptiste DaroussinThe function 443*6d38604fSBaptiste Daroussin.Fn print_endline 444*6d38604fSBaptiste Daroussinmakes sure subsequent output starts on a new HTML output line. 445*6d38604fSBaptiste DaroussinIf nothing was printed on the current output line yet, it has no effect. 446*6d38604fSBaptiste DaroussinOtherwise, it appends any buffered text to the current output line, 447*6d38604fSBaptiste Daroussinends the line, and updates the internal state of the 448*6d38604fSBaptiste Daroussin.Fa h 449*6d38604fSBaptiste Daroussinobject. 45061d06d6bSBaptiste Daroussin.Pp 45161d06d6bSBaptiste DaroussinThe functions 45261d06d6bSBaptiste Daroussin.Fn print_eqn , 45361d06d6bSBaptiste Daroussin.Fn print_tbl , 45461d06d6bSBaptiste Daroussinand 45561d06d6bSBaptiste Daroussin.Fn print_tblclose 45661d06d6bSBaptiste Daroussinare not yet documented. 457*6d38604fSBaptiste Daroussin.Sh RETURN VALUES 458*6d38604fSBaptiste DaroussinThe functions 459*6d38604fSBaptiste Daroussin.Fn print_otag 460*6d38604fSBaptiste Daroussinand 461*6d38604fSBaptiste Daroussin.Fn print_otag_id 462*6d38604fSBaptiste Daroussinreturn a pointer to a new element on the stack of HTML elements. 463*6d38604fSBaptiste DaroussinWhen 464*6d38604fSBaptiste Daroussin.Fn print_otag_id 465*6d38604fSBaptiste Daroussinopens two elements, a pointer to the outer one is returned. 466*6d38604fSBaptiste DaroussinThe memory pointed to is owned by the library and is automatically 467*6d38604fSBaptiste Daroussin.Xr free 3 Ns d 468*6d38604fSBaptiste Daroussinwhen 469*6d38604fSBaptiste Daroussin.Fn print_tagq 470*6d38604fSBaptiste Daroussinis called on it or when 471*6d38604fSBaptiste Daroussin.Fn print_stagq 472*6d38604fSBaptiste Daroussinis called on a parent element. 473*6d38604fSBaptiste Daroussin.Pp 474*6d38604fSBaptiste DaroussinThe function 475*6d38604fSBaptiste Daroussin.Fn html_fillmode 476*6d38604fSBaptiste Daroussinreturns 477*6d38604fSBaptiste Daroussin.Dv ROFF_fi 478*6d38604fSBaptiste Daroussinif fill mode was active before the call or 479*6d38604fSBaptiste Daroussin.Dv ROFF_nf 480*6d38604fSBaptiste Daroussinotherwise. 481*6d38604fSBaptiste Daroussin.Pp 482*6d38604fSBaptiste DaroussinThe function 483*6d38604fSBaptiste Daroussin.Fn html_make_id 484*6d38604fSBaptiste Daroussinreturns a newly allocated string or 485*6d38604fSBaptiste Daroussin.Dv NULL 486*6d38604fSBaptiste Daroussinif 487*6d38604fSBaptiste Daroussin.Fa n 488*6d38604fSBaptiste Daroussinlacks text data to create the attribute from. 489*6d38604fSBaptiste DaroussinThe caller is responsible for 490*6d38604fSBaptiste Daroussin.Xr free 3 Ns ing 491*6d38604fSBaptiste Daroussinthe returned string after using it. 492*6d38604fSBaptiste Daroussin.Pp 493*6d38604fSBaptiste DaroussinIn case of 494*6d38604fSBaptiste Daroussin.Xr malloc 3 495*6d38604fSBaptiste Daroussinfailure, these functions do not return but call 496*6d38604fSBaptiste Daroussin.Xr err 3 . 49761d06d6bSBaptiste Daroussin.Sh FILES 49861d06d6bSBaptiste Daroussin.Bl -tag -width mandoc_aux.c -compact 49961d06d6bSBaptiste Daroussin.It Pa main.h 50061d06d6bSBaptiste Daroussindeclarations of public functions for use by the main program, 50161d06d6bSBaptiste Daroussinnot yet documented 50261d06d6bSBaptiste Daroussin.It Pa html.h 50361d06d6bSBaptiste Daroussindeclarations of data types and private functions 50461d06d6bSBaptiste Daroussinfor use by language-specific HTML formatters 50561d06d6bSBaptiste Daroussin.It Pa html.c 50661d06d6bSBaptiste Daroussinmain HTML formatting engine and utility functions 50761d06d6bSBaptiste Daroussin.It Pa mdoc_html.c 50861d06d6bSBaptiste Daroussin.Xr mdoc 7 50961d06d6bSBaptiste DaroussinHTML formatter 51061d06d6bSBaptiste Daroussin.It Pa man_html.c 51161d06d6bSBaptiste Daroussin.Xr man 7 51261d06d6bSBaptiste DaroussinHTML formatter 51361d06d6bSBaptiste Daroussin.It Pa tbl_html.c 51461d06d6bSBaptiste Daroussin.Xr tbl 7 51561d06d6bSBaptiste DaroussinHTML formatter 51661d06d6bSBaptiste Daroussin.It Pa eqn_html.c 51761d06d6bSBaptiste Daroussin.Xr eqn 7 51861d06d6bSBaptiste DaroussinHTML formatter 519*6d38604fSBaptiste Daroussin.It Pa roff_html.c 520*6d38604fSBaptiste Daroussin.Xr roff 7 521*6d38604fSBaptiste DaroussinHTML formatter, handling requests like 522*6d38604fSBaptiste Daroussin.Ic br , 523*6d38604fSBaptiste Daroussin.Ic ce , 524*6d38604fSBaptiste Daroussin.Ic fi , 525*6d38604fSBaptiste Daroussin.Ic ft , 526*6d38604fSBaptiste Daroussin.Ic nf , 527*6d38604fSBaptiste Daroussin.Ic rj , 528*6d38604fSBaptiste Daroussinand 529*6d38604fSBaptiste Daroussin.Ic sp . 53061d06d6bSBaptiste Daroussin.It Pa out.h 53161d06d6bSBaptiste Daroussindeclarations of data types and private functions 53261d06d6bSBaptiste Daroussinfor shared use by all mandoc formatters, 53361d06d6bSBaptiste Daroussinnot yet documented 53461d06d6bSBaptiste Daroussin.It Pa out.c 53561d06d6bSBaptiste Daroussinprivate functions for shared use by all mandoc formatters 53661d06d6bSBaptiste Daroussin.It Pa mandoc_aux.h 53761d06d6bSBaptiste Daroussindeclarations of common mandoc utility functions, see 53861d06d6bSBaptiste Daroussin.Xr mandoc 3 53961d06d6bSBaptiste Daroussin.It Pa mandoc_aux.c 54061d06d6bSBaptiste Daroussinimplementation of common mandoc utility functions 54161d06d6bSBaptiste Daroussin.El 54261d06d6bSBaptiste Daroussin.Sh SEE ALSO 54361d06d6bSBaptiste Daroussin.Xr mandoc 1 , 54461d06d6bSBaptiste Daroussin.Xr mandoc 3 , 54561d06d6bSBaptiste Daroussin.Xr man.cgi 8 54661d06d6bSBaptiste Daroussin.Sh AUTHORS 54761d06d6bSBaptiste Daroussin.An -nosplit 54861d06d6bSBaptiste DaroussinThe mandoc HTML formatter was written by 54961d06d6bSBaptiste Daroussin.An Kristaps Dzonsons Aq Mt kristaps@bsd.lv . 55061d06d6bSBaptiste DaroussinIt is maintained by 55161d06d6bSBaptiste Daroussin.An Ingo Schwarze Aq Mt schwarze@openbsd.org , 55261d06d6bSBaptiste Daroussinwho also wrote this manual. 553