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.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +18 -0
  4. data/Rakefile +1 -3
  5. data/ext/extconf.rb +13 -5
  6. data/ext/libsass/VERSION +1 -1
  7. data/ext/libsass/include/sass/base.h +2 -1
  8. data/ext/libsass/include/sass/context.h +4 -0
  9. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  10. data/ext/libsass/src/ast.cpp +158 -168
  11. data/ext/libsass/src/ast.hpp +389 -230
  12. data/ext/libsass/src/ast_def_macros.hpp +18 -10
  13. data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
  14. data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
  15. data/ext/libsass/src/ast_helpers.hpp +292 -0
  16. data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
  17. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  18. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  19. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  20. data/ext/libsass/src/ast_selectors.cpp +594 -1026
  21. data/ext/libsass/src/ast_selectors.hpp +339 -385
  22. data/ext/libsass/src/ast_supports.cpp +36 -52
  23. data/ext/libsass/src/ast_supports.hpp +29 -29
  24. data/ext/libsass/src/ast_values.cpp +271 -84
  25. data/ext/libsass/src/ast_values.hpp +116 -107
  26. data/ext/libsass/src/backtrace.cpp +9 -9
  27. data/ext/libsass/src/backtrace.hpp +5 -5
  28. data/ext/libsass/src/base64vlq.cpp +2 -2
  29. data/ext/libsass/src/base64vlq.hpp +1 -1
  30. data/ext/libsass/src/bind.cpp +18 -18
  31. data/ext/libsass/src/bind.hpp +1 -1
  32. data/ext/libsass/src/c2ast.cpp +3 -3
  33. data/ext/libsass/src/c2ast.hpp +1 -1
  34. data/ext/libsass/src/cencode.c +4 -6
  35. data/ext/libsass/src/check_nesting.cpp +40 -41
  36. data/ext/libsass/src/check_nesting.hpp +6 -2
  37. data/ext/libsass/src/color_maps.cpp +14 -13
  38. data/ext/libsass/src/color_maps.hpp +1 -9
  39. data/ext/libsass/src/constants.cpp +5 -0
  40. data/ext/libsass/src/constants.hpp +6 -0
  41. data/ext/libsass/src/context.cpp +92 -119
  42. data/ext/libsass/src/context.hpp +41 -53
  43. data/ext/libsass/src/cssize.cpp +66 -149
  44. data/ext/libsass/src/cssize.hpp +17 -23
  45. data/ext/libsass/src/dart_helpers.hpp +199 -0
  46. data/ext/libsass/src/debugger.hpp +451 -295
  47. data/ext/libsass/src/emitter.cpp +15 -16
  48. data/ext/libsass/src/emitter.hpp +10 -12
  49. data/ext/libsass/src/environment.cpp +27 -27
  50. data/ext/libsass/src/environment.hpp +29 -24
  51. data/ext/libsass/src/error_handling.cpp +62 -41
  52. data/ext/libsass/src/error_handling.hpp +61 -51
  53. data/ext/libsass/src/eval.cpp +167 -281
  54. data/ext/libsass/src/eval.hpp +27 -29
  55. data/ext/libsass/src/eval_selectors.cpp +75 -0
  56. data/ext/libsass/src/expand.cpp +275 -222
  57. data/ext/libsass/src/expand.hpp +36 -16
  58. data/ext/libsass/src/extender.cpp +1188 -0
  59. data/ext/libsass/src/extender.hpp +399 -0
  60. data/ext/libsass/src/extension.cpp +43 -0
  61. data/ext/libsass/src/extension.hpp +89 -0
  62. data/ext/libsass/src/file.cpp +81 -72
  63. data/ext/libsass/src/file.hpp +28 -37
  64. data/ext/libsass/src/fn_colors.cpp +20 -18
  65. data/ext/libsass/src/fn_lists.cpp +30 -29
  66. data/ext/libsass/src/fn_maps.cpp +3 -3
  67. data/ext/libsass/src/fn_miscs.cpp +34 -46
  68. data/ext/libsass/src/fn_numbers.cpp +20 -13
  69. data/ext/libsass/src/fn_selectors.cpp +98 -128
  70. data/ext/libsass/src/fn_strings.cpp +47 -33
  71. data/ext/libsass/src/fn_utils.cpp +31 -29
  72. data/ext/libsass/src/fn_utils.hpp +17 -11
  73. data/ext/libsass/src/inspect.cpp +186 -148
  74. data/ext/libsass/src/inspect.hpp +31 -29
  75. data/ext/libsass/src/lexer.cpp +20 -82
  76. data/ext/libsass/src/lexer.hpp +5 -16
  77. data/ext/libsass/src/listize.cpp +23 -37
  78. data/ext/libsass/src/listize.hpp +8 -9
  79. data/ext/libsass/src/mapping.hpp +1 -0
  80. data/ext/libsass/src/memory/allocator.cpp +48 -0
  81. data/ext/libsass/src/memory/allocator.hpp +138 -0
  82. data/ext/libsass/src/memory/config.hpp +20 -0
  83. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  84. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  85. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
  86. data/ext/libsass/src/memory.hpp +12 -0
  87. data/ext/libsass/src/operation.hpp +71 -61
  88. data/ext/libsass/src/operators.cpp +19 -18
  89. data/ext/libsass/src/operators.hpp +11 -11
  90. data/ext/libsass/src/ordered_map.hpp +112 -0
  91. data/ext/libsass/src/output.cpp +45 -64
  92. data/ext/libsass/src/output.hpp +6 -6
  93. data/ext/libsass/src/parser.cpp +512 -700
  94. data/ext/libsass/src/parser.hpp +89 -97
  95. data/ext/libsass/src/parser_selectors.cpp +189 -0
  96. data/ext/libsass/src/permutate.hpp +164 -0
  97. data/ext/libsass/src/plugins.cpp +7 -7
  98. data/ext/libsass/src/plugins.hpp +8 -8
  99. data/ext/libsass/src/position.cpp +7 -26
  100. data/ext/libsass/src/position.hpp +44 -21
  101. data/ext/libsass/src/prelexer.cpp +6 -6
  102. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  103. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  104. data/ext/libsass/src/sass.cpp +16 -15
  105. data/ext/libsass/src/sass.hpp +10 -5
  106. data/ext/libsass/src/sass2scss.cpp +4 -4
  107. data/ext/libsass/src/sass_context.cpp +91 -122
  108. data/ext/libsass/src/sass_context.hpp +2 -2
  109. data/ext/libsass/src/sass_functions.cpp +1 -1
  110. data/ext/libsass/src/sass_values.cpp +8 -11
  111. data/ext/libsass/src/settings.hpp +19 -0
  112. data/ext/libsass/src/source.cpp +69 -0
  113. data/ext/libsass/src/source.hpp +95 -0
  114. data/ext/libsass/src/source_data.hpp +32 -0
  115. data/ext/libsass/src/source_map.cpp +22 -18
  116. data/ext/libsass/src/source_map.hpp +12 -9
  117. data/ext/libsass/src/stylesheet.cpp +22 -0
  118. data/ext/libsass/src/stylesheet.hpp +57 -0
  119. data/ext/libsass/src/to_value.cpp +2 -2
  120. data/ext/libsass/src/to_value.hpp +1 -1
  121. data/ext/libsass/src/units.cpp +24 -22
  122. data/ext/libsass/src/units.hpp +8 -8
  123. data/ext/libsass/src/utf8_string.cpp +9 -10
  124. data/ext/libsass/src/utf8_string.hpp +7 -6
  125. data/ext/libsass/src/util.cpp +48 -50
  126. data/ext/libsass/src/util.hpp +20 -21
  127. data/ext/libsass/src/util_string.cpp +111 -61
  128. data/ext/libsass/src/util_string.hpp +62 -8
  129. data/ext/libsass/src/values.cpp +12 -12
  130. data/lib/sassc/engine.rb +5 -3
  131. data/lib/sassc/functions_handler.rb +8 -8
  132. data/lib/sassc/native.rb +4 -6
  133. data/lib/sassc/script.rb +4 -4
  134. data/lib/sassc/version.rb +1 -1
  135. data/test/functions_test.rb +18 -1
  136. data/test/native_test.rb +4 -4
  137. metadata +29 -15
  138. data/ext/libsass/src/extend.cpp +0 -2132
  139. data/ext/libsass/src/extend.hpp +0 -86
  140. data/ext/libsass/src/node.cpp +0 -322
  141. data/ext/libsass/src/node.hpp +0 -118
  142. data/ext/libsass/src/paths.hpp +0 -71
  143. data/ext/libsass/src/sass_util.cpp +0 -152
  144. data/ext/libsass/src/sass_util.hpp +0 -256
  145. data/ext/libsass/src/subset_map.cpp +0 -58
  146. data/ext/libsass/src/subset_map.hpp +0 -76
  147. 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