sassc 2.0.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }