sassc 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.gitmodules +3 -0
- data/.travis.yml +9 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +24 -0
- data/Rakefile +21 -0
- data/ext/libsass/.editorconfig +15 -0
- data/ext/libsass/.gitattributes +2 -0
- data/ext/libsass/.gitignore +61 -0
- data/ext/libsass/.travis.yml +38 -0
- data/ext/libsass/COPYING +25 -0
- data/ext/libsass/INSTALL +1 -0
- data/ext/libsass/LICENSE +25 -0
- data/ext/libsass/Makefile +223 -0
- data/ext/libsass/Makefile.am +145 -0
- data/ext/libsass/Readme.md +93 -0
- data/ext/libsass/appveyor.yml +76 -0
- data/ext/libsass/ast.cpp +581 -0
- data/ext/libsass/ast.hpp +1949 -0
- data/ext/libsass/ast_def_macros.hpp +16 -0
- data/ext/libsass/ast_factory.hpp +87 -0
- data/ext/libsass/ast_fwd_decl.hpp +72 -0
- data/ext/libsass/b64/cencode.h +32 -0
- data/ext/libsass/b64/encode.h +77 -0
- data/ext/libsass/backtrace.hpp +81 -0
- data/ext/libsass/base64vlq.cpp +43 -0
- data/ext/libsass/base64vlq.hpp +28 -0
- data/ext/libsass/bind.cpp +187 -0
- data/ext/libsass/bind.hpp +18 -0
- data/ext/libsass/cencode.c +102 -0
- data/ext/libsass/color_names.hpp +324 -0
- data/ext/libsass/configure.ac +130 -0
- data/ext/libsass/constants.cpp +144 -0
- data/ext/libsass/constants.hpp +145 -0
- data/ext/libsass/context.cpp +507 -0
- data/ext/libsass/context.hpp +150 -0
- data/ext/libsass/contextualize.cpp +157 -0
- data/ext/libsass/contextualize.hpp +65 -0
- data/ext/libsass/copy_c_str.cpp +13 -0
- data/ext/libsass/copy_c_str.hpp +5 -0
- data/ext/libsass/debug.hpp +39 -0
- data/ext/libsass/environment.hpp +75 -0
- data/ext/libsass/error_handling.cpp +28 -0
- data/ext/libsass/error_handling.hpp +28 -0
- data/ext/libsass/eval.cpp +1149 -0
- data/ext/libsass/eval.hpp +80 -0
- data/ext/libsass/expand.cpp +430 -0
- data/ext/libsass/expand.hpp +77 -0
- data/ext/libsass/extconf.rb +6 -0
- data/ext/libsass/extend.cpp +1962 -0
- data/ext/libsass/extend.hpp +50 -0
- data/ext/libsass/file.cpp +291 -0
- data/ext/libsass/file.hpp +18 -0
- data/ext/libsass/functions.cpp +1565 -0
- data/ext/libsass/functions.hpp +187 -0
- data/ext/libsass/inspect.cpp +727 -0
- data/ext/libsass/inspect.hpp +108 -0
- data/ext/libsass/json.cpp +1411 -0
- data/ext/libsass/json.hpp +117 -0
- data/ext/libsass/kwd_arg_macros.hpp +23 -0
- data/ext/libsass/m4/.gitkeep +0 -0
- data/ext/libsass/mapping.hpp +17 -0
- data/ext/libsass/memory_manager.hpp +54 -0
- data/ext/libsass/node.cpp +251 -0
- data/ext/libsass/node.hpp +122 -0
- data/ext/libsass/operation.hpp +153 -0
- data/ext/libsass/output_compressed.cpp +401 -0
- data/ext/libsass/output_compressed.hpp +95 -0
- data/ext/libsass/output_nested.cpp +364 -0
- data/ext/libsass/output_nested.hpp +108 -0
- data/ext/libsass/parser.cpp +2016 -0
- data/ext/libsass/parser.hpp +264 -0
- data/ext/libsass/paths.hpp +69 -0
- data/ext/libsass/position.hpp +22 -0
- data/ext/libsass/posix/getopt.c +562 -0
- data/ext/libsass/posix/getopt.h +95 -0
- data/ext/libsass/prelexer.cpp +688 -0
- data/ext/libsass/prelexer.hpp +513 -0
- data/ext/libsass/remove_placeholders.cpp +59 -0
- data/ext/libsass/remove_placeholders.hpp +43 -0
- data/ext/libsass/res/resource.rc +35 -0
- data/ext/libsass/sass.cpp +33 -0
- data/ext/libsass/sass.h +60 -0
- data/ext/libsass/sass2scss.cpp +834 -0
- data/ext/libsass/sass2scss.h +110 -0
- data/ext/libsass/sass_context.cpp +709 -0
- data/ext/libsass/sass_context.h +120 -0
- data/ext/libsass/sass_functions.cpp +137 -0
- data/ext/libsass/sass_functions.h +90 -0
- data/ext/libsass/sass_interface.cpp +277 -0
- data/ext/libsass/sass_interface.h +97 -0
- data/ext/libsass/sass_util.cpp +136 -0
- data/ext/libsass/sass_util.hpp +259 -0
- data/ext/libsass/sass_values.cpp +337 -0
- data/ext/libsass/sass_values.h +124 -0
- data/ext/libsass/script/bootstrap +10 -0
- data/ext/libsass/script/branding +10 -0
- data/ext/libsass/script/ci-build-libsass +72 -0
- data/ext/libsass/script/ci-install-compiler +4 -0
- data/ext/libsass/script/ci-install-deps +19 -0
- data/ext/libsass/script/ci-report-coverage +25 -0
- data/ext/libsass/script/coveralls-debug +32 -0
- data/ext/libsass/script/spec +5 -0
- data/ext/libsass/script/tap-driver +652 -0
- data/ext/libsass/script/tap-runner +1 -0
- data/ext/libsass/source_map.cpp +133 -0
- data/ext/libsass/source_map.hpp +46 -0
- data/ext/libsass/subset_map.hpp +145 -0
- data/ext/libsass/support/libsass.pc.in +11 -0
- data/ext/libsass/test-driver +127 -0
- data/ext/libsass/test/test_node.cpp +98 -0
- data/ext/libsass/test/test_paths.cpp +29 -0
- data/ext/libsass/test/test_selector_difference.cpp +28 -0
- data/ext/libsass/test/test_specificity.cpp +28 -0
- data/ext/libsass/test/test_subset_map.cpp +472 -0
- data/ext/libsass/test/test_superselector.cpp +71 -0
- data/ext/libsass/test/test_unification.cpp +33 -0
- data/ext/libsass/to_c.cpp +61 -0
- data/ext/libsass/to_c.hpp +44 -0
- data/ext/libsass/to_string.cpp +29 -0
- data/ext/libsass/to_string.hpp +32 -0
- data/ext/libsass/token.hpp +32 -0
- data/ext/libsass/units.cpp +54 -0
- data/ext/libsass/units.hpp +10 -0
- data/ext/libsass/utf8.h +34 -0
- data/ext/libsass/utf8/checked.h +327 -0
- data/ext/libsass/utf8/core.h +329 -0
- data/ext/libsass/utf8/unchecked.h +228 -0
- data/ext/libsass/utf8_string.cpp +102 -0
- data/ext/libsass/utf8_string.hpp +36 -0
- data/ext/libsass/util.cpp +189 -0
- data/ext/libsass/util.hpp +26 -0
- data/ext/libsass/win/libsass.filters +291 -0
- data/ext/libsass/win/libsass.sln +28 -0
- data/ext/libsass/win/libsass.vcxproj +255 -0
- data/lib/sassc.rb +6 -0
- data/lib/sassc/engine.rb +13 -0
- data/lib/sassc/native.rb +44 -0
- data/lib/sassc/native/native_context_api.rb +140 -0
- data/lib/sassc/native/native_functions_api.rb +41 -0
- data/lib/sassc/native/sass_input_style.rb +11 -0
- data/lib/sassc/native/sass_output_style.rb +10 -0
- data/lib/sassc/native/sass_value.rb +95 -0
- data/lib/sassc/native/string_list.rb +8 -0
- data/lib/sassc/version.rb +3 -0
- data/sassc.gemspec +43 -0
- data/test/smoke_test.rb +171 -0
- data/test/test_helper.rb +4 -0
- metadata +281 -0
@@ -0,0 +1,95 @@
|
|
1
|
+
#ifndef __GETOPT_H__
|
2
|
+
/**
|
3
|
+
* DISCLAIMER
|
4
|
+
* This file has no copyright assigned and is placed in the Public Domain.
|
5
|
+
* This file is a part of the w64 mingw-runtime package.
|
6
|
+
*
|
7
|
+
* The w64 mingw-runtime package and its code is distributed in the hope that it
|
8
|
+
* will be useful but WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESSED OR
|
9
|
+
* IMPLIED ARE HEREBY DISCLAIMED. This includes but is not limited to
|
10
|
+
* warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
11
|
+
*/
|
12
|
+
|
13
|
+
#define __GETOPT_H__
|
14
|
+
|
15
|
+
/* All the headers include this file. */
|
16
|
+
#include <crtdefs.h>
|
17
|
+
|
18
|
+
#ifdef __cplusplus
|
19
|
+
extern "C" {
|
20
|
+
#endif
|
21
|
+
|
22
|
+
extern int optind; /* index of first non-option in argv */
|
23
|
+
extern int optopt; /* single option character, as parsed */
|
24
|
+
extern int opterr; /* flag to enable built-in diagnostics... */
|
25
|
+
/* (user may set to zero, to suppress) */
|
26
|
+
|
27
|
+
extern char *optarg; /* pointer to argument of current option */
|
28
|
+
|
29
|
+
extern int getopt(int nargc, char * const *nargv, const char *options);
|
30
|
+
|
31
|
+
#ifdef _BSD_SOURCE
|
32
|
+
/*
|
33
|
+
* BSD adds the non-standard `optreset' feature, for reinitialisation
|
34
|
+
* of `getopt' parsing. We support this feature, for applications which
|
35
|
+
* proclaim their BSD heritage, before including this header; however,
|
36
|
+
* to maintain portability, developers are advised to avoid it.
|
37
|
+
*/
|
38
|
+
# define optreset __mingw_optreset
|
39
|
+
extern int optreset;
|
40
|
+
#endif
|
41
|
+
#ifdef __cplusplus
|
42
|
+
}
|
43
|
+
#endif
|
44
|
+
/*
|
45
|
+
* POSIX requires the `getopt' API to be specified in `unistd.h';
|
46
|
+
* thus, `unistd.h' includes this header. However, we do not want
|
47
|
+
* to expose the `getopt_long' or `getopt_long_only' APIs, when
|
48
|
+
* included in this manner. Thus, close the standard __GETOPT_H__
|
49
|
+
* declarations block, and open an additional __GETOPT_LONG_H__
|
50
|
+
* specific block, only when *not* __UNISTD_H_SOURCED__, in which
|
51
|
+
* to declare the extended API.
|
52
|
+
*/
|
53
|
+
#endif /* !defined(__GETOPT_H__) */
|
54
|
+
|
55
|
+
#if !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__)
|
56
|
+
#define __GETOPT_LONG_H__
|
57
|
+
|
58
|
+
#ifdef __cplusplus
|
59
|
+
extern "C" {
|
60
|
+
#endif
|
61
|
+
|
62
|
+
struct option /* specification for a long form option... */
|
63
|
+
{
|
64
|
+
const char *name; /* option name, without leading hyphens */
|
65
|
+
int has_arg; /* does it take an argument? */
|
66
|
+
int *flag; /* where to save its status, or NULL */
|
67
|
+
int val; /* its associated status value */
|
68
|
+
};
|
69
|
+
|
70
|
+
enum /* permitted values for its `has_arg' field... */
|
71
|
+
{
|
72
|
+
no_argument = 0, /* option never takes an argument */
|
73
|
+
required_argument, /* option always requires an argument */
|
74
|
+
optional_argument /* option may take an argument */
|
75
|
+
};
|
76
|
+
|
77
|
+
extern int getopt_long(int nargc, char * const *nargv, const char *options,
|
78
|
+
const struct option *long_options, int *idx);
|
79
|
+
extern int getopt_long_only(int nargc, char * const *nargv, const char *options,
|
80
|
+
const struct option *long_options, int *idx);
|
81
|
+
/*
|
82
|
+
* Previous MinGW implementation had...
|
83
|
+
*/
|
84
|
+
#ifndef HAVE_DECL_GETOPT
|
85
|
+
/*
|
86
|
+
* ...for the long form API only; keep this for compatibility.
|
87
|
+
*/
|
88
|
+
# define HAVE_DECL_GETOPT 1
|
89
|
+
#endif
|
90
|
+
|
91
|
+
#ifdef __cplusplus
|
92
|
+
}
|
93
|
+
#endif
|
94
|
+
|
95
|
+
#endif /* !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__) */
|
@@ -0,0 +1,688 @@
|
|
1
|
+
#include <cctype>
|
2
|
+
#include <cstddef>
|
3
|
+
#include <iostream>
|
4
|
+
#include <iomanip>
|
5
|
+
#include "constants.hpp"
|
6
|
+
#include "prelexer.hpp"
|
7
|
+
#include "util.hpp"
|
8
|
+
|
9
|
+
|
10
|
+
namespace Sass {
|
11
|
+
using namespace Constants;
|
12
|
+
|
13
|
+
namespace Prelexer {
|
14
|
+
using std::ptrdiff_t;
|
15
|
+
// Matches zero characters (always succeeds without consuming input).
|
16
|
+
const char* epsilon(char *src) {
|
17
|
+
return src;
|
18
|
+
}
|
19
|
+
// Matches the empty string.
|
20
|
+
const char* empty(char *src) {
|
21
|
+
return *src ? 0 : src;
|
22
|
+
}
|
23
|
+
|
24
|
+
// Match any single character.
|
25
|
+
const char* any_char(const char* src) { return *src ? src+1 : src; }
|
26
|
+
|
27
|
+
// Match a single character satisfying the ctype predicates.
|
28
|
+
const char* space(const char* src) { return std::isspace(*src) ? src+1 : 0; }
|
29
|
+
const char* alpha(const char* src) { return std::isalpha(*src) || !Sass::Util::isAscii(*src) ? src+1 : 0; }
|
30
|
+
const char* digit(const char* src) { return std::isdigit(*src) ? src+1 : 0; }
|
31
|
+
const char* xdigit(const char* src) { return std::isxdigit(*src) ? src+1 : 0; }
|
32
|
+
const char* alnum(const char* src) { return std::isalnum(*src) || !Sass::Util::isAscii(*src) ? src+1 : 0; }
|
33
|
+
const char* punct(const char* src) { return std::ispunct(*src) ? src+1 : 0; }
|
34
|
+
// Match multiple ctype characters.
|
35
|
+
const char* spaces(const char* src) { return one_plus<space>(src); }
|
36
|
+
const char* alphas(const char* src) { return one_plus<alpha>(src); }
|
37
|
+
const char* digits(const char* src) { return one_plus<digit>(src); }
|
38
|
+
const char* xdigits(const char* src) { return one_plus<xdigit>(src); }
|
39
|
+
const char* alnums(const char* src) { return one_plus<alnum>(src); }
|
40
|
+
const char* puncts(const char* src) { return one_plus<punct>(src); }
|
41
|
+
|
42
|
+
// Match a line comment.
|
43
|
+
const char* line_comment(const char* src) { return to_endl<slash_slash>(src); }
|
44
|
+
// Match a line comment prefix.
|
45
|
+
const char* line_comment_prefix(const char* src) { return exactly<slash_slash>(src); }
|
46
|
+
|
47
|
+
|
48
|
+
// Match a block comment.
|
49
|
+
const char* block_comment(const char* src) {
|
50
|
+
return sequence< optional_spaces, delimited_by<slash_star, star_slash, false> >(src);
|
51
|
+
}
|
52
|
+
const char* block_comment_prefix(const char* src) {
|
53
|
+
return exactly<slash_star>(src);
|
54
|
+
}
|
55
|
+
// Match either comment.
|
56
|
+
const char* comment(const char* src) {
|
57
|
+
return alternatives<block_comment, line_comment>(src);
|
58
|
+
}
|
59
|
+
|
60
|
+
const char* newline(const char* src) {
|
61
|
+
return
|
62
|
+
alternatives<
|
63
|
+
exactly<'\n'>,
|
64
|
+
sequence< exactly<'\r'>, exactly<'\n'> >,
|
65
|
+
exactly<'\r'>,
|
66
|
+
exactly<'\f'>
|
67
|
+
>(src);
|
68
|
+
}
|
69
|
+
|
70
|
+
const char* whitespace(const char* src) {
|
71
|
+
return
|
72
|
+
alternatives<
|
73
|
+
newline,
|
74
|
+
exactly<' '>,
|
75
|
+
exactly<'\t'>
|
76
|
+
>(src);
|
77
|
+
}
|
78
|
+
|
79
|
+
const char* escape(const char* src) {
|
80
|
+
return
|
81
|
+
sequence<
|
82
|
+
exactly<'\\'>,
|
83
|
+
any_char
|
84
|
+
>(src);
|
85
|
+
}
|
86
|
+
|
87
|
+
// Match double- and single-quoted strings.
|
88
|
+
const char* double_quoted_string(const char* src) {
|
89
|
+
src = exactly<'"'>(src);
|
90
|
+
if (!src) return 0;
|
91
|
+
const char* p;
|
92
|
+
while (1) {
|
93
|
+
if (!*src) return 0;
|
94
|
+
if((p = escape(src))) {
|
95
|
+
src = p;
|
96
|
+
continue;
|
97
|
+
}
|
98
|
+
else if((p = exactly<'"'>(src))) {
|
99
|
+
return p;
|
100
|
+
}
|
101
|
+
else {
|
102
|
+
++src;
|
103
|
+
}
|
104
|
+
}
|
105
|
+
return 0;
|
106
|
+
}
|
107
|
+
const char* single_quoted_string(const char* src) {
|
108
|
+
src = exactly<'\''>(src);
|
109
|
+
if (!src) return 0;
|
110
|
+
const char* p;
|
111
|
+
while (1) {
|
112
|
+
if (!*src) return 0;
|
113
|
+
if((p = escape(src))) {
|
114
|
+
src = p;
|
115
|
+
continue;
|
116
|
+
}
|
117
|
+
else if((p = exactly<'\''>(src))) {
|
118
|
+
return p;
|
119
|
+
}
|
120
|
+
else {
|
121
|
+
++src;
|
122
|
+
}
|
123
|
+
}
|
124
|
+
return 0;
|
125
|
+
}
|
126
|
+
const char* string_constant(const char* src) {
|
127
|
+
return alternatives<double_quoted_string, single_quoted_string>(src);
|
128
|
+
}
|
129
|
+
// Match interpolants.
|
130
|
+
|
131
|
+
|
132
|
+
const char* interpolant(const char* src) {
|
133
|
+
return delimited_by<hash_lbrace, rbrace, false>(src);
|
134
|
+
}
|
135
|
+
|
136
|
+
// Whitespace handling.
|
137
|
+
const char* optional_spaces(const char* src) { return optional<spaces>(src); }
|
138
|
+
const char* optional_comment(const char* src) { return optional<comment>(src); }
|
139
|
+
const char* spaces_and_comments(const char* src) {
|
140
|
+
return zero_plus< alternatives<spaces, comment> >(src);
|
141
|
+
}
|
142
|
+
const char* no_spaces(const char* src) {
|
143
|
+
return negate< spaces >(src);
|
144
|
+
}
|
145
|
+
|
146
|
+
const char* backslash_something(const char* src) {
|
147
|
+
return sequence< exactly<'\\'>, any_char >(src);
|
148
|
+
}
|
149
|
+
|
150
|
+
// Match CSS identifiers.
|
151
|
+
const char* identifier(const char* src) {
|
152
|
+
return sequence< optional< exactly<'-'> >,
|
153
|
+
alternatives< alpha, exactly<'_'>, backslash_something >,
|
154
|
+
zero_plus< alternatives< alnum,
|
155
|
+
exactly<'-'>,
|
156
|
+
exactly<'_'>,
|
157
|
+
backslash_something > > >(src);
|
158
|
+
}
|
159
|
+
|
160
|
+
const char* identifier_fragment(const char* src) {
|
161
|
+
return one_plus< alternatives< alnum,
|
162
|
+
exactly<'-'>,
|
163
|
+
exactly<'_'>,
|
164
|
+
backslash_something > >(src);
|
165
|
+
}
|
166
|
+
|
167
|
+
// Match CSS selectors.
|
168
|
+
const char* sel_ident(const char* src) {
|
169
|
+
return sequence< optional< alternatives< exactly<'-'>, exactly<'|'> > >,
|
170
|
+
alternatives< alpha, exactly<'_'>, backslash_something, exactly<'|'> >,
|
171
|
+
zero_plus< alternatives< alnum,
|
172
|
+
exactly<'-'>,
|
173
|
+
exactly<'_'>,
|
174
|
+
exactly<'|'>,
|
175
|
+
backslash_something > > >(src);
|
176
|
+
}
|
177
|
+
|
178
|
+
// Match CSS css variables.
|
179
|
+
const char* custom_property_name(const char* src) {
|
180
|
+
return sequence< exactly<'-'>, exactly<'-'>, identifier >(src);
|
181
|
+
}
|
182
|
+
|
183
|
+
// Match interpolant schemas
|
184
|
+
const char* identifier_schema(const char* src) {
|
185
|
+
// follows this pattern: (x*ix*)+ ... well, not quite
|
186
|
+
return sequence< one_plus< sequence< zero_plus< alternatives< identifier, exactly<'-'> > >,
|
187
|
+
interpolant,
|
188
|
+
zero_plus< alternatives< identifier, number, exactly<'-'> > > > >,
|
189
|
+
negate< exactly<'%'> > >(src);
|
190
|
+
}
|
191
|
+
const char* value_schema(const char* src) {
|
192
|
+
// follows this pattern: ([xyz]*i[xyz]*)+
|
193
|
+
return one_plus< sequence< zero_plus< alternatives< identifier, percentage, dimension, hex, number, string_constant > >,
|
194
|
+
interpolant,
|
195
|
+
zero_plus< alternatives< identifier, percentage, dimension, hex, number, string_constant, exactly<'%'> > > > >(src);
|
196
|
+
}
|
197
|
+
const char* filename_schema(const char* src) {
|
198
|
+
return one_plus< sequence< zero_plus< alternatives< identifier, number, exactly<'.'>, exactly<'/'> > >,
|
199
|
+
interpolant,
|
200
|
+
zero_plus< alternatives< identifier, number, exactly<'.'>, exactly<'/'> > > > >(src);
|
201
|
+
}
|
202
|
+
|
203
|
+
const char* filename(const char* src) {
|
204
|
+
return one_plus< alternatives< identifier, number, exactly<'.'> > >(src);
|
205
|
+
}
|
206
|
+
|
207
|
+
// Match CSS '@' keywords.
|
208
|
+
const char* at_keyword(const char* src) {
|
209
|
+
return sequence<exactly<'@'>, identifier>(src);
|
210
|
+
}
|
211
|
+
|
212
|
+
const char* import(const char* src) {
|
213
|
+
return exactly<import_kwd>(src);
|
214
|
+
}
|
215
|
+
|
216
|
+
const char* media(const char* src) {
|
217
|
+
return exactly<media_kwd>(src);
|
218
|
+
}
|
219
|
+
|
220
|
+
const char* supports(const char* src) {
|
221
|
+
return exactly<supports_kwd>(src);
|
222
|
+
}
|
223
|
+
|
224
|
+
const char* keyframes(const char* src) {
|
225
|
+
return sequence< exactly<'@'>, optional< vendor_prefix >, exactly< keyframes_kwd > >(src);
|
226
|
+
}
|
227
|
+
|
228
|
+
const char* vendor_prefix(const char* src) {
|
229
|
+
return alternatives< exactly< vendor_opera_kwd >, exactly< vendor_webkit_kwd >, exactly< vendor_mozilla_kwd >, exactly< vendor_ms_kwd >, exactly< vendor_khtml_kwd > >(src);
|
230
|
+
}
|
231
|
+
|
232
|
+
const char* keyf(const char* src) {
|
233
|
+
return one_plus< alternatives< to, from, percentage > >(src);
|
234
|
+
}
|
235
|
+
|
236
|
+
const char* mixin(const char* src) {
|
237
|
+
return exactly<mixin_kwd>(src);
|
238
|
+
}
|
239
|
+
|
240
|
+
const char* function(const char* src) {
|
241
|
+
return exactly<function_kwd>(src);
|
242
|
+
}
|
243
|
+
|
244
|
+
const char* return_directive(const char* src) {
|
245
|
+
return exactly<return_kwd>(src);
|
246
|
+
}
|
247
|
+
|
248
|
+
const char* include(const char* src) {
|
249
|
+
return exactly<include_kwd>(src);
|
250
|
+
}
|
251
|
+
|
252
|
+
const char* content(const char* src) {
|
253
|
+
return exactly<content_kwd>(src);
|
254
|
+
}
|
255
|
+
|
256
|
+
const char* extend(const char* src) {
|
257
|
+
return exactly<extend_kwd>(src);
|
258
|
+
}
|
259
|
+
|
260
|
+
|
261
|
+
const char* if_directive(const char* src) {
|
262
|
+
return exactly<if_kwd>(src);
|
263
|
+
}
|
264
|
+
|
265
|
+
const char* else_directive(const char* src) {
|
266
|
+
return exactly<else_kwd>(src);
|
267
|
+
}
|
268
|
+
const char* elseif_directive(const char* src) {
|
269
|
+
return sequence< else_directive,
|
270
|
+
spaces_and_comments,
|
271
|
+
exactly< if_after_else_kwd > >(src);
|
272
|
+
}
|
273
|
+
|
274
|
+
const char* for_directive(const char* src) {
|
275
|
+
return exactly<for_kwd>(src);
|
276
|
+
}
|
277
|
+
|
278
|
+
const char* from(const char* src) {
|
279
|
+
return exactly<from_kwd>(src);
|
280
|
+
}
|
281
|
+
|
282
|
+
const char* to(const char* src) {
|
283
|
+
return exactly<to_kwd>(src);
|
284
|
+
}
|
285
|
+
|
286
|
+
const char* through(const char* src) {
|
287
|
+
return exactly<through_kwd>(src);
|
288
|
+
}
|
289
|
+
|
290
|
+
const char* each_directive(const char* src) {
|
291
|
+
return exactly<each_kwd>(src);
|
292
|
+
}
|
293
|
+
|
294
|
+
const char* in(const char* src) {
|
295
|
+
return exactly<in_kwd>(src);
|
296
|
+
}
|
297
|
+
|
298
|
+
const char* while_directive(const char* src) {
|
299
|
+
return exactly<while_kwd>(src);
|
300
|
+
}
|
301
|
+
|
302
|
+
const char* name(const char* src) {
|
303
|
+
return one_plus< alternatives< alnum,
|
304
|
+
exactly<'-'>,
|
305
|
+
exactly<'_'>,
|
306
|
+
exactly<'\\'> > >(src);
|
307
|
+
}
|
308
|
+
|
309
|
+
const char* warn(const char* src) {
|
310
|
+
return exactly<warn_kwd>(src);
|
311
|
+
}
|
312
|
+
|
313
|
+
const char* err(const char* src) {
|
314
|
+
return exactly<error_kwd>(src);
|
315
|
+
}
|
316
|
+
|
317
|
+
const char* dbg(const char* src) {
|
318
|
+
return exactly<debug_kwd>(src);
|
319
|
+
}
|
320
|
+
|
321
|
+
const char* directive(const char* src) {
|
322
|
+
return sequence< exactly<'@'>, identifier >(src);
|
323
|
+
}
|
324
|
+
|
325
|
+
const char* null(const char* src) {
|
326
|
+
return exactly<null_kwd>(src);
|
327
|
+
}
|
328
|
+
|
329
|
+
// Match CSS type selectors
|
330
|
+
const char* namespace_prefix(const char* src) {
|
331
|
+
return sequence< optional< alternatives< identifier, exactly<'*'> > >,
|
332
|
+
exactly<'|'> >(src);
|
333
|
+
}
|
334
|
+
const char* type_selector(const char* src) {
|
335
|
+
return sequence< optional<namespace_prefix>, identifier>(src);
|
336
|
+
}
|
337
|
+
const char* hyphens_and_identifier(const char* src) {
|
338
|
+
return sequence< zero_plus< exactly< '-' > >, identifier >(src);
|
339
|
+
}
|
340
|
+
const char* hyphens_and_name(const char* src) {
|
341
|
+
return sequence< zero_plus< exactly< '-' > >, name >(src);
|
342
|
+
}
|
343
|
+
const char* universal(const char* src) {
|
344
|
+
return sequence< optional<namespace_prefix>, exactly<'*'> >(src);
|
345
|
+
}
|
346
|
+
// Match CSS id names.
|
347
|
+
const char* id_name(const char* src) {
|
348
|
+
return sequence<exactly<'#'>, name>(src);
|
349
|
+
}
|
350
|
+
// Match CSS class names.
|
351
|
+
const char* class_name(const char* src) {
|
352
|
+
return sequence<exactly<'.'>, identifier>(src);
|
353
|
+
}
|
354
|
+
// Attribute name in an attribute selector.
|
355
|
+
const char* attribute_name(const char* src) {
|
356
|
+
return alternatives< sequence< optional<namespace_prefix>, identifier>,
|
357
|
+
identifier >(src);
|
358
|
+
}
|
359
|
+
// match placeholder selectors
|
360
|
+
const char* placeholder(const char* src) {
|
361
|
+
return sequence<exactly<'%'>, identifier>(src);
|
362
|
+
}
|
363
|
+
// Match CSS numeric constants.
|
364
|
+
|
365
|
+
const char* sign(const char* src) {
|
366
|
+
return class_char<sign_chars>(src);
|
367
|
+
}
|
368
|
+
const char* unsigned_number(const char* src) {
|
369
|
+
return alternatives<sequence< zero_plus<digits>,
|
370
|
+
exactly<'.'>,
|
371
|
+
one_plus<digits> >,
|
372
|
+
digits>(src);
|
373
|
+
}
|
374
|
+
const char* number(const char* src) {
|
375
|
+
return sequence< optional<sign>, unsigned_number>(src);
|
376
|
+
}
|
377
|
+
const char* coefficient(const char* src) {
|
378
|
+
return alternatives< sequence< optional<sign>, digits >,
|
379
|
+
sign >(src);
|
380
|
+
}
|
381
|
+
const char* binomial(const char* src) {
|
382
|
+
return sequence< optional<sign>,
|
383
|
+
optional<digits>,
|
384
|
+
exactly<'n'>, optional_spaces,
|
385
|
+
sign, optional_spaces,
|
386
|
+
digits >(src);
|
387
|
+
}
|
388
|
+
const char* percentage(const char* src) {
|
389
|
+
return sequence< number, exactly<'%'> >(src);
|
390
|
+
}
|
391
|
+
|
392
|
+
const char* em(const char* src) {
|
393
|
+
return sequence< number, exactly<em_kwd> >(src);
|
394
|
+
}
|
395
|
+
const char* dimension(const char* src) {
|
396
|
+
return sequence<number, identifier>(src);
|
397
|
+
}
|
398
|
+
const char* hex(const char* src) {
|
399
|
+
const char* p = sequence< exactly<'#'>, one_plus<xdigit> >(src);
|
400
|
+
ptrdiff_t len = p - src;
|
401
|
+
return (len != 4 && len != 7) ? 0 : p;
|
402
|
+
}
|
403
|
+
const char* hexa(const char* src) {
|
404
|
+
const char* p = sequence< exactly<'#'>, one_plus<xdigit> >(src);
|
405
|
+
ptrdiff_t len = p - src;
|
406
|
+
return (len != 4 && len != 7 && len != 9) ? 0 : p;
|
407
|
+
}
|
408
|
+
|
409
|
+
const char* rgb_prefix(const char* src) {
|
410
|
+
return exactly<rgb_kwd>(src);
|
411
|
+
}
|
412
|
+
// Match CSS uri specifiers.
|
413
|
+
|
414
|
+
const char* uri_prefix(const char* src) {
|
415
|
+
return exactly<url_kwd>(src);
|
416
|
+
}
|
417
|
+
// TODO: rename the following two functions
|
418
|
+
const char* uri(const char* src) {
|
419
|
+
return sequence< exactly<url_kwd>,
|
420
|
+
optional<spaces>,
|
421
|
+
string_constant,
|
422
|
+
optional<spaces>,
|
423
|
+
exactly<')'> >(src);
|
424
|
+
}
|
425
|
+
const char* url_value(const char* src) {
|
426
|
+
return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol
|
427
|
+
one_plus< sequence< zero_plus< exactly<'/'> >, filename > >, // one or more folders and/or trailing filename
|
428
|
+
optional< exactly<'/'> > >(src);
|
429
|
+
}
|
430
|
+
const char* url_schema(const char* src) {
|
431
|
+
return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol
|
432
|
+
filename_schema >(src); // optional trailing slash
|
433
|
+
}
|
434
|
+
// Match CSS "!important" keyword.
|
435
|
+
const char* important(const char* src) {
|
436
|
+
return sequence< exactly<'!'>,
|
437
|
+
spaces_and_comments,
|
438
|
+
exactly<important_kwd> >(src);
|
439
|
+
}
|
440
|
+
// Match CSS "!optional" keyword.
|
441
|
+
const char* optional(const char* src) {
|
442
|
+
return sequence< exactly<'!'>,
|
443
|
+
spaces_and_comments,
|
444
|
+
exactly<optional_kwd> >(src);
|
445
|
+
}
|
446
|
+
// Match Sass "!default" keyword.
|
447
|
+
const char* default_flag(const char* src) {
|
448
|
+
return sequence< exactly<'!'>,
|
449
|
+
spaces_and_comments,
|
450
|
+
exactly<default_kwd> >(src);
|
451
|
+
}
|
452
|
+
// Match Sass "!global" keyword.
|
453
|
+
const char* global_flag(const char* src) {
|
454
|
+
return sequence< exactly<'!'>,
|
455
|
+
spaces_and_comments,
|
456
|
+
exactly<global_kwd> >(src);
|
457
|
+
}
|
458
|
+
// Match CSS pseudo-class/element prefixes.
|
459
|
+
const char* pseudo_prefix(const char* src) {
|
460
|
+
return sequence< exactly<':'>, optional< exactly<':'> > >(src);
|
461
|
+
}
|
462
|
+
// Match CSS function call openers.
|
463
|
+
const char* functional_schema(const char* src) {
|
464
|
+
return sequence< identifier_schema, exactly<'('> >(src);
|
465
|
+
}
|
466
|
+
const char* functional(const char* src) {
|
467
|
+
return sequence< identifier, exactly<'('> >(src);
|
468
|
+
}
|
469
|
+
// Match the CSS negation pseudo-class.
|
470
|
+
const char* pseudo_not(const char* src) {
|
471
|
+
return exactly< pseudo_not_kwd >(src);
|
472
|
+
}
|
473
|
+
// Match CSS 'odd' and 'even' keywords for functional pseudo-classes.
|
474
|
+
const char* even(const char* src) {
|
475
|
+
return exactly<even_kwd>(src);
|
476
|
+
}
|
477
|
+
const char* odd(const char* src) {
|
478
|
+
return exactly<odd_kwd>(src);
|
479
|
+
}
|
480
|
+
// Match CSS attribute-matching operators.
|
481
|
+
const char* exact_match(const char* src) { return exactly<'='>(src); }
|
482
|
+
const char* class_match(const char* src) { return exactly<tilde_equal>(src); }
|
483
|
+
const char* dash_match(const char* src) { return exactly<pipe_equal>(src); }
|
484
|
+
const char* prefix_match(const char* src) { return exactly<caret_equal>(src); }
|
485
|
+
const char* suffix_match(const char* src) { return exactly<dollar_equal>(src); }
|
486
|
+
const char* substring_match(const char* src) { return exactly<star_equal>(src); }
|
487
|
+
// Match CSS combinators.
|
488
|
+
const char* adjacent_to(const char* src) {
|
489
|
+
return sequence< optional_spaces, exactly<'+'> >(src);
|
490
|
+
}
|
491
|
+
const char* precedes(const char* src) {
|
492
|
+
return sequence< optional_spaces, exactly<'~'> >(src);
|
493
|
+
}
|
494
|
+
const char* parent_of(const char* src) {
|
495
|
+
return sequence< optional_spaces, exactly<'>'> >(src);
|
496
|
+
}
|
497
|
+
const char* ancestor_of(const char* src) {
|
498
|
+
return sequence< spaces, negate< exactly<'{'> > >(src);
|
499
|
+
}
|
500
|
+
|
501
|
+
// Match SCSS variable names.
|
502
|
+
const char* variable(const char* src) {
|
503
|
+
return sequence<exactly<'$'>, identifier>(src);
|
504
|
+
}
|
505
|
+
|
506
|
+
// Match Sass boolean keywords.
|
507
|
+
const char* true_val(const char* src) {
|
508
|
+
return exactly<true_kwd>(src);
|
509
|
+
}
|
510
|
+
const char* false_val(const char* src) {
|
511
|
+
return exactly<false_kwd>(src);
|
512
|
+
}
|
513
|
+
const char* and_op(const char* src) {
|
514
|
+
return exactly<and_kwd>(src);
|
515
|
+
}
|
516
|
+
const char* or_op(const char* src) {
|
517
|
+
return exactly<or_kwd>(src);
|
518
|
+
}
|
519
|
+
const char* not_op(const char* src) {
|
520
|
+
return exactly<not_kwd>(src);
|
521
|
+
}
|
522
|
+
const char* eq_op(const char* src) {
|
523
|
+
return exactly<eq>(src);
|
524
|
+
}
|
525
|
+
const char* neq_op(const char* src) {
|
526
|
+
return exactly<neq>(src);
|
527
|
+
}
|
528
|
+
const char* gt_op(const char* src) {
|
529
|
+
return exactly<gt>(src);
|
530
|
+
}
|
531
|
+
const char* gte_op(const char* src) {
|
532
|
+
return exactly<gte>(src);
|
533
|
+
}
|
534
|
+
const char* lt_op(const char* src) {
|
535
|
+
return exactly<lt>(src);
|
536
|
+
}
|
537
|
+
const char* lte_op(const char* src) {
|
538
|
+
return exactly<lte>(src);
|
539
|
+
}
|
540
|
+
|
541
|
+
// match specific IE syntax
|
542
|
+
const char* ie_progid(const char* src) {
|
543
|
+
return sequence <
|
544
|
+
exactly<progid_kwd>,
|
545
|
+
exactly<':'>,
|
546
|
+
alternatives< identifier_schema, identifier >,
|
547
|
+
zero_plus< sequence<
|
548
|
+
exactly<'.'>,
|
549
|
+
alternatives< identifier_schema, identifier >
|
550
|
+
> >,
|
551
|
+
zero_plus < sequence<
|
552
|
+
exactly<'('>,
|
553
|
+
spaces_and_comments,
|
554
|
+
optional < sequence<
|
555
|
+
alternatives< variable, identifier_schema, identifier >,
|
556
|
+
spaces_and_comments,
|
557
|
+
exactly<'='>,
|
558
|
+
spaces_and_comments,
|
559
|
+
alternatives< variable, identifier_schema, identifier, string_constant, number, hexa >,
|
560
|
+
zero_plus< sequence<
|
561
|
+
spaces_and_comments,
|
562
|
+
exactly<','>,
|
563
|
+
spaces_and_comments,
|
564
|
+
sequence<
|
565
|
+
alternatives< variable, identifier_schema, identifier >,
|
566
|
+
spaces_and_comments,
|
567
|
+
exactly<'='>,
|
568
|
+
spaces_and_comments,
|
569
|
+
alternatives< variable, identifier_schema, identifier, string_constant, number, hexa >
|
570
|
+
>
|
571
|
+
> >
|
572
|
+
> >,
|
573
|
+
spaces_and_comments,
|
574
|
+
exactly<')'>,
|
575
|
+
spaces_and_comments
|
576
|
+
> >
|
577
|
+
>(src);
|
578
|
+
}
|
579
|
+
const char* ie_expression(const char* src) {
|
580
|
+
return sequence < exactly<expression_kwd>, delimited_by< '(', ')', true> >(src);
|
581
|
+
}
|
582
|
+
const char* ie_property(const char* src) {
|
583
|
+
return alternatives < ie_expression, ie_progid >(src);
|
584
|
+
}
|
585
|
+
|
586
|
+
// const char* ie_args(const char* src) {
|
587
|
+
// return sequence< alternatives< ie_keyword_arg, value_schema, string_constant, interpolant, number, identifier, delimited_by< '(', ')', true> >,
|
588
|
+
// zero_plus< sequence< spaces_and_comments, exactly<','>, spaces_and_comments, alternatives< ie_keyword_arg, value_schema, string_constant, interpolant, number, identifier, delimited_by<'(', ')', true> > > > >(src);
|
589
|
+
// }
|
590
|
+
|
591
|
+
const char* ie_keyword_arg(const char* src) {
|
592
|
+
return sequence< alternatives< variable, identifier_schema, identifier >, spaces_and_comments, exactly<'='>, spaces_and_comments, alternatives< variable, identifier_schema, identifier, string_constant, number, hexa > >(src);
|
593
|
+
}
|
594
|
+
|
595
|
+
// Path matching functions.
|
596
|
+
const char* folder(const char* src) {
|
597
|
+
return sequence< zero_plus< any_char_except<'/'> >,
|
598
|
+
exactly<'/'> >(src);
|
599
|
+
}
|
600
|
+
const char* folders(const char* src) {
|
601
|
+
return zero_plus< folder >(src);
|
602
|
+
}
|
603
|
+
|
604
|
+
const char* chunk(const char* src) {
|
605
|
+
char inside_str = 0;
|
606
|
+
const char* p = src;
|
607
|
+
size_t depth = 0;
|
608
|
+
while (true) {
|
609
|
+
if (!*p) {
|
610
|
+
return 0;
|
611
|
+
}
|
612
|
+
else if (!inside_str && (*p == '"' || *p == '\'')) {
|
613
|
+
inside_str = *p;
|
614
|
+
}
|
615
|
+
else if (*p == inside_str && *(p-1) != '\\') {
|
616
|
+
inside_str = 0;
|
617
|
+
}
|
618
|
+
else if (*p == '(' && !inside_str) {
|
619
|
+
++depth;
|
620
|
+
}
|
621
|
+
else if (*p == ')' && !inside_str) {
|
622
|
+
if (depth == 0) return p;
|
623
|
+
else --depth;
|
624
|
+
}
|
625
|
+
++p;
|
626
|
+
}
|
627
|
+
// unreachable
|
628
|
+
return 0;
|
629
|
+
}
|
630
|
+
|
631
|
+
// follow the CSS spec more closely and see if this helps us scan URLs correctly
|
632
|
+
const char* NL(const char* src) {
|
633
|
+
return alternatives< exactly<'\n'>,
|
634
|
+
sequence< exactly<'\r'>, exactly<'\n'> >,
|
635
|
+
exactly<'\r'>,
|
636
|
+
exactly<'\f'> >(src);
|
637
|
+
}
|
638
|
+
|
639
|
+
const char* H(const char* src) {
|
640
|
+
return std::isxdigit(*src) ? src+1 : 0;
|
641
|
+
}
|
642
|
+
|
643
|
+
const char* unicode(const char* src) {
|
644
|
+
return sequence< exactly<'\\'>,
|
645
|
+
between<H, 1, 6>,
|
646
|
+
optional< class_char<url_space_chars> > >(src);
|
647
|
+
}
|
648
|
+
|
649
|
+
const char* ESCAPE(const char* src) {
|
650
|
+
return alternatives< unicode, class_char<escape_chars> >(src);
|
651
|
+
}
|
652
|
+
|
653
|
+
const char* url(const char* src) {
|
654
|
+
return chunk(src);
|
655
|
+
}
|
656
|
+
|
657
|
+
const char* static_string(const char* src) {
|
658
|
+
const char* pos = src;
|
659
|
+
const char * s = string_constant(pos);
|
660
|
+
Token t(pos, s);
|
661
|
+
const unsigned int p = count_interval< interpolant >(t.begin, t.end);
|
662
|
+
return (p == 0) ? t.end : 0;
|
663
|
+
}
|
664
|
+
|
665
|
+
const char* static_component(const char* src) {
|
666
|
+
return alternatives< identifier,
|
667
|
+
static_string,
|
668
|
+
hex,
|
669
|
+
number,
|
670
|
+
sequence< exactly<'!'>, exactly<important_kwd> >
|
671
|
+
>(src);
|
672
|
+
}
|
673
|
+
|
674
|
+
const char* static_value(const char* src) {
|
675
|
+
return sequence< static_component,
|
676
|
+
zero_plus < sequence<
|
677
|
+
alternatives<
|
678
|
+
sequence< optional_spaces, exactly<'/'>, optional_spaces >,
|
679
|
+
sequence< optional_spaces, exactly<','>, optional_spaces >,
|
680
|
+
spaces
|
681
|
+
>,
|
682
|
+
static_component
|
683
|
+
> >,
|
684
|
+
alternatives< exactly<';'>, exactly<'}'> >
|
685
|
+
>(src);
|
686
|
+
}
|
687
|
+
}
|
688
|
+
}
|