sassc 2.0.1 → 2.1.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.gitmodules +1 -1
- data/.travis.yml +7 -3
- data/CHANGELOG.md +3 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/README.md +1 -1
- data/Rakefile +23 -8
- data/ext/extconf.rb +39 -0
- data/ext/libsass/.gitignore +1 -0
- data/ext/libsass/GNUmakefile.am +23 -39
- data/ext/libsass/Makefile +56 -91
- data/ext/libsass/Makefile.conf +16 -2
- data/ext/libsass/configure.ac +8 -12
- data/ext/libsass/include/sass/base.h +1 -0
- data/ext/libsass/include/sass/context.h +1 -1
- data/ext/libsass/src/GNUmakefile.am +1 -5
- data/ext/libsass/src/ast.cpp +747 -2010
- data/ext/libsass/src/ast.hpp +239 -2383
- data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +62 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
- data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
- data/ext/libsass/src/ast_sel_unify.cpp +280 -0
- data/ext/libsass/src/ast_selectors.cpp +1475 -0
- data/ext/libsass/src/ast_selectors.hpp +568 -0
- data/ext/libsass/src/ast_supports.cpp +130 -0
- data/ext/libsass/src/ast_supports.hpp +121 -0
- data/ext/libsass/src/ast_values.cpp +967 -0
- data/ext/libsass/src/ast_values.hpp +489 -0
- data/ext/libsass/src/backtrace.cpp +4 -0
- data/ext/libsass/src/base64vlq.cpp +3 -0
- data/ext/libsass/src/bind.cpp +18 -17
- data/ext/libsass/src/bind.hpp +3 -1
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/cencode.c +2 -2
- data/ext/libsass/src/check_nesting.cpp +52 -56
- data/ext/libsass/src/check_nesting.hpp +35 -34
- data/ext/libsass/src/color_maps.cpp +156 -153
- data/ext/libsass/src/color_maps.hpp +152 -152
- data/ext/libsass/src/constants.cpp +15 -0
- data/ext/libsass/src/constants.hpp +13 -0
- data/ext/libsass/src/context.cpp +24 -14
- data/ext/libsass/src/context.hpp +6 -6
- data/ext/libsass/src/cssize.cpp +69 -71
- data/ext/libsass/src/cssize.hpp +50 -50
- data/ext/libsass/src/debugger.hpp +117 -110
- data/ext/libsass/src/emitter.cpp +13 -12
- data/ext/libsass/src/emitter.hpp +13 -9
- data/ext/libsass/src/environment.cpp +15 -1
- data/ext/libsass/src/environment.hpp +6 -0
- data/ext/libsass/src/error_handling.cpp +36 -59
- data/ext/libsass/src/error_handling.hpp +29 -16
- data/ext/libsass/src/eval.cpp +302 -323
- data/ext/libsass/src/eval.hpp +64 -55
- data/ext/libsass/src/expand.cpp +94 -88
- data/ext/libsass/src/expand.hpp +33 -37
- data/ext/libsass/src/extend.cpp +38 -36
- data/ext/libsass/src/extend.hpp +15 -15
- data/ext/libsass/src/file.cpp +34 -2
- data/ext/libsass/src/fn_colors.cpp +594 -0
- data/ext/libsass/src/fn_colors.hpp +85 -0
- data/ext/libsass/src/fn_lists.cpp +284 -0
- data/ext/libsass/src/fn_lists.hpp +34 -0
- data/ext/libsass/src/fn_maps.cpp +94 -0
- data/ext/libsass/src/fn_maps.hpp +30 -0
- data/ext/libsass/src/fn_miscs.cpp +256 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +220 -0
- data/ext/libsass/src/fn_numbers.hpp +45 -0
- data/ext/libsass/src/fn_selectors.cpp +235 -0
- data/ext/libsass/src/fn_selectors.hpp +35 -0
- data/ext/libsass/src/fn_strings.cpp +254 -0
- data/ext/libsass/src/fn_strings.hpp +34 -0
- data/ext/libsass/src/fn_utils.cpp +156 -0
- data/ext/libsass/src/fn_utils.hpp +56 -0
- data/ext/libsass/src/inspect.cpp +101 -152
- data/ext/libsass/src/inspect.hpp +69 -73
- data/ext/libsass/src/json.cpp +2 -2
- data/ext/libsass/src/lexer.cpp +6 -3
- data/ext/libsass/src/listize.cpp +9 -11
- data/ext/libsass/src/listize.hpp +11 -7
- data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
- data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
- data/ext/libsass/src/node.cpp +13 -10
- data/ext/libsass/src/node.hpp +3 -3
- data/ext/libsass/src/operation.hpp +184 -144
- data/ext/libsass/src/operators.cpp +43 -17
- data/ext/libsass/src/operators.hpp +5 -5
- data/ext/libsass/src/output.cpp +21 -18
- data/ext/libsass/src/output.hpp +14 -21
- data/ext/libsass/src/parser.cpp +215 -183
- data/ext/libsass/src/parser.hpp +28 -24
- data/ext/libsass/src/plugins.cpp +5 -1
- data/ext/libsass/src/position.cpp +3 -0
- data/ext/libsass/src/prelexer.cpp +9 -3
- data/ext/libsass/src/prelexer.hpp +9 -9
- data/ext/libsass/src/remove_placeholders.cpp +14 -11
- data/ext/libsass/src/remove_placeholders.hpp +8 -9
- data/ext/libsass/src/sass.cpp +9 -3
- data/ext/libsass/src/sass.hpp +12 -9
- data/ext/libsass/src/sass2scss.cpp +45 -14
- data/ext/libsass/src/sass_context.cpp +18 -15
- data/ext/libsass/src/sass_functions.cpp +6 -3
- data/ext/libsass/src/sass_functions.hpp +1 -1
- data/ext/libsass/src/sass_util.cpp +3 -0
- data/ext/libsass/src/sass_values.cpp +21 -13
- data/ext/libsass/src/source_map.cpp +5 -2
- data/ext/libsass/src/source_map.hpp +2 -2
- data/ext/libsass/src/subset_map.cpp +4 -1
- data/ext/libsass/src/to_value.cpp +23 -21
- data/ext/libsass/src/to_value.hpp +18 -22
- data/ext/libsass/src/units.cpp +4 -0
- data/ext/libsass/src/units.hpp +1 -0
- data/ext/libsass/src/utf8/checked.h +12 -10
- data/ext/libsass/src/utf8/core.h +3 -0
- data/ext/libsass/src/utf8_string.cpp +3 -0
- data/ext/libsass/src/util.cpp +67 -75
- data/ext/libsass/src/util.hpp +64 -19
- data/ext/libsass/src/util_string.cpp +75 -0
- data/ext/libsass/src/util_string.hpp +19 -0
- data/ext/libsass/src/values.cpp +22 -13
- data/ext/libsass/src/values.hpp +2 -2
- data/ext/libsass/win/libsass.targets +30 -4
- data/ext/libsass/win/libsass.vcxproj.filters +82 -4
- data/lib/sassc.rb +24 -0
- data/lib/sassc/engine.rb +2 -2
- data/lib/sassc/native.rb +8 -1
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +19 -11
- data/test/engine_test.rb +26 -1
- data/test/native_test.rb +1 -1
- metadata +66 -72
- data/ext/Rakefile +0 -3
- data/ext/libsass/.github/CONTRIBUTING.md +0 -65
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
- data/ext/libsass/.travis.yml +0 -64
- data/ext/libsass/Readme.md +0 -104
- data/ext/libsass/SECURITY.md +0 -10
- data/ext/libsass/appveyor.yml +0 -91
- data/ext/libsass/docs/README.md +0 -20
- data/ext/libsass/docs/api-context-example.md +0 -45
- data/ext/libsass/docs/api-context-internal.md +0 -163
- data/ext/libsass/docs/api-context.md +0 -295
- data/ext/libsass/docs/api-doc.md +0 -215
- data/ext/libsass/docs/api-function-example.md +0 -67
- data/ext/libsass/docs/api-function-internal.md +0 -8
- data/ext/libsass/docs/api-function.md +0 -74
- data/ext/libsass/docs/api-importer-example.md +0 -112
- data/ext/libsass/docs/api-importer-internal.md +0 -20
- data/ext/libsass/docs/api-importer.md +0 -86
- data/ext/libsass/docs/api-value-example.md +0 -55
- data/ext/libsass/docs/api-value-internal.md +0 -76
- data/ext/libsass/docs/api-value.md +0 -154
- data/ext/libsass/docs/build-on-darwin.md +0 -27
- data/ext/libsass/docs/build-on-gentoo.md +0 -55
- data/ext/libsass/docs/build-on-windows.md +0 -139
- data/ext/libsass/docs/build-shared-library.md +0 -35
- data/ext/libsass/docs/build-with-autotools.md +0 -78
- data/ext/libsass/docs/build-with-makefiles.md +0 -68
- data/ext/libsass/docs/build-with-mingw.md +0 -107
- data/ext/libsass/docs/build-with-visual-studio.md +0 -90
- data/ext/libsass/docs/build.md +0 -97
- data/ext/libsass/docs/compatibility-plan.md +0 -48
- data/ext/libsass/docs/contributing.md +0 -17
- data/ext/libsass/docs/custom-functions-internal.md +0 -122
- data/ext/libsass/docs/dev-ast-memory.md +0 -223
- data/ext/libsass/docs/implementations.md +0 -56
- data/ext/libsass/docs/plugins.md +0 -47
- data/ext/libsass/docs/setup-environment.md +0 -68
- data/ext/libsass/docs/source-map-internals.md +0 -51
- data/ext/libsass/docs/trace.md +0 -26
- data/ext/libsass/docs/triage.md +0 -17
- data/ext/libsass/docs/unicode.md +0 -39
- data/ext/libsass/extconf.rb +0 -6
- data/ext/libsass/script/bootstrap +0 -13
- data/ext/libsass/script/branding +0 -10
- data/ext/libsass/script/ci-build-libsass +0 -134
- data/ext/libsass/script/ci-build-plugin +0 -62
- data/ext/libsass/script/ci-install-compiler +0 -6
- data/ext/libsass/script/ci-install-deps +0 -20
- data/ext/libsass/script/ci-report-coverage +0 -42
- data/ext/libsass/script/spec +0 -5
- data/ext/libsass/script/tap-driver +0 -652
- data/ext/libsass/script/tap-runner +0 -1
- data/ext/libsass/script/test-leaks.pl +0 -103
- data/ext/libsass/src/functions.cpp +0 -2234
- data/ext/libsass/src/functions.hpp +0 -198
- data/ext/libsass/src/to_c.hpp +0 -39
- data/ext/libsass/test/test_node.cpp +0 -94
- data/ext/libsass/test/test_paths.cpp +0 -28
- data/ext/libsass/test/test_selector_difference.cpp +0 -25
- data/ext/libsass/test/test_specificity.cpp +0 -25
- data/ext/libsass/test/test_subset_map.cpp +0 -472
- data/ext/libsass/test/test_superselector.cpp +0 -69
- data/ext/libsass/test/test_unification.cpp +0 -31
- data/lib/tasks/libsass.rb +0 -33
data/ext/libsass/src/expand.hpp
CHANGED
@@ -15,7 +15,7 @@ namespace Sass {
|
|
15
15
|
class Eval;
|
16
16
|
struct Backtrace;
|
17
17
|
|
18
|
-
class Expand : public Operation_CRTP<
|
18
|
+
class Expand : public Operation_CRTP<Statement*, Expand> {
|
19
19
|
public:
|
20
20
|
|
21
21
|
Env* environment();
|
@@ -30,51 +30,47 @@ namespace Sass {
|
|
30
30
|
bool old_at_root_without_rule;
|
31
31
|
|
32
32
|
// it's easier to work with vectors
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
EnvStack env_stack;
|
34
|
+
BlockStack block_stack;
|
35
|
+
CallStack call_stack;
|
36
|
+
SelectorStack selector_stack;
|
37
|
+
MediaStack media_stack;
|
38
38
|
|
39
39
|
Boolean_Obj bool_true;
|
40
40
|
|
41
|
-
Statement_Ptr fallback_impl(AST_Node_Ptr n);
|
42
|
-
|
43
41
|
private:
|
44
42
|
void expand_selector_list(Selector_Obj, Selector_List_Obj extender);
|
45
43
|
|
46
44
|
public:
|
47
|
-
Expand(Context&, Env*,
|
45
|
+
Expand(Context&, Env*, SelectorStack* stack = NULL);
|
48
46
|
~Expand() { }
|
49
47
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
void append_block(Block_Ptr);
|
48
|
+
Block* operator()(Block*);
|
49
|
+
Statement* operator()(Ruleset*);
|
50
|
+
Statement* operator()(Media_Block*);
|
51
|
+
Statement* operator()(Supports_Block*);
|
52
|
+
Statement* operator()(At_Root_Block*);
|
53
|
+
Statement* operator()(Directive*);
|
54
|
+
Statement* operator()(Declaration*);
|
55
|
+
Statement* operator()(Assignment*);
|
56
|
+
Statement* operator()(Import*);
|
57
|
+
Statement* operator()(Import_Stub*);
|
58
|
+
Statement* operator()(Warning*);
|
59
|
+
Statement* operator()(Error*);
|
60
|
+
Statement* operator()(Debug*);
|
61
|
+
Statement* operator()(Comment*);
|
62
|
+
Statement* operator()(If*);
|
63
|
+
Statement* operator()(For*);
|
64
|
+
Statement* operator()(Each*);
|
65
|
+
Statement* operator()(While*);
|
66
|
+
Statement* operator()(Return*);
|
67
|
+
Statement* operator()(Extension*);
|
68
|
+
Statement* operator()(Definition*);
|
69
|
+
Statement* operator()(Mixin_Call*);
|
70
|
+
Statement* operator()(Content*);
|
71
|
+
|
72
|
+
void append_block(Block*);
|
73
|
+
|
78
74
|
};
|
79
75
|
|
80
76
|
}
|
data/ext/libsass/src/extend.cpp
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
1
3
|
#include "sass.hpp"
|
4
|
+
|
2
5
|
#include "extend.hpp"
|
3
6
|
#include "context.hpp"
|
4
7
|
#include "backtrace.hpp"
|
@@ -111,7 +114,7 @@ namespace Sass {
|
|
111
114
|
}
|
112
115
|
|
113
116
|
// Print a string representation of a Compound_Selector
|
114
|
-
static void printCompoundSelector(
|
117
|
+
static void printCompoundSelector(Compound_Selector* pCompoundSelector, const char* message=NULL, bool newline=true) {
|
115
118
|
|
116
119
|
if (message) {
|
117
120
|
std::cerr << message;
|
@@ -132,7 +135,7 @@ namespace Sass {
|
|
132
135
|
std::ostream& operator<<(std::ostream& os, Complex_Selector& complexSelector) {
|
133
136
|
|
134
137
|
os << "[";
|
135
|
-
|
138
|
+
Complex_Selector* pIter = &complexSelector;
|
136
139
|
bool first = true;
|
137
140
|
while (pIter) {
|
138
141
|
if (pIter->combinator() != Complex_Selector::ANCESTOR_OF) {
|
@@ -163,7 +166,7 @@ namespace Sass {
|
|
163
166
|
|
164
167
|
|
165
168
|
// Print a string representation of a Complex_Selector
|
166
|
-
static void printComplexSelector(
|
169
|
+
static void printComplexSelector(Complex_Selector* pComplexSelector, const char* message=NULL, bool newline=true) {
|
167
170
|
|
168
171
|
if (message) {
|
169
172
|
std::cerr << message;
|
@@ -194,8 +197,8 @@ namespace Sass {
|
|
194
197
|
std::cerr << ", ";
|
195
198
|
}
|
196
199
|
std::cerr << "[";
|
197
|
-
|
198
|
-
|
200
|
+
Compound_Selector* pSels = pair.first;
|
201
|
+
Complex_Selector* pNewSelector = pair.second;
|
199
202
|
std::cerr << "[" << *pSels << "], ";
|
200
203
|
printComplexSelector(pNewSelector, NULL, false);
|
201
204
|
}
|
@@ -218,7 +221,7 @@ namespace Sass {
|
|
218
221
|
typedef std::deque<std::string> SourceStrings;
|
219
222
|
SourceStrings sourceStrings;
|
220
223
|
for (ComplexSelectorSet::iterator iterator = sources.begin(), iteratorEnd = sources.end(); iterator != iteratorEnd; ++iterator) {
|
221
|
-
|
224
|
+
Complex_Selector* pSource = *iterator;
|
222
225
|
std::stringstream sstream;
|
223
226
|
sstream << complexSelectorToNode(pSource);
|
224
227
|
sourceStrings.push_back(sstream.str());
|
@@ -280,13 +283,13 @@ namespace Sass {
|
|
280
283
|
}
|
281
284
|
#endif
|
282
285
|
|
283
|
-
static bool parentSuperselector(
|
286
|
+
static bool parentSuperselector(Complex_Selector* pOne, Complex_Selector* pTwo) {
|
284
287
|
// TODO: figure out a better way to create a Complex_Selector from scratch
|
285
288
|
// TODO: There's got to be a better way. This got ugly quick...
|
286
|
-
|
289
|
+
Type_Selector_Obj fakeParent = SASS_MEMORY_NEW(Type_Selector, ParserState("[FAKE]"), "temp");
|
287
290
|
Compound_Selector_Obj fakeHead = SASS_MEMORY_NEW(Compound_Selector, ParserState("[FAKE]"), 1 /*size*/);
|
288
291
|
fakeHead->elements().push_back(fakeParent);
|
289
|
-
Complex_Selector_Obj fakeParentContainer = SASS_MEMORY_NEW(Complex_Selector, ParserState("[FAKE]"), Complex_Selector::ANCESTOR_OF, fakeHead /*head*/,
|
292
|
+
Complex_Selector_Obj fakeParentContainer = SASS_MEMORY_NEW(Complex_Selector, ParserState("[FAKE]"), Complex_Selector::ANCESTOR_OF, fakeHead /*head*/, {} /*tail*/);
|
290
293
|
|
291
294
|
pOne->set_innermost(fakeParentContainer, Complex_Selector::ANCESTOR_OF);
|
292
295
|
pTwo->set_innermost(fakeParentContainer, Complex_Selector::ANCESTOR_OF);
|
@@ -440,8 +443,8 @@ namespace Sass {
|
|
440
443
|
//DEBUG_PRINTLN(LCS, "LCS: X=" << x << " Y=" << y)
|
441
444
|
// TODO: make printComplexSelectorDeque and use DEBUG_EXEC AND DEBUG_PRINTLN HERE to get equivalent output
|
442
445
|
|
443
|
-
x.push_front(
|
444
|
-
y.push_front(
|
446
|
+
x.push_front({});
|
447
|
+
y.push_front({});
|
445
448
|
|
446
449
|
LCSTable table;
|
447
450
|
lcs_table(x, y, comparator, table);
|
@@ -643,10 +646,10 @@ namespace Sass {
|
|
643
646
|
static bool parentSuperselector(const Node& one, const Node& two) {
|
644
647
|
// TODO: figure out a better way to create a Complex_Selector from scratch
|
645
648
|
// TODO: There's got to be a better way. This got ugly quick...
|
646
|
-
|
649
|
+
Type_Selector_Obj fakeParent = SASS_MEMORY_NEW(Type_Selector, ParserState("[FAKE]"), "temp");
|
647
650
|
Compound_Selector_Obj fakeHead = SASS_MEMORY_NEW(Compound_Selector, ParserState("[FAKE]"), 1 /*size*/);
|
648
651
|
fakeHead->elements().push_back(fakeParent);
|
649
|
-
Complex_Selector_Obj fakeParentContainer = SASS_MEMORY_NEW(Complex_Selector, ParserState("[FAKE]"), Complex_Selector::ANCESTOR_OF, fakeHead /*head*/,
|
652
|
+
Complex_Selector_Obj fakeParentContainer = SASS_MEMORY_NEW(Complex_Selector, ParserState("[FAKE]"), Complex_Selector::ANCESTOR_OF, fakeHead /*head*/, {} /*tail*/);
|
650
653
|
|
651
654
|
Complex_Selector_Obj pOneWithFakeParent = nodeToComplexSelector(one);
|
652
655
|
pOneWithFakeParent->set_innermost(fakeParentContainer, Complex_Selector::ANCESTOR_OF);
|
@@ -977,7 +980,7 @@ namespace Sass {
|
|
977
980
|
|
978
981
|
Complex_Selector_Obj pMergedWrapper = SASS_MEMORY_CLONE(sel1.selector()); // Clone the Complex_Selector to get back to something we can transform to a node once we replace the head with the unification result
|
979
982
|
// TODO: does subject matter? Ruby: return unless merged = sel1.unify(sel2.members, sel2.subject?)
|
980
|
-
|
983
|
+
Compound_Selector* pMerged = sel1.selector()->head()->unify_with(sel2.selector()->head());
|
981
984
|
pMergedWrapper->head(pMerged);
|
982
985
|
|
983
986
|
DEBUG_EXEC(ALL, printCompoundSelector(pMerged, "MERGED: "))
|
@@ -1034,7 +1037,7 @@ namespace Sass {
|
|
1034
1037
|
|
1035
1038
|
Complex_Selector_Obj pMergedWrapper = SASS_MEMORY_CLONE(plusSel.selector()); // Clone the Complex_Selector to get back to something we can transform to a node once we replace the head with the unification result
|
1036
1039
|
// TODO: does subject matter? Ruby: merged = plus_sel.unify(tilde_sel.members, tilde_sel.subject?)
|
1037
|
-
|
1040
|
+
Compound_Selector* pMerged = plusSel.selector()->head()->unify_with(tildeSel.selector()->head());
|
1038
1041
|
pMergedWrapper->head(pMerged);
|
1039
1042
|
|
1040
1043
|
DEBUG_EXEC(ALL, printCompoundSelector(pMerged, "MERGED: "))
|
@@ -1083,7 +1086,7 @@ namespace Sass {
|
|
1083
1086
|
|
1084
1087
|
Complex_Selector_Obj pMergedWrapper = SASS_MEMORY_CLONE(sel1.selector()); // Clone the Complex_Selector to get back to something we can transform to a node once we replace the head with the unification result
|
1085
1088
|
// TODO: does subject matter? Ruby: return unless merged = sel1.unify(sel2.members, sel2.subject?)
|
1086
|
-
|
1089
|
+
Compound_Selector* pMerged = sel1.selector()->head()->unify_with(sel2.selector()->head());
|
1087
1090
|
pMergedWrapper->head(pMerged);
|
1088
1091
|
|
1089
1092
|
DEBUG_EXEC(ALL, printCompoundSelector(pMerged, "MERGED: "))
|
@@ -1517,7 +1520,7 @@ namespace Sass {
|
|
1517
1520
|
return pSelector;
|
1518
1521
|
}
|
1519
1522
|
};
|
1520
|
-
Node Extend::extendCompoundSelector(
|
1523
|
+
Node Extend::extendCompoundSelector(Compound_Selector* pSelector, CompoundSelectorSet& seen, bool isReplace) {
|
1521
1524
|
|
1522
1525
|
/* this turned out to be too much overhead
|
1523
1526
|
probably due to holding a "Node" object
|
@@ -1561,7 +1564,7 @@ namespace Sass {
|
|
1561
1564
|
DEBUG_EXEC(EXTEND_COMPOUND, printCompoundSelector(pSels, "SELS: "))
|
1562
1565
|
|
1563
1566
|
// The selector up to where the @extend is (ie, the thing to merge)
|
1564
|
-
|
1567
|
+
Complex_Selector* pExtComplexSelector = seq;
|
1565
1568
|
|
1566
1569
|
// TODO: This can return a Compound_Selector with no elements. Should that just be returning NULL?
|
1567
1570
|
// RUBY: self_without_sel = Sass::Util.array_minus(members, sels)
|
@@ -1595,7 +1598,7 @@ namespace Sass {
|
|
1595
1598
|
// out and aren't operated on.
|
1596
1599
|
Complex_Selector_Obj pNewSelector = SASS_MEMORY_CLONE(pExtComplexSelector); // ->first();
|
1597
1600
|
|
1598
|
-
Complex_Selector_Obj pNewInnerMost = SASS_MEMORY_NEW(Complex_Selector, pSelector->pstate(), Complex_Selector::ANCESTOR_OF, pUnifiedSelector,
|
1601
|
+
Complex_Selector_Obj pNewInnerMost = SASS_MEMORY_NEW(Complex_Selector, pSelector->pstate(), Complex_Selector::ANCESTOR_OF, pUnifiedSelector, {});
|
1599
1602
|
|
1600
1603
|
Complex_Selector::Combinator combinator = pNewSelector->clear_innermost();
|
1601
1604
|
pNewSelector->set_innermost(pNewInnerMost, combinator);
|
@@ -1685,7 +1688,7 @@ namespace Sass {
|
|
1685
1688
|
|
1686
1689
|
|
1687
1690
|
// check if selector has something to be extended by subset_map
|
1688
|
-
bool Extend::complexSelectorHasExtension(
|
1691
|
+
bool Extend::complexSelectorHasExtension(Complex_Selector* selector, CompoundSelectorSet& seen) {
|
1689
1692
|
|
1690
1693
|
bool hasExtension = false;
|
1691
1694
|
|
@@ -1741,7 +1744,7 @@ namespace Sass {
|
|
1741
1744
|
the combinator and compound selector are one unit
|
1742
1745
|
next [[sseq_or_op]] unless sseq_or_op.is_a?(SimpleSequence)
|
1743
1746
|
*/
|
1744
|
-
Node Extend::extendComplexSelector(
|
1747
|
+
Node Extend::extendComplexSelector(Complex_Selector* selector, CompoundSelectorSet& seen, bool isReplace, bool isOriginal) {
|
1745
1748
|
|
1746
1749
|
// check if we already extended this selector
|
1747
1750
|
// we can do this since subset_map is "static"
|
@@ -1851,8 +1854,7 @@ namespace Sass {
|
|
1851
1854
|
// Ruby Equivalent: flatten
|
1852
1855
|
Node flattened(flatten(trimmed, 1));
|
1853
1856
|
|
1854
|
-
DEBUG_PRINTLN(EXTEND_COMPLEX, "
|
1855
|
-
DEBUG_PRINTLN(EXTEND_COMPLEX, "EXTEND COMPLEX END: " << complexSelector)
|
1857
|
+
DEBUG_PRINTLN(EXTEND_COMPLEX, "FLATTENED: " << flattened)
|
1856
1858
|
|
1857
1859
|
// memory results in a map table - since extending is very expensive
|
1858
1860
|
memoizeComplex.insert(std::pair<Complex_Selector_Obj, Node>(selector, flattened));
|
@@ -1868,7 +1870,7 @@ namespace Sass {
|
|
1868
1870
|
*/
|
1869
1871
|
// We get a selector list with has something to extend and a subset_map with
|
1870
1872
|
// all extenders. Pick the ones that match our selectors in the list.
|
1871
|
-
|
1873
|
+
Selector_List* Extend::extendSelectorList(Selector_List_Obj pSelectorList, bool isReplace, bool& extendedSomething, CompoundSelectorSet& seen) {
|
1872
1874
|
|
1873
1875
|
Selector_List_Obj pNewSelectors = SASS_MEMORY_NEW(Selector_List, pSelectorList->pstate(), pSelectorList->length());
|
1874
1876
|
|
@@ -1943,7 +1945,7 @@ namespace Sass {
|
|
1943
1945
|
// special case for ruby ass
|
1944
1946
|
if (sl->empty()) {
|
1945
1947
|
// this seems inconsistent but it is how ruby sass seems to remove parentheses
|
1946
|
-
cpy_head->append(SASS_MEMORY_NEW(
|
1948
|
+
cpy_head->append(SASS_MEMORY_NEW(Type_Selector, hs->pstate(), ws->name()));
|
1947
1949
|
}
|
1948
1950
|
// has wrapped not selectors
|
1949
1951
|
else if (ws->name() == ":not") {
|
@@ -1956,10 +1958,10 @@ namespace Sass {
|
|
1956
1958
|
Wrapped_Selector_Obj cpy_ws = SASS_MEMORY_COPY(ws);
|
1957
1959
|
Selector_List_Obj cpy_ws_sl = SASS_MEMORY_NEW(Selector_List, sl->pstate());
|
1958
1960
|
// remove parent selectors from inner selector
|
1959
|
-
Compound_Selector_Obj ext_head
|
1961
|
+
Compound_Selector_Obj ext_head;
|
1960
1962
|
if (ext_cs->first()) ext_head = ext_cs->first()->head();
|
1961
1963
|
if (ext_head && ext_head && ext_head->length() > 0) {
|
1962
|
-
cpy_ws_sl->append(ext_cs->
|
1964
|
+
cpy_ws_sl->append(ext_cs->mutable_first());
|
1963
1965
|
}
|
1964
1966
|
// assign list to clone
|
1965
1967
|
cpy_ws->selector(cpy_ws_sl);
|
@@ -2040,7 +2042,7 @@ namespace Sass {
|
|
2040
2042
|
// was is @extend that matches our selector. If we find one, we will go further
|
2041
2043
|
// and call the extend magic for our selector. The subset_map contains all blocks
|
2042
2044
|
// where @extend was found. Pick the ones that match our selector!
|
2043
|
-
void Extend::extendObjectWithSelectorAndBlock(
|
2045
|
+
void Extend::extendObjectWithSelectorAndBlock(Ruleset* pObject) {
|
2044
2046
|
|
2045
2047
|
DEBUG_PRINTLN(EXTEND_OBJECT, "FOUND SELECTOR: " << Cast<Selector_List>(pObject->selector())->to_string())
|
2046
2048
|
|
@@ -2075,7 +2077,7 @@ namespace Sass {
|
|
2075
2077
|
eval = &e;
|
2076
2078
|
}
|
2077
2079
|
|
2078
|
-
void Extend::operator()(
|
2080
|
+
void Extend::operator()(Block* b)
|
2079
2081
|
{
|
2080
2082
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
2081
2083
|
Statement_Obj stm = b->at(i);
|
@@ -2086,8 +2088,8 @@ namespace Sass {
|
|
2086
2088
|
if (b->is_root()) {
|
2087
2089
|
// debug_subset_map(subset_map);
|
2088
2090
|
for(auto const &it : subset_map.values()) {
|
2089
|
-
|
2090
|
-
|
2091
|
+
const Complex_Selector* sel = nullptr;
|
2092
|
+
const Compound_Selector* ext = nullptr;
|
2091
2093
|
if (it.first) sel = it.first->first();
|
2092
2094
|
if (it.second) ext = it.second;
|
2093
2095
|
if (ext && (ext->extended() || ext->is_optional())) continue;
|
@@ -2104,25 +2106,25 @@ namespace Sass {
|
|
2104
2106
|
|
2105
2107
|
}
|
2106
2108
|
|
2107
|
-
void Extend::operator()(
|
2109
|
+
void Extend::operator()(Ruleset* pRuleset)
|
2108
2110
|
{
|
2109
2111
|
extendObjectWithSelectorAndBlock( pRuleset );
|
2110
2112
|
pRuleset->block()->perform(this);
|
2111
2113
|
}
|
2112
2114
|
|
2113
|
-
void Extend::operator()(
|
2115
|
+
void Extend::operator()(Supports_Block* pFeatureBlock)
|
2114
2116
|
{
|
2115
2117
|
pFeatureBlock->block()->perform(this);
|
2116
2118
|
}
|
2117
2119
|
|
2118
|
-
void Extend::operator()(
|
2120
|
+
void Extend::operator()(Media_Block* pMediaBlock)
|
2119
2121
|
{
|
2120
2122
|
pMediaBlock->block()->perform(this);
|
2121
2123
|
}
|
2122
2124
|
|
2123
|
-
void Extend::operator()(
|
2125
|
+
void Extend::operator()(Directive* a)
|
2124
2126
|
{
|
2125
|
-
//
|
2127
|
+
// Selector_List* ls = Cast<Selector_List>(a->selector());
|
2126
2128
|
// selector_stack.push_back(ls);
|
2127
2129
|
if (a->block()) a->block()->perform(this);
|
2128
2130
|
// exp.selector_stack.pop_back();
|
data/ext/libsass/src/extend.hpp
CHANGED
@@ -20,8 +20,6 @@ namespace Sass {
|
|
20
20
|
Subset_Map& subset_map;
|
21
21
|
Eval* eval;
|
22
22
|
|
23
|
-
void fallback_impl(AST_Node_Ptr n) { }
|
24
|
-
|
25
23
|
private:
|
26
24
|
|
27
25
|
std::unordered_map<
|
@@ -48,22 +46,22 @@ namespace Sass {
|
|
48
46
|
> memoizeCompound;
|
49
47
|
*/
|
50
48
|
|
51
|
-
void extendObjectWithSelectorAndBlock(
|
52
|
-
Node extendComplexSelector(
|
53
|
-
Node extendCompoundSelector(
|
54
|
-
bool complexSelectorHasExtension(
|
49
|
+
void extendObjectWithSelectorAndBlock(Ruleset* pObject);
|
50
|
+
Node extendComplexSelector(Complex_Selector* sel, CompoundSelectorSet& seen, bool isReplace, bool isOriginal);
|
51
|
+
Node extendCompoundSelector(Compound_Selector* sel, CompoundSelectorSet& seen, bool isReplace);
|
52
|
+
bool complexSelectorHasExtension(Complex_Selector* selector, CompoundSelectorSet& seen);
|
55
53
|
Node trim(Node& seqses, bool isReplace);
|
56
54
|
Node weave(Node& path);
|
57
55
|
|
58
56
|
public:
|
59
57
|
void setEval(Eval& eval);
|
60
|
-
|
61
|
-
|
58
|
+
Selector_List* extendSelectorList(Selector_List_Obj pSelectorList, bool isReplace, bool& extendedSomething, CompoundSelectorSet& seen);
|
59
|
+
Selector_List* extendSelectorList(Selector_List_Obj pSelectorList, bool isReplace = false) {
|
62
60
|
bool extendedSomething = false;
|
63
61
|
CompoundSelectorSet seen;
|
64
62
|
return extendSelectorList(pSelectorList, isReplace, extendedSomething, seen);
|
65
63
|
}
|
66
|
-
|
64
|
+
Selector_List* extendSelectorList(Selector_List_Obj pSelectorList, CompoundSelectorSet& seen) {
|
67
65
|
bool isReplace = false;
|
68
66
|
bool extendedSomething = false;
|
69
67
|
return extendSelectorList(pSelectorList, isReplace, extendedSomething, seen);
|
@@ -71,14 +69,16 @@ namespace Sass {
|
|
71
69
|
Extend(Subset_Map&);
|
72
70
|
~Extend() { }
|
73
71
|
|
74
|
-
void operator()(
|
75
|
-
void operator()(
|
76
|
-
void operator()(
|
77
|
-
void operator()(
|
78
|
-
void operator()(
|
72
|
+
void operator()(Block*);
|
73
|
+
void operator()(Ruleset*);
|
74
|
+
void operator()(Supports_Block*);
|
75
|
+
void operator()(Media_Block*);
|
76
|
+
void operator()(Directive*);
|
79
77
|
|
78
|
+
// ignore missed types
|
80
79
|
template <typename U>
|
81
|
-
void fallback(U x) {
|
80
|
+
void fallback(U x) {}
|
81
|
+
|
82
82
|
};
|
83
83
|
|
84
84
|
}
|
data/ext/libsass/src/file.cpp
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
1
3
|
#include "sass.hpp"
|
4
|
+
|
2
5
|
#ifdef _WIN32
|
3
6
|
# ifdef __MINGW32__
|
4
7
|
# ifndef off64_t
|
@@ -21,6 +24,8 @@
|
|
21
24
|
#include "prelexer.hpp"
|
22
25
|
#include "utf8_string.hpp"
|
23
26
|
#include "sass_functions.hpp"
|
27
|
+
#include "error_handling.hpp"
|
28
|
+
#include "util.hpp"
|
24
29
|
#include "sass2scss.h"
|
25
30
|
|
26
31
|
#ifdef _WIN32
|
@@ -79,7 +84,10 @@ namespace Sass {
|
|
79
84
|
wchar_t resolved[32768];
|
80
85
|
// windows unicode filepaths are encoded in utf16
|
81
86
|
std::string abspath(join_paths(get_cwd(), path));
|
82
|
-
|
87
|
+
if (!(abspath[0] == '/' && abspath[1] == '/')) {
|
88
|
+
abspath = "//?/" + abspath;
|
89
|
+
}
|
90
|
+
std::wstring wpath(UTF_8::convert_to_utf16(abspath));
|
83
91
|
std::replace(wpath.begin(), wpath.end(), '/', '\\');
|
84
92
|
DWORD rv = GetFullPathNameW(wpath.c_str(), 32767, resolved, NULL);
|
85
93
|
if (rv > 32767) throw Exception::OperationError("Path is too long");
|
@@ -323,6 +331,8 @@ namespace Sass {
|
|
323
331
|
// (2) underscore + given
|
324
332
|
// (3) underscore + given + extension
|
325
333
|
// (4) given + extension
|
334
|
+
// (5) given + _index.scss
|
335
|
+
// (6) given + _index.sass
|
326
336
|
std::vector<Include> resolve_includes(const std::string& root, const std::string& file, const std::vector<std::string>& exts)
|
327
337
|
{
|
328
338
|
std::string filename = join_paths(root, file);
|
@@ -350,6 +360,25 @@ namespace Sass {
|
|
350
360
|
abs_path = join_paths(root, rel_path);
|
351
361
|
if (file_exists(abs_path)) includes.push_back({{ rel_path, root }, abs_path });
|
352
362
|
}
|
363
|
+
// index files
|
364
|
+
if (includes.size() == 0) {
|
365
|
+
// ignore directories that look like @import'able filename
|
366
|
+
for(auto ext : exts) {
|
367
|
+
if (ends_with(name, ext)) return includes;
|
368
|
+
}
|
369
|
+
// next test underscore index exts
|
370
|
+
for(auto ext : exts) {
|
371
|
+
rel_path = join_paths(base, join_paths(name, "_index" + ext));
|
372
|
+
abs_path = join_paths(root, rel_path);
|
373
|
+
if (file_exists(abs_path)) includes.push_back({{ rel_path, root }, abs_path });
|
374
|
+
}
|
375
|
+
// next test plain index exts
|
376
|
+
for(auto ext : exts) {
|
377
|
+
rel_path = join_paths(base, join_paths(name, "index" + ext));
|
378
|
+
abs_path = join_paths(root, rel_path);
|
379
|
+
if (file_exists(abs_path)) includes.push_back({{ rel_path, root }, abs_path });
|
380
|
+
}
|
381
|
+
}
|
353
382
|
// nothing found
|
354
383
|
return includes;
|
355
384
|
}
|
@@ -411,7 +440,10 @@ namespace Sass {
|
|
411
440
|
wchar_t resolved[32768];
|
412
441
|
// windows unicode filepaths are encoded in utf16
|
413
442
|
std::string abspath(join_paths(get_cwd(), path));
|
414
|
-
|
443
|
+
if (!(abspath[0] == '/' && abspath[1] == '/')) {
|
444
|
+
abspath = "//?/" + abspath;
|
445
|
+
}
|
446
|
+
std::wstring wpath(UTF_8::convert_to_utf16(abspath));
|
415
447
|
std::replace(wpath.begin(), wpath.end(), '/', '\\');
|
416
448
|
DWORD rv = GetFullPathNameW(wpath.c_str(), 32767, resolved, NULL);
|
417
449
|
if (rv > 32767) throw Exception::OperationError("Path is too long");
|