sassc 2.0.1 → 2.1.0.pre1
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/.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");
|