sassc 1.11.4 → 1.12.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 +5 -5
- data/.travis.yml +2 -2
- data/CODE_OF_CONDUCT.md +10 -0
- data/README.md +4 -1
- data/ext/libsass/.editorconfig +1 -1
- data/ext/libsass/.github/CONTRIBUTING.md +7 -7
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +31 -6
- data/ext/libsass/.gitignore +3 -0
- data/ext/libsass/.travis.yml +37 -18
- data/ext/libsass/GNUmakefile.am +23 -37
- data/ext/libsass/Makefile +10 -6
- data/ext/libsass/Makefile.conf +3 -0
- data/ext/libsass/Readme.md +68 -63
- data/ext/libsass/appveyor.yml +7 -3
- data/ext/libsass/configure.ac +10 -14
- data/ext/libsass/docs/api-context-internal.md +29 -21
- data/ext/libsass/docs/api-context.md +26 -6
- data/ext/libsass/docs/api-doc.md +49 -16
- data/ext/libsass/docs/api-function-example.md +1 -1
- data/ext/libsass/docs/api-function.md +31 -7
- data/ext/libsass/docs/api-importer.md +19 -19
- data/ext/libsass/docs/api-value.md +4 -2
- data/ext/libsass/docs/build-on-windows.md +4 -4
- data/ext/libsass/docs/build-with-mingw.md +3 -3
- data/ext/libsass/docs/build.md +9 -9
- data/ext/libsass/docs/custom-functions-internal.md +10 -8
- data/ext/libsass/docs/implementations.md +20 -8
- data/ext/libsass/docs/unicode.md +16 -10
- data/ext/libsass/include/sass/base.h +0 -3
- data/ext/libsass/include/sass/context.h +20 -2
- data/ext/libsass/include/sass/functions.h +31 -0
- data/ext/libsass/include/sass/values.h +3 -1
- data/ext/libsass/include/sass/version.h +1 -1
- data/ext/libsass/include/sass/version.h.in +1 -1
- data/ext/libsass/include/sass2scss.h +1 -1
- data/ext/libsass/res/resource.rc +6 -6
- data/ext/libsass/script/ci-build-libsass +10 -5
- data/ext/libsass/script/ci-build-plugin +62 -0
- data/ext/libsass/script/ci-install-compiler +1 -1
- data/ext/libsass/script/ci-install-deps +4 -7
- data/ext/libsass/script/ci-report-coverage +13 -3
- data/ext/libsass/script/tap-driver +1 -1
- data/ext/libsass/script/tap-runner +1 -1
- data/ext/libsass/src/GNUmakefile.am +1 -1
- data/ext/libsass/src/ast.cpp +537 -762
- data/ext/libsass/src/ast.hpp +377 -419
- data/ext/libsass/src/ast_def_macros.hpp +26 -1
- data/ext/libsass/src/ast_fwd_decl.cpp +29 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +94 -21
- data/ext/libsass/src/b64/encode.h +3 -1
- data/ext/libsass/src/backtrace.cpp +46 -0
- data/ext/libsass/src/backtrace.hpp +7 -54
- data/ext/libsass/src/bind.cpp +72 -50
- data/ext/libsass/src/bind.hpp +0 -1
- data/ext/libsass/src/cencode.c +6 -0
- data/ext/libsass/src/check_nesting.cpp +157 -135
- data/ext/libsass/src/check_nesting.hpp +11 -10
- data/ext/libsass/src/color_maps.cpp +10 -6
- data/ext/libsass/src/color_maps.hpp +6 -8
- data/ext/libsass/src/constants.cpp +4 -3
- data/ext/libsass/src/constants.hpp +4 -3
- data/ext/libsass/src/context.cpp +110 -47
- data/ext/libsass/src/context.hpp +11 -1
- data/ext/libsass/src/cssize.cpp +105 -94
- data/ext/libsass/src/cssize.hpp +4 -5
- data/ext/libsass/src/debugger.hpp +247 -244
- data/ext/libsass/src/emitter.cpp +30 -6
- data/ext/libsass/src/emitter.hpp +7 -0
- data/ext/libsass/src/environment.cpp +67 -16
- data/ext/libsass/src/environment.hpp +28 -7
- data/ext/libsass/src/error_handling.cpp +92 -64
- data/ext/libsass/src/error_handling.hpp +64 -43
- data/ext/libsass/src/eval.cpp +494 -544
- data/ext/libsass/src/eval.hpp +17 -23
- data/ext/libsass/src/expand.cpp +182 -154
- data/ext/libsass/src/expand.hpp +4 -5
- data/ext/libsass/src/extend.cpp +299 -291
- data/ext/libsass/src/extend.hpp +46 -11
- data/ext/libsass/src/file.cpp +103 -36
- data/ext/libsass/src/file.hpp +21 -4
- data/ext/libsass/src/functions.cpp +561 -312
- data/ext/libsass/src/functions.hpp +8 -5
- data/ext/libsass/src/inspect.cpp +108 -53
- data/ext/libsass/src/inspect.hpp +5 -2
- data/ext/libsass/src/lexer.cpp +15 -7
- data/ext/libsass/src/lexer.hpp +13 -4
- data/ext/libsass/src/listize.cpp +3 -2
- data/ext/libsass/src/listize.hpp +0 -1
- data/ext/libsass/src/memory/SharedPtr.cpp +16 -18
- data/ext/libsass/src/memory/SharedPtr.hpp +47 -43
- data/ext/libsass/src/node.cpp +34 -38
- data/ext/libsass/src/node.hpp +6 -8
- data/ext/libsass/src/operation.hpp +2 -2
- data/ext/libsass/src/operators.cpp +240 -0
- data/ext/libsass/src/operators.hpp +30 -0
- data/ext/libsass/src/output.cpp +22 -20
- data/ext/libsass/src/parser.cpp +719 -358
- data/ext/libsass/src/parser.hpp +57 -22
- data/ext/libsass/src/plugins.cpp +28 -10
- data/ext/libsass/src/position.cpp +21 -3
- data/ext/libsass/src/position.hpp +2 -1
- data/ext/libsass/src/prelexer.cpp +104 -19
- data/ext/libsass/src/prelexer.hpp +10 -3
- data/ext/libsass/src/remove_placeholders.cpp +9 -10
- data/ext/libsass/src/remove_placeholders.hpp +1 -5
- data/ext/libsass/src/sass.cpp +62 -4
- data/ext/libsass/src/sass.hpp +5 -2
- data/ext/libsass/src/sass_context.cpp +96 -58
- data/ext/libsass/src/sass_context.hpp +7 -5
- data/ext/libsass/src/sass_functions.cpp +63 -1
- data/ext/libsass/src/sass_functions.hpp +19 -1
- data/ext/libsass/src/sass_util.cpp +3 -3
- data/ext/libsass/src/sass_util.hpp +4 -4
- data/ext/libsass/src/sass_values.cpp +42 -39
- data/ext/libsass/src/sass_values.hpp +2 -1
- data/ext/libsass/src/source_map.cpp +16 -18
- data/ext/libsass/src/subset_map.cpp +6 -8
- data/ext/libsass/src/subset_map.hpp +6 -6
- data/ext/libsass/src/to_c.cpp +2 -2
- data/ext/libsass/src/to_value.cpp +8 -3
- data/ext/libsass/src/to_value.hpp +1 -0
- data/ext/libsass/src/units.cpp +349 -45
- data/ext/libsass/src/units.hpp +39 -22
- data/ext/libsass/src/utf8/checked.h +7 -0
- data/ext/libsass/src/utf8/unchecked.h +7 -0
- data/ext/libsass/src/utf8_string.cpp +1 -1
- data/ext/libsass/src/util.cpp +139 -45
- data/ext/libsass/src/util.hpp +4 -7
- data/ext/libsass/src/values.cpp +15 -23
- data/ext/libsass/win/libsass.sln +13 -2
- data/ext/libsass/win/libsass.sln.DotSettings +9 -0
- data/ext/libsass/win/libsass.targets +3 -0
- data/ext/libsass/win/libsass.vcxproj.filters +9 -0
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +1 -1
- data/test/native_test.rb +1 -1
- metadata +11 -4
|
@@ -6,11 +6,10 @@
|
|
|
6
6
|
|
|
7
7
|
namespace Sass {
|
|
8
8
|
|
|
9
|
-
typedef Environment<AST_Node_Obj> Env;
|
|
10
|
-
|
|
11
9
|
class CheckNesting : public Operation_CRTP<Statement_Ptr, CheckNesting> {
|
|
12
10
|
|
|
13
11
|
std::vector<Statement_Ptr> parents;
|
|
12
|
+
Backtraces traces;
|
|
14
13
|
Statement_Ptr parent;
|
|
15
14
|
Definition_Ptr current_mixin_definition;
|
|
16
15
|
|
|
@@ -24,10 +23,11 @@ namespace Sass {
|
|
|
24
23
|
|
|
25
24
|
Statement_Ptr operator()(Block_Ptr);
|
|
26
25
|
Statement_Ptr operator()(Definition_Ptr);
|
|
26
|
+
Statement_Ptr operator()(If_Ptr);
|
|
27
27
|
|
|
28
28
|
template <typename U>
|
|
29
29
|
Statement_Ptr fallback(U x) {
|
|
30
|
-
Statement_Ptr n =
|
|
30
|
+
Statement_Ptr n = Cast<Statement>(x);
|
|
31
31
|
if (this->should_visit(n)) {
|
|
32
32
|
return fallback_impl(n);
|
|
33
33
|
}
|
|
@@ -35,17 +35,18 @@ namespace Sass {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
private:
|
|
38
|
-
void invalid_content_parent(Statement_Ptr);
|
|
39
|
-
void invalid_charset_parent(Statement_Ptr);
|
|
40
|
-
void invalid_extend_parent(Statement_Ptr);
|
|
38
|
+
void invalid_content_parent(Statement_Ptr, AST_Node_Ptr);
|
|
39
|
+
void invalid_charset_parent(Statement_Ptr, AST_Node_Ptr);
|
|
40
|
+
void invalid_extend_parent(Statement_Ptr, AST_Node_Ptr);
|
|
41
41
|
// void invalid_import_parent(Statement_Ptr);
|
|
42
|
-
void invalid_mixin_definition_parent(Statement_Ptr);
|
|
43
|
-
void invalid_function_parent(Statement_Ptr);
|
|
42
|
+
void invalid_mixin_definition_parent(Statement_Ptr, AST_Node_Ptr);
|
|
43
|
+
void invalid_function_parent(Statement_Ptr, AST_Node_Ptr);
|
|
44
44
|
|
|
45
45
|
void invalid_function_child(Statement_Ptr);
|
|
46
46
|
void invalid_prop_child(Statement_Ptr);
|
|
47
|
-
void invalid_prop_parent(Statement_Ptr);
|
|
48
|
-
void invalid_return_parent(Statement_Ptr);
|
|
47
|
+
void invalid_prop_parent(Statement_Ptr, AST_Node_Ptr);
|
|
48
|
+
void invalid_return_parent(Statement_Ptr, AST_Node_Ptr);
|
|
49
|
+
void invalid_value_child(AST_Node_Ptr);
|
|
49
50
|
|
|
50
51
|
bool is_transparent_parent(Statement_Ptr, Statement_Ptr);
|
|
51
52
|
|
|
@@ -607,16 +607,20 @@ namespace Sass {
|
|
|
607
607
|
|
|
608
608
|
Color_Ptr_Const name_to_color(const char* key)
|
|
609
609
|
{
|
|
610
|
-
|
|
611
|
-
if (p != names_to_colors.end()) {
|
|
612
|
-
return p->second;
|
|
613
|
-
}
|
|
614
|
-
return 0;
|
|
610
|
+
return name_to_color(std::string(key));
|
|
615
611
|
}
|
|
616
612
|
|
|
617
613
|
Color_Ptr_Const name_to_color(const std::string& key)
|
|
618
614
|
{
|
|
619
|
-
|
|
615
|
+
// case insensitive lookup. See #2462
|
|
616
|
+
std::string lower{key};
|
|
617
|
+
std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
|
|
618
|
+
|
|
619
|
+
auto p = names_to_colors.find(lower.c_str());
|
|
620
|
+
if (p != names_to_colors.end()) {
|
|
621
|
+
return p->second;
|
|
622
|
+
}
|
|
623
|
+
return 0;
|
|
620
624
|
}
|
|
621
625
|
|
|
622
626
|
const char* color_to_name(const int key)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
#ifndef SASS_COLOR_MAPS_H
|
|
2
3
|
#define SASS_COLOR_MAPS_H
|
|
3
4
|
|
|
@@ -319,14 +320,11 @@ namespace Sass {
|
|
|
319
320
|
extern const Color transparent;
|
|
320
321
|
}
|
|
321
322
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
extern const char* color_to_name(const int);
|
|
328
|
-
extern const char* color_to_name(const Color&);
|
|
329
|
-
extern const char* color_to_name(const double);
|
|
323
|
+
Color_Ptr_Const name_to_color(const char*);
|
|
324
|
+
Color_Ptr_Const name_to_color(const std::string&);
|
|
325
|
+
const char* color_to_name(const int);
|
|
326
|
+
const char* color_to_name(const Color&);
|
|
327
|
+
const char* color_to_name(const double);
|
|
330
328
|
|
|
331
329
|
}
|
|
332
330
|
|
|
@@ -79,11 +79,12 @@ namespace Sass {
|
|
|
79
79
|
extern const char supports_kwd[] = "@supports";
|
|
80
80
|
extern const char keyframes_kwd[] = "keyframes";
|
|
81
81
|
extern const char only_kwd[] = "only";
|
|
82
|
-
extern const char
|
|
82
|
+
extern const char rgb_fn_kwd[] = "rgb(";
|
|
83
|
+
extern const char url_fn_kwd[] = "url(";
|
|
83
84
|
extern const char url_kwd[] = "url";
|
|
84
|
-
// extern const char
|
|
85
|
+
// extern const char url_prefix_fn_kwd[] = "url-prefix(";
|
|
85
86
|
extern const char important_kwd[] = "important";
|
|
86
|
-
extern const char
|
|
87
|
+
extern const char pseudo_not_fn_kwd[] = ":not(";
|
|
87
88
|
extern const char even_kwd[] = "even";
|
|
88
89
|
extern const char odd_kwd[] = "odd";
|
|
89
90
|
extern const char progid_kwd[] = "progid";
|
|
@@ -79,11 +79,12 @@ namespace Sass {
|
|
|
79
79
|
extern const char supports_kwd[];
|
|
80
80
|
extern const char keyframes_kwd[];
|
|
81
81
|
extern const char only_kwd[];
|
|
82
|
-
extern const char
|
|
82
|
+
extern const char rgb_fn_kwd[];
|
|
83
|
+
extern const char url_fn_kwd[];
|
|
83
84
|
extern const char url_kwd[];
|
|
84
|
-
// extern const char
|
|
85
|
+
// extern const char url_prefix_fn_kwd[];
|
|
85
86
|
extern const char important_kwd[];
|
|
86
|
-
extern const char
|
|
87
|
+
extern const char pseudo_not_fn_kwd[];
|
|
87
88
|
extern const char even_kwd[];
|
|
88
89
|
extern const char odd_kwd[];
|
|
89
90
|
extern const char progid_kwd[];
|
data/ext/libsass/src/context.cpp
CHANGED
|
@@ -67,11 +67,15 @@ namespace Sass {
|
|
|
67
67
|
plugins(),
|
|
68
68
|
emitter(c_options),
|
|
69
69
|
|
|
70
|
+
ast_gc(),
|
|
70
71
|
strings(),
|
|
71
72
|
resources(),
|
|
72
73
|
sheets(),
|
|
73
74
|
subset_map(),
|
|
74
75
|
import_stack(),
|
|
76
|
+
callee_stack(),
|
|
77
|
+
traces(),
|
|
78
|
+
c_compiler(NULL),
|
|
75
79
|
|
|
76
80
|
c_headers (std::vector<Sass_Importer_Entry>()),
|
|
77
81
|
c_importers (std::vector<Sass_Importer_Entry>()),
|
|
@@ -87,10 +91,13 @@ namespace Sass {
|
|
|
87
91
|
|
|
88
92
|
{
|
|
89
93
|
|
|
90
|
-
//
|
|
91
|
-
|
|
94
|
+
// Sass 3.4: The current working directory will no longer be placed onto the Sass load path by default.
|
|
95
|
+
// If you need the current working directory to be available, set SASS_PATH=. in your shell's environment.
|
|
96
|
+
// include_paths.push_back(CWD);
|
|
92
97
|
|
|
93
98
|
// collect more paths from different options
|
|
99
|
+
collect_extensions(c_options.extension);
|
|
100
|
+
collect_extensions(c_options.extensions);
|
|
94
101
|
collect_include_paths(c_options.include_path);
|
|
95
102
|
collect_include_paths(c_options.include_paths);
|
|
96
103
|
collect_plugin_paths(c_options.plugin_path);
|
|
@@ -129,7 +136,7 @@ namespace Sass {
|
|
|
129
136
|
|
|
130
137
|
Context::~Context()
|
|
131
138
|
{
|
|
132
|
-
// resources were allocated by
|
|
139
|
+
// resources were allocated by malloc
|
|
133
140
|
for (size_t i = 0; i < resources.size(); ++i) {
|
|
134
141
|
free(resources[i].contents);
|
|
135
142
|
free(resources[i].srcmap);
|
|
@@ -161,6 +168,37 @@ namespace Sass {
|
|
|
161
168
|
{
|
|
162
169
|
}
|
|
163
170
|
|
|
171
|
+
void Context::collect_extensions(const char* exts_str)
|
|
172
|
+
{
|
|
173
|
+
if (exts_str) {
|
|
174
|
+
const char* beg = exts_str;
|
|
175
|
+
const char* end = Prelexer::find_first<PATH_SEP>(beg);
|
|
176
|
+
|
|
177
|
+
while (end) {
|
|
178
|
+
std::string ext(beg, end - beg);
|
|
179
|
+
if (!ext.empty()) {
|
|
180
|
+
extensions.push_back(ext);
|
|
181
|
+
}
|
|
182
|
+
beg = end + 1;
|
|
183
|
+
end = Prelexer::find_first<PATH_SEP>(beg);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
std::string ext(beg);
|
|
187
|
+
if (!ext.empty()) {
|
|
188
|
+
extensions.push_back(ext);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
void Context::collect_extensions(string_list* paths_array)
|
|
194
|
+
{
|
|
195
|
+
while (paths_array)
|
|
196
|
+
{
|
|
197
|
+
collect_extensions(paths_array->string);
|
|
198
|
+
paths_array = paths_array->next;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
164
202
|
void Context::collect_include_paths(const char* paths_str)
|
|
165
203
|
{
|
|
166
204
|
if (paths_str) {
|
|
@@ -231,25 +269,29 @@ namespace Sass {
|
|
|
231
269
|
// looks for alternatives and returns a list from one directory
|
|
232
270
|
std::vector<Include> Context::find_includes(const Importer& import)
|
|
233
271
|
{
|
|
272
|
+
// include configured extensions
|
|
273
|
+
std::vector<std::string> exts(File::defaultExtensions);
|
|
274
|
+
if (extensions.size() > 0) {
|
|
275
|
+
exts.insert(exts.end(), extensions.begin(), extensions.end());
|
|
276
|
+
}
|
|
234
277
|
// make sure we resolve against an absolute path
|
|
235
278
|
std::string base_path(rel2abs(import.base_path));
|
|
236
279
|
// first try to resolve the load path relative to the base path
|
|
237
|
-
std::vector<Include> vec(resolve_includes(base_path, import.imp_path));
|
|
280
|
+
std::vector<Include> vec(resolve_includes(base_path, import.imp_path, exts));
|
|
238
281
|
// then search in every include path (but only if nothing found yet)
|
|
239
282
|
for (size_t i = 0, S = include_paths.size(); vec.size() == 0 && i < S; ++i)
|
|
240
283
|
{
|
|
241
284
|
// call resolve_includes and individual base path and append all results
|
|
242
|
-
std::vector<Include> resolved(resolve_includes(include_paths[i], import.imp_path));
|
|
285
|
+
std::vector<Include> resolved(resolve_includes(include_paths[i], import.imp_path, exts));
|
|
243
286
|
if (resolved.size()) vec.insert(vec.end(), resolved.begin(), resolved.end());
|
|
244
287
|
}
|
|
245
288
|
// return vector
|
|
246
289
|
return vec;
|
|
247
290
|
}
|
|
248
291
|
|
|
249
|
-
|
|
250
292
|
// register include with resolved path and its content
|
|
251
293
|
// memory of the resources will be freed by us on exit
|
|
252
|
-
void Context::register_resource(const Include& inc, const Resource& res
|
|
294
|
+
void Context::register_resource(const Include& inc, const Resource& res)
|
|
253
295
|
{
|
|
254
296
|
|
|
255
297
|
// do not parse same resource twice
|
|
@@ -297,21 +339,22 @@ namespace Sass {
|
|
|
297
339
|
for (size_t i = 0; i < import_stack.size() - 2; ++i) {
|
|
298
340
|
auto parent = import_stack[i];
|
|
299
341
|
if (std::strcmp(parent->abs_path, import->abs_path) == 0) {
|
|
342
|
+
std::string cwd(File::get_cwd());
|
|
343
|
+
// make path relative to the current directory
|
|
300
344
|
std::string stack("An @import loop has been found:");
|
|
301
345
|
for (size_t n = 1; n < i + 2; ++n) {
|
|
302
|
-
stack += "\n " + std::string(import_stack[n]->
|
|
303
|
-
" imports " + std::string(import_stack[n+1]->
|
|
346
|
+
stack += "\n " + std::string(File::abs2rel(import_stack[n]->abs_path, cwd, cwd)) +
|
|
347
|
+
" imports " + std::string(File::abs2rel(import_stack[n+1]->abs_path, cwd, cwd));
|
|
304
348
|
}
|
|
305
349
|
// implement error throw directly until we
|
|
306
350
|
// decided how to handle full stack traces
|
|
307
|
-
|
|
308
|
-
throw Exception::InvalidSyntax(state, stack, &import_stack);
|
|
351
|
+
throw Exception::InvalidSyntax(pstate, traces, stack);
|
|
309
352
|
// error(stack, prstate ? *prstate : pstate, import_stack);
|
|
310
353
|
}
|
|
311
354
|
}
|
|
312
355
|
|
|
313
356
|
// create a parser instance from the given c_str buffer
|
|
314
|
-
Parser p(Parser::from_c_str(contents, *this, pstate));
|
|
357
|
+
Parser p(Parser::from_c_str(contents, *this, traces, pstate));
|
|
315
358
|
// do not yet dispose these buffers
|
|
316
359
|
sass_import_take_source(import);
|
|
317
360
|
sass_import_take_srcmap(import);
|
|
@@ -326,7 +369,15 @@ namespace Sass {
|
|
|
326
369
|
ast_pair(inc.abs_path, { res, root });
|
|
327
370
|
// register resulting resource
|
|
328
371
|
sheets.insert(ast_pair);
|
|
372
|
+
}
|
|
329
373
|
|
|
374
|
+
// register include with resolved path and its content
|
|
375
|
+
// memory of the resources will be freed by us on exit
|
|
376
|
+
void Context::register_resource(const Include& inc, const Resource& res, ParserState& prstate)
|
|
377
|
+
{
|
|
378
|
+
traces.push_back(Backtrace(prstate));
|
|
379
|
+
register_resource(inc, res);
|
|
380
|
+
traces.pop_back();
|
|
330
381
|
}
|
|
331
382
|
|
|
332
383
|
// Add a new import to the context (called from `import_url`)
|
|
@@ -346,19 +397,27 @@ namespace Sass {
|
|
|
346
397
|
for (size_t i = 0, L = resolved.size(); i < L; ++i)
|
|
347
398
|
{ msg_stream << " " << resolved[i].imp_path << "\n"; }
|
|
348
399
|
msg_stream << "Please delete or rename all but one of these files." << "\n";
|
|
349
|
-
error(msg_stream.str(), pstate);
|
|
400
|
+
error(msg_stream.str(), pstate, traces);
|
|
350
401
|
}
|
|
351
402
|
|
|
352
403
|
// process the resolved entry
|
|
353
404
|
else if (resolved.size() == 1) {
|
|
354
405
|
bool use_cache = c_importers.size() == 0;
|
|
406
|
+
if (resolved[0].deprecated) {
|
|
407
|
+
// emit deprecation warning when import resolves to a .css file
|
|
408
|
+
deprecated(
|
|
409
|
+
"Including .css files with @import is non-standard behaviour which will be removed in future versions of LibSass.",
|
|
410
|
+
"Use a custom importer to maintain this behaviour. Check your implementations documentation on how to create a custom importer.",
|
|
411
|
+
true, pstate
|
|
412
|
+
);
|
|
413
|
+
}
|
|
355
414
|
// use cache for the resource loading
|
|
356
415
|
if (use_cache && sheets.count(resolved[0].abs_path)) return resolved[0];
|
|
357
416
|
// try to read the content of the resolved file entry
|
|
358
417
|
// the memory buffer returned must be freed by us!
|
|
359
418
|
if (char* contents = read_file(resolved[0].abs_path)) {
|
|
360
419
|
// register the newly resolved file resource
|
|
361
|
-
register_resource(resolved[0], { contents, 0 },
|
|
420
|
+
register_resource(resolved[0], { contents, 0 }, pstate);
|
|
362
421
|
// return resolved entry
|
|
363
422
|
return resolved[0];
|
|
364
423
|
}
|
|
@@ -391,15 +450,15 @@ namespace Sass {
|
|
|
391
450
|
String_Constant_Ptr loc = SASS_MEMORY_NEW(String_Constant, pstate, unquote(load_path));
|
|
392
451
|
Argument_Obj loc_arg = SASS_MEMORY_NEW(Argument, pstate, loc);
|
|
393
452
|
Arguments_Obj loc_args = SASS_MEMORY_NEW(Arguments, pstate);
|
|
394
|
-
loc_args->append(
|
|
395
|
-
Function_Call_Ptr new_url = SASS_MEMORY_NEW(Function_Call, pstate, "url",
|
|
453
|
+
loc_args->append(loc_arg);
|
|
454
|
+
Function_Call_Ptr new_url = SASS_MEMORY_NEW(Function_Call, pstate, "url", loc_args);
|
|
396
455
|
imp->urls().push_back(new_url);
|
|
397
456
|
}
|
|
398
457
|
else {
|
|
399
458
|
const Importer importer(imp_path, ctx_path);
|
|
400
459
|
Include include(load_import(importer, pstate));
|
|
401
460
|
if (include.abs_path.empty()) {
|
|
402
|
-
error("File to import not found or unreadable: " + imp_path + "
|
|
461
|
+
error("File to import not found or unreadable: " + imp_path + ".", pstate, traces);
|
|
403
462
|
}
|
|
404
463
|
imp->incs().push_back(include);
|
|
405
464
|
}
|
|
@@ -415,12 +474,12 @@ namespace Sass {
|
|
|
415
474
|
// need one correct import
|
|
416
475
|
bool has_import = false;
|
|
417
476
|
// process all custom importers (or custom headers)
|
|
418
|
-
for (Sass_Importer_Entry&
|
|
477
|
+
for (Sass_Importer_Entry& importer_ent : importers) {
|
|
419
478
|
// int priority = sass_importer_get_priority(importer);
|
|
420
|
-
Sass_Importer_Fn fn = sass_importer_get_function(
|
|
479
|
+
Sass_Importer_Fn fn = sass_importer_get_function(importer_ent);
|
|
421
480
|
// skip importer if it returns NULL
|
|
422
481
|
if (Sass_Import_List includes =
|
|
423
|
-
fn(load_path.c_str(),
|
|
482
|
+
fn(load_path.c_str(), importer_ent, c_compiler)
|
|
424
483
|
) {
|
|
425
484
|
// get c pointer copy to iterate over
|
|
426
485
|
Sass_Import_List it_includes = includes;
|
|
@@ -435,18 +494,18 @@ namespace Sass {
|
|
|
435
494
|
// create the importer struct
|
|
436
495
|
Importer importer(uniq_path, ctx_path);
|
|
437
496
|
// query data from the current include
|
|
438
|
-
Sass_Import_Entry
|
|
439
|
-
char* source = sass_import_take_source(
|
|
440
|
-
char* srcmap = sass_import_take_srcmap(
|
|
441
|
-
size_t line = sass_import_get_error_line(
|
|
442
|
-
size_t column = sass_import_get_error_column(
|
|
443
|
-
const char *abs_path = sass_import_get_abs_path(
|
|
497
|
+
Sass_Import_Entry include_ent = *it_includes;
|
|
498
|
+
char* source = sass_import_take_source(include_ent);
|
|
499
|
+
char* srcmap = sass_import_take_srcmap(include_ent);
|
|
500
|
+
size_t line = sass_import_get_error_line(include_ent);
|
|
501
|
+
size_t column = sass_import_get_error_column(include_ent);
|
|
502
|
+
const char *abs_path = sass_import_get_abs_path(include_ent);
|
|
444
503
|
// handle error message passed back from custom importer
|
|
445
504
|
// it may (or may not) override the line and column info
|
|
446
|
-
if (const char* err_message = sass_import_get_error_message(
|
|
447
|
-
if (source || srcmap) register_resource({ importer, uniq_path }, { source, srcmap },
|
|
448
|
-
if (line == std::string::npos && column == std::string::npos) error(err_message, pstate);
|
|
449
|
-
else error(err_message, ParserState(ctx_path, source, Position(line, column)));
|
|
505
|
+
if (const char* err_message = sass_import_get_error_message(include_ent)) {
|
|
506
|
+
if (source || srcmap) register_resource({ importer, uniq_path }, { source, srcmap }, pstate);
|
|
507
|
+
if (line == std::string::npos && column == std::string::npos) error(err_message, pstate, traces);
|
|
508
|
+
else error(err_message, ParserState(ctx_path, source, Position(line, column)), traces);
|
|
450
509
|
}
|
|
451
510
|
// content for import was set
|
|
452
511
|
else if (source) {
|
|
@@ -458,7 +517,7 @@ namespace Sass {
|
|
|
458
517
|
// attach information to AST node
|
|
459
518
|
imp->incs().push_back(include);
|
|
460
519
|
// register the resource buffers
|
|
461
|
-
register_resource(include, { source, srcmap },
|
|
520
|
+
register_resource(include, { source, srcmap }, pstate);
|
|
462
521
|
}
|
|
463
522
|
// only a path was retuned
|
|
464
523
|
// try to load it like normal
|
|
@@ -528,11 +587,11 @@ namespace Sass {
|
|
|
528
587
|
Import_Obj imp = SASS_MEMORY_NEW(Import, pstate);
|
|
529
588
|
// dispatch headers which will add custom functions
|
|
530
589
|
// custom headers are added to the import instance
|
|
531
|
-
call_headers(entry_path, ctx_path, pstate,
|
|
590
|
+
call_headers(entry_path, ctx_path, pstate, imp);
|
|
532
591
|
// increase head count to skip later
|
|
533
592
|
head_imports += resources.size() - 1;
|
|
534
593
|
// add the statement if we have urls
|
|
535
|
-
if (!imp->urls().empty()) root->append(
|
|
594
|
+
if (!imp->urls().empty()) root->append(imp);
|
|
536
595
|
// process all other resources (add Import_Stub nodes)
|
|
537
596
|
for (size_t i = 0, S = imp->incs().size(); i < S; ++i) {
|
|
538
597
|
root->append(SASS_MEMORY_NEW(Import_Stub, pstate, imp->incs()[i]));
|
|
@@ -644,30 +703,33 @@ namespace Sass {
|
|
|
644
703
|
for (size_t i = 0, S = c_functions.size(); i < S; ++i)
|
|
645
704
|
{ register_c_function(*this, &global, c_functions[i]); }
|
|
646
705
|
// create initial backtrace entry
|
|
647
|
-
Backtrace backtrace(0, ParserState("", 0), "");
|
|
648
706
|
// create crtp visitor objects
|
|
649
|
-
Expand expand(*this, &global
|
|
650
|
-
Cssize cssize(*this
|
|
707
|
+
Expand expand(*this, &global);
|
|
708
|
+
Cssize cssize(*this);
|
|
651
709
|
CheckNesting check_nesting;
|
|
652
|
-
// check nesting
|
|
653
|
-
|
|
710
|
+
// check nesting in all files
|
|
711
|
+
for (auto sheet : sheets) {
|
|
712
|
+
auto styles = sheet.second;
|
|
713
|
+
check_nesting(styles.root);
|
|
714
|
+
}
|
|
654
715
|
// expand and eval the tree
|
|
655
|
-
root = expand(
|
|
716
|
+
root = expand(root);
|
|
656
717
|
// check nesting
|
|
657
|
-
check_nesting(
|
|
718
|
+
check_nesting(root);
|
|
658
719
|
// merge and bubble certain rules
|
|
659
|
-
root = cssize(
|
|
720
|
+
root = cssize(root);
|
|
660
721
|
// should we extend something?
|
|
661
722
|
if (!subset_map.empty()) {
|
|
662
723
|
// create crtp visitor object
|
|
663
|
-
Extend extend(
|
|
724
|
+
Extend extend(subset_map);
|
|
725
|
+
extend.setEval(expand.eval);
|
|
664
726
|
// extend tree nodes
|
|
665
|
-
extend(
|
|
727
|
+
extend(root);
|
|
666
728
|
}
|
|
667
729
|
|
|
668
730
|
// clean up by removing empty placeholders
|
|
669
731
|
// ToDo: maybe we can do this somewhere else?
|
|
670
|
-
Remove_Placeholders remove_placeholders
|
|
732
|
+
Remove_Placeholders remove_placeholders;
|
|
671
733
|
root->perform(&remove_placeholders);
|
|
672
734
|
// return processed tree
|
|
673
735
|
return root;
|
|
@@ -695,10 +757,8 @@ namespace Sass {
|
|
|
695
757
|
char* Context::render_srcmap()
|
|
696
758
|
{
|
|
697
759
|
if (source_map_file == "") return 0;
|
|
698
|
-
char* result = 0;
|
|
699
760
|
std::string map = emitter.render_srcmap(*this);
|
|
700
|
-
|
|
701
|
-
return result;
|
|
761
|
+
return sass_copy_c_string(map.c_str());
|
|
702
762
|
}
|
|
703
763
|
|
|
704
764
|
|
|
@@ -810,6 +870,7 @@ namespace Sass {
|
|
|
810
870
|
register_function(ctx, append_sig, append, env);
|
|
811
871
|
register_function(ctx, zip_sig, zip, env);
|
|
812
872
|
register_function(ctx, list_separator_sig, list_separator, env);
|
|
873
|
+
register_function(ctx, is_bracketed_sig, is_bracketed, env);
|
|
813
874
|
// Map Functions
|
|
814
875
|
register_function(ctx, map_get_sig, map_get, env);
|
|
815
876
|
register_function(ctx, map_merge_sig, map_merge, env);
|
|
@@ -829,6 +890,8 @@ namespace Sass {
|
|
|
829
890
|
register_function(ctx, mixin_exists_sig, mixin_exists, env);
|
|
830
891
|
register_function(ctx, feature_exists_sig, feature_exists, env);
|
|
831
892
|
register_function(ctx, call_sig, call, env);
|
|
893
|
+
register_function(ctx, content_exists_sig, content_exists, env);
|
|
894
|
+
register_function(ctx, get_function_sig, get_function, env);
|
|
832
895
|
// Boolean Functions
|
|
833
896
|
register_function(ctx, not_sig, sass_not, env);
|
|
834
897
|
register_function(ctx, if_sig, sass_if, env);
|