Photon 1.0.0
Loading...
Searching...
No Matches
media_query.h
Go to the documentation of this file.
1#ifndef LH_MEDIA_QUERY_H
2#define LH_MEDIA_QUERY_H
3
4namespace litehtml
5{
6 // https://drafts.csswg.org/mediaqueries/#evaluating
7 enum trilean
8 {
12 };
13 static_assert(False == false && True == true); // for casting bool to trilean
14
16 {
17 if (x == False) return True;
18 if (x == True) return False;
19 return Unknown;
20 }
21
23 {
24 if (a == False || b == False) return False;
25 if (a == True && b == True) return True;
26 return Unknown;
27 }
28
30 {
31 if (a == True || b == True) return True;
32 if (a == False && b == False) return False;
33 return Unknown;
34 }
35
36
37 struct media_condition;
38
39 // <media-query> = <media-condition> | [ not | only ]? <media-type> [ and <media-condition-without-or> ]?
41 {
42 bool m_not = true;
44 vector<media_condition> m_conditions;
45
46 trilean check(const media_features& features) const;
47 };
48
49 struct media_in_parens;
50
51 // <media-condition> = not <media-in-parens> | <media-in-parens> [ [and <media-in-parens>]* | [or <media-in-parens>]* ]
53 {
54 string_id op = _and_; // _not_ _and_ _or_
55 vector<media_in_parens> m_conditions;
56
57 trilean check(const media_features& features) const;
58 };
59
60 // <media-feature> = ( [ <mf-plain> | <mf-boolean> | <mf-range> ] )
61 // <mf-plain> = <mf-name> : <mf-value>
63 {
64 string name;
65 float value = 0;
66 float value2 = 0;
67 short op = 0;
68 short op2 = 0;
69
70 bool verify_and_convert_units(string_id syntax, css_token val[2] = 0, css_token val2[2] = 0, shared_ptr<document> doc = 0);
71
72 bool compare(int x) const { return compare((float)x); }
73 bool compare(float x) const;
74 bool check(const media_features& features) const;
75 };
76
77 // <media-in-parens> = ( <media-condition> ) | <media-feature> | <general-enclosed>
78 struct unknown {}; // <general-enclosed>
79 struct media_in_parens : variant<media_condition, media_feature, unknown>
80 {
81 using base::base; // inherit ctors
82
83 trilean check(const media_features& features) const;
84 };
85
87 {
88 vector<media_query> m_queries;
89 bool empty() const { return m_queries.empty(); }
90 bool check(const media_features& features) const;
91 };
92 media_query_list parse_media_query_list(const css_token_vector& tokens, shared_ptr<document> doc);
93 media_query_list parse_media_query_list(const string& str, shared_ptr<document> doc);
94
95
97 {
98 public:
100 using vector = std::vector<ptr>;
101 private:
102 std::vector<media_query_list> m_media_query_lists;
103 bool m_is_used = false;
104 public:
106 {
107 m_media_query_lists.push_back(mq_list);
108 }
109 bool is_used() const { return m_is_used; }
110
111 bool apply_media_features(const media_features& features); // returns true if the m_is_used changed
112 };
113
114}
115
116#endif // LH_MEDIA_QUERY_H
Definition media_query.h:97
bool is_used() const
Definition media_query.h:109
std::vector< media_query_list > m_media_query_lists
Definition media_query.h:102
bool m_is_used
Definition media_query.h:103
std::vector< ptr > vector
Definition media_query.h:100
bool apply_media_features(const media_features &features)
Definition media_query.cpp:165
shared_ptr< media_query_list_list > ptr
Definition media_query.h:99
void add(const media_query_list &mq_list)
Definition media_query.h:105
Definition core.h:1598
Definition background.h:12
vector< css_token > css_token_vector
Definition css_tokenizer.h:151
trilean operator!(trilean x)
Definition media_query.h:15
media_query_list parse_media_query_list(const css_token_vector &tokens, shared_ptr< document > doc)
trilean operator||(trilean a, trilean b)
Definition media_query.h:29
trilean
Definition media_query.h:8
@ Unknown
Definition media_query.h:11
@ False
Definition media_query.h:9
@ True
Definition media_query.h:10
trilean operator&&(trilean a, trilean b)
Definition media_query.h:22
media_type
Definition types.h:869
@ media_type_all
Definition types.h:871
Definition css_tokenizer.h:69
Definition media_query.h:53
trilean check(const media_features &features) const
Definition media_query.cpp:75
string_id op
Definition media_query.h:54
vector< media_in_parens > m_conditions
Definition media_query.h:55
Definition media_query.h:63
bool verify_and_convert_units(string_id syntax, css_token val[2]=0, css_token val2[2]=0, shared_ptr< document > doc=0)
Definition media_query.cpp:469
string name
Definition media_query.h:64
short op
Definition media_query.h:67
float value2
Definition media_query.h:66
bool check(const media_features &features) const
Definition media_query.cpp:37
short op2
Definition media_query.h:68
bool compare(int x) const
Definition media_query.h:72
Definition types.h:878
Definition media_query.h:80
trilean check(const media_features &features) const
Definition media_query.cpp:110
Definition media_query.h:87
bool check(const media_features &features) const
Definition media_query.cpp:147
vector< media_query > m_queries
Definition media_query.h:88
bool empty() const
Definition media_query.h:89
Definition media_query.h:41
media_type m_media_type
Definition media_query.h:43
bool m_not
Definition media_query.h:42
trilean check(const media_features &features) const
Definition media_query.cpp:118
vector< media_condition > m_conditions
Definition media_query.h:44
Definition media_query.h:78
Definition types.h:38
b
Definition tag_strings.h:61
a
Definition tag_strings.h:43