1 #ifndef LH_CSS_SELECTOR_H
2 #define LH_CSS_SELECTOR_H
5 #include "media_query.h"
9 //////////////////////////////////////////////////////////////////////////
11 struct selector_specificity
18 selector_specificity(int va = 0, int vb = 0, int vc = 0, int vd = 0)
26 void operator += (const selector_specificity& val)
34 bool operator==(const selector_specificity& val) const
36 if(a == val.a && b == val.b && c == val.c && d == val.d)
43 bool operator!=(const selector_specificity& val) const
45 if(a != val.a || b != val.b || c != val.c || d != val.d)
52 bool operator > (const selector_specificity& val) const
91 bool operator >= (const selector_specificity& val) const
93 if((*this) == val) return true;
94 if((*this) > val) return true;
98 bool operator <= (const selector_specificity& val) const
107 bool operator < (const selector_specificity& val) const
109 if((*this) <= val && (*this) != val)
118 //////////////////////////////////////////////////////////////////////////
120 enum attr_select_condition
128 select_pseudo_element,
131 //////////////////////////////////////////////////////////////////////////
133 struct css_attribute_selector
135 typedef std::vector<css_attribute_selector> vector;
139 string_vector class_val;
140 attr_select_condition condition;
142 css_attribute_selector()
144 condition = select_exists;
148 //////////////////////////////////////////////////////////////////////////
150 class css_element_selector
154 css_attribute_selector::vector m_attrs;
157 void parse(const tstring& txt);
160 //////////////////////////////////////////////////////////////////////////
164 combinator_descendant,
166 combinator_adjacent_sibling,
167 combinator_general_sibling
170 //////////////////////////////////////////////////////////////////////////
175 typedef std::shared_ptr<css_selector> ptr;
176 typedef std::vector<css_selector::ptr> vector;
178 selector_specificity m_specificity;
179 css_element_selector m_right;
180 css_selector::ptr m_left;
181 css_combinator m_combinator;
184 media_query_list::ptr m_media_query;
186 css_selector(media_query_list::ptr media)
188 m_media_query = media;
189 m_combinator = combinator_descendant;
197 css_selector(const css_selector& val)
199 m_right = val.m_right;
202 m_left = std::make_shared<css_selector>(*val.m_left);
207 m_combinator = val.m_combinator;
208 m_specificity = val.m_specificity;
209 m_order = val.m_order;
210 m_media_query = val.m_media_query;
213 bool parse(const tstring& text);
214 void calc_specificity();
215 bool is_media_valid() const;
216 void add_media_to_doc(document* doc) const;
219 inline bool css_selector::is_media_valid() const
225 return m_media_query->is_used();
229 //////////////////////////////////////////////////////////////////////////
231 inline bool operator > (const css_selector& v1, const css_selector& v2)
233 if(v1.m_specificity == v2.m_specificity)
235 return (v1.m_order > v2.m_order);
237 return (v1.m_specificity > v2.m_specificity);
240 inline bool operator < (const css_selector& v1, const css_selector& v2)
242 if(v1.m_specificity == v2.m_specificity)
244 return (v1.m_order < v2.m_order);
246 return (v1.m_specificity < v2.m_specificity);
249 inline bool operator >(const css_selector::ptr& v1, const css_selector::ptr& v2)
254 inline bool operator < (const css_selector::ptr& v1, const css_selector::ptr& v2)
259 //////////////////////////////////////////////////////////////////////////
264 typedef std::unique_ptr<used_selector> ptr;
265 typedef std::vector<used_selector::ptr> vector;
267 css_selector::ptr m_selector;
270 used_selector(const css_selector::ptr& selector, bool used)
273 m_selector = selector;
278 #endif // LH_CSS_SELECTOR_H