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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.gitmodules +1 -1
- data/.travis.yml +9 -3
- data/CHANGELOG.md +36 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/README.md +1 -1
- data/Rakefile +43 -7
- data/ext/depend +4 -0
- data/ext/extconf.rb +92 -0
- data/ext/libsass/VERSION +1 -0
- data/ext/libsass/include/sass/base.h +9 -1
- data/ext/libsass/include/sass/context.h +5 -1
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +755 -2028
- data/ext/libsass/src/ast.hpp +492 -2477
- data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +70 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
- data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
- data/ext/libsass/src/ast_helpers.hpp +292 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +275 -0
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +1043 -0
- data/ext/libsass/src/ast_selectors.hpp +522 -0
- data/ext/libsass/src/ast_supports.cpp +114 -0
- data/ext/libsass/src/ast_supports.hpp +121 -0
- data/ext/libsass/src/ast_values.cpp +1154 -0
- data/ext/libsass/src/ast_values.hpp +498 -0
- data/ext/libsass/src/backtrace.cpp +11 -7
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +5 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +35 -34
- data/ext/libsass/src/bind.hpp +3 -1
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/cencode.c +4 -6
- data/ext/libsass/src/check_nesting.cpp +83 -88
- data/ext/libsass/src/check_nesting.hpp +39 -34
- data/ext/libsass/src/color_maps.cpp +168 -164
- data/ext/libsass/src/color_maps.hpp +152 -160
- data/ext/libsass/src/constants.cpp +20 -0
- data/ext/libsass/src/constants.hpp +19 -0
- data/ext/libsass/src/context.cpp +104 -121
- data/ext/libsass/src/context.hpp +43 -55
- data/ext/libsass/src/cssize.cpp +103 -188
- data/ext/libsass/src/cssize.hpp +45 -51
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debugger.hpp +524 -361
- data/ext/libsass/src/emitter.cpp +26 -26
- data/ext/libsass/src/emitter.hpp +20 -18
- data/ext/libsass/src/environment.cpp +41 -27
- data/ext/libsass/src/environment.hpp +33 -22
- data/ext/libsass/src/error_handling.cpp +92 -94
- data/ext/libsass/src/error_handling.hpp +73 -50
- data/ext/libsass/src/eval.cpp +380 -515
- data/ext/libsass/src/eval.hpp +64 -57
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +322 -263
- data/ext/libsass/src/expand.hpp +55 -39
- data/ext/libsass/src/extender.cpp +1188 -0
- data/ext/libsass/src/extender.hpp +399 -0
- data/ext/libsass/src/extension.cpp +43 -0
- data/ext/libsass/src/extension.hpp +89 -0
- data/ext/libsass/src/file.cpp +134 -88
- data/ext/libsass/src/file.hpp +28 -37
- data/ext/libsass/src/fn_colors.cpp +596 -0
- data/ext/libsass/src/fn_colors.hpp +85 -0
- data/ext/libsass/src/fn_lists.cpp +285 -0
- data/ext/libsass/src/fn_lists.hpp +34 -0
- data/ext/libsass/src/fn_maps.cpp +94 -0
- data/ext/libsass/src/fn_maps.hpp +30 -0
- data/ext/libsass/src/fn_miscs.cpp +244 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +227 -0
- data/ext/libsass/src/fn_numbers.hpp +45 -0
- data/ext/libsass/src/fn_selectors.cpp +205 -0
- data/ext/libsass/src/fn_selectors.hpp +35 -0
- data/ext/libsass/src/fn_strings.cpp +268 -0
- data/ext/libsass/src/fn_strings.hpp +34 -0
- data/ext/libsass/src/fn_utils.cpp +158 -0
- data/ext/libsass/src/fn_utils.hpp +62 -0
- data/ext/libsass/src/inspect.cpp +253 -266
- data/ext/libsass/src/inspect.hpp +72 -74
- data/ext/libsass/src/json.cpp +2 -2
- data/ext/libsass/src/lexer.cpp +25 -84
- data/ext/libsass/src/lexer.hpp +5 -16
- data/ext/libsass/src/listize.cpp +27 -43
- data/ext/libsass/src/listize.hpp +14 -11
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
- data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
- data/ext/libsass/src/operation.hpp +193 -143
- data/ext/libsass/src/operators.cpp +56 -29
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +59 -75
- data/ext/libsass/src/output.hpp +15 -22
- data/ext/libsass/src/parser.cpp +662 -818
- data/ext/libsass/src/parser.hpp +96 -100
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +12 -8
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +10 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/prelexer.cpp +14 -8
- data/ext/libsass/src/prelexer.hpp +9 -9
- data/ext/libsass/src/remove_placeholders.cpp +59 -57
- data/ext/libsass/src/remove_placeholders.hpp +20 -18
- data/ext/libsass/src/sass.cpp +25 -18
- data/ext/libsass/src/sass.hpp +22 -14
- data/ext/libsass/src/sass2scss.cpp +49 -18
- data/ext/libsass/src/sass_context.cpp +104 -132
- data/ext/libsass/src/sass_context.hpp +2 -2
- data/ext/libsass/src/sass_functions.cpp +7 -4
- data/ext/libsass/src/sass_functions.hpp +1 -1
- data/ext/libsass/src/sass_values.cpp +26 -21
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +27 -20
- data/ext/libsass/src/source_map.hpp +14 -11
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +24 -22
- data/ext/libsass/src/to_value.hpp +18 -22
- data/ext/libsass/src/units.cpp +28 -22
- data/ext/libsass/src/units.hpp +9 -8
- data/ext/libsass/src/utf8/checked.h +12 -10
- data/ext/libsass/src/utf8/core.h +3 -0
- data/ext/libsass/src/utf8_string.cpp +12 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +97 -107
- data/ext/libsass/src/util.hpp +74 -30
- data/ext/libsass/src/util_string.cpp +125 -0
- data/ext/libsass/src/util_string.hpp +73 -0
- data/ext/libsass/src/values.cpp +33 -24
- data/ext/libsass/src/values.hpp +2 -2
- data/lib/sassc.rb +24 -0
- data/lib/sassc/engine.rb +7 -5
- data/lib/sassc/functions_handler.rb +11 -13
- data/lib/sassc/native.rb +10 -9
- data/lib/sassc/native/native_functions_api.rb +0 -5
- data/lib/sassc/script.rb +4 -6
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +32 -12
- data/test/engine_test.rb +32 -2
- data/test/functions_test.rb +38 -1
- data/test/native_test.rb +4 -4
- metadata +95 -109
- data/ext/Rakefile +0 -3
- data/ext/libsass/.editorconfig +0 -15
- data/ext/libsass/.gitattributes +0 -2
- data/ext/libsass/.github/CONTRIBUTING.md +0 -65
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
- data/ext/libsass/.gitignore +0 -85
- data/ext/libsass/.travis.yml +0 -64
- data/ext/libsass/COPYING +0 -25
- data/ext/libsass/GNUmakefile.am +0 -88
- data/ext/libsass/INSTALL +0 -1
- data/ext/libsass/LICENSE +0 -25
- data/ext/libsass/Makefile +0 -351
- data/ext/libsass/Makefile.conf +0 -55
- data/ext/libsass/Readme.md +0 -104
- data/ext/libsass/SECURITY.md +0 -10
- data/ext/libsass/appveyor.yml +0 -91
- data/ext/libsass/configure.ac +0 -138
- data/ext/libsass/contrib/libsass.spec +0 -66
- data/ext/libsass/docs/README.md +0 -20
- data/ext/libsass/docs/api-context-example.md +0 -45
- data/ext/libsass/docs/api-context-internal.md +0 -163
- data/ext/libsass/docs/api-context.md +0 -295
- data/ext/libsass/docs/api-doc.md +0 -215
- data/ext/libsass/docs/api-function-example.md +0 -67
- data/ext/libsass/docs/api-function-internal.md +0 -8
- data/ext/libsass/docs/api-function.md +0 -74
- data/ext/libsass/docs/api-importer-example.md +0 -112
- data/ext/libsass/docs/api-importer-internal.md +0 -20
- data/ext/libsass/docs/api-importer.md +0 -86
- data/ext/libsass/docs/api-value-example.md +0 -55
- data/ext/libsass/docs/api-value-internal.md +0 -76
- data/ext/libsass/docs/api-value.md +0 -154
- data/ext/libsass/docs/build-on-darwin.md +0 -27
- data/ext/libsass/docs/build-on-gentoo.md +0 -55
- data/ext/libsass/docs/build-on-windows.md +0 -139
- data/ext/libsass/docs/build-shared-library.md +0 -35
- data/ext/libsass/docs/build-with-autotools.md +0 -78
- data/ext/libsass/docs/build-with-makefiles.md +0 -68
- data/ext/libsass/docs/build-with-mingw.md +0 -107
- data/ext/libsass/docs/build-with-visual-studio.md +0 -90
- data/ext/libsass/docs/build.md +0 -97
- data/ext/libsass/docs/compatibility-plan.md +0 -48
- data/ext/libsass/docs/contributing.md +0 -17
- data/ext/libsass/docs/custom-functions-internal.md +0 -122
- data/ext/libsass/docs/dev-ast-memory.md +0 -223
- data/ext/libsass/docs/implementations.md +0 -56
- data/ext/libsass/docs/plugins.md +0 -47
- data/ext/libsass/docs/setup-environment.md +0 -68
- data/ext/libsass/docs/source-map-internals.md +0 -51
- data/ext/libsass/docs/trace.md +0 -26
- data/ext/libsass/docs/triage.md +0 -17
- data/ext/libsass/docs/unicode.md +0 -39
- data/ext/libsass/extconf.rb +0 -6
- data/ext/libsass/include/sass/version.h.in +0 -12
- data/ext/libsass/m4/.gitkeep +0 -0
- data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
- data/ext/libsass/res/resource.rc +0 -35
- data/ext/libsass/script/bootstrap +0 -13
- data/ext/libsass/script/branding +0 -10
- data/ext/libsass/script/ci-build-libsass +0 -134
- data/ext/libsass/script/ci-build-plugin +0 -62
- data/ext/libsass/script/ci-install-compiler +0 -6
- data/ext/libsass/script/ci-install-deps +0 -20
- data/ext/libsass/script/ci-report-coverage +0 -42
- data/ext/libsass/script/spec +0 -5
- data/ext/libsass/script/tap-driver +0 -652
- data/ext/libsass/script/tap-runner +0 -1
- data/ext/libsass/script/test-leaks.pl +0 -103
- data/ext/libsass/src/GNUmakefile.am +0 -54
- data/ext/libsass/src/extend.cpp +0 -2130
- data/ext/libsass/src/extend.hpp +0 -86
- data/ext/libsass/src/functions.cpp +0 -2234
- data/ext/libsass/src/functions.hpp +0 -198
- data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
- data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
- data/ext/libsass/src/node.cpp +0 -319
- data/ext/libsass/src/node.hpp +0 -118
- data/ext/libsass/src/paths.hpp +0 -71
- data/ext/libsass/src/sass_util.cpp +0 -149
- data/ext/libsass/src/sass_util.hpp +0 -256
- data/ext/libsass/src/subset_map.cpp +0 -55
- data/ext/libsass/src/subset_map.hpp +0 -76
- data/ext/libsass/src/support/libsass.pc.in +0 -11
- data/ext/libsass/src/to_c.hpp +0 -39
- data/ext/libsass/test/test_node.cpp +0 -94
- data/ext/libsass/test/test_paths.cpp +0 -28
- data/ext/libsass/test/test_selector_difference.cpp +0 -25
- data/ext/libsass/test/test_specificity.cpp +0 -25
- data/ext/libsass/test/test_subset_map.cpp +0 -472
- data/ext/libsass/test/test_superselector.cpp +0 -69
- data/ext/libsass/test/test_unification.cpp +0 -31
- data/ext/libsass/version.sh +0 -10
- data/ext/libsass/win/libsass.sln +0 -39
- data/ext/libsass/win/libsass.sln.DotSettings +0 -9
- data/ext/libsass/win/libsass.targets +0 -118
- data/ext/libsass/win/libsass.vcxproj +0 -188
- data/ext/libsass/win/libsass.vcxproj.filters +0 -357
- data/lib/sassc/native/lib_c.rb +0 -21
- data/lib/tasks/libsass.rb +0 -33
data/ext/libsass/src/util.hpp
CHANGED
|
@@ -1,37 +1,50 @@
|
|
|
1
1
|
#ifndef SASS_UTIL_H
|
|
2
2
|
#define SASS_UTIL_H
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
void newline_to_space(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
47
|
-
|
|
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(
|
|
50
|
-
bool isPrintable(
|
|
51
|
-
bool isPrintable(
|
|
52
|
-
bool isPrintable(
|
|
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(
|
|
55
|
-
bool isPrintable(
|
|
56
|
-
bool isPrintable(
|
|
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
|
data/ext/libsass/src/values.cpp
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
43
|
+
const Map* m = Cast<Map>(val);
|
|
36
44
|
union Sass_Value* map = sass_make_map(m->length());
|
|
37
|
-
size_t i = 0; for (
|
|
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
|
-
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
86
|
+
SourceSpan("[C-VALUE]"),
|
|
79
87
|
sass_boolean_get_value(val));
|
|
80
88
|
case SASS_COLOR:
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
99
|
+
SourceSpan("[C-VALUE]"),
|
|
91
100
|
sass_string_get_value(val));
|
|
92
101
|
}
|
|
93
102
|
return SASS_MEMORY_NEW(String_Constant,
|
|
94
|
-
|
|
103
|
+
SourceSpan("[C-VALUE]"),
|
|
95
104
|
sass_string_get_value(val));
|
|
96
105
|
case SASS_LIST: {
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
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,
|
|
126
|
+
return SASS_MEMORY_NEW(Null, SourceSpan("[C-VALUE]"));
|
|
118
127
|
case SASS_ERROR:
|
|
119
128
|
return SASS_MEMORY_NEW(Custom_Error,
|
|
120
|
-
|
|
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
|
-
|
|
133
|
+
SourceSpan("[C-VALUE]"),
|
|
125
134
|
sass_warning_get_message(val));
|
|
126
135
|
default: break;
|
|
127
136
|
}
|