precompiled-sassc 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 (214) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/cibuildgem.yaml +67 -0
  3. data/.gitignore +18 -0
  4. data/.gitmodules +3 -0
  5. data/.travis.yml +16 -0
  6. data/CHANGELOG.md +97 -0
  7. data/CODE_OF_CONDUCT.md +10 -0
  8. data/Gemfile +2 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +80 -0
  11. data/Rakefile +51 -0
  12. data/ext/depend +4 -0
  13. data/ext/extconf.rb +92 -0
  14. data/ext/libsass/VERSION +1 -0
  15. data/ext/libsass/contrib/plugin.cpp +60 -0
  16. data/ext/libsass/include/sass/base.h +97 -0
  17. data/ext/libsass/include/sass/context.h +174 -0
  18. data/ext/libsass/include/sass/functions.h +139 -0
  19. data/ext/libsass/include/sass/values.h +145 -0
  20. data/ext/libsass/include/sass/version.h +12 -0
  21. data/ext/libsass/include/sass.h +15 -0
  22. data/ext/libsass/include/sass2scss.h +120 -0
  23. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  24. data/ext/libsass/src/ast.cpp +953 -0
  25. data/ext/libsass/src/ast.hpp +1064 -0
  26. data/ext/libsass/src/ast2c.cpp +80 -0
  27. data/ext/libsass/src/ast2c.hpp +39 -0
  28. data/ext/libsass/src/ast_def_macros.hpp +140 -0
  29. data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
  30. data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
  31. data/ext/libsass/src/ast_helpers.hpp +292 -0
  32. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  33. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  34. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  35. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  36. data/ext/libsass/src/ast_selectors.cpp +1043 -0
  37. data/ext/libsass/src/ast_selectors.hpp +522 -0
  38. data/ext/libsass/src/ast_supports.cpp +114 -0
  39. data/ext/libsass/src/ast_supports.hpp +121 -0
  40. data/ext/libsass/src/ast_values.cpp +1154 -0
  41. data/ext/libsass/src/ast_values.hpp +498 -0
  42. data/ext/libsass/src/b64/cencode.h +32 -0
  43. data/ext/libsass/src/b64/encode.h +79 -0
  44. data/ext/libsass/src/backtrace.cpp +50 -0
  45. data/ext/libsass/src/backtrace.hpp +29 -0
  46. data/ext/libsass/src/base64vlq.cpp +47 -0
  47. data/ext/libsass/src/base64vlq.hpp +30 -0
  48. data/ext/libsass/src/bind.cpp +312 -0
  49. data/ext/libsass/src/bind.hpp +15 -0
  50. data/ext/libsass/src/c2ast.cpp +64 -0
  51. data/ext/libsass/src/c2ast.hpp +14 -0
  52. data/ext/libsass/src/c99func.c +54 -0
  53. data/ext/libsass/src/cencode.c +106 -0
  54. data/ext/libsass/src/check_nesting.cpp +393 -0
  55. data/ext/libsass/src/check_nesting.hpp +70 -0
  56. data/ext/libsass/src/color_maps.cpp +652 -0
  57. data/ext/libsass/src/color_maps.hpp +323 -0
  58. data/ext/libsass/src/constants.cpp +199 -0
  59. data/ext/libsass/src/constants.hpp +200 -0
  60. data/ext/libsass/src/context.cpp +863 -0
  61. data/ext/libsass/src/context.hpp +140 -0
  62. data/ext/libsass/src/cssize.cpp +521 -0
  63. data/ext/libsass/src/cssize.hpp +71 -0
  64. data/ext/libsass/src/dart_helpers.hpp +199 -0
  65. data/ext/libsass/src/debug.hpp +43 -0
  66. data/ext/libsass/src/debugger.hpp +963 -0
  67. data/ext/libsass/src/emitter.cpp +297 -0
  68. data/ext/libsass/src/emitter.hpp +101 -0
  69. data/ext/libsass/src/environment.cpp +260 -0
  70. data/ext/libsass/src/environment.hpp +124 -0
  71. data/ext/libsass/src/error_handling.cpp +233 -0
  72. data/ext/libsass/src/error_handling.hpp +239 -0
  73. data/ext/libsass/src/eval.cpp +1543 -0
  74. data/ext/libsass/src/eval.hpp +110 -0
  75. data/ext/libsass/src/eval_selectors.cpp +75 -0
  76. data/ext/libsass/src/expand.cpp +875 -0
  77. data/ext/libsass/src/expand.hpp +98 -0
  78. data/ext/libsass/src/extender.cpp +1188 -0
  79. data/ext/libsass/src/extender.hpp +399 -0
  80. data/ext/libsass/src/extension.cpp +43 -0
  81. data/ext/libsass/src/extension.hpp +89 -0
  82. data/ext/libsass/src/file.cpp +531 -0
  83. data/ext/libsass/src/file.hpp +124 -0
  84. data/ext/libsass/src/fn_colors.cpp +596 -0
  85. data/ext/libsass/src/fn_colors.hpp +85 -0
  86. data/ext/libsass/src/fn_lists.cpp +285 -0
  87. data/ext/libsass/src/fn_lists.hpp +34 -0
  88. data/ext/libsass/src/fn_maps.cpp +94 -0
  89. data/ext/libsass/src/fn_maps.hpp +30 -0
  90. data/ext/libsass/src/fn_miscs.cpp +244 -0
  91. data/ext/libsass/src/fn_miscs.hpp +40 -0
  92. data/ext/libsass/src/fn_numbers.cpp +227 -0
  93. data/ext/libsass/src/fn_numbers.hpp +45 -0
  94. data/ext/libsass/src/fn_selectors.cpp +205 -0
  95. data/ext/libsass/src/fn_selectors.hpp +35 -0
  96. data/ext/libsass/src/fn_strings.cpp +268 -0
  97. data/ext/libsass/src/fn_strings.hpp +34 -0
  98. data/ext/libsass/src/fn_utils.cpp +158 -0
  99. data/ext/libsass/src/fn_utils.hpp +62 -0
  100. data/ext/libsass/src/inspect.cpp +1125 -0
  101. data/ext/libsass/src/inspect.hpp +101 -0
  102. data/ext/libsass/src/json.cpp +1436 -0
  103. data/ext/libsass/src/json.hpp +117 -0
  104. data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
  105. data/ext/libsass/src/lexer.cpp +122 -0
  106. data/ext/libsass/src/lexer.hpp +304 -0
  107. data/ext/libsass/src/listize.cpp +70 -0
  108. data/ext/libsass/src/listize.hpp +37 -0
  109. data/ext/libsass/src/mapping.hpp +19 -0
  110. data/ext/libsass/src/memory/allocator.cpp +48 -0
  111. data/ext/libsass/src/memory/allocator.hpp +138 -0
  112. data/ext/libsass/src/memory/config.hpp +20 -0
  113. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  114. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  115. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  116. data/ext/libsass/src/memory.hpp +12 -0
  117. data/ext/libsass/src/operation.hpp +223 -0
  118. data/ext/libsass/src/operators.cpp +267 -0
  119. data/ext/libsass/src/operators.hpp +30 -0
  120. data/ext/libsass/src/ordered_map.hpp +112 -0
  121. data/ext/libsass/src/output.cpp +320 -0
  122. data/ext/libsass/src/output.hpp +47 -0
  123. data/ext/libsass/src/parser.cpp +2965 -0
  124. data/ext/libsass/src/parser.hpp +394 -0
  125. data/ext/libsass/src/parser_selectors.cpp +189 -0
  126. data/ext/libsass/src/permutate.hpp +164 -0
  127. data/ext/libsass/src/plugins.cpp +188 -0
  128. data/ext/libsass/src/plugins.hpp +57 -0
  129. data/ext/libsass/src/position.cpp +165 -0
  130. data/ext/libsass/src/position.hpp +147 -0
  131. data/ext/libsass/src/prelexer.cpp +1780 -0
  132. data/ext/libsass/src/prelexer.hpp +484 -0
  133. data/ext/libsass/src/remove_placeholders.cpp +86 -0
  134. data/ext/libsass/src/remove_placeholders.hpp +37 -0
  135. data/ext/libsass/src/sass.cpp +156 -0
  136. data/ext/libsass/src/sass.hpp +147 -0
  137. data/ext/libsass/src/sass2scss.cpp +895 -0
  138. data/ext/libsass/src/sass_context.cpp +741 -0
  139. data/ext/libsass/src/sass_context.hpp +129 -0
  140. data/ext/libsass/src/sass_functions.cpp +210 -0
  141. data/ext/libsass/src/sass_functions.hpp +50 -0
  142. data/ext/libsass/src/sass_values.cpp +362 -0
  143. data/ext/libsass/src/sass_values.hpp +82 -0
  144. data/ext/libsass/src/settings.hpp +19 -0
  145. data/ext/libsass/src/source.cpp +69 -0
  146. data/ext/libsass/src/source.hpp +95 -0
  147. data/ext/libsass/src/source_data.hpp +32 -0
  148. data/ext/libsass/src/source_map.cpp +202 -0
  149. data/ext/libsass/src/source_map.hpp +65 -0
  150. data/ext/libsass/src/stylesheet.cpp +22 -0
  151. data/ext/libsass/src/stylesheet.hpp +57 -0
  152. data/ext/libsass/src/to_value.cpp +114 -0
  153. data/ext/libsass/src/to_value.hpp +46 -0
  154. data/ext/libsass/src/units.cpp +507 -0
  155. data/ext/libsass/src/units.hpp +110 -0
  156. data/ext/libsass/src/utf8/checked.h +336 -0
  157. data/ext/libsass/src/utf8/core.h +332 -0
  158. data/ext/libsass/src/utf8/unchecked.h +235 -0
  159. data/ext/libsass/src/utf8.h +34 -0
  160. data/ext/libsass/src/utf8_string.cpp +104 -0
  161. data/ext/libsass/src/utf8_string.hpp +38 -0
  162. data/ext/libsass/src/util.cpp +723 -0
  163. data/ext/libsass/src/util.hpp +105 -0
  164. data/ext/libsass/src/util_string.cpp +125 -0
  165. data/ext/libsass/src/util_string.hpp +73 -0
  166. data/ext/libsass/src/values.cpp +140 -0
  167. data/ext/libsass/src/values.hpp +12 -0
  168. data/lib/sassc/dependency.rb +17 -0
  169. data/lib/sassc/engine.rb +141 -0
  170. data/lib/sassc/error.rb +37 -0
  171. data/lib/sassc/functions_handler.rb +73 -0
  172. data/lib/sassc/import_handler.rb +50 -0
  173. data/lib/sassc/importer.rb +31 -0
  174. data/lib/sassc/native/native_context_api.rb +147 -0
  175. data/lib/sassc/native/native_functions_api.rb +159 -0
  176. data/lib/sassc/native/sass2scss_api.rb +10 -0
  177. data/lib/sassc/native/sass_input_style.rb +13 -0
  178. data/lib/sassc/native/sass_output_style.rb +12 -0
  179. data/lib/sassc/native/sass_value.rb +97 -0
  180. data/lib/sassc/native/string_list.rb +10 -0
  181. data/lib/sassc/native.rb +65 -0
  182. data/lib/sassc/sass_2_scss.rb +9 -0
  183. data/lib/sassc/script/functions.rb +8 -0
  184. data/lib/sassc/script/value/bool.rb +32 -0
  185. data/lib/sassc/script/value/color.rb +95 -0
  186. data/lib/sassc/script/value/list.rb +136 -0
  187. data/lib/sassc/script/value/map.rb +69 -0
  188. data/lib/sassc/script/value/number.rb +389 -0
  189. data/lib/sassc/script/value/string.rb +96 -0
  190. data/lib/sassc/script/value.rb +137 -0
  191. data/lib/sassc/script/value_conversion/base.rb +13 -0
  192. data/lib/sassc/script/value_conversion/bool.rb +13 -0
  193. data/lib/sassc/script/value_conversion/color.rb +18 -0
  194. data/lib/sassc/script/value_conversion/list.rb +25 -0
  195. data/lib/sassc/script/value_conversion/map.rb +21 -0
  196. data/lib/sassc/script/value_conversion/number.rb +13 -0
  197. data/lib/sassc/script/value_conversion/string.rb +17 -0
  198. data/lib/sassc/script/value_conversion.rb +69 -0
  199. data/lib/sassc/script.rb +17 -0
  200. data/lib/sassc/util/normalized_map.rb +117 -0
  201. data/lib/sassc/util.rb +231 -0
  202. data/lib/sassc/version.rb +5 -0
  203. data/lib/sassc.rb +57 -0
  204. data/sassc.gemspec +69 -0
  205. data/test/custom_importer_test.rb +127 -0
  206. data/test/engine_test.rb +314 -0
  207. data/test/error_test.rb +29 -0
  208. data/test/fixtures/paths.scss +10 -0
  209. data/test/functions_test.rb +340 -0
  210. data/test/native_test.rb +213 -0
  211. data/test/output_style_test.rb +107 -0
  212. data/test/sass_2_scss_test.rb +14 -0
  213. data/test/test_helper.rb +45 -0
  214. metadata +391 -0
