sassc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +24 -0
  8. data/Rakefile +21 -0
  9. data/ext/libsass/.editorconfig +15 -0
  10. data/ext/libsass/.gitattributes +2 -0
  11. data/ext/libsass/.gitignore +61 -0
  12. data/ext/libsass/.travis.yml +38 -0
  13. data/ext/libsass/COPYING +25 -0
  14. data/ext/libsass/INSTALL +1 -0
  15. data/ext/libsass/LICENSE +25 -0
  16. data/ext/libsass/Makefile +223 -0
  17. data/ext/libsass/Makefile.am +145 -0
  18. data/ext/libsass/Readme.md +93 -0
  19. data/ext/libsass/appveyor.yml +76 -0
  20. data/ext/libsass/ast.cpp +581 -0
  21. data/ext/libsass/ast.hpp +1949 -0
  22. data/ext/libsass/ast_def_macros.hpp +16 -0
  23. data/ext/libsass/ast_factory.hpp +87 -0
  24. data/ext/libsass/ast_fwd_decl.hpp +72 -0
  25. data/ext/libsass/b64/cencode.h +32 -0
  26. data/ext/libsass/b64/encode.h +77 -0
  27. data/ext/libsass/backtrace.hpp +81 -0
  28. data/ext/libsass/base64vlq.cpp +43 -0
  29. data/ext/libsass/base64vlq.hpp +28 -0
  30. data/ext/libsass/bind.cpp +187 -0
  31. data/ext/libsass/bind.hpp +18 -0
  32. data/ext/libsass/cencode.c +102 -0
  33. data/ext/libsass/color_names.hpp +324 -0
  34. data/ext/libsass/configure.ac +130 -0
  35. data/ext/libsass/constants.cpp +144 -0
  36. data/ext/libsass/constants.hpp +145 -0
  37. data/ext/libsass/context.cpp +507 -0
  38. data/ext/libsass/context.hpp +150 -0
  39. data/ext/libsass/contextualize.cpp +157 -0
  40. data/ext/libsass/contextualize.hpp +65 -0
  41. data/ext/libsass/copy_c_str.cpp +13 -0
  42. data/ext/libsass/copy_c_str.hpp +5 -0
  43. data/ext/libsass/debug.hpp +39 -0
  44. data/ext/libsass/environment.hpp +75 -0
  45. data/ext/libsass/error_handling.cpp +28 -0
  46. data/ext/libsass/error_handling.hpp +28 -0
  47. data/ext/libsass/eval.cpp +1149 -0
  48. data/ext/libsass/eval.hpp +80 -0
  49. data/ext/libsass/expand.cpp +430 -0
  50. data/ext/libsass/expand.hpp +77 -0
  51. data/ext/libsass/extconf.rb +6 -0
  52. data/ext/libsass/extend.cpp +1962 -0
  53. data/ext/libsass/extend.hpp +50 -0
  54. data/ext/libsass/file.cpp +291 -0
  55. data/ext/libsass/file.hpp +18 -0
  56. data/ext/libsass/functions.cpp +1565 -0
  57. data/ext/libsass/functions.hpp +187 -0
  58. data/ext/libsass/inspect.cpp +727 -0
  59. data/ext/libsass/inspect.hpp +108 -0
  60. data/ext/libsass/json.cpp +1411 -0
  61. data/ext/libsass/json.hpp +117 -0
  62. data/ext/libsass/kwd_arg_macros.hpp +23 -0
  63. data/ext/libsass/m4/.gitkeep +0 -0
  64. data/ext/libsass/mapping.hpp +17 -0
  65. data/ext/libsass/memory_manager.hpp +54 -0
  66. data/ext/libsass/node.cpp +251 -0
  67. data/ext/libsass/node.hpp +122 -0
  68. data/ext/libsass/operation.hpp +153 -0
  69. data/ext/libsass/output_compressed.cpp +401 -0
  70. data/ext/libsass/output_compressed.hpp +95 -0
  71. data/ext/libsass/output_nested.cpp +364 -0
  72. data/ext/libsass/output_nested.hpp +108 -0
  73. data/ext/libsass/parser.cpp +2016 -0
  74. data/ext/libsass/parser.hpp +264 -0
  75. data/ext/libsass/paths.hpp +69 -0
  76. data/ext/libsass/position.hpp +22 -0
  77. data/ext/libsass/posix/getopt.c +562 -0
  78. data/ext/libsass/posix/getopt.h +95 -0
  79. data/ext/libsass/prelexer.cpp +688 -0
  80. data/ext/libsass/prelexer.hpp +513 -0
  81. data/ext/libsass/remove_placeholders.cpp +59 -0
  82. data/ext/libsass/remove_placeholders.hpp +43 -0
  83. data/ext/libsass/res/resource.rc +35 -0
  84. data/ext/libsass/sass.cpp +33 -0
  85. data/ext/libsass/sass.h +60 -0
  86. data/ext/libsass/sass2scss.cpp +834 -0
  87. data/ext/libsass/sass2scss.h +110 -0
  88. data/ext/libsass/sass_context.cpp +709 -0
  89. data/ext/libsass/sass_context.h +120 -0
  90. data/ext/libsass/sass_functions.cpp +137 -0
  91. data/ext/libsass/sass_functions.h +90 -0
  92. data/ext/libsass/sass_interface.cpp +277 -0
  93. data/ext/libsass/sass_interface.h +97 -0
  94. data/ext/libsass/sass_util.cpp +136 -0
  95. data/ext/libsass/sass_util.hpp +259 -0
  96. data/ext/libsass/sass_values.cpp +337 -0
  97. data/ext/libsass/sass_values.h +124 -0
  98. data/ext/libsass/script/bootstrap +10 -0
  99. data/ext/libsass/script/branding +10 -0
  100. data/ext/libsass/script/ci-build-libsass +72 -0
  101. data/ext/libsass/script/ci-install-compiler +4 -0
  102. data/ext/libsass/script/ci-install-deps +19 -0
  103. data/ext/libsass/script/ci-report-coverage +25 -0
  104. data/ext/libsass/script/coveralls-debug +32 -0
  105. data/ext/libsass/script/spec +5 -0
  106. data/ext/libsass/script/tap-driver +652 -0
  107. data/ext/libsass/script/tap-runner +1 -0
  108. data/ext/libsass/source_map.cpp +133 -0
  109. data/ext/libsass/source_map.hpp +46 -0
  110. data/ext/libsass/subset_map.hpp +145 -0
  111. data/ext/libsass/support/libsass.pc.in +11 -0
  112. data/ext/libsass/test-driver +127 -0
  113. data/ext/libsass/test/test_node.cpp +98 -0
  114. data/ext/libsass/test/test_paths.cpp +29 -0
  115. data/ext/libsass/test/test_selector_difference.cpp +28 -0
  116. data/ext/libsass/test/test_specificity.cpp +28 -0
  117. data/ext/libsass/test/test_subset_map.cpp +472 -0
  118. data/ext/libsass/test/test_superselector.cpp +71 -0
  119. data/ext/libsass/test/test_unification.cpp +33 -0
  120. data/ext/libsass/to_c.cpp +61 -0
  121. data/ext/libsass/to_c.hpp +44 -0
  122. data/ext/libsass/to_string.cpp +29 -0
  123. data/ext/libsass/to_string.hpp +32 -0
  124. data/ext/libsass/token.hpp +32 -0
  125. data/ext/libsass/units.cpp +54 -0
  126. data/ext/libsass/units.hpp +10 -0
  127. data/ext/libsass/utf8.h +34 -0
  128. data/ext/libsass/utf8/checked.h +327 -0
  129. data/ext/libsass/utf8/core.h +329 -0
  130. data/ext/libsass/utf8/unchecked.h +228 -0
  131. data/ext/libsass/utf8_string.cpp +102 -0
  132. data/ext/libsass/utf8_string.hpp +36 -0
  133. data/ext/libsass/util.cpp +189 -0
  134. data/ext/libsass/util.hpp +26 -0
  135. data/ext/libsass/win/libsass.filters +291 -0
  136. data/ext/libsass/win/libsass.sln +28 -0
  137. data/ext/libsass/win/libsass.vcxproj +255 -0
  138. data/lib/sassc.rb +6 -0
  139. data/lib/sassc/engine.rb +13 -0
  140. data/lib/sassc/native.rb +44 -0
  141. data/lib/sassc/native/native_context_api.rb +140 -0
  142. data/lib/sassc/native/native_functions_api.rb +41 -0
  143. data/lib/sassc/native/sass_input_style.rb +11 -0
  144. data/lib/sassc/native/sass_output_style.rb +10 -0
  145. data/lib/sassc/native/sass_value.rb +95 -0
  146. data/lib/sassc/native/string_list.rb +8 -0
  147. data/lib/sassc/version.rb +3 -0
  148. data/sassc.gemspec +43 -0
  149. data/test/smoke_test.rb +171 -0
  150. data/test/test_helper.rb +4 -0
  151. 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
+ }