sassc 1.10.1 → 1.11.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/README.md +5 -2
- data/ext/libsass/.github/CONTRIBUTING.md +65 -0
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +29 -0
- data/ext/libsass/Makefile +8 -3
- data/ext/libsass/Makefile.conf +28 -22
- data/ext/libsass/Readme.md +14 -7
- data/ext/libsass/configure.ac +5 -8
- data/ext/libsass/docs/api-context-internal.md +3 -0
- data/ext/libsass/docs/api-context.md +7 -0
- data/ext/libsass/docs/api-doc.md +4 -0
- data/ext/libsass/docs/api-importer.md +2 -0
- data/ext/libsass/docs/api-value-example.md +55 -0
- data/ext/libsass/docs/api-value.md +49 -22
- data/ext/libsass/docs/implementations.md +4 -0
- data/ext/libsass/include/sass/base.h +5 -4
- data/ext/libsass/include/sass/context.h +3 -0
- data/ext/libsass/include/sass/values.h +28 -27
- data/ext/libsass/include/sass/version.h +1 -1
- data/ext/libsass/include/sass2scss.h +1 -1
- data/ext/libsass/script/ci-build-libsass +3 -3
- data/ext/libsass/script/ci-install-deps +12 -3
- data/ext/libsass/src/ast.cpp +321 -212
- data/ext/libsass/src/ast.hpp +273 -165
- data/ext/libsass/src/ast_factory.hpp +4 -5
- data/ext/libsass/src/ast_fwd_decl.hpp +8 -7
- data/ext/libsass/src/bind.cpp +2 -7
- data/ext/libsass/src/bind.hpp +0 -1
- data/ext/libsass/src/check_nesting.cpp +379 -0
- data/ext/libsass/src/check_nesting.hpp +60 -0
- data/ext/libsass/src/constants.cpp +7 -6
- data/ext/libsass/src/constants.hpp +2 -1
- data/ext/libsass/src/context.cpp +7 -1
- data/ext/libsass/src/context.hpp +1 -1
- data/ext/libsass/src/cssize.cpp +76 -32
- data/ext/libsass/src/cssize.hpp +7 -8
- data/ext/libsass/src/debugger.hpp +70 -40
- data/ext/libsass/src/error_handling.cpp +15 -2
- data/ext/libsass/src/error_handling.hpp +19 -0
- data/ext/libsass/src/eval.cpp +107 -161
- data/ext/libsass/src/eval.hpp +12 -8
- data/ext/libsass/src/expand.cpp +81 -74
- data/ext/libsass/src/expand.hpp +13 -12
- data/ext/libsass/src/extend.cpp +149 -142
- data/ext/libsass/src/extend.hpp +10 -3
- data/ext/libsass/src/file.cpp +2 -1
- data/ext/libsass/src/functions.cpp +96 -59
- data/ext/libsass/src/functions.hpp +2 -2
- data/ext/libsass/src/inspect.cpp +33 -45
- data/ext/libsass/src/inspect.hpp +7 -7
- data/ext/libsass/src/json.cpp +17 -5
- data/ext/libsass/src/lexer.cpp +3 -3
- data/ext/libsass/src/listize.cpp +10 -10
- data/ext/libsass/src/listize.hpp +3 -3
- data/ext/libsass/src/node.cpp +30 -30
- data/ext/libsass/src/node.hpp +13 -13
- data/ext/libsass/src/operation.hpp +21 -19
- data/ext/libsass/src/output.cpp +48 -103
- data/ext/libsass/src/output.hpp +0 -1
- data/ext/libsass/src/parser.cpp +161 -133
- data/ext/libsass/src/parser.hpp +10 -7
- data/ext/libsass/src/remove_placeholders.cpp +6 -6
- data/ext/libsass/src/remove_placeholders.hpp +1 -1
- data/ext/libsass/src/sass.cpp +21 -0
- data/ext/libsass/src/sass.hpp +8 -1
- data/ext/libsass/src/sass2scss.cpp +14 -3
- data/ext/libsass/src/sass_context.cpp +69 -24
- data/ext/libsass/src/sass_context.hpp +3 -0
- data/ext/libsass/src/source_map.cpp +22 -10
- data/ext/libsass/src/to_value.cpp +2 -2
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.hpp +3 -1
- data/ext/libsass/src/util.cpp +20 -16
- data/ext/libsass/src/util.hpp +2 -1
- data/ext/libsass/win/libsass.targets +2 -0
- data/ext/libsass/win/libsass.vcxproj.filters +6 -0
- data/lib/sassc/engine.rb +5 -0
- data/lib/sassc/native/native_functions_api.rb +13 -1
- data/lib/sassc/script/value_conversion.rb +11 -1
- data/lib/sassc/script/value_conversion/list.rb +23 -0
- data/lib/sassc/version.rb +1 -1
- data/test/engine_test.rb +18 -2
- data/test/functions_test.rb +30 -0
- data/test/native_test.rb +1 -1
- metadata +8 -3
data/ext/libsass/src/extend.hpp
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
#define SASS_EXTEND_H
|
3
3
|
|
4
4
|
#include <string>
|
5
|
+
#include <set>
|
5
6
|
|
6
7
|
#include "ast.hpp"
|
7
8
|
#include "operation.hpp"
|
@@ -12,7 +13,7 @@ namespace Sass {
|
|
12
13
|
class Context;
|
13
14
|
class Node;
|
14
15
|
|
15
|
-
typedef Subset_Map<std::string, std::pair<
|
16
|
+
typedef Subset_Map<std::string, std::pair<Sequence_Selector*, SimpleSequence_Selector*> > ExtensionSubsetMap;
|
16
17
|
|
17
18
|
class Extend : public Operation_CRTP<void, Extend> {
|
18
19
|
|
@@ -23,11 +24,17 @@ namespace Sass {
|
|
23
24
|
|
24
25
|
public:
|
25
26
|
static Node subweave(Node& one, Node& two, Context& ctx);
|
26
|
-
static
|
27
|
-
static
|
27
|
+
static CommaSequence_Selector* extendSelectorList(CommaSequence_Selector* pSelectorList, Context& ctx, ExtensionSubsetMap& subset_map, bool isReplace, bool& extendedSomething, std::set<SimpleSequence_Selector>& seen);
|
28
|
+
static CommaSequence_Selector* extendSelectorList(CommaSequence_Selector* pSelectorList, Context& ctx, ExtensionSubsetMap& subset_map, bool isReplace, bool& extendedSomething);
|
29
|
+
static CommaSequence_Selector* extendSelectorList(CommaSequence_Selector* pSelectorList, Context& ctx, ExtensionSubsetMap& subset_map, bool isReplace = false) {
|
28
30
|
bool extendedSomething = false;
|
29
31
|
return extendSelectorList(pSelectorList, ctx, subset_map, isReplace, extendedSomething);
|
30
32
|
}
|
33
|
+
static CommaSequence_Selector* extendSelectorList(CommaSequence_Selector* pSelectorList, Context& ctx, ExtensionSubsetMap& subset_map, std::set<SimpleSequence_Selector>& seen) {
|
34
|
+
bool isReplace = false;
|
35
|
+
bool extendedSomething = false;
|
36
|
+
return extendSelectorList(pSelectorList, ctx, subset_map, isReplace, extendedSomething, seen);
|
37
|
+
}
|
31
38
|
Extend(Context&, ExtensionSubsetMap&);
|
32
39
|
~Extend() { }
|
33
40
|
|
data/ext/libsass/src/file.cpp
CHANGED
@@ -196,6 +196,7 @@ namespace Sass {
|
|
196
196
|
bool is_slash = pos + 2 == L && (l[pos+1] == '/' || l[pos+1] == '\\');
|
197
197
|
bool is_self = pos + 3 == L && (l[pos+1] == '.');
|
198
198
|
if (!is_self && !is_slash) r = r.substr(3);
|
199
|
+
else if (pos == std::string::npos) break;
|
199
200
|
l = l.substr(0, pos == std::string::npos ? pos : pos + 1);
|
200
201
|
}
|
201
202
|
|
@@ -217,7 +218,7 @@ namespace Sass {
|
|
217
218
|
// create an absolute path by resolving relative paths with cwd
|
218
219
|
std::string rel2abs(const std::string& path, const std::string& base, const std::string& cwd)
|
219
220
|
{
|
220
|
-
return make_canonical_path(join_paths(join_paths(cwd, base), path));
|
221
|
+
return make_canonical_path(join_paths(join_paths(cwd + "/", base + "/"), path));
|
221
222
|
}
|
222
223
|
|
223
224
|
// create a path that is relative to the given base directory
|
@@ -155,7 +155,7 @@ namespace Sass {
|
|
155
155
|
T* get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtrace* backtrace, Context& ctx);
|
156
156
|
|
157
157
|
template <>
|
158
|
-
|
158
|
+
CommaSequence_Selector* get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtrace* backtrace, Context& ctx) {
|
159
159
|
Expression* exp = ARG(argname, Expression);
|
160
160
|
if (exp->concrete_type() == Expression::NULL_VAL) {
|
161
161
|
std::stringstream msg;
|
@@ -171,7 +171,7 @@ namespace Sass {
|
|
171
171
|
}
|
172
172
|
|
173
173
|
template <>
|
174
|
-
|
174
|
+
Sequence_Selector* get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtrace* backtrace, Context& ctx) {
|
175
175
|
Expression* exp = ARG(argname, Expression);
|
176
176
|
if (exp->concrete_type() == Expression::NULL_VAL) {
|
177
177
|
std::stringstream msg;
|
@@ -183,12 +183,12 @@ namespace Sass {
|
|
183
183
|
str->quote_mark(0);
|
184
184
|
}
|
185
185
|
std::string exp_src = exp->to_string(ctx.c_options) + "{";
|
186
|
-
|
186
|
+
CommaSequence_Selector* sel_list = Parser::parse_selector(exp_src.c_str(), ctx);
|
187
187
|
return (sel_list->length() > 0) ? sel_list->first() : 0;
|
188
188
|
}
|
189
189
|
|
190
190
|
template <>
|
191
|
-
|
191
|
+
SimpleSequence_Selector* get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtrace* backtrace, Context& ctx) {
|
192
192
|
Expression* exp = ARG(argname, Expression);
|
193
193
|
if (exp->concrete_type() == Expression::NULL_VAL) {
|
194
194
|
std::stringstream msg;
|
@@ -199,7 +199,7 @@ namespace Sass {
|
|
199
199
|
str->quote_mark(0);
|
200
200
|
}
|
201
201
|
std::string exp_src = exp->to_string(ctx.c_options) + "{";
|
202
|
-
|
202
|
+
CommaSequence_Selector* sel_list = Parser::parse_selector(exp_src.c_str(), ctx);
|
203
203
|
return (sel_list->length() > 0) ? sel_list->first()->tail()->head() : 0;
|
204
204
|
}
|
205
205
|
|
@@ -385,6 +385,12 @@ namespace Sass {
|
|
385
385
|
while (h < 0) h += 1;
|
386
386
|
while (h > 1) h -= 1;
|
387
387
|
|
388
|
+
// if saturation is exacly zero, we loose
|
389
|
+
// information for hue, since it will evaluate
|
390
|
+
// to zero if converted back from rgb. Setting
|
391
|
+
// saturation to a very tiny number solves this.
|
392
|
+
if (s == 0) s = 1e-10;
|
393
|
+
|
388
394
|
// Algorithm from the CSS3 spec: http://www.w3.org/TR/css3-color/#hsl-color.
|
389
395
|
double m2;
|
390
396
|
if (l <= 0.5) m2 = l*(s+1.0);
|
@@ -819,7 +825,7 @@ namespace Sass {
|
|
819
825
|
}
|
820
826
|
if (hsl) {
|
821
827
|
HSL hsl_struct = rgb_to_hsl(color->r(), color->g(), color->b());
|
822
|
-
if (h) hsl_struct.h =
|
828
|
+
if (h) hsl_struct.h = std::fmod(h->value(), 360.0);
|
823
829
|
if (s) hsl_struct.s = ARGR("$saturation", Number, 0, 100)->value();
|
824
830
|
if (l) hsl_struct.l = ARGR("$lightness", Number, 0, 100)->value();
|
825
831
|
double alpha = a ? ARGR("$alpha", Number, 0, 1.0)->value() : color->a();
|
@@ -880,7 +886,7 @@ namespace Sass {
|
|
880
886
|
if (String_Quoted* string_quoted = dynamic_cast<String_Quoted*>(arg)) {
|
881
887
|
String_Constant* result = SASS_MEMORY_NEW(ctx.mem, String_Constant, pstate, string_quoted->value());
|
882
888
|
// remember if the string was quoted (color tokens)
|
883
|
-
result->
|
889
|
+
result->is_delayed(true); // delay colors
|
884
890
|
return result;
|
885
891
|
}
|
886
892
|
else if (dynamic_cast<String_Constant*>(arg)) {
|
@@ -910,7 +916,6 @@ namespace Sass {
|
|
910
916
|
// all other nodes must be converted to a string node
|
911
917
|
std::string str(quote(arg->to_string(ctx.c_options), String_Constant::double_quote()));
|
912
918
|
String_Quoted* result = SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, str);
|
913
|
-
result->is_delayed(true);
|
914
919
|
result->quote_mark('*');
|
915
920
|
return result;
|
916
921
|
}
|
@@ -1015,8 +1020,14 @@ namespace Sass {
|
|
1015
1020
|
std::string str = unquote(s->value());
|
1016
1021
|
|
1017
1022
|
size_t size = utf8::distance(str.begin(), str.end());
|
1018
|
-
if (end_at <= size * -1.0
|
1019
|
-
|
1023
|
+
if (end_at <= size * -1.0 && size > 1) {
|
1024
|
+
end_at += size;
|
1025
|
+
if (end_at == 0) end_at = 1;
|
1026
|
+
}
|
1027
|
+
if (end_at < 0) {
|
1028
|
+
end_at += size + 1;
|
1029
|
+
if (end_at == 0) end_at = 1;
|
1030
|
+
}
|
1020
1031
|
if (end_at > size) { end_at = (double)size; }
|
1021
1032
|
if (start_at < 0) { start_at += size + 1; }
|
1022
1033
|
else if (start_at == 0) { ++ start_at; }
|
@@ -1212,7 +1223,7 @@ namespace Sass {
|
|
1212
1223
|
Signature length_sig = "length($list)";
|
1213
1224
|
BUILT_IN(length)
|
1214
1225
|
{
|
1215
|
-
if (
|
1226
|
+
if (CommaSequence_Selector* sl = dynamic_cast<CommaSequence_Selector*>(env["$list"])) {
|
1216
1227
|
return SASS_MEMORY_NEW(ctx.mem, Number, pstate, (double)sl->length());
|
1217
1228
|
}
|
1218
1229
|
Expression* v = ARG("$list", Expression);
|
@@ -1221,9 +1232,9 @@ namespace Sass {
|
|
1221
1232
|
return SASS_MEMORY_NEW(ctx.mem, Number, pstate, (double)(map ? map->length() : 1));
|
1222
1233
|
}
|
1223
1234
|
if (v->concrete_type() == Expression::SELECTOR) {
|
1224
|
-
if (
|
1235
|
+
if (SimpleSequence_Selector* h = dynamic_cast<SimpleSequence_Selector*>(v)) {
|
1225
1236
|
return SASS_MEMORY_NEW(ctx.mem, Number, pstate, (double)h->length());
|
1226
|
-
} else if (
|
1237
|
+
} else if (CommaSequence_Selector* ls = dynamic_cast<CommaSequence_Selector*>(v)) {
|
1227
1238
|
return SASS_MEMORY_NEW(ctx.mem, Number, pstate, (double)ls->length());
|
1228
1239
|
} else {
|
1229
1240
|
return SASS_MEMORY_NEW(ctx.mem, Number, pstate, 1);
|
@@ -1241,7 +1252,7 @@ namespace Sass {
|
|
1241
1252
|
{
|
1242
1253
|
Number* n = ARG("$n", Number);
|
1243
1254
|
Map* m = dynamic_cast<Map*>(env["$list"]);
|
1244
|
-
if (
|
1255
|
+
if (CommaSequence_Selector* sl = dynamic_cast<CommaSequence_Selector*>(env["$list"])) {
|
1245
1256
|
size_t len = m ? m->length() : sl->length();
|
1246
1257
|
bool empty = m ? m->empty() : sl->empty();
|
1247
1258
|
if (empty) error("argument `$list` of `" + std::string(sig) + "` must not be empty", pstate);
|
@@ -1271,13 +1282,16 @@ namespace Sass {
|
|
1271
1282
|
return l;
|
1272
1283
|
}
|
1273
1284
|
else {
|
1274
|
-
|
1285
|
+
Expression* rv = l->value_at_index(static_cast<int>(index));
|
1286
|
+
rv->set_delayed(false);
|
1287
|
+
return rv;
|
1275
1288
|
}
|
1276
1289
|
}
|
1277
1290
|
|
1278
1291
|
Signature set_nth_sig = "set-nth($list, $n, $value)";
|
1279
1292
|
BUILT_IN(set_nth)
|
1280
1293
|
{
|
1294
|
+
Map* m = dynamic_cast<Map*>(env["$list"]);
|
1281
1295
|
List* l = dynamic_cast<List*>(env["$list"]);
|
1282
1296
|
Number* n = ARG("$n", Number);
|
1283
1297
|
Expression* v = ARG("$value", Expression);
|
@@ -1285,6 +1299,9 @@ namespace Sass {
|
|
1285
1299
|
l = SASS_MEMORY_NEW(ctx.mem, List, pstate, 1);
|
1286
1300
|
*l << ARG("$list", Expression);
|
1287
1301
|
}
|
1302
|
+
if (m) {
|
1303
|
+
l = m->to_list(ctx, pstate);
|
1304
|
+
}
|
1288
1305
|
if (l->empty()) error("argument `$list` of `" + std::string(sig) + "` must not be empty", pstate);
|
1289
1306
|
double index = std::floor(n->value() < 0 ? l->length() + n->value() : n->value() - 1);
|
1290
1307
|
if (index < 0 || index > l->length() - 1) error("index out of bounds for `" + std::string(sig) + "`", pstate);
|
@@ -1298,12 +1315,16 @@ namespace Sass {
|
|
1298
1315
|
Signature index_sig = "index($list, $value)";
|
1299
1316
|
BUILT_IN(index)
|
1300
1317
|
{
|
1318
|
+
Map* m = dynamic_cast<Map*>(env["$list"]);
|
1301
1319
|
List* l = dynamic_cast<List*>(env["$list"]);
|
1302
1320
|
Expression* v = ARG("$value", Expression);
|
1303
1321
|
if (!l) {
|
1304
1322
|
l = SASS_MEMORY_NEW(ctx.mem, List, pstate, 1);
|
1305
1323
|
*l << ARG("$list", Expression);
|
1306
1324
|
}
|
1325
|
+
if (m) {
|
1326
|
+
l = m->to_list(ctx, pstate);
|
1327
|
+
}
|
1307
1328
|
for (size_t i = 0, L = l->length(); i < L; ++i) {
|
1308
1329
|
if (Eval::eq(l->value_at_index(i), v)) return SASS_MEMORY_NEW(ctx.mem, Number, pstate, (double)(i+1));
|
1309
1330
|
}
|
@@ -1313,6 +1334,8 @@ namespace Sass {
|
|
1313
1334
|
Signature join_sig = "join($list1, $list2, $separator: auto)";
|
1314
1335
|
BUILT_IN(join)
|
1315
1336
|
{
|
1337
|
+
Map* m1 = dynamic_cast<Map*>(env["$list1"]);
|
1338
|
+
Map* m2 = dynamic_cast<Map*>(env["$list2"]);
|
1316
1339
|
List* l1 = dynamic_cast<List*>(env["$list1"]);
|
1317
1340
|
List* l2 = dynamic_cast<List*>(env["$list2"]);
|
1318
1341
|
String_Constant* sep = ARG("$separator", String_Constant);
|
@@ -1326,6 +1349,13 @@ namespace Sass {
|
|
1326
1349
|
l2 = SASS_MEMORY_NEW(ctx.mem, List, pstate, 1);
|
1327
1350
|
*l2 << ARG("$list2", Expression);
|
1328
1351
|
}
|
1352
|
+
if (m1) {
|
1353
|
+
l1 = m1->to_list(ctx, pstate);
|
1354
|
+
sep_val = SASS_COMMA;
|
1355
|
+
}
|
1356
|
+
if (m2) {
|
1357
|
+
l2 = m2->to_list(ctx, pstate);
|
1358
|
+
}
|
1329
1359
|
size_t len = l1->length() + l2->length();
|
1330
1360
|
std::string sep_str = unquote(sep->value());
|
1331
1361
|
if (sep_str == "space") sep_val = SASS_SPACE;
|
@@ -1340,9 +1370,10 @@ namespace Sass {
|
|
1340
1370
|
Signature append_sig = "append($list, $val, $separator: auto)";
|
1341
1371
|
BUILT_IN(append)
|
1342
1372
|
{
|
1373
|
+
Map* m = dynamic_cast<Map*>(env["$list"]);
|
1343
1374
|
List* l = dynamic_cast<List*>(env["$list"]);
|
1344
1375
|
Expression* v = ARG("$val", Expression);
|
1345
|
-
if (
|
1376
|
+
if (CommaSequence_Selector* sl = dynamic_cast<CommaSequence_Selector*>(env["$list"])) {
|
1346
1377
|
Listize listize(ctx.mem);
|
1347
1378
|
l = dynamic_cast<List*>(sl->perform(&listize));
|
1348
1379
|
}
|
@@ -1351,6 +1382,9 @@ namespace Sass {
|
|
1351
1382
|
l = SASS_MEMORY_NEW(ctx.mem, List, pstate, 1);
|
1352
1383
|
*l << ARG("$list", Expression);
|
1353
1384
|
}
|
1385
|
+
if (m) {
|
1386
|
+
l = m->to_list(ctx, pstate);
|
1387
|
+
}
|
1354
1388
|
List* result = SASS_MEMORY_NEW(ctx.mem, List, pstate, l->length() + 1, l->separator());
|
1355
1389
|
std::string sep_str(unquote(sep->value()));
|
1356
1390
|
if (sep_str == "space") result->separator(SASS_SPACE);
|
@@ -1380,9 +1414,14 @@ namespace Sass {
|
|
1380
1414
|
size_t shortest = 0;
|
1381
1415
|
for (size_t i = 0, L = arglist->length(); i < L; ++i) {
|
1382
1416
|
List* ith = dynamic_cast<List*>(arglist->value_at_index(i));
|
1417
|
+
Map* mith = dynamic_cast<Map*>(arglist->value_at_index(i));
|
1383
1418
|
if (!ith) {
|
1384
|
-
|
1385
|
-
|
1419
|
+
if (mith) {
|
1420
|
+
ith = mith->to_list(ctx, pstate);
|
1421
|
+
} else {
|
1422
|
+
ith = SASS_MEMORY_NEW(ctx.mem, List, pstate, 1);
|
1423
|
+
*ith << arglist->value_at_index(i);
|
1424
|
+
}
|
1386
1425
|
if (arglist->is_arglist()) {
|
1387
1426
|
((Argument*)(*arglist)[i])->value(ith);
|
1388
1427
|
} else {
|
@@ -1636,7 +1675,7 @@ namespace Sass {
|
|
1636
1675
|
}
|
1637
1676
|
}
|
1638
1677
|
Function_Call* func = SASS_MEMORY_NEW(ctx.mem, Function_Call, pstate, name, args);
|
1639
|
-
Expand expand(ctx, &d_env, backtrace);
|
1678
|
+
Expand expand(ctx, &d_env, backtrace, &selector_stack);
|
1640
1679
|
return func->perform(&expand.eval);
|
1641
1680
|
|
1642
1681
|
}
|
@@ -1654,14 +1693,12 @@ namespace Sass {
|
|
1654
1693
|
// { return ARG("$condition", Expression)->is_false() ? ARG("$if-false", Expression) : ARG("$if-true", Expression); }
|
1655
1694
|
BUILT_IN(sass_if)
|
1656
1695
|
{
|
1657
|
-
Expand expand(ctx, &d_env, backtrace);
|
1696
|
+
Expand expand(ctx, &d_env, backtrace, &selector_stack);
|
1658
1697
|
bool is_true = !ARG("$condition", Expression)->perform(&expand.eval)->is_false();
|
1659
|
-
|
1660
|
-
|
1661
|
-
|
1662
|
-
|
1663
|
-
return ARG("$if-false", Expression)->perform(&expand.eval);
|
1664
|
-
}
|
1698
|
+
Expression* res = ARG(is_true ? "$if-true" : "$if-false", Expression);
|
1699
|
+
res = res->perform(&expand.eval);
|
1700
|
+
res->set_delayed(false); // clone?
|
1701
|
+
return res;
|
1665
1702
|
}
|
1666
1703
|
|
1667
1704
|
////////////////
|
@@ -1716,7 +1753,7 @@ namespace Sass {
|
|
1716
1753
|
error("$selectors: At least one selector must be passed", pstate);
|
1717
1754
|
|
1718
1755
|
// Parse args into vector of selectors
|
1719
|
-
std::vector<
|
1756
|
+
std::vector<CommaSequence_Selector*> parsedSelectors;
|
1720
1757
|
for (size_t i = 0, L = arglist->length(); i < L; ++i) {
|
1721
1758
|
Expression* exp = dynamic_cast<Expression*>(arglist->value_at_index(i));
|
1722
1759
|
if (exp->concrete_type() == Expression::NULL_VAL) {
|
@@ -1729,7 +1766,7 @@ namespace Sass {
|
|
1729
1766
|
str->quote_mark(0);
|
1730
1767
|
}
|
1731
1768
|
std::string exp_src = exp->to_string(ctx.c_options) + "{";
|
1732
|
-
|
1769
|
+
CommaSequence_Selector* sel = Parser::parse_selector(exp_src.c_str(), ctx);
|
1733
1770
|
parsedSelectors.push_back(sel);
|
1734
1771
|
}
|
1735
1772
|
|
@@ -1739,14 +1776,14 @@ namespace Sass {
|
|
1739
1776
|
}
|
1740
1777
|
|
1741
1778
|
// Set the first element as the `result`, keep appending to as we go down the parsedSelector vector.
|
1742
|
-
std::vector<
|
1743
|
-
|
1779
|
+
std::vector<CommaSequence_Selector*>::iterator itr = parsedSelectors.begin();
|
1780
|
+
CommaSequence_Selector* result = *itr;
|
1744
1781
|
++itr;
|
1745
1782
|
|
1746
1783
|
for(;itr != parsedSelectors.end(); ++itr) {
|
1747
|
-
|
1748
|
-
std::vector<
|
1749
|
-
|
1784
|
+
CommaSequence_Selector* child = *itr;
|
1785
|
+
std::vector<Sequence_Selector*> exploded;
|
1786
|
+
CommaSequence_Selector* rv = child->resolve_parent_refs(ctx, result);
|
1750
1787
|
for (size_t m = 0, mLen = rv->length(); m < mLen; ++m) {
|
1751
1788
|
exploded.push_back((*rv)[m]);
|
1752
1789
|
}
|
@@ -1767,7 +1804,7 @@ namespace Sass {
|
|
1767
1804
|
error("$selectors: At least one selector must be passed", pstate);
|
1768
1805
|
|
1769
1806
|
// Parse args into vector of selectors
|
1770
|
-
std::vector<
|
1807
|
+
std::vector<CommaSequence_Selector*> parsedSelectors;
|
1771
1808
|
for (size_t i = 0, L = arglist->length(); i < L; ++i) {
|
1772
1809
|
Expression* exp = dynamic_cast<Expression*>(arglist->value_at_index(i));
|
1773
1810
|
if (exp->concrete_type() == Expression::NULL_VAL) {
|
@@ -1780,7 +1817,7 @@ namespace Sass {
|
|
1780
1817
|
str->quote_mark(0);
|
1781
1818
|
}
|
1782
1819
|
std::string exp_src = exp->to_string() + "{";
|
1783
|
-
|
1820
|
+
CommaSequence_Selector* sel = Parser::parse_selector(exp_src.c_str(), ctx);
|
1784
1821
|
parsedSelectors.push_back(sel);
|
1785
1822
|
}
|
1786
1823
|
|
@@ -1790,13 +1827,13 @@ namespace Sass {
|
|
1790
1827
|
}
|
1791
1828
|
|
1792
1829
|
// Set the first element as the `result`, keep appending to as we go down the parsedSelector vector.
|
1793
|
-
std::vector<
|
1794
|
-
|
1830
|
+
std::vector<CommaSequence_Selector*>::iterator itr = parsedSelectors.begin();
|
1831
|
+
CommaSequence_Selector* result = *itr;
|
1795
1832
|
++itr;
|
1796
1833
|
|
1797
1834
|
for(;itr != parsedSelectors.end(); ++itr) {
|
1798
|
-
|
1799
|
-
std::vector<
|
1835
|
+
CommaSequence_Selector* child = *itr;
|
1836
|
+
std::vector<Sequence_Selector*> newElements;
|
1800
1837
|
|
1801
1838
|
// For every COMPLEX_SELECTOR in `result`
|
1802
1839
|
// For every COMPLEX_SELECTOR in `child`
|
@@ -1807,12 +1844,12 @@ namespace Sass {
|
|
1807
1844
|
// Replace result->elements with newElements
|
1808
1845
|
for (size_t i = 0, resultLen = result->length(); i < resultLen; ++i) {
|
1809
1846
|
for (size_t j = 0, childLen = child->length(); j < childLen; ++j) {
|
1810
|
-
|
1811
|
-
|
1812
|
-
|
1847
|
+
Sequence_Selector* parentSeqClone = (*result)[i]->cloneFully(ctx);
|
1848
|
+
Sequence_Selector* childSeq = (*child)[j];
|
1849
|
+
Sequence_Selector* base = childSeq->tail();
|
1813
1850
|
|
1814
1851
|
// Must be a simple sequence
|
1815
|
-
if( childSeq->combinator() !=
|
1852
|
+
if( childSeq->combinator() != Sequence_Selector::Combinator::ANCESTOR_OF ) {
|
1816
1853
|
std::string msg("Can't append `");
|
1817
1854
|
msg += childSeq->to_string();
|
1818
1855
|
msg += "` to `";
|
@@ -1822,7 +1859,7 @@ namespace Sass {
|
|
1822
1859
|
}
|
1823
1860
|
|
1824
1861
|
// Cannot be a Universal selector
|
1825
|
-
|
1862
|
+
Element_Selector* pType = dynamic_cast<Element_Selector*>(childSeq->head()->first());
|
1826
1863
|
if(pType && pType->name() == "*") {
|
1827
1864
|
std::string msg("Can't append `");
|
1828
1865
|
msg += childSeq->to_string();
|
@@ -1854,10 +1891,10 @@ namespace Sass {
|
|
1854
1891
|
Signature selector_unify_sig = "selector-unify($selector1, $selector2)";
|
1855
1892
|
BUILT_IN(selector_unify)
|
1856
1893
|
{
|
1857
|
-
|
1858
|
-
|
1894
|
+
CommaSequence_Selector* selector1 = ARGSEL("$selector1", CommaSequence_Selector, p_contextualize);
|
1895
|
+
CommaSequence_Selector* selector2 = ARGSEL("$selector2", CommaSequence_Selector, p_contextualize);
|
1859
1896
|
|
1860
|
-
|
1897
|
+
CommaSequence_Selector* result = selector1->unify_with(selector2, ctx);
|
1861
1898
|
Listize listize(ctx.mem);
|
1862
1899
|
return result->perform(&listize);
|
1863
1900
|
}
|
@@ -1865,7 +1902,7 @@ namespace Sass {
|
|
1865
1902
|
Signature simple_selectors_sig = "simple-selectors($selector)";
|
1866
1903
|
BUILT_IN(simple_selectors)
|
1867
1904
|
{
|
1868
|
-
|
1905
|
+
SimpleSequence_Selector* sel = ARGSEL("$selector", SimpleSequence_Selector, p_contextualize);
|
1869
1906
|
|
1870
1907
|
List* l = SASS_MEMORY_NEW(ctx.mem, List, sel->pstate(), sel->length(), SASS_COMMA);
|
1871
1908
|
|
@@ -1882,14 +1919,14 @@ namespace Sass {
|
|
1882
1919
|
Signature selector_extend_sig = "selector-extend($selector, $extendee, $extender)";
|
1883
1920
|
BUILT_IN(selector_extend)
|
1884
1921
|
{
|
1885
|
-
|
1886
|
-
|
1887
|
-
|
1922
|
+
CommaSequence_Selector* selector = ARGSEL("$selector", CommaSequence_Selector, p_contextualize);
|
1923
|
+
CommaSequence_Selector* extendee = ARGSEL("$extendee", CommaSequence_Selector, p_contextualize);
|
1924
|
+
CommaSequence_Selector* extender = ARGSEL("$extender", CommaSequence_Selector, p_contextualize);
|
1888
1925
|
|
1889
1926
|
ExtensionSubsetMap subset_map;
|
1890
1927
|
extender->populate_extends(extendee, ctx, subset_map);
|
1891
1928
|
|
1892
|
-
|
1929
|
+
CommaSequence_Selector* result = Extend::extendSelectorList(selector, ctx, subset_map, false);
|
1893
1930
|
|
1894
1931
|
Listize listize(ctx.mem);
|
1895
1932
|
return result->perform(&listize);
|
@@ -1898,14 +1935,14 @@ namespace Sass {
|
|
1898
1935
|
Signature selector_replace_sig = "selector-replace($selector, $original, $replacement)";
|
1899
1936
|
BUILT_IN(selector_replace)
|
1900
1937
|
{
|
1901
|
-
|
1902
|
-
|
1903
|
-
|
1938
|
+
CommaSequence_Selector* selector = ARGSEL("$selector", CommaSequence_Selector, p_contextualize);
|
1939
|
+
CommaSequence_Selector* original = ARGSEL("$original", CommaSequence_Selector, p_contextualize);
|
1940
|
+
CommaSequence_Selector* replacement = ARGSEL("$replacement", CommaSequence_Selector, p_contextualize);
|
1904
1941
|
|
1905
1942
|
ExtensionSubsetMap subset_map;
|
1906
1943
|
replacement->populate_extends(original, ctx, subset_map);
|
1907
1944
|
|
1908
|
-
|
1945
|
+
CommaSequence_Selector* result = Extend::extendSelectorList(selector, ctx, subset_map, true);
|
1909
1946
|
|
1910
1947
|
Listize listize(ctx.mem);
|
1911
1948
|
return result->perform(&listize);
|
@@ -1914,7 +1951,7 @@ namespace Sass {
|
|
1914
1951
|
Signature selector_parse_sig = "selector-parse($selector)";
|
1915
1952
|
BUILT_IN(selector_parse)
|
1916
1953
|
{
|
1917
|
-
|
1954
|
+
CommaSequence_Selector* sel = ARGSEL("$selector", CommaSequence_Selector, p_contextualize);
|
1918
1955
|
|
1919
1956
|
Listize listize(ctx.mem);
|
1920
1957
|
return sel->perform(&listize);
|
@@ -1923,8 +1960,8 @@ namespace Sass {
|
|
1923
1960
|
Signature is_superselector_sig = "is-superselector($super, $sub)";
|
1924
1961
|
BUILT_IN(is_superselector)
|
1925
1962
|
{
|
1926
|
-
|
1927
|
-
|
1963
|
+
CommaSequence_Selector* sel_sup = ARGSEL("$super", CommaSequence_Selector, p_contextualize);
|
1964
|
+
CommaSequence_Selector* sel_sub = ARGSEL("$sub", CommaSequence_Selector, p_contextualize);
|
1928
1965
|
bool result = sel_sup->is_superselector_of(sel_sub);
|
1929
1966
|
return SASS_MEMORY_NEW(ctx.mem, Boolean, pstate, result);
|
1930
1967
|
}
|