sassc 2.1.0.pre3 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +24 -0
- data/Rakefile +2 -4
- data/ext/extconf.rb +13 -5
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/base.h +2 -1
- data/ext/libsass/include/sass/context.h +4 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +158 -168
- data/ext/libsass/src/ast.hpp +389 -230
- data/ext/libsass/src/ast_def_macros.hpp +18 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
- data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
- data/ext/libsass/src/ast_helpers.hpp +292 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +207 -212
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +594 -1026
- data/ext/libsass/src/ast_selectors.hpp +339 -385
- data/ext/libsass/src/ast_supports.cpp +36 -52
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +271 -84
- data/ext/libsass/src/ast_values.hpp +116 -107
- data/ext/libsass/src/backtrace.cpp +9 -9
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +2 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +18 -18
- data/ext/libsass/src/bind.hpp +1 -1
- data/ext/libsass/src/c2ast.cpp +3 -3
- data/ext/libsass/src/c2ast.hpp +1 -1
- data/ext/libsass/src/cencode.c +4 -6
- data/ext/libsass/src/check_nesting.cpp +40 -41
- data/ext/libsass/src/check_nesting.hpp +6 -2
- data/ext/libsass/src/color_maps.cpp +14 -13
- data/ext/libsass/src/color_maps.hpp +1 -9
- data/ext/libsass/src/constants.cpp +5 -0
- data/ext/libsass/src/constants.hpp +6 -0
- data/ext/libsass/src/context.cpp +92 -119
- data/ext/libsass/src/context.hpp +41 -53
- data/ext/libsass/src/cssize.cpp +66 -149
- data/ext/libsass/src/cssize.hpp +17 -23
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debugger.hpp +451 -295
- data/ext/libsass/src/emitter.cpp +15 -16
- data/ext/libsass/src/emitter.hpp +10 -12
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +29 -24
- data/ext/libsass/src/error_handling.cpp +62 -41
- data/ext/libsass/src/error_handling.hpp +61 -51
- data/ext/libsass/src/eval.cpp +167 -281
- data/ext/libsass/src/eval.hpp +27 -29
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +275 -222
- data/ext/libsass/src/expand.hpp +36 -16
- data/ext/libsass/src/extender.cpp +1188 -0
- data/ext/libsass/src/extender.hpp +399 -0
- data/ext/libsass/src/extension.cpp +43 -0
- data/ext/libsass/src/extension.hpp +89 -0
- data/ext/libsass/src/file.cpp +81 -72
- data/ext/libsass/src/file.hpp +28 -37
- data/ext/libsass/src/fn_colors.cpp +20 -18
- data/ext/libsass/src/fn_lists.cpp +30 -29
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +34 -46
- data/ext/libsass/src/fn_numbers.cpp +20 -13
- data/ext/libsass/src/fn_selectors.cpp +98 -128
- data/ext/libsass/src/fn_strings.cpp +47 -33
- data/ext/libsass/src/fn_utils.cpp +31 -29
- data/ext/libsass/src/fn_utils.hpp +17 -11
- data/ext/libsass/src/inspect.cpp +186 -148
- data/ext/libsass/src/inspect.hpp +31 -29
- data/ext/libsass/src/lexer.cpp +20 -82
- data/ext/libsass/src/lexer.hpp +5 -16
- data/ext/libsass/src/listize.cpp +23 -37
- data/ext/libsass/src/listize.hpp +8 -9
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
- data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
- data/ext/libsass/src/operation.hpp +71 -61
- data/ext/libsass/src/operators.cpp +19 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +45 -64
- data/ext/libsass/src/output.hpp +6 -6
- data/ext/libsass/src/parser.cpp +512 -700
- data/ext/libsass/src/parser.hpp +89 -97
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +7 -7
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +7 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/prelexer.cpp +6 -6
- data/ext/libsass/src/remove_placeholders.cpp +55 -56
- data/ext/libsass/src/remove_placeholders.hpp +21 -18
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +10 -5
- data/ext/libsass/src/sass2scss.cpp +4 -4
- data/ext/libsass/src/sass_context.cpp +91 -122
- data/ext/libsass/src/sass_context.hpp +2 -2
- data/ext/libsass/src/sass_functions.cpp +1 -1
- data/ext/libsass/src/sass_values.cpp +8 -11
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +22 -18
- data/ext/libsass/src/source_map.hpp +12 -9
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +2 -2
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.cpp +24 -22
- data/ext/libsass/src/units.hpp +8 -8
- data/ext/libsass/src/utf8_string.cpp +9 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +48 -50
- data/ext/libsass/src/util.hpp +20 -21
- data/ext/libsass/src/util_string.cpp +111 -61
- data/ext/libsass/src/util_string.hpp +62 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/engine.rb +5 -3
- data/lib/sassc/functions_handler.rb +11 -13
- data/lib/sassc/native.rb +9 -7
- data/lib/sassc/script.rb +4 -6
- data/lib/sassc/version.rb +1 -1
- data/test/functions_test.rb +38 -1
- data/test/native_test.rb +4 -4
- metadata +31 -18
- data/ext/libsass/src/extend.cpp +0 -2132
- data/ext/libsass/src/extend.hpp +0 -86
- data/ext/libsass/src/node.cpp +0 -322
- data/ext/libsass/src/node.hpp +0 -118
- data/ext/libsass/src/paths.hpp +0 -71
- data/ext/libsass/src/sass_util.cpp +0 -152
- data/ext/libsass/src/sass_util.hpp +0 -256
- data/ext/libsass/src/subset_map.cpp +0 -58
- data/ext/libsass/src/subset_map.hpp +0 -76
- data/lib/sassc/native/lib_c.rb +0 -21
@@ -10,12 +10,13 @@ namespace Sass {
|
|
10
10
|
|
11
11
|
Definition* make_native_function(Signature sig, Native_Function func, Context& ctx)
|
12
12
|
{
|
13
|
-
|
13
|
+
SourceFile* source = SASS_MEMORY_NEW(SourceFile, "[built-in function]", sig, std::string::npos);
|
14
|
+
Parser sig_parser(source, ctx, ctx.traces);
|
14
15
|
sig_parser.lex<Prelexer::identifier>();
|
15
|
-
|
16
|
+
sass::string name(Util::normalize_underscores(sig_parser.lexed));
|
16
17
|
Parameters_Obj params = sig_parser.parse_parameters();
|
17
18
|
return SASS_MEMORY_NEW(Definition,
|
18
|
-
|
19
|
+
SourceSpan(source),
|
19
20
|
sig,
|
20
21
|
name,
|
21
22
|
params,
|
@@ -26,19 +27,19 @@ namespace Sass {
|
|
26
27
|
Definition* make_c_function(Sass_Function_Entry c_func, Context& ctx)
|
27
28
|
{
|
28
29
|
using namespace Prelexer;
|
29
|
-
|
30
30
|
const char* sig = sass_function_get_signature(c_func);
|
31
|
-
|
31
|
+
SourceFile* source = SASS_MEMORY_NEW(SourceFile, "[c function]", sig, std::string::npos);
|
32
|
+
Parser sig_parser(source, ctx, ctx.traces);
|
32
33
|
// allow to overload generic callback plus @warn, @error and @debug with custom functions
|
33
34
|
sig_parser.lex < alternatives < identifier, exactly <'*'>,
|
34
35
|
exactly < Constants::warn_kwd >,
|
35
36
|
exactly < Constants::error_kwd >,
|
36
37
|
exactly < Constants::debug_kwd >
|
37
38
|
> >();
|
38
|
-
|
39
|
+
sass::string name(Util::normalize_underscores(sig_parser.lexed));
|
39
40
|
Parameters_Obj params = sig_parser.parse_parameters();
|
40
41
|
return SASS_MEMORY_NEW(Definition,
|
41
|
-
|
42
|
+
SourceSpan(source),
|
42
43
|
sig,
|
43
44
|
name,
|
44
45
|
params,
|
@@ -47,13 +48,13 @@ namespace Sass {
|
|
47
48
|
|
48
49
|
namespace Functions {
|
49
50
|
|
50
|
-
|
51
|
+
sass::string function_name(Signature sig)
|
51
52
|
{
|
52
|
-
|
53
|
+
sass::string str(sig);
|
53
54
|
return str.substr(0, str.find('('));
|
54
55
|
}
|
55
56
|
|
56
|
-
Map* get_arg_m(const
|
57
|
+
Map* get_arg_m(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces)
|
57
58
|
{
|
58
59
|
AST_Node* value = env[argname];
|
59
60
|
if (Map* map = Cast<Map>(value)) return map;
|
@@ -64,14 +65,14 @@ namespace Sass {
|
|
64
65
|
return get_arg<Map>(argname, env, sig, pstate, traces);
|
65
66
|
}
|
66
67
|
|
67
|
-
double get_arg_r(const
|
68
|
+
double get_arg_r(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, double lo, double hi)
|
68
69
|
{
|
69
70
|
Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
|
70
71
|
Number tmpnr(val);
|
71
72
|
tmpnr.reduce();
|
72
73
|
double v = tmpnr.value();
|
73
74
|
if (!(lo <= v && v <= hi)) {
|
74
|
-
|
75
|
+
sass::ostream msg;
|
75
76
|
msg << "argument `" << argname << "` of `" << sig << "` must be between ";
|
76
77
|
msg << lo << " and " << hi;
|
77
78
|
error(msg.str(), pstate, traces);
|
@@ -79,7 +80,7 @@ namespace Sass {
|
|
79
80
|
return v;
|
80
81
|
}
|
81
82
|
|
82
|
-
Number* get_arg_n(const
|
83
|
+
Number* get_arg_n(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces)
|
83
84
|
{
|
84
85
|
Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
|
85
86
|
val = SASS_MEMORY_COPY(val);
|
@@ -87,7 +88,7 @@ namespace Sass {
|
|
87
88
|
return val;
|
88
89
|
}
|
89
90
|
|
90
|
-
double get_arg_val(const
|
91
|
+
double get_arg_val(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces)
|
91
92
|
{
|
92
93
|
Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
|
93
94
|
Number tmpnr(val);
|
@@ -95,7 +96,7 @@ namespace Sass {
|
|
95
96
|
return tmpnr.value();
|
96
97
|
}
|
97
98
|
|
98
|
-
double color_num(const
|
99
|
+
double color_num(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces)
|
99
100
|
{
|
100
101
|
Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
|
101
102
|
Number tmpnr(val);
|
@@ -107,7 +108,7 @@ namespace Sass {
|
|
107
108
|
}
|
108
109
|
}
|
109
110
|
|
110
|
-
double alpha_num(const
|
111
|
+
double alpha_num(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces) {
|
111
112
|
Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
|
112
113
|
Number tmpnr(val);
|
113
114
|
tmpnr.reduce();
|
@@ -118,10 +119,10 @@ namespace Sass {
|
|
118
119
|
}
|
119
120
|
}
|
120
121
|
|
121
|
-
|
122
|
-
|
122
|
+
SelectorListObj get_arg_sels(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, Context& ctx) {
|
123
|
+
ExpressionObj exp = ARG(argname, Expression);
|
123
124
|
if (exp->concrete_type() == Expression::NULL_VAL) {
|
124
|
-
|
125
|
+
sass::ostream msg;
|
125
126
|
msg << argname << ": null is not a valid selector: it must be a string,\n";
|
126
127
|
msg << "a list of strings, or a list of lists of strings for `" << function_name(sig) << "'";
|
127
128
|
error(msg.str(), exp->pstate(), traces);
|
@@ -129,28 +130,29 @@ namespace Sass {
|
|
129
130
|
if (String_Constant* str = Cast<String_Constant>(exp)) {
|
130
131
|
str->quote_mark(0);
|
131
132
|
}
|
132
|
-
|
133
|
-
|
133
|
+
sass::string exp_src = exp->to_string(ctx.c_options);
|
134
|
+
ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
|
135
|
+
return Parser::parse_selector(source, ctx, traces, false);
|
134
136
|
}
|
135
137
|
|
136
|
-
|
137
|
-
|
138
|
+
CompoundSelectorObj get_arg_sel(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, Context& ctx) {
|
139
|
+
ExpressionObj exp = ARG(argname, Expression);
|
138
140
|
if (exp->concrete_type() == Expression::NULL_VAL) {
|
139
|
-
|
141
|
+
sass::ostream msg;
|
140
142
|
msg << argname << ": null is not a string for `" << function_name(sig) << "'";
|
141
143
|
error(msg.str(), exp->pstate(), traces);
|
142
144
|
}
|
143
145
|
if (String_Constant* str = Cast<String_Constant>(exp)) {
|
144
146
|
str->quote_mark(0);
|
145
147
|
}
|
146
|
-
|
147
|
-
|
148
|
+
sass::string exp_src = exp->to_string(ctx.c_options);
|
149
|
+
ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
|
150
|
+
SelectorListObj sel_list = Parser::parse_selector(source, ctx, traces, false);
|
148
151
|
if (sel_list->length() == 0) return {};
|
149
|
-
|
150
|
-
if (!first->tail()) return first->head();
|
151
|
-
return first->tail()->head();
|
152
|
+
return sel_list->first()->first();
|
152
153
|
}
|
153
154
|
|
155
|
+
|
154
156
|
}
|
155
157
|
|
156
158
|
}
|
@@ -1,5 +1,10 @@
|
|
1
1
|
#ifndef SASS_FN_UTILS_H
|
2
2
|
#define SASS_FN_UTILS_H
|
3
|
+
|
4
|
+
// sass.hpp must go before all system headers to get the
|
5
|
+
// __EXTENSIONS__ fix on Solaris.
|
6
|
+
#include "sass.hpp"
|
7
|
+
|
3
8
|
#include "units.hpp"
|
4
9
|
#include "backtrace.hpp"
|
5
10
|
#include "environment.hpp"
|
@@ -13,9 +18,10 @@ namespace Sass {
|
|
13
18
|
Env& d_env, \
|
14
19
|
Context& ctx, \
|
15
20
|
Signature sig, \
|
16
|
-
|
21
|
+
SourceSpan pstate, \
|
17
22
|
Backtraces& traces, \
|
18
|
-
SelectorStack
|
23
|
+
SelectorStack selector_stack, \
|
24
|
+
SelectorStack original_stack \
|
19
25
|
|
20
26
|
typedef const char* Signature;
|
21
27
|
typedef PreValue* (*Native_Function)(FN_PROTOTYPE);
|
@@ -31,7 +37,7 @@ namespace Sass {
|
|
31
37
|
namespace Functions {
|
32
38
|
|
33
39
|
template <typename T>
|
34
|
-
T* get_arg(const
|
40
|
+
T* get_arg(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces)
|
35
41
|
{
|
36
42
|
T* val = Cast<T>(env[argname]);
|
37
43
|
if (!val) {
|
@@ -40,14 +46,14 @@ namespace Sass {
|
|
40
46
|
return val;
|
41
47
|
}
|
42
48
|
|
43
|
-
Map* get_arg_m(const
|
44
|
-
Number* get_arg_n(const
|
45
|
-
double alpha_num(const
|
46
|
-
double color_num(const
|
47
|
-
double get_arg_r(const
|
48
|
-
double get_arg_val(const
|
49
|
-
|
50
|
-
|
49
|
+
Map* get_arg_m(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces); // maps only
|
50
|
+
Number* get_arg_n(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces); // numbers only
|
51
|
+
double alpha_num(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces); // colors only
|
52
|
+
double color_num(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces); // colors only
|
53
|
+
double get_arg_r(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, double lo, double hi); // colors only
|
54
|
+
double get_arg_val(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces); // shared
|
55
|
+
SelectorListObj get_arg_sels(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, Context& ctx); // selectors only
|
56
|
+
CompoundSelectorObj get_arg_sel(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, Context& ctx); // selectors only
|
51
57
|
|
52
58
|
}
|
53
59
|
|
data/ext/libsass/src/inspect.cpp
CHANGED
@@ -42,7 +42,7 @@ namespace Sass {
|
|
42
42
|
|
43
43
|
}
|
44
44
|
|
45
|
-
void Inspect::operator()(
|
45
|
+
void Inspect::operator()(StyleRule* ruleset)
|
46
46
|
{
|
47
47
|
if (ruleset->selector()) {
|
48
48
|
ruleset->selector()->perform(this);
|
@@ -67,18 +67,64 @@ namespace Sass {
|
|
67
67
|
append_scope_closer();
|
68
68
|
}
|
69
69
|
|
70
|
-
void Inspect::operator()(
|
70
|
+
void Inspect::operator()(MediaRule* rule)
|
71
71
|
{
|
72
72
|
append_indentation();
|
73
|
-
append_token("@media",
|
73
|
+
append_token("@media", rule);
|
74
|
+
append_mandatory_space();
|
75
|
+
if (rule->block()) {
|
76
|
+
rule->block()->perform(this);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
void Inspect::operator()(CssMediaRule* rule)
|
81
|
+
{
|
82
|
+
if (output_style() == NESTED)
|
83
|
+
indentation += rule->tabs();
|
84
|
+
append_indentation();
|
85
|
+
append_token("@media", rule);
|
74
86
|
append_mandatory_space();
|
75
87
|
in_media_block = true;
|
76
|
-
|
88
|
+
bool joinIt = false;
|
89
|
+
for (auto query : rule->elements()) {
|
90
|
+
if (joinIt) {
|
91
|
+
append_comma_separator();
|
92
|
+
append_optional_space();
|
93
|
+
}
|
94
|
+
operator()(query);
|
95
|
+
joinIt = true;
|
96
|
+
}
|
97
|
+
if (rule->block()) {
|
98
|
+
rule->block()->perform(this);
|
99
|
+
}
|
77
100
|
in_media_block = false;
|
78
|
-
|
101
|
+
if (output_style() == NESTED)
|
102
|
+
indentation -= rule->tabs();
|
79
103
|
}
|
80
104
|
|
81
|
-
void Inspect::operator()(
|
105
|
+
void Inspect::operator()(CssMediaQuery* query)
|
106
|
+
{
|
107
|
+
bool joinIt = false;
|
108
|
+
if (!query->modifier().empty()) {
|
109
|
+
append_string(query->modifier());
|
110
|
+
append_mandatory_space();
|
111
|
+
}
|
112
|
+
if (!query->type().empty()) {
|
113
|
+
append_string(query->type());
|
114
|
+
joinIt = true;
|
115
|
+
}
|
116
|
+
for (auto feature : query->features()) {
|
117
|
+
if (joinIt) {
|
118
|
+
append_mandatory_space();
|
119
|
+
append_string("and");
|
120
|
+
append_mandatory_space();
|
121
|
+
}
|
122
|
+
append_string(feature);
|
123
|
+
joinIt = true;
|
124
|
+
}
|
125
|
+
}
|
126
|
+
|
127
|
+
void Inspect::operator()(SupportsRule* feature_block)
|
82
128
|
{
|
83
129
|
append_indentation();
|
84
130
|
append_token("@supports", feature_block);
|
@@ -87,7 +133,7 @@ namespace Sass {
|
|
87
133
|
feature_block->block()->perform(this);
|
88
134
|
}
|
89
135
|
|
90
|
-
void Inspect::operator()(
|
136
|
+
void Inspect::operator()(AtRootRule* at_root_block)
|
91
137
|
{
|
92
138
|
append_indentation();
|
93
139
|
append_token("@at-root ", at_root_block);
|
@@ -96,7 +142,7 @@ namespace Sass {
|
|
96
142
|
if(at_root_block->block()) at_root_block->block()->perform(this);
|
97
143
|
}
|
98
144
|
|
99
|
-
void Inspect::operator()(
|
145
|
+
void Inspect::operator()(AtRule* at_rule)
|
100
146
|
{
|
101
147
|
append_indentation();
|
102
148
|
append_token(at_rule->keyword(), at_rule);
|
@@ -134,8 +180,7 @@ namespace Sass {
|
|
134
180
|
append_colon_separator();
|
135
181
|
|
136
182
|
if (dec->value()->concrete_type() == Expression::SELECTOR) {
|
137
|
-
Listize
|
138
|
-
Expression_Obj ls = dec->value()->perform(&listize);
|
183
|
+
ExpressionObj ls = Listize::perform(dec->value());
|
139
184
|
ls->perform(this);
|
140
185
|
} else {
|
141
186
|
dec->value()->perform(this);
|
@@ -203,7 +248,7 @@ namespace Sass {
|
|
203
248
|
append_delimiter();
|
204
249
|
}
|
205
250
|
|
206
|
-
void Inspect::operator()(
|
251
|
+
void Inspect::operator()(WarningRule* warning)
|
207
252
|
{
|
208
253
|
append_indentation();
|
209
254
|
append_token("@warn", warning);
|
@@ -212,7 +257,7 @@ namespace Sass {
|
|
212
257
|
append_delimiter();
|
213
258
|
}
|
214
259
|
|
215
|
-
void Inspect::operator()(
|
260
|
+
void Inspect::operator()(ErrorRule* error)
|
216
261
|
{
|
217
262
|
append_indentation();
|
218
263
|
append_token("@error", error);
|
@@ -221,7 +266,7 @@ namespace Sass {
|
|
221
266
|
append_delimiter();
|
222
267
|
}
|
223
268
|
|
224
|
-
void Inspect::operator()(
|
269
|
+
void Inspect::operator()(DebugRule* debug)
|
225
270
|
{
|
226
271
|
append_indentation();
|
227
272
|
append_token("@debug", debug);
|
@@ -252,7 +297,7 @@ namespace Sass {
|
|
252
297
|
}
|
253
298
|
}
|
254
299
|
|
255
|
-
void Inspect::operator()(
|
300
|
+
void Inspect::operator()(ForRule* loop)
|
256
301
|
{
|
257
302
|
append_indentation();
|
258
303
|
append_token("@for", loop);
|
@@ -265,7 +310,7 @@ namespace Sass {
|
|
265
310
|
loop->block()->perform(this);
|
266
311
|
}
|
267
312
|
|
268
|
-
void Inspect::operator()(
|
313
|
+
void Inspect::operator()(EachRule* loop)
|
269
314
|
{
|
270
315
|
append_indentation();
|
271
316
|
append_token("@each", loop);
|
@@ -280,7 +325,7 @@ namespace Sass {
|
|
280
325
|
loop->block()->perform(this);
|
281
326
|
}
|
282
327
|
|
283
|
-
void Inspect::operator()(
|
328
|
+
void Inspect::operator()(WhileRule* loop)
|
284
329
|
{
|
285
330
|
append_indentation();
|
286
331
|
append_token("@while", loop);
|
@@ -298,7 +343,7 @@ namespace Sass {
|
|
298
343
|
append_delimiter();
|
299
344
|
}
|
300
345
|
|
301
|
-
void Inspect::operator()(
|
346
|
+
void Inspect::operator()(ExtendRule* extend)
|
302
347
|
{
|
303
348
|
append_indentation();
|
304
349
|
append_token("@extend", extend);
|
@@ -367,11 +412,11 @@ namespace Sass {
|
|
367
412
|
append_string(")");
|
368
413
|
}
|
369
414
|
|
370
|
-
|
415
|
+
sass::string Inspect::lbracket(List* list) {
|
371
416
|
return list->is_bracketed() ? "[" : "(";
|
372
417
|
}
|
373
418
|
|
374
|
-
|
419
|
+
sass::string Inspect::rbracket(List* list) {
|
375
420
|
return list->is_bracketed() ? "]" : ")";
|
376
421
|
}
|
377
422
|
|
@@ -382,7 +427,7 @@ namespace Sass {
|
|
382
427
|
append_string(rbracket(list));
|
383
428
|
return;
|
384
429
|
}
|
385
|
-
|
430
|
+
sass::string sep(list->separator() == SASS_SPACE ? " " : ",");
|
386
431
|
if ((output_style() != COMPRESSED) && sep == ",") sep += " ";
|
387
432
|
else if (in_media_block && sep != " ") sep += " "; // verified
|
388
433
|
if (list->empty()) return;
|
@@ -399,7 +444,7 @@ namespace Sass {
|
|
399
444
|
list->length() == 1 &&
|
400
445
|
!list->from_selector() &&
|
401
446
|
!Cast<List>(list->at(0)) &&
|
402
|
-
!Cast<
|
447
|
+
!Cast<SelectorList>(list->at(0))
|
403
448
|
) {
|
404
449
|
append_string(lbracket(list));
|
405
450
|
}
|
@@ -416,7 +461,7 @@ namespace Sass {
|
|
416
461
|
for (size_t i = 0, L = list->size(); i < L; ++i) {
|
417
462
|
if (list->separator() == SASS_HASH)
|
418
463
|
{ sep[0] = i % 2 ? ':' : ','; }
|
419
|
-
|
464
|
+
ExpressionObj list_item = list->at(i);
|
420
465
|
if (output_style() != TO_SASS) {
|
421
466
|
if (list_item->is_invisible()) {
|
422
467
|
// this fixes an issue with "" in a list
|
@@ -449,7 +494,7 @@ namespace Sass {
|
|
449
494
|
list->length() == 1 &&
|
450
495
|
!list->from_selector() &&
|
451
496
|
!Cast<List>(list->at(0)) &&
|
452
|
-
!Cast<
|
497
|
+
!Cast<SelectorList>(list->at(0))
|
453
498
|
) {
|
454
499
|
append_string(",");
|
455
500
|
append_string(rbracket(list));
|
@@ -525,12 +570,12 @@ namespace Sass {
|
|
525
570
|
// reduce units
|
526
571
|
n->reduce();
|
527
572
|
|
528
|
-
|
573
|
+
sass::ostream ss;
|
529
574
|
ss.precision(opt.precision);
|
530
575
|
ss << std::fixed << n->value();
|
531
576
|
|
532
|
-
|
533
|
-
|
577
|
+
sass::string res = ss.str();
|
578
|
+
size_t s = res.length();
|
534
579
|
|
535
580
|
// delete trailing zeros
|
536
581
|
for(s = s - 1; s > 0; --s)
|
@@ -562,6 +607,11 @@ namespace Sass {
|
|
562
607
|
// add unit now
|
563
608
|
res += n->unit();
|
564
609
|
|
610
|
+
if (opt.output_style == TO_CSS && !n->is_valid_css_unit()) {
|
611
|
+
// traces.push_back(Backtrace(nr->pstate()));
|
612
|
+
throw Exception::InvalidValue({}, *n);
|
613
|
+
}
|
614
|
+
|
565
615
|
// output the final token
|
566
616
|
append_token(res, n);
|
567
617
|
}
|
@@ -577,14 +627,14 @@ namespace Sass {
|
|
577
627
|
void Inspect::operator()(Color_RGBA* c)
|
578
628
|
{
|
579
629
|
// output the final token
|
580
|
-
|
630
|
+
sass::ostream ss;
|
581
631
|
|
582
632
|
// original color name
|
583
633
|
// maybe an unknown token
|
584
|
-
|
634
|
+
sass::string name = c->disp();
|
585
635
|
|
586
636
|
// resolved color
|
587
|
-
|
637
|
+
sass::string res_name = name;
|
588
638
|
|
589
639
|
double r = Sass::round(cap_channel<0xff>(c->r()), opt.precision);
|
590
640
|
double g = Sass::round(cap_channel<0xff>(c->g()), opt.precision);
|
@@ -606,7 +656,7 @@ namespace Sass {
|
|
606
656
|
res_name = color_to_name(numval);
|
607
657
|
}
|
608
658
|
|
609
|
-
|
659
|
+
sass::ostream hexlet;
|
610
660
|
// dart sass compressed all colors in regular css always
|
611
661
|
// ruby sass and libsass does it only when not delayed
|
612
662
|
// since color math is going to be removed, this can go too
|
@@ -707,18 +757,18 @@ namespace Sass {
|
|
707
757
|
append_token(w->message(), w);
|
708
758
|
}
|
709
759
|
|
710
|
-
void Inspect::operator()(
|
760
|
+
void Inspect::operator()(SupportsOperation* so)
|
711
761
|
{
|
712
762
|
|
713
763
|
if (so->needs_parens(so->left())) append_string("(");
|
714
764
|
so->left()->perform(this);
|
715
765
|
if (so->needs_parens(so->left())) append_string(")");
|
716
766
|
|
717
|
-
if (so->operand() ==
|
767
|
+
if (so->operand() == SupportsOperation::AND) {
|
718
768
|
append_mandatory_space();
|
719
769
|
append_token("and", so);
|
720
770
|
append_mandatory_space();
|
721
|
-
} else if (so->operand() ==
|
771
|
+
} else if (so->operand() == SupportsOperation::OR) {
|
722
772
|
append_mandatory_space();
|
723
773
|
append_token("or", so);
|
724
774
|
append_mandatory_space();
|
@@ -729,7 +779,7 @@ namespace Sass {
|
|
729
779
|
if (so->needs_parens(so->right())) append_string(")");
|
730
780
|
}
|
731
781
|
|
732
|
-
void Inspect::operator()(
|
782
|
+
void Inspect::operator()(SupportsNegation* sn)
|
733
783
|
{
|
734
784
|
append_token("not", sn);
|
735
785
|
append_mandatory_space();
|
@@ -738,7 +788,7 @@ namespace Sass {
|
|
738
788
|
if (sn->needs_parens(sn->condition())) append_string(")");
|
739
789
|
}
|
740
790
|
|
741
|
-
void Inspect::operator()(
|
791
|
+
void Inspect::operator()(SupportsDeclaration* sd)
|
742
792
|
{
|
743
793
|
append_string("(");
|
744
794
|
sd->feature()->perform(this);
|
@@ -879,39 +929,33 @@ namespace Sass {
|
|
879
929
|
s->contents()->perform(this);
|
880
930
|
}
|
881
931
|
|
882
|
-
void Inspect::operator()(
|
932
|
+
void Inspect::operator()(Parent_Reference* p)
|
883
933
|
{
|
884
|
-
|
934
|
+
append_string("&");
|
885
935
|
}
|
886
936
|
|
887
|
-
void Inspect::operator()(
|
937
|
+
void Inspect::operator()(PlaceholderSelector* s)
|
888
938
|
{
|
889
939
|
append_token(s->name(), s);
|
890
|
-
if (s->has_line_break()) append_optional_linefeed();
|
891
|
-
if (s->has_line_break()) append_indentation();
|
892
940
|
|
893
941
|
}
|
894
942
|
|
895
|
-
void Inspect::operator()(
|
943
|
+
void Inspect::operator()(TypeSelector* s)
|
896
944
|
{
|
897
945
|
append_token(s->ns_name(), s);
|
898
946
|
}
|
899
947
|
|
900
|
-
void Inspect::operator()(
|
948
|
+
void Inspect::operator()(ClassSelector* s)
|
901
949
|
{
|
902
950
|
append_token(s->ns_name(), s);
|
903
|
-
if (s->has_line_break()) append_optional_linefeed();
|
904
|
-
if (s->has_line_break()) append_indentation();
|
905
951
|
}
|
906
952
|
|
907
|
-
void Inspect::operator()(
|
953
|
+
void Inspect::operator()(IDSelector* s)
|
908
954
|
{
|
909
955
|
append_token(s->ns_name(), s);
|
910
|
-
if (s->has_line_break()) append_optional_linefeed();
|
911
|
-
if (s->has_line_break()) append_indentation();
|
912
956
|
}
|
913
957
|
|
914
|
-
void Inspect::operator()(
|
958
|
+
void Inspect::operator()(AttributeSelector* s)
|
915
959
|
{
|
916
960
|
append_string("[");
|
917
961
|
add_open_mapping(s);
|
@@ -930,111 +974,38 @@ namespace Sass {
|
|
930
974
|
append_string("]");
|
931
975
|
}
|
932
976
|
|
933
|
-
void Inspect::operator()(
|
977
|
+
void Inspect::operator()(PseudoSelector* s)
|
934
978
|
{
|
935
|
-
append_token(s->ns_name(), s);
|
936
|
-
if (s->expression()) {
|
937
|
-
append_string("(");
|
938
|
-
s->expression()->perform(this);
|
939
|
-
append_string(")");
|
940
|
-
}
|
941
|
-
}
|
942
|
-
|
943
|
-
void Inspect::operator()(Wrapped_Selector* s)
|
944
|
-
{
|
945
|
-
if (s->name() == " ") {
|
946
|
-
append_string("");
|
947
|
-
} else {
|
948
|
-
bool was = in_wrapped;
|
949
|
-
in_wrapped = true;
|
950
|
-
append_token(s->name(), s);
|
951
|
-
append_string("(");
|
952
|
-
bool was_comma_array = in_comma_array;
|
953
|
-
in_comma_array = false;
|
954
|
-
s->selector()->perform(this);
|
955
|
-
in_comma_array = was_comma_array;
|
956
|
-
append_string(")");
|
957
|
-
in_wrapped = was;
|
958
|
-
}
|
959
|
-
}
|
960
|
-
|
961
|
-
void Inspect::operator()(Compound_Selector* s)
|
962
|
-
{
|
963
|
-
for (size_t i = 0, L = s->length(); i < L; ++i) {
|
964
|
-
(*s)[i]->perform(this);
|
965
|
-
}
|
966
|
-
if (s->has_line_break()) {
|
967
|
-
if (output_style() != COMPACT) {
|
968
|
-
append_optional_linefeed();
|
969
|
-
}
|
970
|
-
}
|
971
|
-
}
|
972
|
-
|
973
|
-
void Inspect::operator()(Complex_Selector* c)
|
974
|
-
{
|
975
|
-
Compound_Selector_Obj head = c->head();
|
976
|
-
Complex_Selector_Obj tail = c->tail();
|
977
|
-
Complex_Selector::Combinator comb = c->combinator();
|
978
|
-
|
979
|
-
if (comb == Complex_Selector::ANCESTOR_OF && (!head || head->empty())) {
|
980
|
-
if (tail) tail->perform(this);
|
981
|
-
return;
|
982
|
-
}
|
983
979
|
|
984
|
-
if (
|
985
|
-
|
986
|
-
|
987
|
-
|
980
|
+
if (s->name() != "") {
|
981
|
+
append_string(":");
|
982
|
+
if (s->isSyntacticElement()) {
|
983
|
+
append_string(":");
|
988
984
|
}
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
|
997
|
-
|
998
|
-
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
1006
|
-
|
1007
|
-
|
1008
|
-
append_optional_space();
|
1009
|
-
break;
|
1010
|
-
case Complex_Selector::REFERENCE:
|
1011
|
-
append_mandatory_space();
|
1012
|
-
append_string("/");
|
1013
|
-
if (c->reference()) c->reference()->perform(this);
|
1014
|
-
append_string("/");
|
1015
|
-
append_mandatory_space();
|
1016
|
-
break;
|
1017
|
-
case Complex_Selector::PRECEDES:
|
1018
|
-
if (is_empty) append_optional_space();
|
1019
|
-
else append_mandatory_space();
|
1020
|
-
append_string("~");
|
1021
|
-
if (tail) append_mandatory_space();
|
1022
|
-
else append_optional_space();
|
1023
|
-
break;
|
1024
|
-
default: break;
|
1025
|
-
}
|
1026
|
-
if (tail && comb != Complex_Selector::ANCESTOR_OF) {
|
1027
|
-
if (c->has_line_break()) append_optional_linefeed();
|
1028
|
-
}
|
1029
|
-
if (tail) tail->perform(this);
|
1030
|
-
if (!tail && c->has_line_break()) {
|
1031
|
-
if (output_style() == COMPACT) {
|
1032
|
-
append_mandatory_space();
|
985
|
+
append_token(s->ns_name(), s);
|
986
|
+
if (s->selector() || s->argument()) {
|
987
|
+
bool was = in_wrapped;
|
988
|
+
in_wrapped = true;
|
989
|
+
append_string("(");
|
990
|
+
if (s->argument()) {
|
991
|
+
s->argument()->perform(this);
|
992
|
+
}
|
993
|
+
if (s->selector() && s->argument()) {
|
994
|
+
append_mandatory_space();
|
995
|
+
}
|
996
|
+
bool was_comma_array = in_comma_array;
|
997
|
+
in_comma_array = false;
|
998
|
+
if (s->selector()) {
|
999
|
+
s->selector()->perform(this);
|
1000
|
+
}
|
1001
|
+
in_comma_array = was_comma_array;
|
1002
|
+
append_string(")");
|
1003
|
+
in_wrapped = was;
|
1033
1004
|
}
|
1034
1005
|
}
|
1035
1006
|
}
|
1036
1007
|
|
1037
|
-
void Inspect::operator()(
|
1008
|
+
void Inspect::operator()(SelectorList* g)
|
1038
1009
|
{
|
1039
1010
|
|
1040
1011
|
if (g->empty()) {
|
@@ -1049,7 +1020,7 @@ namespace Sass {
|
|
1049
1020
|
// probably ruby sass eqivalent of element_needs_parens
|
1050
1021
|
if (output_style() == TO_SASS && g->length() == 1 &&
|
1051
1022
|
(!Cast<List>((*g)[0]) &&
|
1052
|
-
|
1023
|
+
!Cast<SelectorList>((*g)[0]))) {
|
1053
1024
|
append_string("(");
|
1054
1025
|
}
|
1055
1026
|
else if (!in_declaration && in_comma_array) {
|
@@ -1059,8 +1030,10 @@ namespace Sass {
|
|
1059
1030
|
if (in_declaration) in_comma_array = true;
|
1060
1031
|
|
1061
1032
|
for (size_t i = 0, L = g->length(); i < L; ++i) {
|
1033
|
+
|
1062
1034
|
if (!in_wrapped && i == 0) append_indentation();
|
1063
1035
|
if ((*g)[i] == nullptr) continue;
|
1036
|
+
if (g->at(i)->length() == 0) continue;
|
1064
1037
|
schedule_mapping(g->at(i)->last());
|
1065
1038
|
// add_open_mapping((*g)[i]->last());
|
1066
1039
|
(*g)[i]->perform(this);
|
@@ -1075,7 +1048,7 @@ namespace Sass {
|
|
1075
1048
|
// probably ruby sass eqivalent of element_needs_parens
|
1076
1049
|
if (output_style() == TO_SASS && g->length() == 1 &&
|
1077
1050
|
(!Cast<List>((*g)[0]) &&
|
1078
|
-
|
1051
|
+
!Cast<SelectorList>((*g)[0]))) {
|
1079
1052
|
append_string(",)");
|
1080
1053
|
}
|
1081
1054
|
else if (!in_declaration && in_comma_array) {
|
@@ -1083,5 +1056,70 @@ namespace Sass {
|
|
1083
1056
|
}
|
1084
1057
|
|
1085
1058
|
}
|
1059
|
+
void Inspect::operator()(ComplexSelector* sel)
|
1060
|
+
{
|
1061
|
+
if (sel->hasPreLineFeed()) {
|
1062
|
+
append_optional_linefeed();
|
1063
|
+
if (!in_wrapped && output_style() == NESTED) {
|
1064
|
+
append_indentation();
|
1065
|
+
}
|
1066
|
+
}
|
1067
|
+
const SelectorComponent* prev = nullptr;
|
1068
|
+
for (auto& item : sel->elements()) {
|
1069
|
+
if (prev != nullptr) {
|
1070
|
+
if (item->getCombinator() || prev->getCombinator()) {
|
1071
|
+
append_optional_space();
|
1072
|
+
} else {
|
1073
|
+
append_mandatory_space();
|
1074
|
+
}
|
1075
|
+
}
|
1076
|
+
item->perform(this);
|
1077
|
+
prev = item.ptr();
|
1078
|
+
}
|
1079
|
+
}
|
1080
|
+
|
1081
|
+
void Inspect::operator()(SelectorComponent* sel)
|
1082
|
+
{
|
1083
|
+
// You should probably never call this method directly
|
1084
|
+
// But in case anyone does, we will do the upcasting
|
1085
|
+
if (auto comp = Cast<CompoundSelector>(sel)) operator()(comp);
|
1086
|
+
if (auto comb = Cast<SelectorCombinator>(sel)) operator()(comb);
|
1087
|
+
}
|
1088
|
+
|
1089
|
+
void Inspect::operator()(CompoundSelector* sel)
|
1090
|
+
{
|
1091
|
+
if (sel->hasRealParent()) {
|
1092
|
+
append_string("&");
|
1093
|
+
}
|
1094
|
+
sel->sortChildren();
|
1095
|
+
for (auto& item : sel->elements()) {
|
1096
|
+
item->perform(this);
|
1097
|
+
}
|
1098
|
+
// Add the post line break (from ruby sass)
|
1099
|
+
// Dart sass uses another logic for newlines
|
1100
|
+
if (sel->hasPostLineBreak()) {
|
1101
|
+
if (output_style() != COMPACT) {
|
1102
|
+
append_optional_linefeed();
|
1103
|
+
}
|
1104
|
+
}
|
1105
|
+
}
|
1106
|
+
|
1107
|
+
void Inspect::operator()(SelectorCombinator* sel)
|
1108
|
+
{
|
1109
|
+
append_optional_space();
|
1110
|
+
switch (sel->combinator()) {
|
1111
|
+
case SelectorCombinator::Combinator::CHILD: append_string(">"); break;
|
1112
|
+
case SelectorCombinator::Combinator::GENERAL: append_string("~"); break;
|
1113
|
+
case SelectorCombinator::Combinator::ADJACENT: append_string("+"); break;
|
1114
|
+
}
|
1115
|
+
append_optional_space();
|
1116
|
+
// Add the post line break (from ruby sass)
|
1117
|
+
// Dart sass uses another logic for newlines
|
1118
|
+
if (sel->hasPostLineBreak()) {
|
1119
|
+
if (output_style() != COMPACT) {
|
1120
|
+
// append_optional_linefeed();
|
1121
|
+
}
|
1122
|
+
}
|
1123
|
+
}
|
1086
1124
|
|
1087
1125
|
}
|