sassc 2.3.0 → 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 +1 -0
- data/CHANGELOG.md +5 -0
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/context.h +3 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +117 -117
- data/ext/libsass/src/ast.hpp +160 -162
- data/ext/libsass/src/ast_def_macros.hpp +10 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +2 -2
- data/ext/libsass/src/ast_fwd_decl.hpp +61 -52
- data/ext/libsass/src/ast_helpers.hpp +5 -5
- data/ext/libsass/src/ast_sel_cmp.cpp +18 -18
- data/ext/libsass/src/ast_sel_super.cpp +52 -52
- data/ext/libsass/src/ast_sel_unify.cpp +16 -16
- data/ext/libsass/src/ast_sel_weave.cpp +62 -62
- data/ext/libsass/src/ast_selectors.cpp +87 -77
- data/ext/libsass/src/ast_selectors.hpp +72 -62
- data/ext/libsass/src/ast_supports.cpp +35 -35
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +58 -58
- data/ext/libsass/src/ast_values.hpp +75 -75
- 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 +17 -17
- 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/check_nesting.cpp +36 -36
- data/ext/libsass/src/check_nesting.hpp +2 -2
- data/ext/libsass/src/color_maps.cpp +5 -5
- data/ext/libsass/src/color_maps.hpp +1 -1
- data/ext/libsass/src/context.cpp +63 -60
- data/ext/libsass/src/context.hpp +33 -33
- data/ext/libsass/src/cssize.cpp +30 -29
- data/ext/libsass/src/cssize.hpp +13 -13
- data/ext/libsass/src/dart_helpers.hpp +5 -5
- data/ext/libsass/src/debugger.hpp +127 -128
- data/ext/libsass/src/emitter.cpp +12 -12
- data/ext/libsass/src/emitter.hpp +10 -10
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +24 -24
- data/ext/libsass/src/error_handling.cpp +42 -42
- data/ext/libsass/src/error_handling.hpp +38 -50
- data/ext/libsass/src/eval.cpp +138 -132
- data/ext/libsass/src/eval.hpp +17 -17
- data/ext/libsass/src/eval_selectors.cpp +3 -3
- data/ext/libsass/src/expand.cpp +70 -64
- data/ext/libsass/src/expand.hpp +12 -12
- data/ext/libsass/src/extender.cpp +55 -53
- data/ext/libsass/src/extender.hpp +14 -14
- data/ext/libsass/src/file.cpp +66 -58
- data/ext/libsass/src/file.hpp +23 -25
- data/ext/libsass/src/fn_colors.cpp +9 -9
- data/ext/libsass/src/fn_lists.cpp +18 -18
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +15 -15
- data/ext/libsass/src/fn_numbers.cpp +7 -7
- data/ext/libsass/src/fn_selectors.cpp +8 -8
- data/ext/libsass/src/fn_strings.cpp +34 -22
- data/ext/libsass/src/fn_utils.cpp +29 -26
- data/ext/libsass/src/fn_utils.hpp +10 -10
- data/ext/libsass/src/inspect.cpp +35 -34
- data/ext/libsass/src/inspect.hpp +21 -21
- data/ext/libsass/src/lexer.cpp +3 -1
- data/ext/libsass/src/listize.cpp +2 -2
- 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} +18 -6
- data/ext/libsass/src/operation.hpp +44 -44
- data/ext/libsass/src/operators.cpp +18 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +18 -18
- data/ext/libsass/src/output.cpp +16 -16
- data/ext/libsass/src/output.hpp +5 -5
- data/ext/libsass/src/parser.cpp +327 -345
- data/ext/libsass/src/parser.hpp +77 -87
- data/ext/libsass/src/parser_selectors.cpp +6 -6
- data/ext/libsass/src/permutate.hpp +39 -15
- 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/remove_placeholders.cpp +4 -4
- data/ext/libsass/src/remove_placeholders.hpp +3 -3
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +9 -5
- data/ext/libsass/src/sass_context.cpp +52 -34
- data/ext/libsass/src/sass_values.cpp +8 -10
- 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/units.cpp +19 -19
- 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 +38 -38
- data/ext/libsass/src/util.hpp +18 -18
- data/ext/libsass/src/util_string.cpp +13 -13
- data/ext/libsass/src/util_string.hpp +9 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/native.rb +3 -5
- data/lib/sassc/version.rb +1 -1
- data/test/native_test.rb +4 -4
- metadata +14 -5
- data/lib/sassc/native/lib_c.rb +0 -21
@@ -16,16 +16,16 @@ namespace Sass {
|
|
16
16
|
bool string_argument(AST_Node_Obj obj) {
|
17
17
|
String_Constant* s = Cast<String_Constant>(obj);
|
18
18
|
if (s == nullptr) return false;
|
19
|
-
const
|
19
|
+
const sass::string& str = s->value();
|
20
20
|
return starts_with(str, "calc(") ||
|
21
21
|
starts_with(str, "var(");
|
22
22
|
}
|
23
23
|
|
24
|
-
void hsla_alpha_percent_deprecation(const
|
24
|
+
void hsla_alpha_percent_deprecation(const SourceSpan& pstate, const sass::string val)
|
25
25
|
{
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
sass::string msg("Passing a percentage as the alpha value to hsla() will be interpreted");
|
28
|
+
sass::string tail("differently in future versions of Sass. For now, use " + val + " instead.");
|
29
29
|
|
30
30
|
deprecated(msg, tail, false, pstate);
|
31
31
|
|
@@ -104,7 +104,7 @@ namespace Sass {
|
|
104
104
|
if (
|
105
105
|
string_argument(env["$alpha"])
|
106
106
|
) {
|
107
|
-
|
107
|
+
sass::ostream strm;
|
108
108
|
strm << "rgba("
|
109
109
|
<< (int)c_arg->r() << ", "
|
110
110
|
<< (int)c_arg->g() << ", "
|
@@ -145,7 +145,7 @@ namespace Sass {
|
|
145
145
|
return SASS_MEMORY_NEW(Number, pstate, color->b());
|
146
146
|
}
|
147
147
|
|
148
|
-
Color_RGBA* colormix(Context& ctx,
|
148
|
+
Color_RGBA* colormix(Context& ctx, SourceSpan& pstate, Color* color1, Color* color2, double weight) {
|
149
149
|
Color_RGBA_Obj c1 = color1->toRGBA();
|
150
150
|
Color_RGBA_Obj c2 = color2->toRGBA();
|
151
151
|
double p = weight/100;
|
@@ -230,7 +230,7 @@ namespace Sass {
|
|
230
230
|
Number_Obj val = SASS_MEMORY_COPY(alpha);
|
231
231
|
val->numerators.clear(); // convert
|
232
232
|
val->value(val->value() / 100.0);
|
233
|
-
|
233
|
+
sass::string nr(val->to_string(ctx.c_options));
|
234
234
|
hsla_alpha_percent_deprecation(pstate, nr);
|
235
235
|
}
|
236
236
|
|
@@ -579,14 +579,14 @@ namespace Sass {
|
|
579
579
|
double b = clip(c->b(), 0.0, 255.0);
|
580
580
|
double a = clip(c->a(), 0.0, 1.0) * 255.0;
|
581
581
|
|
582
|
-
|
582
|
+
sass::ostream ss;
|
583
583
|
ss << '#' << std::setw(2) << std::setfill('0');
|
584
584
|
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(a, ctx.c_options.precision));
|
585
585
|
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(r, ctx.c_options.precision));
|
586
586
|
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(g, ctx.c_options.precision));
|
587
587
|
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(b, ctx.c_options.precision));
|
588
588
|
|
589
|
-
|
589
|
+
sass::string result = ss.str();
|
590
590
|
Util::ascii_str_toupper(&result);
|
591
591
|
return SASS_MEMORY_NEW(String_Quoted, pstate, result);
|
592
592
|
}
|
@@ -21,9 +21,9 @@ namespace Sass {
|
|
21
21
|
List_Obj arglist = SASS_MEMORY_COPY(ARG("$args", List)); // copy
|
22
22
|
Map_Obj result = SASS_MEMORY_NEW(Map, pstate, 1);
|
23
23
|
for (size_t i = arglist->size(), L = arglist->length(); i < L; ++i) {
|
24
|
-
|
24
|
+
ExpressionObj obj = arglist->at(i);
|
25
25
|
Argument_Obj arg = (Argument*) obj.ptr(); // XXX
|
26
|
-
|
26
|
+
sass::string name = sass::string(arg->name());
|
27
27
|
name = name.erase(0, 1); // sanitize name (remove dollar sign)
|
28
28
|
*result << std::make_pair(SASS_MEMORY_NEW(String_Quoted,
|
29
29
|
pstate, name),
|
@@ -67,13 +67,13 @@ namespace Sass {
|
|
67
67
|
if (SelectorList * sl = Cast<SelectorList>(env["$list"])) {
|
68
68
|
size_t len = m ? m->length() : sl->length();
|
69
69
|
bool empty = m ? m->empty() : sl->empty();
|
70
|
-
if (empty) error("argument `$list` of `" +
|
70
|
+
if (empty) error("argument `$list` of `" + sass::string(sig) + "` must not be empty", pstate, traces);
|
71
71
|
double index = std::floor(nr < 0 ? len + nr : nr - 1);
|
72
|
-
if (index < 0 || index > len - 1) error("index out of bounds for `" +
|
72
|
+
if (index < 0 || index > len - 1) error("index out of bounds for `" + sass::string(sig) + "`", pstate, traces);
|
73
73
|
return Cast<Value>(Listize::perform(sl->get(static_cast<int>(index))));
|
74
74
|
}
|
75
75
|
List_Obj l = Cast<List>(env["$list"]);
|
76
|
-
if (nr == 0) error("argument `$n` of `" +
|
76
|
+
if (nr == 0) error("argument `$n` of `" + sass::string(sig) + "` must be non-zero", pstate, traces);
|
77
77
|
// if the argument isn't a list, then wrap it in a singleton list
|
78
78
|
if (!m && !l) {
|
79
79
|
l = SASS_MEMORY_NEW(List, pstate, 1);
|
@@ -81,9 +81,9 @@ namespace Sass {
|
|
81
81
|
}
|
82
82
|
size_t len = m ? m->length() : l->length();
|
83
83
|
bool empty = m ? m->empty() : l->empty();
|
84
|
-
if (empty) error("argument `$list` of `" +
|
84
|
+
if (empty) error("argument `$list` of `" + sass::string(sig) + "` must not be empty", pstate, traces);
|
85
85
|
double index = std::floor(nr < 0 ? len + nr : nr - 1);
|
86
|
-
if (index < 0 || index > len - 1) error("index out of bounds for `" +
|
86
|
+
if (index < 0 || index > len - 1) error("index out of bounds for `" + sass::string(sig) + "`", pstate, traces);
|
87
87
|
|
88
88
|
if (m) {
|
89
89
|
l = SASS_MEMORY_NEW(List, pstate, 2);
|
@@ -92,7 +92,7 @@ namespace Sass {
|
|
92
92
|
return l.detach();
|
93
93
|
}
|
94
94
|
else {
|
95
|
-
|
95
|
+
ValueObj rv = l->value_at_index(static_cast<int>(index));
|
96
96
|
rv->set_delayed(false);
|
97
97
|
return rv.detach();
|
98
98
|
}
|
@@ -104,7 +104,7 @@ namespace Sass {
|
|
104
104
|
Map_Obj m = Cast<Map>(env["$list"]);
|
105
105
|
List_Obj l = Cast<List>(env["$list"]);
|
106
106
|
Number_Obj n = ARG("$n", Number);
|
107
|
-
|
107
|
+
ExpressionObj v = ARG("$value", Expression);
|
108
108
|
if (!l) {
|
109
109
|
l = SASS_MEMORY_NEW(List, pstate, 1);
|
110
110
|
l->append(ARG("$list", Expression));
|
@@ -112,9 +112,9 @@ namespace Sass {
|
|
112
112
|
if (m) {
|
113
113
|
l = m->to_list(pstate);
|
114
114
|
}
|
115
|
-
if (l->empty()) error("argument `$list` of `" +
|
115
|
+
if (l->empty()) error("argument `$list` of `" + sass::string(sig) + "` must not be empty", pstate, traces);
|
116
116
|
double index = std::floor(n->value() < 0 ? l->length() + n->value() : n->value() - 1);
|
117
|
-
if (index < 0 || index > l->length() - 1) error("index out of bounds for `" +
|
117
|
+
if (index < 0 || index > l->length() - 1) error("index out of bounds for `" + sass::string(sig) + "`", pstate, traces);
|
118
118
|
List* result = SASS_MEMORY_NEW(List, pstate, l->length(), l->separator(), false, l->is_bracketed());
|
119
119
|
for (size_t i = 0, L = l->length(); i < L; ++i) {
|
120
120
|
result->append(((i == index) ? v : (*l)[i]));
|
@@ -127,7 +127,7 @@ namespace Sass {
|
|
127
127
|
{
|
128
128
|
Map_Obj m = Cast<Map>(env["$list"]);
|
129
129
|
List_Obj l = Cast<List>(env["$list"]);
|
130
|
-
|
130
|
+
ExpressionObj v = ARG("$value", Expression);
|
131
131
|
if (!l) {
|
132
132
|
l = SASS_MEMORY_NEW(List, pstate, 1);
|
133
133
|
l->append(ARG("$list", Expression));
|
@@ -170,10 +170,10 @@ namespace Sass {
|
|
170
170
|
l2 = m2->to_list(pstate);
|
171
171
|
}
|
172
172
|
size_t len = l1->length() + l2->length();
|
173
|
-
|
173
|
+
sass::string sep_str = unquote(sep->value());
|
174
174
|
if (sep_str == "space") sep_val = SASS_SPACE;
|
175
175
|
else if (sep_str == "comma") sep_val = SASS_COMMA;
|
176
|
-
else if (sep_str != "auto") error("argument `$separator` of `" +
|
176
|
+
else if (sep_str != "auto") error("argument `$separator` of `" + sass::string(sig) + "` must be `space`, `comma`, or `auto`", pstate, traces);
|
177
177
|
String_Constant_Obj bracketed_as_str = Cast<String_Constant>(bracketed);
|
178
178
|
bool bracketed_is_auto = bracketed_as_str && unquote(bracketed_as_str->value()) == "auto";
|
179
179
|
if (!bracketed_is_auto) {
|
@@ -190,7 +190,7 @@ namespace Sass {
|
|
190
190
|
{
|
191
191
|
Map_Obj m = Cast<Map>(env["$list"]);
|
192
192
|
List_Obj l = Cast<List>(env["$list"]);
|
193
|
-
|
193
|
+
ExpressionObj v = ARG("$val", Expression);
|
194
194
|
if (SelectorList * sl = Cast<SelectorList>(env["$list"])) {
|
195
195
|
l = Cast<List>(Listize::perform(sl));
|
196
196
|
}
|
@@ -203,11 +203,11 @@ namespace Sass {
|
|
203
203
|
l = m->to_list(pstate);
|
204
204
|
}
|
205
205
|
List* result = SASS_MEMORY_COPY(l);
|
206
|
-
|
206
|
+
sass::string sep_str(unquote(sep->value()));
|
207
207
|
if (sep_str != "auto") { // check default first
|
208
208
|
if (sep_str == "space") result->separator(SASS_SPACE);
|
209
209
|
else if (sep_str == "comma") result->separator(SASS_COMMA);
|
210
|
-
else error("argument `$separator` of `" +
|
210
|
+
else error("argument `$separator` of `" + sass::string(sig) + "` must be `space`, `comma`, or `auto`", pstate, traces);
|
211
211
|
}
|
212
212
|
if (l->is_arglist()) {
|
213
213
|
result->append(SASS_MEMORY_NEW(Argument,
|
@@ -275,7 +275,7 @@ namespace Sass {
|
|
275
275
|
Signature is_bracketed_sig = "is-bracketed($list)";
|
276
276
|
BUILT_IN(is_bracketed)
|
277
277
|
{
|
278
|
-
|
278
|
+
ValueObj value = ARG("$list", Value);
|
279
279
|
List_Obj list = Cast<List>(value);
|
280
280
|
return SASS_MEMORY_NEW(Boolean, pstate, list && list->is_bracketed());
|
281
281
|
}
|
data/ext/libsass/src/fn_maps.cpp
CHANGED
@@ -16,9 +16,9 @@ namespace Sass {
|
|
16
16
|
// leaks for "map-get((), foo)" if not Obj
|
17
17
|
// investigate why this is (unexpected)
|
18
18
|
Map_Obj m = ARGM("$map", Map);
|
19
|
-
|
19
|
+
ExpressionObj v = ARG("$key", Expression);
|
20
20
|
try {
|
21
|
-
|
21
|
+
ValueObj val = m->at(v);
|
22
22
|
if (!val) return SASS_MEMORY_NEW(Null, pstate);
|
23
23
|
val->set_delayed(false);
|
24
24
|
return val.detach();
|
@@ -32,7 +32,7 @@ namespace Sass {
|
|
32
32
|
BUILT_IN(map_has_key)
|
33
33
|
{
|
34
34
|
Map_Obj m = ARGM("$map", Map);
|
35
|
-
|
35
|
+
ExpressionObj v = ARG("$key", Expression);
|
36
36
|
return SASS_MEMORY_NEW(Boolean, pstate, m->has(v));
|
37
37
|
}
|
38
38
|
|
@@ -22,7 +22,7 @@ namespace Sass {
|
|
22
22
|
Signature variable_exists_sig = "variable-exists($name)";
|
23
23
|
BUILT_IN(variable_exists)
|
24
24
|
{
|
25
|
-
|
25
|
+
sass::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
|
26
26
|
|
27
27
|
if(d_env.has("$"+s)) {
|
28
28
|
return SASS_MEMORY_NEW(Boolean, pstate, true);
|
@@ -35,7 +35,7 @@ namespace Sass {
|
|
35
35
|
Signature global_variable_exists_sig = "global-variable-exists($name)";
|
36
36
|
BUILT_IN(global_variable_exists)
|
37
37
|
{
|
38
|
-
|
38
|
+
sass::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
|
39
39
|
|
40
40
|
if(d_env.has_global("$"+s)) {
|
41
41
|
return SASS_MEMORY_NEW(Boolean, pstate, true);
|
@@ -53,7 +53,7 @@ namespace Sass {
|
|
53
53
|
error("$name: " + (env["$name"]->to_string()) + " is not a string for `function-exists'", pstate, traces);
|
54
54
|
}
|
55
55
|
|
56
|
-
|
56
|
+
sass::string name = Util::normalize_underscores(unquote(ss->value()));
|
57
57
|
|
58
58
|
if(d_env.has(name+"[f]")) {
|
59
59
|
return SASS_MEMORY_NEW(Boolean, pstate, true);
|
@@ -66,7 +66,7 @@ namespace Sass {
|
|
66
66
|
Signature mixin_exists_sig = "mixin-exists($name)";
|
67
67
|
BUILT_IN(mixin_exists)
|
68
68
|
{
|
69
|
-
|
69
|
+
sass::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
|
70
70
|
|
71
71
|
if(d_env.has(s+"[m]")) {
|
72
72
|
return SASS_MEMORY_NEW(Boolean, pstate, true);
|
@@ -79,9 +79,9 @@ namespace Sass {
|
|
79
79
|
Signature feature_exists_sig = "feature-exists($feature)";
|
80
80
|
BUILT_IN(feature_exists)
|
81
81
|
{
|
82
|
-
|
82
|
+
sass::string s = unquote(ARG("$feature", String_Constant)->value());
|
83
83
|
|
84
|
-
static const auto *const features = new std::unordered_set<
|
84
|
+
static const auto *const features = new std::unordered_set<sass::string> {
|
85
85
|
"global-variable-shadowing",
|
86
86
|
"extend-selector-pseudoclass",
|
87
87
|
"at-error",
|
@@ -94,7 +94,7 @@ namespace Sass {
|
|
94
94
|
Signature call_sig = "call($function, $args...)";
|
95
95
|
BUILT_IN(call)
|
96
96
|
{
|
97
|
-
|
97
|
+
sass::string function;
|
98
98
|
Function* ff = Cast<Function>(env["$function"]);
|
99
99
|
String_Constant* ss = Cast<String_Constant>(env["$function"]);
|
100
100
|
|
@@ -111,19 +111,19 @@ namespace Sass {
|
|
111
111
|
List_Obj arglist = SASS_MEMORY_COPY(ARG("$args", List));
|
112
112
|
|
113
113
|
Arguments_Obj args = SASS_MEMORY_NEW(Arguments, pstate);
|
114
|
-
//
|
114
|
+
// sass::string full_name(name + "[f]");
|
115
115
|
// Definition* def = d_env.has(full_name) ? Cast<Definition>((d_env)[full_name]) : 0;
|
116
116
|
// Parameters* params = def ? def->parameters() : 0;
|
117
117
|
// size_t param_size = params ? params->length() : 0;
|
118
118
|
for (size_t i = 0, L = arglist->length(); i < L; ++i) {
|
119
|
-
|
119
|
+
ExpressionObj expr = arglist->value_at_index(i);
|
120
120
|
// if (params && params->has_rest_parameter()) {
|
121
121
|
// Parameter_Obj p = param_size > i ? (*params)[i] : 0;
|
122
122
|
// List* list = Cast<List>(expr);
|
123
123
|
// if (list && p && !p->is_rest_parameter()) expr = (*list)[0];
|
124
124
|
// }
|
125
125
|
if (arglist->is_arglist()) {
|
126
|
-
|
126
|
+
ExpressionObj obj = arglist->at(i);
|
127
127
|
Argument_Obj arg = (Argument*) obj.ptr(); // XXX
|
128
128
|
args->append(SASS_MEMORY_NEW(Argument,
|
129
129
|
pstate,
|
@@ -157,10 +157,10 @@ namespace Sass {
|
|
157
157
|
BUILT_IN(sass_if)
|
158
158
|
{
|
159
159
|
Expand expand(ctx, &d_env, &selector_stack, &original_stack);
|
160
|
-
|
160
|
+
ExpressionObj cond = ARG("$condition", Expression)->perform(&expand.eval);
|
161
161
|
bool is_true = !cond->is_false();
|
162
|
-
|
163
|
-
|
162
|
+
ExpressionObj res = ARG(is_true ? "$if-true" : "$if-false", Expression);
|
163
|
+
ValueObj qwe = Cast<Value>(res->perform(&expand.eval));
|
164
164
|
// res = res->perform(&expand.eval.val_eval);
|
165
165
|
qwe->set_delayed(false); // clone?
|
166
166
|
return qwe.detach();
|
@@ -216,8 +216,8 @@ namespace Sass {
|
|
216
216
|
error("$name: " + (env["$name"]->to_string()) + " is not a string for `get-function'", pstate, traces);
|
217
217
|
}
|
218
218
|
|
219
|
-
|
220
|
-
|
219
|
+
sass::string name = Util::normalize_underscores(unquote(ss->value()));
|
220
|
+
sass::string full_name = name + "[f]";
|
221
221
|
|
222
222
|
Boolean_Obj css = ARG("$css", Boolean);
|
223
223
|
if (!css->is_false()) {
|
@@ -60,7 +60,7 @@ namespace Sass {
|
|
60
60
|
BUILT_IN(percentage)
|
61
61
|
{
|
62
62
|
Number_Obj n = ARGN("$number");
|
63
|
-
if (!n->is_unitless()) error("argument $number of `" +
|
63
|
+
if (!n->is_unitless()) error("argument $number of `" + sass::string(sig) + "` must be unitless", pstate, traces);
|
64
64
|
return SASS_MEMORY_NEW(Number, pstate, n->value() * 100, "%");
|
65
65
|
}
|
66
66
|
|
@@ -110,7 +110,7 @@ namespace Sass {
|
|
110
110
|
error("At least one argument must be passed.", pstate, traces);
|
111
111
|
}
|
112
112
|
for (size_t i = 0; i < L; ++i) {
|
113
|
-
|
113
|
+
ExpressionObj val = arglist->value_at_index(i);
|
114
114
|
Number_Obj xi = Cast<Number>(val);
|
115
115
|
if (!xi) {
|
116
116
|
error("\"" + val->to_string(ctx.c_options) + "\" is not a number for `min'", pstate, traces);
|
@@ -132,7 +132,7 @@ namespace Sass {
|
|
132
132
|
error("At least one argument must be passed.", pstate, traces);
|
133
133
|
}
|
134
134
|
for (size_t i = 0; i < L; ++i) {
|
135
|
-
|
135
|
+
ExpressionObj val = arglist->value_at_index(i);
|
136
136
|
Number_Obj xi = Cast<Number>(val);
|
137
137
|
if (!xi) {
|
138
138
|
error("\"" + val->to_string(ctx.c_options) + "\" is not a number for `max'", pstate, traces);
|
@@ -154,13 +154,13 @@ namespace Sass {
|
|
154
154
|
if (l) {
|
155
155
|
double lv = l->value();
|
156
156
|
if (lv < 1) {
|
157
|
-
|
157
|
+
sass::ostream err;
|
158
158
|
err << "$limit " << lv << " must be greater than or equal to 1 for `random'";
|
159
159
|
error(err.str(), pstate, traces);
|
160
160
|
}
|
161
161
|
bool eq_int = std::fabs(trunc(lv) - lv) < NUMBER_EPSILON;
|
162
162
|
if (!eq_int) {
|
163
|
-
|
163
|
+
sass::ostream err;
|
164
164
|
err << "Expected $limit to be an integer but got " << lv << " for `random'";
|
165
165
|
error(err.str(), pstate, traces);
|
166
166
|
}
|
@@ -184,7 +184,7 @@ namespace Sass {
|
|
184
184
|
Signature unique_id_sig = "unique-id()";
|
185
185
|
BUILT_IN(unique_id)
|
186
186
|
{
|
187
|
-
|
187
|
+
sass::ostream ss;
|
188
188
|
std::uniform_real_distribution<> distributor(0, 4294967296); // 16^8
|
189
189
|
uint_fast32_t distributed = static_cast<uint_fast32_t>(distributor(rand));
|
190
190
|
ss << "u" << std::setfill('0') << std::setw(8) << std::hex << distributed;
|
@@ -195,7 +195,7 @@ namespace Sass {
|
|
195
195
|
BUILT_IN(unit)
|
196
196
|
{
|
197
197
|
Number_Obj arg = ARGN("$number");
|
198
|
-
|
198
|
+
sass::string str(quote(arg->unit(), '"'));
|
199
199
|
return SASS_MEMORY_NEW(String_Quoted, pstate, str);
|
200
200
|
}
|
201
201
|
|
@@ -25,7 +25,7 @@ namespace Sass {
|
|
25
25
|
// Parse args into vector of selectors
|
26
26
|
SelectorStack parsedSelectors;
|
27
27
|
for (size_t i = 0, L = arglist->length(); i < L; ++i) {
|
28
|
-
|
28
|
+
ExpressionObj exp = Cast<Expression>(arglist->value_at_index(i));
|
29
29
|
if (exp->concrete_type() == Expression::NULL_VAL) {
|
30
30
|
error(
|
31
31
|
"$selectors: null is not a valid selector: it must be a string,\n"
|
@@ -35,8 +35,9 @@ namespace Sass {
|
|
35
35
|
if (String_Constant_Obj str = Cast<String_Constant>(exp)) {
|
36
36
|
str->quote_mark(0);
|
37
37
|
}
|
38
|
-
|
39
|
-
|
38
|
+
sass::string exp_src = exp->to_string(ctx.c_options);
|
39
|
+
ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
|
40
|
+
SelectorListObj sel = Parser::parse_selector(source, ctx, traces);
|
40
41
|
parsedSelectors.push_back(sel);
|
41
42
|
}
|
42
43
|
|
@@ -89,10 +90,9 @@ namespace Sass {
|
|
89
90
|
if (String_Constant* str = Cast<String_Constant>(exp)) {
|
90
91
|
str->quote_mark(0);
|
91
92
|
}
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
/*allow_parent=*/true);
|
93
|
+
sass::string exp_src = exp->to_string();
|
94
|
+
ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
|
95
|
+
SelectorListObj sel = Parser::parse_selector(source, ctx, traces, true);
|
96
96
|
|
97
97
|
for (auto& complex : sel->elements()) {
|
98
98
|
if (complex->empty()) {
|
@@ -157,7 +157,7 @@ namespace Sass {
|
|
157
157
|
|
158
158
|
for (size_t i = 0, L = sel->length(); i < L; ++i) {
|
159
159
|
const SimpleSelectorObj& ss = sel->get(i);
|
160
|
-
|
160
|
+
sass::string ss_string = ss->to_string() ;
|
161
161
|
l->append(SASS_MEMORY_NEW(String_Quoted, ss->pstate(), ss_string));
|
162
162
|
}
|
163
163
|
|
@@ -12,21 +12,21 @@ namespace Sass {
|
|
12
12
|
|
13
13
|
namespace Functions {
|
14
14
|
|
15
|
-
void handle_utf8_error (const
|
15
|
+
void handle_utf8_error (const SourceSpan& pstate, Backtraces traces)
|
16
16
|
{
|
17
17
|
try {
|
18
18
|
throw;
|
19
19
|
}
|
20
20
|
catch (utf8::invalid_code_point&) {
|
21
|
-
|
21
|
+
sass::string msg("utf8::invalid_code_point");
|
22
22
|
error(msg, pstate, traces);
|
23
23
|
}
|
24
24
|
catch (utf8::not_enough_room&) {
|
25
|
-
|
25
|
+
sass::string msg("utf8::not_enough_room");
|
26
26
|
error(msg, pstate, traces);
|
27
27
|
}
|
28
28
|
catch (utf8::invalid_utf8&) {
|
29
|
-
|
29
|
+
sass::string msg("utf8::invalid_utf8");
|
30
30
|
error(msg, pstate, traces);
|
31
31
|
}
|
32
32
|
catch (...) { throw; }
|
@@ -52,7 +52,7 @@ namespace Sass {
|
|
52
52
|
else if (Value* ex = Cast<Value>(arg)) {
|
53
53
|
Sass_Output_Style oldstyle = ctx.c_options.output_style;
|
54
54
|
ctx.c_options.output_style = SASS_STYLE_NESTED;
|
55
|
-
|
55
|
+
sass::string val(arg->to_string(ctx.c_options));
|
56
56
|
val = Cast<Null>(arg) ? "null" : val;
|
57
57
|
ctx.c_options.output_style = oldstyle;
|
58
58
|
|
@@ -76,7 +76,7 @@ namespace Sass {
|
|
76
76
|
Signature str_length_sig = "str-length($string)";
|
77
77
|
BUILT_IN(str_length)
|
78
78
|
{
|
79
|
-
size_t len =
|
79
|
+
size_t len = sass::string::npos;
|
80
80
|
try {
|
81
81
|
String_Constant* s = ARG("$string", String_Constant);
|
82
82
|
len = UTF_8::code_point_count(s->value(), 0, s->value().size());
|
@@ -92,15 +92,19 @@ namespace Sass {
|
|
92
92
|
Signature str_insert_sig = "str-insert($string, $insert, $index)";
|
93
93
|
BUILT_IN(str_insert)
|
94
94
|
{
|
95
|
-
|
95
|
+
sass::string str;
|
96
96
|
try {
|
97
97
|
String_Constant* s = ARG("$string", String_Constant);
|
98
98
|
str = s->value();
|
99
99
|
String_Constant* i = ARG("$insert", String_Constant);
|
100
|
-
|
100
|
+
sass::string ins = i->value();
|
101
101
|
double index = ARGVAL("$index");
|
102
102
|
if (index != (int)index) {
|
103
|
-
|
103
|
+
sass::ostream strm;
|
104
|
+
strm << "$index: ";
|
105
|
+
strm << std::to_string(index);
|
106
|
+
strm << " is not an int";
|
107
|
+
error(strm.str(), pstate, traces);
|
104
108
|
}
|
105
109
|
size_t len = UTF_8::code_point_count(str, 0, str.size());
|
106
110
|
|
@@ -138,15 +142,15 @@ namespace Sass {
|
|
138
142
|
Signature str_index_sig = "str-index($string, $substring)";
|
139
143
|
BUILT_IN(str_index)
|
140
144
|
{
|
141
|
-
size_t index =
|
145
|
+
size_t index = sass::string::npos;
|
142
146
|
try {
|
143
147
|
String_Constant* s = ARG("$string", String_Constant);
|
144
148
|
String_Constant* t = ARG("$substring", String_Constant);
|
145
|
-
|
146
|
-
|
149
|
+
sass::string str = s->value();
|
150
|
+
sass::string substr = t->value();
|
147
151
|
|
148
152
|
size_t c_index = str.find(substr);
|
149
|
-
if(c_index ==
|
153
|
+
if(c_index == sass::string::npos) {
|
150
154
|
return SASS_MEMORY_NEW(Null, pstate);
|
151
155
|
}
|
152
156
|
index = UTF_8::code_point_count(str, 0, c_index) + 1;
|
@@ -161,19 +165,23 @@ namespace Sass {
|
|
161
165
|
Signature str_slice_sig = "str-slice($string, $start-at, $end-at:-1)";
|
162
166
|
BUILT_IN(str_slice)
|
163
167
|
{
|
164
|
-
|
168
|
+
sass::string newstr;
|
165
169
|
try {
|
166
170
|
String_Constant* s = ARG("$string", String_Constant);
|
167
171
|
double start_at = ARGVAL("$start-at");
|
168
172
|
double end_at = ARGVAL("$end-at");
|
169
173
|
|
170
174
|
if (start_at != (int)start_at) {
|
171
|
-
|
175
|
+
sass::ostream strm;
|
176
|
+
strm << "$start-at: ";
|
177
|
+
strm << std::to_string(start_at);
|
178
|
+
strm << " is not an int";
|
179
|
+
error(strm.str(), pstate, traces);
|
172
180
|
}
|
173
181
|
|
174
182
|
String_Quoted* ss = Cast<String_Quoted>(s);
|
175
183
|
|
176
|
-
|
184
|
+
sass::string str(s->value());
|
177
185
|
|
178
186
|
size_t size = utf8::distance(str.begin(), str.end());
|
179
187
|
|
@@ -182,7 +190,11 @@ namespace Sass {
|
|
182
190
|
}
|
183
191
|
|
184
192
|
if (end_at != (int)end_at) {
|
185
|
-
|
193
|
+
sass::ostream strm;
|
194
|
+
strm << "$end-at: ";
|
195
|
+
strm << std::to_string(end_at);
|
196
|
+
strm << " is not an int";
|
197
|
+
error(strm.str(), pstate, traces);
|
186
198
|
}
|
187
199
|
|
188
200
|
if (end_at == 0 || (end_at + size) < 0) {
|
@@ -203,11 +215,11 @@ namespace Sass {
|
|
203
215
|
|
204
216
|
if (start_at <= end_at)
|
205
217
|
{
|
206
|
-
|
218
|
+
sass::string::iterator start = str.begin();
|
207
219
|
utf8::advance(start, start_at - 1, str.end());
|
208
|
-
|
220
|
+
sass::string::iterator end = start;
|
209
221
|
utf8::advance(end, end_at - start_at + 1, str.end());
|
210
|
-
newstr =
|
222
|
+
newstr = sass::string(start, end);
|
211
223
|
}
|
212
224
|
if (ss) {
|
213
225
|
if(ss->quote_mark()) newstr = quote(newstr);
|
@@ -223,7 +235,7 @@ namespace Sass {
|
|
223
235
|
BUILT_IN(to_upper_case)
|
224
236
|
{
|
225
237
|
String_Constant* s = ARG("$string", String_Constant);
|
226
|
-
|
238
|
+
sass::string str = s->value();
|
227
239
|
Util::ascii_str_toupper(&str);
|
228
240
|
|
229
241
|
if (String_Quoted* ss = Cast<String_Quoted>(s)) {
|
@@ -239,7 +251,7 @@ namespace Sass {
|
|
239
251
|
BUILT_IN(to_lower_case)
|
240
252
|
{
|
241
253
|
String_Constant* s = ARG("$string", String_Constant);
|
242
|
-
|
254
|
+
sass::string str = s->value();
|
243
255
|
Util::ascii_str_tolower(&str);
|
244
256
|
|
245
257
|
if (String_Quoted* ss = Cast<String_Quoted>(s)) {
|