1// -*- C++ -*- 2/* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 3 * Free Software Foundation, Inc. 4 * 5 * Gaius Mulley (gaius@glam.ac.uk) wrote html-text.h 6 * 7 * html-text.h 8 * 9 * provides a state machine interface which generates html text. 10 */ 11 12/* 13This file is part of groff. 14 15groff is free software; you can redistribute it and/or modify it under 16the terms of the GNU General Public License as published by the Free 17Software Foundation; either version 2, or (at your option) any later 18version. 19 20groff is distributed in the hope that it will be useful, but WITHOUT ANY 21WARRANTY; without even the implied warranty of MERCHANTABILITY or 22FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 23for more details. 24 25You should have received a copy of the GNU General Public License along 26with groff; see the file COPYING. If not, write to the Free Software 27Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 28 29#include "html.h" 30#include "html-table.h" 31 32#define STYLE_VERTICAL_SPACE "1em" 33 34/* 35 * html tags 36 */ 37 38typedef enum {I_TAG, B_TAG, P_TAG, SUB_TAG, SUP_TAG, TT_TAG, 39 PRE_TAG, SMALL_TAG, BIG_TAG, BREAK_TAG, 40 COLOR_TAG} HTML_TAG; 41 42typedef struct tag_definition { 43 HTML_TAG type; 44 void *arg1; 45 int text_emitted; 46 color col; 47 html_indent *indent; 48 tag_definition *next; 49} tag_definition ; 50 51/* 52 * the state of the current paragraph. 53 * It allows post-html.cpp to request font changes, paragraph start/end 54 * and emits balanced tags with a small amount of peephole optimization. 55 */ 56 57class html_text { 58public: 59 html_text (simple_output *op); 60 ~html_text (void); 61 void flush_text (void); 62 void do_emittext (const char *s, int length); 63 void do_italic (void); 64 void do_bold (void); 65 void do_roman (void); 66 void do_tt (void); 67 void do_pre (void); 68 void do_small (void); 69 void do_big (void); 70 void do_para (const char *arg, int space); // used for no indentation 71 void do_para (simple_output *op, const char *arg1, 72 int indentation, int pageoffset, int linelength, 73 int space); 74 void do_sup (void); 75 void do_sub (void); 76 void do_space (void); 77 void do_break (void); 78 void do_newline (void); 79 void do_table (const char *arg); 80 void done_bold (void); 81 void done_italic (void); 82 char *done_para (void); 83 void done_sup (void); 84 void done_sub (void); 85 void done_tt (void); 86 void done_pre (void); 87 void done_small (void); 88 void done_big (void); 89 void do_color (color *c); 90 void done_color (void); 91 int emitted_text (void); 92 int ever_emitted_text (void); 93 int starts_with_space (void); 94 int retrieve_para_space (void); 95 void emit_space (void); 96 int is_in_pre (void); 97 int uses_indent (void); 98 void remove_tag (HTML_TAG tag); 99 void remove_sub_sup (void); 100 void remove_para_align (void); 101 void remove_para_space (void); 102 char *get_alignment (void); 103 104private: 105 tag_definition *stackptr; /* the current paragraph state */ 106 tag_definition *lastptr; /* the end of the stack */ 107 simple_output *out; 108 int space_emitted; /* just emitted a space? */ 109 int current_indentation; /* current .in value */ 110 int pageoffset; /* .po value */ 111 int linelength; /* current line length */ 112 int blank_para; /* have we ever written text? */ 113 int start_space; /* does para start with a .sp */ 114 html_indent *indent; /* our indent class */ 115 116 int is_present (HTML_TAG t); 117 void end_tag (tag_definition *t); 118 void start_tag (tag_definition *t); 119 void do_para (const char *arg, html_indent *in, int space); 120 void push_para (HTML_TAG t); 121 void push_para (HTML_TAG t, void *arg, html_indent *in); 122 void push_para (color *c); 123 void do_push (tag_definition *p); 124 char *shutdown (HTML_TAG t); 125 void check_emit_text (tag_definition *t); 126 int remove_break (void); 127 void issue_tag (const char *tagname, const char *arg, int space=2); 128 void issue_color_begin (color *c); 129 void remove_def (tag_definition *t); 130 html_indent *remove_indent (HTML_TAG tag); 131 void dump_stack_element (tag_definition *p); 132 void dump_stack (void); 133}; 134