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