1*99db7d0eSSascha Wildner /* $Id: roff_html.c,v 1.21 2020/06/22 19:20:40 schwarze Exp $ */
254ba9607SSascha Wildner /*
354ba9607SSascha Wildner * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
454ba9607SSascha Wildner * Copyright (c) 2014, 2017, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>
554ba9607SSascha Wildner *
654ba9607SSascha Wildner * Permission to use, copy, modify, and distribute this software for any
754ba9607SSascha Wildner * purpose with or without fee is hereby granted, provided that the above
854ba9607SSascha Wildner * copyright notice and this permission notice appear in all copies.
954ba9607SSascha Wildner *
1054ba9607SSascha Wildner * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1154ba9607SSascha Wildner * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1254ba9607SSascha Wildner * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1354ba9607SSascha Wildner * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1454ba9607SSascha Wildner * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1554ba9607SSascha Wildner * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1654ba9607SSascha Wildner * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1754ba9607SSascha Wildner */
18*99db7d0eSSascha Wildner #include "config.h"
19*99db7d0eSSascha Wildner
2054ba9607SSascha Wildner #include <sys/types.h>
2154ba9607SSascha Wildner
2254ba9607SSascha Wildner #include <assert.h>
2354ba9607SSascha Wildner #include <stdio.h>
2454ba9607SSascha Wildner #include <string.h>
2554ba9607SSascha Wildner
2654ba9607SSascha Wildner #include "mandoc.h"
2754ba9607SSascha Wildner #include "roff.h"
2854ba9607SSascha Wildner #include "out.h"
2954ba9607SSascha Wildner #include "html.h"
3054ba9607SSascha Wildner
3154ba9607SSascha Wildner #define ROFF_HTML_ARGS struct html *h, const struct roff_node *n
3254ba9607SSascha Wildner
3354ba9607SSascha Wildner typedef void (*roff_html_pre_fp)(ROFF_HTML_ARGS);
3454ba9607SSascha Wildner
3554ba9607SSascha Wildner static void roff_html_pre_br(ROFF_HTML_ARGS);
3654ba9607SSascha Wildner static void roff_html_pre_ce(ROFF_HTML_ARGS);
3754ba9607SSascha Wildner static void roff_html_pre_fi(ROFF_HTML_ARGS);
3854ba9607SSascha Wildner static void roff_html_pre_ft(ROFF_HTML_ARGS);
3954ba9607SSascha Wildner static void roff_html_pre_nf(ROFF_HTML_ARGS);
4054ba9607SSascha Wildner static void roff_html_pre_sp(ROFF_HTML_ARGS);
4154ba9607SSascha Wildner
4254ba9607SSascha Wildner static const roff_html_pre_fp roff_html_pre_acts[ROFF_MAX] = {
4354ba9607SSascha Wildner roff_html_pre_br, /* br */
4454ba9607SSascha Wildner roff_html_pre_ce, /* ce */
4554ba9607SSascha Wildner roff_html_pre_fi, /* fi */
4654ba9607SSascha Wildner roff_html_pre_ft, /* ft */
4754ba9607SSascha Wildner NULL, /* ll */
4854ba9607SSascha Wildner NULL, /* mc */
4954ba9607SSascha Wildner roff_html_pre_nf, /* nf */
5054ba9607SSascha Wildner NULL, /* po */
5154ba9607SSascha Wildner roff_html_pre_ce, /* rj */
5254ba9607SSascha Wildner roff_html_pre_sp, /* sp */
5354ba9607SSascha Wildner NULL, /* ta */
5454ba9607SSascha Wildner NULL, /* ti */
5554ba9607SSascha Wildner };
5654ba9607SSascha Wildner
5754ba9607SSascha Wildner
5854ba9607SSascha Wildner void
roff_html_pre(struct html * h,const struct roff_node * n)5954ba9607SSascha Wildner roff_html_pre(struct html *h, const struct roff_node *n)
6054ba9607SSascha Wildner {
6154ba9607SSascha Wildner assert(n->tok < ROFF_MAX);
6254ba9607SSascha Wildner if (roff_html_pre_acts[n->tok] != NULL)
6354ba9607SSascha Wildner (*roff_html_pre_acts[n->tok])(h, n);
6454ba9607SSascha Wildner }
6554ba9607SSascha Wildner
6654ba9607SSascha Wildner static void
roff_html_pre_br(ROFF_HTML_ARGS)6754ba9607SSascha Wildner roff_html_pre_br(ROFF_HTML_ARGS)
6854ba9607SSascha Wildner {
6954ba9607SSascha Wildner print_otag(h, TAG_BR, "");
7054ba9607SSascha Wildner }
7154ba9607SSascha Wildner
7254ba9607SSascha Wildner static void
roff_html_pre_ce(ROFF_HTML_ARGS)7354ba9607SSascha Wildner roff_html_pre_ce(ROFF_HTML_ARGS)
7454ba9607SSascha Wildner {
7554ba9607SSascha Wildner for (n = n->child->next; n != NULL; n = n->next) {
7654ba9607SSascha Wildner if (n->type == ROFFT_TEXT) {
7754ba9607SSascha Wildner if (n->flags & NODE_LINE)
7854ba9607SSascha Wildner roff_html_pre_br(h, n);
7954ba9607SSascha Wildner print_text(h, n->string);
8054ba9607SSascha Wildner } else
8154ba9607SSascha Wildner roff_html_pre(h, n);
8254ba9607SSascha Wildner }
8354ba9607SSascha Wildner roff_html_pre_br(h, n);
8454ba9607SSascha Wildner }
8554ba9607SSascha Wildner
8654ba9607SSascha Wildner static void
roff_html_pre_fi(ROFF_HTML_ARGS)8754ba9607SSascha Wildner roff_html_pre_fi(ROFF_HTML_ARGS)
8854ba9607SSascha Wildner {
8954ba9607SSascha Wildner if (html_fillmode(h, TOKEN_NONE) == ROFF_fi)
9054ba9607SSascha Wildner print_otag(h, TAG_BR, "");
9154ba9607SSascha Wildner }
9254ba9607SSascha Wildner
9354ba9607SSascha Wildner static void
roff_html_pre_ft(ROFF_HTML_ARGS)9454ba9607SSascha Wildner roff_html_pre_ft(ROFF_HTML_ARGS)
9554ba9607SSascha Wildner {
9654ba9607SSascha Wildner const char *cp;
9754ba9607SSascha Wildner
9854ba9607SSascha Wildner cp = n->child->string;
99*99db7d0eSSascha Wildner html_setfont(h, mandoc_font(cp, (int)strlen(cp)));
10054ba9607SSascha Wildner }
10154ba9607SSascha Wildner
10254ba9607SSascha Wildner static void
roff_html_pre_nf(ROFF_HTML_ARGS)10354ba9607SSascha Wildner roff_html_pre_nf(ROFF_HTML_ARGS)
10454ba9607SSascha Wildner {
10554ba9607SSascha Wildner if (html_fillmode(h, TOKEN_NONE) == ROFF_nf)
10654ba9607SSascha Wildner print_otag(h, TAG_BR, "");
10754ba9607SSascha Wildner }
10854ba9607SSascha Wildner
10954ba9607SSascha Wildner static void
roff_html_pre_sp(ROFF_HTML_ARGS)11054ba9607SSascha Wildner roff_html_pre_sp(ROFF_HTML_ARGS)
11154ba9607SSascha Wildner {
11254ba9607SSascha Wildner if (html_fillmode(h, TOKEN_NONE) == ROFF_nf) {
11354ba9607SSascha Wildner h->col++;
11454ba9607SSascha Wildner print_endline(h);
11554ba9607SSascha Wildner } else {
11654ba9607SSascha Wildner html_close_paragraph(h);
11754ba9607SSascha Wildner print_otag(h, TAG_P, "c", "Pp");
11854ba9607SSascha Wildner }
11954ba9607SSascha Wildner }
120