sassc 1.9.0 → 1.10.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/README.md +30 -3
- data/ext/libsass/.gitignore +3 -0
- data/ext/libsass/.travis.yml +1 -1
- data/ext/libsass/GNUmakefile.am +7 -7
- data/ext/libsass/Makefile +7 -4
- data/ext/libsass/Makefile.conf +0 -1
- data/ext/libsass/appveyor.yml +6 -2
- data/ext/libsass/docs/api-context.md +4 -4
- data/ext/libsass/docs/api-doc.md +29 -11
- data/ext/libsass/docs/api-importer-example.md +5 -5
- data/ext/libsass/docs/build-on-windows.md +1 -1
- data/ext/libsass/include/sass/base.h +10 -0
- data/ext/libsass/include/sass/version.h +4 -0
- data/ext/libsass/include/sass/version.h.in +4 -0
- data/ext/libsass/include/sass2scss.h +1 -1
- data/ext/libsass/script/ci-build-libsass +15 -3
- data/ext/libsass/src/ast.cpp +161 -6
- data/ext/libsass/src/ast.hpp +71 -44
- data/ext/libsass/src/ast_factory.hpp +1 -1
- data/ext/libsass/src/ast_fwd_decl.hpp +2 -2
- data/ext/libsass/src/constants.cpp +2 -4
- data/ext/libsass/src/constants.hpp +3 -4
- data/ext/libsass/src/context.cpp +16 -17
- data/ext/libsass/src/context.hpp +2 -2
- data/ext/libsass/src/cssize.cpp +19 -8
- data/ext/libsass/src/cssize.hpp +5 -2
- data/ext/libsass/src/debugger.hpp +6 -3
- data/ext/libsass/src/emitter.cpp +1 -1
- data/ext/libsass/src/environment.cpp +1 -1
- data/ext/libsass/src/eval.cpp +42 -14
- data/ext/libsass/src/eval.hpp +1 -1
- data/ext/libsass/src/expand.cpp +24 -8
- data/ext/libsass/src/expand.hpp +2 -1
- data/ext/libsass/src/extend.cpp +55 -15
- data/ext/libsass/src/extend.hpp +5 -1
- data/ext/libsass/src/functions.cpp +10 -5
- data/ext/libsass/src/inspect.cpp +25 -19
- data/ext/libsass/src/inspect.hpp +2 -2
- data/ext/libsass/src/json.cpp +20 -9
- data/ext/libsass/src/json.hpp +5 -5
- data/ext/libsass/src/lexer.cpp +4 -1
- data/ext/libsass/src/lexer.hpp +21 -0
- data/ext/libsass/src/listize.cpp +2 -1
- data/ext/libsass/src/operation.hpp +4 -4
- data/ext/libsass/src/output.cpp +1 -1
- data/ext/libsass/src/output.hpp +1 -1
- data/ext/libsass/src/parser.cpp +189 -90
- data/ext/libsass/src/parser.hpp +42 -2
- data/ext/libsass/src/prelexer.cpp +474 -7
- data/ext/libsass/src/prelexer.hpp +15 -2
- data/ext/libsass/src/remove_placeholders.cpp +5 -5
- data/ext/libsass/src/remove_placeholders.hpp +3 -2
- data/ext/libsass/src/sass.cpp +33 -3
- data/ext/libsass/src/sass2scss.cpp +7 -0
- data/ext/libsass/src/sass_context.cpp +32 -62
- data/ext/libsass/src/sass_functions.cpp +3 -3
- data/ext/libsass/src/sass_values.cpp +5 -5
- data/ext/libsass/src/utf8/unchecked.h +16 -16
- data/ext/libsass/src/util.cpp +51 -30
- data/ext/libsass/src/util.hpp +6 -1
- data/ext/libsass/win/libsass.targets +0 -2
- data/ext/libsass/win/libsass.vcxproj.filters +0 -6
- data/lib/sassc/engine.rb +4 -1
- data/lib/sassc/error.rb +23 -1
- data/lib/sassc/version.rb +1 -1
- data/test/error_test.rb +27 -0
- data/test/native_test.rb +1 -1
- metadata +5 -5
- data/ext/libsass/include/sass/interface.h +0 -105
- data/ext/libsass/src/sass_interface.cpp +0 -215
data/ext/libsass/src/ast.hpp
CHANGED
@@ -277,8 +277,24 @@ namespace Sass {
|
|
277
277
|
// extra <std::vector> internally to maintain insertion order for interation.
|
278
278
|
/////////////////////////////////////////////////////////////////////////////
|
279
279
|
class Hashed {
|
280
|
+
struct HashExpression {
|
281
|
+
size_t operator() (Expression* ex) const {
|
282
|
+
return ex ? ex->hash() : 0;
|
283
|
+
}
|
284
|
+
};
|
285
|
+
struct CompareExpression {
|
286
|
+
bool operator()(const Expression* lhs, const Expression* rhs) const {
|
287
|
+
return lhs && rhs && *lhs == *rhs;
|
288
|
+
}
|
289
|
+
};
|
290
|
+
typedef std::unordered_map<
|
291
|
+
Expression*, // key
|
292
|
+
Expression*, // value
|
293
|
+
HashExpression, // hasher
|
294
|
+
CompareExpression // compare
|
295
|
+
> ExpressionMap;
|
280
296
|
private:
|
281
|
-
|
297
|
+
ExpressionMap elements_;
|
282
298
|
std::vector<Expression*> list_;
|
283
299
|
protected:
|
284
300
|
size_t hash_;
|
@@ -287,7 +303,7 @@ namespace Sass {
|
|
287
303
|
void reset_duplicate_key() { duplicate_key_ = 0; }
|
288
304
|
virtual void adjust_after_pushing(std::pair<Expression*, Expression*> p) { }
|
289
305
|
public:
|
290
|
-
Hashed(size_t s = 0) : elements_(
|
306
|
+
Hashed(size_t s = 0) : elements_(ExpressionMap(s)), list_(std::vector<Expression*>())
|
291
307
|
{ elements_.reserve(s); list_.reserve(s); reset_duplicate_key(); }
|
292
308
|
virtual ~Hashed();
|
293
309
|
size_t length() const { return list_.size(); }
|
@@ -296,7 +312,7 @@ namespace Sass {
|
|
296
312
|
Expression* at(Expression* k) const;
|
297
313
|
bool has_duplicate_key() const { return duplicate_key_ != 0; }
|
298
314
|
Expression* get_duplicate_key() const { return duplicate_key_; }
|
299
|
-
const
|
315
|
+
const ExpressionMap elements() { return elements_; }
|
300
316
|
Hashed& operator<<(std::pair<Expression*, Expression*> p)
|
301
317
|
{
|
302
318
|
reset_hash();
|
@@ -324,7 +340,7 @@ namespace Sass {
|
|
324
340
|
reset_duplicate_key();
|
325
341
|
return *this;
|
326
342
|
}
|
327
|
-
const
|
343
|
+
const ExpressionMap& pairs() const { return elements_; }
|
328
344
|
const std::vector<Expression*>& keys() const { return list_; }
|
329
345
|
|
330
346
|
std::unordered_map<Expression*, Expression*>::iterator end() { return elements_.end(); }
|
@@ -508,12 +524,12 @@ namespace Sass {
|
|
508
524
|
// At-rules -- arbitrary directives beginning with "@" that may have an
|
509
525
|
// optional statement block.
|
510
526
|
///////////////////////////////////////////////////////////////////////
|
511
|
-
class
|
527
|
+
class Directive : public Has_Block {
|
512
528
|
ADD_PROPERTY(std::string, keyword)
|
513
529
|
ADD_PROPERTY(Selector*, selector)
|
514
530
|
ADD_PROPERTY(Expression*, value)
|
515
531
|
public:
|
516
|
-
|
532
|
+
Directive(ParserState pstate, std::string kwd, Selector* sel = 0, Block* b = 0, Expression* val = 0)
|
517
533
|
: Has_Block(pstate, b), keyword_(kwd), selector_(sel), value_(val) // set value manually if needed
|
518
534
|
{ statement_type(DIRECTIVE); }
|
519
535
|
bool bubbles() { return is_keyframes() || is_media(); }
|
@@ -660,7 +676,7 @@ namespace Sass {
|
|
660
676
|
: Statement(pstate), text_(txt), is_important_(is_important)
|
661
677
|
{ statement_type(COMMENT); }
|
662
678
|
virtual bool is_invisible() const
|
663
|
-
{ return is_important() == false; }
|
679
|
+
{ return /* is_important() == */ false; }
|
664
680
|
ATTACH_OPERATIONS()
|
665
681
|
};
|
666
682
|
|
@@ -840,6 +856,7 @@ namespace Sass {
|
|
840
856
|
// The @content directive for mixin content blocks.
|
841
857
|
///////////////////////////////////////////////////
|
842
858
|
class Content : public Statement {
|
859
|
+
ADD_PROPERTY(Media_Block*, media_block)
|
843
860
|
public:
|
844
861
|
Content(ParserState pstate) : Statement(pstate)
|
845
862
|
{ statement_type(CONTENT); }
|
@@ -855,12 +872,15 @@ namespace Sass {
|
|
855
872
|
private:
|
856
873
|
ADD_PROPERTY(enum Sass_Separator, separator)
|
857
874
|
ADD_PROPERTY(bool, is_arglist)
|
875
|
+
ADD_PROPERTY(bool, from_selector)
|
858
876
|
public:
|
859
877
|
List(ParserState pstate,
|
860
878
|
size_t size = 0, enum Sass_Separator sep = SASS_SPACE, bool argl = false)
|
861
879
|
: Value(pstate),
|
862
880
|
Vectorized<Expression*>(size),
|
863
|
-
separator_(sep),
|
881
|
+
separator_(sep),
|
882
|
+
is_arglist_(argl),
|
883
|
+
from_selector_(false)
|
864
884
|
{ concrete_type(LIST); }
|
865
885
|
std::string type() { return is_arglist_ ? "arglist" : "list"; }
|
866
886
|
static std::string type_name() { return "list"; }
|
@@ -1011,6 +1031,12 @@ namespace Sass {
|
|
1011
1031
|
return is_left_interpolant() ||
|
1012
1032
|
is_right_interpolant();
|
1013
1033
|
}
|
1034
|
+
virtual bool can_delay() const;
|
1035
|
+
void reset_whitespace()
|
1036
|
+
{
|
1037
|
+
op_.ws_before = false;
|
1038
|
+
op_.ws_after = false;
|
1039
|
+
}
|
1014
1040
|
virtual void set_delayed(bool delayed)
|
1015
1041
|
{
|
1016
1042
|
right()->set_delayed(delayed);
|
@@ -1447,6 +1473,9 @@ namespace Sass {
|
|
1447
1473
|
{ concrete_type(STRING); }
|
1448
1474
|
static std::string type_name() { return "string"; }
|
1449
1475
|
virtual ~String() = 0;
|
1476
|
+
virtual void rtrim() = 0;
|
1477
|
+
virtual void ltrim() = 0;
|
1478
|
+
virtual void trim() = 0;
|
1450
1479
|
virtual bool operator==(const Expression& rhs) const = 0;
|
1451
1480
|
ATTACH_OPERATIONS()
|
1452
1481
|
};
|
@@ -1475,6 +1504,9 @@ namespace Sass {
|
|
1475
1504
|
}
|
1476
1505
|
return false;
|
1477
1506
|
}
|
1507
|
+
virtual void rtrim();
|
1508
|
+
virtual void ltrim();
|
1509
|
+
virtual void trim();
|
1478
1510
|
|
1479
1511
|
virtual size_t hash()
|
1480
1512
|
{
|
@@ -1515,6 +1547,9 @@ namespace Sass {
|
|
1515
1547
|
std::string type() { return "string"; }
|
1516
1548
|
static std::string type_name() { return "string"; }
|
1517
1549
|
virtual bool is_invisible() const;
|
1550
|
+
virtual void rtrim();
|
1551
|
+
virtual void ltrim();
|
1552
|
+
virtual void trim();
|
1518
1553
|
|
1519
1554
|
virtual size_t hash()
|
1520
1555
|
{
|
@@ -1672,42 +1707,15 @@ namespace Sass {
|
|
1672
1707
|
/////////////////////////////////////////////////
|
1673
1708
|
// At root expressions (for use inside @at-root).
|
1674
1709
|
/////////////////////////////////////////////////
|
1675
|
-
class
|
1710
|
+
class At_Root_Query : public Expression {
|
1676
1711
|
private:
|
1677
|
-
ADD_PROPERTY(
|
1712
|
+
ADD_PROPERTY(Expression*, feature)
|
1678
1713
|
ADD_PROPERTY(Expression*, value)
|
1679
|
-
ADD_PROPERTY(bool, is_interpolated)
|
1680
1714
|
public:
|
1681
|
-
|
1682
|
-
: Expression(pstate), feature_(f), value_(v)
|
1715
|
+
At_Root_Query(ParserState pstate, Expression* f = 0, Expression* v = 0, bool i = false)
|
1716
|
+
: Expression(pstate), feature_(f), value_(v)
|
1683
1717
|
{ }
|
1684
|
-
bool exclude(std::string str)
|
1685
|
-
{
|
1686
|
-
bool with = feature() && unquote(feature()->to_string()).compare("with") == 0;
|
1687
|
-
List* l = static_cast<List*>(value());
|
1688
|
-
std::string v;
|
1689
|
-
|
1690
|
-
if (with)
|
1691
|
-
{
|
1692
|
-
if (!l || l->length() == 0) return str.compare("rule") != 0;
|
1693
|
-
for (size_t i = 0, L = l->length(); i < L; ++i)
|
1694
|
-
{
|
1695
|
-
v = unquote((*l)[i]->to_string());
|
1696
|
-
if (v.compare("all") == 0 || v == str) return false;
|
1697
|
-
}
|
1698
|
-
return true;
|
1699
|
-
}
|
1700
|
-
else
|
1701
|
-
{
|
1702
|
-
if (!l || !l->length()) return str.compare("rule") == 0;
|
1703
|
-
for (size_t i = 0, L = l->length(); i < L; ++i)
|
1704
|
-
{
|
1705
|
-
v = unquote((*l)[i]->to_string());
|
1706
|
-
if (v.compare("all") == 0 || v == str) return true;
|
1707
|
-
}
|
1708
|
-
return false;
|
1709
|
-
}
|
1710
|
-
}
|
1718
|
+
bool exclude(std::string str);
|
1711
1719
|
ATTACH_OPERATIONS()
|
1712
1720
|
};
|
1713
1721
|
|
@@ -1715,9 +1723,9 @@ namespace Sass {
|
|
1715
1723
|
// At-root.
|
1716
1724
|
///////////
|
1717
1725
|
class At_Root_Block : public Has_Block {
|
1718
|
-
ADD_PROPERTY(
|
1726
|
+
ADD_PROPERTY(At_Root_Query*, expression)
|
1719
1727
|
public:
|
1720
|
-
At_Root_Block(ParserState pstate, Block* b = 0,
|
1728
|
+
At_Root_Block(ParserState pstate, Block* b = 0, At_Root_Query* e = 0)
|
1721
1729
|
: Has_Block(pstate, b), expression_(e)
|
1722
1730
|
{ statement_type(ATROOT); }
|
1723
1731
|
bool is_hoistable() { return true; }
|
@@ -1725,7 +1733,7 @@ namespace Sass {
|
|
1725
1733
|
bool exclude_node(Statement* s) {
|
1726
1734
|
if (s->statement_type() == Statement::DIRECTIVE)
|
1727
1735
|
{
|
1728
|
-
return expression()->exclude(static_cast<
|
1736
|
+
return expression()->exclude(static_cast<Directive*>(s)->keyword().erase(0, 1));
|
1729
1737
|
}
|
1730
1738
|
if (s->statement_type() == Statement::MEDIA)
|
1731
1739
|
{
|
@@ -1739,7 +1747,7 @@ namespace Sass {
|
|
1739
1747
|
{
|
1740
1748
|
return expression()->exclude("supports");
|
1741
1749
|
}
|
1742
|
-
if (static_cast<
|
1750
|
+
if (static_cast<Directive*>(s)->is_keyframes())
|
1743
1751
|
{
|
1744
1752
|
return expression()->exclude("keyframes");
|
1745
1753
|
}
|
@@ -1878,6 +1886,9 @@ namespace Sass {
|
|
1878
1886
|
virtual unsigned long specificity() {
|
1879
1887
|
return Constants::Specificity_Universal;
|
1880
1888
|
}
|
1889
|
+
virtual void set_media_block(Media_Block* mb) {
|
1890
|
+
media_block(mb);
|
1891
|
+
}
|
1881
1892
|
};
|
1882
1893
|
inline Selector::~Selector() { }
|
1883
1894
|
|
@@ -1892,6 +1903,7 @@ namespace Sass {
|
|
1892
1903
|
Selector_Schema(ParserState pstate, String* c)
|
1893
1904
|
: Selector(pstate), contents_(c), at_root_(false)
|
1894
1905
|
{ }
|
1906
|
+
virtual bool has_parent_ref();
|
1895
1907
|
virtual size_t hash() {
|
1896
1908
|
if (hash_ == 0) {
|
1897
1909
|
hash_combine(hash_, contents_->hash());
|
@@ -2140,6 +2152,10 @@ namespace Sass {
|
|
2140
2152
|
return Constants::Specificity_Type;
|
2141
2153
|
return Constants::Specificity_Pseudo;
|
2142
2154
|
}
|
2155
|
+
bool operator==(const Simple_Selector& rhs) const;
|
2156
|
+
bool operator==(const Pseudo_Selector& rhs) const;
|
2157
|
+
bool operator<(const Simple_Selector& rhs) const;
|
2158
|
+
bool operator<(const Pseudo_Selector& rhs) const;
|
2143
2159
|
virtual Compound_Selector* unify_with(Compound_Selector*, Context&);
|
2144
2160
|
ATTACH_OPERATIONS()
|
2145
2161
|
};
|
@@ -2377,6 +2393,11 @@ namespace Sass {
|
|
2377
2393
|
if (tail()) sum += tail()->specificity();
|
2378
2394
|
return sum;
|
2379
2395
|
}
|
2396
|
+
virtual void set_media_block(Media_Block* mb) {
|
2397
|
+
media_block(mb);
|
2398
|
+
if (tail_) tail_->set_media_block(mb);
|
2399
|
+
if (head_) head_->set_media_block(mb);
|
2400
|
+
}
|
2380
2401
|
bool operator<(const Complex_Selector& rhs) const;
|
2381
2402
|
bool operator==(const Complex_Selector& rhs) const;
|
2382
2403
|
inline bool operator!=(const Complex_Selector& rhs) const { return !(*this == rhs); }
|
@@ -2479,6 +2500,12 @@ namespace Sass {
|
|
2479
2500
|
}
|
2480
2501
|
return sum;
|
2481
2502
|
}
|
2503
|
+
virtual void set_media_block(Media_Block* mb) {
|
2504
|
+
media_block(mb);
|
2505
|
+
for (Complex_Selector* cs : elements()) {
|
2506
|
+
cs->set_media_block(mb);
|
2507
|
+
}
|
2508
|
+
}
|
2482
2509
|
Selector_List* clone(Context&) const; // does not clone Compound_Selector*s
|
2483
2510
|
Selector_List* cloneFully(Context&) const; // clones Compound_Selector*s
|
2484
2511
|
virtual bool operator==(const Selector& rhs) const;
|
@@ -17,7 +17,7 @@ namespace Sass {
|
|
17
17
|
Supports_Query* new_Supports_Query(std::string p, size_t l, Supports_Query* f, Block* b);
|
18
18
|
Media_Query* new_Media_Query(std::string p, size_t l, List* q, Block* b);
|
19
19
|
At_Root_Block* new_At_Root_Block(std::string p, size_t l, Selector* sel, Block* b);
|
20
|
-
|
20
|
+
Directive* new_At_Rule(std::string p, size_t l, std::string kwd, Selector* sel, Block* b);
|
21
21
|
Keyframe_Rule* new_Keyframe_Rule(std::string p, size_t l, Block* b);
|
22
22
|
Declaration* new_Declaration(std::string p, size_t l, String* prop, List* vals);
|
23
23
|
Assignment* new_Assignment(std::string p, size_t l, std::string var, Expression* val, bool guarded = false);
|
@@ -15,7 +15,7 @@ namespace Sass {
|
|
15
15
|
class Bubble;
|
16
16
|
class Media_Block;
|
17
17
|
class Supports_Block;
|
18
|
-
class
|
18
|
+
class Directive;
|
19
19
|
class Keyframe_Rule;
|
20
20
|
class At_Root_Block;
|
21
21
|
class Declaration;
|
@@ -62,7 +62,7 @@ namespace Sass {
|
|
62
62
|
class Supports_Negation;
|
63
63
|
class Supports_Declaration;
|
64
64
|
class Supports_Interpolation;
|
65
|
-
class
|
65
|
+
class At_Root_Query;
|
66
66
|
class Null;
|
67
67
|
class Parent_Selector;
|
68
68
|
// parameters and arguments
|
@@ -88,10 +88,8 @@ namespace Sass {
|
|
88
88
|
extern const char progid_kwd[] = "progid";
|
89
89
|
extern const char expression_kwd[] = "expression";
|
90
90
|
extern const char calc_fn_kwd[] = "calc";
|
91
|
-
|
92
|
-
extern const char
|
93
|
-
extern const char webkit_calc_kwd[] = "-webkit-calc(";
|
94
|
-
extern const char ms_calc_kwd[] = "-ms-calc(";
|
91
|
+
|
92
|
+
extern const char almost_any_value_class[] = "\"'#!;{}";
|
95
93
|
|
96
94
|
// css selector keywords
|
97
95
|
extern const char sel_deep_kwd[] = "/deep/";
|
@@ -87,11 +87,10 @@ namespace Sass {
|
|
87
87
|
extern const char odd_kwd[];
|
88
88
|
extern const char progid_kwd[];
|
89
89
|
extern const char expression_kwd[];
|
90
|
-
extern const char calc_kwd[];
|
91
90
|
extern const char calc_fn_kwd[];
|
92
|
-
|
93
|
-
|
94
|
-
extern const char
|
91
|
+
|
92
|
+
// char classes for "regular expressions"
|
93
|
+
extern const char almost_any_value_class[];
|
95
94
|
|
96
95
|
// css selector keywords
|
97
96
|
extern const char sel_deep_kwd[];
|
data/ext/libsass/src/context.cpp
CHANGED
@@ -92,9 +92,9 @@ namespace Sass {
|
|
92
92
|
|
93
93
|
// collect more paths from different options
|
94
94
|
collect_include_paths(c_options.include_path);
|
95
|
-
|
95
|
+
collect_include_paths(c_options.include_paths);
|
96
96
|
collect_plugin_paths(c_options.plugin_path);
|
97
|
-
|
97
|
+
collect_plugin_paths(c_options.plugin_paths);
|
98
98
|
|
99
99
|
// load plugins and register custom behaviors
|
100
100
|
for(auto plug : plugin_paths) plugins.load_plugins(plug);
|
@@ -162,7 +162,6 @@ namespace Sass {
|
|
162
162
|
|
163
163
|
void Context::collect_include_paths(const char* paths_str)
|
164
164
|
{
|
165
|
-
|
166
165
|
if (paths_str) {
|
167
166
|
const char* beg = paths_str;
|
168
167
|
const char* end = Prelexer::find_first<PATH_SEP>(beg);
|
@@ -185,17 +184,17 @@ namespace Sass {
|
|
185
184
|
}
|
186
185
|
}
|
187
186
|
|
188
|
-
void Context::collect_include_paths(
|
187
|
+
void Context::collect_include_paths(string_list* paths_array)
|
189
188
|
{
|
190
|
-
|
191
|
-
|
192
|
-
collect_include_paths(paths_array
|
189
|
+
while (paths_array)
|
190
|
+
{
|
191
|
+
collect_include_paths(paths_array->string);
|
192
|
+
paths_array = paths_array->next;
|
193
193
|
}
|
194
194
|
}
|
195
195
|
|
196
196
|
void Context::collect_plugin_paths(const char* paths_str)
|
197
197
|
{
|
198
|
-
|
199
198
|
if (paths_str) {
|
200
199
|
const char* beg = paths_str;
|
201
200
|
const char* end = Prelexer::find_first<PATH_SEP>(beg);
|
@@ -218,15 +217,15 @@ namespace Sass {
|
|
218
217
|
}
|
219
218
|
}
|
220
219
|
|
221
|
-
void Context::collect_plugin_paths(
|
220
|
+
void Context::collect_plugin_paths(string_list* paths_array)
|
222
221
|
{
|
223
|
-
|
224
|
-
|
225
|
-
collect_plugin_paths(paths_array
|
222
|
+
while (paths_array)
|
223
|
+
{
|
224
|
+
collect_plugin_paths(paths_array->string);
|
225
|
+
paths_array = paths_array->next;
|
226
226
|
}
|
227
227
|
}
|
228
228
|
|
229
|
-
|
230
229
|
// resolve the imp_path in base_path or include_paths
|
231
230
|
// looks for alternatives and returns a list from one directory
|
232
231
|
std::vector<Include> Context::find_includes(const Importer& import)
|
@@ -289,7 +288,7 @@ namespace Sass {
|
|
289
288
|
const char* contents = resources[idx].contents;
|
290
289
|
// keep a copy of the path around (for parserstates)
|
291
290
|
// ToDo: we clean it, but still not very elegant!?
|
292
|
-
strings.push_back(
|
291
|
+
strings.push_back(sass_copy_c_string(inc.abs_path.c_str()));
|
293
292
|
// create the initial parser state from resource
|
294
293
|
ParserState pstate(strings.back(), contents, idx);
|
295
294
|
|
@@ -519,7 +518,7 @@ namespace Sass {
|
|
519
518
|
}
|
520
519
|
// create a copy of the resulting buffer string
|
521
520
|
// this must be freed or taken over by implementor
|
522
|
-
return
|
521
|
+
return sass_copy_c_string(emitted.buffer.c_str());
|
523
522
|
}
|
524
523
|
|
525
524
|
void Context::apply_custom_headers(Block* root, const char* ctx_path, ParserState pstate)
|
@@ -606,7 +605,7 @@ namespace Sass {
|
|
606
605
|
|
607
606
|
// ToDo: this may be resolved via custom importers
|
608
607
|
std::string abs_path(rel2abs(entry_path));
|
609
|
-
char* abs_path_c_str =
|
608
|
+
char* abs_path_c_str = sass_copy_c_string(abs_path.c_str());
|
610
609
|
strings.push_back(abs_path_c_str);
|
611
610
|
|
612
611
|
// create entry only for the import stack
|
@@ -693,7 +692,7 @@ namespace Sass {
|
|
693
692
|
if (source_map_file == "") return 0;
|
694
693
|
char* result = 0;
|
695
694
|
std::string map = emitter.render_srcmap(*this);
|
696
|
-
result =
|
695
|
+
result = sass_copy_c_string(map.c_str());
|
697
696
|
return result;
|
698
697
|
}
|
699
698
|
|
data/ext/libsass/src/context.hpp
CHANGED
@@ -101,9 +101,9 @@ namespace Sass {
|
|
101
101
|
|
102
102
|
private:
|
103
103
|
void collect_plugin_paths(const char* paths_str);
|
104
|
-
void collect_plugin_paths(
|
104
|
+
void collect_plugin_paths(string_list* paths_array);
|
105
105
|
void collect_include_paths(const char* paths_str);
|
106
|
-
void collect_include_paths(
|
106
|
+
void collect_include_paths(string_list* paths_array);
|
107
107
|
std::string format_embedded_source_map();
|
108
108
|
std::string format_source_mapping_url(const std::string& out_path);
|
109
109
|
|
data/ext/libsass/src/cssize.cpp
CHANGED
@@ -13,14 +13,22 @@ namespace Sass {
|
|
13
13
|
: ctx(ctx),
|
14
14
|
block_stack(std::vector<Block*>()),
|
15
15
|
p_stack(std::vector<Statement*>()),
|
16
|
+
s_stack(std::vector<Selector_List*>()),
|
16
17
|
backtrace(bt)
|
17
|
-
{
|
18
|
+
{
|
19
|
+
s_stack.push_back(NULL);
|
20
|
+
}
|
18
21
|
|
19
22
|
Statement* Cssize::parent()
|
20
23
|
{
|
21
24
|
return p_stack.size() ? p_stack.back() : block_stack.front();
|
22
25
|
}
|
23
26
|
|
27
|
+
Selector_List* Cssize::selector()
|
28
|
+
{
|
29
|
+
return s_stack.size() ? s_stack.back() : NULL;
|
30
|
+
}
|
31
|
+
|
24
32
|
Statement* Cssize::operator()(Block* b)
|
25
33
|
{
|
26
34
|
Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, b->pstate(), b->length(), b->is_root());
|
@@ -31,7 +39,7 @@ namespace Sass {
|
|
31
39
|
return bb;
|
32
40
|
}
|
33
41
|
|
34
|
-
Statement* Cssize::operator()(
|
42
|
+
Statement* Cssize::operator()(Directive* r)
|
35
43
|
{
|
36
44
|
if (!r->block() || !r->block()->length()) return r;
|
37
45
|
|
@@ -41,7 +49,7 @@ namespace Sass {
|
|
41
49
|
}
|
42
50
|
|
43
51
|
p_stack.push_back(r);
|
44
|
-
|
52
|
+
Directive* rr = SASS_MEMORY_NEW(ctx.mem, Directive,
|
45
53
|
r->pstate(),
|
46
54
|
r->keyword(),
|
47
55
|
r->selector(),
|
@@ -57,7 +65,7 @@ namespace Sass {
|
|
57
65
|
else {
|
58
66
|
s = static_cast<Bubble*>(s)->node();
|
59
67
|
if (s->statement_type() != Statement::DIRECTIVE) directive_exists = false;
|
60
|
-
else directive_exists = (static_cast<
|
68
|
+
else directive_exists = (static_cast<Directive*>(s)->keyword() == rr->keyword());
|
61
69
|
}
|
62
70
|
|
63
71
|
}
|
@@ -65,7 +73,7 @@ namespace Sass {
|
|
65
73
|
Block* result = SASS_MEMORY_NEW(ctx.mem, Block, rr->pstate());
|
66
74
|
if (!(directive_exists || rr->is_keyframes()))
|
67
75
|
{
|
68
|
-
|
76
|
+
Directive* empty_node = static_cast<Directive*>(rr);
|
69
77
|
empty_node->block(SASS_MEMORY_NEW(ctx.mem, Block, rr->block() ? rr->block()->pstate() : rr->pstate()));
|
70
78
|
*result << empty_node;
|
71
79
|
}
|
@@ -93,11 +101,14 @@ namespace Sass {
|
|
93
101
|
Statement* Cssize::operator()(Ruleset* r)
|
94
102
|
{
|
95
103
|
p_stack.push_back(r);
|
104
|
+
s_stack.push_back(dynamic_cast<Selector_List*>(r->selector()));
|
96
105
|
Ruleset* rr = SASS_MEMORY_NEW(ctx.mem, Ruleset,
|
97
106
|
r->pstate(),
|
98
107
|
r->selector(),
|
99
108
|
r->block()->perform(this)->block());
|
109
|
+
rr->is_root(r->is_root());
|
100
110
|
// rr->tabs(r->block()->tabs());
|
111
|
+
s_stack.pop_back();
|
101
112
|
p_stack.pop_back();
|
102
113
|
|
103
114
|
if (!rr->block()) {
|
@@ -213,7 +224,7 @@ namespace Sass {
|
|
213
224
|
return bubble(m);
|
214
225
|
}
|
215
226
|
|
216
|
-
Statement* Cssize::bubble(
|
227
|
+
Statement* Cssize::bubble(Directive* m)
|
217
228
|
{
|
218
229
|
Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, this->parent()->pstate());
|
219
230
|
Has_Block* new_rule = static_cast<Has_Block*>(shallow_copy(this->parent()));
|
@@ -227,7 +238,7 @@ namespace Sass {
|
|
227
238
|
|
228
239
|
Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block, m->block() ? m->block()->pstate() : m->pstate());
|
229
240
|
*wrapper_block << new_rule;
|
230
|
-
|
241
|
+
Directive* mm = SASS_MEMORY_NEW(ctx.mem, Directive,
|
231
242
|
m->pstate(),
|
232
243
|
m->keyword(),
|
233
244
|
m->selector(),
|
@@ -374,7 +385,7 @@ namespace Sass {
|
|
374
385
|
case Statement::BUBBLE:
|
375
386
|
return SASS_MEMORY_NEW(ctx.mem, Bubble, *static_cast<Bubble*>(s));
|
376
387
|
case Statement::DIRECTIVE:
|
377
|
-
return SASS_MEMORY_NEW(ctx.mem,
|
388
|
+
return SASS_MEMORY_NEW(ctx.mem, Directive, *static_cast<Directive*>(s));
|
378
389
|
case Statement::SUPPORTS:
|
379
390
|
return SASS_MEMORY_NEW(ctx.mem, Supports_Block, *static_cast<Supports_Block*>(s));
|
380
391
|
case Statement::ATROOT:
|