sassc 0.0.10 → 0.0.11

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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ext/libsass/.gitignore +6 -0
  4. data/ext/libsass/.travis.yml +5 -1
  5. data/ext/libsass/Makefile +12 -3
  6. data/ext/libsass/Makefile.am +16 -28
  7. data/ext/libsass/Readme.md +1 -0
  8. data/ext/libsass/appveyor.yml +1 -2
  9. data/ext/libsass/ast.cpp +9 -0
  10. data/ext/libsass/ast.hpp +152 -55
  11. data/ext/libsass/ast_factory.hpp +2 -0
  12. data/ext/libsass/ast_fwd_decl.hpp +1 -0
  13. data/ext/libsass/backtrace.hpp +2 -2
  14. data/ext/libsass/bind.cpp +15 -13
  15. data/ext/libsass/configure.ac +17 -5
  16. data/ext/libsass/constants.cpp +22 -2
  17. data/ext/libsass/constants.hpp +21 -2
  18. data/ext/libsass/context.cpp +79 -57
  19. data/ext/libsass/context.hpp +23 -9
  20. data/ext/libsass/contextualize.cpp +2 -28
  21. data/ext/libsass/contextualize.hpp +6 -10
  22. data/ext/libsass/contextualize_eval.cpp +93 -0
  23. data/ext/libsass/contextualize_eval.hpp +44 -0
  24. data/ext/libsass/contrib/plugin.cpp +57 -0
  25. data/ext/libsass/cssize.cpp +3 -1
  26. data/ext/libsass/debugger.hpp +242 -83
  27. data/ext/libsass/emitter.cpp +1 -1
  28. data/ext/libsass/emitter.hpp +1 -1
  29. data/ext/libsass/environment.hpp +109 -25
  30. data/ext/libsass/error_handling.cpp +3 -3
  31. data/ext/libsass/error_handling.hpp +0 -1
  32. data/ext/libsass/eval.cpp +145 -61
  33. data/ext/libsass/eval.hpp +9 -1
  34. data/ext/libsass/expand.cpp +134 -60
  35. data/ext/libsass/expand.hpp +5 -2
  36. data/ext/libsass/extend.cpp +7 -5
  37. data/ext/libsass/file.cpp +176 -123
  38. data/ext/libsass/file.hpp +44 -7
  39. data/ext/libsass/functions.cpp +36 -17
  40. data/ext/libsass/functions.hpp +2 -2
  41. data/ext/libsass/inspect.cpp +23 -14
  42. data/ext/libsass/inspect.hpp +1 -0
  43. data/ext/libsass/json.cpp +132 -135
  44. data/ext/libsass/lexer.cpp +133 -0
  45. data/ext/libsass/lexer.hpp +239 -0
  46. data/ext/libsass/listize.cpp +83 -0
  47. data/ext/libsass/listize.hpp +41 -0
  48. data/ext/libsass/operation.hpp +2 -0
  49. data/ext/libsass/output.cpp +5 -6
  50. data/ext/libsass/parser.cpp +426 -388
  51. data/ext/libsass/parser.hpp +97 -109
  52. data/ext/libsass/plugins.cpp +15 -2
  53. data/ext/libsass/plugins.hpp +6 -4
  54. data/ext/libsass/position.cpp +52 -17
  55. data/ext/libsass/position.hpp +19 -17
  56. data/ext/libsass/prelexer.cpp +202 -235
  57. data/ext/libsass/prelexer.hpp +73 -333
  58. data/ext/libsass/sass.cpp +21 -11
  59. data/ext/libsass/sass.h +6 -6
  60. data/ext/libsass/sass_context.cpp +167 -81
  61. data/ext/libsass/sass_context.h +26 -6
  62. data/ext/libsass/sass_functions.cpp +49 -40
  63. data/ext/libsass/sass_functions.h +55 -43
  64. data/ext/libsass/sass_interface.cpp +9 -8
  65. data/ext/libsass/sass_interface.h +3 -3
  66. data/ext/libsass/sass_version.h +8 -0
  67. data/ext/libsass/sass_version.h.in +8 -0
  68. data/ext/libsass/script/ci-build-libsass +3 -3
  69. data/ext/libsass/script/ci-report-coverage +2 -1
  70. data/ext/libsass/source_map.cpp +2 -2
  71. data/ext/libsass/util.cpp +60 -11
  72. data/ext/libsass/util.hpp +6 -1
  73. data/ext/libsass/win/libsass.filters +12 -0
  74. data/ext/libsass/win/libsass.vcxproj +10 -0
  75. data/lib/sassc.rb +3 -1
  76. data/lib/sassc/cache_stores/base.rb +2 -0
  77. data/lib/sassc/dependency.rb +3 -1
  78. data/lib/sassc/engine.rb +31 -16
  79. data/lib/sassc/error.rb +3 -2
  80. data/lib/sassc/functions_handler.rb +54 -0
  81. data/lib/sassc/import_handler.rb +41 -0
  82. data/lib/sassc/importer.rb +4 -31
  83. data/lib/sassc/native.rb +1 -1
  84. data/lib/sassc/native/native_context_api.rb +3 -2
  85. data/lib/sassc/script.rb +0 -51
  86. data/lib/sassc/version.rb +1 -1
  87. data/sassc.gemspec +1 -0
  88. data/test/custom_importer_test.rb +72 -69
  89. data/test/engine_test.rb +53 -54
  90. data/test/functions_test.rb +40 -39
  91. data/test/native_test.rb +145 -149
  92. data/test/output_style_test.rb +98 -0
  93. data/test/test_helper.rb +21 -7
  94. metadata +28 -2
