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