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