1/* $Id: roff_html.c,v 1.20 2019/04/30 15:53:01 schwarze Exp $ */ 2/* 3 * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv> 4 * Copyright (c) 2014, 2017, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18#include <sys/types.h> 19 20#include <assert.h> 21#include <stdio.h> 22#include <string.h> 23 24#include "mandoc.h" 25#include "roff.h" 26#include "out.h" 27#include "html.h" 28 29#define ROFF_HTML_ARGS struct html *h, const struct roff_node *n 30 31typedef void (*roff_html_pre_fp)(ROFF_HTML_ARGS); 32 33static void roff_html_pre_br(ROFF_HTML_ARGS); 34static void roff_html_pre_ce(ROFF_HTML_ARGS); 35static void roff_html_pre_fi(ROFF_HTML_ARGS); 36static void roff_html_pre_ft(ROFF_HTML_ARGS); 37static void roff_html_pre_nf(ROFF_HTML_ARGS); 38static void roff_html_pre_sp(ROFF_HTML_ARGS); 39 40static const roff_html_pre_fp roff_html_pre_acts[ROFF_MAX] = { 41 roff_html_pre_br, /* br */ 42 roff_html_pre_ce, /* ce */ 43 roff_html_pre_fi, /* fi */ 44 roff_html_pre_ft, /* ft */ 45 NULL, /* ll */ 46 NULL, /* mc */ 47 roff_html_pre_nf, /* nf */ 48 NULL, /* po */ 49 roff_html_pre_ce, /* rj */ 50 roff_html_pre_sp, /* sp */ 51 NULL, /* ta */ 52 NULL, /* ti */ 53}; 54 55 56void 57roff_html_pre(struct html *h, const struct roff_node *n) 58{ 59 assert(n->tok < ROFF_MAX); 60 if (roff_html_pre_acts[n->tok] != NULL) 61 (*roff_html_pre_acts[n->tok])(h, n); 62} 63 64static void 65roff_html_pre_br(ROFF_HTML_ARGS) 66{ 67 print_otag(h, TAG_BR, ""); 68} 69 70static void 71roff_html_pre_ce(ROFF_HTML_ARGS) 72{ 73 for (n = n->child->next; n != NULL; n = n->next) { 74 if (n->type == ROFFT_TEXT) { 75 if (n->flags & NODE_LINE) 76 roff_html_pre_br(h, n); 77 print_text(h, n->string); 78 } else 79 roff_html_pre(h, n); 80 } 81 roff_html_pre_br(h, n); 82} 83 84static void 85roff_html_pre_fi(ROFF_HTML_ARGS) 86{ 87 if (html_fillmode(h, TOKEN_NONE) == ROFF_fi) 88 print_otag(h, TAG_BR, ""); 89} 90 91static void 92roff_html_pre_ft(ROFF_HTML_ARGS) 93{ 94 const char *cp; 95 96 cp = n->child->string; 97 html_setfont(h, mandoc_font(cp, (int)strlen(cp))); 98} 99 100static void 101roff_html_pre_nf(ROFF_HTML_ARGS) 102{ 103 if (html_fillmode(h, TOKEN_NONE) == ROFF_nf) 104 print_otag(h, TAG_BR, ""); 105} 106 107static void 108roff_html_pre_sp(ROFF_HTML_ARGS) 109{ 110 if (html_fillmode(h, TOKEN_NONE) == ROFF_nf) { 111 h->col++; 112 print_endline(h); 113 } else { 114 html_close_paragraph(h); 115 print_otag(h, TAG_P, "c", "Pp"); 116 } 117} 118