summaryrefslogtreecommitdiff
path: root/src/devices/grohtml/html-text.h
blob: fcd6c0fd808f6d34b97c7eef660d04dc74988336 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// -*- C++ -*-
/* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007
 * 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */

#include "html.h"
#include "html-table.h"

#define STYLE_VERTICAL_SPACE "1em"

/*
 *  supported html dialects.
 */

typedef enum {xhtml, html4} html_dialect;

/*
 *  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_dialect d);
        ~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;
  html_dialect      dialect;     /* which dialect of html?      */
  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);
};