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
@@ -7,7 +7,7 @@
|
|
7
7
|
#include "sass/functions.h"
|
8
8
|
|
9
9
|
#define BUILT_IN(name) Expression*\
|
10
|
-
name(Env& env, Env& d_env, Context& ctx, Signature sig, ParserState pstate, Backtrace* backtrace)
|
10
|
+
name(Env& env, Env& d_env, Context& ctx, Signature sig, ParserState pstate, Backtrace* backtrace, std::vector<CommaSequence_Selector*> selector_stack)
|
11
11
|
|
12
12
|
namespace Sass {
|
13
13
|
class Context;
|
@@ -17,7 +17,7 @@ namespace Sass {
|
|
17
17
|
class Definition;
|
18
18
|
typedef Environment<AST_Node*> Env;
|
19
19
|
typedef const char* Signature;
|
20
|
-
typedef Expression* (*Native_Function)(Env&, Env&, Context&, Signature, ParserState, Backtrace
|
20
|
+
typedef Expression* (*Native_Function)(Env&, Env&, Context&, Signature, ParserState, Backtrace*, std::vector<CommaSequence_Selector*>);
|
21
21
|
|
22
22
|
Definition* make_native_function(Signature, Native_Function, Context& ctx);
|
23
23
|
Definition* make_c_function(Sass_Function_Entry c_func, Context& ctx);
|
data/ext/libsass/src/inspect.cpp
CHANGED
@@ -51,13 +51,6 @@ namespace Sass {
|
|
51
51
|
if (rule->block()) rule->block()->perform(this);
|
52
52
|
}
|
53
53
|
|
54
|
-
void Inspect::operator()(Propset* propset)
|
55
|
-
{
|
56
|
-
propset->property_fragment()->perform(this);
|
57
|
-
append_colon_separator();
|
58
|
-
propset->block()->perform(this);
|
59
|
-
}
|
60
|
-
|
61
54
|
void Inspect::operator()(Bubble* bubble)
|
62
55
|
{
|
63
56
|
append_indentation();
|
@@ -166,10 +159,6 @@ namespace Sass {
|
|
166
159
|
append_token("@import", import);
|
167
160
|
append_mandatory_space();
|
168
161
|
|
169
|
-
if (String_Quoted* strq = dynamic_cast<String_Quoted*>(import->urls().front())) {
|
170
|
-
strq->is_delayed(false);
|
171
|
-
}
|
172
|
-
|
173
162
|
import->urls().front()->perform(this);
|
174
163
|
if (import->urls().size() == 1) {
|
175
164
|
if (import->media_queries()) {
|
@@ -183,10 +172,6 @@ namespace Sass {
|
|
183
172
|
append_token("@import", import);
|
184
173
|
append_mandatory_space();
|
185
174
|
|
186
|
-
if (String_Quoted* strq = dynamic_cast<String_Quoted*>(import->urls()[i])) {
|
187
|
-
strq->is_delayed(false);
|
188
|
-
}
|
189
|
-
|
190
175
|
import->urls()[i]->perform(this);
|
191
176
|
if (import->urls().size() - 1 == i) {
|
192
177
|
if (import->media_queries()) {
|
@@ -390,7 +375,7 @@ namespace Sass {
|
|
390
375
|
!list->from_selector() &&
|
391
376
|
!dynamic_cast<List*>((*list)[0]) &&
|
392
377
|
!dynamic_cast<List*>((*list)[0]) &&
|
393
|
-
!dynamic_cast<
|
378
|
+
!dynamic_cast<CommaSequence_Selector*>((*list)[0])) {
|
394
379
|
append_string("(");
|
395
380
|
}
|
396
381
|
else if (!in_declaration && (list->separator() == SASS_HASH ||
|
@@ -432,7 +417,7 @@ namespace Sass {
|
|
432
417
|
!list->from_selector() &&
|
433
418
|
!dynamic_cast<List*>((*list)[0]) &&
|
434
419
|
!dynamic_cast<List*>((*list)[0]) &&
|
435
|
-
!dynamic_cast<
|
420
|
+
!dynamic_cast<CommaSequence_Selector*>((*list)[0])) {
|
436
421
|
append_string(",)");
|
437
422
|
}
|
438
423
|
else if (!in_declaration && (list->separator() == SASS_HASH ||
|
@@ -451,10 +436,8 @@ namespace Sass {
|
|
451
436
|
(output_style() == INSPECT) || (
|
452
437
|
expr->op().ws_before
|
453
438
|
&& (!expr->is_interpolant())
|
454
|
-
&& (
|
455
|
-
|
456
|
-
expr->is_right_interpolant()
|
457
|
-
)
|
439
|
+
&& (expr->is_left_interpolant() ||
|
440
|
+
expr->is_right_interpolant())
|
458
441
|
|
459
442
|
)) append_string(" ");
|
460
443
|
switch (expr->type()) {
|
@@ -477,10 +460,8 @@ namespace Sass {
|
|
477
460
|
(output_style() == INSPECT) || (
|
478
461
|
expr->op().ws_after
|
479
462
|
&& (!expr->is_interpolant())
|
480
|
-
&& (
|
481
|
-
|
482
|
-
|| expr->is_right_interpolant()
|
483
|
-
)
|
463
|
+
&& (expr->is_left_interpolant() ||
|
464
|
+
expr->is_right_interpolant())
|
484
465
|
)) append_string(" ");
|
485
466
|
expr->right()->perform(this);
|
486
467
|
}
|
@@ -895,10 +876,10 @@ namespace Sass {
|
|
895
876
|
|
896
877
|
void Inspect::operator()(Parent_Selector* p)
|
897
878
|
{
|
898
|
-
append_string("&");
|
879
|
+
if (p->is_real_parent_ref()) append_string("&");
|
899
880
|
}
|
900
881
|
|
901
|
-
void Inspect::operator()(
|
882
|
+
void Inspect::operator()(Placeholder_Selector* s)
|
902
883
|
{
|
903
884
|
append_token(s->name(), s);
|
904
885
|
if (s->has_line_break()) append_optional_linefeed();
|
@@ -906,12 +887,19 @@ namespace Sass {
|
|
906
887
|
|
907
888
|
}
|
908
889
|
|
909
|
-
void Inspect::operator()(
|
890
|
+
void Inspect::operator()(Element_Selector* s)
|
910
891
|
{
|
911
892
|
append_token(s->ns_name(), s);
|
912
893
|
}
|
913
894
|
|
914
|
-
void Inspect::operator()(
|
895
|
+
void Inspect::operator()(Class_Selector* s)
|
896
|
+
{
|
897
|
+
append_token(s->ns_name(), s);
|
898
|
+
if (s->has_line_break()) append_optional_linefeed();
|
899
|
+
if (s->has_line_break()) append_indentation();
|
900
|
+
}
|
901
|
+
|
902
|
+
void Inspect::operator()(Id_Selector* s)
|
915
903
|
{
|
916
904
|
append_token(s->ns_name(), s);
|
917
905
|
if (s->has_line_break()) append_optional_linefeed();
|
@@ -957,7 +945,7 @@ namespace Sass {
|
|
957
945
|
in_wrapped = was;
|
958
946
|
}
|
959
947
|
|
960
|
-
void Inspect::operator()(
|
948
|
+
void Inspect::operator()(SimpleSequence_Selector* s)
|
961
949
|
{
|
962
950
|
for (size_t i = 0, L = s->length(); i < L; ++i) {
|
963
951
|
(*s)[i]->perform(this);
|
@@ -969,13 +957,13 @@ namespace Sass {
|
|
969
957
|
}
|
970
958
|
}
|
971
959
|
|
972
|
-
void Inspect::operator()(
|
960
|
+
void Inspect::operator()(Sequence_Selector* c)
|
973
961
|
{
|
974
|
-
|
975
|
-
|
976
|
-
|
962
|
+
SimpleSequence_Selector* head = c->head();
|
963
|
+
Sequence_Selector* tail = c->tail();
|
964
|
+
Sequence_Selector::Combinator comb = c->combinator();
|
977
965
|
|
978
|
-
if (comb ==
|
966
|
+
if (comb == Sequence_Selector::ANCESTOR_OF && (!head || head->empty())) {
|
979
967
|
if (tail) tail->perform(this);
|
980
968
|
return;
|
981
969
|
}
|
@@ -990,30 +978,30 @@ namespace Sass {
|
|
990
978
|
if (head && head->length() != 0) head->perform(this);
|
991
979
|
bool is_empty = !head || head->length() == 0 || head->is_empty_reference();
|
992
980
|
bool is_tail = head && !head->is_empty_reference() && tail;
|
993
|
-
if (output_style() == COMPRESSED && comb !=
|
981
|
+
if (output_style() == COMPRESSED && comb != Sequence_Selector::ANCESTOR_OF) scheduled_space = 0;
|
994
982
|
|
995
983
|
switch (comb) {
|
996
|
-
case
|
984
|
+
case Sequence_Selector::ANCESTOR_OF:
|
997
985
|
if (is_tail) append_mandatory_space();
|
998
986
|
break;
|
999
|
-
case
|
987
|
+
case Sequence_Selector::PARENT_OF:
|
1000
988
|
append_optional_space();
|
1001
989
|
append_string(">");
|
1002
990
|
append_optional_space();
|
1003
991
|
break;
|
1004
|
-
case
|
992
|
+
case Sequence_Selector::ADJACENT_TO:
|
1005
993
|
append_optional_space();
|
1006
994
|
append_string("+");
|
1007
995
|
append_optional_space();
|
1008
996
|
break;
|
1009
|
-
case
|
997
|
+
case Sequence_Selector::REFERENCE:
|
1010
998
|
append_mandatory_space();
|
1011
999
|
append_string("/");
|
1012
1000
|
c->reference()->perform(this);
|
1013
1001
|
append_string("/");
|
1014
1002
|
append_mandatory_space();
|
1015
1003
|
break;
|
1016
|
-
case
|
1004
|
+
case Sequence_Selector::PRECEDES:
|
1017
1005
|
if (is_empty) append_optional_space();
|
1018
1006
|
else append_mandatory_space();
|
1019
1007
|
append_string("~");
|
@@ -1021,7 +1009,7 @@ namespace Sass {
|
|
1021
1009
|
else append_optional_space();
|
1022
1010
|
break;
|
1023
1011
|
}
|
1024
|
-
if (tail && comb !=
|
1012
|
+
if (tail && comb != Sequence_Selector::ANCESTOR_OF) {
|
1025
1013
|
if (c->has_line_break()) append_optional_linefeed();
|
1026
1014
|
}
|
1027
1015
|
if (tail) tail->perform(this);
|
@@ -1032,7 +1020,7 @@ namespace Sass {
|
|
1032
1020
|
}
|
1033
1021
|
}
|
1034
1022
|
|
1035
|
-
void Inspect::operator()(
|
1023
|
+
void Inspect::operator()(CommaSequence_Selector* g)
|
1036
1024
|
{
|
1037
1025
|
|
1038
1026
|
if (g->empty()) {
|
@@ -1047,7 +1035,7 @@ namespace Sass {
|
|
1047
1035
|
// probably ruby sass eqivalent of element_needs_parens
|
1048
1036
|
if (output_style() == TO_SASS && g->length() == 1 &&
|
1049
1037
|
(!dynamic_cast<List*>((*g)[0]) &&
|
1050
|
-
!dynamic_cast<
|
1038
|
+
!dynamic_cast<CommaSequence_Selector*>((*g)[0]))) {
|
1051
1039
|
append_string("(");
|
1052
1040
|
}
|
1053
1041
|
else if (!in_declaration && in_comma_array) {
|
@@ -1073,7 +1061,7 @@ namespace Sass {
|
|
1073
1061
|
// probably ruby sass eqivalent of element_needs_parens
|
1074
1062
|
if (output_style() == TO_SASS && g->length() == 1 &&
|
1075
1063
|
(!dynamic_cast<List*>((*g)[0]) &&
|
1076
|
-
!dynamic_cast<
|
1064
|
+
!dynamic_cast<CommaSequence_Selector*>((*g)[0]))) {
|
1077
1065
|
append_string(",)");
|
1078
1066
|
}
|
1079
1067
|
else if (!in_declaration && in_comma_array) {
|
data/ext/libsass/src/inspect.hpp
CHANGED
@@ -23,7 +23,6 @@ namespace Sass {
|
|
23
23
|
// statements
|
24
24
|
virtual void operator()(Block*);
|
25
25
|
virtual void operator()(Ruleset*);
|
26
|
-
virtual void operator()(Propset*);
|
27
26
|
virtual void operator()(Bubble*);
|
28
27
|
virtual void operator()(Supports_Block*);
|
29
28
|
virtual void operator()(Media_Block*);
|
@@ -82,15 +81,16 @@ namespace Sass {
|
|
82
81
|
virtual void operator()(Arguments*);
|
83
82
|
// selectors
|
84
83
|
virtual void operator()(Selector_Schema*);
|
85
|
-
virtual void operator()(
|
86
|
-
virtual void operator()(
|
87
|
-
virtual void operator()(
|
84
|
+
virtual void operator()(Placeholder_Selector*);
|
85
|
+
virtual void operator()(Element_Selector*);
|
86
|
+
virtual void operator()(Class_Selector*);
|
87
|
+
virtual void operator()(Id_Selector*);
|
88
88
|
virtual void operator()(Attribute_Selector*);
|
89
89
|
virtual void operator()(Pseudo_Selector*);
|
90
90
|
virtual void operator()(Wrapped_Selector*);
|
91
|
-
virtual void operator()(
|
92
|
-
virtual void operator()(
|
93
|
-
virtual void operator()(
|
91
|
+
virtual void operator()(SimpleSequence_Selector*);
|
92
|
+
virtual void operator()(Sequence_Selector*);
|
93
|
+
virtual void operator()(CommaSequence_Selector*);
|
94
94
|
|
95
95
|
// template <typename U>
|
96
96
|
// void fallback(U x) { fallback_impl(reinterpret_cast<AST_Node*>(x)); }
|
data/ext/libsass/src/json.cpp
CHANGED
@@ -399,7 +399,13 @@ char *json_encode_string(const char *str)
|
|
399
399
|
SB sb;
|
400
400
|
sb_init(&sb);
|
401
401
|
|
402
|
-
|
402
|
+
try {
|
403
|
+
emit_string(&sb, str);
|
404
|
+
}
|
405
|
+
catch (std::exception) {
|
406
|
+
sb_free(&sb);
|
407
|
+
throw;
|
408
|
+
}
|
403
409
|
|
404
410
|
return sb_finish(&sb);
|
405
411
|
}
|
@@ -409,10 +415,16 @@ char *json_stringify(const JsonNode *node, const char *space)
|
|
409
415
|
SB sb;
|
410
416
|
sb_init(&sb);
|
411
417
|
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
418
|
+
try {
|
419
|
+
if (space != NULL)
|
420
|
+
emit_value_indented(&sb, node, space, 0);
|
421
|
+
else
|
422
|
+
emit_value(&sb, node);
|
423
|
+
}
|
424
|
+
catch (std::exception) {
|
425
|
+
sb_free(&sb);
|
426
|
+
throw;
|
427
|
+
}
|
416
428
|
|
417
429
|
return sb_finish(&sb);
|
418
430
|
}
|
data/ext/libsass/src/lexer.cpp
CHANGED
@@ -81,9 +81,9 @@ namespace Sass {
|
|
81
81
|
bool is_nonascii(const char& chr)
|
82
82
|
{
|
83
83
|
return (
|
84
|
-
(unsigned(chr)
|
85
|
-
(unsigned(chr)
|
86
|
-
(unsigned(chr)
|
84
|
+
(unsigned(chr) >= 128 && unsigned(chr) <= 15572911) ||
|
85
|
+
(unsigned(chr) >= 15630464 && unsigned(chr) <= 15712189) ||
|
86
|
+
(unsigned(chr) >= 4036001920)
|
87
87
|
);
|
88
88
|
}
|
89
89
|
|
data/ext/libsass/src/listize.cpp
CHANGED
@@ -14,7 +14,7 @@ namespace Sass {
|
|
14
14
|
: mem(mem)
|
15
15
|
{ }
|
16
16
|
|
17
|
-
Expression* Listize::operator()(
|
17
|
+
Expression* Listize::operator()(CommaSequence_Selector* sel)
|
18
18
|
{
|
19
19
|
List* l = SASS_MEMORY_NEW(mem, List, sel->pstate(), sel->length(), SASS_COMMA);
|
20
20
|
l->from_selector(true);
|
@@ -26,7 +26,7 @@ namespace Sass {
|
|
26
26
|
return SASS_MEMORY_NEW(mem, Null, l->pstate());
|
27
27
|
}
|
28
28
|
|
29
|
-
Expression* Listize::operator()(
|
29
|
+
Expression* Listize::operator()(SimpleSequence_Selector* sel)
|
30
30
|
{
|
31
31
|
std::string str;
|
32
32
|
for (size_t i = 0, L = sel->length(); i < L; ++i) {
|
@@ -36,11 +36,11 @@ namespace Sass {
|
|
36
36
|
return SASS_MEMORY_NEW(mem, String_Quoted, sel->pstate(), str);
|
37
37
|
}
|
38
38
|
|
39
|
-
Expression* Listize::operator()(
|
39
|
+
Expression* Listize::operator()(Sequence_Selector* sel)
|
40
40
|
{
|
41
41
|
List* l = SASS_MEMORY_NEW(mem, List, sel->pstate(), 2);
|
42
42
|
l->from_selector(true);
|
43
|
-
|
43
|
+
SimpleSequence_Selector* head = sel->head();
|
44
44
|
if (head && !head->is_empty_reference())
|
45
45
|
{
|
46
46
|
Expression* hh = head->perform(this);
|
@@ -51,23 +51,23 @@ namespace Sass {
|
|
51
51
|
: sel->reference()->to_string();
|
52
52
|
switch(sel->combinator())
|
53
53
|
{
|
54
|
-
case
|
54
|
+
case Sequence_Selector::PARENT_OF:
|
55
55
|
*l << SASS_MEMORY_NEW(mem, String_Quoted, sel->pstate(), ">");
|
56
56
|
break;
|
57
|
-
case
|
57
|
+
case Sequence_Selector::ADJACENT_TO:
|
58
58
|
*l << SASS_MEMORY_NEW(mem, String_Quoted, sel->pstate(), "+");
|
59
59
|
break;
|
60
|
-
case
|
60
|
+
case Sequence_Selector::REFERENCE:
|
61
61
|
*l << SASS_MEMORY_NEW(mem, String_Quoted, sel->pstate(), "/" + reference + "/");
|
62
62
|
break;
|
63
|
-
case
|
63
|
+
case Sequence_Selector::PRECEDES:
|
64
64
|
*l << SASS_MEMORY_NEW(mem, String_Quoted, sel->pstate(), "~");
|
65
65
|
break;
|
66
|
-
case
|
66
|
+
case Sequence_Selector::ANCESTOR_OF:
|
67
67
|
break;
|
68
68
|
}
|
69
69
|
|
70
|
-
|
70
|
+
Sequence_Selector* tail = sel->tail();
|
71
71
|
if (tail)
|
72
72
|
{
|
73
73
|
Expression* tt = tail->perform(this);
|
data/ext/libsass/src/listize.hpp
CHANGED
@@ -24,9 +24,9 @@ namespace Sass {
|
|
24
24
|
Listize(Memory_Manager&);
|
25
25
|
~Listize() { }
|
26
26
|
|
27
|
-
Expression* operator()(
|
28
|
-
Expression* operator()(
|
29
|
-
Expression* operator()(
|
27
|
+
Expression* operator()(CommaSequence_Selector*);
|
28
|
+
Expression* operator()(Sequence_Selector*);
|
29
|
+
Expression* operator()(SimpleSequence_Selector*);
|
30
30
|
|
31
31
|
template <typename U>
|
32
32
|
Expression* fallback(U x) { return fallback_impl(x); }
|
data/ext/libsass/src/node.cpp
CHANGED
@@ -8,20 +8,20 @@
|
|
8
8
|
namespace Sass {
|
9
9
|
|
10
10
|
|
11
|
-
Node Node::createCombinator(const
|
11
|
+
Node Node::createCombinator(const Sequence_Selector::Combinator& combinator) {
|
12
12
|
NodeDequePtr null;
|
13
13
|
return Node(COMBINATOR, combinator, NULL /*pSelector*/, null /*pCollection*/);
|
14
14
|
}
|
15
15
|
|
16
16
|
|
17
|
-
Node Node::createSelector(
|
17
|
+
Node Node::createSelector(Sequence_Selector* pSelector, Context& ctx) {
|
18
18
|
NodeDequePtr null;
|
19
19
|
|
20
|
-
|
20
|
+
Sequence_Selector* pStripped = pSelector->clone(ctx);
|
21
21
|
pStripped->tail(NULL);
|
22
|
-
pStripped->combinator(
|
22
|
+
pStripped->combinator(Sequence_Selector::ANCESTOR_OF);
|
23
23
|
|
24
|
-
Node n(SELECTOR,
|
24
|
+
Node n(SELECTOR, Sequence_Selector::ANCESTOR_OF, pStripped, null /*pCollection*/);
|
25
25
|
if (pSelector) n.got_line_feed = pSelector->has_line_feed();
|
26
26
|
return n;
|
27
27
|
}
|
@@ -29,23 +29,23 @@ namespace Sass {
|
|
29
29
|
|
30
30
|
Node Node::createCollection() {
|
31
31
|
NodeDequePtr pEmptyCollection = std::make_shared<NodeDeque>();
|
32
|
-
return Node(COLLECTION,
|
32
|
+
return Node(COLLECTION, Sequence_Selector::ANCESTOR_OF, NULL /*pSelector*/, pEmptyCollection);
|
33
33
|
}
|
34
34
|
|
35
35
|
|
36
36
|
Node Node::createCollection(const NodeDeque& values) {
|
37
37
|
NodeDequePtr pShallowCopiedCollection = std::make_shared<NodeDeque>(values);
|
38
|
-
return Node(COLLECTION,
|
38
|
+
return Node(COLLECTION, Sequence_Selector::ANCESTOR_OF, NULL /*pSelector*/, pShallowCopiedCollection);
|
39
39
|
}
|
40
40
|
|
41
41
|
|
42
42
|
Node Node::createNil() {
|
43
43
|
NodeDequePtr null;
|
44
|
-
return Node(NIL,
|
44
|
+
return Node(NIL, Sequence_Selector::ANCESTOR_OF, NULL /*pSelector*/, null /*pCollection*/);
|
45
45
|
}
|
46
46
|
|
47
47
|
|
48
|
-
Node::Node(const TYPE& type,
|
48
|
+
Node::Node(const TYPE& type, Sequence_Selector::Combinator combinator, Sequence_Selector* pSelector, NodeDequePtr& pCollection)
|
49
49
|
: got_line_feed(false), mType(type), mCombinator(combinator), mpSelector(pSelector), mpCollection(pCollection)
|
50
50
|
{ if (pSelector) got_line_feed = pSelector->has_line_feed(); }
|
51
51
|
|
@@ -140,11 +140,11 @@ namespace Sass {
|
|
140
140
|
if (node.isCombinator()) {
|
141
141
|
|
142
142
|
switch (node.combinator()) {
|
143
|
-
case
|
144
|
-
case
|
145
|
-
case
|
146
|
-
case
|
147
|
-
case
|
143
|
+
case Sequence_Selector::ANCESTOR_OF: os << "\" \""; break;
|
144
|
+
case Sequence_Selector::PARENT_OF: os << "\">\""; break;
|
145
|
+
case Sequence_Selector::PRECEDES: os << "\"~\""; break;
|
146
|
+
case Sequence_Selector::ADJACENT_TO: os << "\"+\""; break;
|
147
|
+
case Sequence_Selector::REFERENCE: os << "\"/\""; break;
|
148
148
|
}
|
149
149
|
|
150
150
|
} else if (node.isNil()) {
|
@@ -177,7 +177,7 @@ namespace Sass {
|
|
177
177
|
#endif
|
178
178
|
|
179
179
|
|
180
|
-
Node complexSelectorToNode(
|
180
|
+
Node complexSelectorToNode(Sequence_Selector* pToConvert, Context& ctx) {
|
181
181
|
if (pToConvert == NULL) {
|
182
182
|
return Node::createNil();
|
183
183
|
}
|
@@ -187,7 +187,7 @@ namespace Sass {
|
|
187
187
|
|
188
188
|
// unwrap the selector from parent ref
|
189
189
|
if (pToConvert->head() && pToConvert->head()->has_parent_ref()) {
|
190
|
-
|
190
|
+
Sequence_Selector* tail = pToConvert->tail();
|
191
191
|
if (tail) tail->has_line_feed(pToConvert->has_line_feed());
|
192
192
|
pToConvert = tail;
|
193
193
|
}
|
@@ -199,14 +199,14 @@ namespace Sass {
|
|
199
199
|
if (pToConvert->head() == NULL || empty_parent_ref) {
|
200
200
|
}
|
201
201
|
|
202
|
-
// the first
|
202
|
+
// the first Sequence_Selector may contain a dummy head pointer, skip it.
|
203
203
|
if (pToConvert->head() != NULL && !empty_parent_ref) {
|
204
204
|
node.collection()->push_back(Node::createSelector(pToConvert, ctx));
|
205
205
|
if (has_lf) node.collection()->back().got_line_feed = has_lf;
|
206
206
|
has_lf = false;
|
207
207
|
}
|
208
208
|
|
209
|
-
if (pToConvert->combinator() !=
|
209
|
+
if (pToConvert->combinator() != Sequence_Selector::ANCESTOR_OF) {
|
210
210
|
node.collection()->push_back(Node::createCombinator(pToConvert->combinator()));
|
211
211
|
if (has_lf) node.collection()->back().got_line_feed = has_lf;
|
212
212
|
has_lf = false;
|
@@ -223,14 +223,14 @@ namespace Sass {
|
|
223
223
|
}
|
224
224
|
|
225
225
|
|
226
|
-
|
226
|
+
Sequence_Selector* nodeToComplexSelector(const Node& toConvert, Context& ctx) {
|
227
227
|
if (toConvert.isNil()) {
|
228
228
|
return NULL;
|
229
229
|
}
|
230
230
|
|
231
231
|
|
232
232
|
if (!toConvert.isCollection()) {
|
233
|
-
throw "The node to convert to a
|
233
|
+
throw "The node to convert to a Sequence_Selector* must be a collection type or nil.";
|
234
234
|
}
|
235
235
|
|
236
236
|
|
@@ -238,9 +238,9 @@ namespace Sass {
|
|
238
238
|
|
239
239
|
std::string noPath("");
|
240
240
|
Position noPosition(-1, -1, -1);
|
241
|
-
|
241
|
+
Sequence_Selector* pFirst = SASS_MEMORY_NEW(ctx.mem, Sequence_Selector, ParserState("[NODE]"), Sequence_Selector::ANCESTOR_OF, NULL, NULL);
|
242
242
|
|
243
|
-
|
243
|
+
Sequence_Selector* pCurrent = pFirst;
|
244
244
|
|
245
245
|
if (toConvert.isSelector()) pFirst->has_line_feed(toConvert.got_line_feed);
|
246
246
|
if (toConvert.isCombinator()) pFirst->has_line_feed(toConvert.got_line_feed);
|
@@ -257,11 +257,11 @@ namespace Sass {
|
|
257
257
|
pCurrent->combinator(child.combinator());
|
258
258
|
if (child.got_line_feed) pCurrent->has_line_feed(child.got_line_feed);
|
259
259
|
|
260
|
-
// if the next node is also a combinator, create another
|
260
|
+
// if the next node is also a combinator, create another Sequence_Selector to hold it so it doesn't replace the current combinator
|
261
261
|
if (childIter+1 != childIterEnd) {
|
262
262
|
Node& nextNode = *(childIter+1);
|
263
263
|
if (nextNode.isCombinator()) {
|
264
|
-
pCurrent->tail(SASS_MEMORY_NEW(ctx.mem,
|
264
|
+
pCurrent->tail(SASS_MEMORY_NEW(ctx.mem, Sequence_Selector, ParserState("[NODE]"), Sequence_Selector::ANCESTOR_OF, NULL, NULL));
|
265
265
|
if (nextNode.got_line_feed) pCurrent->tail()->has_line_feed(nextNode.got_line_feed);
|
266
266
|
pCurrent = pCurrent->tail();
|
267
267
|
}
|
@@ -271,8 +271,8 @@ namespace Sass {
|
|
271
271
|
}
|
272
272
|
}
|
273
273
|
|
274
|
-
// Put the dummy
|
275
|
-
|
274
|
+
// Put the dummy SimpleSequence_Selector in the first position, for consistency with the rest of libsass
|
275
|
+
SimpleSequence_Selector* fakeHead = SASS_MEMORY_NEW(ctx.mem, SimpleSequence_Selector, ParserState("[NODE]"), 1);
|
276
276
|
Parent_Selector* selectorRef = SASS_MEMORY_NEW(ctx.mem, Parent_Selector, ParserState("[NODE]"));
|
277
277
|
fakeHead->elements().push_back(selectorRef);
|
278
278
|
if (toConvert.got_line_feed) pFirst->has_line_feed(toConvert.got_line_feed);
|
@@ -282,11 +282,11 @@ namespace Sass {
|
|
282
282
|
}
|
283
283
|
|
284
284
|
// A very naive trim function, which removes duplicates in a node
|
285
|
-
// This is only used in
|
285
|
+
// This is only used in Sequence_Selector::unify_with for now, may need modifications to fit other needs
|
286
286
|
Node Node::naiveTrim(Node& seqses, Context& ctx) {
|
287
287
|
|
288
288
|
std::vector<Node*> res;
|
289
|
-
std::vector<
|
289
|
+
std::vector<Sequence_Selector*> known;
|
290
290
|
|
291
291
|
NodeDeque::reverse_iterator seqsesIter = seqses.collection()->rbegin(),
|
292
292
|
seqsesIterEnd = seqses.collection()->rend();
|
@@ -295,8 +295,8 @@ namespace Sass {
|
|
295
295
|
{
|
296
296
|
Node& seqs1 = *seqsesIter;
|
297
297
|
if( seqs1.isSelector() ) {
|
298
|
-
|
299
|
-
std::vector<
|
298
|
+
Sequence_Selector* sel = seqs1.selector();
|
299
|
+
std::vector<Sequence_Selector*>::iterator it;
|
300
300
|
bool found = false;
|
301
301
|
for (it = known.begin(); it != known.end(); ++it) {
|
302
302
|
if (**it == *sel) { found = true; break; }
|