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
35 #ifndef __CR_SEL_H__
36 #define __CR_SEL_H__
37
38 #include <stdio.h>
39 #include <glib.h>
40 #include "cr-additional-sel.h"
41 #include "cr-parsing-location.h"
42
43 G_BEGIN_DECLS
44
45 /**
46 *@file
47 *the declaration of the #CRSimpleSel class.
48 *
49 */
50 enum Combinator
51 {
52 NO_COMBINATOR,
53 COMB_WS,/*whitespace: descendent*/
54 COMB_PLUS,/*'+': preceded by*/
55 COMB_GT/*greater than ('>'): child*/
56 } ;
57
58 enum SimpleSelectorType
59 {
60 NO_SELECTOR_TYPE = 0,
61 UNIVERSAL_SELECTOR = 1,
62 TYPE_SELECTOR = 1 << 1
63 } ;
64
65 typedef struct _CRSimpleSel CRSimpleSel ;
66
67 /**
68 *The abstraction of a css2 simple selection list
69 *as defined by the right part of the "selector" production in the
70 *appendix D.1 of the css2 spec.
71 *It is basically a list of simple selector, each
72 *simple selector being separated by a combinator.
73 *
74 *In the libcroco's implementation, each simple selector
75 *is made of at most two parts:
76 *
77 *1/An element name or 'type selector' (which can hold a '*' and
78 *then been called 'universal selector')
79 *
80 *2/An additional selector that "specializes" the preceding type or
81 *universal selector. The additionnal selector can be either
82 *an id selector, or a class selector, or an attribute selector.
83 */
84 struct _CRSimpleSel
85 {
86 enum SimpleSelectorType type_mask ;
87 gboolean is_case_sentive ;
88 CRString * name ;
89 /**
90 *The combinator that separates
91 *this simple selector from the previous
92 *one.
93 */
94 enum Combinator combinator ;
95
96 /**
97 *The additional selector list of the
98 *current simple selector.
99 *An additional selector may
100 *be a class selector, an id selector,
101 *or an attribute selector.
102 *Note that this field is a linked list.
103 */
104 CRAdditionalSel *add_sel ;
105
106 /*
107 *the specificity as specified by
108 *chapter 6.4.3 of the spec.
109 */
110 gulong specificity ;
111
112 CRSimpleSel *next ;
113 CRSimpleSel *prev ;
114 CRParsingLocation location ;
115 } ;
116
117 CRSimpleSel * cr_simple_sel_new (void) ;
118
119 CRSimpleSel * cr_simple_sel_append_simple_sel (CRSimpleSel *a_this,
120 CRSimpleSel *a_sel) ;
121
122 CRSimpleSel * cr_simple_sel_prepend_simple_sel (CRSimpleSel *a_this,
123 CRSimpleSel *a_sel) ;
124
125 guchar * cr_simple_sel_to_string (CRSimpleSel const *a_this) ;
126
127 guchar * cr_simple_sel_one_to_string (CRSimpleSel const * a_this) ;
128
129 enum CRStatus cr_simple_sel_dump (CRSimpleSel const *a_this, FILE *a_fp) ;
130
131 enum CRStatus cr_simple_sel_dump_attr_sel_list (CRSimpleSel const *a_this) ;
132
133 enum CRStatus cr_simple_sel_compute_specificity (CRSimpleSel *a_this) ;
134
135 void cr_simple_sel_destroy (CRSimpleSel *a_this) ;
136
137 G_END_DECLS
138
139
140 #endif /*__CR_SIMPLE_SEL_H__*/