1#ifndef SOURCE_HTML_IMP_H
2#define SOURCE_HTML_IMP_H
3
4typedef struct fz_html_font_face_s fz_html_font_face;
5typedef struct fz_html_font_set_s fz_html_font_set;
6typedef struct fz_html_s fz_html;
7typedef struct fz_html_box_s fz_html_box;
8typedef struct fz_html_flow_s fz_html_flow;
9
10typedef struct fz_css_s fz_css;
11typedef struct fz_css_rule_s fz_css_rule;
12typedef struct fz_css_match_prop_s fz_css_match_prop;
13typedef struct fz_css_match_s fz_css_match;
14typedef struct fz_css_style_s fz_css_style;
15
16typedef struct fz_css_selector_s fz_css_selector;
17typedef struct fz_css_condition_s fz_css_condition;
18typedef struct fz_css_property_s fz_css_property;
19typedef struct fz_css_value_s fz_css_value;
20typedef struct fz_css_number_s fz_css_number;
21typedef struct fz_css_color_s fz_css_color;
22
23struct fz_html_font_face_s
24{
25 char *family;
26 int is_bold;
27 int is_italic;
28 int is_small_caps;
29 fz_font *font;
30 char *src;
31 fz_html_font_face *next;
32};
33
34struct fz_html_font_set_s
35{
36 fz_font *fonts[12]; /* Times, Helvetica, Courier in R,I,B,BI */
37 fz_html_font_face *custom;
38};
39
40enum
41{
42 CSS_KEYWORD = 256,
43 CSS_HASH,
44 CSS_STRING,
45 CSS_NUMBER,
46 CSS_LENGTH,
47 CSS_PERCENT,
48 CSS_URI,
49};
50
51struct fz_css_s
52{
53 fz_pool *pool;
54 fz_css_rule *rule;
55};
56
57struct fz_css_rule_s
58{
59 fz_css_selector *selector;
60 fz_css_property *declaration;
61 fz_css_rule *next;
62};
63
64struct fz_css_selector_s
65{
66 char *name;
67 int combine;
68 fz_css_condition *cond;
69 fz_css_selector *left;
70 fz_css_selector *right;
71 fz_css_selector *next;
72};
73
74struct fz_css_condition_s
75{
76 int type;
77 char *key;
78 char *val;
79 fz_css_condition *next;
80};
81
82struct fz_css_property_s
83{
84 char *name;
85 fz_css_value *value;
86 short spec;
87 short important;
88 fz_css_property *next;
89};
90
91struct fz_css_value_s
92{
93 int type;
94 char *data;
95 fz_css_value *args; /* function arguments */
96 fz_css_value *next;
97};
98
99struct fz_css_match_prop_s
100{
101 const char *name; /* not owned */
102 fz_css_value *value; /* not owned */
103 int spec;
104};
105
106struct fz_css_match_s
107{
108 fz_css_match *up;
109 int count;
110 fz_css_match_prop prop[64];
111};
112
113enum { DIS_NONE, DIS_BLOCK, DIS_INLINE, DIS_LIST_ITEM, DIS_INLINE_BLOCK, DIS_TABLE, DIS_TABLE_ROW, DIS_TABLE_CELL };
114enum { POS_STATIC, POS_RELATIVE, POS_ABSOLUTE, POS_FIXED };
115enum { TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY };
116enum { VA_BASELINE, VA_SUB, VA_SUPER, VA_TOP, VA_BOTTOM, VA_TEXT_TOP, VA_TEXT_BOTTOM };
117enum { BS_NONE, BS_SOLID };
118enum { V_VISIBLE, V_HIDDEN, V_COLLAPSE };
119enum { PB_AUTO, PB_ALWAYS, PB_AVOID, PB_LEFT, PB_RIGHT };
120
121enum {
122 WS_COLLAPSE = 1,
123 WS_ALLOW_BREAK_SPACE = 2,
124 WS_FORCE_BREAK_NEWLINE = 4,
125 WS_NORMAL = WS_COLLAPSE | WS_ALLOW_BREAK_SPACE,
126 WS_PRE = WS_FORCE_BREAK_NEWLINE,
127 WS_NOWRAP = WS_COLLAPSE,
128 WS_PRE_WRAP = WS_ALLOW_BREAK_SPACE | WS_FORCE_BREAK_NEWLINE,
129 WS_PRE_LINE = WS_COLLAPSE | WS_ALLOW_BREAK_SPACE | WS_FORCE_BREAK_NEWLINE
130};
131
132enum {
133 LST_NONE,
134 LST_DISC, LST_CIRCLE, LST_SQUARE,
135 LST_DECIMAL, LST_DECIMAL_ZERO,
136 LST_LC_ROMAN, LST_UC_ROMAN,
137 LST_LC_GREEK, LST_UC_GREEK,
138 LST_LC_LATIN, LST_UC_LATIN,
139 LST_LC_ALPHA, LST_UC_ALPHA,
140 LST_ARMENIAN, LST_GEORGIAN,
141};
142
143enum { N_NUMBER='u', N_LENGTH='p', N_SCALE='m', N_PERCENT='%', N_AUTO='a' };
144
145struct fz_css_number_s
146{
147 float value;
148 int unit;
149};
150
151struct fz_css_color_s
152{
153 unsigned char r, g, b, a;
154};
155
156struct fz_css_style_s
157{
158 fz_css_number font_size;
159 fz_css_number width, height;
160 fz_css_number margin[4];
161 fz_css_number padding[4];
162 fz_css_number border_width[4];
163 fz_css_number text_indent;
164 unsigned int visibility : 2;
165 unsigned int white_space : 3;
166 unsigned int text_align : 2;
167 unsigned int vertical_align : 3;
168 unsigned int list_style_type : 4;
169 unsigned int page_break_before : 3;
170 unsigned int page_break_after : 3;
171 unsigned int border_style_0 : 1;
172 unsigned int border_style_1 : 1;
173 unsigned int border_style_2 : 1;
174 unsigned int border_style_3 : 1;
175 unsigned int small_caps : 1;
176 fz_css_number line_height;
177 fz_css_color background_color;
178 fz_css_color border_color[4];
179 fz_css_color color;
180 fz_font *font;
181};
182
183enum
184{
185 BOX_BLOCK, /* block-level: contains block, break, flow, and table boxes */
186 BOX_BREAK, /* block-level: empty <br> tag boxes */
187 BOX_FLOW, /* block-level: contains only inline boxes */
188 BOX_INLINE, /* inline-level: contains only inline boxes */
189 BOX_TABLE, /* table: contains table-row */
190 BOX_TABLE_ROW, /* table-row: contains table-cell */
191 BOX_TABLE_CELL, /* table-cell: contains block */
192};
193
194struct fz_html_s
195{
196 fz_pool *pool; /* pool allocator for this html tree */
197 float page_w, page_h;
198 float page_margin[4];
199 fz_html_box *root;
200 char *title;
201};
202
203struct fz_html_box_s
204{
205 unsigned int type : 3;
206 unsigned int is_first_flow : 1; /* for text-indent */
207 unsigned int markup_dir : 2;
208 unsigned int heading : 3; /* h1..h6 */
209 unsigned int list_item : 23;
210 float x, y, w, b; /* content */
211 float padding[4];
212 float margin[4];
213 float border[4];
214 float em;
215 fz_html_box *up, *down, *last, *next;
216 fz_html_flow *flow_head, **flow_tail;
217 char *id, *href;
218 fz_css_style style;
219};
220
221enum
222{
223 FLOW_WORD = 0,
224 FLOW_SPACE = 1,
225 FLOW_BREAK = 2,
226 FLOW_IMAGE = 3,
227 FLOW_SBREAK = 4,
228 FLOW_SHYPHEN = 5,
229 FLOW_ANCHOR = 6
230};
231
232struct fz_html_flow_s
233{
234 /* What type of node */
235 unsigned int type : 3;
236
237 /* Whether this should expand during justification */
238 unsigned int expand : 1;
239
240 /* Whether this node is currently taken as a line break */
241 unsigned int breaks_line : 1;
242
243 /* Direction setting for text - UAX#9 says 125 is the max */
244 unsigned int bidi_level : 7;
245
246 /* The script detected by the bidi code. */
247 unsigned int script : 8;
248
249 /* Whether the markup specifies a given language. */
250 unsigned int markup_lang : 15;
251
252 float x, y, w, h;
253 fz_html_box *box; /* for style and em */
254 union {
255 char *text;
256 fz_image *image;
257 } content;
258 fz_html_flow *next;
259};
260
261fz_css *fz_new_css(fz_context *ctx);
262void fz_parse_css(fz_context *ctx, fz_css *css, const char *source, const char *file);
263fz_css_property *fz_parse_css_properties(fz_context *ctx, fz_pool *pool, const char *source);
264void fz_drop_css(fz_context *ctx, fz_css *css);
265void fz_debug_css(fz_context *ctx, fz_css *css);
266
267void fz_match_css(fz_context *ctx, fz_css_match *match, fz_css *css, fz_xml *node);
268void fz_match_css_at_page(fz_context *ctx, fz_css_match *match, fz_css *css);
269
270int fz_get_css_match_display(fz_css_match *node);
271void fz_default_css_style(fz_context *ctx, fz_css_style *style);
272void fz_apply_css_style(fz_context *ctx, fz_html_font_set *set, fz_css_style *style, fz_css_match *match);
273
274float fz_from_css_number(fz_css_number number, float em, float percent_value, float auto_value);
275float fz_from_css_number_scale(fz_css_number number, float scale);
276
277fz_html_font_set *fz_new_html_font_set(fz_context *ctx);
278void fz_add_html_font_face(fz_context *ctx, fz_html_font_set *set,
279 const char *family, int is_bold, int is_italic, int is_small_caps, const char *src, fz_font *font);
280fz_font *fz_load_html_font(fz_context *ctx, fz_html_font_set *set, const char *family, int is_bold, int is_italic, int is_small_caps);
281void fz_drop_html_font_set(fz_context *ctx, fz_html_font_set *htx);
282
283void fz_add_css_font_faces(fz_context *ctx, fz_html_font_set *set, fz_archive *zip, const char *base_uri, fz_css *css);
284
285fz_html *fz_parse_html(fz_context *ctx, fz_html_font_set *htx, fz_archive *zip, const char *base_uri, fz_buffer *buf, const char *user_css);
286void fz_layout_html(fz_context *ctx, fz_html *html, float w, float h, float em);
287void fz_draw_html(fz_context *ctx, fz_device *dev, fz_matrix ctm, fz_html *html, int page);
288fz_outline *fz_load_html_outline(fz_context *ctx, fz_html *node);
289
290float fz_find_html_target(fz_context *ctx, fz_html *html, const char *id);
291fz_link *fz_load_html_links(fz_context *ctx, fz_html *html, int page, const char *base_uri, void *doc);
292void fz_drop_html(fz_context *ctx, fz_html *html);
293fz_bookmark fz_make_html_bookmark(fz_context *ctx, fz_html *html, int page);
294int fz_lookup_html_bookmark(fz_context *ctx, fz_html *html, fz_bookmark mark);
295void fz_debug_html(fz_context *ctx, fz_html_box *box);
296
297#endif
298