sassc 2.0.1 → 2.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +7 -3
  5. data/CHANGELOG.md +3 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +23 -8
  9. data/ext/extconf.rb +39 -0
  10. data/ext/libsass/.gitignore +1 -0
  11. data/ext/libsass/GNUmakefile.am +23 -39
  12. data/ext/libsass/Makefile +56 -91
  13. data/ext/libsass/Makefile.conf +16 -2
  14. data/ext/libsass/configure.ac +8 -12
  15. data/ext/libsass/include/sass/base.h +1 -0
  16. data/ext/libsass/include/sass/context.h +1 -1
  17. data/ext/libsass/src/GNUmakefile.am +1 -5
  18. data/ext/libsass/src/ast.cpp +747 -2010
  19. data/ext/libsass/src/ast.hpp +239 -2383
  20. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  21. data/ext/libsass/src/ast2c.hpp +39 -0
  22. data/ext/libsass/src/ast_def_macros.hpp +62 -10
  23. data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
  24. data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
  25. data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
  26. data/ext/libsass/src/ast_sel_unify.cpp +280 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1475 -0
  28. data/ext/libsass/src/ast_selectors.hpp +568 -0
  29. data/ext/libsass/src/ast_supports.cpp +130 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +967 -0
  32. data/ext/libsass/src/ast_values.hpp +489 -0
  33. data/ext/libsass/src/backtrace.cpp +4 -0
  34. data/ext/libsass/src/base64vlq.cpp +3 -0
  35. data/ext/libsass/src/bind.cpp +18 -17
  36. data/ext/libsass/src/bind.hpp +3 -1
  37. data/ext/libsass/src/c2ast.cpp +64 -0
  38. data/ext/libsass/src/c2ast.hpp +14 -0
  39. data/ext/libsass/src/cencode.c +2 -2
  40. data/ext/libsass/src/check_nesting.cpp +52 -56
  41. data/ext/libsass/src/check_nesting.hpp +35 -34
  42. data/ext/libsass/src/color_maps.cpp +156 -153
  43. data/ext/libsass/src/color_maps.hpp +152 -152
  44. data/ext/libsass/src/constants.cpp +15 -0
  45. data/ext/libsass/src/constants.hpp +13 -0
  46. data/ext/libsass/src/context.cpp +24 -14
  47. data/ext/libsass/src/context.hpp +6 -6
  48. data/ext/libsass/src/cssize.cpp +69 -71
  49. data/ext/libsass/src/cssize.hpp +50 -50
  50. data/ext/libsass/src/debugger.hpp +117 -110
  51. data/ext/libsass/src/emitter.cpp +13 -12
  52. data/ext/libsass/src/emitter.hpp +13 -9
  53. data/ext/libsass/src/environment.cpp +15 -1
  54. data/ext/libsass/src/environment.hpp +6 -0
  55. data/ext/libsass/src/error_handling.cpp +36 -59
  56. data/ext/libsass/src/error_handling.hpp +29 -16
  57. data/ext/libsass/src/eval.cpp +302 -323
  58. data/ext/libsass/src/eval.hpp +64 -55
  59. data/ext/libsass/src/expand.cpp +94 -88
  60. data/ext/libsass/src/expand.hpp +33 -37
  61. data/ext/libsass/src/extend.cpp +38 -36
  62. data/ext/libsass/src/extend.hpp +15 -15
  63. data/ext/libsass/src/file.cpp +34 -2
  64. data/ext/libsass/src/fn_colors.cpp +594 -0
  65. data/ext/libsass/src/fn_colors.hpp +85 -0
  66. data/ext/libsass/src/fn_lists.cpp +284 -0
  67. data/ext/libsass/src/fn_lists.hpp +34 -0
  68. data/ext/libsass/src/fn_maps.cpp +94 -0
  69. data/ext/libsass/src/fn_maps.hpp +30 -0
  70. data/ext/libsass/src/fn_miscs.cpp +256 -0
  71. data/ext/libsass/src/fn_miscs.hpp +40 -0
  72. data/ext/libsass/src/fn_numbers.cpp +220 -0
  73. data/ext/libsass/src/fn_numbers.hpp +45 -0
  74. data/ext/libsass/src/fn_selectors.cpp +235 -0
  75. data/ext/libsass/src/fn_selectors.hpp +35 -0
  76. data/ext/libsass/src/fn_strings.cpp +254 -0
  77. data/ext/libsass/src/fn_strings.hpp +34 -0
  78. data/ext/libsass/src/fn_utils.cpp +156 -0
  79. data/ext/libsass/src/fn_utils.hpp +56 -0
  80. data/ext/libsass/src/inspect.cpp +101 -152
  81. data/ext/libsass/src/inspect.hpp +69 -73
  82. data/ext/libsass/src/json.cpp +2 -2
  83. data/ext/libsass/src/lexer.cpp +6 -3
  84. data/ext/libsass/src/listize.cpp +9 -11
  85. data/ext/libsass/src/listize.hpp +11 -7
  86. data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
  87. data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
  88. data/ext/libsass/src/node.cpp +13 -10
  89. data/ext/libsass/src/node.hpp +3 -3
  90. data/ext/libsass/src/operation.hpp +184 -144
  91. data/ext/libsass/src/operators.cpp +43 -17
  92. data/ext/libsass/src/operators.hpp +5 -5
  93. data/ext/libsass/src/output.cpp +21 -18
  94. data/ext/libsass/src/output.hpp +14 -21
  95. data/ext/libsass/src/parser.cpp +215 -183
  96. data/ext/libsass/src/parser.hpp +28 -24
  97. data/ext/libsass/src/plugins.cpp +5 -1
  98. data/ext/libsass/src/position.cpp +3 -0
  99. data/ext/libsass/src/prelexer.cpp +9 -3
  100. data/ext/libsass/src/prelexer.hpp +9 -9
  101. data/ext/libsass/src/remove_placeholders.cpp +14 -11
  102. data/ext/libsass/src/remove_placeholders.hpp +8 -9
  103. data/ext/libsass/src/sass.cpp +9 -3
  104. data/ext/libsass/src/sass.hpp +12 -9
  105. data/ext/libsass/src/sass2scss.cpp +45 -14
  106. data/ext/libsass/src/sass_context.cpp +18 -15
  107. data/ext/libsass/src/sass_functions.cpp +6 -3
  108. data/ext/libsass/src/sass_functions.hpp +1 -1
  109. data/ext/libsass/src/sass_util.cpp +3 -0
  110. data/ext/libsass/src/sass_values.cpp +21 -13
  111. data/ext/libsass/src/source_map.cpp +5 -2
  112. data/ext/libsass/src/source_map.hpp +2 -2
  113. data/ext/libsass/src/subset_map.cpp +4 -1
  114. data/ext/libsass/src/to_value.cpp +23 -21
  115. data/ext/libsass/src/to_value.hpp +18 -22
  116. data/ext/libsass/src/units.cpp +4 -0
  117. data/ext/libsass/src/units.hpp +1 -0
  118. data/ext/libsass/src/utf8/checked.h +12 -10
  119. data/ext/libsass/src/utf8/core.h +3 -0
  120. data/ext/libsass/src/utf8_string.cpp +3 -0
  121. data/ext/libsass/src/util.cpp +67 -75
  122. data/ext/libsass/src/util.hpp +64 -19
  123. data/ext/libsass/src/util_string.cpp +75 -0
  124. data/ext/libsass/src/util_string.hpp +19 -0
  125. data/ext/libsass/src/values.cpp +22 -13
  126. data/ext/libsass/src/values.hpp +2 -2
  127. data/ext/libsass/win/libsass.targets +30 -4
  128. data/ext/libsass/win/libsass.vcxproj.filters +82 -4
  129. data/lib/sassc.rb +24 -0
  130. data/lib/sassc/engine.rb +2 -2
  131. data/lib/sassc/native.rb +8 -1
  132. data/lib/sassc/version.rb +1 -1
  133. data/sassc.gemspec +19 -11
  134. data/test/engine_test.rb +26 -1
  135. data/test/native_test.rb +1 -1
  136. metadata +66 -72
  137. data/ext/Rakefile +0 -3
  138. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  139. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  140. data/ext/libsass/.travis.yml +0 -64
  141. data/ext/libsass/Readme.md +0 -104
  142. data/ext/libsass/SECURITY.md +0 -10
  143. data/ext/libsass/appveyor.yml +0 -91
  144. data/ext/libsass/docs/README.md +0 -20
  145. data/ext/libsass/docs/api-context-example.md +0 -45
  146. data/ext/libsass/docs/api-context-internal.md +0 -163
  147. data/ext/libsass/docs/api-context.md +0 -295
  148. data/ext/libsass/docs/api-doc.md +0 -215
  149. data/ext/libsass/docs/api-function-example.md +0 -67
  150. data/ext/libsass/docs/api-function-internal.md +0 -8
  151. data/ext/libsass/docs/api-function.md +0 -74
  152. data/ext/libsass/docs/api-importer-example.md +0 -112
  153. data/ext/libsass/docs/api-importer-internal.md +0 -20
  154. data/ext/libsass/docs/api-importer.md +0 -86
  155. data/ext/libsass/docs/api-value-example.md +0 -55
  156. data/ext/libsass/docs/api-value-internal.md +0 -76
  157. data/ext/libsass/docs/api-value.md +0 -154
  158. data/ext/libsass/docs/build-on-darwin.md +0 -27
  159. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  160. data/ext/libsass/docs/build-on-windows.md +0 -139
  161. data/ext/libsass/docs/build-shared-library.md +0 -35
  162. data/ext/libsass/docs/build-with-autotools.md +0 -78
  163. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  164. data/ext/libsass/docs/build-with-mingw.md +0 -107
  165. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  166. data/ext/libsass/docs/build.md +0 -97
  167. data/ext/libsass/docs/compatibility-plan.md +0 -48
  168. data/ext/libsass/docs/contributing.md +0 -17
  169. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  170. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  171. data/ext/libsass/docs/implementations.md +0 -56
  172. data/ext/libsass/docs/plugins.md +0 -47
  173. data/ext/libsass/docs/setup-environment.md +0 -68
  174. data/ext/libsass/docs/source-map-internals.md +0 -51
  175. data/ext/libsass/docs/trace.md +0 -26
  176. data/ext/libsass/docs/triage.md +0 -17
  177. data/ext/libsass/docs/unicode.md +0 -39
  178. data/ext/libsass/extconf.rb +0 -6
  179. data/ext/libsass/script/bootstrap +0 -13
  180. data/ext/libsass/script/branding +0 -10
  181. data/ext/libsass/script/ci-build-libsass +0 -134
  182. data/ext/libsass/script/ci-build-plugin +0 -62
  183. data/ext/libsass/script/ci-install-compiler +0 -6
  184. data/ext/libsass/script/ci-install-deps +0 -20
  185. data/ext/libsass/script/ci-report-coverage +0 -42
  186. data/ext/libsass/script/spec +0 -5
  187. data/ext/libsass/script/tap-driver +0 -652
  188. data/ext/libsass/script/tap-runner +0 -1
  189. data/ext/libsass/script/test-leaks.pl +0 -103
  190. data/ext/libsass/src/functions.cpp +0 -2234
  191. data/ext/libsass/src/functions.hpp +0 -198
  192. data/ext/libsass/src/to_c.hpp +0 -39
  193. data/ext/libsass/test/test_node.cpp +0 -94
  194. data/ext/libsass/test/test_paths.cpp +0 -28
  195. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  196. data/ext/libsass/test/test_specificity.cpp +0 -25
  197. data/ext/libsass/test/test_subset_map.cpp +0 -472
  198. data/ext/libsass/test/test_superselector.cpp +0 -69
  199. data/ext/libsass/test/test_unification.cpp +0 -31
  200. 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
+ }