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
@@ -1,37 +1,50 @@
1
1
  #ifndef SASS_UTIL_H
2
2
  #define SASS_UTIL_H
3
3
 
4
- #include <vector>
5
- #include <string>
6
- #include <assert.h>
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
7
6
  #include "sass.hpp"
7
+
8
8
  #include "sass/base.h"
9
9
  #include "ast_fwd_decl.hpp"
10
10
 
11
+ #include <cmath>
12
+ #include <cstring>
13
+ #include <vector>
14
+ #include <string>
15
+ #include <assert.h>
16
+
11
17
  #define SASS_ASSERT(cond, msg) assert(cond && msg)
12
18
 
13
19
  namespace Sass {
14
20
 
15
- #define out_of_memory() do { \
16
- std::cerr << "Out of memory.\n"; \
17
- exit(EXIT_FAILURE); \
18
- } while (0)
21
+ template <typename T>
22
+ T clip(const T& n, const T& lower, const T& upper) {
23
+ return std::max(lower, std::min(n, upper));
24
+ }
25
+
26
+ template <typename T>
27
+ T absmod(const T& n, const T& r) {
28
+ T m = std::fmod(n, r);
29
+ if (m < 0.0) m += r;
30
+ return m;
31
+ }
19
32
 
20
33
  double round(double val, size_t precision = 0);
21
34
  double sass_strtod(const char* str);
22
35
  const char* safe_str(const char *, const char* = "");
23
36
  void free_string_array(char **);
24
- char **copy_strings(const std::vector<std::string>&, char ***, int = 0);
25
- std::string read_css_string(const std::string& str, bool css = true);
26
- std::string evacuate_escapes(const std::string& str);
27
- std::string string_to_output(const std::string& str);
28
- std::string comment_to_string(const std::string& text);
29
- std::string read_hex_escapes(const std::string& str);
30
- std::string escape_string(const std::string& str);
31
- void newline_to_space(std::string& str);
32
-
33
- std::string quote(const std::string&, char q = 0);
34
- std::string unquote(const std::string&, char* q = 0, bool keep_utf8_sequences = false, bool strict = true);
37
+ char **copy_strings(const sass::vector<sass::string>&, char ***, int = 0);
38
+ sass::string read_css_string(const sass::string& str, bool css = true);
39
+ sass::string evacuate_escapes(const sass::string& str);
40
+ sass::string string_to_output(const sass::string& str);
41
+ sass::string comment_to_compact_string(const sass::string& text);
42
+ sass::string read_hex_escapes(const sass::string& str);
43
+ sass::string escape_string(const sass::string& str);
44
+ void newline_to_space(sass::string& str);
45
+
46
+ sass::string quote(const sass::string&, char q = 0);
47
+ sass::string unquote(const sass::string&, char* q = 0, bool keep_utf8_sequences = false, bool strict = true);
35
48
  char detect_best_quotemark(const char* s, char qm = '"');
36
49
 
37
50
  bool is_hex_doublet(double n);
