xref: /freebsd/contrib/mandoc/roff_html.c (revision 6d38604fc532a3fc060788e3ce40464b46047eaf)
1*6d38604fSBaptiste Daroussin /* $Id: roff_html.c,v 1.21 2020/06/22 19:20:40 schwarze Exp $ */
261d06d6bSBaptiste Daroussin /*
361d06d6bSBaptiste Daroussin  * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
47295610fSBaptiste 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  */
18*6d38604fSBaptiste Daroussin #include "config.h"
19*6d38604fSBaptiste Daroussin 
2061d06d6bSBaptiste Daroussin #include <sys/types.h>
2161d06d6bSBaptiste Daroussin 
2261d06d6bSBaptiste Daroussin #include <assert.h>
237295610fSBaptiste Daroussin #include <stdio.h>
247295610fSBaptiste Daroussin #include <string.h>
2561d06d6bSBaptiste Daroussin 
2661d06d6bSBaptiste Daroussin #include "mandoc.h"
2761d06d6bSBaptiste Daroussin #include "roff.h"
2861d06d6bSBaptiste Daroussin #include "out.h"
2961d06d6bSBaptiste Daroussin #include "html.h"
3061d06d6bSBaptiste Daroussin 
3161d06d6bSBaptiste Daroussin #define	ROFF_HTML_ARGS struct html *h, const struct roff_node *n
3261d06d6bSBaptiste Daroussin 
3361d06d6bSBaptiste Daroussin typedef	void	(*roff_html_pre_fp)(ROFF_HTML_ARGS);
3461d06d6bSBaptiste Daroussin 
3561d06d6bSBaptiste Daroussin static	void	  roff_html_pre_br(ROFF_HTML_ARGS);
3661d06d6bSBaptiste Daroussin static	void	  roff_html_pre_ce(ROFF_HTML_ARGS);
377295610fSBaptiste Daroussin static	void	  roff_html_pre_fi(ROFF_HTML_ARGS);
387295610fSBaptiste Daroussin static	void	  roff_html_pre_ft(ROFF_HTML_ARGS);
397295610fSBaptiste Daroussin static	void	  roff_html_pre_nf(ROFF_HTML_ARGS);
4061d06d6bSBaptiste Daroussin static	void	  roff_html_pre_sp(ROFF_HTML_ARGS);
4161d06d6bSBaptiste Daroussin 
4261d06d6bSBaptiste Daroussin static	const roff_html_pre_fp roff_html_pre_acts[ROFF_MAX] = {
4361d06d6bSBaptiste Daroussin 	roff_html_pre_br,  /* br */
4461d06d6bSBaptiste Daroussin 	roff_html_pre_ce,  /* ce */
457295610fSBaptiste Daroussin 	roff_html_pre_fi,  /* fi */
467295610fSBaptiste Daroussin 	roff_html_pre_ft,  /* ft */
4761d06d6bSBaptiste Daroussin 	NULL,  /* ll */
4861d06d6bSBaptiste Daroussin 	NULL,  /* mc */
497295610fSBaptiste Daroussin 	roff_html_pre_nf,  /* nf */
5061d06d6bSBaptiste Daroussin 	NULL,  /* po */
5161d06d6bSBaptiste Daroussin 	roff_html_pre_ce,  /* rj */
5261d06d6bSBaptiste Daroussin 	roff_html_pre_sp,  /* sp */
5361d06d6bSBaptiste Daroussin 	NULL,  /* ta */
5461d06d6bSBaptiste Daroussin 	NULL,  /* ti */
5561d06d6bSBaptiste Daroussin };
5661d06d6bSBaptiste Daroussin 
5761d06d6bSBaptiste Daroussin 
5861d06d6bSBaptiste Daroussin void
roff_html_pre(struct html * h,const struct roff_node * n)5961d06d6bSBaptiste Daroussin roff_html_pre(struct html *h, const struct roff_node *n)
6061d06d6bSBaptiste Daroussin {
6161d06d6bSBaptiste Daroussin 	assert(n->tok < ROFF_MAX);
6261d06d6bSBaptiste Daroussin 	if (roff_html_pre_acts[n->tok] != NULL)
6361d06d6bSBaptiste Daroussin 		(*roff_html_pre_acts[n->tok])(h, n);
6461d06d6bSBaptiste Daroussin }
6561d06d6bSBaptiste Daroussin 
6661d06d6bSBaptiste Daroussin static void
roff_html_pre_br(ROFF_HTML_ARGS)6761d06d6bSBaptiste Daroussin roff_html_pre_br(ROFF_HTML_ARGS)
6861d06d6bSBaptiste Daroussin {
697295610fSBaptiste Daroussin 	print_otag(h, TAG_BR, "");
7061d06d6bSBaptiste Daroussin }
7161d06d6bSBaptiste Daroussin 
7261d06d6bSBaptiste Daroussin static void
roff_html_pre_ce(ROFF_HTML_ARGS)7361d06d6bSBaptiste Daroussin roff_html_pre_ce(ROFF_HTML_ARGS)
7461d06d6bSBaptiste Daroussin {
7561d06d6bSBaptiste Daroussin 	for (n = n->child->next; n != NULL; n = n->next) {
7661d06d6bSBaptiste Daroussin 		if (n->type == ROFFT_TEXT) {
7761d06d6bSBaptiste Daroussin 			if (n->flags & NODE_LINE)
7861d06d6bSBaptiste Daroussin 				roff_html_pre_br(h, n);
7961d06d6bSBaptiste Daroussin 			print_text(h, n->string);
8061d06d6bSBaptiste Daroussin 		} else
8161d06d6bSBaptiste Daroussin 			roff_html_pre(h, n);
8261d06d6bSBaptiste Daroussin 	}
8361d06d6bSBaptiste Daroussin 	roff_html_pre_br(h, n);
8461d06d6bSBaptiste Daroussin }
8561d06d6bSBaptiste Daroussin 
8661d06d6bSBaptiste Daroussin static void
roff_html_pre_fi(ROFF_HTML_ARGS)877295610fSBaptiste Daroussin roff_html_pre_fi(ROFF_HTML_ARGS)
887295610fSBaptiste Daroussin {
897295610fSBaptiste Daroussin 	if (html_fillmode(h, TOKEN_NONE) == ROFF_fi)
907295610fSBaptiste Daroussin 		print_otag(h, TAG_BR, "");
917295610fSBaptiste Daroussin }
927295610fSBaptiste Daroussin 
937295610fSBaptiste Daroussin static void
roff_html_pre_ft(ROFF_HTML_ARGS)947295610fSBaptiste Daroussin roff_html_pre_ft(ROFF_HTML_ARGS)
957295610fSBaptiste Daroussin {
967295610fSBaptiste Daroussin 	const char	*cp;
977295610fSBaptiste Daroussin 
987295610fSBaptiste Daroussin 	cp = n->child->string;
9945a5aec3SBaptiste Daroussin 	html_setfont(h, mandoc_font(cp, (int)strlen(cp)));
1007295610fSBaptiste Daroussin }
1017295610fSBaptiste Daroussin 
1027295610fSBaptiste Daroussin static void
roff_html_pre_nf(ROFF_HTML_ARGS)1037295610fSBaptiste Daroussin roff_html_pre_nf(ROFF_HTML_ARGS)
1047295610fSBaptiste Daroussin {
1057295610fSBaptiste Daroussin 	if (html_fillmode(h, TOKEN_NONE) == ROFF_nf)
1067295610fSBaptiste Daroussin 		print_otag(h, TAG_BR, "");
1077295610fSBaptiste Daroussin }
1087295610fSBaptiste Daroussin 
1097295610fSBaptiste Daroussin static void
roff_html_pre_sp(ROFF_HTML_ARGS)11061d06d6bSBaptiste Daroussin roff_html_pre_sp(ROFF_HTML_ARGS)
11161d06d6bSBaptiste Daroussin {
1127295610fSBaptiste Daroussin 	if (html_fillmode(h, TOKEN_NONE) == ROFF_nf) {
1137295610fSBaptiste Daroussin 		h->col++;
1147295610fSBaptiste Daroussin 		print_endline(h);
1157295610fSBaptiste Daroussin 	} else {
1167295610fSBaptiste Daroussin 		html_close_paragraph(h);
1177295610fSBaptiste Daroussin 		print_otag(h, TAG_P, "c", "Pp");
1187295610fSBaptiste Daroussin 	}
11961d06d6bSBaptiste Daroussin }
120