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,45 @@
1
+ #ifndef SASS_FN_NUMBERS_H
2
+ #define SASS_FN_NUMBERS_H
3
+
4
+ #include "fn_utils.hpp"
5
+
6
+ namespace Sass {
7
+
8
+ namespace Functions {
9
+
10
+ // return a number object (copied since we want to have reduced units)
11
+ #define ARGN(argname) get_arg_n(argname, env, sig, pstate, traces) // Number copy
12
+
13
+ extern Signature percentage_sig;
14
+ extern Signature round_sig;
15
+ extern Signature ceil_sig;
16
+ extern Signature floor_sig;
17
+ extern Signature abs_sig;
18
+ extern Signature min_sig;
19
+ extern Signature max_sig;
20
+ extern Signature inspect_sig;
21
+ extern Signature random_sig;
22
+ extern Signature unique_id_sig;
23
+ extern Signature unit_sig;
24
+ extern Signature unitless_sig;
25
+ extern Signature comparable_sig;
26
+
27
+ BUILT_IN(percentage);
28
+ BUILT_IN(round);
29
+ BUILT_IN(ceil);
30
+ BUILT_IN(floor);
31
+ BUILT_IN(abs);
32
+ BUILT_IN(min);
33
+ BUILT_IN(max);
34
+ BUILT_IN(inspect);
35
+ BUILT_IN(random);
36
+ BUILT_IN(unique_id);
37
+ BUILT_IN(unit);
38
+ BUILT_IN(unitless);
39
+ BUILT_IN(comparable);
40
+
41
+ }
42
+
43
+ }
44
+
45
+ #endif
@@ -0,0 +1,205 @@
1
+ #include <numeric>
2
+
3
+ #include "parser.hpp"
4
+ #include "extender.hpp"
5
+ #include "listize.hpp"
6
+ #include "fn_utils.hpp"
7
+ #include "fn_selectors.hpp"
8
+
9
+ namespace Sass {
10
+
11
+ namespace Functions {
12
+
13
+ Signature selector_nest_sig = "selector-nest($selectors...)";
14
+ BUILT_IN(selector_nest)
15
+ {
16
+ List* arglist = ARG("$selectors", List);
17
+
18
+ // Not enough parameters
19
+ if (arglist->length() == 0) {
20
+ error(
21
+ "$selectors: At least one selector must be passed for `selector-nest'",
22
+ pstate, traces);
23
+ }
24
+
25
+ // Parse args into vector of selectors
26
+ SelectorStack parsedSelectors;
27
+ for (size_t i = 0, L = arglist->length(); i < L; ++i) {
28
+ ExpressionObj exp = Cast<Expression>(arglist->value_at_index(i));
29
+ if (exp->concrete_type() == Expression::NULL_VAL) {
30
+ error(
31
+ "$selectors: null is not a valid selector: it must be a string,\n"
32
+ "a list of strings, or a list of lists of strings for 'selector-nest'",
33
+ pstate, traces);
34
+ }
35
+ if (String_Constant_Obj str = Cast<String_Constant>(exp)) {
36
+ str->quote_mark(0);
37
+ }
38
+ sass::string exp_src = exp->to_string(ctx.c_options);
39
+ ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
40
+ SelectorListObj sel = Parser::parse_selector(source, ctx, traces);
41
+ parsedSelectors.push_back(sel);
42
+ }
43
+
44
+ // Nothing to do
45
+ if( parsedSelectors.empty() ) {
46
+ return SASS_MEMORY_NEW(Null, pstate);
47
+ }
48
+
49
+ // Set the first element as the `result`, keep
50
+ // appending to as we go down the parsedSelector vector.
51
+ SelectorStack::iterator itr = parsedSelectors.begin();
52
+ SelectorListObj& result = *itr;
53
+ ++itr;
54
+
55
+ for(;itr != parsedSelectors.end(); ++itr) {
56
+ SelectorListObj& child = *itr;
57
+ original_stack.push_back(result);
58
+ SelectorListObj rv = child->resolve_parent_refs(original_stack, traces);
59
+ result->elements(rv->elements());
60
+ original_stack.pop_back();
61
+ }
62
+
63
+ return Cast<Value>(Listize::perform(result));
64
+ }
65
+
66
+ Signature selector_append_sig = "selector-append($selectors...)";
67
+ BUILT_IN(selector_append)
68
+ {
69
+ List* arglist = ARG("$selectors", List);
70
+
71
+ // Not enough parameters
72
+ if (arglist->empty()) {
73
+ error(
74
+ "$selectors: At least one selector must be "
75
+ "passed for `selector-append'",
76
+ pstate, traces);
77
+ }
78
+
79
+ // Parse args into vector of selectors
80
+ SelectorStack parsedSelectors;
81
+ parsedSelectors.push_back({});
82
+ for (size_t i = 0, L = arglist->length(); i < L; ++i) {
83
+ Expression* exp = Cast<Expression>(arglist->value_at_index(i));
84
+ if (exp->concrete_type() == Expression::NULL_VAL) {
85
+ error(
86
+ "$selectors: null is not a valid selector: it must be a string,\n"
87
+ "a list of strings, or a list of lists of strings for 'selector-append'",
88
+ pstate, traces);
89
+ }
90
+ if (String_Constant* str = Cast<String_Constant>(exp)) {
91
+ str->quote_mark(0);
92
+ }
93
+ sass::string exp_src = exp->to_string();
94
+ ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
95
+ SelectorListObj sel = Parser::parse_selector(source, ctx, traces, true);
96
+
97
+ for (auto& complex : sel->elements()) {
98
+ if (complex->empty()) {
99
+ complex->append(SASS_MEMORY_NEW(CompoundSelector, "[phony]"));
100
+ }
101
+ if (CompoundSelector* comp = Cast<CompoundSelector>(complex->first())) {
102
+ comp->hasRealParent(true);
103
+ complex->chroots(true);
104
+ }
105
+ }
106
+
107
+ if (parsedSelectors.size() > 1) {
108
+
109
+ if (!sel->has_real_parent_ref()) {
110
+ auto parent = parsedSelectors.back();
111
+ for (auto& complex : parent->elements()) {
112
+ if (CompoundSelector* comp = Cast<CompoundSelector>(complex->first())) {
113
+ comp->hasRealParent(false);
114
+ }
115
+ }
116
+ error("Can't append \"" + sel->to_string() + "\" to \"" +
117
+ parent->to_string() + "\" for `selector-append'",
118
+ pstate, traces);
119
+ }
120
+
121
+ // Build the resolved stack from the left. It's cheaper to directly
122
+ // calculate and update each resolved selcted from the left, than to
123
+ // recursively calculate them from the right side, as we would need
124
+ // to go through the whole stack depth to build the final results.
125
+ // E.g. 'a', 'b', 'x, y' => 'a' => 'a b' => 'a b x, a b y'
126
+ // vs 'a', 'b', 'x, y' => 'x' => 'b x' => 'a b x', 'y' ...
127
+ parsedSelectors.push_back(sel->resolve_parent_refs(parsedSelectors, traces, true));
128
+ }
129
+ else {
130
+ parsedSelectors.push_back(sel);
131
+ }
132
+ }
133
+
134
+ // Nothing to do
135
+ if( parsedSelectors.empty() ) {
136
+ return SASS_MEMORY_NEW(Null, pstate);
137
+ }
138
+
139
+ return Cast<Value>(Listize::perform(parsedSelectors.back()));
140
+ }
141
+
142
+ Signature selector_unify_sig = "selector-unify($selector1, $selector2)";
143
+ BUILT_IN(selector_unify)
144
+ {
145
+ SelectorListObj selector1 = ARGSELS("$selector1");
146
+ SelectorListObj selector2 = ARGSELS("$selector2");
147
+ SelectorListObj result = selector1->unifyWith(selector2);
148
+ return Cast<Value>(Listize::perform(result));
149
+ }
150
+
151
+ Signature simple_selectors_sig = "simple-selectors($selector)";
152
+ BUILT_IN(simple_selectors)
153
+ {
154
+ CompoundSelectorObj sel = ARGSEL("$selector");
155
+
156
+ List* l = SASS_MEMORY_NEW(List, sel->pstate(), sel->length(), SASS_COMMA);
157
+
158
+ for (size_t i = 0, L = sel->length(); i < L; ++i) {
159
+ const SimpleSelectorObj& ss = sel->get(i);
160
+ sass::string ss_string = ss->to_string() ;
161
+ l->append(SASS_MEMORY_NEW(String_Quoted, ss->pstate(), ss_string));
162
+ }
163
+
164
+ return l;
165
+ }
166
+
167
+ Signature selector_extend_sig = "selector-extend($selector, $extendee, $extender)";
168
+ BUILT_IN(selector_extend)
169
+ {
170
+ SelectorListObj selector = ARGSELS("$selector");
171
+ SelectorListObj target = ARGSELS("$extendee");
172
+ SelectorListObj source = ARGSELS("$extender");
173
+ SelectorListObj result = Extender::extend(selector, source, target, traces);
174
+ return Cast<Value>(Listize::perform(result));
175
+ }
176
+
177
+ Signature selector_replace_sig = "selector-replace($selector, $original, $replacement)";
178
+ BUILT_IN(selector_replace)
179
+ {
180
+ SelectorListObj selector = ARGSELS("$selector");
181
+ SelectorListObj target = ARGSELS("$original");
182
+ SelectorListObj source = ARGSELS("$replacement");
183
+ SelectorListObj result = Extender::replace(selector, source, target, traces);
184
+ return Cast<Value>(Listize::perform(result));
185
+ }
186
+
187
+ Signature selector_parse_sig = "selector-parse($selector)";
188
+ BUILT_IN(selector_parse)
189
+ {
190
+ SelectorListObj selector = ARGSELS("$selector");
191
+ return Cast<Value>(Listize::perform(selector));
192
+ }
193
+
194
+ Signature is_superselector_sig = "is-superselector($super, $sub)";
195
+ BUILT_IN(is_superselector)
196
+ {
197
+ SelectorListObj sel_sup = ARGSELS("$super");
198
+ SelectorListObj sel_sub = ARGSELS("$sub");
199
+ bool result = sel_sup->isSuperselectorOf(sel_sub);
200
+ return SASS_MEMORY_NEW(Boolean, pstate, result);
201
+ }
202
+
203
+ }
204
+
205
+ }
@@ -0,0 +1,35 @@
1
+ #ifndef SASS_FN_SELECTORS_H
2
+ #define SASS_FN_SELECTORS_H
3
+
4
+ #include "fn_utils.hpp"
5
+
6
+ namespace Sass {
7
+
8
+ namespace Functions {
9
+
10
+ #define ARGSEL(argname) get_arg_sel(argname, env, sig, pstate, traces, ctx)
11
+ #define ARGSELS(argname) get_arg_sels(argname, env, sig, pstate, traces, ctx)
12
+
13
+ BUILT_IN(selector_nest);
14
+ BUILT_IN(selector_append);
15
+ BUILT_IN(selector_extend);
16
+ BUILT_IN(selector_replace);
17
+ BUILT_IN(selector_unify);
18
+ BUILT_IN(is_superselector);
19
+ BUILT_IN(simple_selectors);
20
+ BUILT_IN(selector_parse);
21
+
22
+ extern Signature selector_nest_sig;
23
+ extern Signature selector_append_sig;
24
+ extern Signature selector_extend_sig;
25
+ extern Signature selector_replace_sig;
26
+ extern Signature selector_unify_sig;
27
+ extern Signature is_superselector_sig;
28
+ extern Signature simple_selectors_sig;
29
+ extern Signature selector_parse_sig;
30
+
31
+ }
32
+
33
+ }
34
+
35
+ #endif
@@ -0,0 +1,268 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
3
+ #include "sass.hpp"
4
+
5
+ #include "utf8.h"
6
+ #include "ast.hpp"
7
+ #include "fn_utils.hpp"
8
+ #include "fn_strings.hpp"
9
+ #include "util_string.hpp"
10
+
11
+ namespace Sass {
12
+
13
+ namespace Functions {
14
+
15
+ void handle_utf8_error (const SourceSpan& pstate, Backtraces traces)
16
+ {
17
+ try {
18
+ throw;
19
+ }
20
+ catch (utf8::invalid_code_point&) {
21
+ sass::string msg("utf8::invalid_code_point");
22
+ error(msg, pstate, traces);
23
+ }
24
+ catch (utf8::not_enough_room&) {
25
+ sass::string msg("utf8::not_enough_room");
26
+ error(msg, pstate, traces);
27
+ }
28
+ catch (utf8::invalid_utf8&) {
29
+ sass::string msg("utf8::invalid_utf8");
30
+ error(msg, pstate, traces);
31
+ }
32
+ catch (...) { throw; }
33
+ }
34
+
35
+ ///////////////////
36
+ // STRING FUNCTIONS
37
+ ///////////////////
38
+
39
+ Signature unquote_sig = "unquote($string)";
40
+ BUILT_IN(sass_unquote)
41
+ {
42
+ AST_Node_Obj arg = env["$string"];
43
+ if (String_Quoted* string_quoted = Cast<String_Quoted>(arg)) {
44
+ String_Constant* result = SASS_MEMORY_NEW(String_Constant, pstate, string_quoted->value());
45
+ // remember if the string was quoted (color tokens)
46
+ result->is_delayed(true); // delay colors
47
+ return result;
48
+ }
49
+ else if (String_Constant* str = Cast<String_Constant>(arg)) {
50
+ return str;
51
+ }
52
+ else if (Value* ex = Cast<Value>(arg)) {
53
+ Sass_Output_Style oldstyle = ctx.c_options.output_style;
54
+ ctx.c_options.output_style = SASS_STYLE_NESTED;
55
+ sass::string val(arg->to_string(ctx.c_options));
56
+ val = Cast<Null>(arg) ? "null" : val;
57
+ ctx.c_options.output_style = oldstyle;
58
+
59
+ deprecated_function("Passing " + val + ", a non-string value, to unquote()", pstate);
60
+ return ex;
61
+ }
62
+ throw std::runtime_error("Invalid Data Type for unquote");
63
+ }
64
+
65
+ Signature quote_sig = "quote($string)";
66
+ BUILT_IN(sass_quote)
67
+ {
68
+ const String_Constant* s = ARG("$string", String_Constant);
69
+ String_Quoted *result = SASS_MEMORY_NEW(
70
+ String_Quoted, pstate, s->value(),
71
+ /*q=*/'\0', /*keep_utf8_escapes=*/false, /*skip_unquoting=*/true);
72
+ result->quote_mark('*');
73
+ return result;
74
+ }
75
+
76
+ Signature str_length_sig = "str-length($string)";
77
+ BUILT_IN(str_length)
78
+ {
79
+ size_t len = sass::string::npos;
80
+ try {
81
+ String_Constant* s = ARG("$string", String_Constant);
82
+ len = UTF_8::code_point_count(s->value(), 0, s->value().size());
83
+
84
+ }
85
+ // handle any invalid utf8 errors
86
+ // other errors will be re-thrown
87
+ catch (...) { handle_utf8_error(pstate, traces); }
88
+ // return something even if we had an error (-1)
89
+ return SASS_MEMORY_NEW(Number, pstate, (double)len);
90
+ }
91
+
92
+ Signature str_insert_sig = "str-insert($string, $insert, $index)";
93
+ BUILT_IN(str_insert)
94
+ {
95
+ sass::string str;
96
+ try {
97
+ String_Constant* s = ARG("$string", String_Constant);
98
+ str = s->value();
99
+ String_Constant* i = ARG("$insert", String_Constant);
100
+ sass::string ins = i->value();
101
+ double index = ARGVAL("$index");
102
+ if (index != (int)index) {
103
+ sass::ostream strm;
104
+ strm << "$index: ";
105
+ strm << std::to_string(index);
106
+ strm << " is not an int";
107
+ error(strm.str(), pstate, traces);
108
+ }
109
+ size_t len = UTF_8::code_point_count(str, 0, str.size());
110
+
111
+ if (index > 0 && index <= len) {
112
+ // positive and within string length
113
+ str.insert(UTF_8::offset_at_position(str, static_cast<size_t>(index) - 1), ins);
114
+ }
115
+ else if (index > len) {
116
+ // positive and past string length
117
+ str += ins;
118
+ }
119
+ else if (index == 0) {
120
+ str = ins + str;
121
+ }
122
+ else if (std::abs(index) <= len) {
123
+ // negative and within string length
124
+ index += len + 1;
125
+ str.insert(UTF_8::offset_at_position(str, static_cast<size_t>(index)), ins);
126
+ }
127
+ else {
128
+ // negative and past string length
129
+ str = ins + str;
130
+ }
131
+
132
+ if (String_Quoted* ss = Cast<String_Quoted>(s)) {
133
+ if (ss->quote_mark()) str = quote(str);
134
+ }
135
+ }
136
+ // handle any invalid utf8 errors
137
+ // other errors will be re-thrown
138
+ catch (...) { handle_utf8_error(pstate, traces); }
139
+ return SASS_MEMORY_NEW(String_Quoted, pstate, str);
140
+ }
141
+
142
+ Signature str_index_sig = "str-index($string, $substring)";
143
+ BUILT_IN(str_index)
144
+ {
145
+ size_t index = sass::string::npos;
146
+ try {
147
+ String_Constant* s = ARG("$string", String_Constant);
148
+ String_Constant* t = ARG("$substring", String_Constant);
149
+ sass::string str = s->value();
150
+ sass::string substr = t->value();
151
+
152
+ size_t c_index = str.find(substr);
153
+ if(c_index == sass::string::npos) {
154
+ return SASS_MEMORY_NEW(Null, pstate);
155
+ }
156
+ index = UTF_8::code_point_count(str, 0, c_index) + 1;
157
+ }
158
+ // handle any invalid utf8 errors
159
+ // other errors will be re-thrown
160
+ catch (...) { handle_utf8_error(pstate, traces); }
161
+ // return something even if we had an error (-1)
162
+ return SASS_MEMORY_NEW(Number, pstate, (double)index);
163
+ }
164
+
165
+ Signature str_slice_sig = "str-slice($string, $start-at, $end-at:-1)";
166
+ BUILT_IN(str_slice)
167
+ {
168
+ sass::string newstr;
169
+ try {
170
+ String_Constant* s = ARG("$string", String_Constant);
171
+ double start_at = ARGVAL("$start-at");
172
+ double end_at = ARGVAL("$end-at");
173
+
174
+ if (start_at != (int)start_at) {
175
+ sass::ostream strm;
176
+ strm << "$start-at: ";
177
+ strm << std::to_string(start_at);
178
+ strm << " is not an int";
179
+ error(strm.str(), pstate, traces);
180
+ }
181
+
182
+ String_Quoted* ss = Cast<String_Quoted>(s);
183
+
184
+ sass::string str(s->value());
185
+
186
+ size_t size = utf8::distance(str.begin(), str.end());
187
+
188
+ if (!Cast<Number>(env["$end-at"])) {
189
+ end_at = -1;
190
+ }
191
+
192
+ if (end_at != (int)end_at) {
193
+ sass::ostream strm;
194
+ strm << "$end-at: ";
195
+ strm << std::to_string(end_at);
196
+ strm << " is not an int";
197
+ error(strm.str(), pstate, traces);
198
+ }
199
+
200
+ if (end_at == 0 || (end_at + size) < 0) {
201
+ if (ss && ss->quote_mark()) newstr = quote("");
202
+ return SASS_MEMORY_NEW(String_Quoted, pstate, newstr);
203
+ }
204
+
205
+ if (end_at < 0) {
206
+ end_at += size + 1;
207
+ if (end_at == 0) end_at = 1;
208
+ }
209
+ if (end_at > size) { end_at = (double)size; }
210
+ if (start_at < 0) {
211
+ start_at += size + 1;
212
+ if (start_at <= 0) start_at = 1;
213
+ }
214
+ else if (start_at == 0) { ++ start_at; }
215
+
216
+ if (start_at <= end_at)
217
+ {
218
+ sass::string::iterator start = str.begin();
219
+ utf8::advance(start, start_at - 1, str.end());
220
+ sass::string::iterator end = start;
221
+ utf8::advance(end, end_at - start_at + 1, str.end());
222
+ newstr = sass::string(start, end);
223
+ }
224
+ if (ss) {
225
+ if(ss->quote_mark()) newstr = quote(newstr);
226
+ }
227
+ }
228
+ // handle any invalid utf8 errors
229
+ // other errors will be re-thrown
230
+ catch (...) { handle_utf8_error(pstate, traces); }
231
+ return SASS_MEMORY_NEW(String_Quoted, pstate, newstr);
232
+ }
233
+
234
+ Signature to_upper_case_sig = "to-upper-case($string)";
235
+ BUILT_IN(to_upper_case)
236
+ {
237
+ String_Constant* s = ARG("$string", String_Constant);
238
+ sass::string str = s->value();
239
+ Util::ascii_str_toupper(&str);
240
+
241
+ if (String_Quoted* ss = Cast<String_Quoted>(s)) {
242
+ String_Quoted* cpy = SASS_MEMORY_COPY(ss);
243
+ cpy->value(str);
244
+ return cpy;
245
+ } else {
246
+ return SASS_MEMORY_NEW(String_Quoted, pstate, str);
247
+ }
248
+ }
249
+
250
+ Signature to_lower_case_sig = "to-lower-case($string)";
251
+ BUILT_IN(to_lower_case)
252
+ {
253
+ String_Constant* s = ARG("$string", String_Constant);
254
+ sass::string str = s->value();
255
+ Util::ascii_str_tolower(&str);
256
+
257
+ if (String_Quoted* ss = Cast<String_Quoted>(s)) {
258
+ String_Quoted* cpy = SASS_MEMORY_COPY(ss);
259
+ cpy->value(str);
260
+ return cpy;
261
+ } else {
262
+ return SASS_MEMORY_NEW(String_Quoted, pstate, str);
263
+ }
264
+ }
265
+
266
+ }
267
+
268
+ }