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
|
@@ -46,7 +46,7 @@ namespace Sass {
|
|
|
46
46
|
src = exactly<beg>(src);
|
|
47
47
|
if (!src) return 0;
|
|
48
48
|
const char* stop;
|
|
49
|
-
while (
|
|
49
|
+
while (true) {
|
|
50
50
|
if (!*src) return 0;
|
|
51
51
|
stop = exactly<end>(src);
|
|
52
52
|
if (stop && (!esc || *(src - 1) != '\\')) return stop;
|
|
@@ -139,7 +139,7 @@ namespace Sass {
|
|
|
139
139
|
src = exactly<beg>(src);
|
|
140
140
|
if (!src) return 0;
|
|
141
141
|
const char* stop;
|
|
142
|
-
while (
|
|
142
|
+
while (true) {
|
|
143
143
|
if (!*src) return 0;
|
|
144
144
|
stop = exactly<end>(src);
|
|
145
145
|
if (stop && (!esc || *(src - 1) != '\\')) return stop;
|
|
@@ -264,7 +264,6 @@ namespace Sass {
|
|
|
264
264
|
const char* kwd_while_directive(const char* src);
|
|
265
265
|
|
|
266
266
|
const char* re_nothing(const char* src);
|
|
267
|
-
const char* re_type_selector2(const char* src);
|
|
268
267
|
|
|
269
268
|
const char* re_special_fun(const char* src);
|
|
270
269
|
|
|
@@ -355,6 +354,10 @@ namespace Sass {
|
|
|
355
354
|
const char* ie_keyword_arg_value(const char* src);
|
|
356
355
|
const char* ie_keyword_arg_property(const char* src);
|
|
357
356
|
|
|
357
|
+
// characters that terminate parsing of a list
|
|
358
|
+
const char* list_terminator(const char* src);
|
|
359
|
+
const char* space_list_terminator(const char* src);
|
|
360
|
+
|
|
358
361
|
// match url()
|
|
359
362
|
const char* H(const char* src);
|
|
360
363
|
const char* W(const char* src);
|
|
@@ -362,6 +365,7 @@ namespace Sass {
|
|
|
362
365
|
const char* UUNICODE(const char* src);
|
|
363
366
|
const char* NONASCII(const char* src);
|
|
364
367
|
const char* ESCAPE(const char* src);
|
|
368
|
+
const char* real_uri(const char* src);
|
|
365
369
|
const char* real_uri_suffix(const char* src);
|
|
366
370
|
// const char* real_uri_prefix(const char* src);
|
|
367
371
|
const char* real_uri_value(const char* src);
|
|
@@ -376,6 +380,9 @@ namespace Sass {
|
|
|
376
380
|
const char* static_property(const char* src);
|
|
377
381
|
const char* static_value(const char* src);
|
|
378
382
|
|
|
383
|
+
const char* css_variable_value(const char* src);
|
|
384
|
+
const char* css_variable_top_level_value(const char* src);
|
|
385
|
+
|
|
379
386
|
// Utility functions for finding and counting characters in a string.
|
|
380
387
|
template<char c>
|
|
381
388
|
const char* find_first(const char* src) {
|
|
@@ -6,13 +6,12 @@
|
|
|
6
6
|
|
|
7
7
|
namespace Sass {
|
|
8
8
|
|
|
9
|
-
Remove_Placeholders::Remove_Placeholders(
|
|
10
|
-
: ctx(ctx)
|
|
9
|
+
Remove_Placeholders::Remove_Placeholders()
|
|
11
10
|
{ }
|
|
12
11
|
|
|
13
12
|
void Remove_Placeholders::operator()(Block_Ptr b) {
|
|
14
13
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
|
15
|
-
Statement_Ptr st =
|
|
14
|
+
Statement_Ptr st = b->at(i);
|
|
16
15
|
st->perform(this);
|
|
17
16
|
}
|
|
18
17
|
}
|
|
@@ -34,19 +33,19 @@ namespace Sass {
|
|
|
34
33
|
|
|
35
34
|
void Remove_Placeholders::operator()(Ruleset_Ptr r) {
|
|
36
35
|
// Create a new selector group without placeholders
|
|
37
|
-
Selector_List_Obj sl =
|
|
36
|
+
Selector_List_Obj sl = Cast<Selector_List>(r->selector());
|
|
38
37
|
|
|
39
38
|
if (sl) {
|
|
40
39
|
// Set the new placeholder selector list
|
|
41
|
-
r->selector(remove_placeholders(
|
|
40
|
+
r->selector(remove_placeholders(sl));
|
|
42
41
|
// Remove placeholders in wrapped selectors
|
|
43
42
|
for (Complex_Selector_Obj cs : sl->elements()) {
|
|
44
43
|
while (cs) {
|
|
45
44
|
if (cs->head()) {
|
|
46
45
|
for (Simple_Selector_Obj& ss : cs->head()->elements()) {
|
|
47
|
-
if (Wrapped_Selector_Ptr ws =
|
|
48
|
-
if (Selector_List_Ptr
|
|
49
|
-
Selector_List_Ptr clean = remove_placeholders(
|
|
46
|
+
if (Wrapped_Selector_Ptr ws = Cast<Wrapped_Selector>(ss)) {
|
|
47
|
+
if (Selector_List_Ptr wsl = Cast<Selector_List>(ws->selector())) {
|
|
48
|
+
Selector_List_Ptr clean = remove_placeholders(wsl);
|
|
50
49
|
// also clean superflous parent selectors
|
|
51
50
|
// probably not really the correct place
|
|
52
51
|
clean->remove_parent_selectors();
|
|
@@ -72,10 +71,10 @@ namespace Sass {
|
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
void Remove_Placeholders::operator()(Media_Block_Ptr m) {
|
|
75
|
-
operator()(
|
|
74
|
+
operator()(m->block());
|
|
76
75
|
}
|
|
77
76
|
void Remove_Placeholders::operator()(Supports_Block_Ptr m) {
|
|
78
|
-
operator()(
|
|
77
|
+
operator()(m->block());
|
|
79
78
|
}
|
|
80
79
|
|
|
81
80
|
void Remove_Placeholders::operator()(Directive_Ptr a) {
|
|
@@ -9,19 +9,15 @@
|
|
|
9
9
|
namespace Sass {
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
class Context;
|
|
13
|
-
|
|
14
12
|
class Remove_Placeholders : public Operation_CRTP<void, Remove_Placeholders> {
|
|
15
13
|
|
|
16
|
-
Context& ctx;
|
|
17
|
-
|
|
18
14
|
void fallback_impl(AST_Node_Ptr n) {}
|
|
19
15
|
|
|
20
16
|
public:
|
|
21
17
|
Selector_List_Ptr remove_placeholders(Selector_List_Ptr);
|
|
22
18
|
|
|
23
19
|
public:
|
|
24
|
-
Remove_Placeholders(
|
|
20
|
+
Remove_Placeholders();
|
|
25
21
|
~Remove_Placeholders() { }
|
|
26
22
|
|
|
27
23
|
void operator()(Block_Ptr);
|
data/ext/libsass/src/sass.cpp
CHANGED
|
@@ -7,6 +7,23 @@
|
|
|
7
7
|
#include "sass.h"
|
|
8
8
|
#include "file.hpp"
|
|
9
9
|
#include "util.hpp"
|
|
10
|
+
#include "sass_context.hpp"
|
|
11
|
+
#include "sass_functions.hpp"
|
|
12
|
+
|
|
13
|
+
namespace Sass {
|
|
14
|
+
|
|
15
|
+
// helper to convert string list to vector
|
|
16
|
+
std::vector<std::string> list2vec(struct string_list* cur)
|
|
17
|
+
{
|
|
18
|
+
std::vector<std::string> list;
|
|
19
|
+
while (cur) {
|
|
20
|
+
list.push_back(cur->string);
|
|
21
|
+
cur = cur->next;
|
|
22
|
+
}
|
|
23
|
+
return list;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
}
|
|
10
27
|
|
|
11
28
|
extern "C" {
|
|
12
29
|
using namespace Sass;
|
|
@@ -16,8 +33,10 @@ extern "C" {
|
|
|
16
33
|
void* ADDCALL sass_alloc_memory(size_t size)
|
|
17
34
|
{
|
|
18
35
|
void* ptr = malloc(size);
|
|
19
|
-
if (ptr == NULL)
|
|
20
|
-
|
|
36
|
+
if (ptr == NULL) {
|
|
37
|
+
std::cerr << "Out of memory.\n";
|
|
38
|
+
exit(EXIT_FAILURE);
|
|
39
|
+
}
|
|
21
40
|
return ptr;
|
|
22
41
|
}
|
|
23
42
|
|
|
@@ -49,11 +68,50 @@ extern "C" {
|
|
|
49
68
|
return sass_copy_c_string(unquoted.c_str());
|
|
50
69
|
}
|
|
51
70
|
|
|
71
|
+
char* ADDCALL sass_compiler_find_include (const char* file, struct Sass_Compiler* compiler)
|
|
72
|
+
{
|
|
73
|
+
// get the last import entry to get current base directory
|
|
74
|
+
Sass_Import_Entry import = sass_compiler_get_last_import(compiler);
|
|
75
|
+
const std::vector<std::string>& incs = compiler->cpp_ctx->include_paths;
|
|
76
|
+
// create the vector with paths to lookup
|
|
77
|
+
std::vector<std::string> paths(1 + incs.size());
|
|
78
|
+
paths.push_back(File::dir_name(import->abs_path));
|
|
79
|
+
paths.insert( paths.end(), incs.begin(), incs.end() );
|
|
80
|
+
// now resolve the file path relative to lookup paths
|
|
81
|
+
std::string resolved(File::find_include(file, paths));
|
|
82
|
+
return sass_copy_c_string(resolved.c_str());
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
char* ADDCALL sass_compiler_find_file (const char* file, struct Sass_Compiler* compiler)
|
|
86
|
+
{
|
|
87
|
+
// get the last import entry to get current base directory
|
|
88
|
+
Sass_Import_Entry import = sass_compiler_get_last_import(compiler);
|
|
89
|
+
const std::vector<std::string>& incs = compiler->cpp_ctx->include_paths;
|
|
90
|
+
// create the vector with paths to lookup
|
|
91
|
+
std::vector<std::string> paths(1 + incs.size());
|
|
92
|
+
paths.push_back(File::dir_name(import->abs_path));
|
|
93
|
+
paths.insert( paths.end(), incs.begin(), incs.end() );
|
|
94
|
+
// now resolve the file path relative to lookup paths
|
|
95
|
+
std::string resolved(File::find_file(file, paths));
|
|
96
|
+
return sass_copy_c_string(resolved.c_str());
|
|
97
|
+
}
|
|
98
|
+
|
|
52
99
|
// Make sure to free the returned value!
|
|
53
100
|
// Incs array has to be null terminated!
|
|
54
|
-
|
|
101
|
+
// this has the original resolve logic for sass include
|
|
102
|
+
char* ADDCALL sass_find_include (const char* file, struct Sass_Options* opt)
|
|
55
103
|
{
|
|
56
|
-
std::string
|
|
104
|
+
std::vector<std::string> vec(list2vec(opt->include_paths));
|
|
105
|
+
std::string resolved(File::find_include(file, vec));
|
|
106
|
+
return sass_copy_c_string(resolved.c_str());
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Make sure to free the returned value!
|
|
110
|
+
// Incs array has to be null terminated!
|
|
111
|
+
char* ADDCALL sass_find_file (const char* file, struct Sass_Options* opt)
|
|
112
|
+
{
|
|
113
|
+
std::vector<std::string> vec(list2vec(opt->include_paths));
|
|
114
|
+
std::string resolved(File::find_file(file, vec));
|
|
57
115
|
return sass_copy_c_string(resolved.c_str());
|
|
58
116
|
}
|
|
59
117
|
|
data/ext/libsass/src/sass.hpp
CHANGED
|
@@ -90,10 +90,13 @@ struct Sass_Inspect_Options {
|
|
|
90
90
|
// Precision for fractional numbers
|
|
91
91
|
int precision;
|
|
92
92
|
|
|
93
|
+
// Do not compress colors in selectors
|
|
94
|
+
bool in_selector;
|
|
95
|
+
|
|
93
96
|
// initialization list (constructor with defaults)
|
|
94
97
|
Sass_Inspect_Options(Sass_Output_Style style = Sass::NESTED,
|
|
95
|
-
int precision = 5)
|
|
96
|
-
: output_style(style), precision(precision)
|
|
98
|
+
int precision = 5, bool in_selector = false)
|
|
99
|
+
: output_style(style), precision(precision), in_selector(in_selector)
|
|
97
100
|
{ }
|
|
98
101
|
|
|
99
102
|
};
|
|
@@ -35,7 +35,6 @@ namespace Sass {
|
|
|
35
35
|
catch (Exception::Base& e) {
|
|
36
36
|
std::stringstream msg_stream;
|
|
37
37
|
std::string cwd(Sass::File::get_cwd());
|
|
38
|
-
|
|
39
38
|
std::string msg_prefix(e.errtype());
|
|
40
39
|
bool got_newline = false;
|
|
41
40
|
msg_stream << msg_prefix << ": ";
|
|
@@ -55,41 +54,49 @@ namespace Sass {
|
|
|
55
54
|
++msg;
|
|
56
55
|
}
|
|
57
56
|
if (!got_newline) msg_stream << "\n";
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
std::string rel_path(Sass::File::abs2rel(path, cwd, cwd));
|
|
62
|
-
msg_stream << std::string(msg_prefix.size() + 2, ' ');
|
|
63
|
-
msg_stream << (i == 1 ? " on line " : " from line ");
|
|
64
|
-
msg_stream << e.pstate.line + 1 << " of " << rel_path << "\n";
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
57
|
+
|
|
58
|
+
if (e.traces.empty()) {
|
|
59
|
+
// we normally should have some traces, still here as a fallback
|
|
68
60
|
std::string rel_path(Sass::File::abs2rel(e.pstate.path, cwd, cwd));
|
|
69
61
|
msg_stream << std::string(msg_prefix.size() + 2, ' ');
|
|
70
62
|
msg_stream << " on line " << e.pstate.line + 1 << " of " << rel_path << "\n";
|
|
71
63
|
}
|
|
64
|
+
else {
|
|
65
|
+
std::string rel_path(Sass::File::abs2rel(e.pstate.path, cwd, cwd));
|
|
66
|
+
msg_stream << traces_to_string(e.traces, " ");
|
|
67
|
+
}
|
|
72
68
|
|
|
73
69
|
// now create the code trace (ToDo: maybe have util functions?)
|
|
74
70
|
if (e.pstate.line != std::string::npos && e.pstate.column != std::string::npos) {
|
|
75
|
-
size_t
|
|
71
|
+
size_t lines = e.pstate.line;
|
|
76
72
|
const char* line_beg = e.pstate.src;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
// scan through src until target line
|
|
74
|
+
// move line_beg pointer to line start
|
|
75
|
+
while (line_beg && *line_beg && lines != 0) {
|
|
76
|
+
if (*line_beg == '\n') --lines;
|
|
77
|
+
utf8::unchecked::next(line_beg);
|
|
80
78
|
}
|
|
81
79
|
const char* line_end = line_beg;
|
|
80
|
+
// move line_end before next newline character
|
|
82
81
|
while (line_end && *line_end && *line_end != '\n') {
|
|
83
82
|
if (*line_end == '\n') break;
|
|
84
83
|
if (*line_end == '\r') break;
|
|
85
|
-
line_end
|
|
84
|
+
utf8::unchecked::next(line_end);
|
|
86
85
|
}
|
|
87
|
-
|
|
88
|
-
size_t
|
|
89
|
-
size_t
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
86
|
+
if (line_end && *line_end != 0) ++ line_end;
|
|
87
|
+
size_t line_len = line_end - line_beg;
|
|
88
|
+
size_t move_in = 0; size_t shorten = 0;
|
|
89
|
+
size_t left_chars = 42; size_t max_chars = 76;
|
|
90
|
+
// reported excerpt should not exceed `max_chars` chars
|
|
91
|
+
if (e.pstate.column > line_len) left_chars = e.pstate.column;
|
|
92
|
+
if (e.pstate.column > left_chars) move_in = e.pstate.column - left_chars;
|
|
93
|
+
if (line_len > max_chars + move_in) shorten = line_len - move_in - max_chars;
|
|
94
|
+
utf8::advance(line_beg, move_in, line_end);
|
|
95
|
+
utf8::retreat(line_end, shorten, line_beg);
|
|
96
|
+
std::string sanitized; std::string marker(e.pstate.column - move_in, '-');
|
|
97
|
+
utf8::replace_invalid(line_beg, line_end, std::back_inserter(sanitized));
|
|
98
|
+
msg_stream << ">> " << sanitized << "\n";
|
|
99
|
+
msg_stream << " " << marker << "^\n";
|
|
93
100
|
}
|
|
94
101
|
|
|
95
102
|
JsonNode* json_err = json_mkobject();
|
|
@@ -199,7 +206,6 @@ namespace Sass {
|
|
|
199
206
|
static int handle_errors(Sass_Context* c_ctx) {
|
|
200
207
|
try { return handle_error(c_ctx); }
|
|
201
208
|
catch (...) { return handle_error(c_ctx); }
|
|
202
|
-
return c_ctx->error_status;
|
|
203
209
|
}
|
|
204
210
|
|
|
205
211
|
static Block_Obj sass_parse_block(Sass_Compiler* compiler) throw()
|
|
@@ -272,10 +278,14 @@ extern "C" {
|
|
|
272
278
|
#define IMPLEMENT_SASS_OPTION_ACCESSOR(type, option) \
|
|
273
279
|
type ADDCALL sass_option_get_##option (struct Sass_Options* options) { return options->option; } \
|
|
274
280
|
void ADDCALL sass_option_set_##option (struct Sass_Options* options, type option) { options->option = option; }
|
|
275
|
-
#define
|
|
276
|
-
type ADDCALL sass_option_get_##option (struct Sass_Options* options) { return safe_str(options->option, def); }
|
|
281
|
+
#define IMPLEMENT_SASS_OPTION_STRING_GETTER(type, option, def) \
|
|
282
|
+
type ADDCALL sass_option_get_##option (struct Sass_Options* options) { return safe_str(options->option, def); }
|
|
283
|
+
#define IMPLEMENT_SASS_OPTION_STRING_SETTER(type, option, def) \
|
|
277
284
|
void ADDCALL sass_option_set_##option (struct Sass_Options* options, type option) \
|
|
278
285
|
{ free(options->option); options->option = option || def ? sass_copy_c_string(option ? option : def) : 0; }
|
|
286
|
+
#define IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(type, option, def) \
|
|
287
|
+
IMPLEMENT_SASS_OPTION_STRING_GETTER(type, option, def) \
|
|
288
|
+
IMPLEMENT_SASS_OPTION_STRING_SETTER(type, option, def)
|
|
279
289
|
|
|
280
290
|
#define IMPLEMENT_SASS_CONTEXT_GETTER(type, option) \
|
|
281
291
|
type ADDCALL sass_context_get_##option (struct Sass_Context* ctx) { return ctx->option; }
|
|
@@ -327,7 +337,9 @@ extern "C" {
|
|
|
327
337
|
c_ctx->error_column = std::string::npos;
|
|
328
338
|
|
|
329
339
|
// allocate a new compiler instance
|
|
330
|
-
|
|
340
|
+
void* ctxmem = calloc(1, sizeof(struct Sass_Compiler));
|
|
341
|
+
if (ctxmem == 0) { std::cerr << "Error allocating memory for context" << std::endl; return 0; }
|
|
342
|
+
Sass_Compiler* compiler = (struct Sass_Compiler*) ctxmem;
|
|
331
343
|
compiler->state = SASS_COMPILER_CREATED;
|
|
332
344
|
|
|
333
345
|
// store in sass compiler
|
|
@@ -468,7 +480,7 @@ extern "C" {
|
|
|
468
480
|
if (compiler->c_ctx->error_status)
|
|
469
481
|
return compiler->c_ctx->error_status;
|
|
470
482
|
// parse the context we have set up (file or data)
|
|
471
|
-
compiler->root =
|
|
483
|
+
compiler->root = sass_parse_block(compiler);
|
|
472
484
|
// success
|
|
473
485
|
return 0;
|
|
474
486
|
}
|
|
@@ -512,36 +524,17 @@ extern "C" {
|
|
|
512
524
|
options->c_headers = 0;
|
|
513
525
|
options->plugin_paths = 0;
|
|
514
526
|
options->include_paths = 0;
|
|
527
|
+
options->extensions = 0;
|
|
515
528
|
}
|
|
516
529
|
|
|
517
530
|
// helper function, not exported, only accessible locally
|
|
518
531
|
static void sass_clear_options (struct Sass_Options* options)
|
|
519
532
|
{
|
|
520
533
|
if (options == 0) return;
|
|
521
|
-
// Deallocate custom functions
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
free(*this_func_data);
|
|
526
|
-
++this_func_data;
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
// Deallocate custom headers
|
|
530
|
-
if (options->c_headers) {
|
|
531
|
-
Sass_Importer_List this_head_data = options->c_headers;
|
|
532
|
-
while (this_head_data && *this_head_data) {
|
|
533
|
-
free(*this_head_data);
|
|
534
|
-
++this_head_data;
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
// Deallocate custom importers
|
|
538
|
-
if (options->c_importers) {
|
|
539
|
-
Sass_Importer_List this_imp_data = options->c_importers;
|
|
540
|
-
while (this_imp_data && *this_imp_data) {
|
|
541
|
-
free(*this_imp_data);
|
|
542
|
-
++this_imp_data;
|
|
543
|
-
}
|
|
544
|
-
}
|
|
534
|
+
// Deallocate custom functions, headers and importes
|
|
535
|
+
sass_delete_function_list(options->c_functions);
|
|
536
|
+
sass_delete_importer_list(options->c_importers);
|
|
537
|
+
sass_delete_importer_list(options->c_headers);
|
|
545
538
|
// Deallocate inc paths
|
|
546
539
|
if (options->plugin_paths) {
|
|
547
540
|
struct string_list* cur;
|
|
@@ -566,6 +559,18 @@ extern "C" {
|
|
|
566
559
|
cur = next;
|
|
567
560
|
}
|
|
568
561
|
}
|
|
562
|
+
// Deallocate extension
|
|
563
|
+
if (options->extensions) {
|
|
564
|
+
struct string_list* cur;
|
|
565
|
+
struct string_list* next;
|
|
566
|
+
cur = options->extensions;
|
|
567
|
+
while (cur) {
|
|
568
|
+
next = cur->next;
|
|
569
|
+
free(cur->string);
|
|
570
|
+
free(cur);
|
|
571
|
+
cur = next;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
569
574
|
// Free options strings
|
|
570
575
|
free(options->input_path);
|
|
571
576
|
free(options->output_path);
|
|
@@ -573,11 +578,6 @@ extern "C" {
|
|
|
573
578
|
free(options->include_path);
|
|
574
579
|
free(options->source_map_file);
|
|
575
580
|
free(options->source_map_root);
|
|
576
|
-
// Free custom functions
|
|
577
|
-
free(options->c_functions);
|
|
578
|
-
// Free custom importers
|
|
579
|
-
free(options->c_importers);
|
|
580
|
-
free(options->c_headers);
|
|
581
581
|
// Reset our pointers
|
|
582
582
|
options->input_path = 0;
|
|
583
583
|
options->output_path = 0;
|
|
@@ -590,6 +590,7 @@ extern "C" {
|
|
|
590
590
|
options->c_headers = 0;
|
|
591
591
|
options->plugin_paths = 0;
|
|
592
592
|
options->include_paths = 0;
|
|
593
|
+
options->extensions = 0;
|
|
593
594
|
}
|
|
594
595
|
|
|
595
596
|
// helper function, not exported, only accessible locally
|
|
@@ -674,6 +675,10 @@ extern "C" {
|
|
|
674
675
|
size_t ADDCALL sass_compiler_get_import_stack_size(struct Sass_Compiler* compiler) { return compiler->cpp_ctx->import_stack.size(); }
|
|
675
676
|
Sass_Import_Entry ADDCALL sass_compiler_get_last_import(struct Sass_Compiler* compiler) { return compiler->cpp_ctx->import_stack.back(); }
|
|
676
677
|
Sass_Import_Entry ADDCALL sass_compiler_get_import_entry(struct Sass_Compiler* compiler, size_t idx) { return compiler->cpp_ctx->import_stack[idx]; }
|
|
678
|
+
// Getters for Sass_Compiler options (query function stack)
|
|
679
|
+
size_t ADDCALL sass_compiler_get_callee_stack_size(struct Sass_Compiler* compiler) { return compiler->cpp_ctx->callee_stack.size(); }
|
|
680
|
+
Sass_Callee_Entry ADDCALL sass_compiler_get_last_callee(struct Sass_Compiler* compiler) { return &compiler->cpp_ctx->callee_stack.back(); }
|
|
681
|
+
Sass_Callee_Entry ADDCALL sass_compiler_get_callee_entry(struct Sass_Compiler* compiler, size_t idx) { return &compiler->cpp_ctx->callee_stack[idx]; }
|
|
677
682
|
|
|
678
683
|
// Calculate the size of the stored null terminated array
|
|
679
684
|
size_t ADDCALL sass_context_get_included_files_size (struct Sass_Context* ctx)
|
|
@@ -693,10 +698,10 @@ extern "C" {
|
|
|
693
698
|
IMPLEMENT_SASS_OPTION_ACCESSOR(Sass_Importer_List, c_headers);
|
|
694
699
|
IMPLEMENT_SASS_OPTION_ACCESSOR(const char*, indent);
|
|
695
700
|
IMPLEMENT_SASS_OPTION_ACCESSOR(const char*, linefeed);
|
|
701
|
+
IMPLEMENT_SASS_OPTION_STRING_SETTER(const char*, plugin_path, 0);
|
|
702
|
+
IMPLEMENT_SASS_OPTION_STRING_SETTER(const char*, include_path, 0);
|
|
696
703
|
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, input_path, 0);
|
|
697
704
|
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, output_path, 0);
|
|
698
|
-
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, plugin_path, 0);
|
|
699
|
-
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, include_path, 0);
|
|
700
705
|
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, source_map_file, 0);
|
|
701
706
|
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, source_map_root, 0);
|
|
702
707
|
|
|
@@ -722,6 +727,22 @@ extern "C" {
|
|
|
722
727
|
IMPLEMENT_SASS_CONTEXT_TAKER(char*, source_map_string);
|
|
723
728
|
IMPLEMENT_SASS_CONTEXT_TAKER(char**, included_files);
|
|
724
729
|
|
|
730
|
+
// Push function for import extenions
|
|
731
|
+
void ADDCALL sass_option_push_import_extension(struct Sass_Options* options, const char* ext)
|
|
732
|
+
{
|
|
733
|
+
struct string_list* extension = (struct string_list*) calloc(1, sizeof(struct string_list));
|
|
734
|
+
if (extension == 0) return;
|
|
735
|
+
extension->string = ext ? sass_copy_c_string(ext) : 0;
|
|
736
|
+
struct string_list* last = options->extensions;
|
|
737
|
+
if (!options->extensions) {
|
|
738
|
+
options->extensions = extension;
|
|
739
|
+
} else {
|
|
740
|
+
while (last->next)
|
|
741
|
+
last = last->next;
|
|
742
|
+
last->next = extension;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
|
|
725
746
|
// Push function for include paths (no manipulation support for now)
|
|
726
747
|
void ADDCALL sass_option_push_include_path(struct Sass_Options* options, const char* path)
|
|
727
748
|
{
|
|
@@ -740,6 +761,23 @@ extern "C" {
|
|
|
740
761
|
|
|
741
762
|
}
|
|
742
763
|
|
|
764
|
+
// Push function for include paths (no manipulation support for now)
|
|
765
|
+
size_t ADDCALL sass_option_get_include_path_size(struct Sass_Options* options)
|
|
766
|
+
{
|
|
767
|
+
size_t len = 0;
|
|
768
|
+
struct string_list* cur = options->include_paths;
|
|
769
|
+
while (cur) { len ++; cur = cur->next; }
|
|
770
|
+
return len;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
// Push function for include paths (no manipulation support for now)
|
|
774
|
+
const char* ADDCALL sass_option_get_include_path(struct Sass_Options* options, size_t i)
|
|
775
|
+
{
|
|
776
|
+
struct string_list* cur = options->include_paths;
|
|
777
|
+
while (i) { i--; cur = cur->next; }
|
|
778
|
+
return cur->string;
|
|
779
|
+
}
|
|
780
|
+
|
|
743
781
|
// Push function for plugin paths (no manipulation support for now)
|
|
744
782
|
void ADDCALL sass_option_push_plugin_path(struct Sass_Options* options, const char* path)
|
|
745
783
|
{
|