@@ -39,22 +52,53 @@ namespace Sass {
39
52
 
40
53
  bool peek_linefeed(const char* start);
41
54
 
42
- namespace Util {
55
+ // Returns true iff `elements` ⊆ `container`.
56
+ template <typename C, typename T>
57
+ bool contains_all(C container, T elements) {
58
+ for (const auto &el : elements) {
59
+ if (container.find(el) == container.end()) return false;
60
+ }
61
+ return true;
62
+ }
63
+
64
+ // C++20 `starts_with` equivalent.
65
+ // See https://en.cppreference.com/w/cpp/string/basic_string/starts_with
66
+ inline bool starts_with(const sass::string& str, const char* prefix, size_t prefix_len) {
67
+ return str.compare(0, prefix_len, prefix) == 0;
68
+ }
69
+
70
+ inline bool starts_with(const sass::string& str, const char* prefix) {
71
+ return starts_with(str, prefix, std::strlen(prefix));
72
+ }
43
73
 
44
- std::string rtrim(const std::string& str);
74
+ // C++20 `ends_with` equivalent.
75
+ // See https://en.cppreference.com/w/cpp/string/basic_string/ends_with
76
+ inline bool ends_with(const sass::string& str, const sass::string& suffix) {
77
+ return suffix.size() <= str.size() && std::equal(suffix.rbegin(), suffix.rend(), str.rbegin());
78
+ }
79
+
80
+ inline bool ends_with(const sass::string& str, const char* suffix, size_t suffix_len) {
81
+ if (suffix_len > str.size()) return false;
82
+ const char* suffix_it = suffix + suffix_len;
83
+ const char* str_it = str.c_str() + str.size();
84
+ while (suffix_it != suffix) if (*(--suffix_it) != *(--str_it)) return false;
85
+ return true;
86
+ }
45
87
 
46
- std::string normalize_underscores(const std::string& str);
47
- std::string normalize_decimals(const std::string& str);
88
+ inline bool ends_with(const sass::string& str, const char* suffix) {
89
+ return ends_with(str, suffix, std::strlen(suffix));
90
+ }
91
+
92
+ namespace Util {
48
93
 
49
- bool isPrintable(Ruleset_Ptr r, Sass_Output_Style style = NESTED);
50
- bool isPrintable(Supports_Block_Ptr r, Sass_Output_Style style = NESTED);
51
- bool isPrintable(Media_Block_Ptr r, Sass_Output_Style style = NESTED);
52
- bool isPrintable(Comment_Ptr b, Sass_Output_Style style = NESTED);
94
+ bool isPrintable(StyleRule* r, Sass_Output_Style style = NESTED);
95
+ bool isPrintable(SupportsRule* r, Sass_Output_Style style = NESTED);
96
+ bool isPrintable(CssMediaRule* r, Sass_Output_Style style = NESTED);
97
+ bool isPrintable(Comment* b, Sass_Output_Style style = NESTED);
53
98
  bool isPrintable(Block_Obj b, Sass_Output_Style style = NESTED);
54
- bool isPrintable(String_Constant_Ptr s, Sass_Output_Style style = NESTED);
55
- bool isPrintable(String_Quoted_Ptr s, Sass_Output_Style style = NESTED);
56
- bool isPrintable(Declaration_Ptr d, Sass_Output_Style style = NESTED);
57
- bool isAscii(const char chr);
99
+ bool isPrintable(String_Constant* s, Sass_Output_Style style = NESTED);
100
+ bool isPrintable(String_Quoted* s, Sass_Output_Style style = NESTED);
101
+ bool isPrintable(Declaration* d, Sass_Output_Style style = NESTED);
58
102
 
59
103
  }
60
104
  }
@@ -0,0 +1,125 @@
1
+ #include "util_string.hpp"
2
+
3
+ #include <iostream>
4
+ #include <algorithm>
5
+
6
+ namespace Sass {
7
+ namespace Util {
8
+
9
+ // ##########################################################################
10
+ // Special case insensitive string matcher. We can optimize
11
+ // the more general compare case quite a bit by requiring
12
+ // consumers to obey some rules (lowercase and no space).
13
+ // - `literal` must only contain lower case ascii characters
14
+ // there is one edge case where this could give false positives
15
+ // test could contain a (non-ascii) char exactly 32 below literal
16
+ // ##########################################################################
17
+ bool equalsLiteral(const char* lit, const sass::string& test) {
18
+ // Work directly on characters
19
+ const char* src = test.c_str();
20
+ // There is a small chance that the search string
21
+ // Is longer than the rest of the string to look at
22
+ while (*lit && (*src == *lit || *src + 32 == *lit)) {
23
+ ++src, ++lit;
24
+ }
25
+ // True if literal is at end
26
+ // If not test was too long
27
+ return *lit == 0;
28
+ }
29
+
30
+ void ascii_str_tolower(sass::string* s) {
31
+ for (auto& ch : *s) {
32
+ ch = ascii_tolower(static_cast<unsigned char>(ch));
33
+ }
34
+ }
35
+
36
+ void ascii_str_toupper(sass::string* s) {
37
+ for (auto& ch : *s) {
38
+ ch = ascii_toupper(static_cast<unsigned char>(ch));
39
+ }
40
+ }
41
+
42
+ sass::string rtrim(sass::string str) {
43
+ auto it = std::find_if_not(str.rbegin(), str.rend(), ascii_isspace);
44
+ str.erase(str.rend() - it);
45
+ return str;
46
+ }
47
+
48
+ // ###########################################################################
49
+ // Returns [name] without a vendor prefix.
50
+ // If [name] has no vendor prefix, it's returned as-is.
51
+ // ###########################################################################
52
+ sass::string unvendor(const sass::string& name)
53
+ {
54
+ if (name.size() < 2) return name;
55
+ if (name[0] != '-') return name;
56
+ if (name[1] == '-') return name;
57
+ for (size_t i = 2; i < name.size(); i++) {
58
+ if (name[i] == '-') return name.substr(i + 1);
59
+ }
60
+ return name;
61
+ }
62
+ // EO unvendor
63
+
64
+ sass::string normalize_newlines(const sass::string& str) {
65
+ sass::string result;
66
+ result.reserve(str.size());
67
+ std::size_t pos = 0;
68
+ while (true) {
69
+ const std::size_t newline = str.find_first_of("\n\f\r", pos);
70
+ if (newline == sass::string::npos) break;
71
+ result.append(str, pos, newline - pos);
72
+ result += '\n';
73
+ if (str[newline] == '\r' && str[newline + 1] == '\n') {
74
+ pos = newline + 2;
75
+ }
76
+ else {
77
+ pos = newline + 1;
78
+ }
79
+ }
80
+ result.append(str, pos, sass::string::npos);
81
+ return result;
82
+ }
83
+
84
+ sass::string normalize_underscores(const sass::string& str) {
85
+ sass::string normalized = str;
86
+ std::replace(normalized.begin(), normalized.end(), '_', '-');
87
+ return normalized;
88
+ }
89
+
90
+ sass::string normalize_decimals(const sass::string& str) {
91
+ sass::string normalized;
92
+ if (!str.empty() && str[0] == '.') {
93
+ normalized.reserve(str.size() + 1);
94
+ normalized += '0';
95
+ normalized += str;
96
+ }
97
+ else {
98
+ normalized = str;
99
+ }
100
+ return normalized;
101
+ }
102
+
103
+ char opening_bracket_for(char closing_bracket) {
104
+ switch (closing_bracket) {
105
+ case ')': return '(';
106
+ case ']': return '[';
107
+ case '}': return '{';
108
+ default: return '\0';
109
+ }
110
+ }
111
+
112
+ char closing_bracket_for(char opening_bracket) {
113
+ switch (opening_bracket) {
114
+ case '(': return ')';
115
+ case '[': return ']';
116
+ case '{': return '}';
117
+ default: return '\0';
118
+ }
119
+ }
120
+
121
+ }
122
+ // namespace Util
123
+
124
+ }
125
+ // namespace Sass
@@ -0,0 +1,73 @@
1
+ #ifndef SASS_UTIL_STRING_H
2
+ #define SASS_UTIL_STRING_H
3
+
4
+ #include "sass.hpp"
5
+ #include <string>
6
+
7
+ namespace Sass {
8
+ namespace Util {
9
+
10
+ // ##########################################################################
11
+ // Special case insensitive string matcher. We can optimize
12
+ // the more general compare case quite a bit by requiring
13
+ // consumers to obey some rules (lowercase and no space).
14
+ // - `literal` must only contain lower case ascii characters
15
+ // there is one edge case where this could give false positives
16
+ // test could contain a (non-ascii) char exactly 32 below literal
17
+ // ##########################################################################
18
+ bool equalsLiteral(const char* lit, const sass::string& test);
19
+
20
+ // ###########################################################################
21
+ // Returns [name] without a vendor prefix.
22
+ // If [name] has no vendor prefix, it's returned as-is.
23
+ // ###########################################################################
24
+ sass::string unvendor(const sass::string& name);
25
+
26
+ sass::string rtrim(sass::string str);
27
+ sass::string normalize_newlines(const sass::string& str);
28
+ sass::string normalize_underscores(const sass::string& str);
29
+ sass::string normalize_decimals(const sass::string& str);
30
+ char opening_bracket_for(char closing_bracket);
31
+ char closing_bracket_for(char opening_bracket);
32
+
33
+ // Locale-independent ASCII character routines.
34
+
35
+ inline bool ascii_isalpha(unsigned char c) {
36
+ return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
37
+ }
38
+
39
+ inline bool ascii_isdigit(unsigned char c) {
40
+ return (c >= '0' && c <= '9');
41
+ }
42
+
43
+ inline bool ascii_isalnum(unsigned char c) {
44
+ return ascii_isalpha(c) || ascii_isdigit(c);
45
+ }
46
+
47
+ inline bool ascii_isascii(unsigned char c) { return c < 128; }
48
+
49
+ inline bool ascii_isxdigit(unsigned char c) {
50
+ return ascii_isdigit(c) || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
51
+ }
52
+
53
+ inline bool ascii_isspace(unsigned char c) {
54
+ return c == ' ' || c == '\t' || c == '\v' || c == '\f' || c == '\r' || c == '\n';
55
+ }
56
+
57
+ inline char ascii_tolower(unsigned char c) {
58
+ if (c >= 'A' && c <= 'Z') return c + 32;
59
+ return c;
60
+ }
61
+
62
+ void ascii_str_tolower(sass::string* s);
63
+
64
+ inline char ascii_toupper(unsigned char c) {
65
+ if (c >= 'a' && c <= 'z') return c - 32;
66
+ return c;
67
+ }
68
+
69
+ void ascii_str_toupper(sass::string* s);
70
+
71
+ } // namespace Sass
72
+ } // namespace Util
73
+ #endif // SASS_UTIL_STRING_H
@@ -1,4 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include "sass.h"
3
6
  #include "values.hpp"
4
7
 
@@ -7,24 +10,29 @@
7
10
  namespace Sass {
8
11
 
9
12
  // convert value from C++ side to C-API
10
- union Sass_Value* ast_node_to_sass_value (const Expression_Ptr val)
13
+ union Sass_Value* ast_node_to_sass_value (const Expression* val)
11
14
  {
12
15
  if (val->concrete_type() == Expression::NUMBER)
13
16
  {
14
- Number_Ptr_Const res = Cast<Number>(val);
17
+ const Number* res = Cast<Number>(val);
15
18
  return sass_make_number(res->value(), res->unit().c_str());
16
19
  }
17
20
  else if (val->concrete_type() == Expression::COLOR)
18
21
  {
19
- Color_Ptr_Const col = Cast<Color>(val);
20
- return sass_make_color(col->r(), col->g(), col->b(), col->a());
22
+ if (const Color_RGBA* rgba = Cast<Color_RGBA>(val)) {
23
+ return sass_make_color(rgba->r(), rgba->g(), rgba->b(), rgba->a());
24
+ } else {
25
+ // ToDo: allow to also use HSLA colors!!
26
+ Color_RGBA_Obj col = Cast<Color>(val)->copyAsRGBA();
27
+ return sass_make_color(col->r(), col->g(), col->b(), col->a());
28
+ }
21
29
  }
22
30
  else if (val->concrete_type() == Expression::LIST)
23
31
  {
24
- List_Ptr_Const l = Cast<List>(val);
32
+ const List* l = Cast<List>(val);
25
33
  union Sass_Value* list = sass_make_list(l->size(), l->separator(), l->is_bracketed());
26
34
  for (size_t i = 0, L = l->length(); i < L; ++i) {
27
- Expression_Obj obj = l->at(i);
35
+ ExpressionObj obj = l->at(i);
28
36
  auto val = ast_node_to_sass_value(obj);
29
37
  sass_list_set_value(list, i, val);
30
38
  }
@@ -32,9 +40,9 @@ namespace Sass {
32
40
  }
33
41
  else if (val->concrete_type() == Expression::MAP)
34
42
  {
35
- Map_Ptr_Const m = Cast<Map>(val);
43
+ const Map* m = Cast<Map>(val);
36
44
  union Sass_Value* map = sass_make_map(m->length());
37
- size_t i = 0; for (Expression_Obj key : m->keys()) {
45
+ size_t i = 0; for (ExpressionObj key : m->keys()) {
38
46
  sass_map_set_key(map, i, ast_node_to_sass_value(key));
39
47
  sass_map_set_value(map, i, ast_node_to_sass_value(m->at(key)));
40
48
  ++ i;
@@ -47,16 +55,16 @@ namespace Sass {
47
55
  }
48
56
  else if (val->concrete_type() == Expression::BOOLEAN)
49
57
  {
50
- Boolean_Ptr_Const res = Cast<Boolean>(val);
58
+ const Boolean* res = Cast<Boolean>(val);
51
59
  return sass_make_boolean(res->value());
52
60
  }
53
61
  else if (val->concrete_type() == Expression::STRING)
54
62
  {
55
- if (String_Quoted_Ptr_Const qstr = Cast<String_Quoted>(val))
63
+ if (const String_Quoted* qstr = Cast<String_Quoted>(val))
56
64
  {
57
65
  return sass_make_qstring(qstr->value().c_str());
58
66
  }
59
- else if (String_Constant_Ptr_Const cstr = Cast<String_Constant>(val))
67
+ else if (const String_Constant* cstr = Cast<String_Constant>(val))
60
68
  {
61
69
  return sass_make_string(cstr->value().c_str());
62
70
  }
@@ -65,21 +73,22 @@ namespace Sass {
65
73
  }
66
74
 
67
75
  // convert value from C-API to C++ side
68
- Value_Ptr sass_value_to_ast_node (const union Sass_Value* val)
76
+ Value* sass_value_to_ast_node (const union Sass_Value* val)
69
77
  {
70
78
  switch (sass_value_get_tag(val)) {
71
79
  case SASS_NUMBER:
72
80
  return SASS_MEMORY_NEW(Number,
73
- ParserState("[C-VALUE]"),
81
+ SourceSpan("[C-VALUE]"),
74
82
  sass_number_get_value(val),
75
83
  sass_number_get_unit(val));
76
84
  case SASS_BOOLEAN:
77
85
  return SASS_MEMORY_NEW(Boolean,
78
- ParserState("[C-VALUE]"),
86
+ SourceSpan("[C-VALUE]"),
79
87
  sass_boolean_get_value(val));
80
88
  case SASS_COLOR:
81
- return SASS_MEMORY_NEW(Color,
82
- ParserState("[C-VALUE]"),
89
+ // ToDo: allow to also use HSLA colors!!
90
+ return SASS_MEMORY_NEW(Color_RGBA,
91
+ SourceSpan("[C-VALUE]"),
83
92
  sass_color_get_r(val),
84
93
  sass_color_get_g(val),
85
94
  sass_color_get_b(val),
@@ -87,15 +96,15 @@ namespace Sass {
87
96
  case SASS_STRING:
88
97
  if (sass_string_is_quoted(val)) {
89
98
  return SASS_MEMORY_NEW(String_Quoted,
90
- ParserState("[C-VALUE]"),
99
+ SourceSpan("[C-VALUE]"),
91
100
  sass_string_get_value(val));
92
101
  }
93
102
  return SASS_MEMORY_NEW(String_Constant,
94
- ParserState("[C-VALUE]"),
103
+ SourceSpan("[C-VALUE]"),
95
104
  sass_string_get_value(val));
96
105
  case SASS_LIST: {
97
- List_Ptr l = SASS_MEMORY_NEW(List,
98
- ParserState("[C-VALUE]"),
106
+ List* l = SASS_MEMORY_NEW(List,
107
+ SourceSpan("[C-VALUE]"),
99
108
  sass_list_get_length(val),
100
109
  sass_list_get_separator(val));
101
110
  for (size_t i = 0, L = sass_list_get_length(val); i < L; ++i) {
@@ -105,7 +114,7 @@ namespace Sass {
105
114
  return l;
106
115
  }
107
116
  case SASS_MAP: {
108
- Map_Ptr m = SASS_MEMORY_NEW(Map, ParserState("[C-VALUE]"));
117
+ Map* m = SASS_MEMORY_NEW(Map, SourceSpan("[C-VALUE]"));
109
118
  for (size_t i = 0, L = sass_map_get_length(val); i < L; ++i) {
110
119
  *m << std::make_pair(
111
120
  sass_value_to_ast_node(sass_map_get_key(val, i)),
@@ -114,14 +123,14 @@ namespace Sass {
114
123
  return m;
115
124
  }
116
125
  case SASS_NULL:
117
- return SASS_MEMORY_NEW(Null, ParserState("[C-VALUE]"));
126
+ return SASS_MEMORY_NEW(Null, SourceSpan("[C-VALUE]"));
118
127
  case SASS_ERROR:
119
128
  return SASS_MEMORY_NEW(Custom_Error,
120
- ParserState("[C-VALUE]"),
129
+ SourceSpan("[C-VALUE]"),
121
130
  sass_error_get_message(val));
122
131
  case SASS_WARNING:
123
132
  return SASS_MEMORY_NEW(Custom_Warning,
124
- ParserState("[C-VALUE]"),
133
+ SourceSpan("[C-VALUE]"),
125
134
  sass_warning_get_message(val));
126
135
  default: break;
127
136
  }