sassc 1.11.4 → 1.12.0
Sign up to get free protection for your applications and to get access to all the features.
- 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);
|