xref: /freebsd/contrib/mandoc/roff_html.c (revision 45a5aec3f156d8a01fe1ea4ec87c1b1d489f13ac)
1*45a5aec3SBaptiste Daroussin /*	$Id: roff_html.c,v 1.20 2019/04/30 15:53:01 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  */
1861d06d6bSBaptiste Daroussin #include <sys/types.h>
1961d06d6bSBaptiste Daroussin 
2061d06d6bSBaptiste Daroussin #include <assert.h>
217295610fSBaptiste Daroussin #include <stdio.h>
227295610fSBaptiste 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);
357295610fSBaptiste Daroussin static	void	  roff_html_pre_fi(ROFF_HTML_ARGS);
367295610fSBaptiste Daroussin static	void	  roff_html_pre_ft(ROFF_HTML_ARGS);
377295610fSBaptiste 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 */
437295610fSBaptiste Daroussin 	roff_html_pre_fi,  /* fi */
447295610fSBaptiste Daroussin 	roff_html_pre_ft,  /* ft */
4561d06d6bSBaptiste Daroussin 	NULL,  /* ll */
4661d06d6bSBaptiste Daroussin 	NULL,  /* mc */
477295610fSBaptiste 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 {
677295610fSBaptiste 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
857295610fSBaptiste Daroussin roff_html_pre_fi(ROFF_HTML_ARGS)
867295610fSBaptiste Daroussin {
877295610fSBaptiste Daroussin 	if (html_fillmode(h, TOKEN_NONE) == ROFF_fi)
887295610fSBaptiste Daroussin 		print_otag(h, TAG_BR, "");
897295610fSBaptiste Daroussin }
907295610fSBaptiste Daroussin 
917295610fSBaptiste Daroussin static void
927295610fSBaptiste Daroussin roff_html_pre_ft(ROFF_HTML_ARGS)
937295610fSBaptiste Daroussin {
947295610fSBaptiste Daroussin 	const char	*cp;
957295610fSBaptiste Daroussin 
967295610fSBaptiste Daroussin 	cp = n->child->string;
97*45a5aec3SBaptiste Daroussin 	html_setfont(h, mandoc_font(cp, (int)strlen(cp)));
987295610fSBaptiste Daroussin }
997295610fSBaptiste Daroussin 
1007295610fSBaptiste Daroussin static void
1017295610fSBaptiste Daroussin roff_html_pre_nf(ROFF_HTML_ARGS)
1027295610fSBaptiste Daroussin {
1037295610fSBaptiste Daroussin 	if (html_fillmode(h, TOKEN_NONE) == ROFF_nf)
1047295610fSBaptiste Daroussin 		print_otag(h, TAG_BR, "");
1057295610fSBaptiste Daroussin }
1067295610fSBaptiste Daroussin 
1077295610fSBaptiste Daroussin static void
10861d06d6bSBaptiste Daroussin roff_html_pre_sp(ROFF_HTML_ARGS)
10961d06d6bSBaptiste Daroussin {
1107295610fSBaptiste Daroussin 	if (html_fillmode(h, TOKEN_NONE) == ROFF_nf) {
1117295610fSBaptiste Daroussin 		h->col++;
1127295610fSBaptiste Daroussin 		print_endline(h);
1137295610fSBaptiste Daroussin 	} else {
1147295610fSBaptiste Daroussin 		html_close_paragraph(h);
1157295610fSBaptiste Daroussin 		print_otag(h, TAG_P, "c", "Pp");
1167295610fSBaptiste Daroussin 	}
11761d06d6bSBaptiste Daroussin }
118