sassc 1.8.1 → 1.8.2
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/README.md +3 -1
- data/ext/libsass/Makefile +10 -6
- data/ext/libsass/Readme.md +4 -4
- data/ext/libsass/appveyor.yml +16 -1
- data/ext/libsass/docs/README.md +1 -1
- data/ext/libsass/docs/api-context-example.md +1 -1
- data/ext/libsass/docs/api-context.md +1 -1
- data/ext/libsass/docs/api-doc.md +1 -1
- data/ext/libsass/docs/api-function-example.md +12 -3
- data/ext/libsass/docs/api-function-internal.md +4 -4
- data/ext/libsass/docs/api-function.md +15 -13
- data/ext/libsass/docs/api-importer-internal.md +9 -4
- data/ext/libsass/docs/api-value.md +1 -1
- data/ext/libsass/docs/build-shared-library.md +3 -3
- data/ext/libsass/docs/custom-functions-internal.md +1 -1
- data/ext/libsass/docs/{plugins.go → plugins.md} +0 -0
- data/ext/libsass/script/ci-build-libsass +25 -36
- data/ext/libsass/script/ci-install-deps +3 -8
- data/ext/libsass/script/ci-report-coverage +17 -13
- data/ext/libsass/src/ast.cpp +102 -7
- data/ext/libsass/src/ast.hpp +53 -27
- data/ext/libsass/src/ast_def_macros.hpp +8 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +3 -2
- data/ext/libsass/src/backtrace.hpp +1 -1
- data/ext/libsass/src/bind.cpp +28 -17
- data/ext/libsass/src/bind.hpp +1 -1
- data/ext/libsass/src/context.cpp +441 -184
- data/ext/libsass/src/context.hpp +79 -82
- data/ext/libsass/src/debugger.hpp +3 -1
- data/ext/libsass/src/emitter.cpp +18 -17
- data/ext/libsass/src/emitter.hpp +5 -2
- data/ext/libsass/src/error_handling.cpp +78 -7
- data/ext/libsass/src/error_handling.hpp +50 -9
- data/ext/libsass/src/eval.cpp +100 -36
- data/ext/libsass/src/eval.hpp +5 -5
- data/ext/libsass/src/expand.cpp +32 -3
- data/ext/libsass/src/extend.cpp +1 -1
- data/ext/libsass/src/file.cpp +39 -27
- data/ext/libsass/src/file.hpp +67 -13
- data/ext/libsass/src/functions.cpp +39 -32
- data/ext/libsass/src/inspect.cpp +21 -21
- data/ext/libsass/src/json.cpp +1 -1
- data/ext/libsass/src/lexer.hpp +33 -4
- data/ext/libsass/src/output.cpp +11 -11
- data/ext/libsass/src/parser.cpp +28 -130
- data/ext/libsass/src/parser.hpp +0 -4
- data/ext/libsass/src/prelexer.cpp +8 -5
- data/ext/libsass/src/prelexer.hpp +1 -3
- data/ext/libsass/src/sass_context.cpp +52 -241
- data/ext/libsass/src/sass_context.hpp +156 -0
- data/ext/libsass/src/sass_functions.cpp +1 -26
- data/ext/libsass/src/sass_functions.hpp +32 -0
- data/ext/libsass/src/sass_interface.cpp +14 -48
- data/ext/libsass/src/sass_values.cpp +3 -77
- data/ext/libsass/src/sass_values.hpp +81 -0
- data/ext/libsass/src/source_map.cpp +7 -7
- data/ext/libsass/src/source_map.hpp +1 -4
- data/ext/libsass/src/to_string.cpp +4 -3
- data/ext/libsass/src/to_string.hpp +2 -1
- data/ext/libsass/src/util.cpp +34 -16
- data/ext/libsass/src/util.hpp +10 -8
- data/lib/sassc/version.rb +1 -1
- data/lib/tasks/libsass.rb +1 -1
- data/test/custom_importer_test.rb +6 -4
- data/test/engine_test.rb +5 -3
- data/test/functions_test.rb +1 -0
- data/test/native_test.rb +1 -1
- metadata +6 -4
- data/ext/libsass/script/coveralls-debug +0 -32
@@ -15,6 +15,7 @@ namespace Sass {
|
|
15
15
|
// Match Sass boolean keywords.
|
16
16
|
const char* kwd_true(const char* src);
|
17
17
|
const char* kwd_false(const char* src);
|
18
|
+
const char* kwd_only(const char* src);
|
18
19
|
const char* kwd_and(const char* src);
|
19
20
|
const char* kwd_or(const char* src);
|
20
21
|
const char* kwd_not(const char* src);
|
@@ -337,9 +338,6 @@ namespace Sass {
|
|
337
338
|
const char* ie_keyword_arg_value(const char* src);
|
338
339
|
const char* ie_keyword_arg_property(const char* src);
|
339
340
|
|
340
|
-
// match urls
|
341
|
-
const char* url(const char* src);
|
342
|
-
|
343
341
|
// match url()
|
344
342
|
const char* H(const char* src);
|
345
343
|
const char* W(const char* src);
|
@@ -9,6 +9,7 @@
|
|
9
9
|
#include "json.hpp"
|
10
10
|
#include "util.hpp"
|
11
11
|
#include "context.hpp"
|
12
|
+
#include "sass_context.hpp"
|
12
13
|
#include "ast_fwd_decl.hpp"
|
13
14
|
#include "error_handling.hpp"
|
14
15
|
|
@@ -17,161 +18,15 @@
|
|
17
18
|
extern "C" {
|
18
19
|
using namespace Sass;
|
19
20
|
|
20
|
-
// Input behaviours
|
21
|
-
enum Sass_Input_Style {
|
22
|
-
SASS_CONTEXT_NULL,
|
23
|
-
SASS_CONTEXT_FILE,
|
24
|
-
SASS_CONTEXT_DATA,
|
25
|
-
SASS_CONTEXT_FOLDER
|
26
|
-
};
|
27
|
-
|
28
|
-
// simple linked list
|
29
|
-
struct string_list {
|
30
|
-
string_list* next;
|
31
|
-
char* string;
|
32
|
-
};
|
33
|
-
|
34
|
-
// sass config options structure
|
35
|
-
struct Sass_Options {
|
36
|
-
|
37
|
-
// Precision for fractional numbers
|
38
|
-
int precision;
|
39
|
-
|
40
|
-
// Output style for the generated css code
|
41
|
-
// A value from above SASS_STYLE_* constants
|
42
|
-
enum Sass_Output_Style output_style;
|
43
|
-
|
44
|
-
// Emit comments in the generated CSS indicating
|
45
|
-
// the corresponding source line.
|
46
|
-
bool source_comments;
|
47
|
-
|
48
|
-
// embed sourceMappingUrl as data uri
|
49
|
-
bool source_map_embed;
|
50
|
-
|
51
|
-
// embed include contents in maps
|
52
|
-
bool source_map_contents;
|
53
|
-
|
54
|
-
// Disable sourceMappingUrl in css output
|
55
|
-
bool omit_source_map_url;
|
56
|
-
|
57
|
-
// Treat source_string as sass (as opposed to scss)
|
58
|
-
bool is_indented_syntax_src;
|
59
|
-
|
60
|
-
// The input path is used for source map
|
61
|
-
// generation. It can be used to define
|
62
|
-
// something with string compilation or to
|
63
|
-
// overload the input file path. It is
|
64
|
-
// set to "stdin" for data contexts and
|
65
|
-
// to the input file on file contexts.
|
66
|
-
char* input_path;
|
67
|
-
|
68
|
-
// The output path is used for source map
|
69
|
-
// generation. Libsass will not write to
|
70
|
-
// this file, it is just used to create
|
71
|
-
// information in source-maps etc.
|
72
|
-
char* output_path;
|
73
|
-
|
74
|
-
// String to be used for indentation
|
75
|
-
const char* indent;
|
76
|
-
// String to be used to for line feeds
|
77
|
-
const char* linefeed;
|
78
|
-
|
79
|
-
// Colon-separated list of paths
|
80
|
-
// Semicolon-separated on Windows
|
81
|
-
// Maybe use array interface instead?
|
82
|
-
char* include_path;
|
83
|
-
char* plugin_path;
|
84
|
-
|
85
|
-
// Include paths (linked string list)
|
86
|
-
struct string_list* include_paths;
|
87
|
-
// Plugin paths (linked string list)
|
88
|
-
struct string_list* plugin_paths;
|
89
|
-
|
90
|
-
// Path to source map file
|
91
|
-
// Enables source map generation
|
92
|
-
// Used to create sourceMappingUrl
|
93
|
-
char* source_map_file;
|
94
|
-
|
95
|
-
// Directly inserted in source maps
|
96
|
-
char* source_map_root;
|
97
|
-
|
98
|
-
// Custom functions that can be called from sccs code
|
99
|
-
Sass_Function_List c_functions;
|
100
|
-
|
101
|
-
// List of custom importers
|
102
|
-
Sass_Importer_List c_importers;
|
103
|
-
|
104
|
-
// List of custom headers
|
105
|
-
Sass_Importer_List c_headers;
|
106
|
-
|
107
|
-
};
|
108
|
-
|
109
|
-
// base for all contexts
|
110
|
-
struct Sass_Context : Sass_Options
|
111
|
-
{
|
112
|
-
|
113
|
-
// store context type info
|
114
|
-
enum Sass_Input_Style type;
|
115
|
-
|
116
|
-
// generated output data
|
117
|
-
char* output_string;
|
118
|
-
|
119
|
-
// generated source map json
|
120
|
-
char* source_map_string;
|
121
|
-
|
122
|
-
// error status
|
123
|
-
int error_status;
|
124
|
-
char* error_json;
|
125
|
-
char* error_text;
|
126
|
-
char* error_message;
|
127
|
-
// error position
|
128
|
-
char* error_file;
|
129
|
-
size_t error_line;
|
130
|
-
size_t error_column;
|
131
|
-
const char* error_src;
|
132
|
-
|
133
|
-
// report imported files
|
134
|
-
char** included_files;
|
135
|
-
|
136
|
-
};
|
137
|
-
|
138
|
-
// struct for file compilation
|
139
|
-
struct Sass_File_Context : Sass_Context {
|
140
|
-
|
141
|
-
// no additional fields required
|
142
|
-
// input_path is already on options
|
143
|
-
|
144
|
-
};
|
145
|
-
|
146
|
-
// struct for data compilation
|
147
|
-
struct Sass_Data_Context : Sass_Context {
|
148
|
-
|
149
|
-
// provided source string
|
150
|
-
char* source_string;
|
151
|
-
|
152
|
-
};
|
153
|
-
|
154
|
-
// link c and cpp context
|
155
|
-
struct Sass_Compiler {
|
156
|
-
// progress status
|
157
|
-
Sass_Compiler_State state;
|
158
|
-
// original c context
|
159
|
-
Sass_Context* c_ctx;
|
160
|
-
// Sass::Context
|
161
|
-
Context* cpp_ctx;
|
162
|
-
// Sass::Block
|
163
|
-
Block* root;
|
164
|
-
};
|
165
|
-
|
166
21
|
static void copy_options(struct Sass_Options* to, struct Sass_Options* from) { *to = *from; }
|
167
22
|
|
168
23
|
#define IMPLEMENT_SASS_OPTION_ACCESSOR(type, option) \
|
169
24
|
type ADDCALL sass_option_get_##option (struct Sass_Options* options) { return options->option; } \
|
170
25
|
void ADDCALL sass_option_set_##option (struct Sass_Options* options, type option) { options->option = option; }
|
171
|
-
#define IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(type, option) \
|
172
|
-
type ADDCALL sass_option_get_##option (struct Sass_Options* options) { return options->option; } \
|
26
|
+
#define IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(type, option, def) \
|
27
|
+
type ADDCALL sass_option_get_##option (struct Sass_Options* options) { return safe_str(options->option, def); } \
|
173
28
|
void ADDCALL sass_option_set_##option (struct Sass_Options* options, type option) \
|
174
|
-
{ free(options->option); options->option = option ? sass_strdup(option) : 0; }
|
29
|
+
{ free(options->option); options->option = option || def ? sass_strdup(option ? option : def) : 0; }
|
175
30
|
|
176
31
|
#define IMPLEMENT_SASS_CONTEXT_GETTER(type, option) \
|
177
32
|
type ADDCALL sass_context_get_##option (struct Sass_Context* ctx) { return ctx->option; }
|
@@ -183,24 +38,26 @@ extern "C" {
|
|
183
38
|
try {
|
184
39
|
throw;
|
185
40
|
}
|
186
|
-
catch (
|
41
|
+
catch (Exception::Base& e) {
|
187
42
|
std::stringstream msg_stream;
|
188
43
|
std::string cwd(Sass::File::get_cwd());
|
189
|
-
std::string rel_path(Sass::File::
|
44
|
+
std::string rel_path(Sass::File::abs2rel(e.pstate.path, cwd, cwd));
|
190
45
|
|
191
46
|
std::string msg_prefix("Error: ");
|
192
47
|
bool got_newline = false;
|
193
48
|
msg_stream << msg_prefix;
|
194
|
-
|
195
|
-
|
49
|
+
const char* msg = e.what();
|
50
|
+
while(msg && *msg) {
|
51
|
+
if (*msg == '\r') {
|
196
52
|
got_newline = true;
|
197
|
-
} else if (
|
53
|
+
} else if (*msg == '\n') {
|
198
54
|
got_newline = true;
|
199
55
|
} else if (got_newline) {
|
200
56
|
msg_stream << std::string(msg_prefix.size(), ' ');
|
201
57
|
got_newline = false;
|
202
58
|
}
|
203
|
-
msg_stream <<
|
59
|
+
msg_stream << *msg;
|
60
|
+
++ msg;
|
204
61
|
}
|
205
62
|
if (!got_newline) msg_stream << "\n";
|
206
63
|
msg_stream << std::string(msg_prefix.size(), ' ');
|
@@ -233,12 +90,12 @@ extern "C" {
|
|
233
90
|
json_append_member(json_err, "file", json_mkstring(e.pstate.path));
|
234
91
|
json_append_member(json_err, "line", json_mknumber((double)(e.pstate.line+1)));
|
235
92
|
json_append_member(json_err, "column", json_mknumber((double)(e.pstate.column+1)));
|
236
|
-
json_append_member(json_err, "message", json_mkstring(e.
|
93
|
+
json_append_member(json_err, "message", json_mkstring(e.what()));
|
237
94
|
json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
|
238
95
|
|
239
96
|
c_ctx->error_json = json_stringify(json_err, " ");;
|
240
97
|
c_ctx->error_message = sass_strdup(msg_stream.str().c_str());
|
241
|
-
c_ctx->error_text = sass_strdup(e.
|
98
|
+
c_ctx->error_text = sass_strdup(e.what());
|
242
99
|
c_ctx->error_status = 1;
|
243
100
|
c_ctx->error_file = sass_strdup(e.pstate.path);
|
244
101
|
c_ctx->error_line = e.pstate.line+1;
|
@@ -322,19 +179,10 @@ extern "C" {
|
|
322
179
|
}
|
323
180
|
|
324
181
|
// generic compilation function (not exported, use file/data compile instead)
|
325
|
-
static Sass_Compiler* sass_prepare_context (Sass_Context* c_ctx, Context
|
182
|
+
static Sass_Compiler* sass_prepare_context (Sass_Context* c_ctx, Context* cpp_ctx) throw()
|
326
183
|
{
|
327
184
|
try {
|
328
185
|
|
329
|
-
// get input/output path from options
|
330
|
-
std::string input_path = safe_str(c_ctx->input_path);
|
331
|
-
std::string output_path = safe_str(c_ctx->output_path);
|
332
|
-
// maybe we can extract an output path from input path
|
333
|
-
if (output_path == "" && input_path != "") {
|
334
|
-
int lastindex = static_cast<int>(input_path.find_last_of("."));
|
335
|
-
output_path = (lastindex > -1 ? input_path.substr(0, lastindex) : input_path) + ".css";
|
336
|
-
}
|
337
|
-
|
338
186
|
// convert include path linked list to static array
|
339
187
|
struct string_list* inc = c_ctx->include_paths;
|
340
188
|
// very poor loop to get the length of the linked list
|
@@ -365,31 +213,6 @@ extern "C" {
|
|
365
213
|
imp = imp->next;
|
366
214
|
}
|
367
215
|
|
368
|
-
// transfer the options to c++
|
369
|
-
cpp_opt.c_compiler(0)
|
370
|
-
.c_options(c_ctx)
|
371
|
-
.input_path(input_path)
|
372
|
-
.output_path(output_path)
|
373
|
-
.output_style((Output_Style) c_ctx->output_style)
|
374
|
-
.is_indented_syntax_src(c_ctx->is_indented_syntax_src)
|
375
|
-
.source_comments(c_ctx->source_comments)
|
376
|
-
.source_map_file(safe_str(c_ctx->source_map_file))
|
377
|
-
.source_map_root(safe_str(c_ctx->source_map_root))
|
378
|
-
.source_map_embed(c_ctx->source_map_embed)
|
379
|
-
.source_map_contents(c_ctx->source_map_contents)
|
380
|
-
.omit_source_map_url(c_ctx->omit_source_map_url)
|
381
|
-
.include_paths_c_str(c_ctx->include_path)
|
382
|
-
.plugin_paths_c_str(c_ctx->plugin_path)
|
383
|
-
// .include_paths_array(include_paths)
|
384
|
-
// .plugin_paths_array(plugin_paths)
|
385
|
-
.include_paths(std::vector<std::string>())
|
386
|
-
.plugin_paths(std::vector<std::string>())
|
387
|
-
.precision(c_ctx->precision)
|
388
|
-
.linefeed(c_ctx->linefeed)
|
389
|
-
.indent(c_ctx->indent);
|
390
|
-
|
391
|
-
// create new c++ Context
|
392
|
-
Context* cpp_ctx = new Context(cpp_opt);
|
393
216
|
// free intermediate data
|
394
217
|
free(include_paths);
|
395
218
|
free(plugin_paths);
|
@@ -476,15 +299,12 @@ extern "C" {
|
|
476
299
|
|
477
300
|
// maybe skip some entries of included files
|
478
301
|
// we do not include stdin for data contexts
|
479
|
-
bool skip =
|
480
|
-
|
481
|
-
// dispatch
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
root = cpp_ctx->parse_string();
|
486
|
-
skip = true; // skip first entry of includes
|
487
|
-
}
|
302
|
+
bool skip = c_ctx->type == SASS_CONTEXT_DATA;
|
303
|
+
|
304
|
+
// dispatch parse call
|
305
|
+
root = cpp_ctx->parse();
|
306
|
+
// abort on errors
|
307
|
+
if (!root) return 0;
|
488
308
|
|
489
309
|
// skip all prefixed files? (ToDo: check srcmap)
|
490
310
|
// IMO source-maps should point to headers already
|
@@ -492,10 +312,9 @@ extern "C" {
|
|
492
312
|
// remove completely once this is tested
|
493
313
|
size_t headers = cpp_ctx->head_imports;
|
494
314
|
|
495
|
-
// copy the included files on to the context (dont forget to free)
|
496
|
-
if (
|
497
|
-
|
498
|
-
throw(std::bad_alloc());
|
315
|
+
// copy the included files on to the context (dont forget to free later)
|
316
|
+
if (copy_strings(cpp_ctx->get_included_files(skip, headers), &c_ctx->included_files) == NULL)
|
317
|
+
throw(std::bad_alloc());
|
499
318
|
|
500
319
|
// return parsed block
|
501
320
|
return root;
|
@@ -510,11 +329,11 @@ extern "C" {
|
|
510
329
|
}
|
511
330
|
|
512
331
|
// generic compilation function (not exported, use file/data compile instead)
|
513
|
-
static int sass_compile_context (Sass_Context* c_ctx, Context
|
332
|
+
static int sass_compile_context (Sass_Context* c_ctx, Context* cpp_ctx)
|
514
333
|
{
|
515
334
|
|
516
335
|
// prepare sass compiler with context and options
|
517
|
-
Sass_Compiler* compiler = sass_prepare_context(c_ctx,
|
336
|
+
Sass_Compiler* compiler = sass_prepare_context(c_ctx, cpp_ctx);
|
518
337
|
|
519
338
|
try {
|
520
339
|
// call each compiler step
|
@@ -576,54 +395,46 @@ extern "C" {
|
|
576
395
|
return ctx;
|
577
396
|
}
|
578
397
|
|
579
|
-
struct Sass_Compiler* ADDCALL
|
398
|
+
struct Sass_Compiler* ADDCALL sass_make_data_compiler (struct Sass_Data_Context* data_ctx)
|
580
399
|
{
|
581
|
-
if (
|
582
|
-
Context
|
583
|
-
|
584
|
-
return sass_prepare_context(c_ctx, cpp_opt);
|
400
|
+
if (data_ctx == 0) return 0;
|
401
|
+
Context* cpp_ctx = new Data_Context(data_ctx);
|
402
|
+
return sass_prepare_context(data_ctx, cpp_ctx);
|
585
403
|
}
|
586
404
|
|
587
|
-
struct Sass_Compiler* ADDCALL
|
405
|
+
struct Sass_Compiler* ADDCALL sass_make_file_compiler (struct Sass_File_Context* file_ctx)
|
588
406
|
{
|
589
|
-
if (
|
590
|
-
Context
|
591
|
-
|
592
|
-
c_ctx->source_string = 0; // passed away
|
593
|
-
return sass_prepare_context(c_ctx, cpp_opt);
|
407
|
+
if (file_ctx == 0) return 0;
|
408
|
+
Context* cpp_ctx = new File_Context(file_ctx);
|
409
|
+
return sass_prepare_context(file_ctx, cpp_ctx);
|
594
410
|
}
|
595
411
|
|
596
412
|
int ADDCALL sass_compile_data_context(Sass_Data_Context* data_ctx)
|
597
413
|
{
|
598
414
|
if (data_ctx == 0) return 1;
|
599
|
-
|
600
|
-
|
601
|
-
return c_ctx->error_status;
|
602
|
-
Context::Data cpp_opt = Context::Data();
|
415
|
+
if (data_ctx->error_status)
|
416
|
+
return data_ctx->error_status;
|
603
417
|
try {
|
604
418
|
if (data_ctx->source_string == 0) { throw(std::runtime_error("Data context has no source string")); }
|
605
419
|
if (*data_ctx->source_string == 0) { throw(std::runtime_error("Data context has empty source string")); }
|
606
|
-
cpp_opt.source_c_str(data_ctx->source_string);
|
607
|
-
data_ctx->source_string = 0; // passed away
|
608
420
|
}
|
609
|
-
catch (...) { return handle_errors(
|
610
|
-
|
421
|
+
catch (...) { return handle_errors(data_ctx) | 1; }
|
422
|
+
Context* cpp_ctx = new Data_Context(data_ctx);
|
423
|
+
return sass_compile_context(data_ctx, cpp_ctx);
|
611
424
|
}
|
612
425
|
|
613
426
|
int ADDCALL sass_compile_file_context(Sass_File_Context* file_ctx)
|
614
427
|
{
|
615
428
|
if (file_ctx == 0) return 1;
|
616
|
-
|
617
|
-
|
618
|
-
return c_ctx->error_status;
|
619
|
-
Context::Data cpp_opt = Context::Data();
|
429
|
+
if (file_ctx->error_status)
|
430
|
+
return file_ctx->error_status;
|
620
431
|
try {
|
621
432
|
if (file_ctx->input_path == 0) { throw(std::runtime_error("File context has no input path")); }
|
622
433
|
if (*file_ctx->input_path == 0) { throw(std::runtime_error("File context has empty input path")); }
|
623
|
-
cpp_opt.entry_point(file_ctx->input_path);
|
624
434
|
}
|
625
|
-
catch (...) { return handle_errors(
|
626
|
-
|
435
|
+
catch (...) { return handle_errors(file_ctx) | 1; }
|
436
|
+
Context* cpp_ctx = new File_Context(file_ctx);
|
437
|
+
return sass_compile_context(file_ctx, cpp_ctx);
|
627
438
|
}
|
628
439
|
|
629
440
|
int ADDCALL sass_compiler_parse(struct Sass_Compiler* compiler)
|
@@ -655,11 +466,11 @@ extern "C" {
|
|
655
466
|
Context* cpp_ctx = compiler->cpp_ctx;
|
656
467
|
Block* root = compiler->root;
|
657
468
|
// compile the parsed root block
|
658
|
-
try { compiler->c_ctx->output_string = cpp_ctx->
|
469
|
+
try { compiler->c_ctx->output_string = cpp_ctx->render(root); }
|
659
470
|
// pass catched errors to generic error handler
|
660
471
|
catch (...) { return handle_errors(compiler->c_ctx) | 1; }
|
661
472
|
// generate source map json and store on context
|
662
|
-
compiler->c_ctx->source_map_string = cpp_ctx->
|
473
|
+
compiler->c_ctx->source_map_string = cpp_ctx->render_srcmap();
|
663
474
|
// success
|
664
475
|
return 0;
|
665
476
|
}
|
@@ -829,12 +640,12 @@ extern "C" {
|
|
829
640
|
IMPLEMENT_SASS_OPTION_ACCESSOR(Sass_Importer_List, c_headers);
|
830
641
|
IMPLEMENT_SASS_OPTION_ACCESSOR(const char*, indent);
|
831
642
|
IMPLEMENT_SASS_OPTION_ACCESSOR(const char*, linefeed);
|
832
|
-
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, input_path);
|
833
|
-
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, output_path);
|
834
|
-
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, plugin_path);
|
835
|
-
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, include_path);
|
836
|
-
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, source_map_file);
|
837
|
-
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, source_map_root);
|
643
|
+
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, input_path, 0);
|
644
|
+
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, output_path, 0);
|
645
|
+
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, plugin_path, 0);
|
646
|
+
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, include_path, 0);
|
647
|
+
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, source_map_file, 0);
|
648
|
+
IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(const char*, source_map_root, 0);
|
838
649
|
|
839
650
|
// Create getter and setters for context
|
840
651
|
IMPLEMENT_SASS_CONTEXT_GETTER(int, error_status);
|
@@ -0,0 +1,156 @@
|
|
1
|
+
#ifndef SASS_SASS_CONTEXT_H
|
2
|
+
#define SASS_SASS_CONTEXT_H
|
3
|
+
|
4
|
+
#include "sass.h"
|
5
|
+
#include "context.hpp"
|
6
|
+
#include "ast_fwd_decl.hpp"
|
7
|
+
|
8
|
+
// Input behaviours
|
9
|
+
enum Sass_Input_Style {
|
10
|
+
SASS_CONTEXT_NULL,
|
11
|
+
SASS_CONTEXT_FILE,
|
12
|
+
SASS_CONTEXT_DATA,
|
13
|
+
SASS_CONTEXT_FOLDER
|
14
|
+
};
|
15
|
+
|
16
|
+
// simple linked list
|
17
|
+
struct string_list {
|
18
|
+
string_list* next;
|
19
|
+
char* string;
|
20
|
+
};
|
21
|
+
|
22
|
+
// sass config options structure
|
23
|
+
struct Sass_Options {
|
24
|
+
|
25
|
+
// Precision for fractional numbers
|
26
|
+
int precision;
|
27
|
+
|
28
|
+
// Output style for the generated css code
|
29
|
+
// A value from above SASS_STYLE_* constants
|
30
|
+
enum Sass_Output_Style output_style;
|
31
|
+
|
32
|
+
// Emit comments in the generated CSS indicating
|
33
|
+
// the corresponding source line.
|
34
|
+
bool source_comments;
|
35
|
+
|
36
|
+
// embed sourceMappingUrl as data uri
|
37
|
+
bool source_map_embed;
|
38
|
+
|
39
|
+
// embed include contents in maps
|
40
|
+
bool source_map_contents;
|
41
|
+
|
42
|
+
// Disable sourceMappingUrl in css output
|
43
|
+
bool omit_source_map_url;
|
44
|
+
|
45
|
+
// Treat source_string as sass (as opposed to scss)
|
46
|
+
bool is_indented_syntax_src;
|
47
|
+
|
48
|
+
// The input path is used for source map
|
49
|
+
// generation. It can be used to define
|
50
|
+
// something with string compilation or to
|
51
|
+
// overload the input file path. It is
|
52
|
+
// set to "stdin" for data contexts and
|
53
|
+
// to the input file on file contexts.
|
54
|
+
char* input_path;
|
55
|
+
|
56
|
+
// The output path is used for source map
|
57
|
+
// generation. Libsass will not write to
|
58
|
+
// this file, it is just used to create
|
59
|
+
// information in source-maps etc.
|
60
|
+
char* output_path;
|
61
|
+
|
62
|
+
// String to be used for indentation
|
63
|
+
const char* indent;
|
64
|
+
// String to be used to for line feeds
|
65
|
+
const char* linefeed;
|
66
|
+
|
67
|
+
// Colon-separated list of paths
|
68
|
+
// Semicolon-separated on Windows
|
69
|
+
// Maybe use array interface instead?
|
70
|
+
char* include_path;
|
71
|
+
char* plugin_path;
|
72
|
+
|
73
|
+
// Include paths (linked string list)
|
74
|
+
struct string_list* include_paths;
|
75
|
+
// Plugin paths (linked string list)
|
76
|
+
struct string_list* plugin_paths;
|
77
|
+
|
78
|
+
// Path to source map file
|
79
|
+
// Enables source map generation
|
80
|
+
// Used to create sourceMappingUrl
|
81
|
+
char* source_map_file;
|
82
|
+
|
83
|
+
// Directly inserted in source maps
|
84
|
+
char* source_map_root;
|
85
|
+
|
86
|
+
// Custom functions that can be called from sccs code
|
87
|
+
Sass_Function_List c_functions;
|
88
|
+
|
89
|
+
// List of custom importers
|
90
|
+
Sass_Importer_List c_importers;
|
91
|
+
|
92
|
+
// List of custom headers
|
93
|
+
Sass_Importer_List c_headers;
|
94
|
+
|
95
|
+
};
|
96
|
+
|
97
|
+
|
98
|
+
// base for all contexts
|
99
|
+
struct Sass_Context : Sass_Options
|
100
|
+
{
|
101
|
+
|
102
|
+
// store context type info
|
103
|
+
enum Sass_Input_Style type;
|
104
|
+
|
105
|
+
// generated output data
|
106
|
+
char* output_string;
|
107
|
+
|
108
|
+
// generated source map json
|
109
|
+
char* source_map_string;
|
110
|
+
|
111
|
+
// error status
|
112
|
+
int error_status;
|
113
|
+
char* error_json;
|
114
|
+
char* error_text;
|
115
|
+
char* error_message;
|
116
|
+
// error position
|
117
|
+
char* error_file;
|
118
|
+
size_t error_line;
|
119
|
+
size_t error_column;
|
120
|
+
const char* error_src;
|
121
|
+
|
122
|
+
// report imported files
|
123
|
+
char** included_files;
|
124
|
+
|
125
|
+
};
|
126
|
+
|
127
|
+
// struct for file compilation
|
128
|
+
struct Sass_File_Context : Sass_Context {
|
129
|
+
|
130
|
+
// no additional fields required
|
131
|
+
// input_path is already on options
|
132
|
+
|
133
|
+
};
|
134
|
+
|
135
|
+
// struct for data compilation
|
136
|
+
struct Sass_Data_Context : Sass_Context {
|
137
|
+
|
138
|
+
// provided source string
|
139
|
+
char* source_string;
|
140
|
+
char* srcmap_string;
|
141
|
+
|
142
|
+
};
|
143
|
+
|
144
|
+
// link c and cpp context
|
145
|
+
struct Sass_Compiler {
|
146
|
+
// progress status
|
147
|
+
Sass_Compiler_State state;
|
148
|
+
// original c context
|
149
|
+
Sass_Context* c_ctx;
|
150
|
+
// Sass::Context
|
151
|
+
Sass::Context* cpp_ctx;
|
152
|
+
// Sass::Block
|
153
|
+
Sass::Block* root;
|
154
|
+
};
|
155
|
+
|
156
|
+
#endif
|