sassc 2.0.0 → 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/.gitignore +2 -0
- data/.gitmodules +1 -1
- data/.travis.yml +9 -3
- data/CHANGELOG.md +36 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/README.md +1 -1
- data/Rakefile +43 -7
- data/ext/depend +4 -0
- data/ext/extconf.rb +92 -0
- data/ext/libsass/VERSION +1 -0
- data/ext/libsass/include/sass/base.h +9 -1
- data/ext/libsass/include/sass/context.h +5 -1
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +755 -2028
- data/ext/libsass/src/ast.hpp +492 -2477
- data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +70 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
- data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
- data/ext/libsass/src/ast_helpers.hpp +292 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +275 -0
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +1043 -0
- data/ext/libsass/src/ast_selectors.hpp +522 -0
- data/ext/libsass/src/ast_supports.cpp +114 -0
- data/ext/libsass/src/ast_supports.hpp +121 -0
- data/ext/libsass/src/ast_values.cpp +1154 -0
- data/ext/libsass/src/ast_values.hpp +498 -0
- data/ext/libsass/src/backtrace.cpp +11 -7
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +5 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +35 -34
- data/ext/libsass/src/bind.hpp +3 -1
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/cencode.c +4 -6
- data/ext/libsass/src/check_nesting.cpp +83 -88
- data/ext/libsass/src/check_nesting.hpp +39 -34
- data/ext/libsass/src/color_maps.cpp +168 -164
- data/ext/libsass/src/color_maps.hpp +152 -160
- data/ext/libsass/src/constants.cpp +20 -0
- data/ext/libsass/src/constants.hpp +19 -0
- data/ext/libsass/src/context.cpp +104 -121
- data/ext/libsass/src/context.hpp +43 -55
- data/ext/libsass/src/cssize.cpp +103 -188
- data/ext/libsass/src/cssize.hpp +45 -51
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debugger.hpp +524 -361
- data/ext/libsass/src/emitter.cpp +26 -26
- data/ext/libsass/src/emitter.hpp +20 -18
- data/ext/libsass/src/environment.cpp +41 -27
- data/ext/libsass/src/environment.hpp +33 -22
- data/ext/libsass/src/error_handling.cpp +92 -94
- data/ext/libsass/src/error_handling.hpp +73 -50
- data/ext/libsass/src/eval.cpp +380 -515
- data/ext/libsass/src/eval.hpp +64 -57
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +322 -263
- data/ext/libsass/src/expand.hpp +55 -39
- 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 +134 -88
- data/ext/libsass/src/file.hpp +28 -37
- data/ext/libsass/src/fn_colors.cpp +596 -0
- data/ext/libsass/src/fn_colors.hpp +85 -0
- data/ext/libsass/src/fn_lists.cpp +285 -0
- data/ext/libsass/src/fn_lists.hpp +34 -0
- data/ext/libsass/src/fn_maps.cpp +94 -0
- data/ext/libsass/src/fn_maps.hpp +30 -0
- data/ext/libsass/src/fn_miscs.cpp +244 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +227 -0
- data/ext/libsass/src/fn_numbers.hpp +45 -0
- data/ext/libsass/src/fn_selectors.cpp +205 -0
- data/ext/libsass/src/fn_selectors.hpp +35 -0
- data/ext/libsass/src/fn_strings.cpp +268 -0
- data/ext/libsass/src/fn_strings.hpp +34 -0
- data/ext/libsass/src/fn_utils.cpp +158 -0
- data/ext/libsass/src/fn_utils.hpp +62 -0
- data/ext/libsass/src/inspect.cpp +253 -266
- data/ext/libsass/src/inspect.hpp +72 -74
- data/ext/libsass/src/json.cpp +2 -2
- data/ext/libsass/src/lexer.cpp +25 -84
- data/ext/libsass/src/lexer.hpp +5 -16
- data/ext/libsass/src/listize.cpp +27 -43
- data/ext/libsass/src/listize.hpp +14 -11
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory.hpp +12 -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/shared_ptr.cpp +33 -0
- data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
- data/ext/libsass/src/operation.hpp +193 -143
- data/ext/libsass/src/operators.cpp +56 -29
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +59 -75
- data/ext/libsass/src/output.hpp +15 -22
- data/ext/libsass/src/parser.cpp +662 -818
- data/ext/libsass/src/parser.hpp +96 -100
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +12 -8
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +10 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/prelexer.cpp +14 -8
- data/ext/libsass/src/prelexer.hpp +9 -9
- data/ext/libsass/src/remove_placeholders.cpp +59 -57
- data/ext/libsass/src/remove_placeholders.hpp +20 -18
- data/ext/libsass/src/sass.cpp +25 -18
- data/ext/libsass/src/sass.hpp +22 -14
- data/ext/libsass/src/sass2scss.cpp +49 -18
- data/ext/libsass/src/sass_context.cpp +104 -132
- data/ext/libsass/src/sass_context.hpp +2 -2
- data/ext/libsass/src/sass_functions.cpp +7 -4
- data/ext/libsass/src/sass_functions.hpp +1 -1
- data/ext/libsass/src/sass_values.cpp +26 -21
- 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 +27 -20
- data/ext/libsass/src/source_map.hpp +14 -11
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +24 -22
- data/ext/libsass/src/to_value.hpp +18 -22
- data/ext/libsass/src/units.cpp +28 -22
- data/ext/libsass/src/units.hpp +9 -8
- data/ext/libsass/src/utf8/checked.h +12 -10
- data/ext/libsass/src/utf8/core.h +3 -0
- data/ext/libsass/src/utf8_string.cpp +12 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +97 -107
- data/ext/libsass/src/util.hpp +74 -30
- data/ext/libsass/src/util_string.cpp +125 -0
- data/ext/libsass/src/util_string.hpp +73 -0
- data/ext/libsass/src/values.cpp +33 -24
- data/ext/libsass/src/values.hpp +2 -2
- data/lib/sassc.rb +24 -0
- data/lib/sassc/engine.rb +7 -5
- data/lib/sassc/functions_handler.rb +11 -13
- data/lib/sassc/native.rb +10 -9
- data/lib/sassc/native/native_functions_api.rb +0 -5
- data/lib/sassc/script.rb +4 -6
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +32 -12
- data/test/engine_test.rb +32 -2
- data/test/functions_test.rb +38 -1
- data/test/native_test.rb +4 -4
- metadata +95 -109
- data/ext/Rakefile +0 -3
- data/ext/libsass/.editorconfig +0 -15
- data/ext/libsass/.gitattributes +0 -2
- data/ext/libsass/.github/CONTRIBUTING.md +0 -65
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
- data/ext/libsass/.gitignore +0 -85
- data/ext/libsass/.travis.yml +0 -64
- data/ext/libsass/COPYING +0 -25
- data/ext/libsass/GNUmakefile.am +0 -88
- data/ext/libsass/INSTALL +0 -1
- data/ext/libsass/LICENSE +0 -25
- data/ext/libsass/Makefile +0 -351
- data/ext/libsass/Makefile.conf +0 -55
- data/ext/libsass/Readme.md +0 -104
- data/ext/libsass/SECURITY.md +0 -10
- data/ext/libsass/appveyor.yml +0 -91
- data/ext/libsass/configure.ac +0 -138
- data/ext/libsass/contrib/libsass.spec +0 -66
- data/ext/libsass/docs/README.md +0 -20
- data/ext/libsass/docs/api-context-example.md +0 -45
- data/ext/libsass/docs/api-context-internal.md +0 -163
- data/ext/libsass/docs/api-context.md +0 -295
- data/ext/libsass/docs/api-doc.md +0 -215
- data/ext/libsass/docs/api-function-example.md +0 -67
- data/ext/libsass/docs/api-function-internal.md +0 -8
- data/ext/libsass/docs/api-function.md +0 -74
- data/ext/libsass/docs/api-importer-example.md +0 -112
- data/ext/libsass/docs/api-importer-internal.md +0 -20
- data/ext/libsass/docs/api-importer.md +0 -86
- data/ext/libsass/docs/api-value-example.md +0 -55
- data/ext/libsass/docs/api-value-internal.md +0 -76
- data/ext/libsass/docs/api-value.md +0 -154
- data/ext/libsass/docs/build-on-darwin.md +0 -27
- data/ext/libsass/docs/build-on-gentoo.md +0 -55
- data/ext/libsass/docs/build-on-windows.md +0 -139
- data/ext/libsass/docs/build-shared-library.md +0 -35
- data/ext/libsass/docs/build-with-autotools.md +0 -78
- data/ext/libsass/docs/build-with-makefiles.md +0 -68
- data/ext/libsass/docs/build-with-mingw.md +0 -107
- data/ext/libsass/docs/build-with-visual-studio.md +0 -90
- data/ext/libsass/docs/build.md +0 -97
- data/ext/libsass/docs/compatibility-plan.md +0 -48
- data/ext/libsass/docs/contributing.md +0 -17
- data/ext/libsass/docs/custom-functions-internal.md +0 -122
- data/ext/libsass/docs/dev-ast-memory.md +0 -223
- data/ext/libsass/docs/implementations.md +0 -56
- data/ext/libsass/docs/plugins.md +0 -47
- data/ext/libsass/docs/setup-environment.md +0 -68
- data/ext/libsass/docs/source-map-internals.md +0 -51
- data/ext/libsass/docs/trace.md +0 -26
- data/ext/libsass/docs/triage.md +0 -17
- data/ext/libsass/docs/unicode.md +0 -39
- data/ext/libsass/extconf.rb +0 -6
- data/ext/libsass/include/sass/version.h.in +0 -12
- data/ext/libsass/m4/.gitkeep +0 -0
- data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
- data/ext/libsass/res/resource.rc +0 -35
- data/ext/libsass/script/bootstrap +0 -13
- data/ext/libsass/script/branding +0 -10
- data/ext/libsass/script/ci-build-libsass +0 -134
- data/ext/libsass/script/ci-build-plugin +0 -62
- data/ext/libsass/script/ci-install-compiler +0 -6
- data/ext/libsass/script/ci-install-deps +0 -20
- data/ext/libsass/script/ci-report-coverage +0 -42
- data/ext/libsass/script/spec +0 -5
- data/ext/libsass/script/tap-driver +0 -652
- data/ext/libsass/script/tap-runner +0 -1
- data/ext/libsass/script/test-leaks.pl +0 -103
- data/ext/libsass/src/GNUmakefile.am +0 -54
- data/ext/libsass/src/extend.cpp +0 -2130
- data/ext/libsass/src/extend.hpp +0 -86
- data/ext/libsass/src/functions.cpp +0 -2234
- data/ext/libsass/src/functions.hpp +0 -198
- data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
- data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
- data/ext/libsass/src/node.cpp +0 -319
- data/ext/libsass/src/node.hpp +0 -118
- data/ext/libsass/src/paths.hpp +0 -71
- data/ext/libsass/src/sass_util.cpp +0 -149
- data/ext/libsass/src/sass_util.hpp +0 -256
- data/ext/libsass/src/subset_map.cpp +0 -55
- data/ext/libsass/src/subset_map.hpp +0 -76
- data/ext/libsass/src/support/libsass.pc.in +0 -11
- data/ext/libsass/src/to_c.hpp +0 -39
- data/ext/libsass/test/test_node.cpp +0 -94
- data/ext/libsass/test/test_paths.cpp +0 -28
- data/ext/libsass/test/test_selector_difference.cpp +0 -25
- data/ext/libsass/test/test_specificity.cpp +0 -25
- data/ext/libsass/test/test_subset_map.cpp +0 -472
- data/ext/libsass/test/test_superselector.cpp +0 -69
- data/ext/libsass/test/test_unification.cpp +0 -31
- data/ext/libsass/version.sh +0 -10
- data/ext/libsass/win/libsass.sln +0 -39
- data/ext/libsass/win/libsass.sln.DotSettings +0 -9
- data/ext/libsass/win/libsass.targets +0 -118
- data/ext/libsass/win/libsass.vcxproj +0 -188
- data/ext/libsass/win/libsass.vcxproj.filters +0 -357
- data/lib/sassc/native/lib_c.rb +0 -21
- data/lib/tasks/libsass.rb +0 -33
data/ext/libsass/src/parser.hpp
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
#ifndef SASS_PARSER_H
|
|
2
2
|
#define SASS_PARSER_H
|
|
3
3
|
|
|
4
|
+
// sass.hpp must go before all system headers to get the
|
|
5
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
6
|
+
#include "sass.hpp"
|
|
7
|
+
|
|
4
8
|
#include <string>
|
|
5
9
|
#include <vector>
|
|
6
10
|
|
|
@@ -9,6 +13,7 @@
|
|
|
9
13
|
#include "context.hpp"
|
|
10
14
|
#include "position.hpp"
|
|
11
15
|
#include "prelexer.hpp"
|
|
16
|
+
#include "source.hpp"
|
|
12
17
|
|
|
13
18
|
#ifndef MAX_NESTING
|
|
14
19
|
// Note that this limit is not an exact science
|
|
@@ -30,41 +35,31 @@ struct Lookahead {
|
|
|
30
35
|
|
|
31
36
|
namespace Sass {
|
|
32
37
|
|
|
33
|
-
class Parser : public
|
|
38
|
+
class Parser : public SourceSpan {
|
|
34
39
|
public:
|
|
35
40
|
|
|
36
41
|
enum Scope { Root, Mixin, Function, Media, Control, Properties, Rules, AtRoot };
|
|
37
42
|
|
|
38
43
|
Context& ctx;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const char*
|
|
44
|
+
sass::vector<Block_Obj> block_stack;
|
|
45
|
+
sass::vector<Scope> stack;
|
|
46
|
+
SourceDataObj source;
|
|
47
|
+
const char* begin;
|
|
43
48
|
const char* position;
|
|
44
49
|
const char* end;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
Offset before_token;
|
|
51
|
+
Offset after_token;
|
|
52
|
+
SourceSpan pstate;
|
|
48
53
|
Backtraces traces;
|
|
49
54
|
size_t indentation;
|
|
50
55
|
size_t nestings;
|
|
51
|
-
|
|
56
|
+
bool allow_parent;
|
|
52
57
|
Token lexed;
|
|
53
58
|
|
|
54
|
-
Parser(Context& ctx,
|
|
55
|
-
: ParserState(pstate), ctx(ctx), block_stack(), stack(0), last_media_block(),
|
|
56
|
-
source(0), position(0), end(0), before_token(pstate), after_token(pstate),
|
|
57
|
-
pstate(pstate), traces(traces), indentation(0), nestings(0)
|
|
58
|
-
{
|
|
59
|
-
stack.push_back(Scope::Root);
|
|
60
|
-
}
|
|
59
|
+
Parser(SourceData* source, Context& ctx, Backtraces, bool allow_parent = true);
|
|
61
60
|
|
|
62
|
-
// static Parser from_string(const std::string& src, Context& ctx, ParserState pstate = ParserState("[STRING]"));
|
|
63
|
-
static Parser from_c_str(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[CSTRING]"), const char* source = 0);
|
|
64
|
-
static Parser from_c_str(const char* beg, const char* end, Context& ctx, Backtraces, ParserState pstate = ParserState("[CSTRING]"), const char* source = 0);
|
|
65
|
-
static Parser from_token(Token t, Context& ctx, Backtraces, ParserState pstate = ParserState("[TOKEN]"), const char* source = 0);
|
|
66
61
|
// special static parsers to convert strings into certain selectors
|
|
67
|
-
static
|
|
62
|
+
static SelectorListObj parse_selector(SourceData* source, Context& ctx, Backtraces, bool allow_parent = true);
|
|
68
63
|
|
|
69
64
|
#ifdef __clang__
|
|
70
65
|
|
|
@@ -80,7 +75,7 @@ namespace Sass {
|
|
|
80
75
|
|
|
81
76
|
|
|
82
77
|
// skip current token and next whitespace
|
|
83
|
-
// moves
|
|
78
|
+
// moves SourceSpan right before next token
|
|
84
79
|
void advanceToNextToken();
|
|
85
80
|
|
|
86
81
|
bool peek_newline(const char* start = 0);
|
|
@@ -184,8 +179,8 @@ namespace Sass {
|
|
|
184
179
|
// update after_token position for current token
|
|
185
180
|
after_token.add(it_before_token, it_after_token);
|
|
186
181
|
|
|
187
|
-
// ToDo: could probably do this
|
|
188
|
-
pstate =
|
|
182
|
+
// ToDo: could probably do this incremental on original object (API wants offset?)
|
|
183
|
+
pstate = SourceSpan(source, before_token, after_token - before_token);
|
|
189
184
|
|
|
190
185
|
// advance internal char iterator
|
|
191
186
|
return position = it_after_token;
|
|
@@ -202,9 +197,9 @@ namespace Sass {
|
|
|
202
197
|
Token prev = lexed;
|
|
203
198
|
// store previous pointer
|
|
204
199
|
const char* oldpos = position;
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
200
|
+
Offset bt = before_token;
|
|
201
|
+
Offset at = after_token;
|
|
202
|
+
SourceSpan op = pstate;
|
|
208
203
|
// throw away comments
|
|
209
204
|
// update srcmap position
|
|
210
205
|
lex < Prelexer::css_comments >();
|
|
@@ -236,13 +231,12 @@ namespace Sass {
|
|
|
236
231
|
|
|
237
232
|
#endif
|
|
238
233
|
|
|
239
|
-
void error(
|
|
240
|
-
void error(std::string msg, Position pos);
|
|
234
|
+
void error(sass::string msg);
|
|
241
235
|
// generate message with given and expected sample
|
|
242
236
|
// text before and in the middle are configurable
|
|
243
|
-
void css_error(const
|
|
244
|
-
const
|
|
245
|
-
const
|
|
237
|
+
void css_error(const sass::string& msg,
|
|
238
|
+
const sass::string& prefix = " after ",
|
|
239
|
+
const sass::string& middle = ", was: ",
|
|
246
240
|
const bool trim = true);
|
|
247
241
|
void read_bom();
|
|
248
242
|
|
|
@@ -255,115 +249,117 @@ namespace Sass {
|
|
|
255
249
|
Arguments_Obj parse_arguments();
|
|
256
250
|
Argument_Obj parse_argument();
|
|
257
251
|
Assignment_Obj parse_assignment();
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
252
|
+
StyleRuleObj parse_ruleset(Lookahead lookahead);
|
|
253
|
+
SelectorListObj parseSelectorList(bool chroot);
|
|
254
|
+
ComplexSelectorObj parseComplexSelector(bool chroot);
|
|
261
255
|
Selector_Schema_Obj parse_selector_schema(const char* end_of_selector, bool chroot);
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
256
|
+
CompoundSelectorObj parseCompoundSelector();
|
|
257
|
+
SimpleSelectorObj parse_simple_selector();
|
|
258
|
+
PseudoSelectorObj parse_negated_selector2();
|
|
259
|
+
Expression* parse_binominal();
|
|
260
|
+
SimpleSelectorObj parse_pseudo_selector();
|
|
261
|
+
AttributeSelectorObj parse_attribute_selector();
|
|
267
262
|
Block_Obj parse_block(bool is_root = false);
|
|
268
263
|
Block_Obj parse_css_block(bool is_root = false);
|
|
269
264
|
bool parse_block_nodes(bool is_root = false);
|
|
270
265
|
bool parse_block_node(bool is_root = false);
|
|
271
266
|
|
|
272
|
-
bool parse_number_prefix();
|
|
273
267
|
Declaration_Obj parse_declaration();
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
268
|
+
ExpressionObj parse_map();
|
|
269
|
+
ExpressionObj parse_bracket_list();
|
|
270
|
+
ExpressionObj parse_list(bool delayed = false);
|
|
271
|
+
ExpressionObj parse_comma_list(bool delayed = false);
|
|
272
|
+
ExpressionObj parse_space_list();
|
|
273
|
+
ExpressionObj parse_disjunction();
|
|
274
|
+
ExpressionObj parse_conjunction();
|
|
275
|
+
ExpressionObj parse_relation();
|
|
276
|
+
ExpressionObj parse_expression();
|
|
277
|
+
ExpressionObj parse_operators();
|
|
278
|
+
ExpressionObj parse_factor();
|
|
279
|
+
ExpressionObj parse_value();
|
|
286
280
|
Function_Call_Obj parse_calc_function();
|
|
287
281
|
Function_Call_Obj parse_function_call();
|
|
288
|
-
|
|
282
|
+
Function_Call_Obj parse_function_call_schema();
|
|
289
283
|
String_Obj parse_url_function_string();
|
|
290
284
|
String_Obj parse_url_function_argument();
|
|
291
285
|
String_Obj parse_interpolated_chunk(Token, bool constant = false, bool css = true);
|
|
292
286
|
String_Obj parse_string();
|
|
293
|
-
|
|
294
|
-
String_Schema_Obj parse_css_variable_value(
|
|
295
|
-
String_Schema_Obj parse_css_variable_value_token(bool top_level = true);
|
|
287
|
+
ValueObj parse_static_value();
|
|
288
|
+
String_Schema_Obj parse_css_variable_value();
|
|
296
289
|
String_Obj parse_ie_property();
|
|
297
290
|
String_Obj parse_ie_keyword_arg();
|
|
298
291
|
String_Schema_Obj parse_value_schema(const char* stop);
|
|
299
292
|
String_Obj parse_identifier_schema();
|
|
300
293
|
If_Obj parse_if_directive(bool else_if = false);
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
294
|
+
ForRuleObj parse_for_directive();
|
|
295
|
+
EachRuleObj parse_each_directive();
|
|
296
|
+
WhileRuleObj parse_while_directive();
|
|
297
|
+
MediaRule_Obj parseMediaRule();
|
|
298
|
+
sass::vector<CssMediaQuery_Obj> parseCssMediaQueries();
|
|
299
|
+
sass::string parseIdentifier();
|
|
300
|
+
CssMediaQuery_Obj parseCssMediaQuery();
|
|
304
301
|
Return_Obj parse_return_directive();
|
|
305
302
|
Content_Obj parse_content_directive();
|
|
306
303
|
void parse_charset_directive();
|
|
307
|
-
Media_Block_Obj parse_media_block();
|
|
308
304
|
List_Obj parse_media_queries();
|
|
309
305
|
Media_Query_Obj parse_media_query();
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
306
|
+
Media_Query_ExpressionObj parse_media_expression();
|
|
307
|
+
SupportsRuleObj parse_supports_directive();
|
|
308
|
+
SupportsConditionObj parse_supports_condition(bool top_level);
|
|
309
|
+
SupportsConditionObj parse_supports_negation();
|
|
310
|
+
SupportsConditionObj parse_supports_operator(bool top_level);
|
|
311
|
+
SupportsConditionObj parse_supports_interpolation();
|
|
312
|
+
SupportsConditionObj parse_supports_declaration();
|
|
313
|
+
SupportsConditionObj parse_supports_condition_in_parens(bool parens_required);
|
|
314
|
+
AtRootRuleObj parse_at_root_block();
|
|
319
315
|
At_Root_Query_Obj parse_at_root_query();
|
|
320
316
|
String_Schema_Obj parse_almost_any_value();
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
317
|
+
AtRuleObj parse_directive();
|
|
318
|
+
WarningRuleObj parse_warning();
|
|
319
|
+
ErrorRuleObj parse_error();
|
|
320
|
+
DebugRuleObj parse_debug();
|
|
321
|
+
|
|
322
|
+
Value* color_or_string(const sass::string& lexed) const;
|
|
327
323
|
|
|
328
324
|
// be more like ruby sass
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
325
|
+
ExpressionObj lex_almost_any_value_token();
|
|
326
|
+
ExpressionObj lex_almost_any_value_chars();
|
|
327
|
+
ExpressionObj lex_interp_string();
|
|
328
|
+
ExpressionObj lex_interp_uri();
|
|
329
|
+
ExpressionObj lex_interpolation();
|
|
334
330
|
|
|
335
331
|
// these will throw errors
|
|
336
332
|
Token lex_variable();
|
|
337
333
|
Token lex_identifier();
|
|
338
334
|
|
|
339
|
-
void parse_block_comments();
|
|
335
|
+
void parse_block_comments(bool store = true);
|
|
340
336
|
|
|
341
337
|
Lookahead lookahead_for_value(const char* start = 0);
|
|
342
338
|
Lookahead lookahead_for_selector(const char* start = 0);
|
|
343
339
|
Lookahead lookahead_for_include(const char* start = 0);
|
|
344
340
|
|
|
345
|
-
|
|
346
|
-
|
|
341
|
+
ExpressionObj fold_operands(ExpressionObj base, sass::vector<ExpressionObj>& operands, Operand op);
|
|
342
|
+
ExpressionObj fold_operands(ExpressionObj base, sass::vector<ExpressionObj>& operands, sass::vector<Operand>& ops, size_t i = 0);
|
|
347
343
|
|
|
348
|
-
void throw_syntax_error(
|
|
349
|
-
void throw_read_error(
|
|
344
|
+
void throw_syntax_error(sass::string message, size_t ln = 0);
|
|
345
|
+
void throw_read_error(sass::string message, size_t ln = 0);
|
|
350
346
|
|
|
351
347
|
|
|
352
348
|
template <Prelexer::prelexer open, Prelexer::prelexer close>
|
|
353
|
-
|
|
349
|
+
ExpressionObj lex_interp()
|
|
354
350
|
{
|
|
355
351
|
if (lex < open >(false)) {
|
|
356
352
|
String_Schema_Obj schema = SASS_MEMORY_NEW(String_Schema, pstate);
|
|
357
|
-
// std::cerr << "LEX [[" <<
|
|
353
|
+
// std::cerr << "LEX [[" << sass::string(lexed) << "]]\n";
|
|
358
354
|
schema->append(SASS_MEMORY_NEW(String_Constant, pstate, lexed));
|
|
359
355
|
if (position[0] == '#' && position[1] == '{') {
|
|
360
|
-
|
|
356
|
+
ExpressionObj itpl = lex_interpolation();
|
|
361
357
|
if (!itpl.isNull()) schema->append(itpl);
|
|
362
358
|
while (lex < close >(false)) {
|
|
363
|
-
// std::cerr << "LEX [[" <<
|
|
359
|
+
// std::cerr << "LEX [[" << sass::string(lexed) << "]]\n";
|
|
364
360
|
schema->append(SASS_MEMORY_NEW(String_Constant, pstate, lexed));
|
|
365
361
|
if (position[0] == '#' && position[1] == '{') {
|
|
366
|
-
|
|
362
|
+
ExpressionObj itpl = lex_interpolation();
|
|
367
363
|
if (!itpl.isNull()) schema->append(itpl);
|
|
368
364
|
} else {
|
|
369
365
|
return schema;
|
|
@@ -373,19 +369,19 @@ namespace Sass {
|
|
|
373
369
|
return SASS_MEMORY_NEW(String_Constant, pstate, lexed);
|
|
374
370
|
}
|
|
375
371
|
}
|
|
376
|
-
return
|
|
372
|
+
return {};
|
|
377
373
|
}
|
|
378
374
|
|
|
379
375
|
public:
|
|
380
|
-
static
|
|
381
|
-
static
|
|
382
|
-
static
|
|
383
|
-
static
|
|
376
|
+
static Number* lexed_number(const SourceSpan& pstate, const sass::string& parsed);
|
|
377
|
+
static Number* lexed_dimension(const SourceSpan& pstate, const sass::string& parsed);
|
|
378
|
+
static Number* lexed_percentage(const SourceSpan& pstate, const sass::string& parsed);
|
|
379
|
+
static Value* lexed_hex_color(const SourceSpan& pstate, const sass::string& parsed);
|
|
384
380
|
private:
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
381
|
+
Number* lexed_number(const sass::string& parsed) { return lexed_number(pstate, parsed); };
|
|
382
|
+
Number* lexed_dimension(const sass::string& parsed) { return lexed_dimension(pstate, parsed); };
|
|
383
|
+
Number* lexed_percentage(const sass::string& parsed) { return lexed_percentage(pstate, parsed); };
|
|
384
|
+
Value* lexed_hex_color(const sass::string& parsed) { return lexed_hex_color(pstate, parsed); };
|
|
389
385
|
|
|
390
386
|
static const char* re_attr_sensitive_close(const char* src);
|
|
391
387
|
static const char* re_attr_insensitive_close(const char* src);
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
3
|
+
#include "sass.hpp"
|
|
4
|
+
|
|
5
|
+
#include "parser.hpp"
|
|
6
|
+
|
|
7
|
+
namespace Sass {
|
|
8
|
+
|
|
9
|
+
using namespace Prelexer;
|
|
10
|
+
using namespace Constants;
|
|
11
|
+
|
|
12
|
+
ComplexSelectorObj Parser::parseComplexSelector(bool chroot)
|
|
13
|
+
{
|
|
14
|
+
|
|
15
|
+
NESTING_GUARD(nestings);
|
|
16
|
+
|
|
17
|
+
lex < block_comment >();
|
|
18
|
+
advanceToNextToken();
|
|
19
|
+
|
|
20
|
+
ComplexSelectorObj sel = SASS_MEMORY_NEW(ComplexSelector, pstate);
|
|
21
|
+
|
|
22
|
+
if (peek < end_of_file >()) return sel;
|
|
23
|
+
|
|
24
|
+
while (true) {
|
|
25
|
+
|
|
26
|
+
lex < block_comment >();
|
|
27
|
+
advanceToNextToken();
|
|
28
|
+
|
|
29
|
+
// check for child (+) combinator
|
|
30
|
+
if (lex < exactly < selector_combinator_child > >()) {
|
|
31
|
+
sel->append(SASS_MEMORY_NEW(SelectorCombinator, pstate, SelectorCombinator::CHILD, peek_newline()));
|
|
32
|
+
}
|
|
33
|
+
// check for general sibling (~) combinator
|
|
34
|
+
else if (lex < exactly < selector_combinator_general > >()) {
|
|
35
|
+
sel->append(SASS_MEMORY_NEW(SelectorCombinator, pstate, SelectorCombinator::GENERAL, peek_newline()));
|
|
36
|
+
}
|
|
37
|
+
// check for adjecant sibling (+) combinator
|
|
38
|
+
else if (lex < exactly < selector_combinator_adjacent > >()) {
|
|
39
|
+
sel->append(SASS_MEMORY_NEW(SelectorCombinator, pstate, SelectorCombinator::ADJACENT, peek_newline()));
|
|
40
|
+
}
|
|
41
|
+
// check if we can parse a compound selector
|
|
42
|
+
else if (CompoundSelectorObj compound = parseCompoundSelector()) {
|
|
43
|
+
sel->append(compound);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (sel->empty()) return {};
|
|
51
|
+
|
|
52
|
+
// check if we parsed any parent references
|
|
53
|
+
sel->chroots(sel->has_real_parent_ref() || chroot);
|
|
54
|
+
|
|
55
|
+
sel->update_pstate(pstate);
|
|
56
|
+
|
|
57
|
+
return sel;
|
|
58
|
+
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
SelectorListObj Parser::parseSelectorList(bool chroot)
|
|
62
|
+
{
|
|
63
|
+
|
|
64
|
+
bool reloop;
|
|
65
|
+
bool had_linefeed = false;
|
|
66
|
+
NESTING_GUARD(nestings);
|
|
67
|
+
SelectorListObj list = SASS_MEMORY_NEW(SelectorList, pstate);
|
|
68
|
+
|
|
69
|
+
if (peek_css< alternatives < end_of_file, exactly <'{'>, exactly <','> > >()) {
|
|
70
|
+
css_error("Invalid CSS", " after ", ": expected selector, was ");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
do {
|
|
74
|
+
reloop = false;
|
|
75
|
+
|
|
76
|
+
had_linefeed = had_linefeed || peek_newline();
|
|
77
|
+
|
|
78
|
+
if (peek_css< alternatives < class_char < selector_list_delims > > >())
|
|
79
|
+
break; // in case there are superfluous commas at the end
|
|
80
|
+
|
|
81
|
+
// now parse the complex selector
|
|
82
|
+
ComplexSelectorObj complex = parseComplexSelector(chroot);
|
|
83
|
+
if (complex.isNull()) return list.detach();
|
|
84
|
+
complex->hasPreLineFeed(had_linefeed);
|
|
85
|
+
|
|
86
|
+
had_linefeed = false;
|
|
87
|
+
|
|
88
|
+
while (peek_css< exactly<','> >())
|
|
89
|
+
{
|
|
90
|
+
lex< css_comments >(false);
|
|
91
|
+
// consume everything up and including the comma separator
|
|
92
|
+
reloop = lex< exactly<','> >() != 0;
|
|
93
|
+
// remember line break (also between some commas)
|
|
94
|
+
had_linefeed = had_linefeed || peek_newline();
|
|
95
|
+
// remember line break (also between some commas)
|
|
96
|
+
}
|
|
97
|
+
list->append(complex);
|
|
98
|
+
|
|
99
|
+
} while (reloop);
|
|
100
|
+
|
|
101
|
+
while (lex_css< kwd_optional >()) {
|
|
102
|
+
list->is_optional(true);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// update for end position
|
|
106
|
+
list->update_pstate(pstate);
|
|
107
|
+
|
|
108
|
+
return list.detach();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// parse one compound selector, which is basically
|
|
112
|
+
// a list of simple selectors (directly adjacent)
|
|
113
|
+
// lex them exactly (without skipping white-space)
|
|
114
|
+
CompoundSelectorObj Parser::parseCompoundSelector()
|
|
115
|
+
{
|
|
116
|
+
// init an empty compound selector wrapper
|
|
117
|
+
CompoundSelectorObj seq = SASS_MEMORY_NEW(CompoundSelector, pstate);
|
|
118
|
+
|
|
119
|
+
// skip initial white-space
|
|
120
|
+
lex < block_comment >();
|
|
121
|
+
advanceToNextToken();
|
|
122
|
+
|
|
123
|
+
if (lex< exactly<'&'> >(false))
|
|
124
|
+
{
|
|
125
|
+
// ToDo: check the conditions and try to simplify flag passing
|
|
126
|
+
if (!allow_parent) error("Parent selectors aren't allowed here.");
|
|
127
|
+
// Create and append a new parent selector object
|
|
128
|
+
seq->hasRealParent(true);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// parse list
|
|
132
|
+
while (true)
|
|
133
|
+
{
|
|
134
|
+
// remove all block comments
|
|
135
|
+
// leaves trailing white-space
|
|
136
|
+
lex < block_comment >();
|
|
137
|
+
// parse parent selector
|
|
138
|
+
if (lex< exactly<'&'> >(false))
|
|
139
|
+
{
|
|
140
|
+
// parent selector only allowed at start
|
|
141
|
+
// upcoming Sass may allow also trailing
|
|
142
|
+
SourceSpan state(pstate);
|
|
143
|
+
sass::string found("&");
|
|
144
|
+
if (lex < identifier >()) {
|
|
145
|
+
found += sass::string(lexed);
|
|
146
|
+
}
|
|
147
|
+
sass::string sel(seq->hasRealParent() ? "&" : "");
|
|
148
|
+
if (!seq->empty()) { sel = seq->last()->to_string({ NESTED, 5 }); }
|
|
149
|
+
// ToDo: parser should throw parser exceptions
|
|
150
|
+
error("Invalid CSS after \"" + sel + "\": expected \"{\", was \"" + found + "\"\n\n"
|
|
151
|
+
"\"" + found + "\" may only be used at the beginning of a compound selector.");
|
|
152
|
+
}
|
|
153
|
+
// parse functional
|
|
154
|
+
else if (match < re_functional >())
|
|
155
|
+
{
|
|
156
|
+
seq->append(parse_simple_selector());
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// parse type selector
|
|
160
|
+
else if (lex< re_type_selector >(false))
|
|
161
|
+
{
|
|
162
|
+
seq->append(SASS_MEMORY_NEW(TypeSelector, pstate, lexed));
|
|
163
|
+
}
|
|
164
|
+
// peek for abort conditions
|
|
165
|
+
else if (peek< spaces >()) break;
|
|
166
|
+
else if (peek< end_of_file >()) { break; }
|
|
167
|
+
else if (peek_css < class_char < selector_combinator_ops > >()) break;
|
|
168
|
+
else if (peek_css < class_char < complex_selector_delims > >()) break;
|
|
169
|
+
// otherwise parse another simple selector
|
|
170
|
+
else {
|
|
171
|
+
SimpleSelectorObj sel = parse_simple_selector();
|
|
172
|
+
if (!sel) return {};
|
|
173
|
+
seq->append(sel);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// EO while true
|
|
177
|
+
|
|
178
|
+
if (seq && !peek_css<alternatives<end_of_file,exactly<'{'>>>()) {
|
|
179
|
+
seq->hasPostLineBreak(peek_newline());
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// We may have set hasRealParent
|
|
183
|
+
if (seq && seq->empty() && !seq->hasRealParent()) return {};
|
|
184
|
+
|
|
185
|
+
return seq;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
}
|