sassc 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/ext/libsass/.gitignore +6 -0
- data/ext/libsass/.travis.yml +5 -1
- data/ext/libsass/Makefile +12 -3
- data/ext/libsass/Makefile.am +16 -28
- data/ext/libsass/Readme.md +1 -0
- data/ext/libsass/appveyor.yml +1 -2
- data/ext/libsass/ast.cpp +9 -0
- data/ext/libsass/ast.hpp +152 -55
- data/ext/libsass/ast_factory.hpp +2 -0
- data/ext/libsass/ast_fwd_decl.hpp +1 -0
- data/ext/libsass/backtrace.hpp +2 -2
- data/ext/libsass/bind.cpp +15 -13
- data/ext/libsass/configure.ac +17 -5
- data/ext/libsass/constants.cpp +22 -2
- data/ext/libsass/constants.hpp +21 -2
- data/ext/libsass/context.cpp +79 -57
- data/ext/libsass/context.hpp +23 -9
- data/ext/libsass/contextualize.cpp +2 -28
- data/ext/libsass/contextualize.hpp +6 -10
- data/ext/libsass/contextualize_eval.cpp +93 -0
- data/ext/libsass/contextualize_eval.hpp +44 -0
- data/ext/libsass/contrib/plugin.cpp +57 -0
- data/ext/libsass/cssize.cpp +3 -1
- data/ext/libsass/debugger.hpp +242 -83
- data/ext/libsass/emitter.cpp +1 -1
- data/ext/libsass/emitter.hpp +1 -1
- data/ext/libsass/environment.hpp +109 -25
- data/ext/libsass/error_handling.cpp +3 -3
- data/ext/libsass/error_handling.hpp +0 -1
- data/ext/libsass/eval.cpp +145 -61
- data/ext/libsass/eval.hpp +9 -1
- data/ext/libsass/expand.cpp +134 -60
- data/ext/libsass/expand.hpp +5 -2
- data/ext/libsass/extend.cpp +7 -5
- data/ext/libsass/file.cpp +176 -123
- data/ext/libsass/file.hpp +44 -7
- data/ext/libsass/functions.cpp +36 -17
- data/ext/libsass/functions.hpp +2 -2
- data/ext/libsass/inspect.cpp +23 -14
- data/ext/libsass/inspect.hpp +1 -0
- data/ext/libsass/json.cpp +132 -135
- data/ext/libsass/lexer.cpp +133 -0
- data/ext/libsass/lexer.hpp +239 -0
- data/ext/libsass/listize.cpp +83 -0
- data/ext/libsass/listize.hpp +41 -0
- data/ext/libsass/operation.hpp +2 -0
- data/ext/libsass/output.cpp +5 -6
- data/ext/libsass/parser.cpp +426 -388
- data/ext/libsass/parser.hpp +97 -109
- data/ext/libsass/plugins.cpp +15 -2
- data/ext/libsass/plugins.hpp +6 -4
- data/ext/libsass/position.cpp +52 -17
- data/ext/libsass/position.hpp +19 -17
- data/ext/libsass/prelexer.cpp +202 -235
- data/ext/libsass/prelexer.hpp +73 -333
- data/ext/libsass/sass.cpp +21 -11
- data/ext/libsass/sass.h +6 -6
- data/ext/libsass/sass_context.cpp +167 -81
- data/ext/libsass/sass_context.h +26 -6
- data/ext/libsass/sass_functions.cpp +49 -40
- data/ext/libsass/sass_functions.h +55 -43
- data/ext/libsass/sass_interface.cpp +9 -8
- data/ext/libsass/sass_interface.h +3 -3
- data/ext/libsass/sass_version.h +8 -0
- data/ext/libsass/sass_version.h.in +8 -0
- data/ext/libsass/script/ci-build-libsass +3 -3
- data/ext/libsass/script/ci-report-coverage +2 -1
- data/ext/libsass/source_map.cpp +2 -2
- data/ext/libsass/util.cpp +60 -11
- data/ext/libsass/util.hpp +6 -1
- data/ext/libsass/win/libsass.filters +12 -0
- data/ext/libsass/win/libsass.vcxproj +10 -0
- data/lib/sassc.rb +3 -1
- data/lib/sassc/cache_stores/base.rb +2 -0
- data/lib/sassc/dependency.rb +3 -1
- data/lib/sassc/engine.rb +31 -16
- data/lib/sassc/error.rb +3 -2
- data/lib/sassc/functions_handler.rb +54 -0
- data/lib/sassc/import_handler.rb +41 -0
- data/lib/sassc/importer.rb +4 -31
- data/lib/sassc/native.rb +1 -1
- data/lib/sassc/native/native_context_api.rb +3 -2
- data/lib/sassc/script.rb +0 -51
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +1 -0
- data/test/custom_importer_test.rb +72 -69
- data/test/engine_test.rb +53 -54
- data/test/functions_test.rb +40 -39
- data/test/native_test.rb +145 -149
- data/test/output_style_test.rb +98 -0
- data/test/test_helper.rb +21 -7
- metadata +28 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c834fe7f6b0359169fc1f6ba7d1cab0e98c90db
|
4
|
+
data.tar.gz: fb01c0beb052582b9b7f642b0c723d9c12754c22
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76ac15bb37435e1979a62a05fdd90ab3eaa017e7bce9726e386ee01718f7989929554f878f73924aa5d94d0fbea742503a8d2ee46421a5916e7c6e85c4fde7a1
|
7
|
+
data.tar.gz: 5838c775f6078cd2be03c47f2ef5637fcea57e521f7d2bbc6af1f78d8aa3c1e42bfe3b165f5ce1ea5ace1b22e6d17d33f8759bf65333a49df74f56b92642aa7f
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@ This gem combines the speed of `libsass`, the [Sass C implementation](https://gi
|
|
6
6
|
|
7
7
|
### libsass Version
|
8
8
|
|
9
|
-
[3.
|
9
|
+
[3.2.0-beta.6](https://github.com/sass/libsass/releases/tag/3.2.0-beta.6)
|
10
10
|
|
11
11
|
## Contributing
|
12
12
|
|
data/ext/libsass/.gitignore
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# Miscellaneous stuff
|
2
2
|
|
3
|
+
VERSION
|
3
4
|
.DS_Store
|
4
5
|
.sass-cache
|
5
6
|
*.gem
|
@@ -19,12 +20,14 @@ Makefile.in
|
|
19
20
|
/config.log
|
20
21
|
/config.status
|
21
22
|
/configure
|
23
|
+
include/
|
22
24
|
/libtool
|
23
25
|
/m4/libtool.m4
|
24
26
|
/m4/ltoptions.m4
|
25
27
|
/m4/ltsugar.m4
|
26
28
|
/m4/ltversion.m4
|
27
29
|
/m4/lt~obsolete.m4
|
30
|
+
/script/ar-lib
|
28
31
|
/script/compile
|
29
32
|
/script/config.guess
|
30
33
|
/script/config.sub
|
@@ -44,6 +47,9 @@ libsass/*
|
|
44
47
|
*.so
|
45
48
|
*.dll
|
46
49
|
*.a
|
50
|
+
*.suo
|
51
|
+
*.sdf
|
52
|
+
*.opensdf
|
47
53
|
a.out
|
48
54
|
libsass.js
|
49
55
|
tester
|
data/ext/libsass/.travis.yml
CHANGED
@@ -2,7 +2,7 @@ language: cpp
|
|
2
2
|
|
3
3
|
os:
|
4
4
|
- linux
|
5
|
-
|
5
|
+
- osx
|
6
6
|
|
7
7
|
compiler:
|
8
8
|
- gcc
|
@@ -31,6 +31,10 @@ matrix:
|
|
31
31
|
exclude:
|
32
32
|
- compiler: clang
|
33
33
|
env: AUTOTOOLS=yes COVERAGE=yes BUILD=static
|
34
|
+
- os: osx
|
35
|
+
compiler: gcc
|
36
|
+
- os: osx
|
37
|
+
env: AUTOTOOLS=no COVERAGE=yes BUILD=static
|
34
38
|
|
35
39
|
script: ./script/ci-build-libsass
|
36
40
|
before_install: ./script/ci-install-deps
|
data/ext/libsass/Makefile
CHANGED
@@ -4,9 +4,15 @@ RM ?= rm -f
|
|
4
4
|
CP ?= cp -a
|
5
5
|
MKDIR ?= mkdir
|
6
6
|
WINDRES ?= windres
|
7
|
-
CFLAGS ?= -Wall
|
8
|
-
CXXFLAGS ?= -Wall
|
9
|
-
LDFLAGS ?= -Wall
|
7
|
+
CFLAGS ?= -Wall
|
8
|
+
CXXFLAGS ?= -Wall
|
9
|
+
LDFLAGS ?= -Wall
|
10
|
+
ifneq "$(COVERAGE)" "yes"
|
11
|
+
CFLAGS += -O2
|
12
|
+
CXXFLAGS += -O2
|
13
|
+
LDFLAGS += -O2
|
14
|
+
endif
|
15
|
+
LDFLAGS += -Wl,-undefined,error
|
10
16
|
CAT ?= $(if $(filter $(OS),Windows_NT),type,cat)
|
11
17
|
|
12
18
|
ifneq (,$(findstring /cygdrive/,$(PATH)))
|
@@ -112,7 +118,9 @@ SOURCES = \
|
|
112
118
|
constants.cpp \
|
113
119
|
context.cpp \
|
114
120
|
contextualize.cpp \
|
121
|
+
contextualize_eval.cpp \
|
115
122
|
cssize.cpp \
|
123
|
+
listize.cpp \
|
116
124
|
error_handling.cpp \
|
117
125
|
eval.cpp \
|
118
126
|
expand.cpp \
|
@@ -120,6 +128,7 @@ SOURCES = \
|
|
120
128
|
file.cpp \
|
121
129
|
functions.cpp \
|
122
130
|
inspect.cpp \
|
131
|
+
lexer.cpp \
|
123
132
|
node.cpp \
|
124
133
|
json.cpp \
|
125
134
|
emitter.cpp \
|
data/ext/libsass/Makefile.am
CHANGED
@@ -1,29 +1,21 @@
|
|
1
1
|
ACLOCAL_AMFLAGS = -I m4
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
AM_CXXFLAGS = -Wall
|
3
|
+
AM_COPT = -Wall -O2
|
4
|
+
AM_COVLDFLAGS =
|
6
5
|
|
7
|
-
if
|
8
|
-
|
9
|
-
|
10
|
-
AM_CFLAGS += -fPIC
|
11
|
-
AM_CXXFLAGS += -fPIC
|
12
|
-
AM_CXXFLAGS += -std=c++0x
|
13
|
-
AM_LDFLAGS += -ldl
|
6
|
+
if ENABLE_COVERAGE
|
7
|
+
AM_COPT = -O0 --coverage
|
8
|
+
AM_COVLDFLAGS += -lgcov
|
14
9
|
endif
|
15
10
|
|
16
|
-
AM_CFLAGS
|
17
|
-
AM_CXXFLAGS
|
11
|
+
AM_CFLAGS = $(AM_COPT)
|
12
|
+
AM_CXXFLAGS = $(AM_COPT)
|
13
|
+
AM_LDFLAGS = $(AM_COPT) $(AM_COVLDFLAGS)
|
18
14
|
|
19
|
-
if
|
20
|
-
|
21
|
-
AM_CXXFLAGS += -O0 --coverage
|
22
|
-
AM_LDFLAGS += -O0 --coverage -lgcov
|
15
|
+
if COMPILER_IS_MINGW32
|
16
|
+
AM_CXXFLAGS += -std=gnu++0x
|
23
17
|
else
|
24
|
-
|
25
|
-
AM_CXXFLAGS += -O2
|
26
|
-
AM_LDFLAGS += -O2
|
18
|
+
AM_CXXFLAGS += -std=c++0x
|
27
19
|
endif
|
28
20
|
|
29
21
|
EXTRA_DIST = \
|
@@ -55,14 +47,17 @@ libsass_la_SOURCES = \
|
|
55
47
|
constants.cpp constants.hpp \
|
56
48
|
context.cpp context.hpp \
|
57
49
|
contextualize.cpp contextualize.hpp \
|
50
|
+
contextualize_eval.cpp contextualize_eval.hpp \
|
58
51
|
error_handling.cpp error_handling.hpp \
|
59
52
|
eval.cpp eval.hpp \
|
60
53
|
expand.cpp expand.hpp \
|
61
54
|
extend.cpp extend.hpp \
|
62
55
|
cssize.cpp cssize.hpp \
|
56
|
+
listize.cpp listize.hpp \
|
63
57
|
file.cpp file.hpp \
|
64
58
|
functions.cpp functions.hpp \
|
65
59
|
inspect.cpp inspect.hpp \
|
60
|
+
lexer.cpp lexer.hpp \
|
66
61
|
node.cpp node.hpp \
|
67
62
|
json.cpp json.hpp \
|
68
63
|
emitter.cpp emitter.hpp \
|
@@ -85,11 +80,9 @@ libsass_la_SOURCES = \
|
|
85
80
|
utf8_string.cpp utf8_string.hpp \
|
86
81
|
util.cpp util.hpp
|
87
82
|
|
88
|
-
libsass_la_CFLAGS = $(AM_CFLAGS)
|
89
|
-
libsass_la_CXXFLAGS = $(AM_CXXFLAGS)
|
90
83
|
libsass_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined -version-info 0:9:0
|
91
84
|
|
92
|
-
include_HEADERS = sass2scss.h sass_context.h sass_functions.h sass_values.h sass.h
|
85
|
+
include_HEADERS = sass2scss.h sass_context.h sass_functions.h sass_values.h sass.h sass_version.h
|
93
86
|
|
94
87
|
if ENABLE_TESTS
|
95
88
|
|
@@ -136,12 +129,7 @@ else
|
|
136
129
|
endif
|
137
130
|
|
138
131
|
SASS_TESTER = $(RUBY) $(SASS_SPEC_PATH)/sass-spec.rb
|
139
|
-
|
140
|
-
if COMPILER_IS_MINGW32
|
141
|
-
SASS_TESTER += -c $(SASS_LIBSASS_PATH)/tester.exe
|
142
|
-
else
|
143
|
-
SASS_TESTER += -c $(SASS_LIBSASS_PATH)/tester
|
144
|
-
endif
|
132
|
+
SASS_TESTER += -c $(SASS_LIBSASS_PATH)/tester$(EXEEXT)
|
145
133
|
|
146
134
|
test:
|
147
135
|
$(SASS_TESTER) --ignore-todo $(LOG_FLAGS) $(SASS_SPEC_PATH) $(SASS_TEST_FLAGS)
|
data/ext/libsass/Readme.md
CHANGED
@@ -7,6 +7,7 @@ by Aaron Leung ([@akhleung]) and Hampton Catlin ([@hcatlin])
|
|
7
7
|
[![Windows CI](https://ci.appveyor.com/api/projects/status/github/sass/libsass?svg=true)](https://ci.appveyor.com/project/sass/libsass/branch/master)
|
8
8
|
[![Bountysource](https://www.bountysource.com/badge/tracker?tracker_id=283068)](https://www.bountysource.com/trackers/283068-libsass?utm_source=283068&utm_medium=shield&utm_campaign=TRACKER_BADGE)
|
9
9
|
[![Coverage Status](https://img.shields.io/coveralls/sass/libsass.svg)](https://coveralls.io/r/sass/libsass?branch=feature%2Ftest-travis-ci-3)
|
10
|
+
[![Join us](https://still-ridge-9421.herokuapp.com/badge.svg)](https://still-ridge-9421.herokuapp.com/)
|
10
11
|
|
11
12
|
https://github.com/sass/libsass
|
12
13
|
|
data/ext/libsass/appveyor.yml
CHANGED
@@ -15,7 +15,6 @@ environment:
|
|
15
15
|
ruby_version: "21-x64"
|
16
16
|
|
17
17
|
cache:
|
18
|
-
- C:\mingw64
|
19
18
|
- C:\Ruby%ruby_version%\lib\ruby\gems
|
20
19
|
|
21
20
|
install:
|
@@ -64,7 +63,7 @@ test_script:
|
|
64
63
|
ruby sass-spec\sass-spec.rb -c sassc\bin\sassc.exe -s --ignore-todo sass-spec/spec
|
65
64
|
} else {
|
66
65
|
if ($env:Config -eq "Debug") {
|
67
|
-
echo test runner in debug mode build via msvc will throw debug assertions
|
66
|
+
echo "test runner in debug mode build via msvc will throw debug assertions"
|
68
67
|
echo ruby sass-spec\sass-spec.rb -c win\bin\Debug\sassc.exe -s --ignore-todo sass-spec/spec
|
69
68
|
} else {
|
70
69
|
ruby sass-spec\sass-spec.rb -c win\bin\sassc.exe -s --ignore-todo sass-spec/spec
|
data/ext/libsass/ast.cpp
CHANGED
@@ -8,6 +8,8 @@
|
|
8
8
|
namespace Sass {
|
9
9
|
using namespace std;
|
10
10
|
|
11
|
+
static Null sass_null(Sass::Null(ParserState("null")));
|
12
|
+
|
11
13
|
bool Compound_Selector::operator<(const Compound_Selector& rhs) const
|
12
14
|
{
|
13
15
|
To_String to_string;
|
@@ -587,5 +589,12 @@ namespace Sass {
|
|
587
589
|
return result;
|
588
590
|
}*/
|
589
591
|
|
592
|
+
Expression* Hashed::at(Expression* k) const
|
593
|
+
{
|
594
|
+
if (elements_.count(k))
|
595
|
+
{ return elements_.at(k); }
|
596
|
+
else { return &sass_null; }
|
597
|
+
}
|
598
|
+
|
590
599
|
}
|
591
600
|
|
data/ext/libsass/ast.hpp
CHANGED
@@ -87,6 +87,7 @@ namespace Sass {
|
|
87
87
|
STRING,
|
88
88
|
LIST,
|
89
89
|
MAP,
|
90
|
+
SELECTOR,
|
90
91
|
NULL_VAL,
|
91
92
|
NUM_TYPES
|
92
93
|
};
|
@@ -209,9 +210,10 @@ namespace Sass {
|
|
209
210
|
size_t length() const { return list_.size(); }
|
210
211
|
bool empty() const { return list_.empty(); }
|
211
212
|
bool has(Expression* k) const { return elements_.count(k) == 1; }
|
212
|
-
Expression* at(Expression* k) const
|
213
|
+
Expression* at(Expression* k) const;
|
213
214
|
bool has_duplicate_key() const { return duplicate_key_ != 0; }
|
214
215
|
Expression* get_duplicate_key() const { return duplicate_key_; }
|
216
|
+
const unordered_map<Expression*, Expression*> elements() { return elements_; }
|
215
217
|
Hashed& operator<<(pair<Expression*, Expression*> p)
|
216
218
|
{
|
217
219
|
reset_hash();
|
@@ -430,10 +432,10 @@ namespace Sass {
|
|
430
432
|
// Keyframe-rules -- the child blocks of "@keyframes" nodes.
|
431
433
|
///////////////////////////////////////////////////////////////////////
|
432
434
|
class Keyframe_Rule : public Has_Block {
|
433
|
-
ADD_PROPERTY(
|
435
|
+
ADD_PROPERTY(Selector*, selector);
|
434
436
|
public:
|
435
437
|
Keyframe_Rule(ParserState pstate, Block* b)
|
436
|
-
: Has_Block(pstate, b),
|
438
|
+
: Has_Block(pstate, b), selector_(0)
|
437
439
|
{ statement_type(KEYFRAMERULE); }
|
438
440
|
ATTACH_OPERATIONS();
|
439
441
|
};
|
@@ -459,14 +461,14 @@ namespace Sass {
|
|
459
461
|
class Assignment : public Statement {
|
460
462
|
ADD_PROPERTY(string, variable);
|
461
463
|
ADD_PROPERTY(Expression*, value);
|
462
|
-
ADD_PROPERTY(bool,
|
464
|
+
ADD_PROPERTY(bool, is_default);
|
463
465
|
ADD_PROPERTY(bool, is_global);
|
464
466
|
public:
|
465
467
|
Assignment(ParserState pstate,
|
466
468
|
string var, Expression* val,
|
467
|
-
bool
|
468
|
-
bool
|
469
|
-
: Statement(pstate), variable_(var), value_(val),
|
469
|
+
bool is_default = false,
|
470
|
+
bool is_global = false)
|
471
|
+
: Statement(pstate), variable_(var), value_(val), is_default_(is_default), is_global_(is_global)
|
470
472
|
{ }
|
471
473
|
ATTACH_OPERATIONS();
|
472
474
|
};
|
@@ -643,8 +645,9 @@ namespace Sass {
|
|
643
645
|
ADD_PROPERTY(Env*, environment);
|
644
646
|
ADD_PROPERTY(Type, type);
|
645
647
|
ADD_PROPERTY(Native_Function, native_function);
|
646
|
-
ADD_PROPERTY(
|
648
|
+
ADD_PROPERTY(Sass_Function_Entry, c_function);
|
647
649
|
ADD_PROPERTY(void*, cookie);
|
650
|
+
ADD_PROPERTY(Context*, ctx);
|
648
651
|
ADD_PROPERTY(bool, is_overload_stub);
|
649
652
|
ADD_PROPERTY(Signature, signature);
|
650
653
|
public:
|
@@ -652,6 +655,7 @@ namespace Sass {
|
|
652
655
|
string n,
|
653
656
|
Parameters* params,
|
654
657
|
Block* b,
|
658
|
+
Context* ctx,
|
655
659
|
Type t)
|
656
660
|
: Has_Block(pstate, b),
|
657
661
|
name_(n),
|
@@ -661,6 +665,7 @@ namespace Sass {
|
|
661
665
|
native_function_(0),
|
662
666
|
c_function_(0),
|
663
667
|
cookie_(0),
|
668
|
+
ctx_(ctx),
|
664
669
|
is_overload_stub_(false),
|
665
670
|
signature_(0)
|
666
671
|
{ }
|
@@ -669,6 +674,7 @@ namespace Sass {
|
|
669
674
|
string n,
|
670
675
|
Parameters* params,
|
671
676
|
Native_Function func_ptr,
|
677
|
+
Context* ctx,
|
672
678
|
bool overload_stub = false)
|
673
679
|
: Has_Block(pstate, 0),
|
674
680
|
name_(n),
|
@@ -678,6 +684,7 @@ namespace Sass {
|
|
678
684
|
native_function_(func_ptr),
|
679
685
|
c_function_(0),
|
680
686
|
cookie_(0),
|
687
|
+
ctx_(ctx),
|
681
688
|
is_overload_stub_(overload_stub),
|
682
689
|
signature_(sig)
|
683
690
|
{ }
|
@@ -685,8 +692,8 @@ namespace Sass {
|
|
685
692
|
Signature sig,
|
686
693
|
string n,
|
687
694
|
Parameters* params,
|
688
|
-
|
689
|
-
|
695
|
+
Sass_Function_Entry c_func,
|
696
|
+
Context* ctx,
|
690
697
|
bool whatever,
|
691
698
|
bool whatever2)
|
692
699
|
: Has_Block(pstate, 0),
|
@@ -695,8 +702,9 @@ namespace Sass {
|
|
695
702
|
environment_(0),
|
696
703
|
type_(FUNCTION),
|
697
704
|
native_function_(0),
|
698
|
-
c_function_(
|
699
|
-
cookie_(
|
705
|
+
c_function_(c_func),
|
706
|
+
cookie_(sass_function_get_cookie(c_func)),
|
707
|
+
ctx_(ctx),
|
700
708
|
is_overload_stub_(false),
|
701
709
|
signature_(sig)
|
702
710
|
{ }
|
@@ -843,11 +851,34 @@ namespace Sass {
|
|
843
851
|
ADD_PROPERTY(Type, type);
|
844
852
|
ADD_PROPERTY(Expression*, left);
|
845
853
|
ADD_PROPERTY(Expression*, right);
|
854
|
+
size_t hash_;
|
846
855
|
public:
|
847
856
|
Binary_Expression(ParserState pstate,
|
848
857
|
Type t, Expression* lhs, Expression* rhs)
|
849
|
-
: Expression(pstate), type_(t), left_(lhs), right_(rhs)
|
858
|
+
: Expression(pstate), type_(t), left_(lhs), right_(rhs), hash_(0)
|
850
859
|
{ }
|
860
|
+
virtual bool operator==(Expression& rhs) const
|
861
|
+
{
|
862
|
+
try
|
863
|
+
{
|
864
|
+
Binary_Expression& m = dynamic_cast<Binary_Expression&>(rhs);
|
865
|
+
if (m == 0) return false;
|
866
|
+
return type() == m.type() &&
|
867
|
+
left() == m.left() &&
|
868
|
+
right() == m.right();
|
869
|
+
}
|
870
|
+
catch (std::bad_cast&)
|
871
|
+
{
|
872
|
+
return false;
|
873
|
+
}
|
874
|
+
catch (...) { throw; }
|
875
|
+
}
|
876
|
+
virtual size_t hash()
|
877
|
+
{
|
878
|
+
if (hash_ > 0) return hash_;
|
879
|
+
hash_ = left()->hash() ^ right()->hash() ^ std::hash<size_t>()(type_);
|
880
|
+
return hash_;
|
881
|
+
}
|
851
882
|
ATTACH_OPERATIONS();
|
852
883
|
};
|
853
884
|
|
@@ -860,10 +891,32 @@ namespace Sass {
|
|
860
891
|
private:
|
861
892
|
ADD_PROPERTY(Type, type);
|
862
893
|
ADD_PROPERTY(Expression*, operand);
|
894
|
+
size_t hash_;
|
863
895
|
public:
|
864
896
|
Unary_Expression(ParserState pstate, Type t, Expression* o)
|
865
|
-
: Expression(pstate), type_(t), operand_(o)
|
897
|
+
: Expression(pstate), type_(t), operand_(o), hash_(0)
|
866
898
|
{ }
|
899
|
+
virtual bool operator==(Expression& rhs) const
|
900
|
+
{
|
901
|
+
try
|
902
|
+
{
|
903
|
+
Unary_Expression& m = dynamic_cast<Unary_Expression&>(rhs);
|
904
|
+
if (m == 0) return false;
|
905
|
+
return type() == m.type() &&
|
906
|
+
operand() == m.operand();
|
907
|
+
}
|
908
|
+
catch (std::bad_cast&)
|
909
|
+
{
|
910
|
+
return false;
|
911
|
+
}
|
912
|
+
catch (...) { throw; }
|
913
|
+
}
|
914
|
+
virtual size_t hash()
|
915
|
+
{
|
916
|
+
if (hash_ > 0) return hash_;
|
917
|
+
hash_ = operand()->hash() ^ std::hash<size_t>()(type_);
|
918
|
+
return hash_;
|
919
|
+
}
|
867
920
|
ATTACH_OPERATIONS();
|
868
921
|
};
|
869
922
|
|
@@ -891,7 +944,7 @@ namespace Sass {
|
|
891
944
|
{
|
892
945
|
Argument& m = dynamic_cast<Argument&>(rhs);
|
893
946
|
if (!(m && name() == m.name())) return false;
|
894
|
-
return *value() == *value();
|
947
|
+
return *value() == *m.value();
|
895
948
|
}
|
896
949
|
catch (std::bad_cast&)
|
897
950
|
{
|
@@ -1392,16 +1445,16 @@ namespace Sass {
|
|
1392
1445
|
size_t hash_;
|
1393
1446
|
public:
|
1394
1447
|
String_Constant(ParserState pstate, string val)
|
1395
|
-
: String(pstate), quote_mark_(0), value_(val), hash_(0)
|
1448
|
+
: String(pstate), quote_mark_(0), value_(read_css_string(val)), hash_(0)
|
1396
1449
|
{ }
|
1397
1450
|
String_Constant(ParserState pstate, const char* beg)
|
1398
|
-
: String(pstate), quote_mark_(0), value_(string(beg)), hash_(0)
|
1451
|
+
: String(pstate), quote_mark_(0), value_(read_css_string(string(beg))), hash_(0)
|
1399
1452
|
{ }
|
1400
1453
|
String_Constant(ParserState pstate, const char* beg, const char* end)
|
1401
|
-
: String(pstate), quote_mark_(0), value_(string(beg, end-beg)), hash_(0)
|
1454
|
+
: String(pstate), quote_mark_(0), value_(read_css_string(string(beg, end-beg))), hash_(0)
|
1402
1455
|
{ }
|
1403
1456
|
String_Constant(ParserState pstate, const Token& tok)
|
1404
|
-
: String(pstate), quote_mark_(0), value_(string(tok.begin, tok.end)), hash_(0)
|
1457
|
+
: String(pstate), quote_mark_(0), value_(read_css_string(string(tok.begin, tok.end))), hash_(0)
|
1405
1458
|
{ }
|
1406
1459
|
string type() { return "string"; }
|
1407
1460
|
static string type_name() { return "string"; }
|
@@ -1666,9 +1719,6 @@ namespace Sass {
|
|
1666
1719
|
if (has_rest_parameter_) {
|
1667
1720
|
error("functions and mixins cannot have more than one variable-length parameter", p->pstate());
|
1668
1721
|
}
|
1669
|
-
if (has_optional_parameters_) {
|
1670
|
-
error("optional parameters may not be combined with variable-length parameters", p->pstate());
|
1671
|
-
}
|
1672
1722
|
has_rest_parameter_ = true;
|
1673
1723
|
}
|
1674
1724
|
else {
|
@@ -1695,6 +1745,22 @@ namespace Sass {
|
|
1695
1745
|
//////////////////////////////////////////////////////////////////////////////////////////
|
1696
1746
|
inline Expression* List::value_at_index(size_t i) { return is_arglist_ ? ((Argument*)(*this)[i])->value() : (*this)[i]; }
|
1697
1747
|
|
1748
|
+
////////////
|
1749
|
+
// The Parent Selector Expression.
|
1750
|
+
////////////
|
1751
|
+
class Parent_Selector : public Expression {
|
1752
|
+
ADD_PROPERTY(Selector*, selector);
|
1753
|
+
public:
|
1754
|
+
Parent_Selector(ParserState pstate, Selector* r = 0)
|
1755
|
+
: Expression(pstate), selector_(r)
|
1756
|
+
{ concrete_type(SELECTOR); }
|
1757
|
+
virtual Selector* selector() { return selector_; }
|
1758
|
+
string type() { return "selector"; }
|
1759
|
+
static string type_name() { return "selector"; }
|
1760
|
+
|
1761
|
+
ATTACH_OPERATIONS();
|
1762
|
+
};
|
1763
|
+
|
1698
1764
|
/////////////////////////////////////////
|
1699
1765
|
// Abstract base class for CSS selectors.
|
1700
1766
|
/////////////////////////////////////////
|
@@ -1722,7 +1788,9 @@ namespace Sass {
|
|
1722
1788
|
{ }
|
1723
1789
|
virtual ~Selector() = 0;
|
1724
1790
|
// virtual Selector_Placeholder* find_placeholder();
|
1725
|
-
virtual
|
1791
|
+
virtual unsigned long specificity() {
|
1792
|
+
return Constants::Specificity_Universal;
|
1793
|
+
};
|
1726
1794
|
};
|
1727
1795
|
inline Selector::~Selector() { }
|
1728
1796
|
|
@@ -1750,6 +1818,7 @@ namespace Sass {
|
|
1750
1818
|
virtual ~Simple_Selector() = 0;
|
1751
1819
|
virtual Compound_Selector* unify_with(Compound_Selector*, Context&);
|
1752
1820
|
virtual bool is_pseudo_element() { return false; }
|
1821
|
+
virtual bool is_pseudo_class() { return false; }
|
1753
1822
|
|
1754
1823
|
bool operator==(const Simple_Selector& rhs) const;
|
1755
1824
|
inline bool operator!=(const Simple_Selector& rhs) const { return !(*this == rhs); }
|
@@ -1767,10 +1836,10 @@ namespace Sass {
|
|
1767
1836
|
Selector_Reference(ParserState pstate, Selector* r = 0)
|
1768
1837
|
: Simple_Selector(pstate), selector_(r)
|
1769
1838
|
{ has_reference(true); }
|
1770
|
-
virtual
|
1839
|
+
virtual unsigned long specificity()
|
1771
1840
|
{
|
1772
|
-
if (selector()) return
|
1773
|
-
|
1841
|
+
if (!selector()) return 0;
|
1842
|
+
return selector()->specificity();
|
1774
1843
|
}
|
1775
1844
|
ATTACH_OPERATIONS();
|
1776
1845
|
};
|
@@ -1797,10 +1866,11 @@ namespace Sass {
|
|
1797
1866
|
Type_Selector(ParserState pstate, string n)
|
1798
1867
|
: Simple_Selector(pstate), name_(n)
|
1799
1868
|
{ }
|
1800
|
-
virtual
|
1869
|
+
virtual unsigned long specificity()
|
1801
1870
|
{
|
1802
|
-
|
1803
|
-
|
1871
|
+
// ToDo: What is the specificity of the star selector?
|
1872
|
+
if (name() == "*") return Constants::Specificity_Universal;
|
1873
|
+
else return Constants::Specificity_Type;
|
1804
1874
|
}
|
1805
1875
|
virtual Compound_Selector* unify_with(Compound_Selector*, Context&);
|
1806
1876
|
ATTACH_OPERATIONS();
|
@@ -1815,10 +1885,11 @@ namespace Sass {
|
|
1815
1885
|
Selector_Qualifier(ParserState pstate, string n)
|
1816
1886
|
: Simple_Selector(pstate), name_(n)
|
1817
1887
|
{ }
|
1818
|
-
virtual
|
1888
|
+
virtual unsigned long specificity()
|
1819
1889
|
{
|
1820
|
-
if (name()[0] == '#') return Constants::
|
1821
|
-
|
1890
|
+
if (name()[0] == '#') return Constants::Specificity_ID;
|
1891
|
+
if (name()[0] == '.') return Constants::Specificity_Class;
|
1892
|
+
else return Constants::Specificity_Type;
|
1822
1893
|
}
|
1823
1894
|
virtual Compound_Selector* unify_with(Compound_Selector*, Context&);
|
1824
1895
|
ATTACH_OPERATIONS();
|
@@ -1835,12 +1906,28 @@ namespace Sass {
|
|
1835
1906
|
Attribute_Selector(ParserState pstate, string n, string m, String* v)
|
1836
1907
|
: Simple_Selector(pstate), name_(n), matcher_(m), value_(v)
|
1837
1908
|
{ }
|
1909
|
+
virtual unsigned long specificity()
|
1910
|
+
{
|
1911
|
+
return Constants::Specificity_Attr;
|
1912
|
+
}
|
1838
1913
|
ATTACH_OPERATIONS();
|
1839
1914
|
};
|
1840
1915
|
|
1841
1916
|
//////////////////////////////////////////////////////////////////
|
1842
1917
|
// Pseudo selectors -- e.g., :first-child, :nth-of-type(...), etc.
|
1843
1918
|
//////////////////////////////////////////////////////////////////
|
1919
|
+
/* '::' starts a pseudo-element, ':' a pseudo-class */
|
1920
|
+
/* Except :first-line, :first-letter, :before and :after */
|
1921
|
+
/* Note that pseudo-elements are restricted to one per selector */
|
1922
|
+
/* and occur only in the last simple_selector_sequence. */
|
1923
|
+
inline bool is_pseudo_class_element(const string& name)
|
1924
|
+
{
|
1925
|
+
return name == ":before" ||
|
1926
|
+
name == ":after" ||
|
1927
|
+
name == ":first-line" ||
|
1928
|
+
name == ":first-letter";
|
1929
|
+
}
|
1930
|
+
|
1844
1931
|
class Pseudo_Selector : public Simple_Selector {
|
1845
1932
|
ADD_PROPERTY(string, name);
|
1846
1933
|
ADD_PROPERTY(String*, expression);
|
@@ -1848,29 +1935,33 @@ namespace Sass {
|
|
1848
1935
|
Pseudo_Selector(ParserState pstate, string n, String* expr = 0)
|
1849
1936
|
: Simple_Selector(pstate), name_(n), expression_(expr)
|
1850
1937
|
{ }
|
1851
|
-
|
1938
|
+
|
1939
|
+
// A pseudo-class always consists of a "colon" (:) followed by the name
|
1940
|
+
// of the pseudo-class and optionally by a value between parentheses.
|
1941
|
+
virtual bool is_pseudo_class()
|
1852
1942
|
{
|
1853
|
-
|
1854
|
-
|
1855
|
-
name() == ":after" || name() == "::after" ||
|
1856
|
-
name() == ":first-line" || name() == "::first-line" ||
|
1857
|
-
name() == ":first-letter" || name() == "::first-letter")
|
1858
|
-
return 1;
|
1859
|
-
else
|
1860
|
-
return Constants::SPECIFICITY_BASE;
|
1943
|
+
return (name_[0] == ':' && name_[1] != ':')
|
1944
|
+
&& ! is_pseudo_class_element(name_);
|
1861
1945
|
}
|
1946
|
+
|
1947
|
+
// A pseudo-element is made of two colons (::) followed by the name.
|
1948
|
+
// The `::` notation is introduced by the current document in order to
|
1949
|
+
// establish a discrimination between pseudo-classes and pseudo-elements.
|
1950
|
+
// For compatibility with existing style sheets, user agents must also
|
1951
|
+
// accept the previous one-colon notation for pseudo-elements introduced
|
1952
|
+
// in CSS levels 1 and 2 (namely, :first-line, :first-letter, :before and
|
1953
|
+
// :after). This compatibility is not allowed for the new pseudo-elements
|
1954
|
+
// introduced in this specification.
|
1862
1955
|
virtual bool is_pseudo_element()
|
1863
1956
|
{
|
1864
|
-
|
1865
|
-
|
1866
|
-
|
1867
|
-
|
1868
|
-
|
1869
|
-
|
1870
|
-
|
1871
|
-
|
1872
|
-
return name().find("::") == 0;
|
1873
|
-
}
|
1957
|
+
return (name_[0] == ':' && name_[1] == ':')
|
1958
|
+
|| is_pseudo_class_element(name_);
|
1959
|
+
}
|
1960
|
+
virtual unsigned long specificity()
|
1961
|
+
{
|
1962
|
+
if (is_pseudo_element())
|
1963
|
+
return Constants::Specificity_Type;
|
1964
|
+
return Constants::Specificity_Pseudo;
|
1874
1965
|
}
|
1875
1966
|
virtual Compound_Selector* unify_with(Compound_Selector*, Context&);
|
1876
1967
|
ATTACH_OPERATIONS();
|
@@ -1886,6 +1977,12 @@ namespace Sass {
|
|
1886
1977
|
Wrapped_Selector(ParserState pstate, string n, Selector* sel)
|
1887
1978
|
: Simple_Selector(pstate), name_(n), selector_(sel)
|
1888
1979
|
{ }
|
1980
|
+
// Selectors inside the negation pseudo-class are counted like any
|
1981
|
+
// other, but the negation itself does not count as a pseudo-class.
|
1982
|
+
virtual unsigned long specificity()
|
1983
|
+
{
|
1984
|
+
return selector_ ? selector_->specificity() : 0;
|
1985
|
+
}
|
1889
1986
|
ATTACH_OPERATIONS();
|
1890
1987
|
};
|
1891
1988
|
|
@@ -1926,7 +2023,7 @@ namespace Sass {
|
|
1926
2023
|
return 0;
|
1927
2024
|
}
|
1928
2025
|
bool is_superselector_of(Compound_Selector* rhs);
|
1929
|
-
virtual
|
2026
|
+
virtual unsigned long specificity()
|
1930
2027
|
{
|
1931
2028
|
int sum = 0;
|
1932
2029
|
for (size_t i = 0, L = length(); i < L; ++i)
|
@@ -1987,7 +2084,7 @@ namespace Sass {
|
|
1987
2084
|
// virtual Selector_Placeholder* find_placeholder();
|
1988
2085
|
Combinator clear_innermost();
|
1989
2086
|
void set_innermost(Complex_Selector*, Combinator);
|
1990
|
-
virtual
|
2087
|
+
virtual unsigned long specificity() const
|
1991
2088
|
{
|
1992
2089
|
int sum = 0;
|
1993
2090
|
if (head()) sum += head()->specificity();
|
@@ -2068,9 +2165,9 @@ namespace Sass {
|
|
2068
2165
|
: Selector(pstate), Vectorized<Complex_Selector*>(s), wspace_(0)
|
2069
2166
|
{ }
|
2070
2167
|
// virtual Selector_Placeholder* find_placeholder();
|
2071
|
-
virtual
|
2168
|
+
virtual unsigned long specificity()
|
2072
2169
|
{
|
2073
|
-
|
2170
|
+
unsigned long sum = 0;
|
2074
2171
|
for (size_t i = 0, L = length(); i < L; ++i)
|
2075
2172
|
{ sum += (*this)[i]->specificity(); }
|
2076
2173
|
return sum;
|