sassc 1.10.1 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|