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
@@ -0,0 +1,34 @@
|
|
1
|
+
#ifndef SASS_FN_STRINGS_H
|
2
|
+
#define SASS_FN_STRINGS_H
|
3
|
+
|
4
|
+
#include "fn_utils.hpp"
|
5
|
+
|
6
|
+
namespace Sass {
|
7
|
+
|
8
|
+
namespace Functions {
|
9
|
+
|
10
|
+
extern Signature unquote_sig;
|
11
|
+
extern Signature quote_sig;
|
12
|
+
extern Signature str_length_sig;
|
13
|
+
extern Signature str_insert_sig;
|
14
|
+
extern Signature str_index_sig;
|
15
|
+
extern Signature str_slice_sig;
|
16
|
+
extern Signature to_upper_case_sig;
|
17
|
+
extern Signature to_lower_case_sig;
|
18
|
+
extern Signature length_sig;
|
19
|
+
|
20
|
+
BUILT_IN(sass_unquote);
|
21
|
+
BUILT_IN(sass_quote);
|
22
|
+
BUILT_IN(str_length);
|
23
|
+
BUILT_IN(str_insert);
|
24
|
+
BUILT_IN(str_index);
|
25
|
+
BUILT_IN(str_slice);
|
26
|
+
BUILT_IN(to_upper_case);
|
27
|
+
BUILT_IN(to_lower_case);
|
28
|
+
BUILT_IN(length);
|
29
|
+
|
30
|
+
}
|
31
|
+
|
32
|
+
}
|
33
|
+
|
34
|
+
#endif
|
@@ -0,0 +1,156 @@
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
3
|
+
#include "sass.hpp"
|
4
|
+
|
5
|
+
#include "parser.hpp"
|
6
|
+
#include "fn_utils.hpp"
|
7
|
+
#include "util_string.hpp"
|
8
|
+
|
9
|
+
namespace Sass {
|
10
|
+
|
11
|
+
Definition* make_native_function(Signature sig, Native_Function func, Context& ctx)
|
12
|
+
{
|
13
|
+
Parser sig_parser = Parser::from_c_str(sig, ctx, ctx.traces, ParserState("[built-in function]"));
|
14
|
+
sig_parser.lex<Prelexer::identifier>();
|
15
|
+
std::string name(Util::normalize_underscores(sig_parser.lexed));
|
16
|
+
Parameters_Obj params = sig_parser.parse_parameters();
|
17
|
+
return SASS_MEMORY_NEW(Definition,
|
18
|
+
ParserState("[built-in function]"),
|
19
|
+
sig,
|
20
|
+
name,
|
21
|
+
params,
|
22
|
+
func,
|
23
|
+
false);
|
24
|
+
}
|
25
|
+
|
26
|
+
Definition* make_c_function(Sass_Function_Entry c_func, Context& ctx)
|
27
|
+
{
|
28
|
+
using namespace Prelexer;
|
29
|
+
|
30
|
+
const char* sig = sass_function_get_signature(c_func);
|
31
|
+
Parser sig_parser = Parser::from_c_str(sig, ctx, ctx.traces, ParserState("[c function]"));
|
32
|
+
// allow to overload generic callback plus @warn, @error and @debug with custom functions
|
33
|
+
sig_parser.lex < alternatives < identifier, exactly <'*'>,
|
34
|
+
exactly < Constants::warn_kwd >,
|
35
|
+
exactly < Constants::error_kwd >,
|
36
|
+
exactly < Constants::debug_kwd >
|
37
|
+
> >();
|
38
|
+
std::string name(Util::normalize_underscores(sig_parser.lexed));
|
39
|
+
Parameters_Obj params = sig_parser.parse_parameters();
|
40
|
+
return SASS_MEMORY_NEW(Definition,
|
41
|
+
ParserState("[c function]"),
|
42
|
+
sig,
|
43
|
+
name,
|
44
|
+
params,
|
45
|
+
c_func);
|
46
|
+
}
|
47
|
+
|
48
|
+
namespace Functions {
|
49
|
+
|
50
|
+
std::string function_name(Signature sig)
|
51
|
+
{
|
52
|
+
std::string str(sig);
|
53
|
+
return str.substr(0, str.find('('));
|
54
|
+
}
|
55
|
+
|
56
|
+
Map* get_arg_m(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
|
57
|
+
{
|
58
|
+
AST_Node* value = env[argname];
|
59
|
+
if (Map* map = Cast<Map>(value)) return map;
|
60
|
+
List* list = Cast<List>(value);
|
61
|
+
if (list && list->length() == 0) {
|
62
|
+
return SASS_MEMORY_NEW(Map, pstate, 0);
|
63
|
+
}
|
64
|
+
return get_arg<Map>(argname, env, sig, pstate, traces);
|
65
|
+
}
|
66
|
+
|
67
|
+
double get_arg_r(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, double lo, double hi)
|
68
|
+
{
|
69
|
+
Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
|
70
|
+
Number tmpnr(val);
|
71
|
+
tmpnr.reduce();
|
72
|
+
double v = tmpnr.value();
|
73
|
+
if (!(lo <= v && v <= hi)) {
|
74
|
+
std::stringstream msg;
|
75
|
+
msg << "argument `" << argname << "` of `" << sig << "` must be between ";
|
76
|
+
msg << lo << " and " << hi;
|
77
|
+
error(msg.str(), pstate, traces);
|
78
|
+
}
|
79
|
+
return v;
|
80
|
+
}
|
81
|
+
|
82
|
+
Number* get_arg_n(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
|
83
|
+
{
|
84
|
+
Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
|
85
|
+
val = SASS_MEMORY_COPY(val);
|
86
|
+
val->reduce();
|
87
|
+
return val;
|
88
|
+
}
|
89
|
+
|
90
|
+
double get_arg_val(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
|
91
|
+
{
|
92
|
+
Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
|
93
|
+
Number tmpnr(val);
|
94
|
+
tmpnr.reduce();
|
95
|
+
return tmpnr.value();
|
96
|
+
}
|
97
|
+
|
98
|
+
double color_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
|
99
|
+
{
|
100
|
+
Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
|
101
|
+
Number tmpnr(val);
|
102
|
+
tmpnr.reduce();
|
103
|
+
if (tmpnr.unit() == "%") {
|
104
|
+
return std::min(std::max(tmpnr.value() * 255 / 100.0, 0.0), 255.0);
|
105
|
+
} else {
|
106
|
+
return std::min(std::max(tmpnr.value(), 0.0), 255.0);
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
double alpha_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces) {
|
111
|
+
Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
|
112
|
+
Number tmpnr(val);
|
113
|
+
tmpnr.reduce();
|
114
|
+
if (tmpnr.unit() == "%") {
|
115
|
+
return std::min(std::max(tmpnr.value(), 0.0), 100.0);
|
116
|
+
} else {
|
117
|
+
return std::min(std::max(tmpnr.value(), 0.0), 1.0);
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
Selector_List_Obj get_arg_sels(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx) {
|
122
|
+
Expression_Obj exp = ARG(argname, Expression);
|
123
|
+
if (exp->concrete_type() == Expression::NULL_VAL) {
|
124
|
+
std::stringstream msg;
|
125
|
+
msg << argname << ": null is not a valid selector: it must be a string,\n";
|
126
|
+
msg << "a list of strings, or a list of lists of strings for `" << function_name(sig) << "'";
|
127
|
+
error(msg.str(), exp->pstate(), traces);
|
128
|
+
}
|
129
|
+
if (String_Constant* str = Cast<String_Constant>(exp)) {
|
130
|
+
str->quote_mark(0);
|
131
|
+
}
|
132
|
+
std::string exp_src = exp->to_string(ctx.c_options);
|
133
|
+
return Parser::parse_selector(exp_src.c_str(), ctx, traces, exp->pstate(), pstate.src, /*allow_parent=*/false);
|
134
|
+
}
|
135
|
+
|
136
|
+
Compound_Selector_Obj get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx) {
|
137
|
+
Expression_Obj exp = ARG(argname, Expression);
|
138
|
+
if (exp->concrete_type() == Expression::NULL_VAL) {
|
139
|
+
std::stringstream msg;
|
140
|
+
msg << argname << ": null is not a string for `" << function_name(sig) << "'";
|
141
|
+
error(msg.str(), exp->pstate(), traces);
|
142
|
+
}
|
143
|
+
if (String_Constant* str = Cast<String_Constant>(exp)) {
|
144
|
+
str->quote_mark(0);
|
145
|
+
}
|
146
|
+
std::string exp_src = exp->to_string(ctx.c_options);
|
147
|
+
Selector_List_Obj sel_list = Parser::parse_selector(exp_src.c_str(), ctx, traces, exp->pstate(), pstate.src, /*allow_parent=*/false);
|
148
|
+
if (sel_list->length() == 0) return {};
|
149
|
+
Complex_Selector_Obj first = sel_list->first();
|
150
|
+
if (!first->tail()) return first->head();
|
151
|
+
return first->tail()->head();
|
152
|
+
}
|
153
|
+
|
154
|
+
}
|
155
|
+
|
156
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#ifndef SASS_FN_UTILS_H
|
2
|
+
#define SASS_FN_UTILS_H
|
3
|
+
#include "units.hpp"
|
4
|
+
#include "backtrace.hpp"
|
5
|
+
#include "environment.hpp"
|
6
|
+
#include "ast_fwd_decl.hpp"
|
7
|
+
#include "error_handling.hpp"
|
8
|
+
|
9
|
+
namespace Sass {
|
10
|
+
|
11
|
+
#define FN_PROTOTYPE \
|
12
|
+
Env& env, \
|
13
|
+
Env& d_env, \
|
14
|
+
Context& ctx, \
|
15
|
+
Signature sig, \
|
16
|
+
ParserState pstate, \
|
17
|
+
Backtraces& traces, \
|
18
|
+
SelectorStack& selector_stack
|
19
|
+
|
20
|
+
typedef const char* Signature;
|
21
|
+
typedef PreValue* (*Native_Function)(FN_PROTOTYPE);
|
22
|
+
#define BUILT_IN(name) PreValue* name(FN_PROTOTYPE)
|
23
|
+
|
24
|
+
#define ARG(argname, argtype) get_arg<argtype>(argname, env, sig, pstate, traces)
|
25
|
+
// special function for weird hsla percent (10px == 10% == 10 != 0.1)
|
26
|
+
#define ARGVAL(argname) get_arg_val(argname, env, sig, pstate, traces) // double
|
27
|
+
|
28
|
+
Definition* make_native_function(Signature, Native_Function, Context& ctx);
|
29
|
+
Definition* make_c_function(Sass_Function_Entry c_func, Context& ctx);
|
30
|
+
|
31
|
+
namespace Functions {
|
32
|
+
|
33
|
+
template <typename T>
|
34
|
+
T* get_arg(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
|
35
|
+
{
|
36
|
+
T* val = Cast<T>(env[argname]);
|
37
|
+
if (!val) {
|
38
|
+
error("argument `" + argname + "` of `" + sig + "` must be a " + T::type_name(), pstate, traces);
|
39
|
+
}
|
40
|
+
return val;
|
41
|
+
}
|
42
|
+
|
43
|
+
Map* get_arg_m(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // maps only
|
44
|
+
Number* get_arg_n(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // numbers only
|
45
|
+
double alpha_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // colors only
|
46
|
+
double color_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // colors only
|
47
|
+
double get_arg_r(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, double lo, double hi); // colors only
|
48
|
+
double get_arg_val(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // shared
|
49
|
+
Selector_List_Obj get_arg_sels(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx); // selectors only
|
50
|
+
Compound_Selector_Obj get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx); // selectors only
|
51
|
+
|
52
|
+
}
|
53
|
+
|
54
|
+
}
|
55
|
+
|
56
|
+
#endif
|
data/ext/libsass/src/inspect.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 <cmath>
|
3
6
|
#include <string>
|
4
7
|
#include <iostream>
|
@@ -21,7 +24,7 @@ namespace Sass {
|
|
21
24
|
Inspect::~Inspect() { }
|
22
25
|
|
23
26
|
// statements
|
24
|
-
void Inspect::operator()(
|
27
|
+
void Inspect::operator()(Block* block)
|
25
28
|
{
|
26
29
|
if (!block->is_root()) {
|
27
30
|
add_open_mapping(block);
|
@@ -39,25 +42,23 @@ namespace Sass {
|
|
39
42
|
|
40
43
|
}
|
41
44
|
|
42
|
-
void Inspect::operator()(
|
45
|
+
void Inspect::operator()(Ruleset* ruleset)
|
43
46
|
{
|
44
47
|
if (ruleset->selector()) {
|
45
|
-
opt.in_selector = true;
|
46
48
|
ruleset->selector()->perform(this);
|
47
|
-
opt.in_selector = false;
|
48
49
|
}
|
49
50
|
if (ruleset->block()) {
|
50
51
|
ruleset->block()->perform(this);
|
51
52
|
}
|
52
53
|
}
|
53
54
|
|
54
|
-
void Inspect::operator()(
|
55
|
+
void Inspect::operator()(Keyframe_Rule* rule)
|
55
56
|
{
|
56
57
|
if (rule->name()) rule->name()->perform(this);
|
57
58
|
if (rule->block()) rule->block()->perform(this);
|
58
59
|
}
|
59
60
|
|
60
|
-
void Inspect::operator()(
|
61
|
+
void Inspect::operator()(Bubble* bubble)
|
61
62
|
{
|
62
63
|
append_indentation();
|
63
64
|
append_token("::BUBBLE", bubble);
|
@@ -66,7 +67,7 @@ namespace Sass {
|
|
66
67
|
append_scope_closer();
|
67
68
|
}
|
68
69
|
|
69
|
-
void Inspect::operator()(
|
70
|
+
void Inspect::operator()(Media_Block* media_block)
|
70
71
|
{
|
71
72
|
append_indentation();
|
72
73
|
append_token("@media", media_block);
|
@@ -77,7 +78,7 @@ namespace Sass {
|
|
77
78
|
media_block->block()->perform(this);
|
78
79
|
}
|
79
80
|
|
80
|
-
void Inspect::operator()(
|
81
|
+
void Inspect::operator()(Supports_Block* feature_block)
|
81
82
|
{
|
82
83
|
append_indentation();
|
83
84
|
append_token("@supports", feature_block);
|
@@ -86,7 +87,7 @@ namespace Sass {
|
|
86
87
|
feature_block->block()->perform(this);
|
87
88
|
}
|
88
89
|
|
89
|
-
void Inspect::operator()(
|
90
|
+
void Inspect::operator()(At_Root_Block* at_root_block)
|
90
91
|
{
|
91
92
|
append_indentation();
|
92
93
|
append_token("@at-root ", at_root_block);
|
@@ -95,7 +96,7 @@ namespace Sass {
|
|
95
96
|
if(at_root_block->block()) at_root_block->block()->perform(this);
|
96
97
|
}
|
97
98
|
|
98
|
-
void Inspect::operator()(
|
99
|
+
void Inspect::operator()(Directive* at_rule)
|
99
100
|
{
|
100
101
|
append_indentation();
|
101
102
|
append_token(at_rule->keyword(), at_rule);
|
@@ -118,7 +119,7 @@ namespace Sass {
|
|
118
119
|
}
|
119
120
|
}
|
120
121
|
|
121
|
-
void Inspect::operator()(
|
122
|
+
void Inspect::operator()(Declaration* dec)
|
122
123
|
{
|
123
124
|
if (dec->value()->concrete_type() == Expression::NULL_VAL) return;
|
124
125
|
bool was_decl = in_declaration;
|
@@ -150,7 +151,7 @@ namespace Sass {
|
|
150
151
|
in_declaration = was_decl;
|
151
152
|
}
|
152
153
|
|
153
|
-
void Inspect::operator()(
|
154
|
+
void Inspect::operator()(Assignment* assn)
|
154
155
|
{
|
155
156
|
append_token(assn->variable(), assn);
|
156
157
|
append_colon_separator();
|
@@ -162,7 +163,7 @@ namespace Sass {
|
|
162
163
|
append_delimiter();
|
163
164
|
}
|
164
165
|
|
165
|
-
void Inspect::operator()(
|
166
|
+
void Inspect::operator()(Import* import)
|
166
167
|
{
|
167
168
|
if (!import->urls().empty()) {
|
168
169
|
append_token("@import", import);
|
@@ -193,7 +194,7 @@ namespace Sass {
|
|
193
194
|
}
|
194
195
|
}
|
195
196
|
|
196
|
-
void Inspect::operator()(
|
197
|
+
void Inspect::operator()(Import_Stub* import)
|
197
198
|
{
|
198
199
|
append_indentation();
|
199
200
|
append_token("@import", import);
|
@@ -202,7 +203,7 @@ namespace Sass {
|
|
202
203
|
append_delimiter();
|
203
204
|
}
|
204
205
|
|
205
|
-
void Inspect::operator()(
|
206
|
+
void Inspect::operator()(Warning* warning)
|
206
207
|
{
|
207
208
|
append_indentation();
|
208
209
|
append_token("@warn", warning);
|
@@ -211,7 +212,7 @@ namespace Sass {
|
|
211
212
|
append_delimiter();
|
212
213
|
}
|
213
214
|
|
214
|
-
void Inspect::operator()(
|
215
|
+
void Inspect::operator()(Error* error)
|
215
216
|
{
|
216
217
|
append_indentation();
|
217
218
|
append_token("@error", error);
|
@@ -220,7 +221,7 @@ namespace Sass {
|
|
220
221
|
append_delimiter();
|
221
222
|
}
|
222
223
|
|
223
|
-
void Inspect::operator()(
|
224
|
+
void Inspect::operator()(Debug* debug)
|
224
225
|
{
|
225
226
|
append_indentation();
|
226
227
|
append_token("@debug", debug);
|
@@ -229,14 +230,14 @@ namespace Sass {
|
|
229
230
|
append_delimiter();
|
230
231
|
}
|
231
232
|
|
232
|
-
void Inspect::operator()(
|
233
|
+
void Inspect::operator()(Comment* comment)
|
233
234
|
{
|
234
235
|
in_comment = true;
|
235
236
|
comment->text()->perform(this);
|
236
237
|
in_comment = false;
|
237
238
|
}
|
238
239
|
|
239
|
-
void Inspect::operator()(
|
240
|
+
void Inspect::operator()(If* cond)
|
240
241
|
{
|
241
242
|
append_indentation();
|
242
243
|
append_token("@if", cond);
|
@@ -251,7 +252,7 @@ namespace Sass {
|
|
251
252
|
}
|
252
253
|
}
|
253
254
|
|
254
|
-
void Inspect::operator()(
|
255
|
+
void Inspect::operator()(For* loop)
|
255
256
|
{
|
256
257
|
append_indentation();
|
257
258
|
append_token("@for", loop);
|
@@ -264,7 +265,7 @@ namespace Sass {
|
|
264
265
|
loop->block()->perform(this);
|
265
266
|
}
|
266
267
|
|
267
|
-
void Inspect::operator()(
|
268
|
+
void Inspect::operator()(Each* loop)
|
268
269
|
{
|
269
270
|
append_indentation();
|
270
271
|
append_token("@each", loop);
|
@@ -279,7 +280,7 @@ namespace Sass {
|
|
279
280
|
loop->block()->perform(this);
|
280
281
|
}
|
281
282
|
|
282
|
-
void Inspect::operator()(
|
283
|
+
void Inspect::operator()(While* loop)
|
283
284
|
{
|
284
285
|
append_indentation();
|
285
286
|
append_token("@while", loop);
|
@@ -288,7 +289,7 @@ namespace Sass {
|
|
288
289
|
loop->block()->perform(this);
|
289
290
|
}
|
290
291
|
|
291
|
-
void Inspect::operator()(
|
292
|
+
void Inspect::operator()(Return* ret)
|
292
293
|
{
|
293
294
|
append_indentation();
|
294
295
|
append_token("@return", ret);
|
@@ -297,7 +298,7 @@ namespace Sass {
|
|
297
298
|
append_delimiter();
|
298
299
|
}
|
299
300
|
|
300
|
-
void Inspect::operator()(
|
301
|
+
void Inspect::operator()(Extension* extend)
|
301
302
|
{
|
302
303
|
append_indentation();
|
303
304
|
append_token("@extend", extend);
|
@@ -306,7 +307,7 @@ namespace Sass {
|
|
306
307
|
append_delimiter();
|
307
308
|
}
|
308
309
|
|
309
|
-
void Inspect::operator()(
|
310
|
+
void Inspect::operator()(Definition* def)
|
310
311
|
{
|
311
312
|
append_indentation();
|
312
313
|
if (def->type() == Definition::MIXIN) {
|
@@ -321,7 +322,7 @@ namespace Sass {
|
|
321
322
|
def->block()->perform(this);
|
322
323
|
}
|
323
324
|
|
324
|
-
void Inspect::operator()(
|
325
|
+
void Inspect::operator()(Mixin_Call* call)
|
325
326
|
{
|
326
327
|
append_indentation();
|
327
328
|
append_token("@include", call);
|
@@ -337,14 +338,14 @@ namespace Sass {
|
|
337
338
|
if (!call->block()) append_delimiter();
|
338
339
|
}
|
339
340
|
|
340
|
-
void Inspect::operator()(
|
341
|
+
void Inspect::operator()(Content* content)
|
341
342
|
{
|
342
343
|
append_indentation();
|
343
344
|
append_token("@content", content);
|
344
345
|
append_delimiter();
|
345
346
|
}
|
346
347
|
|
347
|
-
void Inspect::operator()(
|
348
|
+
void Inspect::operator()(Map* map)
|
348
349
|
{
|
349
350
|
if (output_style() == TO_SASS && map->empty()) {
|
350
351
|
append_string("()");
|
@@ -366,15 +367,15 @@ namespace Sass {
|
|
366
367
|
append_string(")");
|
367
368
|
}
|
368
369
|
|
369
|
-
std::string Inspect::lbracket(
|
370
|
+
std::string Inspect::lbracket(List* list) {
|
370
371
|
return list->is_bracketed() ? "[" : "(";
|
371
372
|
}
|
372
373
|
|
373
|
-
std::string Inspect::rbracket(
|
374
|
+
std::string Inspect::rbracket(List* list) {
|
374
375
|
return list->is_bracketed() ? "]" : ")";
|
375
376
|
}
|
376
377
|
|
377
|
-
void Inspect::operator()(
|
378
|
+
void Inspect::operator()(List* list)
|
378
379
|
{
|
379
380
|
if (list->empty() && (output_style() == TO_SASS || list->is_bracketed())) {
|
380
381
|
append_string(lbracket(list));
|
@@ -462,7 +463,7 @@ namespace Sass {
|
|
462
463
|
|
463
464
|
}
|
464
465
|
|
465
|
-
void Inspect::operator()(
|
466
|
+
void Inspect::operator()(Binary_Expression* expr)
|
466
467
|
{
|
467
468
|
expr->left()->perform(this);
|
468
469
|
if ( in_media_block ||
|
@@ -499,7 +500,7 @@ namespace Sass {
|
|
499
500
|
expr->right()->perform(this);
|
500
501
|
}
|
501
502
|
|
502
|
-
void Inspect::operator()(
|
503
|
+
void Inspect::operator()(Unary_Expression* expr)
|
503
504
|
{
|
504
505
|
if (expr->optype() == Unary_Expression::PLUS) append_string("+");
|
505
506
|
else if (expr->optype() == Unary_Expression::SLASH) append_string("/");
|
@@ -507,91 +508,42 @@ namespace Sass {
|
|
507
508
|
expr->operand()->perform(this);
|
508
509
|
}
|
509
510
|
|
510
|
-
void Inspect::operator()(
|
511
|
+
void Inspect::operator()(Function_Call* call)
|
511
512
|
{
|
512
513
|
append_token(call->name(), call);
|
513
514
|
call->arguments()->perform(this);
|
514
515
|
}
|
515
516
|
|
516
|
-
void Inspect::operator()(
|
517
|
-
{
|
518
|
-
call->name()->perform(this);
|
519
|
-
call->arguments()->perform(this);
|
520
|
-
}
|
521
|
-
|
522
|
-
void Inspect::operator()(Variable_Ptr var)
|
517
|
+
void Inspect::operator()(Variable* var)
|
523
518
|
{
|
524
519
|
append_token(var->name(), var);
|
525
520
|
}
|
526
521
|
|
527
|
-
void Inspect::operator()(
|
522
|
+
void Inspect::operator()(Number* n)
|
528
523
|
{
|
529
524
|
|
530
|
-
std::string res;
|
531
|
-
|
532
525
|
// reduce units
|
533
526
|
n->reduce();
|
534
527
|
|
535
|
-
// check if the fractional part of the value equals to zero
|
536
|
-
// neat trick from http://stackoverflow.com/a/1521682/1550314
|
537
|
-
// double int_part; bool is_int = modf(value, &int_part) == 0.0;
|
538
|
-
|
539
|
-
// this all cannot be done with one run only, since fixed
|
540
|
-
// output differs from normal output and regular output
|
541
|
-
// can contain scientific notation which we do not want!
|
542
|
-
|
543
|
-
// first sample
|
544
528
|
std::stringstream ss;
|
545
|
-
ss.precision(
|
546
|
-
ss << n->value();
|
547
|
-
|
548
|
-
// check if we got scientific notation in result
|
549
|
-
if (ss.str().find_first_of("e") != std::string::npos) {
|
550
|
-
ss.clear(); ss.str(std::string());
|
551
|
-
ss.precision(std::max(12, opt.precision));
|
552
|
-
ss << std::fixed << n->value();
|
553
|
-
}
|
554
|
-
|
555
|
-
std::string tmp = ss.str();
|
556
|
-
size_t pos_point = tmp.find_first_of(".,");
|
557
|
-
size_t pos_fract = tmp.find_last_not_of("0");
|
558
|
-
bool is_int = pos_point == pos_fract ||
|
559
|
-
pos_point == std::string::npos;
|
529
|
+
ss.precision(opt.precision);
|
530
|
+
ss << std::fixed << n->value();
|
560
531
|
|
561
|
-
|
562
|
-
|
532
|
+
std::string res = ss.str();
|
533
|
+
int s = res.length();
|
563
534
|
|
564
|
-
//
|
565
|
-
|
535
|
+
// delete trailing zeros
|
536
|
+
for(s = s - 1; s > 0; --s)
|
566
537
|
{
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
// process floats
|
572
|
-
else
|
573
|
-
{
|
574
|
-
// do we have have too much precision?
|
575
|
-
if (pos_fract < opt.precision + pos_point)
|
576
|
-
{ ss.precision((int)(pos_fract - pos_point)); }
|
577
|
-
else { ss.precision(opt.precision); }
|
578
|
-
// round value again
|
579
|
-
ss << std::fixed << n->value();
|
580
|
-
res = std::string(ss.str());
|
581
|
-
// maybe we truncated up to decimal point
|
582
|
-
size_t pos = res.find_last_not_of("0");
|
583
|
-
// handle case where we have a "0"
|
584
|
-
if (pos == std::string::npos) {
|
585
|
-
res = "0.0";
|
586
|
-
} else {
|
587
|
-
bool at_dec_point = res[pos] == '.' ||
|
588
|
-
res[pos] == ',';
|
589
|
-
// don't leave a blank point
|
590
|
-
if (at_dec_point) ++ pos;
|
591
|
-
res.resize (pos + 1);
|
592
|
-
}
|
538
|
+
if(res[s] == '0') {
|
539
|
+
res.erase(s, 1);
|
540
|
+
}
|
541
|
+
else break;
|
593
542
|
}
|
594
543
|
|
544
|
+
// delete trailing decimal separator
|
545
|
+
if(res[s] == '.') res.erase(s, 1);
|
546
|
+
|
595
547
|
// some final cosmetics
|
596
548
|
if (res == "0.0") res = "0";
|
597
549
|
else if (res == "") res = "0";
|
@@ -599,10 +551,12 @@ namespace Sass {
|
|
599
551
|
else if (res == "-0.0") res = "0";
|
600
552
|
else if (opt.output_style == COMPRESSED)
|
601
553
|
{
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
554
|
+
if (n->zero()) {
|
555
|
+
// check if handling negative nr
|
556
|
+
size_t off = res[0] == '-' ? 1 : 0;
|
557
|
+
// remove leading zero from floating point in compressed mode
|
558
|
+
if (res[off] == '0' && res[off+1] == '.') res.erase(off, 1);
|
559
|
+
}
|
606
560
|
}
|
607
561
|
|
608
562
|
// add unit now
|
@@ -620,7 +574,7 @@ namespace Sass {
|
|
620
574
|
else return c;
|
621
575
|
}
|
622
576
|
|
623
|
-
void Inspect::operator()(
|
577
|
+
void Inspect::operator()(Color_RGBA* c)
|
624
578
|
{
|
625
579
|
// output the final token
|
626
580
|
std::stringstream ss;
|
@@ -629,11 +583,6 @@ namespace Sass {
|
|
629
583
|
// maybe an unknown token
|
630
584
|
std::string name = c->disp();
|
631
585
|
|
632
|
-
if (opt.in_selector && name != "") {
|
633
|
-
append_token(name, c);
|
634
|
-
return;
|
635
|
-
}
|
636
|
-
|
637
586
|
// resolved color
|
638
587
|
std::string res_name = name;
|
639
588
|
|
@@ -644,7 +593,7 @@ namespace Sass {
|
|
644
593
|
|
645
594
|
// get color from given name (if one was given at all)
|
646
595
|
if (name != "" && name_to_color(name)) {
|
647
|
-
|
596
|
+
const Color_RGBA* n = name_to_color(name);
|
648
597
|
r = Sass::round(cap_channel<0xff>(n->r()), opt.precision);
|
649
598
|
g = Sass::round(cap_channel<0xff>(n->g()), opt.precision);
|
650
599
|
b = Sass::round(cap_channel<0xff>(n->b()), opt.precision);
|
@@ -658,6 +607,9 @@ namespace Sass {
|
|
658
607
|
}
|
659
608
|
|
660
609
|
std::stringstream hexlet;
|
610
|
+
// dart sass compressed all colors in regular css always
|
611
|
+
// ruby sass and libsass does it only when not delayed
|
612
|
+
// since color math is going to be removed, this can go too
|
661
613
|
bool compressed = opt.output_style == COMPRESSED;
|
662
614
|
hexlet << '#' << std::setw(1) << std::setfill('0');
|
663
615
|
// create a short color hexlet if there is any need for it
|
@@ -681,9 +633,6 @@ namespace Sass {
|
|
681
633
|
if (name != "") {
|
682
634
|
ss << name;
|
683
635
|
}
|
684
|
-
else if (r == 0 && g == 0 && b == 0 && a == 0) {
|
685
|
-
ss << "transparent";
|
686
|
-
}
|
687
636
|
else if (a >= 1) {
|
688
637
|
if (res_name != "") {
|
689
638
|
if (compressed && hexlet.str().size() < res_name.size()) {
|
@@ -711,13 +660,19 @@ namespace Sass {
|
|
711
660
|
|
712
661
|
}
|
713
662
|
|
714
|
-
void Inspect::operator()(
|
663
|
+
void Inspect::operator()(Color_HSLA* c)
|
664
|
+
{
|
665
|
+
Color_RGBA_Obj rgba = c->toRGBA();
|
666
|
+
operator()(rgba);
|
667
|
+
}
|
668
|
+
|
669
|
+
void Inspect::operator()(Boolean* b)
|
715
670
|
{
|
716
671
|
// output the final token
|
717
672
|
append_token(b->value() ? "true" : "false", b);
|
718
673
|
}
|
719
674
|
|
720
|
-
void Inspect::operator()(
|
675
|
+
void Inspect::operator()(String_Schema* ss)
|
721
676
|
{
|
722
677
|
// Evaluation should turn these into String_Constants,
|
723
678
|
// so this method is only for inspection purposes.
|
@@ -728,12 +683,12 @@ namespace Sass {
|
|
728
683
|
}
|
729
684
|
}
|
730
685
|
|
731
|
-
void Inspect::operator()(
|
686
|
+
void Inspect::operator()(String_Constant* s)
|
732
687
|
{
|
733
688
|
append_token(s->value(), s);
|
734
689
|
}
|
735
690
|
|
736
|
-
void Inspect::operator()(
|
691
|
+
void Inspect::operator()(String_Quoted* s)
|
737
692
|
{
|
738
693
|
if (const char q = s->quote_mark()) {
|
739
694
|
append_token(quote(s->value(), q), s);
|
@@ -742,17 +697,17 @@ namespace Sass {
|
|
742
697
|
}
|
743
698
|
}
|
744
699
|
|
745
|
-
void Inspect::operator()(
|
700
|
+
void Inspect::operator()(Custom_Error* e)
|
746
701
|
{
|
747
702
|
append_token(e->message(), e);
|
748
703
|
}
|
749
704
|
|
750
|
-
void Inspect::operator()(
|
705
|
+
void Inspect::operator()(Custom_Warning* w)
|
751
706
|
{
|
752
707
|
append_token(w->message(), w);
|
753
708
|
}
|
754
709
|
|
755
|
-
void Inspect::operator()(
|
710
|
+
void Inspect::operator()(Supports_Operator* so)
|
756
711
|
{
|
757
712
|
|
758
713
|
if (so->needs_parens(so->left())) append_string("(");
|
@@ -774,7 +729,7 @@ namespace Sass {
|
|
774
729
|
if (so->needs_parens(so->right())) append_string(")");
|
775
730
|
}
|
776
731
|
|
777
|
-
void Inspect::operator()(
|
732
|
+
void Inspect::operator()(Supports_Negation* sn)
|
778
733
|
{
|
779
734
|
append_token("not", sn);
|
780
735
|
append_mandatory_space();
|
@@ -783,7 +738,7 @@ namespace Sass {
|
|
783
738
|
if (sn->needs_parens(sn->condition())) append_string(")");
|
784
739
|
}
|
785
740
|
|
786
|
-
void Inspect::operator()(
|
741
|
+
void Inspect::operator()(Supports_Declaration* sd)
|
787
742
|
{
|
788
743
|
append_string("(");
|
789
744
|
sd->feature()->perform(this);
|
@@ -792,12 +747,12 @@ namespace Sass {
|
|
792
747
|
append_string(")");
|
793
748
|
}
|
794
749
|
|
795
|
-
void Inspect::operator()(
|
750
|
+
void Inspect::operator()(Supports_Interpolation* sd)
|
796
751
|
{
|
797
752
|
sd->value()->perform(this);
|
798
753
|
}
|
799
754
|
|
800
|
-
void Inspect::operator()(
|
755
|
+
void Inspect::operator()(Media_Query* mq)
|
801
756
|
{
|
802
757
|
size_t i = 0;
|
803
758
|
if (mq->media_type()) {
|
@@ -814,7 +769,7 @@ namespace Sass {
|
|
814
769
|
}
|
815
770
|
}
|
816
771
|
|
817
|
-
void Inspect::operator()(
|
772
|
+
void Inspect::operator()(Media_Query_Expression* mqe)
|
818
773
|
{
|
819
774
|
if (mqe->is_interpolated()) {
|
820
775
|
mqe->feature()->perform(this);
|
@@ -830,7 +785,7 @@ namespace Sass {
|
|
830
785
|
}
|
831
786
|
}
|
832
787
|
|
833
|
-
void Inspect::operator()(
|
788
|
+
void Inspect::operator()(At_Root_Query* ae)
|
834
789
|
{
|
835
790
|
if (ae->feature()) {
|
836
791
|
append_string("(");
|
@@ -843,7 +798,7 @@ namespace Sass {
|
|
843
798
|
}
|
844
799
|
}
|
845
800
|
|
846
|
-
void Inspect::operator()(
|
801
|
+
void Inspect::operator()(Function* f)
|
847
802
|
{
|
848
803
|
append_token("get-function", f);
|
849
804
|
append_string("(");
|
@@ -851,14 +806,14 @@ namespace Sass {
|
|
851
806
|
append_string(")");
|
852
807
|
}
|
853
808
|
|
854
|
-
void Inspect::operator()(
|
809
|
+
void Inspect::operator()(Null* n)
|
855
810
|
{
|
856
811
|
// output the final token
|
857
812
|
append_token("null", n);
|
858
813
|
}
|
859
814
|
|
860
815
|
// parameters and arguments
|
861
|
-
void Inspect::operator()(
|
816
|
+
void Inspect::operator()(Parameter* p)
|
862
817
|
{
|
863
818
|
append_token(p->name(), p);
|
864
819
|
if (p->default_value()) {
|
@@ -870,7 +825,7 @@ namespace Sass {
|
|
870
825
|
}
|
871
826
|
}
|
872
827
|
|
873
|
-
void Inspect::operator()(
|
828
|
+
void Inspect::operator()(Parameters* p)
|
874
829
|
{
|
875
830
|
append_string("(");
|
876
831
|
if (!p->empty()) {
|
@@ -883,7 +838,7 @@ namespace Sass {
|
|
883
838
|
append_string(")");
|
884
839
|
}
|
885
840
|
|
886
|
-
void Inspect::operator()(
|
841
|
+
void Inspect::operator()(Argument* a)
|
887
842
|
{
|
888
843
|
if (!a->name().empty()) {
|
889
844
|
append_token(a->name(), a);
|
@@ -895,7 +850,7 @@ namespace Sass {
|
|
895
850
|
return;
|
896
851
|
}
|
897
852
|
if (a->value()->concrete_type() == Expression::STRING) {
|
898
|
-
|
853
|
+
String_Constant* s = Cast<String_Constant>(a->value());
|
899
854
|
if (s) s->perform(this);
|
900
855
|
} else {
|
901
856
|
a->value()->perform(this);
|
@@ -905,7 +860,7 @@ namespace Sass {
|
|
905
860
|
}
|
906
861
|
}
|
907
862
|
|
908
|
-
void Inspect::operator()(
|
863
|
+
void Inspect::operator()(Arguments* a)
|
909
864
|
{
|
910
865
|
append_string("(");
|
911
866
|
if (!a->empty()) {
|
@@ -919,19 +874,17 @@ namespace Sass {
|
|
919
874
|
append_string(")");
|
920
875
|
}
|
921
876
|
|
922
|
-
void Inspect::operator()(
|
877
|
+
void Inspect::operator()(Selector_Schema* s)
|
923
878
|
{
|
924
|
-
opt.in_selector = true;
|
925
879
|
s->contents()->perform(this);
|
926
|
-
opt.in_selector = false;
|
927
880
|
}
|
928
881
|
|
929
|
-
void Inspect::operator()(
|
882
|
+
void Inspect::operator()(Parent_Selector* p)
|
930
883
|
{
|
931
|
-
if (p->
|
884
|
+
if (p->real()) append_string("&");
|
932
885
|
}
|
933
886
|
|
934
|
-
void Inspect::operator()(
|
887
|
+
void Inspect::operator()(Placeholder_Selector* s)
|
935
888
|
{
|
936
889
|
append_token(s->name(), s);
|
937
890
|
if (s->has_line_break()) append_optional_linefeed();
|
@@ -939,26 +892,26 @@ namespace Sass {
|
|
939
892
|
|
940
893
|
}
|
941
894
|
|
942
|
-
void Inspect::operator()(
|
895
|
+
void Inspect::operator()(Type_Selector* s)
|
943
896
|
{
|
944
897
|
append_token(s->ns_name(), s);
|
945
898
|
}
|
946
899
|
|
947
|
-
void Inspect::operator()(
|
900
|
+
void Inspect::operator()(Class_Selector* s)
|
948
901
|
{
|
949
902
|
append_token(s->ns_name(), s);
|
950
903
|
if (s->has_line_break()) append_optional_linefeed();
|
951
904
|
if (s->has_line_break()) append_indentation();
|
952
905
|
}
|
953
906
|
|
954
|
-
void Inspect::operator()(
|
907
|
+
void Inspect::operator()(Id_Selector* s)
|
955
908
|
{
|
956
909
|
append_token(s->ns_name(), s);
|
957
910
|
if (s->has_line_break()) append_optional_linefeed();
|
958
911
|
if (s->has_line_break()) append_indentation();
|
959
912
|
}
|
960
913
|
|
961
|
-
void Inspect::operator()(
|
914
|
+
void Inspect::operator()(Attribute_Selector* s)
|
962
915
|
{
|
963
916
|
append_string("[");
|
964
917
|
add_open_mapping(s);
|
@@ -977,7 +930,7 @@ namespace Sass {
|
|
977
930
|
append_string("]");
|
978
931
|
}
|
979
932
|
|
980
|
-
void Inspect::operator()(
|
933
|
+
void Inspect::operator()(Pseudo_Selector* s)
|
981
934
|
{
|
982
935
|
append_token(s->ns_name(), s);
|
983
936
|
if (s->expression()) {
|
@@ -987,7 +940,7 @@ namespace Sass {
|
|
987
940
|
}
|
988
941
|
}
|
989
942
|
|
990
|
-
void Inspect::operator()(
|
943
|
+
void Inspect::operator()(Wrapped_Selector* s)
|
991
944
|
{
|
992
945
|
if (s->name() == " ") {
|
993
946
|
append_string("");
|
@@ -1005,7 +958,7 @@ namespace Sass {
|
|
1005
958
|
}
|
1006
959
|
}
|
1007
960
|
|
1008
|
-
void Inspect::operator()(
|
961
|
+
void Inspect::operator()(Compound_Selector* s)
|
1009
962
|
{
|
1010
963
|
for (size_t i = 0, L = s->length(); i < L; ++i) {
|
1011
964
|
(*s)[i]->perform(this);
|
@@ -1017,7 +970,7 @@ namespace Sass {
|
|
1017
970
|
}
|
1018
971
|
}
|
1019
972
|
|
1020
|
-
void Inspect::operator()(
|
973
|
+
void Inspect::operator()(Complex_Selector* c)
|
1021
974
|
{
|
1022
975
|
Compound_Selector_Obj head = c->head();
|
1023
976
|
Complex_Selector_Obj tail = c->tail();
|
@@ -1057,7 +1010,7 @@ namespace Sass {
|
|
1057
1010
|
case Complex_Selector::REFERENCE:
|
1058
1011
|
append_mandatory_space();
|
1059
1012
|
append_string("/");
|
1060
|
-
c->reference()->perform(this);
|
1013
|
+
if (c->reference()) c->reference()->perform(this);
|
1061
1014
|
append_string("/");
|
1062
1015
|
append_mandatory_space();
|
1063
1016
|
break;
|
@@ -1081,7 +1034,7 @@ namespace Sass {
|
|
1081
1034
|
}
|
1082
1035
|
}
|
1083
1036
|
|
1084
|
-
void Inspect::operator()(
|
1037
|
+
void Inspect::operator()(Selector_List* g)
|
1085
1038
|
{
|
1086
1039
|
|
1087
1040
|
if (g->empty()) {
|
@@ -1131,8 +1084,4 @@ namespace Sass {
|
|
1131
1084
|
|
1132
1085
|
}
|
1133
1086
|
|
1134
|
-
void Inspect::fallback_impl(AST_Node_Ptr n)
|
1135
|
-
{
|
1136
|
-
}
|
1137
|
-
|
1138
1087
|
}
|