sassc 0.0.1

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.
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
+ }