1 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2 
3 /* libcroco - Library for parsing and applying CSS
4  * Copyright (C) 2006-2019 Free Software Foundation, Inc.
5  *
6  * This file is not part of the GNU gettext program, but is used with
7  * GNU gettext.
8  *
9  * The original copyright notice is as follows:
10  */
11 
12 /*
13  * This file is part of The Croco Library
14  *
15  * Copyright (C) 2003-2004 Dodji Seketeli.  All Rights Reserved.
16  *
17  * This program is free software; you can redistribute it and/or
18  * modify it under the terms of version 2.1 of the GNU Lesser General Public
19  * License as published by the Free Software Foundation.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU Lesser General Public License
27  * along with this program; if not, write to the Free Software
28  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
29  * USA
30  *
31  * Author: Dodji Seketeli
32  */
33 
34 #include <stdio.h>
35 #include "cr-utils.h"
36 #include "cr-term.h"
37 #include "cr-selector.h"
38 #include "cr-declaration.h"
39 
40 #ifndef __CR_STATEMENT_H__
41 #define __CR_STATEMENT_H__
42 
43 G_BEGIN_DECLS
44 
45 /**
46  *@file
47  *Declaration of the #CRStatement class.
48  */
49 
50 /*
51  *forward declaration of CRStyleSheet which is defined in
52  *cr-stylesheet.h
53  */
54 
55 struct _CRStatement ;
56 
57 /*
58  *typedef struct _CRStatement CRStatement ;
59  *this is forward declared in
60  *cr-declaration.h already.
61  */
62 
63 struct _CRAtMediaRule ;
64 typedef struct _CRAtMediaRule CRAtMediaRule ;
65 
66 typedef struct _CRRuleSet CRRuleSet ;
67 
68 /**
69  *The abstraction of a css ruleset.
70  *A ruleset is made of a list of selectors,
71  *followed by a list of declarations.
72  */
73 struct _CRRuleSet
74 {
75 	/**A list of instances of #CRSimpeSel*/
76 	CRSelector *sel_list ;
77 
78 	/**A list of instances of #CRDeclaration*/
79 	CRDeclaration *decl_list ;
80 
81 	/**
82 	 *The parent media rule, or NULL if
83 	 *no parent media rule exists.
84 	 */
85 	CRStatement *parent_media_rule ;
86 } ;
87 
88 /*
89  *a forward declaration of CRStylesheet.
90  *CRStylesheet is actually declared in
91  *cr-stylesheet.h
92  */
93 struct _CRStyleSheet ;
94 typedef struct _CRStyleSheet CRStyleSheet;
95 
96 
97 /**The \@import rule abstraction.*/
98 typedef struct _CRAtImportRule CRAtImportRule ;
99 struct _CRAtImportRule
100 {
101 	/**the url of the import rule*/
102 	CRString *url ;
103 
104         GList *media_list ;
105 
106 	/**
107 	 *the stylesheet fetched from the url, if any.
108 	 *this is not "owned" by #CRAtImportRule which means
109 	 *it is not destroyed by the destructor of #CRAtImportRule.
110 	 */
111 	CRStyleSheet * sheet;
112 };
113 
114 
115 /**abstraction of an \@media rule*/
116 struct _CRAtMediaRule
117 {
118 	GList *media_list ;
119 	CRStatement *rulesets ;
120 } ;
121 
122 
123 typedef struct _CRAtPageRule CRAtPageRule ;
124 /**The \@page rule abstraction*/
125 struct _CRAtPageRule
126 {
127 	/**a list of instances of #CRDeclaration*/
128 	CRDeclaration *decl_list ;
129 
130 	/**page selector. Is a pseudo selector*/
131 	CRString *name ;
132 	CRString *pseudo ;
133 } ;
134 
135 /**The \@charset rule abstraction*/
136 typedef struct _CRAtCharsetRule CRAtCharsetRule ;
137 struct _CRAtCharsetRule
138 {
139 	CRString * charset ;
140 };
141 
142 /**The abstaction of the \@font-face rule.*/
143 typedef struct _CRAtFontFaceRule CRAtFontFaceRule ;
144 struct _CRAtFontFaceRule
145 {
146 	/*a list of instanaces of #CRDeclaration*/
147 	CRDeclaration *decl_list ;
148 } ;
149 
150 
151 /**
152  *The possible types of css2 statements.
153  */
154 enum CRStatementType
155 {
156 	/**
157 	 *A generic css at-rule
158 	 *each unknown at-rule will
159 	 *be of this type.
160 	 */
161 
162         /**A css at-rule*/
163 	AT_RULE_STMT = 0,
164 
165 	/*A css ruleset*/
166 	RULESET_STMT,
167 
168 	/**A css2 import rule*/
169 	AT_IMPORT_RULE_STMT,
170 
171 	/**A css2 media rule*/
172 	AT_MEDIA_RULE_STMT,
173 
174 	/**A css2 page rule*/
175 	AT_PAGE_RULE_STMT,
176 
177 	/**A css2 charset rule*/
178 	AT_CHARSET_RULE_STMT,
179 
180 	/**A css2 font face rule*/
181 	AT_FONT_FACE_RULE_STMT
182 } ;
183 
184 
185 /**
186  *The abstraction of css statement as defined
187  *in the chapter 4 and appendix D.1 of the css2 spec.
188  *A statement is actually a double chained list of
189  *statements.A statement can be a ruleset, an \@import
190  *rule, an \@page rule etc ...
191  */
192 struct _CRStatement
193 {
194 	/**
195 	 *The type of the statement.
196 	 */
197 	enum CRStatementType type ;
198 
199 	union
200 	{
201 		CRRuleSet *ruleset ;
202 		CRAtImportRule *import_rule ;
203 		CRAtMediaRule *media_rule ;
204 		CRAtPageRule *page_rule ;
205 		CRAtCharsetRule *charset_rule ;
206 		CRAtFontFaceRule *font_face_rule ;
207 	} kind ;
208 
209         /*
210          *the specificity of the selector
211          *that matched this statement.
212          *This is only used by the cascading
213          *order determination algorithm.
214          */
215         gulong specificity ;
216 
217         /*
218          *the style sheet that contains
219          *this css statement.
220          */
221         CRStyleSheet *parent_sheet ;
222 	CRStatement *next ;
223 	CRStatement *prev ;
224 
225         CRParsingLocation location ;
226 
227         /**
228          *a custom pointer useable by
229          *applications that use libcroco.
230          *libcroco itself will never modify
231          *this pointer.
232          */
233         gpointer app_data ;
234 
235         /**
236          *a custom pointer used
237          *by the upper layers of libcroco.
238          *application should never use this
239          *pointer.
240          */
241         gpointer croco_data ;
242 
243 } ;
244 
245 
246 gboolean
247 cr_statement_does_buf_parses_against_core (const guchar *a_buf,
248                                            enum CREncoding a_encoding) ;
249 CRStatement *
250 cr_statement_parse_from_buf (const guchar *a_buf,
251 			     enum CREncoding a_encoding) ;
252 CRStatement*
253 cr_statement_new_ruleset (CRStyleSheet *a_sheet,
254                           CRSelector *a_sel_list,
255 			  CRDeclaration *a_decl_list,
256 			  CRStatement *a_media_rule) ;
257 CRStatement *
258 cr_statement_ruleset_parse_from_buf (const guchar * a_buf,
259 				     enum CREncoding a_enc) ;
260 
261 CRStatement*
262 cr_statement_new_at_import_rule (CRStyleSheet *a_container_sheet,
263                                  CRString *a_url,
264                                  GList *a_media_list,
265 				 CRStyleSheet *a_imported_sheet) ;
266 
267 CRStatement *
268 cr_statement_at_import_rule_parse_from_buf (const guchar * a_buf,
269                                             enum CREncoding a_encoding) ;
270 
271 CRStatement *
272 cr_statement_new_at_media_rule (CRStyleSheet *a_sheet,
273                                 CRStatement *a_ruleset,
274 				GList *a_media) ;
275 CRStatement *
276 cr_statement_at_media_rule_parse_from_buf (const guchar *a_buf,
277 					   enum CREncoding a_enc) ;
278 
279 CRStatement *
280 cr_statement_new_at_charset_rule (CRStyleSheet *a_sheet,
281                                   CRString *a_charset) ;
282 CRStatement *
283 cr_statement_at_charset_rule_parse_from_buf (const guchar *a_buf,
284 					     enum CREncoding a_encoding);
285 
286 
287 CRStatement *
288 cr_statement_new_at_font_face_rule (CRStyleSheet *a_sheet,
289                                     CRDeclaration *a_font_decls) ;
290 CRStatement *
291 cr_statement_font_face_rule_parse_from_buf (const guchar *a_buf,
292 					    enum CREncoding a_encoding) ;
293 
294 CRStatement *
295 cr_statement_new_at_page_rule (CRStyleSheet *a_sheet,
296                                CRDeclaration *a_decl_list,
297 			       CRString *a_name,
298 			       CRString *a_pseudo) ;
299 CRStatement *
300 cr_statement_at_page_rule_parse_from_buf (const guchar *a_buf,
301 					  enum CREncoding a_encoding)  ;
302 
303 enum CRStatus
304 cr_statement_set_parent_sheet (CRStatement *a_this,
305                                CRStyleSheet *a_sheet) ;
306 
307 enum CRStatus
308 cr_statement_get_parent_sheet (CRStatement *a_this,
309                                CRStyleSheet **a_sheet) ;
310 
311 CRStatement *
312 cr_statement_append (CRStatement *a_this,
313 		     CRStatement *a_new) ;
314 
315 CRStatement*
316 cr_statement_prepend (CRStatement *a_this,
317 		      CRStatement *a_new) ;
318 
319 CRStatement *
320 cr_statement_unlink (CRStatement *a_stmt) ;
321 
322 enum CRStatus
323 cr_statement_ruleset_set_sel_list (CRStatement *a_this,
324 				   CRSelector *a_sel_list) ;
325 
326 enum CRStatus
327 cr_statement_ruleset_get_sel_list (CRStatement const *a_this,
328 				   CRSelector **a_list) ;
329 
330 enum CRStatus
331 cr_statement_ruleset_set_decl_list (CRStatement *a_this,
332 				    CRDeclaration *a_list) ;
333 
334 enum CRStatus
335 cr_statement_ruleset_get_declarations (CRStatement *a_this,
336                                        CRDeclaration **a_decl_list) ;
337 
338 enum CRStatus
339 cr_statement_ruleset_append_decl2 (CRStatement *a_this,
340 				   CRString *a_prop, CRTerm *a_value) ;
341 
342 enum CRStatus
343 cr_statement_ruleset_append_decl (CRStatement *a_this,
344 				  CRDeclaration *a_decl) ;
345 
346 enum CRStatus
347 cr_statement_at_import_rule_set_imported_sheet (CRStatement *a_this,
348                                                 CRStyleSheet *a_sheet) ;
349 
350 enum CRStatus
351 cr_statement_at_import_rule_get_imported_sheet (CRStatement *a_this,
352                                                 CRStyleSheet **a_sheet) ;
353 
354 enum CRStatus
355 cr_statement_at_import_rule_set_url (CRStatement *a_this,
356 				     CRString *a_url) ;
357 
358 enum CRStatus
359 cr_statement_at_import_rule_get_url (CRStatement const *a_this,
360 				     CRString **a_url) ;
361 
362 gint
363 cr_statement_at_media_nr_rules (CRStatement const *a_this) ;
364 
365 CRStatement *
366 cr_statement_at_media_get_from_list (CRStatement *a_this, int itemnr) ;
367 
368 enum CRStatus
369 cr_statement_at_page_rule_set_sel (CRStatement *a_this,
370 				   CRSelector *a_sel) ;
371 
372 enum CRStatus
373 cr_statement_at_page_rule_get_sel (CRStatement const *a_this,
374 				   CRSelector **a_sel) ;
375 
376 enum CRStatus
377 cr_statement_at_page_rule_set_declarations (CRStatement *a_this,
378 					    CRDeclaration *a_decl_list) ;
379 
380 enum CRStatus
381 cr_statement_at_page_rule_get_declarations (CRStatement *a_this,
382 					    CRDeclaration **a_decl_list) ;
383 
384 enum CRStatus
385 cr_statement_at_charset_rule_set_charset (CRStatement *a_this,
386 					  CRString *a_charset) ;
387 
388 enum CRStatus
389 cr_statement_at_charset_rule_get_charset (CRStatement const *a_this,
390 					  CRString **a_charset) ;
391 
392 enum CRStatus
393 cr_statement_at_font_face_rule_set_decls (CRStatement *a_this,
394 					  CRDeclaration *a_decls) ;
395 
396 enum CRStatus
397 cr_statement_at_font_face_rule_get_decls (CRStatement *a_this,
398 					  CRDeclaration **a_decls) ;
399 
400 enum CRStatus
401 cr_statement_at_font_face_rule_add_decl (CRStatement *a_this,
402 					 CRString *a_prop,
403 					 CRTerm *a_value) ;
404 
405 gchar *
406 cr_statement_to_string (CRStatement const * a_this, gulong a_indent) ;
407 
408 gchar*
409 cr_statement_list_to_string (CRStatement const *a_this, gulong a_indent) ;
410 
411 void
412 cr_statement_dump (CRStatement const *a_this, FILE *a_fp, gulong a_indent) ;
413 
414 void
415 cr_statement_dump_ruleset (CRStatement const * a_this, FILE * a_fp,
416                            glong a_indent) ;
417 
418 void
419 cr_statement_dump_font_face_rule (CRStatement const * a_this,
420                                   FILE * a_fp,
421                                   glong a_indent) ;
422 
423 void
424 cr_statement_dump_page (CRStatement const * a_this, FILE * a_fp,
425                         gulong a_indent) ;
426 
427 
428 void
429 cr_statement_dump_media_rule (CRStatement const * a_this,
430                               FILE * a_fp,
431                               gulong a_indent) ;
432 
433 void
434 cr_statement_dump_import_rule (CRStatement const * a_this, FILE * a_fp,
435                                gulong a_indent) ;
436 void
437 cr_statement_dump_charset (CRStatement const * a_this, FILE * a_fp,
438                            gulong a_indent) ;
439 gint
440 cr_statement_nr_rules (CRStatement const *a_this) ;
441 
442 CRStatement *
443 cr_statement_get_from_list (CRStatement *a_this, int itemnr) ;
444 
445 void
446 cr_statement_destroy (CRStatement *a_this) ;
447 
448 G_END_DECLS
449 
450 #endif /*__CR_STATEMENT_H__*/
451