1// -*- C++ -*- 2/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 3 * 4 * Gaius Mulley (gaius@glam.ac.uk) wrote html-table.h 5 * 6 * html-table.h 7 * 8 * provides the methods necessary to handle indentation and tab 9 * positions using html tables. 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 31#if !defined(HTML_TABLE_H) 32#define HTML_TABLE_H 33 34typedef struct tab_position { 35 char alignment; 36 int position; 37 struct tab_position *next; 38} tab_position; 39 40 41class tabs { 42public: 43 tabs (); 44 ~tabs (); 45 void clear (void); 46 int compatible (const char *s); 47 void init (const char *s); 48 void check_init (const char *s); 49 int find_tab (int pos); 50 int get_tab_pos (int n); 51 char get_tab_align (int n); 52 void dump_tabs (void); 53 54private: 55 void delete_list (void); 56 tab_position *tab; 57}; 58 59/* 60 * define a column 61 */ 62 63typedef struct cols { 64 int left, right; 65 int no; 66 char alignment; 67 struct cols *next; 68} cols; 69 70class html_table { 71public: 72 html_table (simple_output *op, int linelen); 73 ~html_table (void); 74 int add_column (int coln, int hstart, int hend, char align); 75 cols *get_column (int coln); 76 int insert_column (int coln, int hstart, int hend, char align); 77 int modify_column (cols *c, int hstart, int hend, char align); 78 int find_tab_column (int pos); 79 int find_column (int pos); 80 int get_tab_pos (int n); 81 char get_tab_align (int n); 82 void set_linelength (int linelen); 83 int no_columns (void); 84 int no_gaps (void); 85 int is_gap (cols *c); 86 void dump_table (void); 87 void emit_table_header (int space); 88 void emit_col (int n); 89 void emit_new_row (void); 90 void emit_finish_table (void); 91 int get_right (cols *c); 92 void add_indent (int indent); 93 void finish_row (void); 94 int get_effective_linelength (void); 95 void set_space (int space); 96 97 tabs *tab_stops; /* tab stop positions */ 98 simple_output *out; 99private: 100 cols *columns; /* column entries */ 101 int linelength; 102 cols *last_col; /* last column started */ 103 int start_space; /* have we seen a `.sp' tag? */ 104 105 void remove_cols (cols *c); 106}; 107 108/* 109 * the indentation wrapper. 110 * Builds an indentation from a html-table. 111 * This table is only emitted if the paragraph is emitted. 112 */ 113 114class html_indent { 115public: 116 html_indent (simple_output *op, int ind, int pageoffset, int linelength); 117 ~html_indent (void); 118 void begin (int space); // called if we need to use the indent 119 void get_reg (int *ind, int *pageoffset, int *linelength); 120 121 // the indent is shutdown when it is deleted 122 123private: 124 void end (void); 125 int is_used; 126 int pg; // values of the registers as passed via initialization 127 int ll; 128 int in; 129 html_table *table; 130}; 131 132#endif 133