precompiled-sassc 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/cibuildgem.yaml +67 -0
- data/.gitignore +18 -0
- data/.gitmodules +3 -0
- data/.travis.yml +16 -0
- data/CHANGELOG.md +97 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +80 -0
- data/Rakefile +51 -0
- data/ext/depend +4 -0
- data/ext/extconf.rb +92 -0
- data/ext/libsass/VERSION +1 -0
- data/ext/libsass/contrib/plugin.cpp +60 -0
- data/ext/libsass/include/sass/base.h +97 -0
- data/ext/libsass/include/sass/context.h +174 -0
- data/ext/libsass/include/sass/functions.h +139 -0
- data/ext/libsass/include/sass/values.h +145 -0
- data/ext/libsass/include/sass/version.h +12 -0
- data/ext/libsass/include/sass.h +15 -0
- data/ext/libsass/include/sass2scss.h +120 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +953 -0
- data/ext/libsass/src/ast.hpp +1064 -0
- data/ext/libsass/src/ast2c.cpp +80 -0
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +140 -0
- data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
- data/ext/libsass/src/ast_helpers.hpp +292 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +275 -0
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +1043 -0
- data/ext/libsass/src/ast_selectors.hpp +522 -0
- data/ext/libsass/src/ast_supports.cpp +114 -0
- data/ext/libsass/src/ast_supports.hpp +121 -0
- data/ext/libsass/src/ast_values.cpp +1154 -0
- data/ext/libsass/src/ast_values.hpp +498 -0
- data/ext/libsass/src/b64/cencode.h +32 -0
- data/ext/libsass/src/b64/encode.h +79 -0
- data/ext/libsass/src/backtrace.cpp +50 -0
- data/ext/libsass/src/backtrace.hpp +29 -0
- data/ext/libsass/src/base64vlq.cpp +47 -0
- data/ext/libsass/src/base64vlq.hpp +30 -0
- data/ext/libsass/src/bind.cpp +312 -0
- data/ext/libsass/src/bind.hpp +15 -0
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/c99func.c +54 -0
- data/ext/libsass/src/cencode.c +106 -0
- data/ext/libsass/src/check_nesting.cpp +393 -0
- data/ext/libsass/src/check_nesting.hpp +70 -0
- data/ext/libsass/src/color_maps.cpp +652 -0
- data/ext/libsass/src/color_maps.hpp +323 -0
- data/ext/libsass/src/constants.cpp +199 -0
- data/ext/libsass/src/constants.hpp +200 -0
- data/ext/libsass/src/context.cpp +863 -0
- data/ext/libsass/src/context.hpp +140 -0
- data/ext/libsass/src/cssize.cpp +521 -0
- data/ext/libsass/src/cssize.hpp +71 -0
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debug.hpp +43 -0
- data/ext/libsass/src/debugger.hpp +963 -0
- data/ext/libsass/src/emitter.cpp +297 -0
- data/ext/libsass/src/emitter.hpp +101 -0
- data/ext/libsass/src/environment.cpp +260 -0
- data/ext/libsass/src/environment.hpp +124 -0
- data/ext/libsass/src/error_handling.cpp +233 -0
- data/ext/libsass/src/error_handling.hpp +239 -0
- data/ext/libsass/src/eval.cpp +1543 -0
- data/ext/libsass/src/eval.hpp +110 -0
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +875 -0
- data/ext/libsass/src/expand.hpp +98 -0
- 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 +531 -0
- data/ext/libsass/src/file.hpp +124 -0
- data/ext/libsass/src/fn_colors.cpp +596 -0
- data/ext/libsass/src/fn_colors.hpp +85 -0
- data/ext/libsass/src/fn_lists.cpp +285 -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 +244 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +227 -0
- data/ext/libsass/src/fn_numbers.hpp +45 -0
- data/ext/libsass/src/fn_selectors.cpp +205 -0
- data/ext/libsass/src/fn_selectors.hpp +35 -0
- data/ext/libsass/src/fn_strings.cpp +268 -0
- data/ext/libsass/src/fn_strings.hpp +34 -0
- data/ext/libsass/src/fn_utils.cpp +158 -0
- data/ext/libsass/src/fn_utils.hpp +62 -0
- data/ext/libsass/src/inspect.cpp +1125 -0
- data/ext/libsass/src/inspect.hpp +101 -0
- data/ext/libsass/src/json.cpp +1436 -0
- data/ext/libsass/src/json.hpp +117 -0
- data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
- data/ext/libsass/src/lexer.cpp +122 -0
- data/ext/libsass/src/lexer.hpp +304 -0
- data/ext/libsass/src/listize.cpp +70 -0
- data/ext/libsass/src/listize.hpp +37 -0
- data/ext/libsass/src/mapping.hpp +19 -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/shared_ptr.cpp +33 -0
- data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/operation.hpp +223 -0
- data/ext/libsass/src/operators.cpp +267 -0
- data/ext/libsass/src/operators.hpp +30 -0
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +320 -0
- data/ext/libsass/src/output.hpp +47 -0
- data/ext/libsass/src/parser.cpp +2965 -0
- data/ext/libsass/src/parser.hpp +394 -0
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +188 -0
- data/ext/libsass/src/plugins.hpp +57 -0
- data/ext/libsass/src/position.cpp +165 -0
- data/ext/libsass/src/position.hpp +147 -0
- data/ext/libsass/src/prelexer.cpp +1780 -0
- data/ext/libsass/src/prelexer.hpp +484 -0
- data/ext/libsass/src/remove_placeholders.cpp +86 -0
- data/ext/libsass/src/remove_placeholders.hpp +37 -0
- data/ext/libsass/src/sass.cpp +156 -0
- data/ext/libsass/src/sass.hpp +147 -0
- data/ext/libsass/src/sass2scss.cpp +895 -0
- data/ext/libsass/src/sass_context.cpp +741 -0
- data/ext/libsass/src/sass_context.hpp +129 -0
- data/ext/libsass/src/sass_functions.cpp +210 -0
- data/ext/libsass/src/sass_functions.hpp +50 -0
- data/ext/libsass/src/sass_values.cpp +362 -0
- data/ext/libsass/src/sass_values.hpp +82 -0
- 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 +202 -0
- data/ext/libsass/src/source_map.hpp +65 -0
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +114 -0
- data/ext/libsass/src/to_value.hpp +46 -0
- data/ext/libsass/src/units.cpp +507 -0
- data/ext/libsass/src/units.hpp +110 -0
- data/ext/libsass/src/utf8/checked.h +336 -0
- data/ext/libsass/src/utf8/core.h +332 -0
- data/ext/libsass/src/utf8/unchecked.h +235 -0
- data/ext/libsass/src/utf8.h +34 -0
- data/ext/libsass/src/utf8_string.cpp +104 -0
- data/ext/libsass/src/utf8_string.hpp +38 -0
- data/ext/libsass/src/util.cpp +723 -0
- data/ext/libsass/src/util.hpp +105 -0
- data/ext/libsass/src/util_string.cpp +125 -0
- data/ext/libsass/src/util_string.hpp +73 -0
- data/ext/libsass/src/values.cpp +140 -0
- data/ext/libsass/src/values.hpp +12 -0
- data/lib/sassc/dependency.rb +17 -0
- data/lib/sassc/engine.rb +141 -0
- data/lib/sassc/error.rb +37 -0
- data/lib/sassc/functions_handler.rb +73 -0
- data/lib/sassc/import_handler.rb +50 -0
- data/lib/sassc/importer.rb +31 -0
- data/lib/sassc/native/native_context_api.rb +147 -0
- data/lib/sassc/native/native_functions_api.rb +159 -0
- data/lib/sassc/native/sass2scss_api.rb +10 -0
- data/lib/sassc/native/sass_input_style.rb +13 -0
- data/lib/sassc/native/sass_output_style.rb +12 -0
- data/lib/sassc/native/sass_value.rb +97 -0
- data/lib/sassc/native/string_list.rb +10 -0
- data/lib/sassc/native.rb +65 -0
- data/lib/sassc/sass_2_scss.rb +9 -0
- data/lib/sassc/script/functions.rb +8 -0
- data/lib/sassc/script/value/bool.rb +32 -0
- data/lib/sassc/script/value/color.rb +95 -0
- data/lib/sassc/script/value/list.rb +136 -0
- data/lib/sassc/script/value/map.rb +69 -0
- data/lib/sassc/script/value/number.rb +389 -0
- data/lib/sassc/script/value/string.rb +96 -0
- data/lib/sassc/script/value.rb +137 -0
- data/lib/sassc/script/value_conversion/base.rb +13 -0
- data/lib/sassc/script/value_conversion/bool.rb +13 -0
- data/lib/sassc/script/value_conversion/color.rb +18 -0
- data/lib/sassc/script/value_conversion/list.rb +25 -0
- data/lib/sassc/script/value_conversion/map.rb +21 -0
- data/lib/sassc/script/value_conversion/number.rb +13 -0
- data/lib/sassc/script/value_conversion/string.rb +17 -0
- data/lib/sassc/script/value_conversion.rb +69 -0
- data/lib/sassc/script.rb +17 -0
- data/lib/sassc/util/normalized_map.rb +117 -0
- data/lib/sassc/util.rb +231 -0
- data/lib/sassc/version.rb +5 -0
- data/lib/sassc.rb +57 -0
- data/sassc.gemspec +69 -0
- data/test/custom_importer_test.rb +127 -0
- data/test/engine_test.rb +314 -0
- data/test/error_test.rb +29 -0
- data/test/fixtures/paths.scss +10 -0
- data/test/functions_test.rb +340 -0
- data/test/native_test.rb +213 -0
- data/test/output_style_test.rb +107 -0
- data/test/sass_2_scss_test.rb +14 -0
- data/test/test_helper.rb +45 -0
- metadata +391 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
3
|
+
#include "sass.hpp"
|
|
4
|
+
|
|
5
|
+
#include "listize.hpp"
|
|
6
|
+
#include "operators.hpp"
|
|
7
|
+
#include "fn_utils.hpp"
|
|
8
|
+
#include "fn_lists.hpp"
|
|
9
|
+
|
|
10
|
+
namespace Sass {
|
|
11
|
+
|
|
12
|
+
namespace Functions {
|
|
13
|
+
|
|
14
|
+
/////////////////
|
|
15
|
+
// LIST FUNCTIONS
|
|
16
|
+
/////////////////
|
|
17
|
+
|
|
18
|
+
Signature keywords_sig = "keywords($args)";
|
|
19
|
+
BUILT_IN(keywords)
|
|
20
|
+
{
|
|
21
|
+
List_Obj arglist = SASS_MEMORY_COPY(ARG("$args", List)); // copy
|
|
22
|
+
Map_Obj result = SASS_MEMORY_NEW(Map, pstate, 1);
|
|
23
|
+
for (size_t i = arglist->size(), L = arglist->length(); i < L; ++i) {
|
|
24
|
+
ExpressionObj obj = arglist->at(i);
|
|
25
|
+
Argument_Obj arg = (Argument*) obj.ptr(); // XXX
|
|
26
|
+
sass::string name = sass::string(arg->name());
|
|
27
|
+
name = name.erase(0, 1); // sanitize name (remove dollar sign)
|
|
28
|
+
*result << std::make_pair(SASS_MEMORY_NEW(String_Quoted,
|
|
29
|
+
pstate, name),
|
|
30
|
+
arg->value());
|
|
31
|
+
}
|
|
32
|
+
return result.detach();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
Signature length_sig = "length($list)";
|
|
36
|
+
BUILT_IN(length)
|
|
37
|
+
{
|
|
38
|
+
if (SelectorList * sl = Cast<SelectorList>(env["$list"])) {
|
|
39
|
+
return SASS_MEMORY_NEW(Number, pstate, (double) sl->length());
|
|
40
|
+
}
|
|
41
|
+
Expression* v = ARG("$list", Expression);
|
|
42
|
+
if (v->concrete_type() == Expression::MAP) {
|
|
43
|
+
Map* map = Cast<Map>(env["$list"]);
|
|
44
|
+
return SASS_MEMORY_NEW(Number, pstate, (double)(map ? map->length() : 1));
|
|
45
|
+
}
|
|
46
|
+
if (v->concrete_type() == Expression::SELECTOR) {
|
|
47
|
+
if (CompoundSelector * h = Cast<CompoundSelector>(v)) {
|
|
48
|
+
return SASS_MEMORY_NEW(Number, pstate, (double)h->length());
|
|
49
|
+
} else if (SelectorList * ls = Cast<SelectorList>(v)) {
|
|
50
|
+
return SASS_MEMORY_NEW(Number, pstate, (double)ls->length());
|
|
51
|
+
} else {
|
|
52
|
+
return SASS_MEMORY_NEW(Number, pstate, 1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
List* list = Cast<List>(env["$list"]);
|
|
57
|
+
return SASS_MEMORY_NEW(Number,
|
|
58
|
+
pstate,
|
|
59
|
+
(double)(list ? list->size() : 1));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
Signature nth_sig = "nth($list, $n)";
|
|
63
|
+
BUILT_IN(nth)
|
|
64
|
+
{
|
|
65
|
+
double nr = ARGVAL("$n");
|
|
66
|
+
Map* m = Cast<Map>(env["$list"]);
|
|
67
|
+
if (SelectorList * sl = Cast<SelectorList>(env["$list"])) {
|
|
68
|
+
size_t len = m ? m->length() : sl->length();
|
|
69
|
+
bool empty = m ? m->empty() : sl->empty();
|
|
70
|
+
if (empty) error("argument `$list` of `" + sass::string(sig) + "` must not be empty", pstate, traces);
|
|
71
|
+
double index = std::floor(nr < 0 ? len + nr : nr - 1);
|
|
72
|
+
if (index < 0 || index > len - 1) error("index out of bounds for `" + sass::string(sig) + "`", pstate, traces);
|
|
73
|
+
return Cast<Value>(Listize::perform(sl->get(static_cast<int>(index))));
|
|
74
|
+
}
|
|
75
|
+
List_Obj l = Cast<List>(env["$list"]);
|
|
76
|
+
if (nr == 0) error("argument `$n` of `" + sass::string(sig) + "` must be non-zero", pstate, traces);
|
|
77
|
+
// if the argument isn't a list, then wrap it in a singleton list
|
|
78
|
+
if (!m && !l) {
|
|
79
|
+
l = SASS_MEMORY_NEW(List, pstate, 1);
|
|
80
|
+
l->append(ARG("$list", Expression));
|
|
81
|
+
}
|
|
82
|
+
size_t len = m ? m->length() : l->length();
|
|
83
|
+
bool empty = m ? m->empty() : l->empty();
|
|
84
|
+
if (empty) error("argument `$list` of `" + sass::string(sig) + "` must not be empty", pstate, traces);
|
|
85
|
+
double index = std::floor(nr < 0 ? len + nr : nr - 1);
|
|
86
|
+
if (index < 0 || index > len - 1) error("index out of bounds for `" + sass::string(sig) + "`", pstate, traces);
|
|
87
|
+
|
|
88
|
+
if (m) {
|
|
89
|
+
l = SASS_MEMORY_NEW(List, pstate, 2);
|
|
90
|
+
l->append(m->keys()[static_cast<unsigned int>(index)]);
|
|
91
|
+
l->append(m->at(m->keys()[static_cast<unsigned int>(index)]));
|
|
92
|
+
return l.detach();
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
ValueObj rv = l->value_at_index(static_cast<int>(index));
|
|
96
|
+
rv->set_delayed(false);
|
|
97
|
+
return rv.detach();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
Signature set_nth_sig = "set-nth($list, $n, $value)";
|
|
102
|
+
BUILT_IN(set_nth)
|
|
103
|
+
{
|
|
104
|
+
Map_Obj m = Cast<Map>(env["$list"]);
|
|
105
|
+
List_Obj l = Cast<List>(env["$list"]);
|
|
106
|
+
Number_Obj n = ARG("$n", Number);
|
|
107
|
+
ExpressionObj v = ARG("$value", Expression);
|
|
108
|
+
if (!l) {
|
|
109
|
+
l = SASS_MEMORY_NEW(List, pstate, 1);
|
|
110
|
+
l->append(ARG("$list", Expression));
|
|
111
|
+
}
|
|
112
|
+
if (m) {
|
|
113
|
+
l = m->to_list(pstate);
|
|
114
|
+
}
|
|
115
|
+
if (l->empty()) error("argument `$list` of `" + sass::string(sig) + "` must not be empty", pstate, traces);
|
|
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 `" + sass::string(sig) + "`", pstate, traces);
|
|
118
|
+
List* result = SASS_MEMORY_NEW(List, pstate, l->length(), l->separator(), false, l->is_bracketed());
|
|
119
|
+
for (size_t i = 0, L = l->length(); i < L; ++i) {
|
|
120
|
+
result->append(((i == index) ? v : (*l)[i]));
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
Signature index_sig = "index($list, $value)";
|
|
126
|
+
BUILT_IN(index)
|
|
127
|
+
{
|
|
128
|
+
Map_Obj m = Cast<Map>(env["$list"]);
|
|
129
|
+
List_Obj l = Cast<List>(env["$list"]);
|
|
130
|
+
ExpressionObj v = ARG("$value", Expression);
|
|
131
|
+
if (!l) {
|
|
132
|
+
l = SASS_MEMORY_NEW(List, pstate, 1);
|
|
133
|
+
l->append(ARG("$list", Expression));
|
|
134
|
+
}
|
|
135
|
+
if (m) {
|
|
136
|
+
l = m->to_list(pstate);
|
|
137
|
+
}
|
|
138
|
+
for (size_t i = 0, L = l->length(); i < L; ++i) {
|
|
139
|
+
if (Operators::eq(l->value_at_index(i), v)) return SASS_MEMORY_NEW(Number, pstate, (double)(i+1));
|
|
140
|
+
}
|
|
141
|
+
return SASS_MEMORY_NEW(Null, pstate);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
Signature join_sig = "join($list1, $list2, $separator: auto, $bracketed: auto)";
|
|
145
|
+
BUILT_IN(join)
|
|
146
|
+
{
|
|
147
|
+
Map_Obj m1 = Cast<Map>(env["$list1"]);
|
|
148
|
+
Map_Obj m2 = Cast<Map>(env["$list2"]);
|
|
149
|
+
List_Obj l1 = Cast<List>(env["$list1"]);
|
|
150
|
+
List_Obj l2 = Cast<List>(env["$list2"]);
|
|
151
|
+
String_Constant_Obj sep = ARG("$separator", String_Constant);
|
|
152
|
+
enum Sass_Separator sep_val = (l1 ? l1->separator() : SASS_SPACE);
|
|
153
|
+
Value* bracketed = ARG("$bracketed", Value);
|
|
154
|
+
bool is_bracketed = (l1 ? l1->is_bracketed() : false);
|
|
155
|
+
if (!l1) {
|
|
156
|
+
l1 = SASS_MEMORY_NEW(List, pstate, 1);
|
|
157
|
+
l1->append(ARG("$list1", Expression));
|
|
158
|
+
sep_val = (l2 ? l2->separator() : SASS_SPACE);
|
|
159
|
+
is_bracketed = (l2 ? l2->is_bracketed() : false);
|
|
160
|
+
}
|
|
161
|
+
if (!l2) {
|
|
162
|
+
l2 = SASS_MEMORY_NEW(List, pstate, 1);
|
|
163
|
+
l2->append(ARG("$list2", Expression));
|
|
164
|
+
}
|
|
165
|
+
if (m1) {
|
|
166
|
+
l1 = m1->to_list(pstate);
|
|
167
|
+
sep_val = SASS_COMMA;
|
|
168
|
+
}
|
|
169
|
+
if (m2) {
|
|
170
|
+
l2 = m2->to_list(pstate);
|
|
171
|
+
}
|
|
172
|
+
size_t len = l1->length() + l2->length();
|
|
173
|
+
sass::string sep_str = unquote(sep->value());
|
|
174
|
+
if (sep_str == "space") sep_val = SASS_SPACE;
|
|
175
|
+
else if (sep_str == "comma") sep_val = SASS_COMMA;
|
|
176
|
+
else if (sep_str != "auto") error("argument `$separator` of `" + sass::string(sig) + "` must be `space`, `comma`, or `auto`", pstate, traces);
|
|
177
|
+
String_Constant_Obj bracketed_as_str = Cast<String_Constant>(bracketed);
|
|
178
|
+
bool bracketed_is_auto = bracketed_as_str && unquote(bracketed_as_str->value()) == "auto";
|
|
179
|
+
if (!bracketed_is_auto) {
|
|
180
|
+
is_bracketed = !bracketed->is_false();
|
|
181
|
+
}
|
|
182
|
+
List_Obj result = SASS_MEMORY_NEW(List, pstate, len, sep_val, false, is_bracketed);
|
|
183
|
+
result->concat(l1);
|
|
184
|
+
result->concat(l2);
|
|
185
|
+
return result.detach();
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
Signature append_sig = "append($list, $val, $separator: auto)";
|
|
189
|
+
BUILT_IN(append)
|
|
190
|
+
{
|
|
191
|
+
Map_Obj m = Cast<Map>(env["$list"]);
|
|
192
|
+
List_Obj l = Cast<List>(env["$list"]);
|
|
193
|
+
ExpressionObj v = ARG("$val", Expression);
|
|
194
|
+
if (SelectorList * sl = Cast<SelectorList>(env["$list"])) {
|
|
195
|
+
l = Cast<List>(Listize::perform(sl));
|
|
196
|
+
}
|
|
197
|
+
String_Constant_Obj sep = ARG("$separator", String_Constant);
|
|
198
|
+
if (!l) {
|
|
199
|
+
l = SASS_MEMORY_NEW(List, pstate, 1);
|
|
200
|
+
l->append(ARG("$list", Expression));
|
|
201
|
+
}
|
|
202
|
+
if (m) {
|
|
203
|
+
l = m->to_list(pstate);
|
|
204
|
+
}
|
|
205
|
+
List* result = SASS_MEMORY_COPY(l);
|
|
206
|
+
sass::string sep_str(unquote(sep->value()));
|
|
207
|
+
if (sep_str != "auto") { // check default first
|
|
208
|
+
if (sep_str == "space") result->separator(SASS_SPACE);
|
|
209
|
+
else if (sep_str == "comma") result->separator(SASS_COMMA);
|
|
210
|
+
else error("argument `$separator` of `" + sass::string(sig) + "` must be `space`, `comma`, or `auto`", pstate, traces);
|
|
211
|
+
}
|
|
212
|
+
if (l->is_arglist()) {
|
|
213
|
+
result->append(SASS_MEMORY_NEW(Argument,
|
|
214
|
+
v->pstate(),
|
|
215
|
+
v,
|
|
216
|
+
"",
|
|
217
|
+
false,
|
|
218
|
+
false));
|
|
219
|
+
|
|
220
|
+
} else {
|
|
221
|
+
result->append(v);
|
|
222
|
+
}
|
|
223
|
+
return result;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
Signature zip_sig = "zip($lists...)";
|
|
227
|
+
BUILT_IN(zip)
|
|
228
|
+
{
|
|
229
|
+
List_Obj arglist = SASS_MEMORY_COPY(ARG("$lists", List));
|
|
230
|
+
size_t shortest = 0;
|
|
231
|
+
for (size_t i = 0, L = arglist->length(); i < L; ++i) {
|
|
232
|
+
List_Obj ith = Cast<List>(arglist->value_at_index(i));
|
|
233
|
+
Map_Obj mith = Cast<Map>(arglist->value_at_index(i));
|
|
234
|
+
if (!ith) {
|
|
235
|
+
if (mith) {
|
|
236
|
+
ith = mith->to_list(pstate);
|
|
237
|
+
} else {
|
|
238
|
+
ith = SASS_MEMORY_NEW(List, pstate, 1);
|
|
239
|
+
ith->append(arglist->value_at_index(i));
|
|
240
|
+
}
|
|
241
|
+
if (arglist->is_arglist()) {
|
|
242
|
+
Argument_Obj arg = (Argument*)(arglist->at(i).ptr()); // XXX
|
|
243
|
+
arg->value(ith);
|
|
244
|
+
} else {
|
|
245
|
+
(*arglist)[i] = ith;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
shortest = (i ? std::min(shortest, ith->length()) : ith->length());
|
|
249
|
+
}
|
|
250
|
+
List* zippers = SASS_MEMORY_NEW(List, pstate, shortest, SASS_COMMA);
|
|
251
|
+
size_t L = arglist->length();
|
|
252
|
+
for (size_t i = 0; i < shortest; ++i) {
|
|
253
|
+
List* zipper = SASS_MEMORY_NEW(List, pstate, L);
|
|
254
|
+
for (size_t j = 0; j < L; ++j) {
|
|
255
|
+
zipper->append(Cast<List>(arglist->value_at_index(j))->at(i));
|
|
256
|
+
}
|
|
257
|
+
zippers->append(zipper);
|
|
258
|
+
}
|
|
259
|
+
return zippers;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
Signature list_separator_sig = "list_separator($list)";
|
|
263
|
+
BUILT_IN(list_separator)
|
|
264
|
+
{
|
|
265
|
+
List_Obj l = Cast<List>(env["$list"]);
|
|
266
|
+
if (!l) {
|
|
267
|
+
l = SASS_MEMORY_NEW(List, pstate, 1);
|
|
268
|
+
l->append(ARG("$list", Expression));
|
|
269
|
+
}
|
|
270
|
+
return SASS_MEMORY_NEW(String_Quoted,
|
|
271
|
+
pstate,
|
|
272
|
+
l->separator() == SASS_COMMA ? "comma" : "space");
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
Signature is_bracketed_sig = "is-bracketed($list)";
|
|
276
|
+
BUILT_IN(is_bracketed)
|
|
277
|
+
{
|
|
278
|
+
ValueObj value = ARG("$list", Value);
|
|
279
|
+
List_Obj list = Cast<List>(value);
|
|
280
|
+
return SASS_MEMORY_NEW(Boolean, pstate, list && list->is_bracketed());
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#ifndef SASS_FN_LISTS_H
|
|
2
|
+
#define SASS_FN_LISTS_H
|
|
3
|
+
|
|
4
|
+
#include "fn_utils.hpp"
|
|
5
|
+
|
|
6
|
+
namespace Sass {
|
|
7
|
+
|
|
8
|
+
namespace Functions {
|
|
9
|
+
|
|
10
|
+
extern Signature length_sig;
|
|
11
|
+
extern Signature nth_sig;
|
|
12
|
+
extern Signature index_sig;
|
|
13
|
+
extern Signature join_sig;
|
|
14
|
+
extern Signature append_sig;
|
|
15
|
+
extern Signature zip_sig;
|
|
16
|
+
extern Signature list_separator_sig;
|
|
17
|
+
extern Signature is_bracketed_sig;
|
|
18
|
+
extern Signature keywords_sig;
|
|
19
|
+
|
|
20
|
+
BUILT_IN(length);
|
|
21
|
+
BUILT_IN(nth);
|
|
22
|
+
BUILT_IN(index);
|
|
23
|
+
BUILT_IN(join);
|
|
24
|
+
BUILT_IN(append);
|
|
25
|
+
BUILT_IN(zip);
|
|
26
|
+
BUILT_IN(list_separator);
|
|
27
|
+
BUILT_IN(is_bracketed);
|
|
28
|
+
BUILT_IN(keywords);
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#endif
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#include "operators.hpp"
|
|
2
|
+
#include "fn_utils.hpp"
|
|
3
|
+
#include "fn_maps.hpp"
|
|
4
|
+
|
|
5
|
+
namespace Sass {
|
|
6
|
+
|
|
7
|
+
namespace Functions {
|
|
8
|
+
|
|
9
|
+
/////////////////
|
|
10
|
+
// MAP FUNCTIONS
|
|
11
|
+
/////////////////
|
|
12
|
+
|
|
13
|
+
Signature map_get_sig = "map-get($map, $key)";
|
|
14
|
+
BUILT_IN(map_get)
|
|
15
|
+
{
|
|
16
|
+
// leaks for "map-get((), foo)" if not Obj
|
|
17
|
+
// investigate why this is (unexpected)
|
|
18
|
+
Map_Obj m = ARGM("$map", Map);
|
|
19
|
+
ExpressionObj v = ARG("$key", Expression);
|
|
20
|
+
try {
|
|
21
|
+
ValueObj val = m->at(v);
|
|
22
|
+
if (!val) return SASS_MEMORY_NEW(Null, pstate);
|
|
23
|
+
val->set_delayed(false);
|
|
24
|
+
return val.detach();
|
|
25
|
+
} catch (const std::out_of_range&) {
|
|
26
|
+
return SASS_MEMORY_NEW(Null, pstate);
|
|
27
|
+
}
|
|
28
|
+
catch (...) { throw; }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
Signature map_has_key_sig = "map-has-key($map, $key)";
|
|
32
|
+
BUILT_IN(map_has_key)
|
|
33
|
+
{
|
|
34
|
+
Map_Obj m = ARGM("$map", Map);
|
|
35
|
+
ExpressionObj v = ARG("$key", Expression);
|
|
36
|
+
return SASS_MEMORY_NEW(Boolean, pstate, m->has(v));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
Signature map_keys_sig = "map-keys($map)";
|
|
40
|
+
BUILT_IN(map_keys)
|
|
41
|
+
{
|
|
42
|
+
Map_Obj m = ARGM("$map", Map);
|
|
43
|
+
List* result = SASS_MEMORY_NEW(List, pstate, m->length(), SASS_COMMA);
|
|
44
|
+
for ( auto key : m->keys()) {
|
|
45
|
+
result->append(key);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
Signature map_values_sig = "map-values($map)";
|
|
51
|
+
BUILT_IN(map_values)
|
|
52
|
+
{
|
|
53
|
+
Map_Obj m = ARGM("$map", Map);
|
|
54
|
+
List* result = SASS_MEMORY_NEW(List, pstate, m->length(), SASS_COMMA);
|
|
55
|
+
for ( auto key : m->keys()) {
|
|
56
|
+
result->append(m->at(key));
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
Signature map_merge_sig = "map-merge($map1, $map2)";
|
|
62
|
+
BUILT_IN(map_merge)
|
|
63
|
+
{
|
|
64
|
+
Map_Obj m1 = ARGM("$map1", Map);
|
|
65
|
+
Map_Obj m2 = ARGM("$map2", Map);
|
|
66
|
+
|
|
67
|
+
size_t len = m1->length() + m2->length();
|
|
68
|
+
Map* result = SASS_MEMORY_NEW(Map, pstate, len);
|
|
69
|
+
// concat not implemented for maps
|
|
70
|
+
*result += m1;
|
|
71
|
+
*result += m2;
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
Signature map_remove_sig = "map-remove($map, $keys...)";
|
|
76
|
+
BUILT_IN(map_remove)
|
|
77
|
+
{
|
|
78
|
+
bool remove;
|
|
79
|
+
Map_Obj m = ARGM("$map", Map);
|
|
80
|
+
List_Obj arglist = ARG("$keys", List);
|
|
81
|
+
Map* result = SASS_MEMORY_NEW(Map, pstate, 1);
|
|
82
|
+
for (auto key : m->keys()) {
|
|
83
|
+
remove = false;
|
|
84
|
+
for (size_t j = 0, K = arglist->length(); j < K && !remove; ++j) {
|
|
85
|
+
remove = Operators::eq(key, arglist->value_at_index(j));
|
|
86
|
+
}
|
|
87
|
+
if (!remove) *result << std::make_pair(key, m->at(key));
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#ifndef SASS_FN_MAPS_H
|
|
2
|
+
#define SASS_FN_MAPS_H
|
|
3
|
+
|
|
4
|
+
#include "fn_utils.hpp"
|
|
5
|
+
|
|
6
|
+
namespace Sass {
|
|
7
|
+
|
|
8
|
+
namespace Functions {
|
|
9
|
+
|
|
10
|
+
#define ARGM(argname, argtype) get_arg_m(argname, env, sig, pstate, traces)
|
|
11
|
+
|
|
12
|
+
extern Signature map_get_sig;
|
|
13
|
+
extern Signature map_merge_sig;
|
|
14
|
+
extern Signature map_remove_sig;
|
|
15
|
+
extern Signature map_keys_sig;
|
|
16
|
+
extern Signature map_values_sig;
|
|
17
|
+
extern Signature map_has_key_sig;
|
|
18
|
+
|
|
19
|
+
BUILT_IN(map_get);
|
|
20
|
+
BUILT_IN(map_merge);
|
|
21
|
+
BUILT_IN(map_remove);
|
|
22
|
+
BUILT_IN(map_keys);
|
|
23
|
+
BUILT_IN(map_values);
|
|
24
|
+
BUILT_IN(map_has_key);
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#endif
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
#include "ast.hpp"
|
|
2
|
+
#include "expand.hpp"
|
|
3
|
+
#include "fn_utils.hpp"
|
|
4
|
+
#include "fn_miscs.hpp"
|
|
5
|
+
#include "util_string.hpp"
|
|
6
|
+
|
|
7
|
+
namespace Sass {
|
|
8
|
+
|
|
9
|
+
namespace Functions {
|
|
10
|
+
|
|
11
|
+
//////////////////////////
|
|
12
|
+
// INTROSPECTION FUNCTIONS
|
|
13
|
+
//////////////////////////
|
|
14
|
+
|
|
15
|
+
Signature type_of_sig = "type-of($value)";
|
|
16
|
+
BUILT_IN(type_of)
|
|
17
|
+
{
|
|
18
|
+
Expression* v = ARG("$value", Expression);
|
|
19
|
+
return SASS_MEMORY_NEW(String_Quoted, pstate, v->type());
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
Signature variable_exists_sig = "variable-exists($name)";
|
|
23
|
+
BUILT_IN(variable_exists)
|
|
24
|
+
{
|
|
25
|
+
sass::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
|
|
26
|
+
|
|
27
|
+
if(d_env.has("$"+s)) {
|
|
28
|
+
return SASS_MEMORY_NEW(Boolean, pstate, true);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
return SASS_MEMORY_NEW(Boolean, pstate, false);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
Signature global_variable_exists_sig = "global-variable-exists($name)";
|
|
36
|
+
BUILT_IN(global_variable_exists)
|
|
37
|
+
{
|
|
38
|
+
sass::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
|
|
39
|
+
|
|
40
|
+
if(d_env.has_global("$"+s)) {
|
|
41
|
+
return SASS_MEMORY_NEW(Boolean, pstate, true);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return SASS_MEMORY_NEW(Boolean, pstate, false);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
Signature function_exists_sig = "function-exists($name)";
|
|
49
|
+
BUILT_IN(function_exists)
|
|
50
|
+
{
|
|
51
|
+
String_Constant* ss = Cast<String_Constant>(env["$name"]);
|
|
52
|
+
if (!ss) {
|
|
53
|
+
error("$name: " + (env["$name"]->to_string()) + " is not a string for `function-exists'", pstate, traces);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
sass::string name = Util::normalize_underscores(unquote(ss->value()));
|
|
57
|
+
|
|
58
|
+
if(d_env.has(name+"[f]")) {
|
|
59
|
+
return SASS_MEMORY_NEW(Boolean, pstate, true);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
return SASS_MEMORY_NEW(Boolean, pstate, false);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
Signature mixin_exists_sig = "mixin-exists($name)";
|
|
67
|
+
BUILT_IN(mixin_exists)
|
|
68
|
+
{
|
|
69
|
+
sass::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
|
|
70
|
+
|
|
71
|
+
if(d_env.has(s+"[m]")) {
|
|
72
|
+
return SASS_MEMORY_NEW(Boolean, pstate, true);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
return SASS_MEMORY_NEW(Boolean, pstate, false);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
Signature feature_exists_sig = "feature-exists($feature)";
|
|
80
|
+
BUILT_IN(feature_exists)
|
|
81
|
+
{
|
|
82
|
+
sass::string s = unquote(ARG("$feature", String_Constant)->value());
|
|
83
|
+
|
|
84
|
+
static const auto *const features = new std::unordered_set<sass::string> {
|
|
85
|
+
"global-variable-shadowing",
|
|
86
|
+
"extend-selector-pseudoclass",
|
|
87
|
+
"at-error",
|
|
88
|
+
"units-level-3",
|
|
89
|
+
"custom-property"
|
|
90
|
+
};
|
|
91
|
+
return SASS_MEMORY_NEW(Boolean, pstate, features->find(s) != features->end());
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
Signature call_sig = "call($function, $args...)";
|
|
95
|
+
BUILT_IN(call)
|
|
96
|
+
{
|
|
97
|
+
sass::string function;
|
|
98
|
+
Function* ff = Cast<Function>(env["$function"]);
|
|
99
|
+
String_Constant* ss = Cast<String_Constant>(env["$function"]);
|
|
100
|
+
|
|
101
|
+
if (ss) {
|
|
102
|
+
function = Util::normalize_underscores(unquote(ss->value()));
|
|
103
|
+
std::cerr << "DEPRECATION WARNING: ";
|
|
104
|
+
std::cerr << "Passing a string to call() is deprecated and will be illegal" << std::endl;
|
|
105
|
+
std::cerr << "in Sass 4.0. Use call(get-function(" + quote(function) + ")) instead." << std::endl;
|
|
106
|
+
std::cerr << std::endl;
|
|
107
|
+
} else if (ff) {
|
|
108
|
+
function = ff->name();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
List_Obj arglist = SASS_MEMORY_COPY(ARG("$args", List));
|
|
112
|
+
|
|
113
|
+
Arguments_Obj args = SASS_MEMORY_NEW(Arguments, pstate);
|
|
114
|
+
// sass::string full_name(name + "[f]");
|
|
115
|
+
// Definition* def = d_env.has(full_name) ? Cast<Definition>((d_env)[full_name]) : 0;
|
|
116
|
+
// Parameters* params = def ? def->parameters() : 0;
|
|
117
|
+
// size_t param_size = params ? params->length() : 0;
|
|
118
|
+
for (size_t i = 0, L = arglist->length(); i < L; ++i) {
|
|
119
|
+
ExpressionObj expr = arglist->value_at_index(i);
|
|
120
|
+
// if (params && params->has_rest_parameter()) {
|
|
121
|
+
// Parameter_Obj p = param_size > i ? (*params)[i] : 0;
|
|
122
|
+
// List* list = Cast<List>(expr);
|
|
123
|
+
// if (list && p && !p->is_rest_parameter()) expr = (*list)[0];
|
|
124
|
+
// }
|
|
125
|
+
if (arglist->is_arglist()) {
|
|
126
|
+
ExpressionObj obj = arglist->at(i);
|
|
127
|
+
Argument_Obj arg = (Argument*) obj.ptr(); // XXX
|
|
128
|
+
args->append(SASS_MEMORY_NEW(Argument,
|
|
129
|
+
pstate,
|
|
130
|
+
expr,
|
|
131
|
+
arg ? arg->name() : "",
|
|
132
|
+
arg ? arg->is_rest_argument() : false,
|
|
133
|
+
arg ? arg->is_keyword_argument() : false));
|
|
134
|
+
} else {
|
|
135
|
+
args->append(SASS_MEMORY_NEW(Argument, pstate, expr));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
Function_Call_Obj func = SASS_MEMORY_NEW(Function_Call, pstate, function, args);
|
|
139
|
+
|
|
140
|
+
Expand expand(ctx, &d_env, &selector_stack, &original_stack);
|
|
141
|
+
func->via_call(true); // calc invoke is allowed
|
|
142
|
+
if (ff) func->func(ff);
|
|
143
|
+
return Cast<PreValue>(func->perform(&expand.eval));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
////////////////////
|
|
147
|
+
// BOOLEAN FUNCTIONS
|
|
148
|
+
////////////////////
|
|
149
|
+
|
|
150
|
+
Signature not_sig = "not($value)";
|
|
151
|
+
BUILT_IN(sass_not)
|
|
152
|
+
{
|
|
153
|
+
return SASS_MEMORY_NEW(Boolean, pstate, ARG("$value", Expression)->is_false());
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
Signature if_sig = "if($condition, $if-true, $if-false)";
|
|
157
|
+
BUILT_IN(sass_if)
|
|
158
|
+
{
|
|
159
|
+
Expand expand(ctx, &d_env, &selector_stack, &original_stack);
|
|
160
|
+
ExpressionObj cond = ARG("$condition", Expression)->perform(&expand.eval);
|
|
161
|
+
bool is_true = !cond->is_false();
|
|
162
|
+
ExpressionObj res = ARG(is_true ? "$if-true" : "$if-false", Expression);
|
|
163
|
+
ValueObj qwe = Cast<Value>(res->perform(&expand.eval));
|
|
164
|
+
// res = res->perform(&expand.eval.val_eval);
|
|
165
|
+
qwe->set_delayed(false); // clone?
|
|
166
|
+
return qwe.detach();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
//////////////////////////
|
|
170
|
+
// MISCELLANEOUS FUNCTIONS
|
|
171
|
+
//////////////////////////
|
|
172
|
+
|
|
173
|
+
Signature inspect_sig = "inspect($value)";
|
|
174
|
+
BUILT_IN(inspect)
|
|
175
|
+
{
|
|
176
|
+
Expression* v = ARG("$value", Expression);
|
|
177
|
+
if (v->concrete_type() == Expression::NULL_VAL) {
|
|
178
|
+
return SASS_MEMORY_NEW(String_Constant, pstate, "null");
|
|
179
|
+
} else if (v->concrete_type() == Expression::BOOLEAN && v->is_false()) {
|
|
180
|
+
return SASS_MEMORY_NEW(String_Constant, pstate, "false");
|
|
181
|
+
} else if (v->concrete_type() == Expression::STRING) {
|
|
182
|
+
String_Constant *s = Cast<String_Constant>(v);
|
|
183
|
+
if (s->quote_mark()) {
|
|
184
|
+
return SASS_MEMORY_NEW(String_Constant, pstate, quote(s->value(), s->quote_mark()));
|
|
185
|
+
} else {
|
|
186
|
+
return s;
|
|
187
|
+
}
|
|
188
|
+
} else {
|
|
189
|
+
// ToDo: fix to_sass for nested parentheses
|
|
190
|
+
Sass_Output_Style old_style;
|
|
191
|
+
old_style = ctx.c_options.output_style;
|
|
192
|
+
ctx.c_options.output_style = TO_SASS;
|
|
193
|
+
Emitter emitter(ctx.c_options);
|
|
194
|
+
Inspect i(emitter);
|
|
195
|
+
i.in_declaration = false;
|
|
196
|
+
v->perform(&i);
|
|
197
|
+
ctx.c_options.output_style = old_style;
|
|
198
|
+
return SASS_MEMORY_NEW(String_Quoted, pstate, i.get_buffer());
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
Signature content_exists_sig = "content-exists()";
|
|
203
|
+
BUILT_IN(content_exists)
|
|
204
|
+
{
|
|
205
|
+
if (!d_env.has_global("is_in_mixin")) {
|
|
206
|
+
error("Cannot call content-exists() except within a mixin.", pstate, traces);
|
|
207
|
+
}
|
|
208
|
+
return SASS_MEMORY_NEW(Boolean, pstate, d_env.has_lexical("@content[m]"));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
Signature get_function_sig = "get-function($name, $css: false)";
|
|
212
|
+
BUILT_IN(get_function)
|
|
213
|
+
{
|
|
214
|
+
String_Constant* ss = Cast<String_Constant>(env["$name"]);
|
|
215
|
+
if (!ss) {
|
|
216
|
+
error("$name: " + (env["$name"]->to_string()) + " is not a string for `get-function'", pstate, traces);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
sass::string name = Util::normalize_underscores(unquote(ss->value()));
|
|
220
|
+
sass::string full_name = name + "[f]";
|
|
221
|
+
|
|
222
|
+
Boolean_Obj css = ARG("$css", Boolean);
|
|
223
|
+
if (!css->is_false()) {
|
|
224
|
+
Definition* def = SASS_MEMORY_NEW(Definition,
|
|
225
|
+
pstate,
|
|
226
|
+
name,
|
|
227
|
+
SASS_MEMORY_NEW(Parameters, pstate),
|
|
228
|
+
SASS_MEMORY_NEW(Block, pstate, 0, false),
|
|
229
|
+
Definition::FUNCTION);
|
|
230
|
+
return SASS_MEMORY_NEW(Function, pstate, def, true);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
if (!d_env.has_global(full_name)) {
|
|
235
|
+
error("Function not found: " + name, pstate, traces);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
Definition* def = Cast<Definition>(d_env[full_name]);
|
|
239
|
+
return SASS_MEMORY_NEW(Function, pstate, def, false);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
}
|