sassc 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +13 -0
- data/Rakefile +1 -3
- data/ext/extconf.rb +13 -5
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/base.h +2 -1
- data/ext/libsass/include/sass/context.h +1 -0
- data/ext/libsass/src/ast.cpp +49 -59
- data/ext/libsass/src/ast.hpp +263 -102
- data/ext/libsass/src/ast_def_macros.hpp +8 -0
- data/ext/libsass/src/ast_fwd_decl.cpp +2 -1
- data/ext/libsass/src/ast_fwd_decl.hpp +40 -116
- data/ext/libsass/src/ast_helpers.hpp +292 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +209 -722
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +207 -212
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +559 -1001
- data/ext/libsass/src/ast_selectors.hpp +311 -367
- data/ext/libsass/src/ast_supports.cpp +1 -17
- data/ext/libsass/src/ast_values.cpp +216 -29
- data/ext/libsass/src/ast_values.hpp +42 -33
- data/ext/libsass/src/bind.cpp +1 -1
- data/ext/libsass/src/cencode.c +4 -6
- data/ext/libsass/src/check_nesting.cpp +5 -6
- data/ext/libsass/src/check_nesting.hpp +4 -0
- data/ext/libsass/src/color_maps.cpp +11 -10
- data/ext/libsass/src/color_maps.hpp +0 -8
- data/ext/libsass/src/constants.cpp +5 -0
- data/ext/libsass/src/constants.hpp +6 -0
- data/ext/libsass/src/context.cpp +30 -60
- data/ext/libsass/src/context.hpp +8 -20
- data/ext/libsass/src/cssize.cpp +36 -120
- data/ext/libsass/src/cssize.hpp +4 -10
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debugger.hpp +364 -207
- data/ext/libsass/src/emitter.cpp +3 -4
- data/ext/libsass/src/emitter.hpp +0 -2
- data/ext/libsass/src/environment.hpp +5 -0
- data/ext/libsass/src/error_handling.cpp +21 -0
- data/ext/libsass/src/error_handling.hpp +25 -3
- data/ext/libsass/src/eval.cpp +33 -153
- data/ext/libsass/src/eval.hpp +11 -13
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +214 -167
- data/ext/libsass/src/expand.hpp +26 -6
- data/ext/libsass/src/extender.cpp +1186 -0
- data/ext/libsass/src/extender.hpp +399 -0
- data/ext/libsass/src/extension.cpp +43 -0
- data/ext/libsass/src/extension.hpp +89 -0
- data/ext/libsass/src/file.cpp +15 -14
- data/ext/libsass/src/file.hpp +5 -12
- data/ext/libsass/src/fn_colors.cpp +12 -10
- data/ext/libsass/src/fn_lists.cpp +12 -11
- data/ext/libsass/src/fn_miscs.cpp +22 -34
- data/ext/libsass/src/fn_numbers.cpp +13 -6
- data/ext/libsass/src/fn_selectors.cpp +94 -124
- data/ext/libsass/src/fn_strings.cpp +16 -14
- data/ext/libsass/src/fn_utils.cpp +5 -6
- data/ext/libsass/src/fn_utils.hpp +9 -3
- data/ext/libsass/src/inspect.cpp +154 -117
- data/ext/libsass/src/inspect.hpp +10 -8
- data/ext/libsass/src/lexer.cpp +17 -81
- data/ext/libsass/src/lexer.hpp +5 -16
- data/ext/libsass/src/listize.cpp +22 -36
- data/ext/libsass/src/listize.hpp +8 -9
- data/ext/libsass/src/memory/SharedPtr.hpp +39 -5
- data/ext/libsass/src/operation.hpp +27 -17
- data/ext/libsass/src/operators.cpp +1 -0
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +30 -49
- data/ext/libsass/src/output.hpp +1 -1
- data/ext/libsass/src/parser.cpp +211 -381
- data/ext/libsass/src/parser.hpp +17 -15
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +140 -0
- data/ext/libsass/src/position.hpp +1 -1
- data/ext/libsass/src/prelexer.cpp +6 -6
- data/ext/libsass/src/remove_placeholders.cpp +55 -56
- data/ext/libsass/src/remove_placeholders.hpp +21 -18
- data/ext/libsass/src/sass.hpp +1 -0
- data/ext/libsass/src/sass2scss.cpp +4 -4
- data/ext/libsass/src/sass_context.cpp +42 -91
- data/ext/libsass/src/sass_context.hpp +2 -2
- data/ext/libsass/src/sass_functions.cpp +1 -1
- data/ext/libsass/src/sass_values.cpp +0 -1
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +2 -2
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.cpp +5 -3
- data/ext/libsass/src/util.cpp +10 -12
- data/ext/libsass/src/util.hpp +2 -3
- data/ext/libsass/src/util_string.cpp +111 -61
- data/ext/libsass/src/util_string.hpp +61 -8
- data/lib/sassc/engine.rb +5 -3
- data/lib/sassc/functions_handler.rb +8 -8
- data/lib/sassc/native.rb +1 -1
- data/lib/sassc/script.rb +4 -4
- data/lib/sassc/version.rb +1 -1
- data/test/functions_test.rb +18 -1
- data/test/native_test.rb +1 -1
- metadata +17 -12
- data/ext/libsass/src/extend.cpp +0 -2132
- data/ext/libsass/src/extend.hpp +0 -86
- data/ext/libsass/src/node.cpp +0 -322
- data/ext/libsass/src/node.hpp +0 -118
- data/ext/libsass/src/paths.hpp +0 -71
- data/ext/libsass/src/sass_util.cpp +0 -152
- data/ext/libsass/src/sass_util.hpp +0 -256
- data/ext/libsass/src/subset_map.cpp +0 -58
- data/ext/libsass/src/subset_map.hpp +0 -76
data/ext/libsass/src/emitter.cpp
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
1
3
|
#include "sass.hpp"
|
|
2
|
-
#include "util.hpp"
|
|
3
|
-
#include "context.hpp"
|
|
4
|
-
#include "output.hpp"
|
|
5
4
|
#include "emitter.hpp"
|
|
6
5
|
#include "util_string.hpp"
|
|
7
|
-
#include "
|
|
6
|
+
#include "util.hpp"
|
|
8
7
|
|
|
9
8
|
namespace Sass {
|
|
10
9
|
|
data/ext/libsass/src/emitter.hpp
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
#ifndef SASS_ENVIRONMENT_H
|
|
2
2
|
#define SASS_ENVIRONMENT_H
|
|
3
3
|
|
|
4
|
+
// sass.hpp must go before all system headers to get the
|
|
5
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
6
|
+
#include "sass.hpp"
|
|
7
|
+
|
|
8
|
+
#include <map>
|
|
4
9
|
#include <string>
|
|
5
10
|
#include "ast_fwd_decl.hpp"
|
|
6
11
|
#include "ast_def_macros.hpp"
|
|
@@ -132,6 +132,27 @@ namespace Sass {
|
|
|
132
132
|
prefix = err.errtype();
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
+
TopLevelParent::TopLevelParent(Backtraces traces, ParserState pstate)
|
|
136
|
+
: Base(pstate, "Top-level selectors may not contain the parent selector \"&\".", traces)
|
|
137
|
+
{
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
UnsatisfiedExtend::UnsatisfiedExtend(Backtraces traces, Extension extension)
|
|
142
|
+
: Base(extension.target->pstate(), "The target selector was not found.\n"
|
|
143
|
+
"Use \"@extend " + extension.target->to_string() + " !optional\" to avoid this error.", traces)
|
|
144
|
+
{
|
|
145
|
+
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
ExtendAcrossMedia::ExtendAcrossMedia(Backtraces traces, Extension extension)
|
|
149
|
+
: Base(extension.target->pstate(), "You may not @extend selectors across media queries.\n"
|
|
150
|
+
"Use \"@extend " + extension.target->to_string() + " !optional\" to avoid this error.", traces)
|
|
151
|
+
{
|
|
152
|
+
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
|
|
135
156
|
}
|
|
136
157
|
|
|
137
158
|
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
#ifndef SASS_ERROR_HANDLING_H
|
|
2
2
|
#define SASS_ERROR_HANDLING_H
|
|
3
3
|
|
|
4
|
+
// sass.hpp must go before all system headers to get the
|
|
5
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
6
|
+
#include "sass.hpp"
|
|
7
|
+
|
|
4
8
|
#include <string>
|
|
5
9
|
#include <sstream>
|
|
6
10
|
#include <stdexcept>
|
|
@@ -205,9 +209,27 @@ namespace Sass {
|
|
|
205
209
|
};
|
|
206
210
|
|
|
207
211
|
class SassValueError : public Base {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
212
|
+
public:
|
|
213
|
+
SassValueError(Backtraces traces, ParserState pstate, OperationError& err);
|
|
214
|
+
virtual ~SassValueError() throw() {};
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
class TopLevelParent : public Base {
|
|
218
|
+
public:
|
|
219
|
+
TopLevelParent(Backtraces traces, ParserState pstate);
|
|
220
|
+
virtual ~TopLevelParent() throw() {};
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
class UnsatisfiedExtend : public Base {
|
|
224
|
+
public:
|
|
225
|
+
UnsatisfiedExtend(Backtraces traces, Extension extension);
|
|
226
|
+
virtual ~UnsatisfiedExtend() throw() {};
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
class ExtendAcrossMedia : public Base {
|
|
230
|
+
public:
|
|
231
|
+
ExtendAcrossMedia(Backtraces traces, Extension extension);
|
|
232
|
+
virtual ~ExtendAcrossMedia() throw() {};
|
|
211
233
|
};
|
|
212
234
|
|
|
213
235
|
}
|
data/ext/libsass/src/eval.cpp
CHANGED
|
@@ -72,28 +72,11 @@ namespace Sass {
|
|
|
72
72
|
return exp.env_stack;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
Selector_List_Obj Eval::selector()
|
|
76
|
-
{
|
|
77
|
-
return exp.selector();
|
|
78
|
-
}
|
|
79
|
-
|
|
80
75
|
std::vector<Sass_Callee>& Eval::callee_stack()
|
|
81
76
|
{
|
|
82
77
|
return ctx.callee_stack;
|
|
83
78
|
}
|
|
84
79
|
|
|
85
|
-
|
|
86
|
-
SelectorStack& Eval::selector_stack()
|
|
87
|
-
{
|
|
88
|
-
return exp.selector_stack;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
bool& Eval::old_at_root_without_rule()
|
|
92
|
-
{
|
|
93
|
-
return exp.old_at_root_without_rule;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
|
|
97
80
|
Expression* Eval::operator()(Block* b)
|
|
98
81
|
{
|
|
99
82
|
Expression* val = 0;
|
|
@@ -251,9 +234,8 @@ namespace Sass {
|
|
|
251
234
|
if (expr->concrete_type() == Expression::MAP) {
|
|
252
235
|
map = Cast<Map>(expr);
|
|
253
236
|
}
|
|
254
|
-
else if (
|
|
255
|
-
Listize
|
|
256
|
-
Expression_Obj rv = ls->perform(&listize);
|
|
237
|
+
else if (SelectorList * ls = Cast<SelectorList>(expr)) {
|
|
238
|
+
Expression_Obj rv = Listize::perform(ls);
|
|
257
239
|
list = Cast<List>(rv);
|
|
258
240
|
}
|
|
259
241
|
else if (expr->concrete_type() != Expression::LIST) {
|
|
@@ -286,7 +268,7 @@ namespace Sass {
|
|
|
286
268
|
}
|
|
287
269
|
}
|
|
288
270
|
else {
|
|
289
|
-
if (list->length() == 1 && Cast<
|
|
271
|
+
if (list->length() == 1 && Cast<SelectorList>(list)) {
|
|
290
272
|
list = Cast<List>(list);
|
|
291
273
|
}
|
|
292
274
|
for (size_t i = 0, L = list->length(); i < L; ++i) {
|
|
@@ -490,6 +472,7 @@ namespace Sass {
|
|
|
490
472
|
return 0;
|
|
491
473
|
}
|
|
492
474
|
|
|
475
|
+
|
|
493
476
|
Expression* Eval::operator()(List* l)
|
|
494
477
|
{
|
|
495
478
|
// special case for unevaluated map
|
|
@@ -707,9 +690,9 @@ namespace Sass {
|
|
|
707
690
|
b->op(), s_l->last(), b->right());
|
|
708
691
|
bin_ex->is_delayed(b->left()->is_delayed() || b->right()->is_delayed()); // unverified
|
|
709
692
|
for (size_t i = 0; i < s_l->length() - 1; ++i) {
|
|
710
|
-
ret_schema->append(
|
|
693
|
+
ret_schema->append(s_l->at(i)->perform(this));
|
|
711
694
|
}
|
|
712
|
-
ret_schema->append(
|
|
695
|
+
ret_schema->append(bin_ex->perform(this));
|
|
713
696
|
return ret_schema->perform(this);
|
|
714
697
|
}
|
|
715
698
|
}
|
|
@@ -720,9 +703,9 @@ namespace Sass {
|
|
|
720
703
|
Binary_Expression_Obj bin_ex = SASS_MEMORY_NEW(Binary_Expression, b->pstate(),
|
|
721
704
|
b->op(), b->left(), s_r->first());
|
|
722
705
|
bin_ex->is_delayed(b->left()->is_delayed() || b->right()->is_delayed()); // verified
|
|
723
|
-
ret_schema->append(
|
|
706
|
+
ret_schema->append(bin_ex->perform(this));
|
|
724
707
|
for (size_t i = 1; i < s_r->length(); ++i) {
|
|
725
|
-
ret_schema->append(
|
|
708
|
+
ret_schema->append(s_r->at(i)->perform(this));
|
|
726
709
|
}
|
|
727
710
|
return ret_schema->perform(this);
|
|
728
711
|
}
|
|
@@ -933,7 +916,7 @@ namespace Sass {
|
|
|
933
916
|
return nr.detach();
|
|
934
917
|
}
|
|
935
918
|
else {
|
|
936
|
-
// Special cases: +/- variables which evaluate to null
|
|
919
|
+
// Special cases: +/- variables which evaluate to null output just +/-,
|
|
937
920
|
// but +/- null itself outputs the string
|
|
938
921
|
if (operand->concrete_type() == Expression::NULL_VAL && Cast<Variable>(u->operand())) {
|
|
939
922
|
u->operand(SASS_MEMORY_NEW(String_Quoted, u->pstate(), ""));
|
|
@@ -942,12 +925,19 @@ namespace Sass {
|
|
|
942
925
|
else if (Color* color = Cast<Color>(operand)) {
|
|
943
926
|
// Use the color name if this was eval with one
|
|
944
927
|
if (color->disp().length() > 0) {
|
|
945
|
-
|
|
946
|
-
|
|
928
|
+
Unary_Expression_Obj cpy = SASS_MEMORY_COPY(u);
|
|
929
|
+
cpy->operand(SASS_MEMORY_NEW(String_Constant, operand->pstate(), color->disp()));
|
|
930
|
+
return SASS_MEMORY_NEW(String_Quoted,
|
|
931
|
+
cpy->pstate(),
|
|
932
|
+
cpy->inspect());
|
|
947
933
|
}
|
|
948
934
|
}
|
|
949
935
|
else {
|
|
950
|
-
u
|
|
936
|
+
Unary_Expression_Obj cpy = SASS_MEMORY_COPY(u);
|
|
937
|
+
cpy->operand(operand);
|
|
938
|
+
return SASS_MEMORY_NEW(String_Quoted,
|
|
939
|
+
cpy->pstate(),
|
|
940
|
+
cpy->inspect());
|
|
951
941
|
}
|
|
952
942
|
|
|
953
943
|
return SASS_MEMORY_NEW(String_Quoted,
|
|
@@ -995,7 +985,7 @@ namespace Sass {
|
|
|
995
985
|
c->name(),
|
|
996
986
|
args);
|
|
997
987
|
if (args->has_named_arguments()) {
|
|
998
|
-
error("
|
|
988
|
+
error("Plain CSS function " + c->name() + " doesn't support keyword arguments", c->pstate(), traces);
|
|
999
989
|
}
|
|
1000
990
|
String_Quoted* str = SASS_MEMORY_NEW(String_Quoted,
|
|
1001
991
|
c->pstate(),
|
|
@@ -1065,7 +1055,7 @@ namespace Sass {
|
|
|
1065
1055
|
result = body->perform(this);
|
|
1066
1056
|
}
|
|
1067
1057
|
else if (func) {
|
|
1068
|
-
result = func(fn_env, *env, ctx, def->signature(), c->pstate(), traces, exp.
|
|
1058
|
+
result = func(fn_env, *env, ctx, def->signature(), c->pstate(), traces, exp.getSelectorStack(), exp.originalStack);
|
|
1069
1059
|
}
|
|
1070
1060
|
if (!result) {
|
|
1071
1061
|
error(std::string("Function ") + c->name() + " finished without @return", c->pstate(), traces);
|
|
@@ -1214,11 +1204,6 @@ namespace Sass {
|
|
|
1214
1204
|
|
|
1215
1205
|
if (Cast<Null>(ex)) { return; }
|
|
1216
1206
|
|
|
1217
|
-
// parent selector needs another go
|
|
1218
|
-
if (Cast<Parent_Selector>(ex)) {
|
|
1219
|
-
// XXX: this is never hit via spec tests
|
|
1220
|
-
ex = ex->perform(this);
|
|
1221
|
-
}
|
|
1222
1207
|
// parent selector needs another go
|
|
1223
1208
|
if (Cast<Parent_Reference>(ex)) {
|
|
1224
1209
|
// XXX: this is never hit via spec tests
|
|
@@ -1254,7 +1239,6 @@ namespace Sass {
|
|
|
1254
1239
|
// Selector_List
|
|
1255
1240
|
// String_Quoted
|
|
1256
1241
|
// String_Constant
|
|
1257
|
-
// Parent_Selector
|
|
1258
1242
|
// Binary_Expression
|
|
1259
1243
|
else {
|
|
1260
1244
|
// ex = ex->perform(this);
|
|
@@ -1512,69 +1496,7 @@ namespace Sass {
|
|
|
1512
1496
|
return 0;
|
|
1513
1497
|
}
|
|
1514
1498
|
|
|
1515
|
-
|
|
1516
|
-
{
|
|
1517
|
-
SelectorStack rv;
|
|
1518
|
-
Selector_List_Obj sl = SASS_MEMORY_NEW(Selector_List, s->pstate());
|
|
1519
|
-
sl->is_optional(s->is_optional());
|
|
1520
|
-
sl->media_block(s->media_block());
|
|
1521
|
-
sl->is_optional(s->is_optional());
|
|
1522
|
-
for (size_t i = 0, iL = s->length(); i < iL; ++i) {
|
|
1523
|
-
rv.push_back(operator()((*s)[i]));
|
|
1524
|
-
}
|
|
1525
|
-
|
|
1526
|
-
// we should actually permutate parent first
|
|
1527
|
-
// but here we have permutated the selector first
|
|
1528
|
-
size_t round = 0;
|
|
1529
|
-
while (round != std::string::npos) {
|
|
1530
|
-
bool abort = true;
|
|
1531
|
-
for (size_t i = 0, iL = rv.size(); i < iL; ++i) {
|
|
1532
|
-
if (rv[i]->length() > round) {
|
|
1533
|
-
sl->append((*rv[i])[round]);
|
|
1534
|
-
abort = false;
|
|
1535
|
-
}
|
|
1536
|
-
}
|
|
1537
|
-
if (abort) {
|
|
1538
|
-
round = std::string::npos;
|
|
1539
|
-
} else {
|
|
1540
|
-
++ round;
|
|
1541
|
-
}
|
|
1542
|
-
|
|
1543
|
-
}
|
|
1544
|
-
return sl.detach();
|
|
1545
|
-
}
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
Selector_List* Eval::operator()(Complex_Selector* s)
|
|
1549
|
-
{
|
|
1550
|
-
bool implicit_parent = !exp.old_at_root_without_rule;
|
|
1551
|
-
if (is_in_selector_schema) exp.selector_stack.push_back({});
|
|
1552
|
-
Selector_List_Obj resolved = s->resolve_parent_refs(exp.selector_stack, traces, implicit_parent);
|
|
1553
|
-
if (is_in_selector_schema) exp.selector_stack.pop_back();
|
|
1554
|
-
for (size_t i = 0; i < resolved->length(); i++) {
|
|
1555
|
-
Complex_Selector* is = resolved->at(i)->mutable_first();
|
|
1556
|
-
while (is) {
|
|
1557
|
-
if (is->head()) {
|
|
1558
|
-
is->head(operator()(is->head()));
|
|
1559
|
-
}
|
|
1560
|
-
is = is->tail();
|
|
1561
|
-
}
|
|
1562
|
-
}
|
|
1563
|
-
return resolved.detach();
|
|
1564
|
-
}
|
|
1565
|
-
|
|
1566
|
-
Compound_Selector* Eval::operator()(Compound_Selector* s)
|
|
1567
|
-
{
|
|
1568
|
-
for (size_t i = 0; i < s->length(); i++) {
|
|
1569
|
-
Simple_Selector* ss = s->at(i);
|
|
1570
|
-
// skip parents here (called via resolve_parent_refs)
|
|
1571
|
-
if (ss == NULL || Cast<Parent_Selector>(ss)) continue;
|
|
1572
|
-
s->at(i) = Cast<Simple_Selector>(ss->perform(this));
|
|
1573
|
-
}
|
|
1574
|
-
return s;
|
|
1575
|
-
}
|
|
1576
|
-
|
|
1577
|
-
Selector_List* Eval::operator()(Selector_Schema* s)
|
|
1499
|
+
SelectorList* Eval::operator()(Selector_Schema* s)
|
|
1578
1500
|
{
|
|
1579
1501
|
LOCAL_FLAG(is_in_selector_schema, true);
|
|
1580
1502
|
// the parser will look for a brace to end the selector
|
|
@@ -1584,74 +1506,32 @@ namespace Sass {
|
|
|
1584
1506
|
char* temp_cstr = sass_copy_c_string(result_str.c_str());
|
|
1585
1507
|
ctx.strings.push_back(temp_cstr); // attach to context
|
|
1586
1508
|
Parser p = Parser::from_c_str(temp_cstr, ctx, traces, s->pstate());
|
|
1587
|
-
p.last_media_block = s->media_block();
|
|
1588
|
-
// a selector schema may or may not connect to parent?
|
|
1589
|
-
bool chroot = s->connect_parent() == false;
|
|
1590
|
-
Selector_List_Obj sl = p.parse_selector_list(chroot);
|
|
1591
|
-
flag_is_in_selector_schema.reset();
|
|
1592
|
-
return operator()(sl);
|
|
1593
|
-
}
|
|
1594
1509
|
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
exp.selector_stack.push_back(rv);
|
|
1601
|
-
return rv.detach();
|
|
1602
|
-
} else {
|
|
1603
|
-
return SASS_MEMORY_NEW(Null, p->pstate());
|
|
1604
|
-
}
|
|
1510
|
+
// If a schema contains a reference to parent it is already
|
|
1511
|
+
// connected to it, so don't connect implicitly anymore
|
|
1512
|
+
SelectorListObj parsed = p.parseSelectorList(true);
|
|
1513
|
+
flag_is_in_selector_schema.reset();
|
|
1514
|
+
return parsed.detach();
|
|
1605
1515
|
}
|
|
1606
1516
|
|
|
1607
1517
|
Expression* Eval::operator()(Parent_Reference* p)
|
|
1608
1518
|
{
|
|
1609
|
-
if (
|
|
1610
|
-
|
|
1611
|
-
Selector_List_Obj rv = operator()(pr);
|
|
1612
|
-
exp.selector_stack.push_back(rv);
|
|
1613
|
-
return rv.detach();
|
|
1519
|
+
if (SelectorListObj pr = exp.original()) {
|
|
1520
|
+
return operator()(pr);
|
|
1614
1521
|
} else {
|
|
1615
1522
|
return SASS_MEMORY_NEW(Null, p->pstate());
|
|
1616
1523
|
}
|
|
1617
1524
|
}
|
|
1618
1525
|
|
|
1619
|
-
|
|
1526
|
+
SimpleSelector* Eval::operator()(SimpleSelector* s)
|
|
1620
1527
|
{
|
|
1621
1528
|
return s;
|
|
1622
1529
|
}
|
|
1623
1530
|
|
|
1624
|
-
|
|
1625
|
-
// probably the wrong place, but this should ultimately
|
|
1626
|
-
// be fixed by implement superselector correctly for `:not`
|
|
1627
|
-
// first use of "find" (ATM only implemented for selectors)
|
|
1628
|
-
bool hasNotSelector(AST_Node_Obj obj) {
|
|
1629
|
-
if (Wrapped_Selector* w = Cast<Wrapped_Selector>(obj)) {
|
|
1630
|
-
return w->name() == ":not";
|
|
1631
|
-
}
|
|
1632
|
-
return false;
|
|
1633
|
-
}
|
|
1634
|
-
|
|
1635
|
-
Wrapped_Selector* Eval::operator()(Wrapped_Selector* s)
|
|
1531
|
+
Pseudo_Selector* Eval::operator()(Pseudo_Selector* pseudo)
|
|
1636
1532
|
{
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
if (exp.selector_stack.back()) {
|
|
1640
|
-
if (s->selector()->find(hasNotSelector)) {
|
|
1641
|
-
s->selector()->clear();
|
|
1642
|
-
s->name(" ");
|
|
1643
|
-
} else {
|
|
1644
|
-
for (size_t i = 0; i < s->selector()->length(); ++i) {
|
|
1645
|
-
Complex_Selector* cs = s->selector()->at(i);
|
|
1646
|
-
if (cs->tail()) {
|
|
1647
|
-
s->selector()->clear();
|
|
1648
|
-
s->name(" ");
|
|
1649
|
-
}
|
|
1650
|
-
}
|
|
1651
|
-
}
|
|
1652
|
-
}
|
|
1653
|
-
}
|
|
1654
|
-
return s;
|
|
1533
|
+
// ToDo: should we eval selector?
|
|
1534
|
+
return pseudo;
|
|
1655
1535
|
};
|
|
1656
1536
|
|
|
1657
1537
|
}
|
data/ext/libsass/src/eval.hpp
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
#ifndef SASS_EVAL_H
|
|
2
2
|
#define SASS_EVAL_H
|
|
3
3
|
|
|
4
|
+
// sass.hpp must go before all system headers to get the
|
|
5
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
6
|
+
#include "sass.hpp"
|
|
4
7
|
#include "ast.hpp"
|
|
8
|
+
|
|
5
9
|
#include "context.hpp"
|
|
6
10
|
#include "listize.hpp"
|
|
7
11
|
#include "operation.hpp"
|
|
@@ -31,12 +35,8 @@ namespace Sass {
|
|
|
31
35
|
Env* environment();
|
|
32
36
|
EnvStack& env_stack();
|
|
33
37
|
const std::string cwd();
|
|
34
|
-
Selector_List_Obj selector();
|
|
35
38
|
CalleeStack& callee_stack();
|
|
36
|
-
SelectorStack& selector_stack();
|
|
37
|
-
bool& old_at_root_without_rule();
|
|
38
39
|
struct Sass_Inspect_Options& options();
|
|
39
|
-
struct Sass_Inspect_Options options2();
|
|
40
40
|
struct Sass_Compiler* compiler();
|
|
41
41
|
|
|
42
42
|
// for evaluating function bodies
|
|
@@ -64,7 +64,6 @@ namespace Sass {
|
|
|
64
64
|
Expression* operator()(String_Schema*);
|
|
65
65
|
Expression* operator()(String_Quoted*);
|
|
66
66
|
Expression* operator()(String_Constant*);
|
|
67
|
-
// Expression* operator()(Selector_List*);
|
|
68
67
|
Media_Query* operator()(Media_Query*);
|
|
69
68
|
Expression* operator()(Media_Query_Expression*);
|
|
70
69
|
Expression* operator()(At_Root_Query*);
|
|
@@ -78,23 +77,22 @@ namespace Sass {
|
|
|
78
77
|
Expression* operator()(Comment*);
|
|
79
78
|
|
|
80
79
|
// these will return selectors
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
SelectorList* operator()(SelectorList*);
|
|
81
|
+
SelectorList* operator()(ComplexSelector*);
|
|
82
|
+
CompoundSelector* operator()(CompoundSelector*);
|
|
83
|
+
SelectorComponent* operator()(SelectorComponent*);
|
|
84
|
+
SimpleSelector* operator()(SimpleSelector* s);
|
|
85
|
+
Pseudo_Selector* operator()(Pseudo_Selector* s);
|
|
86
86
|
|
|
87
87
|
// they don't have any specific implementation (yet)
|
|
88
88
|
Id_Selector* operator()(Id_Selector* s) { return s; };
|
|
89
89
|
Class_Selector* operator()(Class_Selector* s) { return s; };
|
|
90
|
-
Pseudo_Selector* operator()(Pseudo_Selector* s) { return s; };
|
|
91
90
|
Type_Selector* operator()(Type_Selector* s) { return s; };
|
|
92
91
|
Attribute_Selector* operator()(Attribute_Selector* s) { return s; };
|
|
93
92
|
Placeholder_Selector* operator()(Placeholder_Selector* s) { return s; };
|
|
94
93
|
|
|
95
94
|
// actual evaluated selectors
|
|
96
|
-
|
|
97
|
-
Expression* operator()(Parent_Selector*);
|
|
95
|
+
SelectorList* operator()(Selector_Schema*);
|
|
98
96
|
Expression* operator()(Parent_Reference*);
|
|
99
97
|
|
|
100
98
|
// generic fallback
|