xref: /freebsd/contrib/mandoc/roff_html.c (revision 7295610f5da64ab1818458ce007d9eb924496330)
1*7295610fSBaptiste Daroussin /*	$Id: roff_html.c,v 1.19 2019/01/07 07:26:29 schwarze Exp $ */
261d06d6bSBaptiste Daroussin /*
361d06d6bSBaptiste Daroussin  * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
4*7295610fSBaptiste Daroussin  * Copyright (c) 2014, 2017, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>
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.
1761d06d6bSBaptiste Daroussin  */
1861d06d6bSBaptiste Daroussin #include <sys/types.h>
1961d06d6bSBaptiste Daroussin 
2061d06d6bSBaptiste Daroussin #include <assert.h>
21*7295610fSBaptiste Daroussin #include <stdio.h>
22*7295610fSBaptiste Daroussin #include <string.h>
2361d06d6bSBaptiste Daroussin 
2461d06d6bSBaptiste Daroussin #include "mandoc.h"
2561d06d6bSBaptiste Daroussin #include "roff.h"
2661d06d6bSBaptiste Daroussin #include "out.h"
2761d06d6bSBaptiste Daroussin #include "html.h"
2861d06d6bSBaptiste Daroussin 
2961d06d6bSBaptiste Daroussin #define	ROFF_HTML_ARGS struct html *h, const struct roff_node *n
3061d06d6bSBaptiste Daroussin 
3161d06d6bSBaptiste Daroussin typedef	void	(*roff_html_pre_fp)(ROFF_HTML_ARGS);
3261d06d6bSBaptiste Daroussin 
3361d06d6bSBaptiste Daroussin static	void	  roff_html_pre_br(ROFF_HTML_ARGS);
3461d06d6bSBaptiste Daroussin static	void	  roff_html_pre_ce(ROFF_HTML_ARGS);
35*7295610fSBaptiste Daroussin static	void	  roff_html_pre_fi(ROFF_HTML_ARGS);
36*7295610fSBaptiste Daroussin static	void	  roff_html_pre_ft(ROFF_HTML_ARGS);
37*7295610fSBaptiste Daroussin static	void	  roff_html_pre_nf(ROFF_HTML_ARGS);
3861d06d6bSBaptiste Daroussin static	void	  roff_html_pre_sp(ROFF_HTML_ARGS);
3961d06d6bSBaptiste Daroussin 
4061d06d6bSBaptiste Daroussin static	const roff_html_pre_fp roff_html_pre_acts[ROFF_MAX] = {
4161d06d6bSBaptiste Daroussin 	roff_html_pre_br,  /* br */
4261d06d6bSBaptiste Daroussin 	roff_html_pre_ce,  /* ce */
43*7295610fSBaptiste Daroussin 	roff_html_pre_fi,  /* fi */
44*7295610fSBaptiste Daroussin 	roff_html_pre_ft,  /* ft */
4561d06d6bSBaptiste Daroussin 	NULL,  /* ll */
4661d06d6bSBaptiste Daroussin 	NULL,  /* mc */
47*7295610fSBaptiste Daroussin 	roff_html_pre_nf,  /* nf */
4861d06d6bSBaptiste Daroussin 	NULL,  /* po */
4961d06d6bSBaptiste Daroussin 	roff_html_pre_ce,  /* rj */
5061d06d6bSBaptiste Daroussin 	roff_html_pre_sp,  /* sp */
5161d06d6bSBaptiste Daroussin 	NULL,  /* ta */
5261d06d6bSBaptiste Daroussin 	NULL,  /* ti */
5361d06d6bSBaptiste Daroussin };
5461d06d6bSBaptiste Daroussin 
5561d06d6bSBaptiste Daroussin 
5661d06d6bSBaptiste Daroussin void
5761d06d6bSBaptiste Daroussin roff_html_pre(struct html *h, const struct roff_node *n)
5861d06d6bSBaptiste Daroussin {
5961d06d6bSBaptiste Daroussin 	assert(n->tok < ROFF_MAX);
6061d06d6bSBaptiste Daroussin 	if (roff_html_pre_acts[n->tok] != NULL)
6161d06d6bSBaptiste Daroussin 		(*roff_html_pre_acts[n->tok])(h, n);
6261d06d6bSBaptiste Daroussin }
6361d06d6bSBaptiste Daroussin 
6461d06d6bSBaptiste Daroussin static void
6561d06d6bSBaptiste Daroussin roff_html_pre_br(ROFF_HTML_ARGS)
6661d06d6bSBaptiste Daroussin {
67*7295610fSBaptiste Daroussin 	print_otag(h, TAG_BR, "");
6861d06d6bSBaptiste Daroussin }
6961d06d6bSBaptiste Daroussin 
7061d06d6bSBaptiste Daroussin static void
7161d06d6bSBaptiste Daroussin roff_html_pre_ce(ROFF_HTML_ARGS)
7261d06d6bSBaptiste Daroussin {
7361d06d6bSBaptiste Daroussin 	for (n = n->child->next; n != NULL; n = n->next) {
7461d06d6bSBaptiste Daroussin 		if (n->type == ROFFT_TEXT) {
7561d06d6bSBaptiste Daroussin 			if (n->flags & NODE_LINE)
7661d06d6bSBaptiste Daroussin 				roff_html_pre_br(h, n);
7761d06d6bSBaptiste Daroussin 			print_text(h, n->string);
7861d06d6bSBaptiste Daroussin 		} else
7961d06d6bSBaptiste Daroussin 			roff_html_pre(h, n);
8061d06d6bSBaptiste Daroussin 	}
8161d06d6bSBaptiste Daroussin 	roff_html_pre_br(h, n);
8261d06d6bSBaptiste Daroussin }
8361d06d6bSBaptiste Daroussin 
8461d06d6bSBaptiste Daroussin static void
85*7295610fSBaptiste Daroussin roff_html_pre_fi(ROFF_HTML_ARGS)
86*7295610fSBaptiste Daroussin {
87*7295610fSBaptiste Daroussin 	if (html_fillmode(h, TOKEN_NONE) == ROFF_fi)
88*7295610fSBaptiste Daroussin 		print_otag(h, TAG_BR, "");
89*7295610fSBaptiste Daroussin }
90*7295610fSBaptiste Daroussin 
91*7295610fSBaptiste Daroussin static void
92*7295610fSBaptiste Daroussin roff_html_pre_ft(ROFF_HTML_ARGS)
93*7295610fSBaptiste Daroussin {
94*7295610fSBaptiste Daroussin 	const char	*cp;
95*7295610fSBaptiste Daroussin 
96*7295610fSBaptiste Daroussin 	cp = n->child->string;
97*7295610fSBaptiste Daroussin 	print_metaf(h, mandoc_font(cp, (int)strlen(cp)));
98*7295610fSBaptiste Daroussin }
99*7295610fSBaptiste Daroussin 
100*7295610fSBaptiste Daroussin static void
101*7295610fSBaptiste Daroussin roff_html_pre_nf(ROFF_HTML_ARGS)
102*7295610fSBaptiste Daroussin {
103*7295610fSBaptiste Daroussin 	if (html_fillmode(h, TOKEN_NONE) == ROFF_nf)
104*7295610fSBaptiste Daroussin 		print_otag(h, TAG_BR, "");
105*7295610fSBaptiste Daroussin }
106*7295610fSBaptiste Daroussin 
107*7295610fSBaptiste Daroussin static void
10861d06d6bSBaptiste Daroussin roff_html_pre_sp(ROFF_HTML_ARGS)
10961d06d6bSBaptiste Daroussin {
110*7295610fSBaptiste Daroussin 	if (html_fillmode(h, TOKEN_NONE) == ROFF_nf) {
111*7295610fSBaptiste Daroussin 		h->col++;
112*7295610fSBaptiste Daroussin 		print_endline(h);
113*7295610fSBaptiste Daroussin 	} else {
114*7295610fSBaptiste Daroussin 		html_close_paragraph(h);
115*7295610fSBaptiste Daroussin 		print_otag(h, TAG_P, "c", "Pp");
116*7295610fSBaptiste Daroussin 	}
11761d06d6bSBaptiste Daroussin }
118