// -*- C++ -*- /* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 * Free Software Foundation, Inc. * * Gaius Mulley (gaius@glam.ac.uk) wrote html-text.h * * html-text.h * * provides a state machine interface which generates html text. */ /* This file is part of groff. groff is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. groff is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "html.h" #include "html-table.h" #define STYLE_VERTICAL_SPACE "1em" /* * html tags */ typedef enum {I_TAG, B_TAG, P_TAG, SUB_TAG, SUP_TAG, TT_TAG, PRE_TAG, SMALL_TAG, BIG_TAG, BREAK_TAG, COLOR_TAG} HTML_TAG; typedef struct tag_definition { HTML_TAG type; void *arg1; int text_emitted; color col; html_indent *indent; tag_definition *next; } tag_definition ; /* * the state of the current paragraph. * It allows post-html.cpp to request font changes, paragraph start/end * and emits balanced tags with a small amount of peephole optimization. */ class html_text { public: html_text (simple_output *op); ~html_text (void); void flush_text (void); void do_emittext (const char *s, int length); void do_italic (void); void do_bold (void); void do_roman (void); void do_tt (void); void do_pre (void); void do_small (void); void do_big (void); void do_para (const char *arg, int space); // used for no indentation void do_para (simple_output *op, const char *arg1, int indentation, int pageoffset, int linelength, int space); void do_sup (void); void do_sub (void); void do_space (void); void do_break (void); void do_newline (void); void do_table (const char *arg); void done_bold (void); void done_italic (void); char *done_para (void); void done_sup (void); void done_sub (void); void done_tt (void); void done_pre (void); void done_small (void); void done_big (void); void do_color (color *c); void done_color (void); int emitted_text (void); int ever_emitted_text (void); int starts_with_space (void); int retrieve_para_space (void); void emit_space (void); int is_in_pre (void); int uses_indent (void); void remove_tag (HTML_TAG tag); void remove_sub_sup (void); void remove_para_align (void); void remove_para_space (void); char *get_alignment (void); private: tag_definition *stackptr; /* the current paragraph state */ tag_definition *lastptr; /* the end of the stack */ simple_output *out; int space_emitted; /* just emitted a space? */ int current_indentation; /* current .in value */ int pageoffset; /* .po value */ int linelength; /* current line length */ int blank_para; /* have we ever written text? */ int start_space; /* does para start with a .sp */ html_indent *indent; /* our indent class */ int is_present (HTML_TAG t); void end_tag (tag_definition *t); void start_tag (tag_definition *t); void do_para (const char *arg, html_indent *in, int space); void push_para (HTML_TAG t); void push_para (HTML_TAG t, void *arg, html_indent *in); void push_para (color *c); void do_push (tag_definition *p); char *shutdown (HTML_TAG t); void check_emit_text (tag_definition *t); int remove_break (void); void issue_tag (const char *tagname, const char *arg, int space=2); void issue_color_begin (color *c); void remove_def (tag_definition *t); html_indent *remove_indent (HTML_TAG tag); void dump_stack_element (tag_definition *p); void dump_stack (void); };