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
@@ -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; }
|