sassc 2.2.1 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +18 -0
- data/Rakefile +1 -3
- data/ext/extconf.rb +13 -5
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/base.h +2 -1
- data/ext/libsass/include/sass/context.h +4 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +158 -168
- data/ext/libsass/src/ast.hpp +389 -230
- data/ext/libsass/src/ast_def_macros.hpp +18 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
- data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
- data/ext/libsass/src/ast_helpers.hpp +292 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +207 -212
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +594 -1026
- data/ext/libsass/src/ast_selectors.hpp +339 -385
- data/ext/libsass/src/ast_supports.cpp +36 -52
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +271 -84
- data/ext/libsass/src/ast_values.hpp +116 -107
- data/ext/libsass/src/backtrace.cpp +9 -9
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +2 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +18 -18
- data/ext/libsass/src/bind.hpp +1 -1
- data/ext/libsass/src/c2ast.cpp +3 -3
- data/ext/libsass/src/c2ast.hpp +1 -1
- data/ext/libsass/src/cencode.c +4 -6
- data/ext/libsass/src/check_nesting.cpp +40 -41
- data/ext/libsass/src/check_nesting.hpp +6 -2
- data/ext/libsass/src/color_maps.cpp +14 -13
- data/ext/libsass/src/color_maps.hpp +1 -9
- data/ext/libsass/src/constants.cpp +5 -0
- data/ext/libsass/src/constants.hpp +6 -0
- data/ext/libsass/src/context.cpp +92 -119
- data/ext/libsass/src/context.hpp +41 -53
- data/ext/libsass/src/cssize.cpp +66 -149
- data/ext/libsass/src/cssize.hpp +17 -23
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debugger.hpp +451 -295
- data/ext/libsass/src/emitter.cpp +15 -16
- data/ext/libsass/src/emitter.hpp +10 -12
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +29 -24
- data/ext/libsass/src/error_handling.cpp +62 -41
- data/ext/libsass/src/error_handling.hpp +61 -51
- data/ext/libsass/src/eval.cpp +167 -281
- data/ext/libsass/src/eval.hpp +27 -29
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +275 -222
- data/ext/libsass/src/expand.hpp +36 -16
- data/ext/libsass/src/extender.cpp +1188 -0
- data/ext/libsass/src/extender.hpp +399 -0
- data/ext/libsass/src/extension.cpp +43 -0
- data/ext/libsass/src/extension.hpp +89 -0
- data/ext/libsass/src/file.cpp +81 -72
- data/ext/libsass/src/file.hpp +28 -37
- data/ext/libsass/src/fn_colors.cpp +20 -18
- data/ext/libsass/src/fn_lists.cpp +30 -29
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +34 -46
- data/ext/libsass/src/fn_numbers.cpp +20 -13
- data/ext/libsass/src/fn_selectors.cpp +98 -128
- data/ext/libsass/src/fn_strings.cpp +47 -33
- data/ext/libsass/src/fn_utils.cpp +31 -29
- data/ext/libsass/src/fn_utils.hpp +17 -11
- data/ext/libsass/src/inspect.cpp +186 -148
- data/ext/libsass/src/inspect.hpp +31 -29
- data/ext/libsass/src/lexer.cpp +20 -82
- data/ext/libsass/src/lexer.hpp +5 -16
- data/ext/libsass/src/listize.cpp +23 -37
- data/ext/libsass/src/listize.hpp +8 -9
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
- data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/operation.hpp +71 -61
- data/ext/libsass/src/operators.cpp +19 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +45 -64
- data/ext/libsass/src/output.hpp +6 -6
- data/ext/libsass/src/parser.cpp +512 -700
- data/ext/libsass/src/parser.hpp +89 -97
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +7 -7
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +7 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/prelexer.cpp +6 -6
- data/ext/libsass/src/remove_placeholders.cpp +55 -56
- data/ext/libsass/src/remove_placeholders.hpp +21 -18
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +10 -5
- data/ext/libsass/src/sass2scss.cpp +4 -4
- data/ext/libsass/src/sass_context.cpp +91 -122
- data/ext/libsass/src/sass_context.hpp +2 -2
- data/ext/libsass/src/sass_functions.cpp +1 -1
- data/ext/libsass/src/sass_values.cpp +8 -11
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +22 -18
- data/ext/libsass/src/source_map.hpp +12 -9
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +2 -2
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.cpp +24 -22
- data/ext/libsass/src/units.hpp +8 -8
- data/ext/libsass/src/utf8_string.cpp +9 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +48 -50
- data/ext/libsass/src/util.hpp +20 -21
- data/ext/libsass/src/util_string.cpp +111 -61
- data/ext/libsass/src/util_string.hpp +62 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/engine.rb +5 -3
- data/lib/sassc/functions_handler.rb +8 -8
- data/lib/sassc/native.rb +4 -6
- data/lib/sassc/script.rb +4 -4
- data/lib/sassc/version.rb +1 -1
- data/test/functions_test.rb +18 -1
- data/test/native_test.rb +4 -4
- metadata +29 -15
- data/ext/libsass/src/extend.cpp +0 -2132
- data/ext/libsass/src/extend.hpp +0 -86
- data/ext/libsass/src/node.cpp +0 -322
- data/ext/libsass/src/node.hpp +0 -118
- data/ext/libsass/src/paths.hpp +0 -71
- data/ext/libsass/src/sass_util.cpp +0 -152
- data/ext/libsass/src/sass_util.hpp +0 -256
- data/ext/libsass/src/subset_map.cpp +0 -58
- data/ext/libsass/src/subset_map.hpp +0 -76
- data/lib/sassc/native/lib_c.rb +0 -21
@@ -0,0 +1,292 @@
|
|
1
|
+
#ifndef SASS_AST_HELPERS_H
|
2
|
+
#define SASS_AST_HELPERS_H
|
3
|
+
|
4
|
+
// sass.hpp must go before all system headers to get the
|
5
|
+
// __EXTENSIONS__ fix on Solaris.
|
6
|
+
#include "sass.hpp"
|
7
|
+
#include <algorithm>
|
8
|
+
#include <functional>
|
9
|
+
#include "util_string.hpp"
|
10
|
+
|
11
|
+
namespace Sass {
|
12
|
+
|
13
|
+
// ###########################################################################
|
14
|
+
// ###########################################################################
|
15
|
+
|
16
|
+
// easier to search with name
|
17
|
+
const bool DELAYED = true;
|
18
|
+
|
19
|
+
// ToDo: should this really be hardcoded
|
20
|
+
// Note: most methods follow precision option
|
21
|
+
const double NUMBER_EPSILON = 1e-12;
|
22
|
+
|
23
|
+
// macro to test if numbers are equal within a small error margin
|
24
|
+
#define NEAR_EQUAL(lhs, rhs) std::fabs(lhs - rhs) < NUMBER_EPSILON
|
25
|
+
|
26
|
+
// ###########################################################################
|
27
|
+
// We define various functions and functors here.
|
28
|
+
// Functions satisfy the BinaryPredicate requirement
|
29
|
+
// Functors are structs used for e.g. unordered_map
|
30
|
+
// ###########################################################################
|
31
|
+
|
32
|
+
// ###########################################################################
|
33
|
+
// Implement compare and hashing operations for raw pointers
|
34
|
+
// ###########################################################################
|
35
|
+
|
36
|
+
template <class T>
|
37
|
+
size_t PtrHashFn(const T* ptr) {
|
38
|
+
return std::hash<std::size_t>()((size_t)ptr);
|
39
|
+
}
|
40
|
+
|
41
|
+
struct PtrHash {
|
42
|
+
template <class T>
|
43
|
+
size_t operator() (const T* ptr) const {
|
44
|
+
return PtrHashFn(ptr);
|
45
|
+
}
|
46
|
+
};
|
47
|
+
|
48
|
+
template <class T>
|
49
|
+
bool PtrEqualityFn(const T* lhs, const T* rhs) {
|
50
|
+
return lhs == rhs; // compare raw pointers
|
51
|
+
}
|
52
|
+
|
53
|
+
struct PtrEquality {
|
54
|
+
template <class T>
|
55
|
+
bool operator() (const T* lhs, const T* rhs) const {
|
56
|
+
return PtrEqualityFn<T>(lhs, rhs);
|
57
|
+
}
|
58
|
+
};
|
59
|
+
|
60
|
+
// ###########################################################################
|
61
|
+
// Implement compare and hashing operations for AST Nodes
|
62
|
+
// ###########################################################################
|
63
|
+
|
64
|
+
// TODO: get rid of funtions and use ObjEquality<T>
|
65
|
+
|
66
|
+
template <class T>
|
67
|
+
// Hash the raw pointer instead of object
|
68
|
+
size_t ObjPtrHashFn(const T& obj) {
|
69
|
+
return PtrHashFn(obj.ptr());
|
70
|
+
}
|
71
|
+
|
72
|
+
struct ObjPtrHash {
|
73
|
+
template <class T>
|
74
|
+
// Hash the raw pointer instead of object
|
75
|
+
size_t operator() (const T& obj) const {
|
76
|
+
return ObjPtrHashFn(obj);
|
77
|
+
}
|
78
|
+
};
|
79
|
+
|
80
|
+
template <class T>
|
81
|
+
// Hash the object and its content
|
82
|
+
size_t ObjHashFn(const T& obj) {
|
83
|
+
return obj ? obj->hash() : 0;
|
84
|
+
}
|
85
|
+
|
86
|
+
struct ObjHash {
|
87
|
+
template <class T>
|
88
|
+
// Hash the object and its content
|
89
|
+
size_t operator() (const T& obj) const {
|
90
|
+
return ObjHashFn(obj);
|
91
|
+
}
|
92
|
+
};
|
93
|
+
|
94
|
+
template <class T>
|
95
|
+
// Hash the object behind pointer
|
96
|
+
size_t PtrObjHashFn(const T* obj) {
|
97
|
+
return obj ? obj->hash() : 0;
|
98
|
+
}
|
99
|
+
|
100
|
+
struct PtrObjHash {
|
101
|
+
template <class T>
|
102
|
+
// Hash the object behind pointer
|
103
|
+
size_t operator() (const T* obj) const {
|
104
|
+
return PtrObjHashFn(obj);
|
105
|
+
}
|
106
|
+
};
|
107
|
+
|
108
|
+
template <class T>
|
109
|
+
// Compare raw pointers to the object
|
110
|
+
bool ObjPtrEqualityFn(const T& lhs, const T& rhs) {
|
111
|
+
return PtrEqualityFn(lhs.ptr(), rhs.ptr());
|
112
|
+
}
|
113
|
+
|
114
|
+
struct ObjPtrEquality {
|
115
|
+
template <class T>
|
116
|
+
// Compare raw pointers to the object
|
117
|
+
bool operator() (const T& lhs, const T& rhs) const {
|
118
|
+
return ObjPtrEqualityFn<T>(lhs, rhs);
|
119
|
+
}
|
120
|
+
};
|
121
|
+
|
122
|
+
template <class T>
|
123
|
+
// Compare the objects behind the pointers
|
124
|
+
bool PtrObjEqualityFn(const T* lhs, const T* rhs) {
|
125
|
+
if (lhs == nullptr) return rhs == nullptr;
|
126
|
+
else if (rhs == nullptr) return false;
|
127
|
+
else return *lhs == *rhs;
|
128
|
+
}
|
129
|
+
|
130
|
+
struct PtrObjEquality {
|
131
|
+
template <class T>
|
132
|
+
// Compare the objects behind the pointers
|
133
|
+
bool operator() (const T* lhs, const T* rhs) const {
|
134
|
+
return PtrObjEqualityFn<T>(lhs, rhs);
|
135
|
+
}
|
136
|
+
};
|
137
|
+
|
138
|
+
template <class T>
|
139
|
+
// Compare the objects and its contents
|
140
|
+
bool ObjEqualityFn(const T& lhs, const T& rhs) {
|
141
|
+
return PtrObjEqualityFn(lhs.ptr(), rhs.ptr());
|
142
|
+
}
|
143
|
+
|
144
|
+
struct ObjEquality {
|
145
|
+
template <class T>
|
146
|
+
// Compare the objects and its contents
|
147
|
+
bool operator() (const T& lhs, const T& rhs) const {
|
148
|
+
return ObjEqualityFn<T>(lhs, rhs);
|
149
|
+
}
|
150
|
+
};
|
151
|
+
|
152
|
+
// ###########################################################################
|
153
|
+
// Implement ordering operations for AST Nodes
|
154
|
+
// ###########################################################################
|
155
|
+
|
156
|
+
template <class T>
|
157
|
+
// Compare the objects behind pointers
|
158
|
+
bool PtrObjLessThanFn(const T* lhs, const T* rhs) {
|
159
|
+
if (lhs == nullptr) return rhs != nullptr;
|
160
|
+
else if (rhs == nullptr) return false;
|
161
|
+
else return *lhs < *rhs;
|
162
|
+
}
|
163
|
+
|
164
|
+
struct PtrObjLessThan {
|
165
|
+
template <class T>
|
166
|
+
// Compare the objects behind pointers
|
167
|
+
bool operator() (const T* lhs, const T* rhs) const {
|
168
|
+
return PtrObjLessThanFn<T>(lhs, rhs);
|
169
|
+
}
|
170
|
+
};
|
171
|
+
|
172
|
+
template <class T>
|
173
|
+
// Compare the objects and its content
|
174
|
+
bool ObjLessThanFn(const T& lhs, const T& rhs) {
|
175
|
+
return PtrObjLessThanFn(lhs.ptr(), rhs.ptr());
|
176
|
+
};
|
177
|
+
|
178
|
+
struct ObjLessThan {
|
179
|
+
template <class T>
|
180
|
+
// Compare the objects and its content
|
181
|
+
bool operator() (const T& lhs, const T& rhs) const {
|
182
|
+
return ObjLessThanFn<T>(lhs, rhs);
|
183
|
+
}
|
184
|
+
};
|
185
|
+
|
186
|
+
// ###########################################################################
|
187
|
+
// Some STL helper functions
|
188
|
+
// ###########################################################################
|
189
|
+
|
190
|
+
// Check if all elements are equal
|
191
|
+
template <class X, class Y,
|
192
|
+
typename XT = typename X::value_type,
|
193
|
+
typename YT = typename Y::value_type>
|
194
|
+
bool ListEquality(const X& lhs, const Y& rhs,
|
195
|
+
bool(*cmp)(const XT*, const YT*))
|
196
|
+
{
|
197
|
+
return lhs.size() == rhs.size() &&
|
198
|
+
std::equal(lhs.begin(), lhs.end(),
|
199
|
+
rhs.begin(), cmp);
|
200
|
+
}
|
201
|
+
|
202
|
+
// Return if Vector is empty
|
203
|
+
template <class T>
|
204
|
+
bool listIsEmpty(T* cnt) {
|
205
|
+
return cnt && cnt->empty();
|
206
|
+
}
|
207
|
+
|
208
|
+
// Erase items from vector that match predicate
|
209
|
+
template<class T, class UnaryPredicate>
|
210
|
+
void listEraseItemIf(T& vec, UnaryPredicate* predicate)
|
211
|
+
{
|
212
|
+
vec.erase(std::remove_if(vec.begin(), vec.end(), predicate), vec.end());
|
213
|
+
}
|
214
|
+
|
215
|
+
// Check that every item in `lhs` is also in `rhs`
|
216
|
+
// Note: this works by comparing the raw pointers
|
217
|
+
template <typename T>
|
218
|
+
bool listIsSubsetOrEqual(const T& lhs, const T& rhs) {
|
219
|
+
for (const auto& item : lhs) {
|
220
|
+
if (std::find(rhs.begin(), rhs.end(), item) == rhs.end())
|
221
|
+
return false;
|
222
|
+
}
|
223
|
+
return true;
|
224
|
+
}
|
225
|
+
|
226
|
+
// ##########################################################################
|
227
|
+
// Returns whether [name] is the name of a pseudo-element
|
228
|
+
// that can be written with pseudo-class syntax (CSS2 vs CSS3):
|
229
|
+
// `:before`, `:after`, `:first-line`, or `:first-letter`
|
230
|
+
// ##########################################################################
|
231
|
+
inline bool isFakePseudoElement(const sass::string& name)
|
232
|
+
{
|
233
|
+
return Util::equalsLiteral("after", name)
|
234
|
+
|| Util::equalsLiteral("before", name)
|
235
|
+
|| Util::equalsLiteral("first-line", name)
|
236
|
+
|| Util::equalsLiteral("first-letter", name);
|
237
|
+
}
|
238
|
+
|
239
|
+
// ##########################################################################
|
240
|
+
// Names of pseudo selectors that take selectors as arguments,
|
241
|
+
// and that are subselectors of their arguments.
|
242
|
+
// For example, `.foo` is a superselector of `:matches(.foo)`.
|
243
|
+
// ##########################################################################
|
244
|
+
inline bool isSubselectorPseudo(const sass::string& norm)
|
245
|
+
{
|
246
|
+
return Util::equalsLiteral("any", norm)
|
247
|
+
|| Util::equalsLiteral("matches", norm)
|
248
|
+
|| Util::equalsLiteral("nth-child", norm)
|
249
|
+
|| Util::equalsLiteral("nth-last-child", norm);
|
250
|
+
}
|
251
|
+
// EO isSubselectorPseudo
|
252
|
+
|
253
|
+
// ###########################################################################
|
254
|
+
// Pseudo-class selectors that take unadorned selectors as arguments.
|
255
|
+
// ###########################################################################
|
256
|
+
inline bool isSelectorPseudoClass(const sass::string& test)
|
257
|
+
{
|
258
|
+
return Util::equalsLiteral("not", test)
|
259
|
+
|| Util::equalsLiteral("matches", test)
|
260
|
+
|| Util::equalsLiteral("current", test)
|
261
|
+
|| Util::equalsLiteral("any", test)
|
262
|
+
|| Util::equalsLiteral("has", test)
|
263
|
+
|| Util::equalsLiteral("host", test)
|
264
|
+
|| Util::equalsLiteral("host-context", test);
|
265
|
+
}
|
266
|
+
// EO isSelectorPseudoClass
|
267
|
+
|
268
|
+
// ###########################################################################
|
269
|
+
// Pseudo-element selectors that take unadorned selectors as arguments.
|
270
|
+
// ###########################################################################
|
271
|
+
inline bool isSelectorPseudoElement(const sass::string& test)
|
272
|
+
{
|
273
|
+
return Util::equalsLiteral("slotted", test);
|
274
|
+
}
|
275
|
+
// EO isSelectorPseudoElement
|
276
|
+
|
277
|
+
// ###########################################################################
|
278
|
+
// Pseudo-element selectors that has binominals
|
279
|
+
// ###########################################################################
|
280
|
+
inline bool isSelectorPseudoBinominal(const sass::string& test)
|
281
|
+
{
|
282
|
+
return Util::equalsLiteral("nth-child", test)
|
283
|
+
|| Util::equalsLiteral("nth-last-child", test);
|
284
|
+
}
|
285
|
+
// isSelectorPseudoBinominal
|
286
|
+
|
287
|
+
// ###########################################################################
|
288
|
+
// ###########################################################################
|
289
|
+
|
290
|
+
}
|
291
|
+
|
292
|
+
#endif
|