@@ -9,51 +9,34 @@
9
9
 
10
10
 
11
11
  namespace Sass {
12
+ // using namespace Lexer;
12
13
  using namespace Constants;
13
14
 
14
15
  namespace Prelexer {
15
- using std::ptrdiff_t;
16
- // Matches zero characters (always succeeds without consuming input).
17
- /* not used anymore - remove?
18
- const char* epsilon(char *src) {
19
- return src;
20
- }*/
21
- // Matches the empty string.
22
- /* not used anymore - remove?
23
- const char* empty(char *src) {
24
- return *src ? 0 : src;
25
- }*/
26
16
 
27
- // Match any single character.
28
- const char* any_char(const char* src) { return *src ? src+1 : src; }
29
- // Match word boundary (look ahead)
30
- const char* word_boundary(const char* src) { return !*src || isspace(*src) || ispunct(*src) || !Sass::Util::isAscii(*src) ? src : 0 ; }
31
-
32
- // Match a single character satisfying the ctype predicates.
33
- const char* space(const char* src) { return std::isspace(*src) ? src+1 : 0; }
34
- const char* alpha(const char* src) { return std::isalpha(*src) || !Sass::Util::isAscii(*src) ? src+1 : 0; }
35
- const char* digit(const char* src) { return std::isdigit(*src) ? src+1 : 0; }
36
- const char* xdigit(const char* src) { return std::isxdigit(*src) ? src+1 : 0; }
37
- const char* alnum(const char* src) { return std::isalnum(*src) || !Sass::Util::isAscii(*src) ? src+1 : 0; }
38
- const char* punct(const char* src) { return std::ispunct(*src) ? src+1 : 0; }
39
- // Match multiple ctype characters.
40
- const char* spaces(const char* src) { return one_plus<space>(src); }
41
- const char* alphas(const char* src) { return one_plus<alpha>(src); }
42
- const char* digits(const char* src) { return one_plus<digit>(src); }
43
- const char* xdigits(const char* src) { return one_plus<xdigit>(src); }
44
- const char* alnums(const char* src) { return one_plus<alnum>(src); }
45
- const char* puncts(const char* src) { return one_plus<punct>(src); }
46
-
47
- // Match a line comment.
48
- const char* line_comment(const char* src) { return to_endl<slash_slash>(src); }
49
- // Match a line comment prefix.
50
- const char* line_comment_prefix(const char* src) { return exactly<slash_slash>(src); }
51
17
 
18
+ // Match a line comment (/.*?(?=\n|\r\n?|\Z)/.
19
+ const char* line_comment(const char* src)
20
+ {
21
+ return sequence<
22
+ exactly <
23
+ slash_slash
24
+ >,
25
+ non_greedy<
26
+ any_char,
27
+ end_of_line
28
+ >
29
+ >(src);
30
+ }
52
31
 
53
32
  // Match a block comment.
54
- const char* block_comment(const char* src) {
55
- return sequence< optional_spaces, delimited_by<slash_star, star_slash, false> >(src);
33
+ const char* block_comment(const char* src)
34
+ {
35
+ return sequence<
36
+ zero_plus < space >,
37
+ delimited_by<slash_star, star_slash, false> >(src);
56
38
  }
39
+ /* not use anymore - remove?
57
40
  const char* block_comment_prefix(const char* src) {
58
41
  return exactly<slash_star>(src);
59
42
  }
@@ -61,90 +44,70 @@ namespace Sass {
61
44
  const char* comment(const char* src) {
62
45
  return line_comment(src);
63
46
  }
47
+ */
64
48
 
65
- const char* wspaces(const char* src) {
66
- return
67
- alternatives<
68
- exactly<' '>,
69
- exactly<'\t'>
70
- >(src);
71
- }
72
-
73
- /* not used anymore - remove?
74
- const char* newline(const char* src) {
75
- return
76
- alternatives<
77
- exactly<'\n'>,
78
- sequence< exactly<'\r'>, exactly<'\n'> >,
79
- exactly<'\r'>,
80
- exactly<'\f'>
81
- >(src);
82
- }*/
83
-
84
- /* not used anymore - remove?
85
- const char* whitespace(const char* src) {
86
- return spaces(src);
87
- }*/
88
-
89
- /* not used anymore - remove?
90
- const char* escape(const char* src) {
91
- return
92
- sequence<
93
- exactly<'\\'>,
94
- any_char
95
- >(src);
96
- }*/
97
-
98
-
99
- // Whitespace handling.
100
- const char* optional_spaces(const char* src) { return optional<spaces>(src); }
101
- // const char* optional_comment(const char* src) { return optional<comment>(src); }
102
- const char* optional_spaces_and_comments(const char* src) {
49
+ // Match zero plus white-space or line_comments
50
+ const char* optional_css_whitespace(const char* src) {
103
51
  return zero_plus< alternatives<spaces, line_comment> >(src);
104
52
  }
105
- const char* spaces_and_comments(const char* src) {
53
+ const char* css_whitespace(const char* src) {
106
54
  return one_plus< alternatives<spaces, line_comment> >(src);
107
55
  }
108
- const char* no_spaces(const char* src) {
109
- return negate< spaces >(src);
56
+ // Match optional_css_whitepace plus block_comments
57
+ const char* optional_css_comments(const char* src) {
58
+ return zero_plus< alternatives<spaces, line_comment, block_comment> >(src);
59
+ }
60
+ const char* css_comments(const char* src) {
61
+ return one_plus< alternatives<spaces, line_comment, block_comment> >(src);
110
62
  }
111
63
 
112
- const char* backslash_something(const char* src) {
113
- return sequence< exactly<'\\'>, any_char >(src);
64
+ // Match one backslash escaped char /\\./
65
+ const char* escape_seq(const char* src)
66
+ {
67
+ return sequence<
68
+ exactly<'\\'>,
69
+ any_char
70
+ >(src);
114
71
  }
115
72
 
116
- // Match CSS identifiers.
117
- const char* identifier(const char* src) {
118
- return sequence< optional< exactly<'-'> >,
119
- alternatives< alpha, exactly<'_'>, backslash_something >,
120
- zero_plus< alternatives< alnum,
121
- exactly<'-'>,
122
- exactly<'_'>,
123
- backslash_something > > >(src);
73
+ // Match identifier start
74
+ const char* identifier_alpha(const char* src)
75
+ {
76
+ return alternatives<
77
+ alpha,
78
+ unicode,
79
+ exactly<'-'>,
80
+ exactly<'_'>,
81
+ escape_seq
82
+ >(src);
124
83
  }
125
84
 
126
- const char* identifier_fragment(const char* src) {
127
- return one_plus< alternatives< alnum,
128
- exactly<'-'>,
129
- exactly<'_'>,
130
- backslash_something > >(src);
85
+ // Match identifier after start
86
+ const char* identifier_alnum(const char* src)
87
+ {
88
+ return alternatives<
89
+ alnum,
90
+ unicode,
91
+ exactly<'-'>,
92
+ exactly<'_'>,
93
+ escape_seq
94
+ >(src);
131
95
  }
132
96
 
133
- // Match CSS selectors.
134
- /* not used anymore - remove?
135
- const char* sel_ident(const char* src) {
136
- return sequence< optional< alternatives< exactly<'-'>, exactly<'|'> > >,
137
- alternatives< alpha, exactly<'_'>, backslash_something, exactly<'|'> >,
138
- zero_plus< alternatives< alnum,
139
- exactly<'-'>,
140
- exactly<'_'>,
141
- exactly<'|'>,
142
- backslash_something > > >(src);
143
- }*/
97
+ // Match CSS identifiers.
98
+ const char* identifier(const char* src)
99
+ {
100
+ return sequence<
101
+ zero_plus< exactly<'-'> >,
102
+ one_plus < identifier_alpha >,
103
+ zero_plus < identifier_alnum >
104
+ // word_boundary not needed
105
+ >(src);
106
+ }
144
107
 
145
- // Match CSS css variables.
146
- const char* custom_property_name(const char* src) {
147
- return sequence< exactly<'-'>, exactly<'-'>, identifier >(src);
108
+ const char* identifier_alnums(const char* src)
109
+ {
110
+ return one_plus< identifier_alnum >(src);
148
111
  }
149
112
 
150
113
  // Match number prefix ([\+\-]+)
@@ -153,7 +116,7 @@ namespace Sass {
153
116
  exactly < '+' >,
154
117
  sequence <
155
118
  exactly < '-' >,
156
- optional_spaces_and_comments,
119
+ optional_css_whitespace,
157
120
  exactly< '-' >
158
121
  >
159
122
  >(src);
@@ -181,11 +144,11 @@ namespace Sass {
181
144
  zero_plus <
182
145
  alternatives <
183
146
  // skip all escaped chars first
184
- backslash_something,
147
+ escape_seq,
185
148
  // skip interpolants
186
149
  interpolant,
187
150
  // skip non delimiters
188
- any_char_except < '\'' >
151
+ any_char_but < '\'' >
189
152
  >
190
153
  >,
191
154
  exactly <'\''>
@@ -200,11 +163,11 @@ namespace Sass {
200
163
  zero_plus <
201
164
  alternatives <
202
165
  // skip all escaped chars first
203
- backslash_something,
166
+ escape_seq,
204
167
  // skip interpolants
205
168
  interpolant,
206
169
  // skip non delimiters
207
- any_char_except < '"' >
170
+ any_char_but < '"' >
208
171
  >
209
172
  >,
210
173
  exactly <'"'>
@@ -226,125 +189,110 @@ namespace Sass {
226
189
  interpolant,
227
190
  zero_plus< alternatives< identifier, percentage, dimension, hex, number, quoted_string, exactly<'%'> > > > >(src);
228
191
  }
229
- /* not used anymore - remove?
230
- const char* filename_schema(const char* src) {
231
- return one_plus< sequence< zero_plus< alternatives< identifier, number, exactly<'.'>, exactly<'/'> > >,
232
- interpolant,
233
- zero_plus< alternatives< identifier, number, exactly<'.'>, exactly<'/'> > > > >(src);
234
- }*/
235
192
 
193
+ /* not used anymore - remove?
236
194
  const char* filename(const char* src) {
237
195
  return one_plus< alternatives< identifier, number, exactly<'.'> > >(src);
238
196
  }
197
+ */
239
198
 
240
199
  // Match CSS '@' keywords.
241
200
  const char* at_keyword(const char* src) {
242
201
  return sequence<exactly<'@'>, identifier>(src);
243
202
  }
244
203
 
245
- const char* import(const char* src) {
246
- return exactly<import_kwd>(src);
204
+ const char* kwd_sel_deep(const char* src) {
205
+ return word<sel_deep_kwd>(src);
247
206
  }
248
207
 
249
- const char* at_root(const char* src) {
250
- return exactly<at_root_kwd>(src);
208
+ const char* kwd_import(const char* src) {
209
+ return word<import_kwd>(src);
251
210
  }
252
211
 
253
- const char* with_directive(const char* src) {
254
- return exactly<with_kwd>(src);
212
+ const char* kwd_at_root(const char* src) {
213
+ return word<at_root_kwd>(src);
255
214
  }
256
215
 
257
- const char* without_directive(const char* src) {
258
- return exactly<without_kwd>(src);
216
+ const char* kwd_with_directive(const char* src) {
217
+ return word<with_kwd>(src);
259
218
  }
260
219
 
261
- const char* media(const char* src) {
262
- return exactly<media_kwd>(src);
220
+ const char* kwd_without_directive(const char* src) {
221
+ return word<without_kwd>(src);
263
222
  }
264
223
 
265
- const char* supports(const char* src) {
266
- return exactly<supports_kwd>(src);
224
+ const char* kwd_media(const char* src) {
225
+ return word<media_kwd>(src);
267
226
  }
268
227
 
269
- /* not used anymore - remove?
270
- const char* keyframes(const char* src) {
271
- return sequence< exactly<'@'>, optional< vendor_prefix >, exactly< keyframes_kwd > >(src);
272
- } */
273
-
274
- /* not used anymore - remove?
275
- const char* vendor_prefix(const char* src) {
276
- return alternatives< exactly< vendor_opera_kwd >, exactly< vendor_webkit_kwd >, exactly< vendor_mozilla_kwd >, exactly< vendor_ms_kwd >, exactly< vendor_khtml_kwd > >(src);
277
- } */
278
-
279
- /* not used anymore - remove?
280
- const char* keyf(const char* src) {
281
- return one_plus< alternatives< to, from, percentage > >(src);
282
- } */
228
+ const char* kwd_supports(const char* src) {
229
+ return word<supports_kwd>(src);
230
+ }
283
231
 
284
- const char* mixin(const char* src) {
285
- return exactly<mixin_kwd>(src);
232
+ const char* kwd_mixin(const char* src) {
233
+ return word<mixin_kwd>(src);
286
234
  }
287
235
 
288
- const char* function(const char* src) {
289
- return exactly<function_kwd>(src);
236
+ const char* kwd_function(const char* src) {
237
+ return word<function_kwd>(src);
290
238
  }
291
239
 
292
- const char* return_directive(const char* src) {
293
- return exactly<return_kwd>(src);
240
+ const char* kwd_return_directive(const char* src) {
241
+ return word<return_kwd>(src);
294
242
  }
295
243
 
296
- const char* include(const char* src) {
297
- return exactly<include_kwd>(src);
244
+ const char* kwd_include(const char* src) {
245
+ return word<include_kwd>(src);
298
246
  }
299
247
 
300
- const char* content(const char* src) {
301
- return exactly<content_kwd>(src);
248
+ const char* kwd_content(const char* src) {
249
+ return word<content_kwd>(src);
302
250
  }
303
251
 
304
- const char* extend(const char* src) {
305
- return sequence < exactly<extend_kwd>, word_boundary >(src);
252
+ const char* kwd_extend(const char* src) {
253
+ return word<extend_kwd>(src);
306
254
  }
307
255
 
308
256
 
309
- const char* if_directive(const char* src) {
310
- return exactly<if_kwd>(src);
257
+ const char* kwd_if_directive(const char* src) {
258
+ return word<if_kwd>(src);
311
259
  }
312
260
 
313
- const char* else_directive(const char* src) {
314
- return exactly<else_kwd>(src);
261
+ const char* kwd_else_directive(const char* src) {
262
+ return word<else_kwd>(src);
315
263
  }
316
264
  const char* elseif_directive(const char* src) {
317
- return sequence< else_directive,
318
- optional_spaces_and_comments,
319
- exactly< if_after_else_kwd > >(src);
265
+ return sequence< exactly< else_kwd >,
266
+ optional_css_whitespace,
267
+ word< if_after_else_kwd > >(src);
320
268
  }
321
269
 
322
- const char* for_directive(const char* src) {
323
- return exactly<for_kwd>(src);
270
+ const char* kwd_for_directive(const char* src) {
271
+ return word<for_kwd>(src);
324
272
  }
325
273
 
326
- const char* from(const char* src) {
327
- return exactly<from_kwd>(src);
274
+ const char* kwd_from(const char* src) {
275
+ return word<from_kwd>(src);
328
276
  }
329
277
 
330
- const char* to(const char* src) {
331
- return exactly<to_kwd>(src);
278
+ const char* kwd_to(const char* src) {
279
+ return word<to_kwd>(src);
332
280
  }
333
281
 
334
- const char* through(const char* src) {
335
- return exactly<through_kwd>(src);
282
+ const char* kwd_through(const char* src) {
283
+ return word<through_kwd>(src);
336
284
  }
337
285
 
338
- const char* each_directive(const char* src) {
339
- return exactly<each_kwd>(src);
286
+ const char* kwd_each_directive(const char* src) {
287
+ return word<each_kwd>(src);
340
288
  }
341
289
 
342
- const char* in(const char* src) {
343
- return exactly<in_kwd>(src);
290
+ const char* kwd_in(const char* src) {
291
+ return word<in_kwd>(src);
344
292
  }
345
293
 
346
- const char* while_directive(const char* src) {
347
- return exactly<while_kwd>(src);
294
+ const char* kwd_while_directive(const char* src) {
295
+ return word<while_kwd>(src);
348
296
  }
349
297
 
350
298
  const char* name(const char* src) {
@@ -354,16 +302,16 @@ namespace Sass {
354
302
  exactly<'\\'> > >(src);
355
303
  }
356
304
 
357
- const char* warn(const char* src) {
358
- return exactly<warn_kwd>(src);
305
+ const char* kwd_warn(const char* src) {
306
+ return word<warn_kwd>(src);
359
307
  }
360
308
 
361
- const char* err(const char* src) {
362
- return exactly<error_kwd>(src);
309
+ const char* kwd_err(const char* src) {
310
+ return word<error_kwd>(src);
363
311
  }
364
312
 
365
- const char* dbg(const char* src) {
366
- return exactly<debug_kwd>(src);
313
+ const char* kwd_dbg(const char* src) {
314
+ return word<debug_kwd>(src);
367
315
  }
368
316
 
369
317
  /* not used anymore - remove?
@@ -371,8 +319,8 @@ namespace Sass {
371
319
  return sequence< exactly<'@'>, identifier >(src);
372
320
  } */
373
321
 
374
- const char* null(const char* src) {
375
- return exactly<null_kwd>(src);
322
+ const char* kwd_null(const char* src) {
323
+ return word<null_kwd>(src);
376
324
  }
377
325
 
378
326
  // Match CSS type selectors
@@ -430,13 +378,18 @@ namespace Sass {
430
378
  const char* binomial(const char* src) {
431
379
  return sequence< optional<sign>,
432
380
  optional<digits>,
433
- exactly<'n'>, optional_spaces,
434
- sign, optional_spaces,
381
+ exactly<'n'>,
382
+ zero_plus < space >,
383
+ sign,
384
+ zero_plus < space >,
435
385
  digits >(src);
436
386
  }
437
387
  const char* percentage(const char* src) {
438
388
  return sequence< number, exactly<'%'> >(src);
439
389
  }
390
+ const char* ampersand(const char* src) {
391
+ return exactly<'&'>(src);
392
+ }
440
393
 
441
394
  /* not used anymore - remove?
442
395
  const char* em(const char* src) {
@@ -463,13 +416,30 @@ namespace Sass {
463
416
 
464
417
  /* no longer used - remove?
465
418
  const char* rgb_prefix(const char* src) {
466
- return exactly<rgb_kwd>(src);
419
+ return word<rgb_kwd>(src);
467
420
  }*/
468
421
  // Match CSS uri specifiers.
469
422
 
470
423
  const char* uri_prefix(const char* src) {
471
424
  return exactly<url_kwd>(src);
472
425
  }
426
+ const char* uri_value(const char* src)
427
+ {
428
+ return
429
+ sequence <
430
+ negate <
431
+ exactly < '$' >
432
+ >,
433
+ zero_plus <
434
+ alternatives <
435
+ alnum,
436
+ exactly <'/'>,
437
+ class_char < uri_chars >
438
+ >
439
+ >
440
+ >(src);
441
+ }
442
+
473
443
  // TODO: rename the following two functions
474
444
  /* no longer used - remove?
475
445
  const char* uri(const char* src) {
@@ -493,26 +463,26 @@ namespace Sass {
493
463
  // Match CSS "!important" keyword.
494
464
  const char* important(const char* src) {
495
465
  return sequence< exactly<'!'>,
496
- optional_spaces_and_comments,
497
- exactly<important_kwd> >(src);
466
+ optional_css_whitespace,
467
+ word<important_kwd> >(src);
498
468
  }
499
469
  // Match CSS "!optional" keyword.
500
470
  const char* optional(const char* src) {
501
471
  return sequence< exactly<'!'>,
502
- optional_spaces_and_comments,
503
- exactly<optional_kwd> >(src);
472
+ optional_css_whitespace,
473
+ word<optional_kwd> >(src);
504
474
  }
505
475
  // Match Sass "!default" keyword.
506
476
  const char* default_flag(const char* src) {
507
477
  return sequence< exactly<'!'>,
508
- optional_spaces_and_comments,
509
- exactly<default_kwd> >(src);
478
+ optional_css_whitespace,
479
+ word<default_kwd> >(src);
510
480
  }
511
481
  // Match Sass "!global" keyword.
512
482
  const char* global_flag(const char* src) {
513
483
  return sequence< exactly<'!'>,
514
- optional_spaces_and_comments,
515
- exactly<global_kwd> >(src);
484
+ optional_css_whitespace,
485
+ word<global_kwd> >(src);
516
486
  }
517
487
  // Match CSS pseudo-class/element prefixes.
518
488
  const char* pseudo_prefix(const char* src) {
@@ -527,14 +497,14 @@ namespace Sass {
527
497
  }
528
498
  // Match the CSS negation pseudo-class.
529
499
  const char* pseudo_not(const char* src) {
530
- return exactly< pseudo_not_kwd >(src);
500
+ return word< pseudo_not_kwd >(src);
531
501
  }
532
502
  // Match CSS 'odd' and 'even' keywords for functional pseudo-classes.
533
503
  const char* even(const char* src) {
534
- return exactly<even_kwd>(src);
504
+ return word<even_kwd>(src);
535
505
  }
536
506
  const char* odd(const char* src) {
537
- return exactly<odd_kwd>(src);
507
+ return word<odd_kwd>(src);
538
508
  }
539
509
  // Match CSS attribute-matching operators.
540
510
  const char* exact_match(const char* src) { return exactly<'='>(src); }
@@ -564,44 +534,44 @@ namespace Sass {
564
534
  }
565
535
 
566
536
  // Match Sass boolean keywords.
567
- const char* true_val(const char* src) {
568
- return exactly<true_kwd>(src);
537
+ const char* kwd_true(const char* src) {
538
+ return word<true_kwd>(src);
569
539
  }
570
- const char* false_val(const char* src) {
571
- return exactly<false_kwd>(src);
540
+ const char* kwd_false(const char* src) {
541
+ return word<false_kwd>(src);
572
542
  }
573
- const char* and_op(const char* src) {
574
- return exactly<and_kwd>(src);
543
+ const char* kwd_and(const char* src) {
544
+ return word<and_kwd>(src);
575
545
  }
576
- const char* or_op(const char* src) {
577
- return exactly<or_kwd>(src);
546
+ const char* kwd_or(const char* src) {
547
+ return word<or_kwd>(src);
578
548
  }
579
- const char* not_op(const char* src) {
580
- return exactly<not_kwd>(src);
549
+ const char* kwd_not(const char* src) {
550
+ return word<not_kwd>(src);
581
551
  }
582
- const char* eq_op(const char* src) {
552
+ const char* kwd_eq(const char* src) {
583
553
  return exactly<eq>(src);
584
554
  }
585
- const char* neq_op(const char* src) {
555
+ const char* kwd_neq(const char* src) {
586
556
  return exactly<neq>(src);
587
557
  }
588
- const char* gt_op(const char* src) {
558
+ const char* kwd_gt(const char* src) {
589
559
  return exactly<gt>(src);
590
560
  }
591
- const char* gte_op(const char* src) {
561
+ const char* kwd_gte(const char* src) {
592
562
  return exactly<gte>(src);
593
563
  }
594
- const char* lt_op(const char* src) {
564
+ const char* kwd_lt(const char* src) {
595
565
  return exactly<lt>(src);
596
566
  }
597
- const char* lte_op(const char* src) {
567
+ const char* kwd_lte(const char* src) {
598
568
  return exactly<lte>(src);
599
569
  }
600
570
 
601
571
  // match specific IE syntax
602
572
  const char* ie_progid(const char* src) {
603
573
  return sequence <
604
- exactly<progid_kwd>,
574
+ word<progid_kwd>,
605
575
  exactly<':'>,
606
576
  alternatives< identifier_schema, identifier >,
607
577
  zero_plus< sequence<
@@ -610,33 +580,33 @@ namespace Sass {
610
580
  > >,
611
581
  zero_plus < sequence<
612
582
  exactly<'('>,
613
- optional_spaces_and_comments,
583
+ optional_css_whitespace,
614
584
  optional < sequence<
615
585
  alternatives< variable, identifier_schema, identifier >,
616
- optional_spaces_and_comments,
586
+ optional_css_whitespace,
617
587
  exactly<'='>,
618
- optional_spaces_and_comments,
588
+ optional_css_whitespace,
619
589
  alternatives< variable, identifier_schema, identifier, quoted_string, number, hexa >,
620
590
  zero_plus< sequence<
621
- optional_spaces_and_comments,
591
+ optional_css_whitespace,
622
592
  exactly<','>,
623
- optional_spaces_and_comments,
593
+ optional_css_whitespace,
624
594
  sequence<
625
595
  alternatives< variable, identifier_schema, identifier >,
626
- optional_spaces_and_comments,
596
+ optional_css_whitespace,
627
597
  exactly<'='>,
628
- optional_spaces_and_comments,
598
+ optional_css_whitespace,
629
599
  alternatives< variable, identifier_schema, identifier, quoted_string, number, hexa >
630
600
  >
631
601
  > >
632
602
  > >,
633
- optional_spaces_and_comments,
603
+ optional_css_whitespace,
634
604
  exactly<')'>
635
605
  > >
636
606
  >(src);
637
607
  }
638
608
  const char* ie_expression(const char* src) {
639
- return sequence < exactly<expression_kwd>, delimited_by< '(', ')', true> >(src);
609
+ return sequence < word<expression_kwd>, delimited_by< '(', ')', true> >(src);
640
610
  }
641
611
  const char* ie_property(const char* src) {
642
612
  return alternatives < ie_expression, ie_progid >(src);
@@ -644,15 +614,15 @@ namespace Sass {
644
614
 
645
615
  // const char* ie_args(const char* src) {
646
616
  // return sequence< alternatives< ie_keyword_arg, value_schema, quoted_string, interpolant, number, identifier, delimited_by< '(', ')', true> >,
647
- // zero_plus< sequence< optional_spaces_and_comments, exactly<','>, optional_spaces_and_comments, alternatives< ie_keyword_arg, value_schema, quoted_string, interpolant, number, identifier, delimited_by<'(', ')', true> > > > >(src);
617
+ // zero_plus< sequence< optional_css_whitespace, exactly<','>, optional_css_whitespace, alternatives< ie_keyword_arg, value_schema, quoted_string, interpolant, number, identifier, delimited_by<'(', ')', true> > > > >(src);
648
618
  // }
649
619
 
650
620
  const char* ie_keyword_arg(const char* src) {
651
621
  return sequence<
652
622
  alternatives< variable, identifier_schema, identifier >,
653
- optional_spaces_and_comments,
623
+ optional_css_whitespace,
654
624
  exactly<'='>,
655
- optional_spaces_and_comments,
625
+ optional_css_whitespace,
656
626
  alternatives< variable, identifier_schema, identifier, quoted_string, number, hexa >
657
627
  >(src);
658
628
  }
@@ -666,7 +636,7 @@ namespace Sass {
666
636
  const char* folders(const char* src) {
667
637
  return zero_plus< folder >(src);
668
638
  }*/
669
-
639
+ /* not used anymore - remove?
670
640
  const char* chunk(const char* src) {
671
641
  char inside_str = 0;
672
642
  const char* p = src;
@@ -693,6 +663,7 @@ namespace Sass {
693
663
  // unreachable
694
664
  return 0;
695
665
  }
666
+ */
696
667
 
697
668
  // follow the CSS spec more closely and see if this helps us scan URLs correctly
698
669
  /* not used anymore - remove?
@@ -720,14 +691,10 @@ namespace Sass {
720
691
  return alternatives< unicode, class_char<escape_chars> >(src);
721
692
  }*/
722
693
 
723
- const char* url(const char* src) {
724
- return chunk(src);
725
- }
726
-
727
694
  const char* static_string(const char* src) {
728
695
  const char* pos = src;
729
696
  const char * s = quoted_string(pos);
730
- Token t(pos, s, Position(0, 0));
697
+ Token t(pos, s);
731
698
  const unsigned int p = count_interval< interpolant >(t.begin, t.end);
732
699
  return (p == 0) ? t.end : 0;
733
700
  }
@@ -738,7 +705,7 @@ namespace Sass {
738
705
  percentage,
739
706
  hex,
740
707
  number,
741
- sequence< exactly<'!'>, exactly<important_kwd> >
708
+ sequence< exactly<'!'>, word<important_kwd> >
742
709
  >(src);
743
710
  }
744
711