sassc 2.2.1 → 2.4.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 +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +18 -0
- data/Rakefile +1 -3
- data/ext/extconf.rb +13 -5
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/base.h +2 -1
- data/ext/libsass/include/sass/context.h +4 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +158 -168
- data/ext/libsass/src/ast.hpp +389 -230
- data/ext/libsass/src/ast_def_macros.hpp +18 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
- data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
- data/ext/libsass/src/ast_helpers.hpp +292 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +207 -212
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +594 -1026
- data/ext/libsass/src/ast_selectors.hpp +339 -385
- data/ext/libsass/src/ast_supports.cpp +36 -52
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +271 -84
- data/ext/libsass/src/ast_values.hpp +116 -107
- data/ext/libsass/src/backtrace.cpp +9 -9
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +2 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +18 -18
- data/ext/libsass/src/bind.hpp +1 -1
- data/ext/libsass/src/c2ast.cpp +3 -3
- data/ext/libsass/src/c2ast.hpp +1 -1
- data/ext/libsass/src/cencode.c +4 -6
- data/ext/libsass/src/check_nesting.cpp +40 -41
- data/ext/libsass/src/check_nesting.hpp +6 -2
- data/ext/libsass/src/color_maps.cpp +14 -13
- data/ext/libsass/src/color_maps.hpp +1 -9
- data/ext/libsass/src/constants.cpp +5 -0
- data/ext/libsass/src/constants.hpp +6 -0
- data/ext/libsass/src/context.cpp +92 -119
- data/ext/libsass/src/context.hpp +41 -53
- data/ext/libsass/src/cssize.cpp +66 -149
- data/ext/libsass/src/cssize.hpp +17 -23
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debugger.hpp +451 -295
- data/ext/libsass/src/emitter.cpp +15 -16
- data/ext/libsass/src/emitter.hpp +10 -12
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +29 -24
- data/ext/libsass/src/error_handling.cpp +62 -41
- data/ext/libsass/src/error_handling.hpp +61 -51
- data/ext/libsass/src/eval.cpp +167 -281
- data/ext/libsass/src/eval.hpp +27 -29
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +275 -222
- data/ext/libsass/src/expand.hpp +36 -16
- data/ext/libsass/src/extender.cpp +1188 -0
- data/ext/libsass/src/extender.hpp +399 -0
- data/ext/libsass/src/extension.cpp +43 -0
- data/ext/libsass/src/extension.hpp +89 -0
- data/ext/libsass/src/file.cpp +81 -72
- data/ext/libsass/src/file.hpp +28 -37
- data/ext/libsass/src/fn_colors.cpp +20 -18
- data/ext/libsass/src/fn_lists.cpp +30 -29
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +34 -46
- data/ext/libsass/src/fn_numbers.cpp +20 -13
- data/ext/libsass/src/fn_selectors.cpp +98 -128
- data/ext/libsass/src/fn_strings.cpp +47 -33
- data/ext/libsass/src/fn_utils.cpp +31 -29
- data/ext/libsass/src/fn_utils.hpp +17 -11
- data/ext/libsass/src/inspect.cpp +186 -148
- data/ext/libsass/src/inspect.hpp +31 -29
- data/ext/libsass/src/lexer.cpp +20 -82
- data/ext/libsass/src/lexer.hpp +5 -16
- data/ext/libsass/src/listize.cpp +23 -37
- data/ext/libsass/src/listize.hpp +8 -9
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
- data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/operation.hpp +71 -61
- data/ext/libsass/src/operators.cpp +19 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +45 -64
- data/ext/libsass/src/output.hpp +6 -6
- data/ext/libsass/src/parser.cpp +512 -700
- data/ext/libsass/src/parser.hpp +89 -97
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +7 -7
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +7 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/prelexer.cpp +6 -6
- data/ext/libsass/src/remove_placeholders.cpp +55 -56
- data/ext/libsass/src/remove_placeholders.hpp +21 -18
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +10 -5
- data/ext/libsass/src/sass2scss.cpp +4 -4
- data/ext/libsass/src/sass_context.cpp +91 -122
- data/ext/libsass/src/sass_context.hpp +2 -2
- data/ext/libsass/src/sass_functions.cpp +1 -1
- data/ext/libsass/src/sass_values.cpp +8 -11
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +22 -18
- data/ext/libsass/src/source_map.hpp +12 -9
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +2 -2
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.cpp +24 -22
- data/ext/libsass/src/units.hpp +8 -8
- data/ext/libsass/src/utf8_string.cpp +9 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +48 -50
- data/ext/libsass/src/util.hpp +20 -21
- data/ext/libsass/src/util_string.cpp +111 -61
- data/ext/libsass/src/util_string.hpp +62 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/engine.rb +5 -3
- data/lib/sassc/functions_handler.rb +8 -8
- data/lib/sassc/native.rb +4 -6
- data/lib/sassc/script.rb +4 -4
- data/lib/sassc/version.rb +1 -1
- data/test/functions_test.rb +18 -1
- data/test/native_test.rb +4 -4
- metadata +29 -15
- data/ext/libsass/src/extend.cpp +0 -2132
- data/ext/libsass/src/extend.hpp +0 -86
- data/ext/libsass/src/node.cpp +0 -322
- data/ext/libsass/src/node.hpp +0 -118
- data/ext/libsass/src/paths.hpp +0 -71
- data/ext/libsass/src/sass_util.cpp +0 -152
- data/ext/libsass/src/sass_util.hpp +0 -256
- data/ext/libsass/src/subset_map.cpp +0 -58
- data/ext/libsass/src/subset_map.hpp +0 -76
- data/lib/sassc/native/lib_c.rb +0 -21
@@ -2,6 +2,7 @@
|
|
2
2
|
// __EXTENSIONS__ fix on Solaris.
|
3
3
|
#include "sass.hpp"
|
4
4
|
|
5
|
+
#include <cmath>
|
5
6
|
#include "operators.hpp"
|
6
7
|
|
7
8
|
namespace Sass {
|
@@ -30,7 +31,7 @@ namespace Sass {
|
|
30
31
|
};
|
31
32
|
|
32
33
|
/* static function, has no pstate or traces */
|
33
|
-
bool eq(
|
34
|
+
bool eq(ExpressionObj lhs, ExpressionObj rhs)
|
34
35
|
{
|
35
36
|
// operation is undefined if one is not a number
|
36
37
|
if (!lhs || !rhs) throw Exception::UndefinedOperation(lhs, rhs, Sass_OP::EQ);
|
@@ -39,7 +40,7 @@ namespace Sass {
|
|
39
40
|
}
|
40
41
|
|
41
42
|
/* static function, throws OperationError, has no pstate or traces */
|
42
|
-
bool cmp(
|
43
|
+
bool cmp(ExpressionObj lhs, ExpressionObj rhs, const Sass_OP op)
|
43
44
|
{
|
44
45
|
// can only compare numbers!?
|
45
46
|
Number_Obj l = Cast<Number>(lhs);
|
@@ -51,14 +52,14 @@ namespace Sass {
|
|
51
52
|
}
|
52
53
|
|
53
54
|
/* static functions, throws OperationError, has no pstate or traces */
|
54
|
-
bool lt(
|
55
|
-
bool neq(
|
56
|
-
bool gt(
|
57
|
-
bool lte(
|
58
|
-
bool gte(
|
55
|
+
bool lt(ExpressionObj lhs, ExpressionObj rhs) { return cmp(lhs, rhs, Sass_OP::LT); }
|
56
|
+
bool neq(ExpressionObj lhs, ExpressionObj rhs) { return eq(lhs, rhs) == false; }
|
57
|
+
bool gt(ExpressionObj lhs, ExpressionObj rhs) { return !cmp(lhs, rhs, Sass_OP::GT) && neq(lhs, rhs); }
|
58
|
+
bool lte(ExpressionObj lhs, ExpressionObj rhs) { return cmp(lhs, rhs, Sass_OP::LTE) || eq(lhs, rhs); }
|
59
|
+
bool gte(ExpressionObj lhs, ExpressionObj rhs) { return !cmp(lhs, rhs, Sass_OP::GTE) || eq(lhs, rhs); }
|
59
60
|
|
60
61
|
/* colour math deprecation warning */
|
61
|
-
void op_color_deprecation(enum Sass_OP op,
|
62
|
+
void op_color_deprecation(enum Sass_OP op, sass::string lsh, sass::string rhs, const SourceSpan& pstate)
|
62
63
|
{
|
63
64
|
deprecated(
|
64
65
|
"The operation `" + lsh + " " + sass_op_to_name(op) + " " + rhs +
|
@@ -69,20 +70,20 @@ namespace Sass {
|
|
69
70
|
}
|
70
71
|
|
71
72
|
/* static function, throws OperationError, has no traces but optional pstate for returned value */
|
72
|
-
Value* op_strings(Sass::Operand operand, Value& lhs, Value& rhs, struct Sass_Inspect_Options opt, const
|
73
|
+
Value* op_strings(Sass::Operand operand, Value& lhs, Value& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
|
73
74
|
{
|
74
75
|
enum Sass_OP op = operand.operand;
|
75
76
|
|
76
77
|
String_Quoted* lqstr = Cast<String_Quoted>(&lhs);
|
77
78
|
String_Quoted* rqstr = Cast<String_Quoted>(&rhs);
|
78
79
|
|
79
|
-
|
80
|
-
|
80
|
+
sass::string lstr(lqstr ? lqstr->value() : lhs.to_string(opt));
|
81
|
+
sass::string rstr(rqstr ? rqstr->value() : rhs.to_string(opt));
|
81
82
|
|
82
83
|
if (Cast<Null>(&lhs)) throw Exception::InvalidNullOperation(&lhs, &rhs, op);
|
83
84
|
if (Cast<Null>(&rhs)) throw Exception::InvalidNullOperation(&lhs, &rhs, op);
|
84
85
|
|
85
|
-
|
86
|
+
sass::string sep;
|
86
87
|
switch (op) {
|
87
88
|
case Sass_OP::ADD: sep = ""; break;
|
88
89
|
case Sass_OP::SUB: sep = "-"; break;
|
@@ -120,7 +121,7 @@ namespace Sass {
|
|
120
121
|
|
121
122
|
/* ToDo: allow to operate also with hsla colors */
|
122
123
|
/* static function, throws OperationError, has no traces but optional pstate for returned value */
|
123
|
-
Value* op_colors(enum Sass_OP op, const Color_RGBA& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const
|
124
|
+
Value* op_colors(enum Sass_OP op, const Color_RGBA& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
|
124
125
|
{
|
125
126
|
|
126
127
|
if (lhs.a() != rhs.a()) {
|
@@ -141,7 +142,7 @@ namespace Sass {
|
|
141
142
|
}
|
142
143
|
|
143
144
|
/* static function, throws OperationError, has no traces but optional pstate for returned value */
|
144
|
-
Value* op_numbers(enum Sass_OP op, const Number& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const
|
145
|
+
Value* op_numbers(enum Sass_OP op, const Number& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
|
145
146
|
{
|
146
147
|
double lval = lhs.value();
|
147
148
|
double rval = rhs.value();
|
@@ -151,7 +152,7 @@ namespace Sass {
|
|
151
152
|
}
|
152
153
|
|
153
154
|
if (op == Sass_OP::DIV && rval == 0) {
|
154
|
-
|
155
|
+
sass::string result(lval ? "Infinity" : "NaN");
|
155
156
|
return SASS_MEMORY_NEW(String_Quoted, pstate, result);
|
156
157
|
}
|
157
158
|
|
@@ -211,7 +212,7 @@ namespace Sass {
|
|
211
212
|
}
|
212
213
|
|
213
214
|
/* static function, throws OperationError, has no traces but optional pstate for returned value */
|
214
|
-
Value* op_number_color(enum Sass_OP op, const Number& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const
|
215
|
+
Value* op_number_color(enum Sass_OP op, const Number& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
|
215
216
|
{
|
216
217
|
double lval = lhs.value();
|
217
218
|
|
@@ -228,7 +229,7 @@ namespace Sass {
|
|
228
229
|
}
|
229
230
|
case Sass_OP::SUB:
|
230
231
|
case Sass_OP::DIV: {
|
231
|
-
|
232
|
+
sass::string color(rhs.to_string(opt));
|
232
233
|
op_color_deprecation(op, lhs.to_string(), color, pstate);
|
233
234
|
return SASS_MEMORY_NEW(String_Quoted,
|
234
235
|
pstate,
|
@@ -242,7 +243,7 @@ namespace Sass {
|
|
242
243
|
}
|
243
244
|
|
244
245
|
/* static function, throws OperationError, has no traces but optional pstate for returned value */
|
245
|
-
Value* op_color_number(enum Sass_OP op, const Color_RGBA& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const
|
246
|
+
Value* op_color_number(enum Sass_OP op, const Color_RGBA& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
|
246
247
|
{
|
247
248
|
double rval = rhs.value();
|
248
249
|
|
@@ -9,19 +9,19 @@ namespace Sass {
|
|
9
9
|
namespace Operators {
|
10
10
|
|
11
11
|
// equality operator using AST Node operator==
|
12
|
-
bool eq(
|
13
|
-
bool neq(
|
12
|
+
bool eq(ExpressionObj, ExpressionObj);
|
13
|
+
bool neq(ExpressionObj, ExpressionObj);
|
14
14
|
// specific operators based on cmp and eq
|
15
|
-
bool lt(
|
16
|
-
bool gt(
|
17
|
-
bool lte(
|
18
|
-
bool gte(
|
15
|
+
bool lt(ExpressionObj, ExpressionObj);
|
16
|
+
bool gt(ExpressionObj, ExpressionObj);
|
17
|
+
bool lte(ExpressionObj, ExpressionObj);
|
18
|
+
bool gte(ExpressionObj, ExpressionObj);
|
19
19
|
// arithmetic for all the combinations that matter
|
20
|
-
Value* op_strings(Sass::Operand, Value&, Value&, struct Sass_Inspect_Options opt, const
|
21
|
-
Value* op_colors(enum Sass_OP, const Color_RGBA&, const Color_RGBA&, struct Sass_Inspect_Options opt, const
|
22
|
-
Value* op_numbers(enum Sass_OP, const Number&, const Number&, struct Sass_Inspect_Options opt, const
|
23
|
-
Value* op_number_color(enum Sass_OP, const Number&, const Color_RGBA&, struct Sass_Inspect_Options opt, const
|
24
|
-
Value* op_color_number(enum Sass_OP, const Color_RGBA&, const Number&, struct Sass_Inspect_Options opt, const
|
20
|
+
Value* op_strings(Sass::Operand, Value&, Value&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
|
21
|
+
Value* op_colors(enum Sass_OP, const Color_RGBA&, const Color_RGBA&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
|
22
|
+
Value* op_numbers(enum Sass_OP, const Number&, const Number&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
|
23
|
+
Value* op_number_color(enum Sass_OP, const Number&, const Color_RGBA&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
|
24
|
+
Value* op_color_number(enum Sass_OP, const Color_RGBA&, const Number&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
|
25
25
|
|
26
26
|
};
|
27
27
|
|
@@ -0,0 +1,112 @@
|
|
1
|
+
#ifndef SASS_ORDERED_MAP_H
|
2
|
+
#define SASS_ORDERED_MAP_H
|
3
|
+
|
4
|
+
namespace Sass {
|
5
|
+
|
6
|
+
// ##########################################################################
|
7
|
+
// Very simple and limited container for insert ordered hash map.
|
8
|
+
// Piggy-back implementation on std::unordered_map and sass::vector
|
9
|
+
// ##########################################################################
|
10
|
+
template<
|
11
|
+
class Key,
|
12
|
+
class T,
|
13
|
+
class Hash = std::hash<Key>,
|
14
|
+
class KeyEqual = std::equal_to<Key>,
|
15
|
+
class Allocator = std::allocator<std::pair<const Key, T>>
|
16
|
+
>
|
17
|
+
class ordered_map {
|
18
|
+
|
19
|
+
private:
|
20
|
+
|
21
|
+
using map_type = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>;
|
22
|
+
using map_iterator = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>::iterator;
|
23
|
+
using map_const_iterator = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>::const_iterator;
|
24
|
+
|
25
|
+
// The main unordered map
|
26
|
+
map_type _map;
|
27
|
+
|
28
|
+
// Keep insertion order
|
29
|
+
sass::vector<Key> _keys;
|
30
|
+
sass::vector<T> _values;
|
31
|
+
|
32
|
+
const KeyEqual _keyEqual;
|
33
|
+
|
34
|
+
public:
|
35
|
+
|
36
|
+
ordered_map() :
|
37
|
+
_keyEqual(KeyEqual())
|
38
|
+
{
|
39
|
+
}
|
40
|
+
|
41
|
+
ordered_map& operator= (const ordered_map& other) {
|
42
|
+
_map = other._map;
|
43
|
+
_keys = other._keys;
|
44
|
+
_values = other._values;
|
45
|
+
return *this;
|
46
|
+
}
|
47
|
+
|
48
|
+
std::pair<Key, T> front() {
|
49
|
+
return std::make_pair(
|
50
|
+
_keys.front(),
|
51
|
+
_values.front()
|
52
|
+
);
|
53
|
+
}
|
54
|
+
|
55
|
+
bool empty() const {
|
56
|
+
return _keys.empty();
|
57
|
+
}
|
58
|
+
|
59
|
+
void insert(const Key& key, const T& val) {
|
60
|
+
if (!hasKey(key)) {
|
61
|
+
_values.push_back(val);
|
62
|
+
_keys.push_back(key);
|
63
|
+
}
|
64
|
+
_map[key] = val;
|
65
|
+
}
|
66
|
+
|
67
|
+
bool hasKey(const Key& key) const {
|
68
|
+
return _map.find(key) != _map.end();
|
69
|
+
}
|
70
|
+
|
71
|
+
bool erase(const Key& key) {
|
72
|
+
_map.erase(key);
|
73
|
+
// find the position in the array
|
74
|
+
for (size_t i = 0; i < _keys.size(); i += 1) {
|
75
|
+
if (_keyEqual(key, _keys[i])) {
|
76
|
+
_keys.erase(_keys.begin() + i);
|
77
|
+
_values.erase(_values.begin() + i);
|
78
|
+
return true;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
return false;
|
82
|
+
}
|
83
|
+
|
84
|
+
const sass::vector<Key>& keys() const { return _keys; }
|
85
|
+
const sass::vector<T>& values() const { return _values; }
|
86
|
+
|
87
|
+
const T& get(const Key& key) {
|
88
|
+
if (hasKey(key)) {
|
89
|
+
return _map[key];
|
90
|
+
}
|
91
|
+
throw std::runtime_error("Key does not exist");
|
92
|
+
}
|
93
|
+
|
94
|
+
using iterator = typename sass::vector<Key>::iterator;
|
95
|
+
using const_iterator = typename sass::vector<Key>::const_iterator;
|
96
|
+
using reverse_iterator = typename sass::vector<Key>::reverse_iterator;
|
97
|
+
using const_reverse_iterator = typename sass::vector<Key>::const_reverse_iterator;
|
98
|
+
|
99
|
+
typename sass::vector<Key>::iterator end() { return _keys.end(); }
|
100
|
+
typename sass::vector<Key>::iterator begin() { return _keys.begin(); }
|
101
|
+
typename sass::vector<Key>::reverse_iterator rend() { return _keys.rend(); }
|
102
|
+
typename sass::vector<Key>::reverse_iterator rbegin() { return _keys.rbegin(); }
|
103
|
+
typename sass::vector<Key>::const_iterator end() const { return _keys.end(); }
|
104
|
+
typename sass::vector<Key>::const_iterator begin() const { return _keys.begin(); }
|
105
|
+
typename sass::vector<Key>::const_reverse_iterator rend() const { return _keys.rend(); }
|
106
|
+
typename sass::vector<Key>::const_reverse_iterator rbegin() const { return _keys.rbegin(); }
|
107
|
+
|
108
|
+
};
|
109
|
+
|
110
|
+
}
|
111
|
+
|
112
|
+
#endif
|
data/ext/libsass/src/output.cpp
CHANGED
@@ -30,7 +30,7 @@ namespace Sass {
|
|
30
30
|
throw Exception::InvalidValue({}, *n);
|
31
31
|
}
|
32
32
|
// use values to_string facility
|
33
|
-
|
33
|
+
sass::string res = n->to_string(opt);
|
34
34
|
// output the final token
|
35
35
|
append_token(res, n);
|
36
36
|
}
|
@@ -77,7 +77,7 @@ namespace Sass {
|
|
77
77
|
// declare the charset
|
78
78
|
if (output_style() != COMPRESSED)
|
79
79
|
charset = "@charset \"UTF-8\";"
|
80
|
-
+
|
80
|
+
+ sass::string(opt.linefeed);
|
81
81
|
else charset = "\xEF\xBB\xBF";
|
82
82
|
// abort search
|
83
83
|
break;
|
@@ -111,16 +111,18 @@ namespace Sass {
|
|
111
111
|
}
|
112
112
|
}
|
113
113
|
|
114
|
-
void Output::operator()(
|
114
|
+
void Output::operator()(StyleRule* r)
|
115
115
|
{
|
116
|
-
|
117
|
-
|
116
|
+
Block_Obj b = r->block();
|
117
|
+
SelectorListObj s = r->selector();
|
118
|
+
|
119
|
+
if (!s || s->empty()) return;
|
118
120
|
|
119
121
|
// Filter out rulesets that aren't printable (process its children though)
|
120
122
|
if (!Util::isPrintable(r, output_style())) {
|
121
123
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
122
|
-
const Statement_Obj& stm = b->
|
123
|
-
if (Cast<
|
124
|
+
const Statement_Obj& stm = b->get(i);
|
125
|
+
if (Cast<ParentStatement>(stm)) {
|
124
126
|
if (!Cast<Declaration>(stm)) {
|
125
127
|
stm->perform(this);
|
126
128
|
}
|
@@ -129,12 +131,14 @@ namespace Sass {
|
|
129
131
|
return;
|
130
132
|
}
|
131
133
|
|
132
|
-
if (output_style() == NESTED)
|
134
|
+
if (output_style() == NESTED) {
|
135
|
+
indentation += r->tabs();
|
136
|
+
}
|
133
137
|
if (opt.source_comments) {
|
134
|
-
|
138
|
+
sass::ostream ss;
|
135
139
|
append_indentation();
|
136
|
-
|
137
|
-
ss << "/* line " << r->pstate().
|
140
|
+
sass::string path(File::abs2rel(r->pstate().getPath()));
|
141
|
+
ss << "/* line " << r->pstate().getLine() << ", " << path << " */";
|
138
142
|
append_string(ss.str());
|
139
143
|
append_optional_linefeed();
|
140
144
|
}
|
@@ -142,13 +146,13 @@ namespace Sass {
|
|
142
146
|
if (s) s->perform(this);
|
143
147
|
append_scope_opener(b);
|
144
148
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
145
|
-
Statement_Obj stm = b->
|
149
|
+
Statement_Obj stm = b->get(i);
|
146
150
|
bool bPrintExpression = true;
|
147
151
|
// Check print conditions
|
148
152
|
if (Declaration* dec = Cast<Declaration>(stm)) {
|
149
|
-
if (String_Constant* valConst = Cast<String_Constant>(dec->value())) {
|
150
|
-
|
151
|
-
if (String_Quoted* qstr = Cast<String_Quoted>(valConst)) {
|
153
|
+
if (const String_Constant* valConst = Cast<String_Constant>(dec->value())) {
|
154
|
+
const sass::string& val = valConst->value();
|
155
|
+
if (const String_Quoted* qstr = Cast<const String_Quoted>(valConst)) {
|
152
156
|
if (!qstr->quote_mark() && val.empty()) {
|
153
157
|
bPrintExpression = false;
|
154
158
|
}
|
@@ -157,7 +161,7 @@ namespace Sass {
|
|
157
161
|
else if (List* list = Cast<List>(dec->value())) {
|
158
162
|
bool all_invisible = true;
|
159
163
|
for (size_t list_i = 0, list_L = list->length(); list_i < list_L; ++list_i) {
|
160
|
-
Expression* item = list->
|
164
|
+
Expression* item = list->get(list_i);
|
161
165
|
if (!item->is_invisible()) all_invisible = false;
|
162
166
|
}
|
163
167
|
if (all_invisible && !list->is_bracketed()) bPrintExpression = false;
|
@@ -188,25 +192,25 @@ namespace Sass {
|
|
188
192
|
|
189
193
|
append_scope_opener();
|
190
194
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
191
|
-
Statement_Obj stm = b->
|
195
|
+
Statement_Obj stm = b->get(i);
|
192
196
|
stm->perform(this);
|
193
197
|
if (i < L - 1) append_special_linefeed();
|
194
198
|
}
|
195
199
|
append_scope_closer();
|
196
200
|
}
|
197
201
|
|
198
|
-
void Output::operator()(
|
202
|
+
void Output::operator()(SupportsRule* f)
|
199
203
|
{
|
200
204
|
if (f->is_invisible()) return;
|
201
205
|
|
202
|
-
|
206
|
+
SupportsConditionObj c = f->condition();
|
203
207
|
Block_Obj b = f->block();
|
204
208
|
|
205
209
|
// Filter out feature blocks that aren't printable (process its children though)
|
206
210
|
if (!Util::isPrintable(f, output_style())) {
|
207
211
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
208
|
-
Statement_Obj stm = b->
|
209
|
-
if (Cast<
|
212
|
+
Statement_Obj stm = b->get(i);
|
213
|
+
if (Cast<ParentStatement>(stm)) {
|
210
214
|
stm->perform(this);
|
211
215
|
}
|
212
216
|
}
|
@@ -221,7 +225,7 @@ namespace Sass {
|
|
221
225
|
append_scope_opener();
|
222
226
|
|
223
227
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
224
|
-
Statement_Obj stm = b->
|
228
|
+
Statement_Obj stm = b->get(i);
|
225
229
|
stm->perform(this);
|
226
230
|
if (i < L - 1) append_special_linefeed();
|
227
231
|
}
|
@@ -232,48 +236,28 @@ namespace Sass {
|
|
232
236
|
|
233
237
|
}
|
234
238
|
|
235
|
-
void Output::operator()(
|
239
|
+
void Output::operator()(CssMediaRule* rule)
|
236
240
|
{
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
//
|
242
|
-
if (
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
return;
|
241
|
+
// Avoid null pointer exception
|
242
|
+
if (rule == nullptr) return;
|
243
|
+
// Skip empty/invisible rule
|
244
|
+
if (rule->isInvisible()) return;
|
245
|
+
// Avoid null pointer exception
|
246
|
+
if (rule->block() == nullptr) return;
|
247
|
+
// Skip empty/invisible rule
|
248
|
+
if (rule->block()->isInvisible()) return;
|
249
|
+
// Skip if block is empty/invisible
|
250
|
+
if (Util::isPrintable(rule, output_style())) {
|
251
|
+
// Let inspect do its magic
|
252
|
+
Inspect::operator()(rule);
|
250
253
|
}
|
251
|
-
if (output_style() == NESTED) indentation += m->tabs();
|
252
|
-
append_indentation();
|
253
|
-
append_token("@media", m);
|
254
|
-
append_mandatory_space();
|
255
|
-
in_media_block = true;
|
256
|
-
m->media_queries()->perform(this);
|
257
|
-
in_media_block = false;
|
258
|
-
append_scope_opener();
|
259
|
-
|
260
|
-
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
261
|
-
if (b->at(i)) {
|
262
|
-
Statement_Obj stm = b->at(i);
|
263
|
-
stm->perform(this);
|
264
|
-
}
|
265
|
-
if (i < L - 1) append_special_linefeed();
|
266
|
-
}
|
267
|
-
|
268
|
-
if (output_style() == NESTED) indentation -= m->tabs();
|
269
|
-
append_scope_closer();
|
270
254
|
}
|
271
255
|
|
272
|
-
void Output::operator()(
|
256
|
+
void Output::operator()(AtRule* a)
|
273
257
|
{
|
274
|
-
|
258
|
+
sass::string kwd = a->keyword();
|
275
259
|
Selector_Obj s = a->selector();
|
276
|
-
|
260
|
+
ExpressionObj v = a->value();
|
277
261
|
Block_Obj b = a->block();
|
278
262
|
|
279
263
|
append_indentation();
|
@@ -304,8 +288,8 @@ namespace Sass {
|
|
304
288
|
bool format = kwd != "@font-face";;
|
305
289
|
|
306
290
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
307
|
-
Statement_Obj stm = b->
|
308
|
-
stm->perform(this);
|
291
|
+
Statement_Obj stm = b->get(i);
|
292
|
+
if (stm) stm->perform(this);
|
309
293
|
if (i < L - 1 && format) append_special_linefeed();
|
310
294
|
}
|
311
295
|
|
@@ -325,10 +309,7 @@ namespace Sass {
|
|
325
309
|
|
326
310
|
void Output::operator()(String_Constant* s)
|
327
311
|
{
|
328
|
-
|
329
|
-
if (s->can_compress_whitespace() && output_style() == COMPRESSED) {
|
330
|
-
value.erase(std::remove_if(value.begin(), value.end(), ::isspace), value.end());
|
331
|
-
}
|
312
|
+
sass::string value(s->value());
|
332
313
|
if (!in_comment && !in_custom_property) {
|
333
314
|
append_token(string_to_output(value), s);
|
334
315
|
} else {
|
data/ext/libsass/src/output.hpp
CHANGED
@@ -20,17 +20,17 @@ namespace Sass {
|
|
20
20
|
virtual ~Output();
|
21
21
|
|
22
22
|
protected:
|
23
|
-
|
24
|
-
|
23
|
+
sass::string charset;
|
24
|
+
sass::vector<AST_Node*> top_nodes;
|
25
25
|
|
26
26
|
public:
|
27
27
|
OutputBuffer get_buffer(void);
|
28
28
|
|
29
29
|
virtual void operator()(Map*);
|
30
|
-
virtual void operator()(
|
31
|
-
virtual void operator()(
|
32
|
-
virtual void operator()(
|
33
|
-
virtual void operator()(
|
30
|
+
virtual void operator()(StyleRule*);
|
31
|
+
virtual void operator()(SupportsRule*);
|
32
|
+
virtual void operator()(CssMediaRule*);
|
33
|
+
virtual void operator()(AtRule*);
|
34
34
|
virtual void operator()(Keyframe_Rule*);
|
35
35
|
virtual void operator()(Import*);
|
36
36
|
virtual void operator()(Comment*);
|