sassc 2.2.1 → 2.3.0

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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +13 -0
  4. data/Rakefile +1 -3
  5. data/ext/extconf.rb +13 -5
  6. data/ext/libsass/VERSION +1 -1
  7. data/ext/libsass/include/sass/base.h +2 -1
  8. data/ext/libsass/include/sass/context.h +1 -0
  9. data/ext/libsass/src/ast.cpp +49 -59
  10. data/ext/libsass/src/ast.hpp +263 -102
  11. data/ext/libsass/src/ast_def_macros.hpp +8 -0
  12. data/ext/libsass/src/ast_fwd_decl.cpp +2 -1
  13. data/ext/libsass/src/ast_fwd_decl.hpp +40 -116
  14. data/ext/libsass/src/ast_helpers.hpp +292 -0
  15. data/ext/libsass/src/ast_sel_cmp.cpp +209 -722
  16. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  17. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  18. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  19. data/ext/libsass/src/ast_selectors.cpp +559 -1001
  20. data/ext/libsass/src/ast_selectors.hpp +311 -367
  21. data/ext/libsass/src/ast_supports.cpp +1 -17
  22. data/ext/libsass/src/ast_values.cpp +216 -29
  23. data/ext/libsass/src/ast_values.hpp +42 -33
  24. data/ext/libsass/src/bind.cpp +1 -1
  25. data/ext/libsass/src/cencode.c +4 -6
  26. data/ext/libsass/src/check_nesting.cpp +5 -6
  27. data/ext/libsass/src/check_nesting.hpp +4 -0
  28. data/ext/libsass/src/color_maps.cpp +11 -10
  29. data/ext/libsass/src/color_maps.hpp +0 -8
  30. data/ext/libsass/src/constants.cpp +5 -0
  31. data/ext/libsass/src/constants.hpp +6 -0
  32. data/ext/libsass/src/context.cpp +30 -60
  33. data/ext/libsass/src/context.hpp +8 -20
  34. data/ext/libsass/src/cssize.cpp +36 -120
  35. data/ext/libsass/src/cssize.hpp +4 -10
  36. data/ext/libsass/src/dart_helpers.hpp +199 -0
  37. data/ext/libsass/src/debugger.hpp +364 -207
  38. data/ext/libsass/src/emitter.cpp +3 -4
  39. data/ext/libsass/src/emitter.hpp +0 -2
  40. data/ext/libsass/src/environment.hpp +5 -0
  41. data/ext/libsass/src/error_handling.cpp +21 -0
  42. data/ext/libsass/src/error_handling.hpp +25 -3
  43. data/ext/libsass/src/eval.cpp +33 -153
  44. data/ext/libsass/src/eval.hpp +11 -13
  45. data/ext/libsass/src/eval_selectors.cpp +75 -0
  46. data/ext/libsass/src/expand.cpp +214 -167
  47. data/ext/libsass/src/expand.hpp +26 -6
  48. data/ext/libsass/src/extender.cpp +1186 -0
  49. data/ext/libsass/src/extender.hpp +399 -0
  50. data/ext/libsass/src/extension.cpp +43 -0
  51. data/ext/libsass/src/extension.hpp +89 -0
  52. data/ext/libsass/src/file.cpp +15 -14
  53. data/ext/libsass/src/file.hpp +5 -12
  54. data/ext/libsass/src/fn_colors.cpp +12 -10
  55. data/ext/libsass/src/fn_lists.cpp +12 -11
  56. data/ext/libsass/src/fn_miscs.cpp +22 -34
  57. data/ext/libsass/src/fn_numbers.cpp +13 -6
  58. data/ext/libsass/src/fn_selectors.cpp +94 -124
  59. data/ext/libsass/src/fn_strings.cpp +16 -14
  60. data/ext/libsass/src/fn_utils.cpp +5 -6
  61. data/ext/libsass/src/fn_utils.hpp +9 -3
  62. data/ext/libsass/src/inspect.cpp +154 -117
  63. data/ext/libsass/src/inspect.hpp +10 -8
  64. data/ext/libsass/src/lexer.cpp +17 -81
  65. data/ext/libsass/src/lexer.hpp +5 -16
  66. data/ext/libsass/src/listize.cpp +22 -36
  67. data/ext/libsass/src/listize.hpp +8 -9
  68. data/ext/libsass/src/memory/SharedPtr.hpp +39 -5
  69. data/ext/libsass/src/operation.hpp +27 -17
  70. data/ext/libsass/src/operators.cpp +1 -0
  71. data/ext/libsass/src/ordered_map.hpp +112 -0
  72. data/ext/libsass/src/output.cpp +30 -49
  73. data/ext/libsass/src/output.hpp +1 -1
  74. data/ext/libsass/src/parser.cpp +211 -381
  75. data/ext/libsass/src/parser.hpp +17 -15
  76. data/ext/libsass/src/parser_selectors.cpp +189 -0
  77. data/ext/libsass/src/permutate.hpp +140 -0
  78. data/ext/libsass/src/position.hpp +1 -1
  79. data/ext/libsass/src/prelexer.cpp +6 -6
  80. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  81. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  82. data/ext/libsass/src/sass.hpp +1 -0
  83. data/ext/libsass/src/sass2scss.cpp +4 -4
  84. data/ext/libsass/src/sass_context.cpp +42 -91
  85. data/ext/libsass/src/sass_context.hpp +2 -2
  86. data/ext/libsass/src/sass_functions.cpp +1 -1
  87. data/ext/libsass/src/sass_values.cpp +0 -1
  88. data/ext/libsass/src/stylesheet.cpp +22 -0
  89. data/ext/libsass/src/stylesheet.hpp +57 -0
  90. data/ext/libsass/src/to_value.cpp +2 -2
  91. data/ext/libsass/src/to_value.hpp +1 -1
  92. data/ext/libsass/src/units.cpp +5 -3
  93. data/ext/libsass/src/util.cpp +10 -12
  94. data/ext/libsass/src/util.hpp +2 -3
  95. data/ext/libsass/src/util_string.cpp +111 -61
  96. data/ext/libsass/src/util_string.hpp +61 -8
  97. data/lib/sassc/engine.rb +5 -3
  98. data/lib/sassc/functions_handler.rb +8 -8
  99. data/lib/sassc/native.rb +1 -1
  100. data/lib/sassc/script.rb +4 -4
  101. data/lib/sassc/version.rb +1 -1
  102. data/test/functions_test.rb +18 -1
  103. data/test/native_test.rb +1 -1
  104. metadata +17 -12
  105. data/ext/libsass/src/extend.cpp +0 -2132
  106. data/ext/libsass/src/extend.hpp +0 -86
  107. data/ext/libsass/src/node.cpp +0 -322
  108. data/ext/libsass/src/node.hpp +0 -118
  109. data/ext/libsass/src/paths.hpp +0 -71
  110. data/ext/libsass/src/sass_util.cpp +0 -152
  111. data/ext/libsass/src/sass_util.hpp +0 -256
  112. data/ext/libsass/src/subset_map.cpp +0 -58
  113. data/ext/libsass/src/subset_map.hpp +0 -76
