sassc 1.8.3 → 1.8.4
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/.editorconfig +1 -1
- data/ext/libsass/.gitignore +1 -0
- data/ext/libsass/LICENSE +1 -1
- data/ext/libsass/Makefile +20 -14
- data/ext/libsass/Makefile.conf +0 -1
- data/ext/libsass/Readme.md +3 -1
- data/ext/libsass/appveyor.yml +19 -11
- data/ext/libsass/docs/api-importer-example.md +2 -1235
- data/ext/libsass/docs/build-with-autotools.md +10 -0
- data/ext/libsass/docs/build-with-makefiles.md +18 -0
- data/ext/libsass/include/sass/base.h +4 -1
- data/ext/libsass/include/sass/values.h +2 -1
- data/ext/libsass/src/ast.cpp +279 -346
- data/ext/libsass/src/ast.hpp +234 -60
- data/ext/libsass/src/base64vlq.cpp +1 -0
- data/ext/libsass/src/bind.cpp +35 -45
- data/ext/libsass/src/bind.hpp +1 -0
- data/ext/libsass/src/color_maps.cpp +1 -0
- data/ext/libsass/src/constants.cpp +4 -1
- data/ext/libsass/src/constants.hpp +2 -1
- data/ext/libsass/src/context.cpp +41 -31
- data/ext/libsass/src/context.hpp +10 -10
- data/ext/libsass/src/cssize.cpp +7 -4
- data/ext/libsass/src/cssize.hpp +1 -3
- data/ext/libsass/src/debugger.hpp +73 -14
- data/ext/libsass/src/emitter.cpp +37 -25
- data/ext/libsass/src/emitter.hpp +10 -9
- data/ext/libsass/src/environment.cpp +16 -5
- data/ext/libsass/src/environment.hpp +5 -3
- data/ext/libsass/src/error_handling.cpp +91 -14
- data/ext/libsass/src/error_handling.hpp +105 -4
- data/ext/libsass/src/eval.cpp +519 -330
- data/ext/libsass/src/eval.hpp +12 -13
- data/ext/libsass/src/expand.cpp +92 -56
- data/ext/libsass/src/expand.hpp +5 -3
- data/ext/libsass/src/extend.cpp +60 -51
- data/ext/libsass/src/extend.hpp +1 -3
- data/ext/libsass/src/file.cpp +37 -27
- data/ext/libsass/src/functions.cpp +78 -62
- data/ext/libsass/src/functions.hpp +1 -0
- data/ext/libsass/src/inspect.cpp +293 -64
- data/ext/libsass/src/inspect.hpp +2 -0
- data/ext/libsass/src/lexer.cpp +1 -0
- data/ext/libsass/src/listize.cpp +14 -15
- data/ext/libsass/src/listize.hpp +3 -5
- data/ext/libsass/src/memory_manager.cpp +1 -0
- data/ext/libsass/src/node.cpp +2 -3
- data/ext/libsass/src/operation.hpp +70 -71
- data/ext/libsass/src/output.cpp +28 -32
- data/ext/libsass/src/output.hpp +1 -2
- data/ext/libsass/src/parser.cpp +402 -183
- data/ext/libsass/src/parser.hpp +19 -9
- data/ext/libsass/src/plugins.cpp +1 -0
- data/ext/libsass/src/position.cpp +1 -0
- data/ext/libsass/src/prelexer.cpp +134 -56
- data/ext/libsass/src/prelexer.hpp +51 -3
- data/ext/libsass/src/remove_placeholders.cpp +35 -9
- data/ext/libsass/src/remove_placeholders.hpp +4 -3
- data/ext/libsass/src/sass.cpp +1 -0
- data/ext/libsass/src/sass.hpp +129 -0
- data/ext/libsass/src/sass_context.cpp +31 -14
- data/ext/libsass/src/sass_context.hpp +2 -31
- data/ext/libsass/src/sass_functions.cpp +1 -0
- data/ext/libsass/src/sass_interface.cpp +5 -6
- data/ext/libsass/src/sass_util.cpp +1 -2
- data/ext/libsass/src/sass_util.hpp +5 -5
- data/ext/libsass/src/sass_values.cpp +13 -10
- data/ext/libsass/src/source_map.cpp +4 -3
- data/ext/libsass/src/source_map.hpp +2 -2
- data/ext/libsass/src/subset_map.hpp +0 -1
- data/ext/libsass/src/to_c.cpp +1 -0
- data/ext/libsass/src/to_c.hpp +1 -3
- data/ext/libsass/src/to_value.cpp +3 -5
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.cpp +96 -59
- data/ext/libsass/src/units.hpp +10 -8
- data/ext/libsass/src/utf8_string.cpp +5 -0
- data/ext/libsass/src/util.cpp +23 -156
- data/ext/libsass/src/util.hpp +10 -14
- data/ext/libsass/src/values.cpp +1 -0
- data/ext/libsass/test/test_node.cpp +2 -6
- data/ext/libsass/test/test_selector_difference.cpp +1 -3
- data/ext/libsass/test/test_specificity.cpp +0 -2
- data/ext/libsass/test/test_superselector.cpp +0 -2
- data/ext/libsass/test/test_unification.cpp +1 -3
- data/ext/libsass/win/libsass.targets +18 -5
- data/ext/libsass/win/libsass.vcxproj +9 -7
- data/ext/libsass/win/libsass.vcxproj.filters +148 -106
- data/lib/sassc/version.rb +1 -1
- data/test/engine_test.rb +12 -0
- data/test/native_test.rb +1 -1
- metadata +3 -4
- data/ext/libsass/src/to_string.cpp +0 -48
- data/ext/libsass/src/to_string.hpp +0 -38
|
@@ -17,11 +17,12 @@ namespace Sass {
|
|
|
17
17
|
|
|
18
18
|
void fallback_impl(AST_Node* n) {}
|
|
19
19
|
|
|
20
|
+
private:
|
|
21
|
+
Selector_List* remove_placeholders(Selector_List*);
|
|
22
|
+
|
|
20
23
|
public:
|
|
21
24
|
Remove_Placeholders(Context&);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
using Operation<void>::operator();
|
|
25
|
+
~Remove_Placeholders() { }
|
|
25
26
|
|
|
26
27
|
void operator()(Block*);
|
|
27
28
|
void operator()(Ruleset*);
|
data/ext/libsass/src/sass.cpp
CHANGED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// must be the first include in all compile units
|
|
2
|
+
#ifndef SASS_SASS_H
|
|
3
|
+
#define SASS_SASS_H
|
|
4
|
+
|
|
5
|
+
// undefine extensions macro to tell sys includes
|
|
6
|
+
// that we do not want any macros to be exported
|
|
7
|
+
// mainly fixes an issue on SmartOS (SEC macro)
|
|
8
|
+
#undef __EXTENSIONS__
|
|
9
|
+
|
|
10
|
+
#ifdef _MSC_VER
|
|
11
|
+
#pragma warning(disable : 4005)
|
|
12
|
+
#endif
|
|
13
|
+
|
|
14
|
+
// aplies to MSVC and MinGW
|
|
15
|
+
#ifdef _WIN32
|
|
16
|
+
// we do not want the ERROR macro
|
|
17
|
+
# define NOGDI
|
|
18
|
+
// we do not want the min/max macro
|
|
19
|
+
# define NOMINMAX
|
|
20
|
+
// we do not want the IN/OUT macro
|
|
21
|
+
# define _NO_W32_PSEUDO_MODIFIERS
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
// should we be case insensitive
|
|
26
|
+
// when dealing with files or paths
|
|
27
|
+
#ifndef FS_CASE_SENSITIVE
|
|
28
|
+
# ifdef _WIN32
|
|
29
|
+
# define FS_CASE_SENSITIVE 0
|
|
30
|
+
# else
|
|
31
|
+
# define FS_CASE_SENSITIVE 1
|
|
32
|
+
# endif
|
|
33
|
+
#endif
|
|
34
|
+
|
|
35
|
+
// path separation char
|
|
36
|
+
#ifndef PATH_SEP
|
|
37
|
+
# ifdef _WIN32
|
|
38
|
+
# define PATH_SEP ';'
|
|
39
|
+
# else
|
|
40
|
+
# define PATH_SEP ':'
|
|
41
|
+
# endif
|
|
42
|
+
#endif
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
// include C-API header
|
|
46
|
+
#include "sass/base.h"
|
|
47
|
+
|
|
48
|
+
// output behaviours
|
|
49
|
+
namespace Sass {
|
|
50
|
+
|
|
51
|
+
// create some C++ aliases for the most used options
|
|
52
|
+
const static Sass_Output_Style NESTED = SASS_STYLE_NESTED;
|
|
53
|
+
const static Sass_Output_Style COMPACT = SASS_STYLE_COMPACT;
|
|
54
|
+
const static Sass_Output_Style EXPANDED = SASS_STYLE_EXPANDED;
|
|
55
|
+
const static Sass_Output_Style COMPRESSED = SASS_STYLE_COMPRESSED;
|
|
56
|
+
// only used internal to trigger ruby inspect behavior
|
|
57
|
+
const static Sass_Output_Style INSPECT = SASS_STYLE_INSPECT;
|
|
58
|
+
const static Sass_Output_Style TO_SASS = SASS_STYLE_TO_SASS;
|
|
59
|
+
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// input behaviours
|
|
63
|
+
enum Sass_Input_Style {
|
|
64
|
+
SASS_CONTEXT_NULL,
|
|
65
|
+
SASS_CONTEXT_FILE,
|
|
66
|
+
SASS_CONTEXT_DATA,
|
|
67
|
+
SASS_CONTEXT_FOLDER
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// simple linked list
|
|
71
|
+
struct string_list {
|
|
72
|
+
string_list* next;
|
|
73
|
+
char* string;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// sass config options structure
|
|
77
|
+
struct Sass_Inspect_Options {
|
|
78
|
+
|
|
79
|
+
// Output style for the generated css code
|
|
80
|
+
// A value from above SASS_STYLE_* constants
|
|
81
|
+
enum Sass_Output_Style output_style;
|
|
82
|
+
|
|
83
|
+
// Precision for fractional numbers
|
|
84
|
+
int precision;
|
|
85
|
+
|
|
86
|
+
// initialization list (constructor with defaults)
|
|
87
|
+
Sass_Inspect_Options(Sass_Output_Style style = Sass::NESTED,
|
|
88
|
+
int precision = 5)
|
|
89
|
+
: output_style(style), precision(precision)
|
|
90
|
+
{ }
|
|
91
|
+
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// sass config options structure
|
|
95
|
+
struct Sass_Output_Options : Sass_Inspect_Options {
|
|
96
|
+
|
|
97
|
+
// String to be used for indentation
|
|
98
|
+
const char* indent;
|
|
99
|
+
// String to be used to for line feeds
|
|
100
|
+
const char* linefeed;
|
|
101
|
+
|
|
102
|
+
// Emit comments in the generated CSS indicating
|
|
103
|
+
// the corresponding source line.
|
|
104
|
+
bool source_comments;
|
|
105
|
+
|
|
106
|
+
// initialization list (constructor with defaults)
|
|
107
|
+
Sass_Output_Options(struct Sass_Inspect_Options opt,
|
|
108
|
+
const char* indent = " ",
|
|
109
|
+
const char* linefeed = "\n",
|
|
110
|
+
bool source_comments = false)
|
|
111
|
+
: Sass_Inspect_Options(opt),
|
|
112
|
+
indent(indent), linefeed(linefeed),
|
|
113
|
+
source_comments(source_comments)
|
|
114
|
+
{ }
|
|
115
|
+
|
|
116
|
+
// initialization list (constructor with defaults)
|
|
117
|
+
Sass_Output_Options(Sass_Output_Style style = Sass::NESTED,
|
|
118
|
+
int precision = 5,
|
|
119
|
+
const char* indent = " ",
|
|
120
|
+
const char* linefeed = "\n",
|
|
121
|
+
bool source_comments = false)
|
|
122
|
+
: Sass_Inspect_Options(style, precision),
|
|
123
|
+
indent(indent), linefeed(linefeed),
|
|
124
|
+
source_comments(source_comments)
|
|
125
|
+
{ }
|
|
126
|
+
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
#endif
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#include "sass.hpp"
|
|
1
2
|
#include <cstring>
|
|
2
3
|
#include <stdexcept>
|
|
3
4
|
#include <sstream>
|
|
@@ -10,6 +11,7 @@
|
|
|
10
11
|
#include "util.hpp"
|
|
11
12
|
#include "context.hpp"
|
|
12
13
|
#include "sass_context.hpp"
|
|
14
|
+
#include "sass_functions.hpp"
|
|
13
15
|
#include "ast_fwd_decl.hpp"
|
|
14
16
|
#include "error_handling.hpp"
|
|
15
17
|
|
|
@@ -41,11 +43,10 @@ extern "C" {
|
|
|
41
43
|
catch (Exception::Base& e) {
|
|
42
44
|
std::stringstream msg_stream;
|
|
43
45
|
std::string cwd(Sass::File::get_cwd());
|
|
44
|
-
std::string rel_path(Sass::File::abs2rel(e.pstate.path, cwd, cwd));
|
|
45
46
|
|
|
46
|
-
std::string msg_prefix(
|
|
47
|
+
std::string msg_prefix(e.errtype());
|
|
47
48
|
bool got_newline = false;
|
|
48
|
-
msg_stream << msg_prefix;
|
|
49
|
+
msg_stream << msg_prefix << ": ";
|
|
49
50
|
const char* msg = e.what();
|
|
50
51
|
while(msg && *msg) {
|
|
51
52
|
if (*msg == '\r') {
|
|
@@ -53,15 +54,26 @@ extern "C" {
|
|
|
53
54
|
} else if (*msg == '\n') {
|
|
54
55
|
got_newline = true;
|
|
55
56
|
} else if (got_newline) {
|
|
56
|
-
msg_stream << std::string(msg_prefix.size(), ' ');
|
|
57
|
+
msg_stream << std::string(msg_prefix.size() + 2, ' ');
|
|
57
58
|
got_newline = false;
|
|
58
59
|
}
|
|
59
60
|
msg_stream << *msg;
|
|
60
61
|
++ msg;
|
|
61
62
|
}
|
|
62
63
|
if (!got_newline) msg_stream << "\n";
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
if (e.import_stack) {
|
|
65
|
+
for (size_t i = 1; i < e.import_stack->size() - 1; ++i) {
|
|
66
|
+
std::string path((*e.import_stack)[i]->imp_path);
|
|
67
|
+
std::string rel_path(Sass::File::abs2rel(path, cwd, cwd));
|
|
68
|
+
msg_stream << std::string(msg_prefix.size() + 2, ' ');
|
|
69
|
+
msg_stream << (i == 1 ? " on line " : " from line ");
|
|
70
|
+
msg_stream << e.pstate.line+1 << " of " << rel_path << "\n";
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
std::string rel_path(Sass::File::abs2rel(e.pstate.path, cwd, cwd));
|
|
74
|
+
msg_stream << std::string(msg_prefix.size() + 2, ' ');
|
|
75
|
+
msg_stream << " on line " << e.pstate.line+1 << " of " << rel_path << "\n";
|
|
76
|
+
}
|
|
65
77
|
|
|
66
78
|
// now create the code trace (ToDo: maybe have util functions?)
|
|
67
79
|
if (e.pstate.line != std::string::npos && e.pstate.column != std::string::npos) {
|
|
@@ -111,6 +123,7 @@ extern "C" {
|
|
|
111
123
|
msg_stream << "Unable to allocate memory: " << ba.what() << std::endl;
|
|
112
124
|
json_append_member(json_err, "status", json_mknumber(2));
|
|
113
125
|
json_append_member(json_err, "message", json_mkstring(ba.what()));
|
|
126
|
+
json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
|
|
114
127
|
c_ctx->error_json = json_stringify(json_err, " ");;
|
|
115
128
|
c_ctx->error_message = sass_strdup(msg_stream.str().c_str());
|
|
116
129
|
c_ctx->error_text = sass_strdup(ba.what());
|
|
@@ -122,9 +135,10 @@ extern "C" {
|
|
|
122
135
|
catch (std::exception& e) {
|
|
123
136
|
std::stringstream msg_stream;
|
|
124
137
|
JsonNode* json_err = json_mkobject();
|
|
125
|
-
msg_stream << "Error: " << e.what() << std::endl;
|
|
138
|
+
msg_stream << "Internal Error: " << e.what() << std::endl;
|
|
126
139
|
json_append_member(json_err, "status", json_mknumber(3));
|
|
127
140
|
json_append_member(json_err, "message", json_mkstring(e.what()));
|
|
141
|
+
json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
|
|
128
142
|
c_ctx->error_json = json_stringify(json_err, " ");;
|
|
129
143
|
c_ctx->error_message = sass_strdup(msg_stream.str().c_str());
|
|
130
144
|
c_ctx->error_text = sass_strdup(e.what());
|
|
@@ -136,9 +150,10 @@ extern "C" {
|
|
|
136
150
|
catch (std::string& e) {
|
|
137
151
|
std::stringstream msg_stream;
|
|
138
152
|
JsonNode* json_err = json_mkobject();
|
|
139
|
-
msg_stream << "Error: " << e << std::endl;
|
|
153
|
+
msg_stream << "Internal Error: " << e << std::endl;
|
|
140
154
|
json_append_member(json_err, "status", json_mknumber(4));
|
|
141
155
|
json_append_member(json_err, "message", json_mkstring(e.c_str()));
|
|
156
|
+
json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
|
|
142
157
|
c_ctx->error_json = json_stringify(json_err, " ");;
|
|
143
158
|
c_ctx->error_message = sass_strdup(msg_stream.str().c_str());
|
|
144
159
|
c_ctx->error_text = sass_strdup(e.c_str());
|
|
@@ -150,9 +165,10 @@ extern "C" {
|
|
|
150
165
|
catch (const char* e) {
|
|
151
166
|
std::stringstream msg_stream;
|
|
152
167
|
JsonNode* json_err = json_mkobject();
|
|
153
|
-
msg_stream << "Error: " << e << std::endl;
|
|
168
|
+
msg_stream << "Internal Error: " << e << std::endl;
|
|
154
169
|
json_append_member(json_err, "status", json_mknumber(4));
|
|
155
170
|
json_append_member(json_err, "message", json_mkstring(e));
|
|
171
|
+
json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
|
|
156
172
|
c_ctx->error_json = json_stringify(json_err, " ");;
|
|
157
173
|
c_ctx->error_message = sass_strdup(msg_stream.str().c_str());
|
|
158
174
|
c_ctx->error_text = sass_strdup(e);
|
|
@@ -398,14 +414,14 @@ extern "C" {
|
|
|
398
414
|
struct Sass_Compiler* ADDCALL sass_make_data_compiler (struct Sass_Data_Context* data_ctx)
|
|
399
415
|
{
|
|
400
416
|
if (data_ctx == 0) return 0;
|
|
401
|
-
Context* cpp_ctx = new Data_Context(data_ctx);
|
|
417
|
+
Context* cpp_ctx = new Data_Context(*data_ctx);
|
|
402
418
|
return sass_prepare_context(data_ctx, cpp_ctx);
|
|
403
419
|
}
|
|
404
420
|
|
|
405
421
|
struct Sass_Compiler* ADDCALL sass_make_file_compiler (struct Sass_File_Context* file_ctx)
|
|
406
422
|
{
|
|
407
423
|
if (file_ctx == 0) return 0;
|
|
408
|
-
Context* cpp_ctx = new File_Context(file_ctx);
|
|
424
|
+
Context* cpp_ctx = new File_Context(*file_ctx);
|
|
409
425
|
return sass_prepare_context(file_ctx, cpp_ctx);
|
|
410
426
|
}
|
|
411
427
|
|
|
@@ -416,10 +432,11 @@ extern "C" {
|
|
|
416
432
|
return data_ctx->error_status;
|
|
417
433
|
try {
|
|
418
434
|
if (data_ctx->source_string == 0) { throw(std::runtime_error("Data context has no source string")); }
|
|
419
|
-
if
|
|
435
|
+
// empty source string is a valid case, even if not really usefull (different than with file context)
|
|
436
|
+
// if (*data_ctx->source_string == 0) { throw(std::runtime_error("Data context has empty source string")); }
|
|
420
437
|
}
|
|
421
438
|
catch (...) { return handle_errors(data_ctx) | 1; }
|
|
422
|
-
Context* cpp_ctx = new Data_Context(data_ctx);
|
|
439
|
+
Context* cpp_ctx = new Data_Context(*data_ctx);
|
|
423
440
|
return sass_compile_context(data_ctx, cpp_ctx);
|
|
424
441
|
}
|
|
425
442
|
|
|
@@ -433,7 +450,7 @@ extern "C" {
|
|
|
433
450
|
if (*file_ctx->input_path == 0) { throw(std::runtime_error("File context has empty input path")); }
|
|
434
451
|
}
|
|
435
452
|
catch (...) { return handle_errors(file_ctx) | 1; }
|
|
436
|
-
Context* cpp_ctx = new File_Context(file_ctx);
|
|
453
|
+
Context* cpp_ctx = new File_Context(*file_ctx);
|
|
437
454
|
return sass_compile_context(file_ctx, cpp_ctx);
|
|
438
455
|
}
|
|
439
456
|
|
|
@@ -2,36 +2,12 @@
|
|
|
2
2
|
#define SASS_SASS_CONTEXT_H
|
|
3
3
|
|
|
4
4
|
#include "sass.h"
|
|
5
|
+
#include "sass.hpp"
|
|
5
6
|
#include "context.hpp"
|
|
6
7
|
#include "ast_fwd_decl.hpp"
|
|
7
8
|
|
|
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
9
|
// 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;
|
|
10
|
+
struct Sass_Options : Sass_Output_Options {
|
|
35
11
|
|
|
36
12
|
// embed sourceMappingUrl as data uri
|
|
37
13
|
bool source_map_embed;
|
|
@@ -59,11 +35,6 @@ struct Sass_Options {
|
|
|
59
35
|
// information in source-maps etc.
|
|
60
36
|
char* output_path;
|
|
61
37
|
|
|
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
38
|
// Colon-separated list of paths
|
|
68
39
|
// Semicolon-separated on Windows
|
|
69
40
|
// Maybe use array interface instead?
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#include "sass.hpp"
|
|
1
2
|
#include <string>
|
|
2
3
|
#include <cstdlib>
|
|
3
4
|
#include <cstring>
|
|
@@ -69,9 +70,8 @@ extern "C" {
|
|
|
69
70
|
else {
|
|
70
71
|
output_path = c_ctx->output_path;
|
|
71
72
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
);
|
|
73
|
+
struct Sass_Data_Context opt;
|
|
74
|
+
Data_Context cpp_ctx(opt);
|
|
75
75
|
if (c_ctx->c_functions) {
|
|
76
76
|
Sass_Function_List this_func_data = c_ctx->c_functions;
|
|
77
77
|
while ((this_func_data) && (*this_func_data)) {
|
|
@@ -145,9 +145,8 @@ extern "C" {
|
|
|
145
145
|
else {
|
|
146
146
|
output_path = c_ctx->output_path;
|
|
147
147
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
);
|
|
148
|
+
struct Sass_File_Context opt;
|
|
149
|
+
File_Context cpp_ctx(opt);
|
|
151
150
|
if (c_ctx->c_functions) {
|
|
152
151
|
Sass_Function_List this_func_data = c_ctx->c_functions;
|
|
153
152
|
while ((this_func_data) && (*this_func_data)) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
#include "sass.hpp"
|
|
1
2
|
#include "node.hpp"
|
|
2
|
-
#include "to_string.hpp"
|
|
3
3
|
|
|
4
4
|
namespace Sass {
|
|
5
5
|
|
|
@@ -38,7 +38,6 @@ namespace Sass {
|
|
|
38
38
|
end
|
|
39
39
|
*/
|
|
40
40
|
Node paths(const Node& arrs, Context& ctx) {
|
|
41
|
-
To_String to_string(&ctx);
|
|
42
41
|
|
|
43
42
|
Node loopStart = Node::createCollection();
|
|
44
43
|
loopStart.collection()->push_back(Node::createCollection());
|
|
@@ -221,28 +221,28 @@ namespace Sass {
|
|
|
221
221
|
|
|
222
222
|
std::map<unsigned int, KeyType> order;
|
|
223
223
|
|
|
224
|
-
std::map<
|
|
224
|
+
std::map<size_t, std::vector<EnumType> > grouped;
|
|
225
225
|
|
|
226
226
|
for (typename std::vector<EnumType>::iterator enumIter = enumeration.begin(), enumIterEnd = enumeration.end(); enumIter != enumIterEnd; enumIter++) {
|
|
227
227
|
EnumType& e = *enumIter;
|
|
228
228
|
|
|
229
229
|
KeyType key = keyFunc(e);
|
|
230
230
|
|
|
231
|
-
if (grouped.find(key) == grouped.end()) {
|
|
231
|
+
if (grouped.find(key.hash()) == grouped.end()) {
|
|
232
232
|
order.insert(std::make_pair((unsigned int)order.size(), key));
|
|
233
233
|
|
|
234
234
|
std::vector<EnumType> newCollection;
|
|
235
235
|
newCollection.push_back(e);
|
|
236
|
-
grouped.insert(std::make_pair(key, newCollection));
|
|
236
|
+
grouped.insert(std::make_pair(key.hash(), newCollection));
|
|
237
237
|
} else {
|
|
238
|
-
std::vector<EnumType>& collection = grouped.at(key);
|
|
238
|
+
std::vector<EnumType>& collection = grouped.at(key.hash());
|
|
239
239
|
collection.push_back(e);
|
|
240
240
|
}
|
|
241
241
|
}
|
|
242
242
|
|
|
243
243
|
for (unsigned int index = 0; index < order.size(); index++) {
|
|
244
244
|
KeyType& key = order.at(index);
|
|
245
|
-
std::vector<EnumType>& values = grouped.at(key);
|
|
245
|
+
std::vector<EnumType>& values = grouped.at(key.hash());
|
|
246
246
|
|
|
247
247
|
std::pair<KeyType, std::vector<EnumType> > grouping = std::make_pair(key, values);
|
|
248
248
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#include "sass.hpp"
|
|
1
2
|
#include <cstdlib>
|
|
2
3
|
#include <cstring>
|
|
3
4
|
#include "util.hpp"
|
|
@@ -276,7 +277,8 @@ extern "C" {
|
|
|
276
277
|
{
|
|
277
278
|
Memory_Manager mem;
|
|
278
279
|
Value* val = sass_value_to_ast_node(mem, v);
|
|
279
|
-
|
|
280
|
+
Sass_Inspect_Options options(compressed ? COMPRESSED : NESTED, precision);
|
|
281
|
+
std::string str(val->to_string(options));
|
|
280
282
|
return sass_make_qstring(str.c_str());
|
|
281
283
|
}
|
|
282
284
|
|
|
@@ -290,42 +292,43 @@ extern "C" {
|
|
|
290
292
|
|
|
291
293
|
Value* lhs = sass_value_to_ast_node(mem, a);
|
|
292
294
|
Value* rhs = sass_value_to_ast_node(mem, b);
|
|
295
|
+
struct Sass_Inspect_Options options(NESTED, 5);
|
|
293
296
|
|
|
294
297
|
// see if it's a relational expression
|
|
295
298
|
switch(op) {
|
|
296
299
|
case Sass_OP::EQ: return sass_make_boolean(Eval::eq(lhs, rhs));
|
|
297
300
|
case Sass_OP::NEQ: return sass_make_boolean(!Eval::eq(lhs, rhs));
|
|
298
|
-
case Sass_OP::GT: return sass_make_boolean(!Eval::lt(lhs, rhs) && !Eval::eq(lhs, rhs));
|
|
299
|
-
case Sass_OP::GTE: return sass_make_boolean(!Eval::lt(lhs, rhs));
|
|
300
|
-
case Sass_OP::LT: return sass_make_boolean(Eval::lt(lhs, rhs));
|
|
301
|
-
case Sass_OP::LTE: return sass_make_boolean(Eval::lt(lhs, rhs) || Eval::eq(lhs, rhs));
|
|
301
|
+
case Sass_OP::GT: return sass_make_boolean(!Eval::lt(lhs, rhs, "gt") && !Eval::eq(lhs, rhs));
|
|
302
|
+
case Sass_OP::GTE: return sass_make_boolean(!Eval::lt(lhs, rhs, "gte"));
|
|
303
|
+
case Sass_OP::LT: return sass_make_boolean(Eval::lt(lhs, rhs, "lt"));
|
|
304
|
+
case Sass_OP::LTE: return sass_make_boolean(Eval::lt(lhs, rhs, "lte") || Eval::eq(lhs, rhs));
|
|
302
305
|
default: break;
|
|
303
306
|
}
|
|
304
307
|
|
|
305
308
|
if (sass_value_is_number(a) && sass_value_is_number(b)) {
|
|
306
309
|
const Number* l_n = dynamic_cast<const Number*>(lhs);
|
|
307
310
|
const Number* r_n = dynamic_cast<const Number*>(rhs);
|
|
308
|
-
rv = Eval::op_numbers(mem, op, *l_n, *r_n);
|
|
311
|
+
rv = Eval::op_numbers(mem, op, *l_n, *r_n, options);
|
|
309
312
|
}
|
|
310
313
|
else if (sass_value_is_number(a) && sass_value_is_color(a)) {
|
|
311
314
|
const Number* l_n = dynamic_cast<const Number*>(lhs);
|
|
312
315
|
const Color* r_c = dynamic_cast<const Color*>(rhs);
|
|
313
|
-
rv = Eval::op_number_color(mem, op, *l_n, *r_c);
|
|
316
|
+
rv = Eval::op_number_color(mem, op, *l_n, *r_c, options);
|
|
314
317
|
}
|
|
315
318
|
else if (sass_value_is_color(a) && sass_value_is_number(b)) {
|
|
316
319
|
const Color* l_c = dynamic_cast<const Color*>(lhs);
|
|
317
320
|
const Number* r_n = dynamic_cast<const Number*>(rhs);
|
|
318
|
-
rv = Eval::op_color_number(mem, op, *l_c, *r_n);
|
|
321
|
+
rv = Eval::op_color_number(mem, op, *l_c, *r_n, options);
|
|
319
322
|
}
|
|
320
323
|
else if (sass_value_is_color(a) && sass_value_is_color(b)) {
|
|
321
324
|
const Color* l_c = dynamic_cast<const Color*>(lhs);
|
|
322
325
|
const Color* r_c = dynamic_cast<const Color*>(rhs);
|
|
323
|
-
rv = Eval::op_colors(mem, op, *l_c, *r_c);
|
|
326
|
+
rv = Eval::op_colors(mem, op, *l_c, *r_c, options);
|
|
324
327
|
}
|
|
325
328
|
else /* convert other stuff to string and apply operation */ {
|
|
326
329
|
Value* l_v = dynamic_cast<Value*>(lhs);
|
|
327
330
|
Value* r_v = dynamic_cast<Value*>(rhs);
|
|
328
|
-
rv = Eval::op_strings(mem, op, *l_v, *r_v);
|
|
331
|
+
rv = Eval::op_strings(mem, op, *l_v, *r_v, options);
|
|
329
332
|
}
|
|
330
333
|
|
|
331
334
|
// ToDo: maybe we should should return null value?
|