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
data/ext/libsass/src/context.hpp
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
#include "environment.hpp"
|
|
16
16
|
#include "source_map.hpp"
|
|
17
17
|
#include "subset_map.hpp"
|
|
18
|
+
#include "backtrace.hpp"
|
|
18
19
|
#include "output.hpp"
|
|
19
20
|
#include "plugins.hpp"
|
|
20
21
|
#include "file.hpp"
|
|
@@ -43,6 +44,9 @@ namespace Sass {
|
|
|
43
44
|
Plugins plugins;
|
|
44
45
|
Output emitter;
|
|
45
46
|
|
|
47
|
+
// generic ast node garbage container
|
|
48
|
+
// used to avoid possible circular refs
|
|
49
|
+
std::vector<AST_Node_Obj> ast_gc;
|
|
46
50
|
// resources add under our control
|
|
47
51
|
// these are guaranteed to be freed
|
|
48
52
|
std::vector<char*> strings;
|
|
@@ -50,6 +54,8 @@ namespace Sass {
|
|
|
50
54
|
std::map<const std::string, StyleSheet> sheets;
|
|
51
55
|
Subset_Map subset_map;
|
|
52
56
|
std::vector<Sass_Import_Entry> import_stack;
|
|
57
|
+
std::vector<Sass_Callee> callee_stack;
|
|
58
|
+
std::vector<Backtrace> traces;
|
|
53
59
|
|
|
54
60
|
struct Sass_Compiler* c_compiler;
|
|
55
61
|
|
|
@@ -61,6 +67,7 @@ namespace Sass {
|
|
|
61
67
|
|
|
62
68
|
std::vector<std::string> plugin_paths; // relative paths to load plugins
|
|
63
69
|
std::vector<std::string> include_paths; // lookup paths for includes
|
|
70
|
+
std::vector<std::string> extensions; // lookup extensions for imports`
|
|
64
71
|
|
|
65
72
|
|
|
66
73
|
|
|
@@ -90,7 +97,8 @@ namespace Sass {
|
|
|
90
97
|
virtual char* render(Block_Obj root);
|
|
91
98
|
virtual char* render_srcmap();
|
|
92
99
|
|
|
93
|
-
void register_resource(const Include&, const Resource
|
|
100
|
+
void register_resource(const Include&, const Resource&);
|
|
101
|
+
void register_resource(const Include&, const Resource&, ParserState&);
|
|
94
102
|
std::vector<Include> find_includes(const Importer& import);
|
|
95
103
|
Include load_import(const Importer&, ParserState pstate);
|
|
96
104
|
|
|
@@ -102,6 +110,8 @@ namespace Sass {
|
|
|
102
110
|
void collect_plugin_paths(string_list* paths_array);
|
|
103
111
|
void collect_include_paths(const char* paths_str);
|
|
104
112
|
void collect_include_paths(string_list* paths_array);
|
|
113
|
+
void collect_extensions(const char* extensions_str);
|
|
114
|
+
void collect_extensions(string_list* extensions_array);
|
|
105
115
|
std::string format_embedded_source_map();
|
|
106
116
|
std::string format_source_mapping_url(const std::string& out_path);
|
|
107
117
|
|
data/ext/libsass/src/cssize.cpp
CHANGED
|
@@ -5,15 +5,14 @@
|
|
|
5
5
|
|
|
6
6
|
#include "cssize.hpp"
|
|
7
7
|
#include "context.hpp"
|
|
8
|
-
#include "backtrace.hpp"
|
|
9
8
|
|
|
10
9
|
namespace Sass {
|
|
11
10
|
|
|
12
|
-
Cssize::Cssize(Context& ctx
|
|
11
|
+
Cssize::Cssize(Context& ctx)
|
|
13
12
|
: ctx(ctx),
|
|
13
|
+
traces(ctx.traces),
|
|
14
14
|
block_stack(std::vector<Block_Ptr>()),
|
|
15
|
-
p_stack(std::vector<Statement_Ptr>())
|
|
16
|
-
backtrace(bt)
|
|
15
|
+
p_stack(std::vector<Statement_Ptr>())
|
|
17
16
|
{ }
|
|
18
17
|
|
|
19
18
|
Statement_Ptr Cssize::parent()
|
|
@@ -23,25 +22,28 @@ namespace Sass {
|
|
|
23
22
|
|
|
24
23
|
Block_Ptr Cssize::operator()(Block_Ptr b)
|
|
25
24
|
{
|
|
26
|
-
|
|
25
|
+
Block_Obj bb = SASS_MEMORY_NEW(Block, b->pstate(), b->length(), b->is_root());
|
|
27
26
|
// bb->tabs(b->tabs());
|
|
28
27
|
block_stack.push_back(bb);
|
|
29
28
|
append_block(b, bb);
|
|
30
29
|
block_stack.pop_back();
|
|
31
|
-
return bb;
|
|
30
|
+
return bb.detach();
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
Statement_Ptr Cssize::operator()(Trace_Ptr t)
|
|
35
34
|
{
|
|
36
|
-
|
|
35
|
+
traces.push_back(Backtrace(t->pstate()));
|
|
36
|
+
auto result = t->block()->perform(this);
|
|
37
|
+
traces.pop_back();
|
|
38
|
+
return result;
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
Statement_Ptr Cssize::operator()(Declaration_Ptr d)
|
|
40
42
|
{
|
|
41
|
-
String_Obj property =
|
|
43
|
+
String_Obj property = Cast<String>(d->property());
|
|
42
44
|
|
|
43
|
-
if (Declaration_Ptr dd =
|
|
44
|
-
String_Obj parent_property =
|
|
45
|
+
if (Declaration_Ptr dd = Cast<Declaration>(parent())) {
|
|
46
|
+
String_Obj parent_property = Cast<String>(dd->property());
|
|
45
47
|
property = SASS_MEMORY_NEW(String_Constant,
|
|
46
48
|
d->property()->pstate(),
|
|
47
49
|
parent_property->to_string() + "-" + property->to_string());
|
|
@@ -54,17 +56,18 @@ namespace Sass {
|
|
|
54
56
|
d->pstate(),
|
|
55
57
|
property,
|
|
56
58
|
d->value(),
|
|
57
|
-
d->is_important()
|
|
59
|
+
d->is_important(),
|
|
60
|
+
d->is_custom_property());
|
|
58
61
|
dd->is_indented(d->is_indented());
|
|
59
62
|
dd->tabs(d->tabs());
|
|
60
63
|
|
|
61
|
-
p_stack.push_back(
|
|
62
|
-
Block_Obj bb = d->block() ? operator()(
|
|
64
|
+
p_stack.push_back(dd);
|
|
65
|
+
Block_Obj bb = d->block() ? operator()(d->block()) : NULL;
|
|
63
66
|
p_stack.pop_back();
|
|
64
67
|
|
|
65
68
|
if (bb && bb->length()) {
|
|
66
69
|
if (dd->value() && !dd->value()->is_invisible()) {
|
|
67
|
-
bb->unshift(
|
|
70
|
+
bb->unshift(dd);
|
|
68
71
|
}
|
|
69
72
|
return bb.detach();
|
|
70
73
|
}
|
|
@@ -89,7 +92,7 @@ namespace Sass {
|
|
|
89
92
|
r->pstate(),
|
|
90
93
|
r->keyword(),
|
|
91
94
|
r->selector(),
|
|
92
|
-
r->block() ? operator()(
|
|
95
|
+
r->block() ? operator()(r->block()) : 0);
|
|
93
96
|
if (r->value()) rr->value(r->value());
|
|
94
97
|
p_stack.pop_back();
|
|
95
98
|
|
|
@@ -99,10 +102,10 @@ namespace Sass {
|
|
|
99
102
|
Statement_Obj s = r->block()->at(i);
|
|
100
103
|
if (s->statement_type() != Statement::BUBBLE) directive_exists = true;
|
|
101
104
|
else {
|
|
102
|
-
Bubble_Obj s_obj =
|
|
105
|
+
Bubble_Obj s_obj = Cast<Bubble>(s);
|
|
103
106
|
s = s_obj->node();
|
|
104
107
|
if (s->statement_type() != Statement::DIRECTIVE) directive_exists = false;
|
|
105
|
-
else directive_exists = (
|
|
108
|
+
else directive_exists = (Cast<Directive>(s)->keyword() == rr->keyword());
|
|
106
109
|
}
|
|
107
110
|
|
|
108
111
|
}
|
|
@@ -110,12 +113,14 @@ namespace Sass {
|
|
|
110
113
|
Block_Ptr result = SASS_MEMORY_NEW(Block, rr->pstate());
|
|
111
114
|
if (!(directive_exists || rr->is_keyframes()))
|
|
112
115
|
{
|
|
113
|
-
Directive_Ptr empty_node =
|
|
116
|
+
Directive_Ptr empty_node = Cast<Directive>(rr);
|
|
114
117
|
empty_node->block(SASS_MEMORY_NEW(Block, rr->block() ? rr->block()->pstate() : rr->pstate()));
|
|
115
118
|
result->append(empty_node);
|
|
116
119
|
}
|
|
117
120
|
|
|
118
|
-
Block_Obj
|
|
121
|
+
Block_Obj db = rr->block();
|
|
122
|
+
if (db.isNull()) db = SASS_MEMORY_NEW(Block, rr->pstate());
|
|
123
|
+
Block_Obj ss = debubble(db, rr);
|
|
119
124
|
for (size_t i = 0, L = ss->length(); i < L; ++i) {
|
|
120
125
|
result->append(ss->at(i));
|
|
121
126
|
}
|
|
@@ -129,10 +134,10 @@ namespace Sass {
|
|
|
129
134
|
|
|
130
135
|
Keyframe_Rule_Obj rr = SASS_MEMORY_NEW(Keyframe_Rule,
|
|
131
136
|
r->pstate(),
|
|
132
|
-
operator()(
|
|
133
|
-
if (
|
|
137
|
+
operator()(r->block()));
|
|
138
|
+
if (!r->name().isNull()) rr->name(r->name());
|
|
134
139
|
|
|
135
|
-
return debubble(
|
|
140
|
+
return debubble(rr->block(), rr);
|
|
136
141
|
}
|
|
137
142
|
|
|
138
143
|
Statement_Ptr Cssize::operator()(Ruleset_Ptr r)
|
|
@@ -142,11 +147,11 @@ namespace Sass {
|
|
|
142
147
|
// string schema is not a statement!
|
|
143
148
|
// r->block() is already a string schema
|
|
144
149
|
// and that is comming from propset expand
|
|
145
|
-
Block_Ptr bb = operator()(
|
|
150
|
+
Block_Ptr bb = operator()(r->block());
|
|
146
151
|
// this should protect us (at least a bit) from our mess
|
|
147
152
|
// fixing this properly is harder that it should be ...
|
|
148
|
-
if (
|
|
149
|
-
error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate());
|
|
153
|
+
if (Cast<Statement>(bb) == NULL) {
|
|
154
|
+
error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate(), traces);
|
|
150
155
|
}
|
|
151
156
|
Ruleset_Obj rr = SASS_MEMORY_NEW(Ruleset,
|
|
152
157
|
r->pstate(),
|
|
@@ -158,31 +163,31 @@ namespace Sass {
|
|
|
158
163
|
p_stack.pop_back();
|
|
159
164
|
|
|
160
165
|
if (!rr->block()) {
|
|
161
|
-
error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate());
|
|
166
|
+
error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate(), traces);
|
|
162
167
|
}
|
|
163
168
|
|
|
164
169
|
Block_Obj props = SASS_MEMORY_NEW(Block, rr->block()->pstate());
|
|
165
170
|
Block_Ptr rules = SASS_MEMORY_NEW(Block, rr->block()->pstate());
|
|
166
171
|
for (size_t i = 0, L = rr->block()->length(); i < L; i++)
|
|
167
172
|
{
|
|
168
|
-
Statement_Ptr s =
|
|
173
|
+
Statement_Ptr s = rr->block()->at(i);
|
|
169
174
|
if (bubblable(s)) rules->append(s);
|
|
170
175
|
if (!bubblable(s)) props->append(s);
|
|
171
176
|
}
|
|
172
177
|
|
|
173
178
|
if (props->length())
|
|
174
179
|
{
|
|
175
|
-
Block_Obj
|
|
176
|
-
|
|
177
|
-
rr->block(
|
|
180
|
+
Block_Obj pb = SASS_MEMORY_NEW(Block, rr->block()->pstate());
|
|
181
|
+
pb->concat(props);
|
|
182
|
+
rr->block(pb);
|
|
178
183
|
|
|
179
184
|
for (size_t i = 0, L = rules->length(); i < L; i++)
|
|
180
185
|
{
|
|
181
|
-
Statement_Ptr stm =
|
|
186
|
+
Statement_Ptr stm = rules->at(i);
|
|
182
187
|
stm->tabs(stm->tabs() + 1);
|
|
183
188
|
}
|
|
184
189
|
|
|
185
|
-
rules->unshift(
|
|
190
|
+
rules->unshift(rr);
|
|
186
191
|
}
|
|
187
192
|
|
|
188
193
|
Block_Ptr ptr = rules;
|
|
@@ -194,7 +199,7 @@ namespace Sass {
|
|
|
194
199
|
}
|
|
195
200
|
|
|
196
201
|
if (!(!rules->length() ||
|
|
197
|
-
!bubblable(
|
|
202
|
+
!bubblable(rules->last()) ||
|
|
198
203
|
parent()->statement_type() == Statement::RULESET))
|
|
199
204
|
{
|
|
200
205
|
rules->last()->group_end(true);
|
|
@@ -219,13 +224,13 @@ namespace Sass {
|
|
|
219
224
|
|
|
220
225
|
Media_Block_Obj mm = SASS_MEMORY_NEW(Media_Block,
|
|
221
226
|
m->pstate(),
|
|
222
|
-
|
|
223
|
-
operator()(
|
|
227
|
+
m->media_queries(),
|
|
228
|
+
operator()(m->block()));
|
|
224
229
|
mm->tabs(m->tabs());
|
|
225
230
|
|
|
226
231
|
p_stack.pop_back();
|
|
227
232
|
|
|
228
|
-
return debubble(
|
|
233
|
+
return debubble(mm->block(), mm);
|
|
229
234
|
}
|
|
230
235
|
|
|
231
236
|
Statement_Ptr Cssize::operator()(Supports_Block_Ptr m)
|
|
@@ -240,13 +245,13 @@ namespace Sass {
|
|
|
240
245
|
|
|
241
246
|
Supports_Block_Obj mm = SASS_MEMORY_NEW(Supports_Block,
|
|
242
247
|
m->pstate(),
|
|
243
|
-
|
|
244
|
-
operator()(
|
|
248
|
+
m->condition(),
|
|
249
|
+
operator()(m->block()));
|
|
245
250
|
mm->tabs(m->tabs());
|
|
246
251
|
|
|
247
252
|
p_stack.pop_back();
|
|
248
253
|
|
|
249
|
-
return debubble(
|
|
254
|
+
return debubble(mm->block(), mm);
|
|
250
255
|
}
|
|
251
256
|
|
|
252
257
|
Statement_Ptr Cssize::operator()(At_Root_Block_Ptr m)
|
|
@@ -257,15 +262,15 @@ namespace Sass {
|
|
|
257
262
|
tmp |= m->exclude_node(s);
|
|
258
263
|
}
|
|
259
264
|
|
|
260
|
-
if (!tmp)
|
|
265
|
+
if (!tmp && m->block())
|
|
261
266
|
{
|
|
262
|
-
Block_Ptr bb = operator()(
|
|
267
|
+
Block_Ptr bb = operator()(m->block());
|
|
263
268
|
for (size_t i = 0, L = bb->length(); i < L; ++i) {
|
|
264
269
|
// (bb->elements())[i]->tabs(m->tabs());
|
|
265
270
|
Statement_Obj stm = bb->at(i);
|
|
266
|
-
if (bubblable(
|
|
271
|
+
if (bubblable(stm)) stm->tabs(stm->tabs() + m->tabs());
|
|
267
272
|
}
|
|
268
|
-
if (bb->length() && bubblable(
|
|
273
|
+
if (bb->length() && bubblable(bb->last())) bb->last()->group_end(m->group_end());
|
|
269
274
|
return bb;
|
|
270
275
|
}
|
|
271
276
|
|
|
@@ -280,13 +285,13 @@ namespace Sass {
|
|
|
280
285
|
Statement_Ptr Cssize::bubble(Directive_Ptr m)
|
|
281
286
|
{
|
|
282
287
|
Block_Ptr bb = SASS_MEMORY_NEW(Block, this->parent()->pstate());
|
|
283
|
-
Has_Block_Obj new_rule =
|
|
288
|
+
Has_Block_Obj new_rule = Cast<Has_Block>(SASS_MEMORY_COPY(this->parent()));
|
|
284
289
|
new_rule->block(bb);
|
|
285
290
|
new_rule->tabs(this->parent()->tabs());
|
|
286
|
-
new_rule->block()->concat(
|
|
291
|
+
new_rule->block()->concat(m->block());
|
|
287
292
|
|
|
288
293
|
Block_Obj wrapper_block = SASS_MEMORY_NEW(Block, m->block() ? m->block()->pstate() : m->pstate());
|
|
289
|
-
wrapper_block->append(
|
|
294
|
+
wrapper_block->append(new_rule);
|
|
290
295
|
Directive_Obj mm = SASS_MEMORY_NEW(Directive,
|
|
291
296
|
m->pstate(),
|
|
292
297
|
m->keyword(),
|
|
@@ -294,20 +299,23 @@ namespace Sass {
|
|
|
294
299
|
wrapper_block);
|
|
295
300
|
if (m->value()) mm->value(m->value());
|
|
296
301
|
|
|
297
|
-
Bubble_Ptr bubble = SASS_MEMORY_NEW(Bubble, mm->pstate(),
|
|
302
|
+
Bubble_Ptr bubble = SASS_MEMORY_NEW(Bubble, mm->pstate(), mm);
|
|
298
303
|
return bubble;
|
|
299
304
|
}
|
|
300
305
|
|
|
301
306
|
Statement_Ptr Cssize::bubble(At_Root_Block_Ptr m)
|
|
302
307
|
{
|
|
308
|
+
if (!m || !m->block()) return NULL;
|
|
303
309
|
Block_Ptr bb = SASS_MEMORY_NEW(Block, this->parent()->pstate());
|
|
304
|
-
Has_Block_Obj new_rule =
|
|
305
|
-
new_rule->block(bb);
|
|
306
|
-
new_rule->tabs(this->parent()->tabs());
|
|
307
|
-
new_rule->block()->concat(&m->block());
|
|
308
|
-
|
|
310
|
+
Has_Block_Obj new_rule = Cast<Has_Block>(SASS_MEMORY_COPY(this->parent()));
|
|
309
311
|
Block_Ptr wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
|
|
310
|
-
|
|
312
|
+
if (new_rule) {
|
|
313
|
+
new_rule->block(bb);
|
|
314
|
+
new_rule->tabs(this->parent()->tabs());
|
|
315
|
+
new_rule->block()->concat(m->block());
|
|
316
|
+
wrapper_block->append(new_rule);
|
|
317
|
+
}
|
|
318
|
+
|
|
311
319
|
At_Root_Block_Ptr mm = SASS_MEMORY_NEW(At_Root_Block,
|
|
312
320
|
m->pstate(),
|
|
313
321
|
wrapper_block,
|
|
@@ -318,7 +326,7 @@ namespace Sass {
|
|
|
318
326
|
|
|
319
327
|
Statement_Ptr Cssize::bubble(Supports_Block_Ptr m)
|
|
320
328
|
{
|
|
321
|
-
Ruleset_Obj parent =
|
|
329
|
+
Ruleset_Obj parent = Cast<Ruleset>(SASS_MEMORY_COPY(this->parent()));
|
|
322
330
|
|
|
323
331
|
Block_Ptr bb = SASS_MEMORY_NEW(Block, parent->block()->pstate());
|
|
324
332
|
Ruleset_Ptr new_rule = SASS_MEMORY_NEW(Ruleset,
|
|
@@ -326,13 +334,13 @@ namespace Sass {
|
|
|
326
334
|
parent->selector(),
|
|
327
335
|
bb);
|
|
328
336
|
new_rule->tabs(parent->tabs());
|
|
329
|
-
new_rule->block()->concat(
|
|
337
|
+
new_rule->block()->concat(m->block());
|
|
330
338
|
|
|
331
339
|
Block_Ptr wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
|
|
332
340
|
wrapper_block->append(new_rule);
|
|
333
341
|
Supports_Block_Ptr mm = SASS_MEMORY_NEW(Supports_Block,
|
|
334
342
|
m->pstate(),
|
|
335
|
-
|
|
343
|
+
m->condition(),
|
|
336
344
|
wrapper_block);
|
|
337
345
|
|
|
338
346
|
mm->tabs(m->tabs());
|
|
@@ -343,7 +351,7 @@ namespace Sass {
|
|
|
343
351
|
|
|
344
352
|
Statement_Ptr Cssize::bubble(Media_Block_Ptr m)
|
|
345
353
|
{
|
|
346
|
-
Ruleset_Obj parent =
|
|
354
|
+
Ruleset_Obj parent = Cast<Ruleset>(SASS_MEMORY_COPY(this->parent()));
|
|
347
355
|
|
|
348
356
|
Block_Ptr bb = SASS_MEMORY_NEW(Block, parent->block()->pstate());
|
|
349
357
|
Ruleset_Ptr new_rule = SASS_MEMORY_NEW(Ruleset,
|
|
@@ -351,32 +359,31 @@ namespace Sass {
|
|
|
351
359
|
parent->selector(),
|
|
352
360
|
bb);
|
|
353
361
|
new_rule->tabs(parent->tabs());
|
|
354
|
-
new_rule->block()->concat(
|
|
362
|
+
new_rule->block()->concat(m->block());
|
|
355
363
|
|
|
356
364
|
Block_Ptr wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
|
|
357
365
|
wrapper_block->append(new_rule);
|
|
358
366
|
Media_Block_Obj mm = SASS_MEMORY_NEW(Media_Block,
|
|
359
367
|
m->pstate(),
|
|
360
|
-
|
|
361
|
-
wrapper_block
|
|
362
|
-
0);
|
|
368
|
+
m->media_queries(),
|
|
369
|
+
wrapper_block);
|
|
363
370
|
|
|
364
371
|
mm->tabs(m->tabs());
|
|
365
372
|
|
|
366
|
-
return SASS_MEMORY_NEW(Bubble, mm->pstate(),
|
|
373
|
+
return SASS_MEMORY_NEW(Bubble, mm->pstate(), mm);
|
|
367
374
|
}
|
|
368
375
|
|
|
369
376
|
bool Cssize::bubblable(Statement_Ptr s)
|
|
370
377
|
{
|
|
371
|
-
return
|
|
378
|
+
return Cast<Ruleset>(s) || s->bubbles();
|
|
372
379
|
}
|
|
373
380
|
|
|
374
381
|
Block_Ptr Cssize::flatten(Block_Ptr b)
|
|
375
382
|
{
|
|
376
383
|
Block_Ptr result = SASS_MEMORY_NEW(Block, b->pstate(), 0, b->is_root());
|
|
377
384
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
|
378
|
-
Statement_Ptr ss =
|
|
379
|
-
if (Block_Ptr bb =
|
|
385
|
+
Statement_Ptr ss = b->at(i);
|
|
386
|
+
if (Block_Ptr bb = Cast<Block>(ss)) {
|
|
380
387
|
Block_Obj bs = flatten(bb);
|
|
381
388
|
for (size_t j = 0, K = bs->length(); j < K; ++j) {
|
|
382
389
|
result->append(bs->at(j));
|
|
@@ -395,7 +402,7 @@ namespace Sass {
|
|
|
395
402
|
|
|
396
403
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
|
397
404
|
Statement_Obj value = b->at(i);
|
|
398
|
-
bool key =
|
|
405
|
+
bool key = Cast<Bubble>(value) != NULL;
|
|
399
406
|
|
|
400
407
|
if (!results.empty() && results.back().first == key)
|
|
401
408
|
{
|
|
@@ -424,45 +431,50 @@ namespace Sass {
|
|
|
424
431
|
|
|
425
432
|
if (!is_bubble) {
|
|
426
433
|
if (!parent) {
|
|
427
|
-
result->append(
|
|
434
|
+
result->append(slice);
|
|
428
435
|
}
|
|
429
436
|
else if (previous_parent) {
|
|
430
|
-
previous_parent->block()->concat(
|
|
437
|
+
previous_parent->block()->concat(slice);
|
|
431
438
|
}
|
|
432
439
|
else {
|
|
433
|
-
previous_parent =
|
|
440
|
+
previous_parent = Cast<Has_Block>(SASS_MEMORY_COPY(parent));
|
|
434
441
|
previous_parent->block(slice);
|
|
435
442
|
previous_parent->tabs(parent->tabs());
|
|
436
443
|
|
|
437
|
-
result->append(
|
|
444
|
+
result->append(previous_parent);
|
|
438
445
|
}
|
|
439
446
|
continue;
|
|
440
447
|
}
|
|
441
448
|
|
|
442
449
|
for (size_t j = 0, K = slice->length(); j < K; ++j)
|
|
443
450
|
{
|
|
444
|
-
Statement_Ptr ss
|
|
451
|
+
Statement_Ptr ss;
|
|
445
452
|
Statement_Obj stm = slice->at(j);
|
|
446
453
|
// this has to go now here (too bad)
|
|
447
|
-
Bubble_Obj node =
|
|
454
|
+
Bubble_Obj node = Cast<Bubble>(stm);
|
|
448
455
|
Media_Block_Ptr m1 = NULL;
|
|
449
456
|
Media_Block_Ptr m2 = NULL;
|
|
450
|
-
if (parent) m1 =
|
|
451
|
-
if (node) m2 =
|
|
457
|
+
if (parent) m1 = Cast<Media_Block>(parent);
|
|
458
|
+
if (node) m2 = Cast<Media_Block>(node->node());
|
|
452
459
|
if (!parent ||
|
|
453
460
|
parent->statement_type() != Statement::MEDIA ||
|
|
454
461
|
node->node()->statement_type() != Statement::MEDIA ||
|
|
455
|
-
(m1 && m2 &&
|
|
462
|
+
(m1 && m2 && *m1->media_queries() == *m2->media_queries())
|
|
456
463
|
)
|
|
457
464
|
{
|
|
458
|
-
ss =
|
|
465
|
+
ss = node->node();
|
|
459
466
|
}
|
|
460
467
|
else
|
|
461
468
|
{
|
|
462
|
-
List_Obj mq = merge_media_queries(
|
|
469
|
+
List_Obj mq = merge_media_queries(
|
|
470
|
+
Cast<Media_Block>(node->node()),
|
|
471
|
+
Cast<Media_Block>(parent)
|
|
472
|
+
);
|
|
463
473
|
if (!mq->length()) continue;
|
|
464
|
-
|
|
465
|
-
|
|
474
|
+
if (Media_Block* b = Cast<Media_Block>(node->node())) {
|
|
475
|
+
b->media_queries(mq);
|
|
476
|
+
}
|
|
477
|
+
ss = node->node();
|
|
466
478
|
}
|
|
467
479
|
|
|
468
480
|
if (!ss) continue;
|
|
@@ -470,8 +482,6 @@ namespace Sass {
|
|
|
470
482
|
ss->tabs(ss->tabs() + node->tabs());
|
|
471
483
|
ss->group_end(node->group_end());
|
|
472
484
|
|
|
473
|
-
if (!ss) continue;
|
|
474
|
-
|
|
475
485
|
Block_Obj bb = SASS_MEMORY_NEW(Block,
|
|
476
486
|
children->pstate(),
|
|
477
487
|
children->length(),
|
|
@@ -483,7 +493,7 @@ namespace Sass {
|
|
|
483
493
|
children->length(),
|
|
484
494
|
children->is_root());
|
|
485
495
|
|
|
486
|
-
Block_Ptr wrapper = flatten(
|
|
496
|
+
Block_Ptr wrapper = flatten(bb);
|
|
487
497
|
wrapper_block->append(wrapper);
|
|
488
498
|
|
|
489
499
|
if (wrapper->length()) {
|
|
@@ -491,12 +501,12 @@ namespace Sass {
|
|
|
491
501
|
}
|
|
492
502
|
|
|
493
503
|
if (wrapper_block) {
|
|
494
|
-
result->append(
|
|
504
|
+
result->append(wrapper_block);
|
|
495
505
|
}
|
|
496
506
|
}
|
|
497
507
|
}
|
|
498
508
|
|
|
499
|
-
return flatten(
|
|
509
|
+
return flatten(result);
|
|
500
510
|
}
|
|
501
511
|
|
|
502
512
|
Statement_Ptr Cssize::fallback_impl(AST_Node_Ptr n)
|
|
@@ -508,7 +518,7 @@ namespace Sass {
|
|
|
508
518
|
{
|
|
509
519
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
|
510
520
|
Statement_Obj ith = b->at(i)->perform(this);
|
|
511
|
-
if (Block_Ptr bb =
|
|
521
|
+
if (Block_Ptr bb = Cast<Block>(ith)) {
|
|
512
522
|
for (size_t j = 0, K = bb->length(); j < K; ++j) {
|
|
513
523
|
cur->append(bb->at(j));
|
|
514
524
|
}
|
|
@@ -530,8 +540,8 @@ namespace Sass {
|
|
|
530
540
|
for (size_t j = 0, K = m2->media_queries()->length(); j < K; j++) {
|
|
531
541
|
Expression_Obj l1 = m1->media_queries()->at(i);
|
|
532
542
|
Expression_Obj l2 = m2->media_queries()->at(j);
|
|
533
|
-
Media_Query_Ptr mq1 =
|
|
534
|
-
Media_Query_Ptr mq2 =
|
|
543
|
+
Media_Query_Ptr mq1 = Cast<Media_Query>(l1);
|
|
544
|
+
Media_Query_Ptr mq2 = Cast<Media_Query>(l2);
|
|
535
545
|
Media_Query_Ptr mq = merge_media_query(mq1, mq2);
|
|
536
546
|
if (mq) qq->append(mq);
|
|
537
547
|
}
|
|
@@ -548,9 +558,9 @@ namespace Sass {
|
|
|
548
558
|
std::string mod;
|
|
549
559
|
|
|
550
560
|
std::string m1 = std::string(mq1->is_restricted() ? "only" : mq1->is_negated() ? "not" : "");
|
|
551
|
-
std::string t1 =
|
|
552
|
-
std::string m2 = std::string(mq2->is_restricted() ? "only" :
|
|
553
|
-
std::string t2 =
|
|
561
|
+
std::string t1 = mq1->media_type() ? mq1->media_type()->to_string(ctx.c_options) : "";
|
|
562
|
+
std::string m2 = std::string(mq2->is_restricted() ? "only" : mq2->is_negated() ? "not" : "");
|
|
563
|
+
std::string t2 = mq2->media_type() ? mq2->media_type()->to_string(ctx.c_options) : "";
|
|
554
564
|
|
|
555
565
|
|
|
556
566
|
if (t1.empty()) t1 = t2;
|
|
@@ -578,10 +588,11 @@ namespace Sass {
|
|
|
578
588
|
}
|
|
579
589
|
|
|
580
590
|
Media_Query_Ptr mm = SASS_MEMORY_NEW(Media_Query,
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
mq1->length() + mq2->length(),
|
|
584
|
-
|
|
591
|
+
mq1->pstate(),
|
|
592
|
+
0,
|
|
593
|
+
mq1->length() + mq2->length(),
|
|
594
|
+
mod == "not",
|
|
595
|
+
mod == "only");
|
|
585
596
|
|
|
586
597
|
if (!type.empty()) {
|
|
587
598
|
mm->media_type(SASS_MEMORY_NEW(String_Quoted, mq1->pstate(), type));
|