@@ -1,6 +1,8 @@
1
1
  #ifndef SASS_PARSER_H
2
2
  #define SASS_PARSER_H
3
3
 
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
4
6
  #include "sass.hpp"
5
7
 
6
8
  #include <string>
@@ -40,7 +42,6 @@ namespace Sass {
40
42
  Context& ctx;
41
43
  std::vector<Block_Obj> block_stack;
42
44
  std::vector<Scope> stack;
43
- Media_Block* last_media_block;
44
45
  const char* source;
45
46
  const char* position;
46
47
  const char* end;
@@ -55,7 +56,7 @@ namespace Sass {
55
56
  Token lexed;
56
57
 
57
58
  Parser(Context& ctx, const ParserState& pstate, Backtraces traces, bool allow_parent = true)
58
- : ParserState(pstate), ctx(ctx), block_stack(), stack(0), last_media_block(),
59
+ : ParserState(pstate), ctx(ctx), block_stack(), stack(0),
59
60
  source(0), position(0), end(0), before_token(pstate), after_token(pstate),
60
61
  pstate(pstate), traces(traces), indentation(0), nestings(0), allow_parent(allow_parent)
61
62
  {
@@ -67,7 +68,7 @@ namespace Sass {
67
68
  static Parser from_c_str(const char* beg, const char* end, Context& ctx, Backtraces, ParserState pstate = ParserState("[CSTRING]"), const char* source = nullptr, bool allow_parent = true);
68
69
  static Parser from_token(Token t, Context& ctx, Backtraces, ParserState pstate = ParserState("[TOKEN]"), const char* source = nullptr);
69
70
  // special static parsers to convert strings into certain selectors
70
- static Selector_List_Obj parse_selector(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[SELECTOR]"), const char* source = nullptr, bool allow_parent = true);
71
+ static SelectorListObj parse_selector(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[SELECTOR]"), const char* source = nullptr, bool allow_parent = true);
71
72
 
72
73
  #ifdef __clang__
73
74
 
@@ -187,7 +188,7 @@ namespace Sass {
187
188
  // update after_token position for current token
188
189
  after_token.add(it_before_token, it_after_token);
189
190
 
190
- // ToDo: could probably do this incremetal on original object (API wants offset?)
191
+ // ToDo: could probably do this incremental on original object (API wants offset?)
191
192
  pstate = ParserState(path, source, lexed, before_token, after_token - before_token);
192
193
 
193
194
  // advance internal char iterator
@@ -259,20 +260,20 @@ namespace Sass {
259
260
  Argument_Obj parse_argument();
260
261
  Assignment_Obj parse_assignment();
261
262
  Ruleset_Obj parse_ruleset(Lookahead lookahead);
262
- Selector_List_Obj parse_selector_list(bool chroot);
263
- Complex_Selector_Obj parse_complex_selector(bool chroot);
263
+ SelectorListObj parseSelectorList(bool chroot);
264
+ ComplexSelectorObj parseComplexSelector(bool chroot);
264
265
  Selector_Schema_Obj parse_selector_schema(const char* end_of_selector, bool chroot);
265
- Compound_Selector_Obj parse_compound_selector();
266
- Simple_Selector_Obj parse_simple_selector();
267
- Wrapped_Selector_Obj parse_negated_selector();
268
- Simple_Selector_Obj parse_pseudo_selector();
266
+ CompoundSelectorObj parseCompoundSelector();
267
+ SimpleSelectorObj parse_simple_selector();
268
+ Pseudo_Selector_Obj parse_negated_selector2();
269
+ Expression* parse_binominal();
270
+ SimpleSelectorObj parse_pseudo_selector();
269
271
  Attribute_Selector_Obj parse_attribute_selector();
270
272
  Block_Obj parse_block(bool is_root = false);
271
273
  Block_Obj parse_css_block(bool is_root = false);
272
274
  bool parse_block_nodes(bool is_root = false);
273
275
  bool parse_block_node(bool is_root = false);
274
276
 
275
- bool parse_number_prefix();
276
277
  Declaration_Obj parse_declaration();
277
278
  Expression_Obj parse_map();
278
279
  Expression_Obj parse_bracket_list();
@@ -303,10 +304,13 @@ namespace Sass {
303
304
  For_Obj parse_for_directive();
304
305
  Each_Obj parse_each_directive();
305
306
  While_Obj parse_while_directive();
307
+ MediaRule_Obj parseMediaRule();
308
+ std::vector<CssMediaQuery_Obj> parseCssMediaQueries();
309
+ std::string parseIdentifier();
310
+ CssMediaQuery_Obj parseCssMediaQuery();
306
311
  Return_Obj parse_return_directive();
307
312
  Content_Obj parse_content_directive();
308
313
  void parse_charset_directive();
309
- Media_Block_Obj parse_media_block();
310
314
  List_Obj parse_media_queries();
311
315
  Media_Query_Obj parse_media_query();
312
316
  Media_Query_Expression_Obj parse_media_expression();
@@ -320,8 +324,6 @@ namespace Sass {
320
324
  At_Root_Block_Obj parse_at_root_block();
321
325
  At_Root_Query_Obj parse_at_root_query();
322
326
  String_Schema_Obj parse_almost_any_value();
323
- Directive_Obj parse_special_directive();
324
- Directive_Obj parse_prefixed_directive();
325
327
  Directive_Obj parse_directive();
326
328
  Warning_Obj parse_warning();
327
329
  Error_Obj parse_error();
@@ -340,7 +342,7 @@ namespace Sass {
340
342
  Token lex_variable();
341
343
  Token lex_identifier();
342
344
 
343
- void parse_block_comments();
345
+ void parse_block_comments(bool store = true);
344
346
 
345
347
  Lookahead lookahead_for_value(const char* start = 0);
346
348
  Lookahead lookahead_for_selector(const char* start = 0);
@@ -0,0 +1,189 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
3
+ #include "sass.hpp"
4
+
5
+ #include "parser.hpp"
6
+
7
+ namespace Sass {
8
+
9
+ using namespace Prelexer;
10
+ using namespace Constants;
11
+
12
+ ComplexSelectorObj Parser::parseComplexSelector(bool chroot)
13
+ {
14
+
15
+ NESTING_GUARD(nestings);
16
+
17
+ lex < block_comment >();
18
+ advanceToNextToken();
19
+
20
+ ComplexSelectorObj sel = SASS_MEMORY_NEW(ComplexSelector, pstate);
21
+
22
+ if (peek < end_of_file >()) return sel;
23
+
24
+ while (true) {
25
+
26
+ lex < block_comment >();
27
+ advanceToNextToken();
28
+
29
+ // check for child (+) combinator
30
+ if (lex < exactly < selector_combinator_child > >()) {
31
+ sel->append(SASS_MEMORY_NEW(SelectorCombinator, pstate, SelectorCombinator::CHILD, peek_newline()));
32
+ }
33
+ // check for general sibling (~) combinator
34
+ else if (lex < exactly < selector_combinator_general > >()) {
35
+ sel->append(SASS_MEMORY_NEW(SelectorCombinator, pstate, SelectorCombinator::GENERAL, peek_newline()));
36
+ }
37
+ // check for adjecant sibling (+) combinator
38
+ else if (lex < exactly < selector_combinator_adjacent > >()) {
39
+ sel->append(SASS_MEMORY_NEW(SelectorCombinator, pstate, SelectorCombinator::ADJACENT, peek_newline()));
40
+ }
41
+ // check if we can parse a compound selector
42
+ else if (CompoundSelectorObj compound = parseCompoundSelector()) {
43
+ sel->append(compound);
44
+ }
45
+ else {
46
+ break;
47
+ }
48
+ }
49
+
50
+ if (sel->empty()) return {};
51
+
52
+ // check if we parsed any parent references
53
+ sel->chroots(sel->has_real_parent_ref() || chroot);
54
+
55
+ sel->update_pstate(pstate);
56
+
57
+ return sel;
58
+
59
+ }
60
+
61
+ SelectorListObj Parser::parseSelectorList(bool chroot)
62
+ {
63
+
64
+ bool reloop;
65
+ bool had_linefeed = false;
66
+ NESTING_GUARD(nestings);
67
+ SelectorListObj list = SASS_MEMORY_NEW(SelectorList, pstate);
68
+
69
+ if (peek_css< alternatives < end_of_file, exactly <'{'>, exactly <','> > >()) {
70
+ css_error("Invalid CSS", " after ", ": expected selector, was ");
71
+ }
72
+
73
+ do {
74
+ reloop = false;
75
+
76
+ had_linefeed = had_linefeed || peek_newline();
77
+
78
+ if (peek_css< alternatives < class_char < selector_list_delims > > >())
79
+ break; // in case there are superfluous commas at the end
80
+
81
+ // now parse the complex selector
82
+ ComplexSelectorObj complex = parseComplexSelector(chroot);
83
+ if (complex.isNull()) return list.detach();
84
+ complex->hasPreLineFeed(had_linefeed);
85
+
86
+ had_linefeed = false;
87
+
88
+ while (peek_css< exactly<','> >())
89
+ {
90
+ lex< css_comments >(false);
91
+ // consume everything up and including the comma separator
92
+ reloop = lex< exactly<','> >() != 0;
93
+ // remember line break (also between some commas)
94
+ had_linefeed = had_linefeed || peek_newline();
95
+ // remember line break (also between some commas)
96
+ }
97
+ list->append(complex);
98
+
99
+ } while (reloop);
100
+
101
+ while (lex_css< kwd_optional >()) {
102
+ list->is_optional(true);
103
+ }
104
+
105
+ // update for end position
106
+ list->update_pstate(pstate);
107
+
108
+ return list.detach();
109
+ }
110
+
111
+ // parse one compound selector, which is basically
112
+ // a list of simple selectors (directly adjacent)
113
+ // lex them exactly (without skipping white-space)
114
+ CompoundSelectorObj Parser::parseCompoundSelector()
115
+ {
116
+ // init an empty compound selector wrapper
117
+ CompoundSelectorObj seq = SASS_MEMORY_NEW(CompoundSelector, pstate);
118
+
119
+ // skip initial white-space
120
+ lex < block_comment >();
121
+ advanceToNextToken();
122
+
123
+ if (lex< exactly<'&'> >(false))
124
+ {
125
+ // ToDo: check the conditions and try to simplify flag passing
126
+ if (!allow_parent) error("Parent selectors aren't allowed here.");
127
+ // Create and append a new parent selector object
128
+ seq->hasRealParent(true);
129
+ }
130
+
131
+ // parse list
132
+ while (true)
133
+ {
134
+ // remove all block comments
135
+ // leaves trailing white-space
136
+ lex < block_comment >();
137
+ // parse parent selector
138
+ if (lex< exactly<'&'> >(false))
139
+ {
140
+ // parent selector only allowed at start
141
+ // upcoming Sass may allow also trailing
142
+ ParserState state(pstate);
143
+ std::string found("&");
144
+ if (lex < identifier >()) {
145
+ found += std::string(lexed);
146
+ }
147
+ std::string sel(seq->hasRealParent() ? "&" : "");
148
+ if (!seq->empty()) { sel = seq->last()->to_string({ NESTED, 5 }); }
149
+ // ToDo: parser should throw parser exceptions
150
+ error("Invalid CSS after \"" + sel + "\": expected \"{\", was \"" + found + "\"\n\n"
151
+ "\"" + found + "\" may only be used at the beginning of a compound selector.", state);
152
+ }
153
+ // parse functional
154
+ else if (match < re_functional >())
155
+ {
156
+ seq->append(parse_simple_selector());
157
+ }
158
+
159
+ // parse type selector
160
+ else if (lex< re_type_selector >(false))
161
+ {
162
+ seq->append(SASS_MEMORY_NEW(Type_Selector, pstate, lexed));
163
+ }
164
+ // peek for abort conditions
165
+ else if (peek< spaces >()) break;
166
+ else if (peek< end_of_file >()) { break; }
167
+ else if (peek_css < class_char < selector_combinator_ops > >()) break;
168
+ else if (peek_css < class_char < complex_selector_delims > >()) break;
169
+ // otherwise parse another simple selector
170
+ else {
171
+ SimpleSelectorObj sel = parse_simple_selector();
172
+ if (!sel) return {};
173
+ seq->append(sel);
174
+ }
175
+ }
176
+ // EO while true
177
+
178
+ if (seq && !peek_css<alternatives<end_of_file,exactly<'{'>>>()) {
179
+ seq->hasPostLineBreak(peek_newline());
180
+ }
181
+
182
+ // We may have set hasRealParent
183
+ if (seq && seq->empty() && !seq->hasRealParent()) return {};
184
+
185
+ return seq;
186
+ }
187
+
188
+
189
+ }
@@ -0,0 +1,140 @@
1
+ #ifndef SASS_PATHS_H
2
+ #define SASS_PATHS_H
3
+
4
+ #include <vector>
5
+
6
+ namespace Sass {
7
+
8
+ // Returns a list of all possible paths through the given lists.
9
+ //
10
+ // For example, given `[[1, 2], [3, 4], [5]]`, this returns:
11
+ //
12
+ // ```
13
+ // [[1, 3, 5],
14
+ // [2, 3, 5],
15
+ // [1, 4, 5],
16
+ // [2, 4, 5]]
17
+ // ```
18
+ //
19
+ // Note: called `paths` in dart-sass
20
+ template <class T>
21
+ std::vector<std::vector<T>> permutate(
22
+ const std::vector<std::vector<T>>& in)
23
+ {
24
+
25
+ size_t L = in.size(), n = 0;
26
+
27
+ // Exit early if any entry is empty
28
+ for (size_t i = 0; i < L; i += 1) {
29
+ if (in[i].size() == 0) return {};
30
+ }
31
+
32
+ size_t* state = new size_t[L + 1];
33
+ std::vector<std::vector<T>> out;
34
+
35
+ // First initialize all states for every permutation group
36
+ for (size_t i = 0; i < L; i += 1) {
37
+ state[i] = in[i].size() - 1;
38
+ }
39
+ while (true) {
40
+ std::vector<T> perm;
41
+ // Create one permutation for state
42
+ for (size_t i = 0; i < L; i += 1) {
43
+ perm.push_back(in.at(i).at(in[i].size() - state[i] - 1));
44
+ }
45
+ // Current group finished
46
+ if (state[n] == 0) {
47
+ // Find position of next decrement
48
+ while (n < L && state[++n] == 0) {}
49
+
50
+ if (n == L) {
51
+ out.push_back(perm);
52
+ break;
53
+ }
54
+
55
+ state[n] -= 1;
56
+
57
+ for (size_t p = 0; p < n; p += 1) {
58
+ state[p] = in[p].size() - 1;
59
+ }
60
+
61
+ // Restart from front
62
+ n = 0;
63
+
64
+ }
65
+ else {
66
+ state[n] -= 1;
67
+ }
68
+ out.push_back(perm);
69
+ }
70
+
71
+ delete[] state;
72
+ return out;
73
+ }
74
+ // EO permutate
75
+
76
+ // ToDo: this variant is used in resolve_parent_refs
77
+ template <class T>
78
+ std::vector<std::vector<T>>
79
+ permutateAlt(const std::vector<std::vector<T>>& in) {
80
+
81
+ size_t L = in.size();
82
+ size_t n = in.size() - 1;
83
+ size_t* state = new size_t[L];
84
+ std::vector< std::vector<T>> out;
85
+
86
+ // First initialize all states for every permutation group
87
+ for (size_t i = 0; i < L; i += 1) {
88
+ if (in[i].size() == 0) return {};
89
+ state[i] = in[i].size() - 1;
90
+ }
91
+
92
+ while (true) {
93
+ /*
94
+ // std::cerr << "PERM: ";
95
+ for (size_t p = 0; p < L; p++)
96
+ { // std::cerr << state[p] << " "; }
97
+ // std::cerr << "\n";
98
+ */
99
+ std::vector<T> perm;
100
+ // Create one permutation for state
101
+ for (size_t i = 0; i < L; i += 1) {
102
+ perm.push_back(in.at(i).at(in[i].size() - state[i] - 1));
103
+ }
104
+ // Current group finished
105
+ if (state[n] == 0) {
106
+ // Find position of next decrement
107
+ while (n > 0 && state[--n] == 0)
108
+ {
109
+
110
+ }
111
+ // Check for end condition
112
+ if (state[n] != 0) {
113
+ // Decrease next on the left side
114
+ state[n] -= 1;
115
+ // Reset all counters to the right
116
+ for (size_t p = n + 1; p < L; p += 1) {
117
+ state[p] = in[p].size() - 1;
118
+ }
119
+ // Restart from end
120
+ n = L - 1;
121
+ }
122
+ else {
123
+ out.push_back(perm);
124
+ break;
125
+ }
126
+ }
127
+ else {
128
+ state[n] -= 1;
129
+ }
130
+ out.push_back(perm);
131
+ }
132
+
133
+ delete[] state;
134
+ return out;
135
+ }
136
+ // EO permutateAlt
137
+
138
+ }
139
+
140
+ #endif
@@ -86,7 +86,7 @@ namespace Sass {
86
86
 
87
87
  size_t length() const { return end - begin; }
88
88
  std::string ws_before() const { return std::string(prefix, begin); }
89
- const std::string to_string() const { return std::string(begin, end); }
89
+ std::string to_string() const { return std::string(begin, end); }
90
90
  std::string time_wspace() const {
91
91
  std::string str(to_string());
92
92
  std::string whitespaces(" \t\f\v\n\r");
@@ -2,10 +2,10 @@
2
2
  // __EXTENSIONS__ fix on Solaris.
3
3
  #include "sass.hpp"
4
4
 
5
- #include <cctype>
6
5
  #include <iostream>
7
6
  #include <iomanip>
8
7
  #include "util.hpp"
8
+ #include "util_string.hpp"
9
9
  #include "position.hpp"
10
10
  #include "prelexer.hpp"
11
11
  #include "constants.hpp"
@@ -336,7 +336,7 @@ namespace Sass {
336
336
  return alternatives<
337
337
  unicode_seq,
338
338
  alpha,
339
- unicode,
339
+ nonascii,
340
340
  exactly<'-'>,
341
341
  exactly<'_'>,
342
342
  NONASCII,
@@ -351,7 +351,7 @@ namespace Sass {
351
351
  return alternatives<
352
352
  unicode_seq,
353
353
  alnum,
354
- unicode,
354
+ nonascii,
355
355
  exactly<'-'>,
356
356
  exactly<'_'>,
357
357
  NONASCII,
@@ -385,7 +385,7 @@ namespace Sass {
385
385
  {
386
386
  return alternatives <
387
387
  alpha,
388
- unicode,
388
+ nonascii,
389
389
  escape_seq,
390
390
  exactly<'_'>
391
391
  >(src);
@@ -395,7 +395,7 @@ namespace Sass {
395
395
  {
396
396
  return alternatives <
397
397
  alnum,
398
- unicode,
398
+ nonascii,
399
399
  escape_seq,
400
400
  exactly<'_'>
401
401
  >(src);
@@ -1400,7 +1400,7 @@ namespace Sass {
1400
1400
  }*/
1401
1401
 
1402
1402
  const char* H(const char* src) {
1403
- return std::isxdigit(static_cast<unsigned char>(*src)) ? src+1 : 0;
1403
+ return Util::ascii_isxdigit(static_cast<unsigned char>(*src)) ? src+1 : 0;
1404
1404
  }
1405
1405
 
1406
1406
  const char* W(const char* src) {