@@ -0,0 +1,40 @@
1
+ #ifndef SASS_FN_MISCS_H
2
+ #define SASS_FN_MISCS_H
3
+
4
+ #include "fn_utils.hpp"
5
+
6
+ namespace Sass {
7
+
8
+ namespace Functions {
9
+
10
+ extern Signature type_of_sig;
11
+ extern Signature variable_exists_sig;
12
+ extern Signature global_variable_exists_sig;
13
+ extern Signature function_exists_sig;
14
+ extern Signature mixin_exists_sig;
15
+ extern Signature feature_exists_sig;
16
+ extern Signature call_sig;
17
+ extern Signature not_sig;
18
+ extern Signature if_sig;
19
+ extern Signature set_nth_sig;
20
+ extern Signature content_exists_sig;
21
+ extern Signature get_function_sig;
22
+
23
+ BUILT_IN(type_of);
24
+ BUILT_IN(variable_exists);
25
+ BUILT_IN(global_variable_exists);
26
+ BUILT_IN(function_exists);
27
+ BUILT_IN(mixin_exists);
28
+ BUILT_IN(feature_exists);
29
+ BUILT_IN(call);
30
+ BUILT_IN(sass_not);
31
+ BUILT_IN(sass_if);
32
+ BUILT_IN(set_nth);
33
+ BUILT_IN(content_exists);
34
+ BUILT_IN(get_function);
35
+
36
+ }
37
+
38
+ }
39
+
40
+ #endif
@@ -0,0 +1,227 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
3
+ #include "sass.hpp"
4
+
5
+ #include <cstdint>
6
+ #include <cstdlib>
7
+ #include <cmath>
8
+ #include <random>
9
+ #include <sstream>
10
+ #include <iomanip>
11
+ #include <algorithm>
12
+
13
+ #include "ast.hpp"
14
+ #include "units.hpp"
15
+ #include "fn_utils.hpp"
16
+ #include "fn_numbers.hpp"
17
+
18
+ #ifdef __MINGW32__
19
+ #include "windows.h"
20
+ #include "wincrypt.h"
21
+ #endif
22
+
23
+ namespace Sass {
24
+
25
+ namespace Functions {
26
+
27
+ #ifdef __MINGW32__
28
+ uint64_t GetSeed()
29
+ {
30
+ HCRYPTPROV hp = 0;
31
+ BYTE rb[8];
32
+ CryptAcquireContext(&hp, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
33
+ CryptGenRandom(hp, sizeof(rb), rb);
34
+ CryptReleaseContext(hp, 0);
35
+
36
+ uint64_t seed;
37
+ memcpy(&seed, &rb[0], sizeof(seed));
38
+
39
+ return seed;
40
+ }
41
+ #else
42
+ uint64_t GetSeed()
43
+ {
44
+ std::random_device rd;
45
+ return rd();
46
+ }
47
+ #endif
48
+
49
+ // note: the performance of many implementations of
50
+ // random_device degrades sharply once the entropy pool
51
+ // is exhausted. For practical use, random_device is
52
+ // generally only used to seed a PRNG such as mt19937.
53
+ static std::mt19937 rand(static_cast<unsigned int>(GetSeed()));
54
+
55
+ ///////////////////
56
+ // NUMBER FUNCTIONS
57
+ ///////////////////
58
+
59
+ Signature percentage_sig = "percentage($number)";
60
+ BUILT_IN(percentage)
61
+ {
62
+ Number_Obj n = ARGN("$number");
63
+ if (!n->is_unitless()) error("argument $number of `" + sass::string(sig) + "` must be unitless", pstate, traces);
64
+ return SASS_MEMORY_NEW(Number, pstate, n->value() * 100, "%");
65
+ }
66
+
67
+ Signature round_sig = "round($number)";
68
+ BUILT_IN(round)
69
+ {
70
+ Number_Obj r = ARGN("$number");
71
+ r->value(Sass::round(r->value(), ctx.c_options.precision));
72
+ r->pstate(pstate);
73
+ return r.detach();
74
+ }
75
+
76
+ Signature ceil_sig = "ceil($number)";
77
+ BUILT_IN(ceil)
78
+ {
79
+ Number_Obj r = ARGN("$number");
80
+ r->value(std::ceil(r->value()));
81
+ r->pstate(pstate);
82
+ return r.detach();
83
+ }
84
+
85
+ Signature floor_sig = "floor($number)";
86
+ BUILT_IN(floor)
87
+ {
88
+ Number_Obj r = ARGN("$number");
89
+ r->value(std::floor(r->value()));
90
+ r->pstate(pstate);
91
+ return r.detach();
92
+ }
93
+
94
+ Signature abs_sig = "abs($number)";
95
+ BUILT_IN(abs)
96
+ {
97
+ Number_Obj r = ARGN("$number");
98
+ r->value(std::abs(r->value()));
99
+ r->pstate(pstate);
100
+ return r.detach();
101
+ }
102
+
103
+ Signature min_sig = "min($numbers...)";
104
+ BUILT_IN(min)
105
+ {
106
+ List* arglist = ARG("$numbers", List);
107
+ Number_Obj least;
108
+ size_t L = arglist->length();
109
+ if (L == 0) {
110
+ error("At least one argument must be passed.", pstate, traces);
111
+ }
112
+ for (size_t i = 0; i < L; ++i) {
113
+ ExpressionObj val = arglist->value_at_index(i);
114
+ Number_Obj xi = Cast<Number>(val);
115
+ if (!xi) {
116
+ error("\"" + val->to_string(ctx.c_options) + "\" is not a number for `min'", pstate, traces);
117
+ }
118
+ if (least) {
119
+ if (*xi < *least) least = xi;
120
+ } else least = xi;
121
+ }
122
+ return least.detach();
123
+ }
124
+
125
+ Signature max_sig = "max($numbers...)";
126
+ BUILT_IN(max)
127
+ {
128
+ List* arglist = ARG("$numbers", List);
129
+ Number_Obj greatest;
130
+ size_t L = arglist->length();
131
+ if (L == 0) {
132
+ error("At least one argument must be passed.", pstate, traces);
133
+ }
134
+ for (size_t i = 0; i < L; ++i) {
135
+ ExpressionObj val = arglist->value_at_index(i);
136
+ Number_Obj xi = Cast<Number>(val);
137
+ if (!xi) {
138
+ error("\"" + val->to_string(ctx.c_options) + "\" is not a number for `max'", pstate, traces);
139
+ }
140
+ if (greatest) {
141
+ if (*greatest < *xi) greatest = xi;
142
+ } else greatest = xi;
143
+ }
144
+ return greatest.detach();
145
+ }
146
+
147
+ Signature random_sig = "random($limit:false)";
148
+ BUILT_IN(random)
149
+ {
150
+ AST_Node_Obj arg = env["$limit"];
151
+ Value* v = Cast<Value>(arg);
152
+ Number* l = Cast<Number>(arg);
153
+ Boolean* b = Cast<Boolean>(arg);
154
+ if (l) {
155
+ double lv = l->value();
156
+ if (lv < 1) {
157
+ sass::ostream err;
158
+ err << "$limit " << lv << " must be greater than or equal to 1 for `random'";
159
+ error(err.str(), pstate, traces);
160
+ }
161
+ bool eq_int = std::fabs(trunc(lv) - lv) < NUMBER_EPSILON;
162
+ if (!eq_int) {
163
+ sass::ostream err;
164
+ err << "Expected $limit to be an integer but got " << lv << " for `random'";
165
+ error(err.str(), pstate, traces);
166
+ }
167
+ std::uniform_real_distribution<> distributor(1, lv + 1);
168
+ uint_fast32_t distributed = static_cast<uint_fast32_t>(distributor(rand));
169
+ return SASS_MEMORY_NEW(Number, pstate, (double)distributed);
170
+ }
171
+ else if (b) {
172
+ std::uniform_real_distribution<> distributor(0, 1);
173
+ double distributed = static_cast<double>(distributor(rand));
174
+ return SASS_MEMORY_NEW(Number, pstate, distributed);
175
+ } else if (v) {
176
+ traces.push_back(Backtrace(pstate));
177
+ throw Exception::InvalidArgumentType(pstate, traces, "random", "$limit", "number", v);
178
+ } else {
179
+ traces.push_back(Backtrace(pstate));
180
+ throw Exception::InvalidArgumentType(pstate, traces, "random", "$limit", "number");
181
+ }
182
+ }
183
+
184
+ Signature unique_id_sig = "unique-id()";
185
+ BUILT_IN(unique_id)
186
+ {
187
+ sass::ostream ss;
188
+ std::uniform_real_distribution<> distributor(0, 4294967296); // 16^8
189
+ uint_fast32_t distributed = static_cast<uint_fast32_t>(distributor(rand));
190
+ ss << "u" << std::setfill('0') << std::setw(8) << std::hex << distributed;
191
+ return SASS_MEMORY_NEW(String_Quoted, pstate, ss.str());
192
+ }
193
+
194
+ Signature unit_sig = "unit($number)";
195
+ BUILT_IN(unit)
196
+ {
197
+ Number_Obj arg = ARGN("$number");
198
+ sass::string str(quote(arg->unit(), '"'));
199
+ return SASS_MEMORY_NEW(String_Quoted, pstate, str);
200
+ }
201
+
202
+ Signature unitless_sig = "unitless($number)";
203
+ BUILT_IN(unitless)
204
+ {
205
+ Number_Obj arg = ARGN("$number");
206
+ bool unitless = arg->is_unitless();
207
+ return SASS_MEMORY_NEW(Boolean, pstate, unitless);
208
+ }
209
+
210
+ Signature comparable_sig = "comparable($number1, $number2)";
211
+ BUILT_IN(comparable)
212
+ {
213
+ Number_Obj n1 = ARGN("$number1");
214
+ Number_Obj n2 = ARGN("$number2");
215
+ if (n1->is_unitless() || n2->is_unitless()) {
216
+ return SASS_MEMORY_NEW(Boolean, pstate, true);
217
+ }
218
+ // normalize into main units
219
+ n1->normalize(); n2->normalize();
220
+ Units &lhs_unit = *n1, &rhs_unit = *n2;
221
+ bool is_comparable = (lhs_unit == rhs_unit);
222
+ return SASS_MEMORY_NEW(Boolean, pstate, is_comparable);
223
+ }
224
+
225
+ }
226
+
227
+ }
@@ -0,0 +1,45 @@
1
+ #ifndef SASS_FN_NUMBERS_H
2
+ #define SASS_FN_NUMBERS_H
3
+
4
+ #include "fn_utils.hpp"
5
+
6
+ namespace Sass {
7
+
8
+ namespace Functions {
9
+
10
+ // return a number object (copied since we want to have reduced units)
11
+ #define ARGN(argname) get_arg_n(argname, env, sig, pstate, traces) // Number copy
12
+
13
+ extern Signature percentage_sig;
14
+ extern Signature round_sig;
15
+ extern Signature ceil_sig;
16
+ extern Signature floor_sig;
17
+ extern Signature abs_sig;
18
+ extern Signature min_sig;
19
+ extern Signature max_sig;
20
+ extern Signature inspect_sig;
21
+ extern Signature random_sig;
22
+ extern Signature unique_id_sig;
23
+ extern Signature unit_sig;
24
+ extern Signature unitless_sig;
25
+ extern Signature comparable_sig;
26
+
27
+ BUILT_IN(percentage);
28
+ BUILT_IN(round);
29
+ BUILT_IN(ceil);
30
+ BUILT_IN(floor);
31
+ BUILT_IN(abs);
32
+ BUILT_IN(min);
33
+ BUILT_IN(max);
34
+ BUILT_IN(inspect);
35
+ BUILT_IN(random);
36
+ BUILT_IN(unique_id);
37
+ BUILT_IN(unit);
38
+ BUILT_IN(unitless);
39
+ BUILT_IN(comparable);
40
+
41
+ }
42
+
43
+ }
44
+
45
+ #endif
@@ -0,0 +1,205 @@
1
+ #include <numeric>
2
+
3
+ #include "parser.hpp"
4
+ #include "extender.hpp"
5
+ #include "listize.hpp"
6
+ #include "fn_utils.hpp"
7
+ #include "fn_selectors.hpp"
8
+
9
+ namespace Sass {
10
+
11
+ namespace Functions {
12
+
13
+ Signature selector_nest_sig = "selector-nest($selectors...)";
14
+ BUILT_IN(selector_nest)
15
+ {
16
+ List* arglist = ARG("$selectors", List);
17
+
18
+ // Not enough parameters
19
+ if (arglist->length() == 0) {
20
+ error(
21
+ "$selectors: At least one selector must be passed for `selector-nest'",
22
+ pstate, traces);
23
+ }
24
+
25
+ // Parse args into vector of selectors
26
+ SelectorStack parsedSelectors;
27
+ for (size_t i = 0, L = arglist->length(); i < L; ++i) {
28
+ ExpressionObj exp = Cast<Expression>(arglist->value_at_index(i));
29
+ if (exp->concrete_type() == Expression::NULL_VAL) {
30
+ error(
31
+ "$selectors: null is not a valid selector: it must be a string,\n"
32
+ "a list of strings, or a list of lists of strings for 'selector-nest'",
33
+ pstate, traces);
34
+ }
35
+ if (String_Constant_Obj str = Cast<String_Constant>(exp)) {
36
+ str->quote_mark(0);
37
+ }
38
+ sass::string exp_src = exp->to_string(ctx.c_options);
39
+ ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
40
+ SelectorListObj sel = Parser::parse_selector(source, ctx, traces);
41
+ parsedSelectors.push_back(sel);
42
+ }
43
+
44
+ // Nothing to do
45
+ if( parsedSelectors.empty() ) {
46
+ return SASS_MEMORY_NEW(Null, pstate);
47
+ }
48
+
49
+ // Set the first element as the `result`, keep
50
+ // appending to as we go down the parsedSelector vector.
51
+ SelectorStack::iterator itr = parsedSelectors.begin();
52
+ SelectorListObj& result = *itr;
53
+ ++itr;
54
+
55
+ for(;itr != parsedSelectors.end(); ++itr) {
56
+ SelectorListObj& child = *itr;
57
+ original_stack.push_back(result);
58
+ SelectorListObj rv = child->resolve_parent_refs(original_stack, traces);
59
+ result->elements(rv->elements());
60
+ original_stack.pop_back();
61
+ }
62
+
63
+ return Cast<Value>(Listize::perform(result));
64
+ }
65
+
66
+ Signature selector_append_sig = "selector-append($selectors...)";
67
+ BUILT_IN(selector_append)
68
+ {
69
+ List* arglist = ARG("$selectors", List);
70
+
71
+ // Not enough parameters
72
+ if (arglist->empty()) {
73
+ error(
74
+ "$selectors: At least one selector must be "
75
+ "passed for `selector-append'",
76
+ pstate, traces);
77
+ }
78
+
79
+ // Parse args into vector of selectors
80
+ SelectorStack parsedSelectors;
81
+ parsedSelectors.push_back({});
82
+ for (size_t i = 0, L = arglist->length(); i < L; ++i) {
83
+ Expression* exp = Cast<Expression>(arglist->value_at_index(i));
84
+ if (exp->concrete_type() == Expression::NULL_VAL) {
85
+ error(
86
+ "$selectors: null is not a valid selector: it must be a string,\n"
87
+ "a list of strings, or a list of lists of strings for 'selector-append'",
88
+ pstate, traces);
89
+ }
90
+ if (String_Constant* str = Cast<String_Constant>(exp)) {
91
+ str->quote_mark(0);
92
+ }
93
+ sass::string exp_src = exp->to_string();
94
+ ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
95
+ SelectorListObj sel = Parser::parse_selector(source, ctx, traces, true);
96
+
97
+ for (auto& complex : sel->elements()) {
98
+ if (complex->empty()) {
99
+ complex->append(SASS_MEMORY_NEW(CompoundSelector, "[phony]"));
100
+ }
101
+ if (CompoundSelector* comp = Cast<CompoundSelector>(complex->first())) {
102
+ comp->hasRealParent(true);
103
+ complex->chroots(true);
104
+ }
105
+ }
106
+
107
+ if (parsedSelectors.size() > 1) {
108
+
109
+ if (!sel->has_real_parent_ref()) {
110
+ auto parent = parsedSelectors.back();
111
+ for (auto& complex : parent->elements()) {
112
+ if (CompoundSelector* comp = Cast<CompoundSelector>(complex->first())) {
113
+ comp->hasRealParent(false);
114
+ }
115
+ }
116
+ error("Can't append \"" + sel->to_string() + "\" to \"" +
117
+ parent->to_string() + "\" for `selector-append'",
118
+ pstate, traces);
119
+ }
120
+
121
+ // Build the resolved stack from the left. It's cheaper to directly
122
+ // calculate and update each resolved selcted from the left, than to
123
+ // recursively calculate them from the right side, as we would need
124
+ // to go through the whole stack depth to build the final results.
125
+ // E.g. 'a', 'b', 'x, y' => 'a' => 'a b' => 'a b x, a b y'
126
+ // vs 'a', 'b', 'x, y' => 'x' => 'b x' => 'a b x', 'y' ...
127
+ parsedSelectors.push_back(sel->resolve_parent_refs(parsedSelectors, traces, true));
128
+ }
129
+ else {
130
+ parsedSelectors.push_back(sel);
131
+ }
132
+ }
133
+
134
+ // Nothing to do
135
+ if( parsedSelectors.empty() ) {
136
+ return SASS_MEMORY_NEW(Null, pstate);
137
+ }
138
+
139
+ return Cast<Value>(Listize::perform(parsedSelectors.back()));
140
+ }
141
+
142
+ Signature selector_unify_sig = "selector-unify($selector1, $selector2)";
143
+ BUILT_IN(selector_unify)
144
+ {
145
+ SelectorListObj selector1 = ARGSELS("$selector1");
146
+ SelectorListObj selector2 = ARGSELS("$selector2");
147
+ SelectorListObj result = selector1->unifyWith(selector2);
148
+ return Cast<Value>(Listize::perform(result));
149
+ }
150
+
151
+ Signature simple_selectors_sig = "simple-selectors($selector)";
152
+ BUILT_IN(simple_selectors)
153
+ {
154
+ CompoundSelectorObj sel = ARGSEL("$selector");
155
+
156
+ List* l = SASS_MEMORY_NEW(List, sel->pstate(), sel->length(), SASS_COMMA);
157
+
158
+ for (size_t i = 0, L = sel->length(); i < L; ++i) {
159
+ const SimpleSelectorObj& ss = sel->get(i);
160
+ sass::string ss_string = ss->to_string() ;
161
+ l->append(SASS_MEMORY_NEW(String_Quoted, ss->pstate(), ss_string));
162
+ }
163
+
164
+ return l;
165
+ }
166
+
167
+ Signature selector_extend_sig = "selector-extend($selector, $extendee, $extender)";
168
+ BUILT_IN(selector_extend)
169
+ {
170
+ SelectorListObj selector = ARGSELS("$selector");
171
+ SelectorListObj target = ARGSELS("$extendee");
172
+ SelectorListObj source = ARGSELS("$extender");
173
+ SelectorListObj result = Extender::extend(selector, source, target, traces);
174
+ return Cast<Value>(Listize::perform(result));
175
+ }
176
+
177
+ Signature selector_replace_sig = "selector-replace($selector, $original, $replacement)";
178
+ BUILT_IN(selector_replace)
179
+ {
180
+ SelectorListObj selector = ARGSELS("$selector");
181
+ SelectorListObj target = ARGSELS("$original");
182
+ SelectorListObj source = ARGSELS("$replacement");
183
+ SelectorListObj result = Extender::replace(selector, source, target, traces);
184
+ return Cast<Value>(Listize::perform(result));
185
+ }
186
+
187
+ Signature selector_parse_sig = "selector-parse($selector)";
188
+ BUILT_IN(selector_parse)
189
+ {
190
+ SelectorListObj selector = ARGSELS("$selector");
191
+ return Cast<Value>(Listize::perform(selector));
192
+ }
193
+
194
+ Signature is_superselector_sig = "is-superselector($super, $sub)";
195
+ BUILT_IN(is_superselector)
196
+ {
197
+ SelectorListObj sel_sup = ARGSELS("$super");
198
+ SelectorListObj sel_sub = ARGSELS("$sub");
199
+ bool result = sel_sup->isSuperselectorOf(sel_sub);
200
+ return SASS_MEMORY_NEW(Boolean, pstate, result);
201
+ }
202
+
203
+ }
204
+
205
+ }
@@ -0,0 +1,35 @@
1
+ #ifndef SASS_FN_SELECTORS_H
2
+ #define SASS_FN_SELECTORS_H
3
+
4
+ #include "fn_utils.hpp"
5
+
6
+ namespace Sass {
7
+
8
+ namespace Functions {
9
+
10
+ #define ARGSEL(argname) get_arg_sel(argname, env, sig, pstate, traces, ctx)
11
+ #define ARGSELS(argname) get_arg_sels(argname, env, sig, pstate, traces, ctx)
12
+
13
+ BUILT_IN(selector_nest);
14
+ BUILT_IN(selector_append);
15
+ BUILT_IN(selector_extend);
16
+ BUILT_IN(selector_replace);
17
+ BUILT_IN(selector_unify);
18
+ BUILT_IN(is_superselector);
19
+ BUILT_IN(simple_selectors);
20
+ BUILT_IN(selector_parse);
21
+
22
+ extern Signature selector_nest_sig;
23
+ extern Signature selector_append_sig;
24
+ extern Signature selector_extend_sig;
25
+ extern Signature selector_replace_sig;
26
+ extern Signature selector_unify_sig;
27
+ extern Signature is_superselector_sig;
28
+ extern Signature simple_selectors_sig;
29
+ extern Signature selector_parse_sig;
30
+
31
+ }
32
+
33
+ }
34
+
35
+ #endif