sassc 2.0.1 → 2.1.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.gitmodules +1 -1
- data/.travis.yml +7 -3
- data/CHANGELOG.md +3 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/README.md +1 -1
- data/Rakefile +23 -8
- data/ext/extconf.rb +39 -0
- data/ext/libsass/.gitignore +1 -0
- data/ext/libsass/GNUmakefile.am +23 -39
- data/ext/libsass/Makefile +56 -91
- data/ext/libsass/Makefile.conf +16 -2
- data/ext/libsass/configure.ac +8 -12
- data/ext/libsass/include/sass/base.h +1 -0
- data/ext/libsass/include/sass/context.h +1 -1
- data/ext/libsass/src/GNUmakefile.am +1 -5
- data/ext/libsass/src/ast.cpp +747 -2010
- data/ext/libsass/src/ast.hpp +239 -2383
- data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +62 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
- data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
- data/ext/libsass/src/ast_sel_unify.cpp +280 -0
- data/ext/libsass/src/ast_selectors.cpp +1475 -0
- data/ext/libsass/src/ast_selectors.hpp +568 -0
- data/ext/libsass/src/ast_supports.cpp +130 -0
- data/ext/libsass/src/ast_supports.hpp +121 -0
- data/ext/libsass/src/ast_values.cpp +967 -0
- data/ext/libsass/src/ast_values.hpp +489 -0
- data/ext/libsass/src/backtrace.cpp +4 -0
- data/ext/libsass/src/base64vlq.cpp +3 -0
- data/ext/libsass/src/bind.cpp +18 -17
- data/ext/libsass/src/bind.hpp +3 -1
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/cencode.c +2 -2
- data/ext/libsass/src/check_nesting.cpp +52 -56
- data/ext/libsass/src/check_nesting.hpp +35 -34
- data/ext/libsass/src/color_maps.cpp +156 -153
- data/ext/libsass/src/color_maps.hpp +152 -152
- data/ext/libsass/src/constants.cpp +15 -0
- data/ext/libsass/src/constants.hpp +13 -0
- data/ext/libsass/src/context.cpp +24 -14
- data/ext/libsass/src/context.hpp +6 -6
- data/ext/libsass/src/cssize.cpp +69 -71
- data/ext/libsass/src/cssize.hpp +50 -50
- data/ext/libsass/src/debugger.hpp +117 -110
- data/ext/libsass/src/emitter.cpp +13 -12
- data/ext/libsass/src/emitter.hpp +13 -9
- data/ext/libsass/src/environment.cpp +15 -1
- data/ext/libsass/src/environment.hpp +6 -0
- data/ext/libsass/src/error_handling.cpp +36 -59
- data/ext/libsass/src/error_handling.hpp +29 -16
- data/ext/libsass/src/eval.cpp +302 -323
- data/ext/libsass/src/eval.hpp +64 -55
- data/ext/libsass/src/expand.cpp +94 -88
- data/ext/libsass/src/expand.hpp +33 -37
- data/ext/libsass/src/extend.cpp +38 -36
- data/ext/libsass/src/extend.hpp +15 -15
- data/ext/libsass/src/file.cpp +34 -2
- data/ext/libsass/src/fn_colors.cpp +594 -0
- data/ext/libsass/src/fn_colors.hpp +85 -0
- data/ext/libsass/src/fn_lists.cpp +284 -0
- data/ext/libsass/src/fn_lists.hpp +34 -0
- data/ext/libsass/src/fn_maps.cpp +94 -0
- data/ext/libsass/src/fn_maps.hpp +30 -0
- data/ext/libsass/src/fn_miscs.cpp +256 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +220 -0
- data/ext/libsass/src/fn_numbers.hpp +45 -0
- data/ext/libsass/src/fn_selectors.cpp +235 -0
- data/ext/libsass/src/fn_selectors.hpp +35 -0
- data/ext/libsass/src/fn_strings.cpp +254 -0
- data/ext/libsass/src/fn_strings.hpp +34 -0
- data/ext/libsass/src/fn_utils.cpp +156 -0
- data/ext/libsass/src/fn_utils.hpp +56 -0
- data/ext/libsass/src/inspect.cpp +101 -152
- data/ext/libsass/src/inspect.hpp +69 -73
- data/ext/libsass/src/json.cpp +2 -2
- data/ext/libsass/src/lexer.cpp +6 -3
- data/ext/libsass/src/listize.cpp +9 -11
- data/ext/libsass/src/listize.hpp +11 -7
- data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
- data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
- data/ext/libsass/src/node.cpp +13 -10
- data/ext/libsass/src/node.hpp +3 -3
- data/ext/libsass/src/operation.hpp +184 -144
- data/ext/libsass/src/operators.cpp +43 -17
- data/ext/libsass/src/operators.hpp +5 -5
- data/ext/libsass/src/output.cpp +21 -18
- data/ext/libsass/src/output.hpp +14 -21
- data/ext/libsass/src/parser.cpp +215 -183
- data/ext/libsass/src/parser.hpp +28 -24
- data/ext/libsass/src/plugins.cpp +5 -1
- data/ext/libsass/src/position.cpp +3 -0
- data/ext/libsass/src/prelexer.cpp +9 -3
- data/ext/libsass/src/prelexer.hpp +9 -9
- data/ext/libsass/src/remove_placeholders.cpp +14 -11
- data/ext/libsass/src/remove_placeholders.hpp +8 -9
- data/ext/libsass/src/sass.cpp +9 -3
- data/ext/libsass/src/sass.hpp +12 -9
- data/ext/libsass/src/sass2scss.cpp +45 -14
- data/ext/libsass/src/sass_context.cpp +18 -15
- data/ext/libsass/src/sass_functions.cpp +6 -3
- data/ext/libsass/src/sass_functions.hpp +1 -1
- data/ext/libsass/src/sass_util.cpp +3 -0
- data/ext/libsass/src/sass_values.cpp +21 -13
- data/ext/libsass/src/source_map.cpp +5 -2
- data/ext/libsass/src/source_map.hpp +2 -2
- data/ext/libsass/src/subset_map.cpp +4 -1
- data/ext/libsass/src/to_value.cpp +23 -21
- data/ext/libsass/src/to_value.hpp +18 -22
- data/ext/libsass/src/units.cpp +4 -0
- data/ext/libsass/src/units.hpp +1 -0
- data/ext/libsass/src/utf8/checked.h +12 -10
- data/ext/libsass/src/utf8/core.h +3 -0
- data/ext/libsass/src/utf8_string.cpp +3 -0
- data/ext/libsass/src/util.cpp +67 -75
- data/ext/libsass/src/util.hpp +64 -19
- data/ext/libsass/src/util_string.cpp +75 -0
- data/ext/libsass/src/util_string.hpp +19 -0
- data/ext/libsass/src/values.cpp +22 -13
- data/ext/libsass/src/values.hpp +2 -2
- data/ext/libsass/win/libsass.targets +30 -4
- data/ext/libsass/win/libsass.vcxproj.filters +82 -4
- data/lib/sassc.rb +24 -0
- data/lib/sassc/engine.rb +2 -2
- data/lib/sassc/native.rb +8 -1
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +19 -11
- data/test/engine_test.rb +26 -1
- data/test/native_test.rb +1 -1
- metadata +66 -72
- data/ext/Rakefile +0 -3
- data/ext/libsass/.github/CONTRIBUTING.md +0 -65
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
- data/ext/libsass/.travis.yml +0 -64
- data/ext/libsass/Readme.md +0 -104
- data/ext/libsass/SECURITY.md +0 -10
- data/ext/libsass/appveyor.yml +0 -91
- data/ext/libsass/docs/README.md +0 -20
- data/ext/libsass/docs/api-context-example.md +0 -45
- data/ext/libsass/docs/api-context-internal.md +0 -163
- data/ext/libsass/docs/api-context.md +0 -295
- data/ext/libsass/docs/api-doc.md +0 -215
- data/ext/libsass/docs/api-function-example.md +0 -67
- data/ext/libsass/docs/api-function-internal.md +0 -8
- data/ext/libsass/docs/api-function.md +0 -74
- data/ext/libsass/docs/api-importer-example.md +0 -112
- data/ext/libsass/docs/api-importer-internal.md +0 -20
- data/ext/libsass/docs/api-importer.md +0 -86
- data/ext/libsass/docs/api-value-example.md +0 -55
- data/ext/libsass/docs/api-value-internal.md +0 -76
- data/ext/libsass/docs/api-value.md +0 -154
- data/ext/libsass/docs/build-on-darwin.md +0 -27
- data/ext/libsass/docs/build-on-gentoo.md +0 -55
- data/ext/libsass/docs/build-on-windows.md +0 -139
- data/ext/libsass/docs/build-shared-library.md +0 -35
- data/ext/libsass/docs/build-with-autotools.md +0 -78
- data/ext/libsass/docs/build-with-makefiles.md +0 -68
- data/ext/libsass/docs/build-with-mingw.md +0 -107
- data/ext/libsass/docs/build-with-visual-studio.md +0 -90
- data/ext/libsass/docs/build.md +0 -97
- data/ext/libsass/docs/compatibility-plan.md +0 -48
- data/ext/libsass/docs/contributing.md +0 -17
- data/ext/libsass/docs/custom-functions-internal.md +0 -122
- data/ext/libsass/docs/dev-ast-memory.md +0 -223
- data/ext/libsass/docs/implementations.md +0 -56
- data/ext/libsass/docs/plugins.md +0 -47
- data/ext/libsass/docs/setup-environment.md +0 -68
- data/ext/libsass/docs/source-map-internals.md +0 -51
- data/ext/libsass/docs/trace.md +0 -26
- data/ext/libsass/docs/triage.md +0 -17
- data/ext/libsass/docs/unicode.md +0 -39
- data/ext/libsass/extconf.rb +0 -6
- data/ext/libsass/script/bootstrap +0 -13
- data/ext/libsass/script/branding +0 -10
- data/ext/libsass/script/ci-build-libsass +0 -134
- data/ext/libsass/script/ci-build-plugin +0 -62
- data/ext/libsass/script/ci-install-compiler +0 -6
- data/ext/libsass/script/ci-install-deps +0 -20
- data/ext/libsass/script/ci-report-coverage +0 -42
- data/ext/libsass/script/spec +0 -5
- data/ext/libsass/script/tap-driver +0 -652
- data/ext/libsass/script/tap-runner +0 -1
- data/ext/libsass/script/test-leaks.pl +0 -103
- data/ext/libsass/src/functions.cpp +0 -2234
- data/ext/libsass/src/functions.hpp +0 -198
- data/ext/libsass/src/to_c.hpp +0 -39
- data/ext/libsass/test/test_node.cpp +0 -94
- data/ext/libsass/test/test_paths.cpp +0 -28
- data/ext/libsass/test/test_selector_difference.cpp +0 -25
- data/ext/libsass/test/test_specificity.cpp +0 -25
- data/ext/libsass/test/test_subset_map.cpp +0 -472
- data/ext/libsass/test/test_superselector.cpp +0 -69
- data/ext/libsass/test/test_unification.cpp +0 -31
- data/lib/tasks/libsass.rb +0 -33
@@ -0,0 +1,85 @@
|
|
1
|
+
#ifndef SASS_FN_COLORS_H
|
2
|
+
#define SASS_FN_COLORS_H
|
3
|
+
|
4
|
+
#include "fn_utils.hpp"
|
5
|
+
|
6
|
+
namespace Sass {
|
7
|
+
|
8
|
+
namespace Functions {
|
9
|
+
|
10
|
+
// macros for common ranges (u mean unsigned or upper, r for full range)
|
11
|
+
#define DARG_U_FACT(argname) get_arg_r(argname, env, sig, pstate, traces, - 0.0, 1.0) // double
|
12
|
+
#define DARG_R_FACT(argname) get_arg_r(argname, env, sig, pstate, traces, - 1.0, 1.0) // double
|
13
|
+
#define DARG_U_BYTE(argname) get_arg_r(argname, env, sig, pstate, traces, - 0.0, 255.0) // double
|
14
|
+
#define DARG_R_BYTE(argname) get_arg_r(argname, env, sig, pstate, traces, - 255.0, 255.0) // double
|
15
|
+
#define DARG_U_PRCT(argname) get_arg_r(argname, env, sig, pstate, traces, - 0.0, 100.0) // double
|
16
|
+
#define DARG_R_PRCT(argname) get_arg_r(argname, env, sig, pstate, traces, - 100.0, 100.0) // double
|
17
|
+
|
18
|
+
// macros for color related inputs (rbg and alpha/opacity values)
|
19
|
+
#define COLOR_NUM(argname) color_num(argname, env, sig, pstate, traces) // double
|
20
|
+
#define ALPHA_NUM(argname) alpha_num(argname, env, sig, pstate, traces) // double
|
21
|
+
|
22
|
+
extern Signature rgb_sig;
|
23
|
+
extern Signature rgba_4_sig;
|
24
|
+
extern Signature rgba_2_sig;
|
25
|
+
extern Signature red_sig;
|
26
|
+
extern Signature green_sig;
|
27
|
+
extern Signature blue_sig;
|
28
|
+
extern Signature mix_sig;
|
29
|
+
extern Signature hsl_sig;
|
30
|
+
extern Signature hsla_sig;
|
31
|
+
extern Signature hue_sig;
|
32
|
+
extern Signature saturation_sig;
|
33
|
+
extern Signature lightness_sig;
|
34
|
+
extern Signature adjust_hue_sig;
|
35
|
+
extern Signature lighten_sig;
|
36
|
+
extern Signature darken_sig;
|
37
|
+
extern Signature saturate_sig;
|
38
|
+
extern Signature desaturate_sig;
|
39
|
+
extern Signature grayscale_sig;
|
40
|
+
extern Signature complement_sig;
|
41
|
+
extern Signature invert_sig;
|
42
|
+
extern Signature alpha_sig;
|
43
|
+
extern Signature opacity_sig;
|
44
|
+
extern Signature opacify_sig;
|
45
|
+
extern Signature fade_in_sig;
|
46
|
+
extern Signature transparentize_sig;
|
47
|
+
extern Signature fade_out_sig;
|
48
|
+
extern Signature adjust_color_sig;
|
49
|
+
extern Signature scale_color_sig;
|
50
|
+
extern Signature change_color_sig;
|
51
|
+
extern Signature ie_hex_str_sig;
|
52
|
+
|
53
|
+
BUILT_IN(rgb);
|
54
|
+
BUILT_IN(rgba_4);
|
55
|
+
BUILT_IN(rgba_2);
|
56
|
+
BUILT_IN(red);
|
57
|
+
BUILT_IN(green);
|
58
|
+
BUILT_IN(blue);
|
59
|
+
BUILT_IN(mix);
|
60
|
+
BUILT_IN(hsl);
|
61
|
+
BUILT_IN(hsla);
|
62
|
+
BUILT_IN(hue);
|
63
|
+
BUILT_IN(saturation);
|
64
|
+
BUILT_IN(lightness);
|
65
|
+
BUILT_IN(adjust_hue);
|
66
|
+
BUILT_IN(lighten);
|
67
|
+
BUILT_IN(darken);
|
68
|
+
BUILT_IN(saturate);
|
69
|
+
BUILT_IN(desaturate);
|
70
|
+
BUILT_IN(grayscale);
|
71
|
+
BUILT_IN(complement);
|
72
|
+
BUILT_IN(invert);
|
73
|
+
BUILT_IN(alpha);
|
74
|
+
BUILT_IN(opacify);
|
75
|
+
BUILT_IN(transparentize);
|
76
|
+
BUILT_IN(adjust_color);
|
77
|
+
BUILT_IN(scale_color);
|
78
|
+
BUILT_IN(change_color);
|
79
|
+
BUILT_IN(ie_hex_str);
|
80
|
+
|
81
|
+
}
|
82
|
+
|
83
|
+
}
|
84
|
+
|
85
|
+
#endif
|
@@ -0,0 +1,284 @@
|
|
1
|
+
#include "listize.hpp"
|
2
|
+
#include "operators.hpp"
|
3
|
+
#include "fn_utils.hpp"
|
4
|
+
#include "fn_lists.hpp"
|
5
|
+
|
6
|
+
namespace Sass {
|
7
|
+
|
8
|
+
namespace Functions {
|
9
|
+
|
10
|
+
/////////////////
|
11
|
+
// LIST FUNCTIONS
|
12
|
+
/////////////////
|
13
|
+
|
14
|
+
Signature keywords_sig = "keywords($args)";
|
15
|
+
BUILT_IN(keywords)
|
16
|
+
{
|
17
|
+
List_Obj arglist = SASS_MEMORY_COPY(ARG("$args", List)); // copy
|
18
|
+
Map_Obj result = SASS_MEMORY_NEW(Map, pstate, 1);
|
19
|
+
for (size_t i = arglist->size(), L = arglist->length(); i < L; ++i) {
|
20
|
+
Expression_Obj obj = arglist->at(i);
|
21
|
+
Argument_Obj arg = (Argument*) obj.ptr(); // XXX
|
22
|
+
std::string name = std::string(arg->name());
|
23
|
+
name = name.erase(0, 1); // sanitize name (remove dollar sign)
|
24
|
+
*result << std::make_pair(SASS_MEMORY_NEW(String_Quoted,
|
25
|
+
pstate, name),
|
26
|
+
arg->value());
|
27
|
+
}
|
28
|
+
return result.detach();
|
29
|
+
}
|
30
|
+
|
31
|
+
Signature length_sig = "length($list)";
|
32
|
+
BUILT_IN(length)
|
33
|
+
{
|
34
|
+
if (Selector_List* sl = Cast<Selector_List>(env["$list"])) {
|
35
|
+
return SASS_MEMORY_NEW(Number, pstate, (double)sl->length());
|
36
|
+
}
|
37
|
+
Expression* v = ARG("$list", Expression);
|
38
|
+
if (v->concrete_type() == Expression::MAP) {
|
39
|
+
Map* map = Cast<Map>(env["$list"]);
|
40
|
+
return SASS_MEMORY_NEW(Number, pstate, (double)(map ? map->length() : 1));
|
41
|
+
}
|
42
|
+
if (v->concrete_type() == Expression::SELECTOR) {
|
43
|
+
if (Compound_Selector* h = Cast<Compound_Selector>(v)) {
|
44
|
+
return SASS_MEMORY_NEW(Number, pstate, (double)h->length());
|
45
|
+
} else if (Selector_List* ls = Cast<Selector_List>(v)) {
|
46
|
+
return SASS_MEMORY_NEW(Number, pstate, (double)ls->length());
|
47
|
+
} else {
|
48
|
+
return SASS_MEMORY_NEW(Number, pstate, 1);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
List* list = Cast<List>(env["$list"]);
|
53
|
+
return SASS_MEMORY_NEW(Number,
|
54
|
+
pstate,
|
55
|
+
(double)(list ? list->size() : 1));
|
56
|
+
}
|
57
|
+
|
58
|
+
Signature nth_sig = "nth($list, $n)";
|
59
|
+
BUILT_IN(nth)
|
60
|
+
{
|
61
|
+
double nr = ARGVAL("$n");
|
62
|
+
Map* m = Cast<Map>(env["$list"]);
|
63
|
+
if (Selector_List* sl = Cast<Selector_List>(env["$list"])) {
|
64
|
+
size_t len = m ? m->length() : sl->length();
|
65
|
+
bool empty = m ? m->empty() : sl->empty();
|
66
|
+
if (empty) error("argument `$list` of `" + std::string(sig) + "` must not be empty", pstate, traces);
|
67
|
+
double index = std::floor(nr < 0 ? len + nr : nr - 1);
|
68
|
+
if (index < 0 || index > len - 1) error("index out of bounds for `" + std::string(sig) + "`", pstate, traces);
|
69
|
+
// return (*sl)[static_cast<int>(index)];
|
70
|
+
Listize listize;
|
71
|
+
return Cast<Value>((*sl)[static_cast<int>(index)]->perform(&listize));
|
72
|
+
}
|
73
|
+
List_Obj l = Cast<List>(env["$list"]);
|
74
|
+
if (nr == 0) error("argument `$n` of `" + std::string(sig) + "` must be non-zero", pstate, traces);
|
75
|
+
// if the argument isn't a list, then wrap it in a singleton list
|
76
|
+
if (!m && !l) {
|
77
|
+
l = SASS_MEMORY_NEW(List, pstate, 1);
|
78
|
+
l->append(ARG("$list", Expression));
|
79
|
+
}
|
80
|
+
size_t len = m ? m->length() : l->length();
|
81
|
+
bool empty = m ? m->empty() : l->empty();
|
82
|
+
if (empty) error("argument `$list` of `" + std::string(sig) + "` must not be empty", pstate, traces);
|
83
|
+
double index = std::floor(nr < 0 ? len + nr : nr - 1);
|
84
|
+
if (index < 0 || index > len - 1) error("index out of bounds for `" + std::string(sig) + "`", pstate, traces);
|
85
|
+
|
86
|
+
if (m) {
|
87
|
+
l = SASS_MEMORY_NEW(List, pstate, 2);
|
88
|
+
l->append(m->keys()[static_cast<unsigned int>(index)]);
|
89
|
+
l->append(m->at(m->keys()[static_cast<unsigned int>(index)]));
|
90
|
+
return l.detach();
|
91
|
+
}
|
92
|
+
else {
|
93
|
+
Value_Obj rv = l->value_at_index(static_cast<int>(index));
|
94
|
+
rv->set_delayed(false);
|
95
|
+
return rv.detach();
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
Signature set_nth_sig = "set-nth($list, $n, $value)";
|
100
|
+
BUILT_IN(set_nth)
|
101
|
+
{
|
102
|
+
Map_Obj m = Cast<Map>(env["$list"]);
|
103
|
+
List_Obj l = Cast<List>(env["$list"]);
|
104
|
+
Number_Obj n = ARG("$n", Number);
|
105
|
+
Expression_Obj v = ARG("$value", Expression);
|
106
|
+
if (!l) {
|
107
|
+
l = SASS_MEMORY_NEW(List, pstate, 1);
|
108
|
+
l->append(ARG("$list", Expression));
|
109
|
+
}
|
110
|
+
if (m) {
|
111
|
+
l = m->to_list(pstate);
|
112
|
+
}
|
113
|
+
if (l->empty()) error("argument `$list` of `" + std::string(sig) + "` must not be empty", pstate, traces);
|
114
|
+
double index = std::floor(n->value() < 0 ? l->length() + n->value() : n->value() - 1);
|
115
|
+
if (index < 0 || index > l->length() - 1) error("index out of bounds for `" + std::string(sig) + "`", pstate, traces);
|
116
|
+
List* result = SASS_MEMORY_NEW(List, pstate, l->length(), l->separator(), false, l->is_bracketed());
|
117
|
+
for (size_t i = 0, L = l->length(); i < L; ++i) {
|
118
|
+
result->append(((i == index) ? v : (*l)[i]));
|
119
|
+
}
|
120
|
+
return result;
|
121
|
+
}
|
122
|
+
|
123
|
+
Signature index_sig = "index($list, $value)";
|
124
|
+
BUILT_IN(index)
|
125
|
+
{
|
126
|
+
Map_Obj m = Cast<Map>(env["$list"]);
|
127
|
+
List_Obj l = Cast<List>(env["$list"]);
|
128
|
+
Expression_Obj v = ARG("$value", Expression);
|
129
|
+
if (!l) {
|
130
|
+
l = SASS_MEMORY_NEW(List, pstate, 1);
|
131
|
+
l->append(ARG("$list", Expression));
|
132
|
+
}
|
133
|
+
if (m) {
|
134
|
+
l = m->to_list(pstate);
|
135
|
+
}
|
136
|
+
for (size_t i = 0, L = l->length(); i < L; ++i) {
|
137
|
+
if (Operators::eq(l->value_at_index(i), v)) return SASS_MEMORY_NEW(Number, pstate, (double)(i+1));
|
138
|
+
}
|
139
|
+
return SASS_MEMORY_NEW(Null, pstate);
|
140
|
+
}
|
141
|
+
|
142
|
+
Signature join_sig = "join($list1, $list2, $separator: auto, $bracketed: auto)";
|
143
|
+
BUILT_IN(join)
|
144
|
+
{
|
145
|
+
Map_Obj m1 = Cast<Map>(env["$list1"]);
|
146
|
+
Map_Obj m2 = Cast<Map>(env["$list2"]);
|
147
|
+
List_Obj l1 = Cast<List>(env["$list1"]);
|
148
|
+
List_Obj l2 = Cast<List>(env["$list2"]);
|
149
|
+
String_Constant_Obj sep = ARG("$separator", String_Constant);
|
150
|
+
enum Sass_Separator sep_val = (l1 ? l1->separator() : SASS_SPACE);
|
151
|
+
Value* bracketed = ARG("$bracketed", Value);
|
152
|
+
bool is_bracketed = (l1 ? l1->is_bracketed() : false);
|
153
|
+
if (!l1) {
|
154
|
+
l1 = SASS_MEMORY_NEW(List, pstate, 1);
|
155
|
+
l1->append(ARG("$list1", Expression));
|
156
|
+
sep_val = (l2 ? l2->separator() : SASS_SPACE);
|
157
|
+
is_bracketed = (l2 ? l2->is_bracketed() : false);
|
158
|
+
}
|
159
|
+
if (!l2) {
|
160
|
+
l2 = SASS_MEMORY_NEW(List, pstate, 1);
|
161
|
+
l2->append(ARG("$list2", Expression));
|
162
|
+
}
|
163
|
+
if (m1) {
|
164
|
+
l1 = m1->to_list(pstate);
|
165
|
+
sep_val = SASS_COMMA;
|
166
|
+
}
|
167
|
+
if (m2) {
|
168
|
+
l2 = m2->to_list(pstate);
|
169
|
+
}
|
170
|
+
size_t len = l1->length() + l2->length();
|
171
|
+
std::string sep_str = unquote(sep->value());
|
172
|
+
if (sep_str == "space") sep_val = SASS_SPACE;
|
173
|
+
else if (sep_str == "comma") sep_val = SASS_COMMA;
|
174
|
+
else if (sep_str != "auto") error("argument `$separator` of `" + std::string(sig) + "` must be `space`, `comma`, or `auto`", pstate, traces);
|
175
|
+
String_Constant_Obj bracketed_as_str = Cast<String_Constant>(bracketed);
|
176
|
+
bool bracketed_is_auto = bracketed_as_str && unquote(bracketed_as_str->value()) == "auto";
|
177
|
+
if (!bracketed_is_auto) {
|
178
|
+
is_bracketed = !bracketed->is_false();
|
179
|
+
}
|
180
|
+
List_Obj result = SASS_MEMORY_NEW(List, pstate, len, sep_val, false, is_bracketed);
|
181
|
+
result->concat(l1);
|
182
|
+
result->concat(l2);
|
183
|
+
return result.detach();
|
184
|
+
}
|
185
|
+
|
186
|
+
Signature append_sig = "append($list, $val, $separator: auto)";
|
187
|
+
BUILT_IN(append)
|
188
|
+
{
|
189
|
+
Map_Obj m = Cast<Map>(env["$list"]);
|
190
|
+
List_Obj l = Cast<List>(env["$list"]);
|
191
|
+
Expression_Obj v = ARG("$val", Expression);
|
192
|
+
if (Selector_List* sl = Cast<Selector_List>(env["$list"])) {
|
193
|
+
Listize listize;
|
194
|
+
l = Cast<List>(sl->perform(&listize));
|
195
|
+
}
|
196
|
+
String_Constant_Obj sep = ARG("$separator", String_Constant);
|
197
|
+
if (!l) {
|
198
|
+
l = SASS_MEMORY_NEW(List, pstate, 1);
|
199
|
+
l->append(ARG("$list", Expression));
|
200
|
+
}
|
201
|
+
if (m) {
|
202
|
+
l = m->to_list(pstate);
|
203
|
+
}
|
204
|
+
List* result = SASS_MEMORY_COPY(l);
|
205
|
+
std::string sep_str(unquote(sep->value()));
|
206
|
+
if (sep_str != "auto") { // check default first
|
207
|
+
if (sep_str == "space") result->separator(SASS_SPACE);
|
208
|
+
else if (sep_str == "comma") result->separator(SASS_COMMA);
|
209
|
+
else error("argument `$separator` of `" + std::string(sig) + "` must be `space`, `comma`, or `auto`", pstate, traces);
|
210
|
+
}
|
211
|
+
if (l->is_arglist()) {
|
212
|
+
result->append(SASS_MEMORY_NEW(Argument,
|
213
|
+
v->pstate(),
|
214
|
+
v,
|
215
|
+
"",
|
216
|
+
false,
|
217
|
+
false));
|
218
|
+
|
219
|
+
} else {
|
220
|
+
result->append(v);
|
221
|
+
}
|
222
|
+
return result;
|
223
|
+
}
|
224
|
+
|
225
|
+
Signature zip_sig = "zip($lists...)";
|
226
|
+
BUILT_IN(zip)
|
227
|
+
{
|
228
|
+
List_Obj arglist = SASS_MEMORY_COPY(ARG("$lists", List));
|
229
|
+
size_t shortest = 0;
|
230
|
+
for (size_t i = 0, L = arglist->length(); i < L; ++i) {
|
231
|
+
List_Obj ith = Cast<List>(arglist->value_at_index(i));
|
232
|
+
Map_Obj mith = Cast<Map>(arglist->value_at_index(i));
|
233
|
+
if (!ith) {
|
234
|
+
if (mith) {
|
235
|
+
ith = mith->to_list(pstate);
|
236
|
+
} else {
|
237
|
+
ith = SASS_MEMORY_NEW(List, pstate, 1);
|
238
|
+
ith->append(arglist->value_at_index(i));
|
239
|
+
}
|
240
|
+
if (arglist->is_arglist()) {
|
241
|
+
Argument_Obj arg = (Argument*)(arglist->at(i).ptr()); // XXX
|
242
|
+
arg->value(ith);
|
243
|
+
} else {
|
244
|
+
(*arglist)[i] = ith;
|
245
|
+
}
|
246
|
+
}
|
247
|
+
shortest = (i ? std::min(shortest, ith->length()) : ith->length());
|
248
|
+
}
|
249
|
+
List* zippers = SASS_MEMORY_NEW(List, pstate, shortest, SASS_COMMA);
|
250
|
+
size_t L = arglist->length();
|
251
|
+
for (size_t i = 0; i < shortest; ++i) {
|
252
|
+
List* zipper = SASS_MEMORY_NEW(List, pstate, L);
|
253
|
+
for (size_t j = 0; j < L; ++j) {
|
254
|
+
zipper->append(Cast<List>(arglist->value_at_index(j))->at(i));
|
255
|
+
}
|
256
|
+
zippers->append(zipper);
|
257
|
+
}
|
258
|
+
return zippers;
|
259
|
+
}
|
260
|
+
|
261
|
+
Signature list_separator_sig = "list_separator($list)";
|
262
|
+
BUILT_IN(list_separator)
|
263
|
+
{
|
264
|
+
List_Obj l = Cast<List>(env["$list"]);
|
265
|
+
if (!l) {
|
266
|
+
l = SASS_MEMORY_NEW(List, pstate, 1);
|
267
|
+
l->append(ARG("$list", Expression));
|
268
|
+
}
|
269
|
+
return SASS_MEMORY_NEW(String_Quoted,
|
270
|
+
pstate,
|
271
|
+
l->separator() == SASS_COMMA ? "comma" : "space");
|
272
|
+
}
|
273
|
+
|
274
|
+
Signature is_bracketed_sig = "is-bracketed($list)";
|
275
|
+
BUILT_IN(is_bracketed)
|
276
|
+
{
|
277
|
+
Value_Obj value = ARG("$list", Value);
|
278
|
+
List_Obj list = Cast<List>(value);
|
279
|
+
return SASS_MEMORY_NEW(Boolean, pstate, list && list->is_bracketed());
|
280
|
+
}
|
281
|
+
|
282
|
+
}
|
283
|
+
|
284
|
+
}
|
@@ -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
|
+
Expression_Obj v = ARG("$key", Expression);
|
20
|
+
try {
|
21
|
+
Value_Obj 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
|
+
Expression_Obj 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
|
+
}
|