sassc 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
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