sassc 2.0.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +9 -3
  5. data/CHANGELOG.md +36 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +43 -7
  9. data/ext/depend +4 -0
  10. data/ext/extconf.rb +92 -0
  11. data/ext/libsass/VERSION +1 -0
  12. data/ext/libsass/include/sass/base.h +9 -1
  13. data/ext/libsass/include/sass/context.h +5 -1
  14. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  15. data/ext/libsass/src/ast.cpp +755 -2028
  16. data/ext/libsass/src/ast.hpp +492 -2477
  17. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  18. data/ext/libsass/src/ast2c.hpp +39 -0
  19. data/ext/libsass/src/ast_def_macros.hpp +70 -10
  20. data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
  21. data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
  22. data/ext/libsass/src/ast_helpers.hpp +292 -0
  23. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  24. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  25. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  26. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1043 -0
  28. data/ext/libsass/src/ast_selectors.hpp +522 -0
  29. data/ext/libsass/src/ast_supports.cpp +114 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +1154 -0
  32. data/ext/libsass/src/ast_values.hpp +498 -0
  33. data/ext/libsass/src/backtrace.cpp +11 -7
  34. data/ext/libsass/src/backtrace.hpp +5 -5
  35. data/ext/libsass/src/base64vlq.cpp +5 -2
  36. data/ext/libsass/src/base64vlq.hpp +1 -1
  37. data/ext/libsass/src/bind.cpp +35 -34
  38. data/ext/libsass/src/bind.hpp +3 -1
  39. data/ext/libsass/src/c2ast.cpp +64 -0
  40. data/ext/libsass/src/c2ast.hpp +14 -0
  41. data/ext/libsass/src/cencode.c +4 -6
  42. data/ext/libsass/src/check_nesting.cpp +83 -88
  43. data/ext/libsass/src/check_nesting.hpp +39 -34
  44. data/ext/libsass/src/color_maps.cpp +168 -164
  45. data/ext/libsass/src/color_maps.hpp +152 -160
  46. data/ext/libsass/src/constants.cpp +20 -0
  47. data/ext/libsass/src/constants.hpp +19 -0
  48. data/ext/libsass/src/context.cpp +104 -121
  49. data/ext/libsass/src/context.hpp +43 -55
  50. data/ext/libsass/src/cssize.cpp +103 -188
  51. data/ext/libsass/src/cssize.hpp +45 -51
  52. data/ext/libsass/src/dart_helpers.hpp +199 -0
  53. data/ext/libsass/src/debugger.hpp +524 -361
  54. data/ext/libsass/src/emitter.cpp +26 -26
  55. data/ext/libsass/src/emitter.hpp +20 -18
  56. data/ext/libsass/src/environment.cpp +41 -27
  57. data/ext/libsass/src/environment.hpp +33 -22
  58. data/ext/libsass/src/error_handling.cpp +92 -94
  59. data/ext/libsass/src/error_handling.hpp +73 -50
  60. data/ext/libsass/src/eval.cpp +380 -515
  61. data/ext/libsass/src/eval.hpp +64 -57
  62. data/ext/libsass/src/eval_selectors.cpp +75 -0
  63. data/ext/libsass/src/expand.cpp +322 -263
  64. data/ext/libsass/src/expand.hpp +55 -39
  65. data/ext/libsass/src/extender.cpp +1188 -0
  66. data/ext/libsass/src/extender.hpp +399 -0
  67. data/ext/libsass/src/extension.cpp +43 -0
  68. data/ext/libsass/src/extension.hpp +89 -0
  69. data/ext/libsass/src/file.cpp +134 -88
  70. data/ext/libsass/src/file.hpp +28 -37
  71. data/ext/libsass/src/fn_colors.cpp +596 -0
  72. data/ext/libsass/src/fn_colors.hpp +85 -0
  73. data/ext/libsass/src/fn_lists.cpp +285 -0
  74. data/ext/libsass/src/fn_lists.hpp +34 -0
  75. data/ext/libsass/src/fn_maps.cpp +94 -0
  76. data/ext/libsass/src/fn_maps.hpp +30 -0
  77. data/ext/libsass/src/fn_miscs.cpp +244 -0
  78. data/ext/libsass/src/fn_miscs.hpp +40 -0
  79. data/ext/libsass/src/fn_numbers.cpp +227 -0
  80. data/ext/libsass/src/fn_numbers.hpp +45 -0
  81. data/ext/libsass/src/fn_selectors.cpp +205 -0
  82. data/ext/libsass/src/fn_selectors.hpp +35 -0
  83. data/ext/libsass/src/fn_strings.cpp +268 -0
  84. data/ext/libsass/src/fn_strings.hpp +34 -0
  85. data/ext/libsass/src/fn_utils.cpp +158 -0
  86. data/ext/libsass/src/fn_utils.hpp +62 -0
  87. data/ext/libsass/src/inspect.cpp +253 -266
  88. data/ext/libsass/src/inspect.hpp +72 -74
  89. data/ext/libsass/src/json.cpp +2 -2
  90. data/ext/libsass/src/lexer.cpp +25 -84
  91. data/ext/libsass/src/lexer.hpp +5 -16
  92. data/ext/libsass/src/listize.cpp +27 -43
  93. data/ext/libsass/src/listize.hpp +14 -11
  94. data/ext/libsass/src/mapping.hpp +1 -0
  95. data/ext/libsass/src/memory.hpp +12 -0
  96. data/ext/libsass/src/memory/allocator.cpp +48 -0
  97. data/ext/libsass/src/memory/allocator.hpp +138 -0
  98. data/ext/libsass/src/memory/config.hpp +20 -0
  99. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  100. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  101. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  102. data/ext/libsass/src/operation.hpp +193 -143
  103. data/ext/libsass/src/operators.cpp +56 -29
  104. data/ext/libsass/src/operators.hpp +11 -11
  105. data/ext/libsass/src/ordered_map.hpp +112 -0
  106. data/ext/libsass/src/output.cpp +59 -75
  107. data/ext/libsass/src/output.hpp +15 -22
  108. data/ext/libsass/src/parser.cpp +662 -818
  109. data/ext/libsass/src/parser.hpp +96 -100
  110. data/ext/libsass/src/parser_selectors.cpp +189 -0
  111. data/ext/libsass/src/permutate.hpp +164 -0
  112. data/ext/libsass/src/plugins.cpp +12 -8
  113. data/ext/libsass/src/plugins.hpp +8 -8
  114. data/ext/libsass/src/position.cpp +10 -26
  115. data/ext/libsass/src/position.hpp +44 -21
  116. data/ext/libsass/src/prelexer.cpp +14 -8
  117. data/ext/libsass/src/prelexer.hpp +9 -9
  118. data/ext/libsass/src/remove_placeholders.cpp +59 -57
  119. data/ext/libsass/src/remove_placeholders.hpp +20 -18
  120. data/ext/libsass/src/sass.cpp +25 -18
  121. data/ext/libsass/src/sass.hpp +22 -14
  122. data/ext/libsass/src/sass2scss.cpp +49 -18
  123. data/ext/libsass/src/sass_context.cpp +104 -132
  124. data/ext/libsass/src/sass_context.hpp +2 -2
  125. data/ext/libsass/src/sass_functions.cpp +7 -4
  126. data/ext/libsass/src/sass_functions.hpp +1 -1
  127. data/ext/libsass/src/sass_values.cpp +26 -21
  128. data/ext/libsass/src/settings.hpp +19 -0
  129. data/ext/libsass/src/source.cpp +69 -0
  130. data/ext/libsass/src/source.hpp +95 -0
  131. data/ext/libsass/src/source_data.hpp +32 -0
  132. data/ext/libsass/src/source_map.cpp +27 -20
  133. data/ext/libsass/src/source_map.hpp +14 -11
  134. data/ext/libsass/src/stylesheet.cpp +22 -0
  135. data/ext/libsass/src/stylesheet.hpp +57 -0
  136. data/ext/libsass/src/to_value.cpp +24 -22
  137. data/ext/libsass/src/to_value.hpp +18 -22
  138. data/ext/libsass/src/units.cpp +28 -22
  139. data/ext/libsass/src/units.hpp +9 -8
  140. data/ext/libsass/src/utf8/checked.h +12 -10
  141. data/ext/libsass/src/utf8/core.h +3 -0
  142. data/ext/libsass/src/utf8_string.cpp +12 -10
  143. data/ext/libsass/src/utf8_string.hpp +7 -6
  144. data/ext/libsass/src/util.cpp +97 -107
  145. data/ext/libsass/src/util.hpp +74 -30
  146. data/ext/libsass/src/util_string.cpp +125 -0
  147. data/ext/libsass/src/util_string.hpp +73 -0
  148. data/ext/libsass/src/values.cpp +33 -24
  149. data/ext/libsass/src/values.hpp +2 -2
  150. data/lib/sassc.rb +24 -0
  151. data/lib/sassc/engine.rb +7 -5
  152. data/lib/sassc/functions_handler.rb +11 -13
  153. data/lib/sassc/native.rb +10 -9
  154. data/lib/sassc/native/native_functions_api.rb +0 -5
  155. data/lib/sassc/script.rb +4 -6
  156. data/lib/sassc/version.rb +1 -1
  157. data/sassc.gemspec +32 -12
  158. data/test/engine_test.rb +32 -2
  159. data/test/functions_test.rb +38 -1
  160. data/test/native_test.rb +4 -4
  161. metadata +95 -109
  162. data/ext/Rakefile +0 -3
  163. data/ext/libsass/.editorconfig +0 -15
  164. data/ext/libsass/.gitattributes +0 -2
  165. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  166. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  167. data/ext/libsass/.gitignore +0 -85
  168. data/ext/libsass/.travis.yml +0 -64
  169. data/ext/libsass/COPYING +0 -25
  170. data/ext/libsass/GNUmakefile.am +0 -88
  171. data/ext/libsass/INSTALL +0 -1
  172. data/ext/libsass/LICENSE +0 -25
  173. data/ext/libsass/Makefile +0 -351
  174. data/ext/libsass/Makefile.conf +0 -55
  175. data/ext/libsass/Readme.md +0 -104
  176. data/ext/libsass/SECURITY.md +0 -10
  177. data/ext/libsass/appveyor.yml +0 -91
  178. data/ext/libsass/configure.ac +0 -138
  179. data/ext/libsass/contrib/libsass.spec +0 -66
  180. data/ext/libsass/docs/README.md +0 -20
  181. data/ext/libsass/docs/api-context-example.md +0 -45
  182. data/ext/libsass/docs/api-context-internal.md +0 -163
  183. data/ext/libsass/docs/api-context.md +0 -295
  184. data/ext/libsass/docs/api-doc.md +0 -215
  185. data/ext/libsass/docs/api-function-example.md +0 -67
  186. data/ext/libsass/docs/api-function-internal.md +0 -8
  187. data/ext/libsass/docs/api-function.md +0 -74
  188. data/ext/libsass/docs/api-importer-example.md +0 -112
  189. data/ext/libsass/docs/api-importer-internal.md +0 -20
  190. data/ext/libsass/docs/api-importer.md +0 -86
  191. data/ext/libsass/docs/api-value-example.md +0 -55
  192. data/ext/libsass/docs/api-value-internal.md +0 -76
  193. data/ext/libsass/docs/api-value.md +0 -154
  194. data/ext/libsass/docs/build-on-darwin.md +0 -27
  195. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  196. data/ext/libsass/docs/build-on-windows.md +0 -139
  197. data/ext/libsass/docs/build-shared-library.md +0 -35
  198. data/ext/libsass/docs/build-with-autotools.md +0 -78
  199. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  200. data/ext/libsass/docs/build-with-mingw.md +0 -107
  201. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  202. data/ext/libsass/docs/build.md +0 -97
  203. data/ext/libsass/docs/compatibility-plan.md +0 -48
  204. data/ext/libsass/docs/contributing.md +0 -17
  205. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  206. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  207. data/ext/libsass/docs/implementations.md +0 -56
  208. data/ext/libsass/docs/plugins.md +0 -47
  209. data/ext/libsass/docs/setup-environment.md +0 -68
  210. data/ext/libsass/docs/source-map-internals.md +0 -51
  211. data/ext/libsass/docs/trace.md +0 -26
  212. data/ext/libsass/docs/triage.md +0 -17
  213. data/ext/libsass/docs/unicode.md +0 -39
  214. data/ext/libsass/extconf.rb +0 -6
  215. data/ext/libsass/include/sass/version.h.in +0 -12
  216. data/ext/libsass/m4/.gitkeep +0 -0
  217. data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
  218. data/ext/libsass/res/resource.rc +0 -35
  219. data/ext/libsass/script/bootstrap +0 -13
  220. data/ext/libsass/script/branding +0 -10
  221. data/ext/libsass/script/ci-build-libsass +0 -134
  222. data/ext/libsass/script/ci-build-plugin +0 -62
  223. data/ext/libsass/script/ci-install-compiler +0 -6
  224. data/ext/libsass/script/ci-install-deps +0 -20
  225. data/ext/libsass/script/ci-report-coverage +0 -42
  226. data/ext/libsass/script/spec +0 -5
  227. data/ext/libsass/script/tap-driver +0 -652
  228. data/ext/libsass/script/tap-runner +0 -1
  229. data/ext/libsass/script/test-leaks.pl +0 -103
  230. data/ext/libsass/src/GNUmakefile.am +0 -54
  231. data/ext/libsass/src/extend.cpp +0 -2130
  232. data/ext/libsass/src/extend.hpp +0 -86
  233. data/ext/libsass/src/functions.cpp +0 -2234
  234. data/ext/libsass/src/functions.hpp +0 -198
  235. data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
  236. data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
  237. data/ext/libsass/src/node.cpp +0 -319
  238. data/ext/libsass/src/node.hpp +0 -118
  239. data/ext/libsass/src/paths.hpp +0 -71
  240. data/ext/libsass/src/sass_util.cpp +0 -149
  241. data/ext/libsass/src/sass_util.hpp +0 -256
  242. data/ext/libsass/src/subset_map.cpp +0 -55
  243. data/ext/libsass/src/subset_map.hpp +0 -76
  244. data/ext/libsass/src/support/libsass.pc.in +0 -11
  245. data/ext/libsass/src/to_c.hpp +0 -39
  246. data/ext/libsass/test/test_node.cpp +0 -94
  247. data/ext/libsass/test/test_paths.cpp +0 -28
  248. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  249. data/ext/libsass/test/test_specificity.cpp +0 -25
  250. data/ext/libsass/test/test_subset_map.cpp +0 -472
  251. data/ext/libsass/test/test_superselector.cpp +0 -69
  252. data/ext/libsass/test/test_unification.cpp +0 -31
  253. data/ext/libsass/version.sh +0 -10
  254. data/ext/libsass/win/libsass.sln +0 -39
  255. data/ext/libsass/win/libsass.sln.DotSettings +0 -9
  256. data/ext/libsass/win/libsass.targets +0 -118
  257. data/ext/libsass/win/libsass.vcxproj +0 -188
  258. data/ext/libsass/win/libsass.vcxproj.filters +0 -357
  259. data/lib/sassc/native/lib_c.rb +0 -21
  260. 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,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
+ }