sassc 1.7.1 → 1.8.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -1
  3. data/ext/libsass/.gitignore +10 -6
  4. data/ext/libsass/.travis.yml +4 -1
  5. data/ext/libsass/GNUmakefile.am +88 -0
  6. data/ext/libsass/Makefile +157 -76
  7. data/ext/libsass/Makefile.conf +47 -0
  8. data/ext/libsass/Readme.md +13 -14
  9. data/ext/libsass/appveyor.yml +25 -41
  10. data/ext/libsass/configure.ac +20 -7
  11. data/ext/libsass/contrib/plugin.cpp +1 -1
  12. data/ext/libsass/include/sass.h +15 -0
  13. data/ext/libsass/{sass.h → include/sass/base.h} +17 -9
  14. data/ext/libsass/{sass_context.h → include/sass/context.h} +3 -1
  15. data/ext/libsass/{sass_functions.h → include/sass/functions.h} +4 -4
  16. data/ext/libsass/{sass_interface.h → include/sass/interface.h} +5 -2
  17. data/ext/libsass/{sass_values.h → include/sass/values.h} +15 -1
  18. data/ext/libsass/{sass_version.h → include/sass/version.h} +0 -0
  19. data/ext/libsass/{sass_version.h.in → include/sass/version.h.in} +0 -0
  20. data/ext/libsass/{sass2scss.h → include/sass2scss.h} +6 -7
  21. data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +167 -0
  22. data/ext/libsass/script/ci-build-libsass +67 -23
  23. data/ext/libsass/src/GNUmakefile.am +54 -0
  24. data/ext/libsass/src/ast.cpp +2029 -0
  25. data/ext/libsass/{ast.hpp → src/ast.hpp} +832 -660
  26. data/ext/libsass/src/ast_def_macros.hpp +47 -0
  27. data/ext/libsass/src/ast_factory.hpp +93 -0
  28. data/ext/libsass/{ast_fwd_decl.hpp → src/ast_fwd_decl.hpp} +9 -4
  29. data/ext/libsass/{b64 → src/b64}/cencode.h +1 -1
  30. data/ext/libsass/{b64 → src/b64}/encode.h +0 -0
  31. data/ext/libsass/{backtrace.hpp → src/backtrace.hpp} +9 -10
  32. data/ext/libsass/{base64vlq.cpp → src/base64vlq.cpp} +2 -2
  33. data/ext/libsass/{base64vlq.hpp → src/base64vlq.hpp} +1 -2
  34. data/ext/libsass/{bind.cpp → src/bind.cpp} +96 -59
  35. data/ext/libsass/{bind.hpp → src/bind.hpp} +1 -1
  36. data/ext/libsass/src/c99func.c +54 -0
  37. data/ext/libsass/{cencode.c → src/cencode.c} +5 -5
  38. data/ext/libsass/src/color_maps.cpp +643 -0
  39. data/ext/libsass/src/color_maps.hpp +333 -0
  40. data/ext/libsass/{constants.cpp → src/constants.cpp} +10 -1
  41. data/ext/libsass/{constants.hpp → src/constants.hpp} +7 -0
  42. data/ext/libsass/{context.cpp → src/context.cpp} +152 -122
  43. data/ext/libsass/src/context.hpp +150 -0
  44. data/ext/libsass/{cssize.cpp → src/cssize.cpp} +123 -109
  45. data/ext/libsass/{cssize.hpp → src/cssize.hpp} +9 -13
  46. data/ext/libsass/{debug.hpp → src/debug.hpp} +9 -9
  47. data/ext/libsass/src/debugger.hpp +683 -0
  48. data/ext/libsass/{emitter.cpp → src/emitter.cpp} +13 -13
  49. data/ext/libsass/{emitter.hpp → src/emitter.hpp} +10 -11
  50. data/ext/libsass/src/environment.cpp +184 -0
  51. data/ext/libsass/src/environment.hpp +92 -0
  52. data/ext/libsass/src/error_handling.cpp +46 -0
  53. data/ext/libsass/src/error_handling.hpp +34 -0
  54. data/ext/libsass/src/eval.cpp +1462 -0
  55. data/ext/libsass/src/eval.hpp +107 -0
  56. data/ext/libsass/src/expand.cpp +653 -0
  57. data/ext/libsass/{expand.hpp → src/expand.hpp} +17 -16
  58. data/ext/libsass/{extend.cpp → src/extend.cpp} +198 -139
  59. data/ext/libsass/{extend.hpp → src/extend.hpp} +7 -8
  60. data/ext/libsass/{file.cpp → src/file.cpp} +103 -57
  61. data/ext/libsass/{file.hpp → src/file.hpp} +23 -14
  62. data/ext/libsass/{functions.cpp → src/functions.cpp} +642 -333
  63. data/ext/libsass/{functions.hpp → src/functions.hpp} +17 -4
  64. data/ext/libsass/{inspect.cpp → src/inspect.cpp} +147 -260
  65. data/ext/libsass/{inspect.hpp → src/inspect.hpp} +7 -7
  66. data/ext/libsass/{json.cpp → src/json.cpp} +33 -43
  67. data/ext/libsass/{json.hpp → src/json.hpp} +1 -1
  68. data/ext/libsass/{kwd_arg_macros.hpp → src/kwd_arg_macros.hpp} +0 -0
  69. data/ext/libsass/{lexer.cpp → src/lexer.cpp} +28 -0
  70. data/ext/libsass/{lexer.hpp → src/lexer.hpp} +25 -10
  71. data/ext/libsass/{listize.cpp → src/listize.cpp} +17 -13
  72. data/ext/libsass/{listize.hpp → src/listize.hpp} +0 -2
  73. data/ext/libsass/{mapping.hpp → src/mapping.hpp} +0 -0
  74. data/ext/libsass/src/memory_manager.cpp +76 -0
  75. data/ext/libsass/src/memory_manager.hpp +48 -0
  76. data/ext/libsass/{node.cpp → src/node.cpp} +89 -18
  77. data/ext/libsass/{node.hpp → src/node.hpp} +5 -6
  78. data/ext/libsass/{operation.hpp → src/operation.hpp} +18 -12
  79. data/ext/libsass/{output.cpp → src/output.cpp} +47 -55
  80. data/ext/libsass/{output.hpp → src/output.hpp} +5 -4
  81. data/ext/libsass/src/parser.cpp +2529 -0
  82. data/ext/libsass/{parser.hpp → src/parser.hpp} +84 -60
  83. data/ext/libsass/{paths.hpp → src/paths.hpp} +10 -13
  84. data/ext/libsass/{plugins.cpp → src/plugins.cpp} +14 -17
  85. data/ext/libsass/{plugins.hpp → src/plugins.hpp} +10 -11
  86. data/ext/libsass/{position.cpp → src/position.cpp} +5 -6
  87. data/ext/libsass/{position.hpp → src/position.hpp} +19 -22
  88. data/ext/libsass/{prelexer.cpp → src/prelexer.cpp} +401 -53
  89. data/ext/libsass/{prelexer.hpp → src/prelexer.hpp} +50 -10
  90. data/ext/libsass/{remove_placeholders.cpp → src/remove_placeholders.cpp} +12 -16
  91. data/ext/libsass/{remove_placeholders.hpp → src/remove_placeholders.hpp} +1 -7
  92. data/ext/libsass/{sass.cpp → src/sass.cpp} +3 -5
  93. data/ext/libsass/{sass2scss.cpp → src/sass2scss.cpp} +51 -46
  94. data/ext/libsass/{sass_context.cpp → src/sass_context.cpp} +114 -112
  95. data/ext/libsass/{sass_functions.cpp → src/sass_functions.cpp} +11 -18
  96. data/ext/libsass/{sass_interface.cpp → src/sass_interface.cpp} +44 -81
  97. data/ext/libsass/{sass_util.cpp → src/sass_util.cpp} +26 -8
  98. data/ext/libsass/{sass_util.hpp → src/sass_util.hpp} +14 -18
  99. data/ext/libsass/{sass_values.cpp → src/sass_values.cpp} +91 -20
  100. data/ext/libsass/{source_map.cpp → src/source_map.cpp} +13 -13
  101. data/ext/libsass/{source_map.hpp → src/source_map.hpp} +9 -9
  102. data/ext/libsass/{subset_map.hpp → src/subset_map.hpp} +29 -31
  103. data/ext/libsass/{support → src/support}/libsass.pc.in +0 -0
  104. data/ext/libsass/src/to_c.cpp +73 -0
  105. data/ext/libsass/src/to_c.hpp +41 -0
  106. data/ext/libsass/src/to_string.cpp +47 -0
  107. data/ext/libsass/{to_string.hpp → src/to_string.hpp} +9 -7
  108. data/ext/libsass/src/to_value.cpp +109 -0
  109. data/ext/libsass/src/to_value.hpp +50 -0
  110. data/ext/libsass/{units.cpp → src/units.cpp} +56 -51
  111. data/ext/libsass/{units.hpp → src/units.hpp} +8 -9
  112. data/ext/libsass/{utf8.h → src/utf8.h} +0 -0
  113. data/ext/libsass/{utf8 → src/utf8}/checked.h +0 -0
  114. data/ext/libsass/{utf8 → src/utf8}/core.h +12 -12
  115. data/ext/libsass/{utf8 → src/utf8}/unchecked.h +0 -0
  116. data/ext/libsass/{utf8_string.cpp → src/utf8_string.cpp} +0 -0
  117. data/ext/libsass/{utf8_string.hpp → src/utf8_string.hpp} +6 -6
  118. data/ext/libsass/{util.cpp → src/util.cpp} +144 -86
  119. data/ext/libsass/src/util.hpp +59 -0
  120. data/ext/libsass/src/values.cpp +137 -0
  121. data/ext/libsass/src/values.hpp +12 -0
  122. data/ext/libsass/test/test_node.cpp +33 -33
  123. data/ext/libsass/test/test_paths.cpp +5 -6
  124. data/ext/libsass/test/test_selector_difference.cpp +4 -5
  125. data/ext/libsass/test/test_specificity.cpp +4 -5
  126. data/ext/libsass/test/test_subset_map.cpp +91 -91
  127. data/ext/libsass/test/test_superselector.cpp +11 -11
  128. data/ext/libsass/test/test_unification.cpp +4 -4
  129. data/ext/libsass/win/libsass.targets +101 -0
  130. data/ext/libsass/win/libsass.vcxproj +45 -127
  131. data/ext/libsass/win/libsass.vcxproj.filters +303 -0
  132. data/lib/sassc/import_handler.rb +1 -1
  133. data/lib/sassc/native/native_functions_api.rb +3 -3
  134. data/lib/sassc/version.rb +1 -1
  135. data/test/custom_importer_test.rb +1 -4
  136. data/test/functions_test.rb +3 -2
  137. data/test/native_test.rb +4 -3
  138. metadata +117 -110
  139. data/ext/libsass/Makefile.am +0 -146
  140. data/ext/libsass/ast.cpp +0 -945
  141. data/ext/libsass/ast_def_macros.hpp +0 -21
  142. data/ext/libsass/ast_factory.hpp +0 -92
  143. data/ext/libsass/color_names.hpp +0 -327
  144. data/ext/libsass/context.hpp +0 -157
  145. data/ext/libsass/contextualize.cpp +0 -148
  146. data/ext/libsass/contextualize.hpp +0 -46
  147. data/ext/libsass/contextualize_eval.cpp +0 -93
  148. data/ext/libsass/contextualize_eval.hpp +0 -44
  149. data/ext/libsass/debugger.hpp +0 -558
  150. data/ext/libsass/environment.hpp +0 -163
  151. data/ext/libsass/error_handling.cpp +0 -35
  152. data/ext/libsass/error_handling.hpp +0 -32
  153. data/ext/libsass/eval.cpp +0 -1392
  154. data/ext/libsass/eval.hpp +0 -88
  155. data/ext/libsass/expand.cpp +0 -575
  156. data/ext/libsass/memory_manager.hpp +0 -57
  157. data/ext/libsass/parser.cpp +0 -2403
  158. data/ext/libsass/posix/getopt.c +0 -562
  159. data/ext/libsass/posix/getopt.h +0 -95
  160. data/ext/libsass/to_c.cpp +0 -61
  161. data/ext/libsass/to_c.hpp +0 -44
  162. data/ext/libsass/to_string.cpp +0 -34
  163. data/ext/libsass/util.hpp +0 -54
  164. data/ext/libsass/win/libsass.filters +0 -312
@@ -4,7 +4,7 @@
4
4
  #include <string>
5
5
  #include <vector>
6
6
  #include "utf8_string.hpp"
7
- #include "sass_functions.h"
7
+ #include "sass/functions.h"
8
8
 
9
9
  #ifdef _WIN32
10
10
 
@@ -27,7 +27,6 @@
27
27
 
28
28
  namespace Sass {
29
29
 
30
- using namespace std;
31
30
 
32
31
  class Plugins {
33
32
 
@@ -37,22 +36,22 @@ namespace Sass {
37
36
 
38
37
  public: // methods
39
38
  // load one specific plugin
40
- bool load_plugin(const string& path);
39
+ bool load_plugin(const std::string& path);
41
40
  // load all plugins from a directory
42
- size_t load_plugins(const string& path);
41
+ size_t load_plugins(const std::string& path);
43
42
 
44
43
  public: // public accessors
45
- const vector<Sass_Importer_Entry> get_headers(void) { return headers; };
46
- const vector<Sass_Importer_Entry> get_importers(void) { return importers; };
47
- const vector<Sass_Function_Entry> get_functions(void) { return functions; };
44
+ const std::vector<Sass_Importer_Entry> get_headers(void) { return headers; }
45
+ const std::vector<Sass_Importer_Entry> get_importers(void) { return importers; }
46
+ const std::vector<Sass_Function_Entry> get_functions(void) { return functions; }
48
47
 
49
48
  private: // private vars
50
- vector<Sass_Importer_Entry> headers;
51
- vector<Sass_Importer_Entry> importers;
52
- vector<Sass_Function_Entry> functions;
49
+ std::vector<Sass_Importer_Entry> headers;
50
+ std::vector<Sass_Importer_Entry> importers;
51
+ std::vector<Sass_Function_Entry> functions;
53
52
 
54
53
  };
55
54
 
56
55
  }
57
56
 
58
- #endif
57
+ #endif
@@ -2,7 +2,6 @@
2
2
 
3
3
  namespace Sass {
4
4
 
5
- using namespace std;
6
5
 
7
6
  Offset::Offset(const char* string)
8
7
  : line(0), column(0)
@@ -10,7 +9,7 @@ namespace Sass {
10
9
  *this = inc(string, string + strlen(string));
11
10
  }
12
11
 
13
- Offset::Offset(const string& text)
12
+ Offset::Offset(const std::string& text)
14
13
  : line(0), column(0)
15
14
  {
16
15
  *this = inc(text.c_str(), text.c_str() + text.size());
@@ -96,13 +95,13 @@ namespace Sass {
96
95
  : Offset(line, column), file(file) { }
97
96
 
98
97
 
99
- ParserState::ParserState(string path, const char* src, const size_t file)
98
+ ParserState::ParserState(const char* path, const char* src, const size_t file)
100
99
  : Position(file, 0, 0), path(path), src(src), offset(0, 0), token() { }
101
100
 
102
- ParserState::ParserState(string path, const char* src, Position position, Offset offset)
101
+ ParserState::ParserState(const char* path, const char* src, const Position& position, Offset offset)
103
102
  : Position(position), path(path), src(src), offset(offset), token() { }
104
103
 
105
- ParserState::ParserState(string path, const char* src, Token token, Position position, Offset offset)
104
+ ParserState::ParserState(const char* path, const char* src, const Token& token, const Position& position, Offset offset)
106
105
  : Position(position), path(path), src(src), offset(offset), token(token) { }
107
106
 
108
107
  Position Position::add(const char* begin, const char* end)
@@ -160,4 +159,4 @@ namespace Sass {
160
159
  return strm;
161
160
  } */
162
161
 
163
- }
162
+ }
@@ -3,19 +3,16 @@
3
3
 
4
4
  #include <string>
5
5
  #include <cstring>
6
- #include <cstdlib>
7
- #include <sstream>
8
- #include <iostream>
6
+ // #include <iostream>
9
7
 
10
8
  namespace Sass {
11
9
 
12
- using namespace std;
13
10
 
14
11
  class Offset {
15
12
 
16
13
  public: // c-tor
17
14
  Offset(const char* string);
18
- Offset(const string& text);
15
+ Offset(const std::string& text);
19
16
  Offset(const size_t line, const size_t column);
20
17
 
21
18
  // return new position, incremented by the given string
@@ -33,10 +30,10 @@ namespace Sass {
33
30
  Offset operator- (const Offset &off) const;
34
31
 
35
32
  public: // overload output stream operator
36
- // friend ostream& operator<<(ostream& strm, const Offset& off);
33
+ // friend std::ostream& operator<<(std::ostream& strm, const Offset& off);
37
34
 
38
35
  public:
39
- Offset off() { return *this; };
36
+ Offset off() { return *this; }
40
37
 
41
38
  public:
42
39
  size_t line;
@@ -63,7 +60,7 @@ namespace Sass {
63
60
  Position inc(const char* begin, const char* end) const;
64
61
 
65
62
  public: // overload output stream operator
66
- // friend ostream& operator<<(ostream& strm, const Position& pos);
63
+ // friend std::ostream& operator<<(std::ostream& strm, const Position& pos);
67
64
 
68
65
  public:
69
66
  size_t file;
@@ -87,16 +84,16 @@ namespace Sass {
87
84
  : prefix(p), begin(b), end(e) { }
88
85
 
89
86
  size_t length() const { return end - begin; }
90
- string ws_before() const { return string(prefix, begin); }
91
- string to_string() const { return string(begin, end); }
92
- string time_wspace() const {
93
- string str(to_string());
94
- string whitespaces(" \t\f\v\n\r");
87
+ std::string ws_before() const { return std::string(prefix, begin); }
88
+ std::string to_string() const { return std::string(begin, end); }
89
+ std::string time_wspace() const {
90
+ std::string str(to_string());
91
+ std::string whitespaces(" \t\f\v\n\r");
95
92
  return str.erase(str.find_last_not_of(whitespaces)+1);
96
93
  }
97
94
 
98
- operator bool() { return begin && end && begin >= end; }
99
- operator string() { return to_string(); }
95
+ operator bool() { return begin && end && begin >= end; }
96
+ operator std::string() { return to_string(); }
100
97
 
101
98
  bool operator==(Token t) { return to_string() == t.to_string(); }
102
99
  };
@@ -104,17 +101,17 @@ namespace Sass {
104
101
  class ParserState : public Position {
105
102
 
106
103
  public: // c-tor
107
- ParserState(string path, const char* src = 0, const size_t file = string::npos);
108
- ParserState(string path, const char* src, Position position, Offset offset = Offset(0, 0));
109
- ParserState(string path, const char* src, Token token, Position position, Offset offset = Offset(0, 0));
104
+ ParserState(const char* path, const char* src = 0, const size_t file = std::string::npos);
105
+ ParserState(const char* path, const char* src, const Position& position, Offset offset = Offset(0, 0));
106
+ ParserState(const char* path, const char* src, const Token& token, const Position& position, Offset offset = Offset(0, 0));
110
107
 
111
108
  public: // down casts
112
- Offset off() { return *this; };
113
- Position pos() { return *this; };
114
- ParserState pstate() { return *this; };
109
+ Offset off() { return *this; }
110
+ Position pos() { return *this; }
111
+ ParserState pstate() { return *this; }
115
112
 
116
113
  public:
117
- string path;
114
+ const char* path;
118
115
  const char* src;
119
116
  Offset offset;
120
117
  Token token;
@@ -33,7 +33,6 @@ namespace Sass {
33
33
  const char* block_comment(const char* src)
34
34
  {
35
35
  return sequence<
36
- zero_plus < space >,
37
36
  delimited_by<
38
37
  slash_star,
39
38
  star_slash,
@@ -71,7 +70,15 @@ namespace Sass {
71
70
  {
72
71
  return sequence<
73
72
  exactly<'\\'>,
74
- any_char
73
+ alternatives <
74
+ minmax_range<
75
+ 1, 3, xdigit
76
+ >,
77
+ any_char
78
+ >,
79
+ optional <
80
+ exactly <' '>
81
+ >
75
82
  >(src);
76
83
  }
77
84
 
@@ -79,6 +86,7 @@ namespace Sass {
79
86
  const char* identifier_alpha(const char* src)
80
87
  {
81
88
  return alternatives<
89
+ unicode_seq,
82
90
  alpha,
83
91
  unicode,
84
92
  exactly<'-'>,
@@ -91,6 +99,7 @@ namespace Sass {
91
99
  const char* identifier_alnum(const char* src)
92
100
  {
93
101
  return alternatives<
102
+ unicode_seq,
94
103
  alnum,
95
104
  unicode,
96
105
  exactly<'-'>,
@@ -99,6 +108,16 @@ namespace Sass {
99
108
  >(src);
100
109
  }
101
110
 
111
+ // Match CSS identifiers.
112
+ const char* strict_identifier(const char* src)
113
+ {
114
+ return sequence<
115
+ one_plus < strict_identifier_alpha >,
116
+ zero_plus < strict_identifier_alnum >
117
+ // word_boundary not needed
118
+ >(src);
119
+ }
120
+
102
121
  // Match CSS identifiers.
103
122
  const char* identifier(const char* src)
104
123
  {
@@ -110,6 +129,42 @@ namespace Sass {
110
129
  >(src);
111
130
  }
112
131
 
132
+ const char* strict_identifier_alpha(const char* src)
133
+ {
134
+ return alternatives <
135
+ alpha,
136
+ unicode,
137
+ escape_seq,
138
+ exactly<'_'>
139
+ >(src);
140
+ }
141
+
142
+ const char* strict_identifier_alnum(const char* src)
143
+ {
144
+ return alternatives <
145
+ alnum,
146
+ unicode,
147
+ escape_seq,
148
+ exactly<'_'>
149
+ >(src);
150
+ }
151
+
152
+ // Match CSS unit identifier.
153
+ const char* unit_identifier(const char* src)
154
+ {
155
+ return sequence <
156
+ optional < exactly <'-'> >,
157
+ strict_identifier_alpha,
158
+ zero_plus < alternatives<
159
+ strict_identifier_alnum,
160
+ sequence <
161
+ one_plus < exactly<'-'> >,
162
+ strict_identifier_alpha
163
+ >
164
+ > >
165
+ >(src);
166
+ }
167
+
113
168
  const char* identifier_alnums(const char* src)
114
169
  {
115
170
  return one_plus< identifier_alnum >(src);
@@ -129,11 +184,32 @@ namespace Sass {
129
184
 
130
185
  // Match interpolant schemas
131
186
  const char* identifier_schema(const char* src) {
132
- // follows this pattern: (x*ix*)+ ... well, not quite
133
- return sequence< one_plus< sequence< zero_plus< alternatives< identifier, exactly<'-'> > >,
134
- interpolant,
135
- zero_plus< alternatives< identifier, number, exactly<'-'> > > > >,
136
- negate< exactly<'%'> > >(src);
187
+
188
+ return sequence <
189
+ one_plus <
190
+ sequence <
191
+ zero_plus <
192
+ alternatives <
193
+ identifier,
194
+ exactly <'-'>
195
+ >
196
+ >,
197
+ interpolant,
198
+ zero_plus <
199
+ alternatives <
200
+ digits,
201
+ identifier,
202
+ quoted_string,
203
+ exactly<'+'>,
204
+ exactly<'-'>
205
+ >
206
+ >
207
+ >
208
+ >,
209
+ negate <
210
+ exactly<'%'>
211
+ >
212
+ > (src);
137
213
  }
138
214
 
139
215
  // interpolants can be recursive/nested
@@ -151,10 +227,10 @@ namespace Sass {
151
227
  // skip escapes
152
228
  sequence <
153
229
  exactly < '\\' >,
154
- exactly < '\r' >,
155
- exactly < '\n' >
230
+ re_linebreak
156
231
  >,
157
232
  escape_seq,
233
+ unicode_seq,
158
234
  // skip interpolants
159
235
  interpolant,
160
236
  // skip non delimiters
@@ -175,10 +251,10 @@ namespace Sass {
175
251
  // skip escapes
176
252
  sequence <
177
253
  exactly < '\\' >,
178
- exactly < '\r' >,
179
- exactly < '\n' >
254
+ re_linebreak
180
255
  >,
181
256
  escape_seq,
257
+ unicode_seq,
182
258
  // skip interpolants
183
259
  interpolant,
184
260
  // skip non delimiters
@@ -216,8 +292,44 @@ namespace Sass {
216
292
  return sequence<exactly<'@'>, identifier>(src);
217
293
  }
218
294
 
219
- const char* kwd_sel_deep(const char* src) {
220
- return word<sel_deep_kwd>(src);
295
+ const char* re_reference_combinator(const char* src) {
296
+ return sequence <
297
+ optional <
298
+ sequence <
299
+ zero_plus <
300
+ exactly <'-'>
301
+ >,
302
+ identifier,
303
+ exactly <'|'>
304
+ >
305
+ >,
306
+ zero_plus <
307
+ exactly <'-'>
308
+ >,
309
+ identifier
310
+ >(src);
311
+ }
312
+
313
+ const char* static_reference_combinator(const char* src) {
314
+ return sequence <
315
+ exactly <'/'>,
316
+ re_reference_combinator,
317
+ exactly <'/'>
318
+ >(src);
319
+ }
320
+
321
+ const char* schema_reference_combinator(const char* src) {
322
+ return sequence <
323
+ exactly <'/'>,
324
+ optional <
325
+ sequence <
326
+ css_ip_identifier,
327
+ exactly <'|'>
328
+ >
329
+ >,
330
+ css_ip_identifier,
331
+ exactly <'/'>
332
+ > (src);
221
333
  }
222
334
 
223
335
  const char* kwd_import(const char* src) {
@@ -240,7 +352,7 @@ namespace Sass {
240
352
  return word<media_kwd>(src);
241
353
  }
242
354
 
243
- const char* kwd_supports(const char* src) {
355
+ const char* kwd_supports_directive(const char* src) {
244
356
  return word<supports_kwd>(src);
245
357
  }
246
358
 
@@ -256,14 +368,18 @@ namespace Sass {
256
368
  return word<return_kwd>(src);
257
369
  }
258
370
 
259
- const char* kwd_include(const char* src) {
371
+ const char* kwd_include_directive(const char* src) {
260
372
  return word<include_kwd>(src);
261
373
  }
262
374
 
263
- const char* kwd_content(const char* src) {
375
+ const char* kwd_content_directive(const char* src) {
264
376
  return word<content_kwd>(src);
265
377
  }
266
378
 
379
+ const char* kwd_charset_directive(const char* src) {
380
+ return word<charset_kwd>(src);
381
+ }
382
+
267
383
  const char* kwd_extend(const char* src) {
268
384
  return word<extend_kwd>(src);
269
385
  }
@@ -338,14 +454,59 @@ namespace Sass {
338
454
  return word<null_kwd>(src);
339
455
  }
340
456
 
457
+ const char* css_identifier(const char* src) {
458
+ return sequence <
459
+ zero_plus <
460
+ exactly <'-'>
461
+ >,
462
+ identifier
463
+ >(src);
464
+ }
465
+
466
+ const char* css_ip_identifier(const char* src) {
467
+ return sequence <
468
+ zero_plus <
469
+ exactly <'-'>
470
+ >,
471
+ alternatives <
472
+ identifier,
473
+ interpolant
474
+ >
475
+ >(src);
476
+ }
477
+
341
478
  // Match CSS type selectors
342
479
  const char* namespace_prefix(const char* src) {
343
- return sequence< optional< alternatives< identifier, exactly<'*'> > >,
344
- exactly<'|'> >(src);
480
+ return sequence <
481
+ optional <
482
+ alternatives <
483
+ exactly <'*'>,
484
+ css_identifier
485
+ >
486
+ >,
487
+ exactly <'|'>,
488
+ negate <
489
+ exactly <'='>
490
+ >
491
+ >(src);
345
492
  }
346
- const char* type_selector(const char* src) {
347
- return sequence< optional<namespace_prefix>, identifier>(src);
493
+
494
+ // Match CSS type selectors
495
+ const char* namespace_schema(const char* src) {
496
+ return sequence <
497
+ optional <
498
+ alternatives <
499
+ exactly <'*'>,
500
+ css_ip_identifier
501
+ >
502
+ >,
503
+ exactly<'|'>,
504
+ negate <
505
+ exactly <'='>
506
+ >
507
+ >(src);
348
508
  }
509
+
349
510
  const char* hyphens_and_identifier(const char* src) {
350
511
  return sequence< zero_plus< exactly< '-' > >, identifier >(src);
351
512
  }
@@ -353,7 +514,7 @@ namespace Sass {
353
514
  return sequence< zero_plus< exactly< '-' > >, name >(src);
354
515
  }
355
516
  const char* universal(const char* src) {
356
- return sequence< optional<namespace_prefix>, exactly<'*'> >(src);
517
+ return sequence< optional<namespace_schema>, exactly<'*'> >(src);
357
518
  }
358
519
  // Match CSS id names.
359
520
  const char* id_name(const char* src) {
@@ -365,7 +526,7 @@ namespace Sass {
365
526
  }
366
527
  // Attribute name in an attribute selector.
367
528
  const char* attribute_name(const char* src) {
368
- return alternatives< sequence< optional<namespace_prefix>, identifier>,
529
+ return alternatives< sequence< optional<namespace_schema>, identifier>,
369
530
  identifier >(src);
370
531
  }
371
532
  // match placeholder selectors
@@ -391,13 +552,15 @@ namespace Sass {
391
552
  sign >(src);
392
553
  }
393
554
  const char* binomial(const char* src) {
394
- return sequence< optional<sign>,
395
- optional<digits>,
396
- exactly<'n'>,
397
- zero_plus < space >,
398
- sign,
399
- zero_plus < space >,
400
- digits >(src);
555
+ return sequence <
556
+ optional < sign >,
557
+ optional < digits >,
558
+ exactly <'n'>,
559
+ zero_plus < sequence <
560
+ optional_css_whitespace, sign,
561
+ optional_css_whitespace, digits
562
+ > >
563
+ >(src);
401
564
  }
402
565
  const char* percentage(const char* src) {
403
566
  return sequence< number, exactly<'%'> >(src);
@@ -411,7 +574,7 @@ namespace Sass {
411
574
  return sequence< number, exactly<em_kwd> >(src);
412
575
  } */
413
576
  const char* dimension(const char* src) {
414
- return sequence<number, one_plus< alpha > >(src);
577
+ return sequence<number, unit_identifier >(src);
415
578
  }
416
579
  const char* hex(const char* src) {
417
580
  const char* p = sequence< exactly<'#'>, one_plus<xdigit> >(src);
@@ -448,6 +611,7 @@ namespace Sass {
448
611
  zero_plus <
449
612
  alternatives <
450
613
  alnum,
614
+ interpolant,
451
615
  exactly <'/'>,
452
616
  class_char < uri_chars >
453
617
  >
@@ -476,13 +640,13 @@ namespace Sass {
476
640
  filename_schema >(src); // optional trailing slash
477
641
  }*/
478
642
  // Match CSS "!important" keyword.
479
- const char* important(const char* src) {
643
+ const char* kwd_important(const char* src) {
480
644
  return sequence< exactly<'!'>,
481
645
  optional_css_whitespace,
482
646
  word<important_kwd> >(src);
483
647
  }
484
648
  // Match CSS "!optional" keyword.
485
- const char* optional(const char* src) {
649
+ const char* kwd_optional(const char* src) {
486
650
  return sequence< exactly<'!'>,
487
651
  optional_css_whitespace,
488
652
  word<optional_kwd> >(src);
@@ -505,10 +669,46 @@ namespace Sass {
505
669
  }
506
670
  // Match CSS function call openers.
507
671
  const char* functional_schema(const char* src) {
508
- return sequence< identifier_schema, exactly<'('> >(src);
672
+ return sequence <
673
+ one_plus <
674
+ sequence <
675
+ zero_plus <
676
+ alternatives <
677
+ identifier,
678
+ exactly <'-'>
679
+ >
680
+ >,
681
+ one_plus <
682
+ sequence <
683
+ interpolant,
684
+ alternatives <
685
+ digits,
686
+ identifier,
687
+ exactly<'+'>,
688
+ exactly<'-'>
689
+ >
690
+ >
691
+ >
692
+ >
693
+ >,
694
+ negate <
695
+ exactly <'%'>
696
+ >,
697
+ lookahead <
698
+ exactly <'('>
699
+ >
700
+ > (src);
509
701
  }
510
- const char* functional(const char* src) {
511
- return sequence< identifier, exactly<'('> >(src);
702
+
703
+ const char* re_nothing(const char* src) {
704
+ return src;
705
+ }
706
+
707
+ const char* re_functional(const char* src) {
708
+ return sequence< identifier, optional < block_comment >, exactly<'('> >(src);
709
+ }
710
+ const char* re_pseudo_selector(const char* src) {
711
+ return sequence< identifier, optional < block_comment >, exactly<'('> >(src);
512
712
  }
513
713
  // Match the CSS negation pseudo-class.
514
714
  const char* pseudo_not(const char* src) {
@@ -714,22 +914,72 @@ namespace Sass {
714
914
  exactly<'\f'> >(src);
715
915
  }*/
716
916
 
717
- /* not used anymore - remove?
718
917
  const char* H(const char* src) {
719
918
  return std::isxdigit(*src) ? src+1 : 0;
720
- }*/
919
+ }
721
920
 
722
- /* not used anymore - remove?
723
- const char* unicode(const char* src) {
921
+ const char* W(const char* src) {
922
+ return zero_plus< alternatives<
923
+ space,
924
+ exactly< '\t' >,
925
+ exactly< '\r' >,
926
+ exactly< '\n' >,
927
+ exactly< '\f' >
928
+ > >(src);
929
+ }
930
+
931
+ const char* UUNICODE(const char* src) {
724
932
  return sequence< exactly<'\\'>,
725
933
  between<H, 1, 6>,
726
- optional< class_char<url_space_chars> > >(src);
727
- }*/
934
+ optional< W >
935
+ >(src);
936
+ }
937
+
938
+ const char* NONASCII(const char* src) {
939
+ return nonascii(src);
940
+ }
728
941
 
729
- /* not used anymore - remove?
730
942
  const char* ESCAPE(const char* src) {
731
- return alternatives< unicode, class_char<escape_chars> >(src);
732
- }*/
943
+ return alternatives<
944
+ UUNICODE,
945
+ sequence<
946
+ exactly<'\\'>,
947
+ NONASCII,
948
+ class_char< escape_chars >
949
+ >
950
+ >(src);
951
+ }
952
+
953
+
954
+ // const char* real_uri_prefix(const char* src) {
955
+ // return alternatives<
956
+ // exactly< url_kwd >,
957
+ // exactly< url_prefix_kwd >
958
+ // >(src);
959
+ // }
960
+
961
+ const char* real_uri_suffix(const char* src) {
962
+ return sequence< W, exactly< ')' > >(src);
963
+ }
964
+
965
+ const char* real_uri_value(const char* src) {
966
+ return
967
+ sequence<
968
+ non_greedy<
969
+ alternatives<
970
+ class_char< real_uri_chars >,
971
+ uri_character,
972
+ NONASCII,
973
+ ESCAPE
974
+ >,
975
+ alternatives<
976
+ real_uri_suffix,
977
+ exactly< hash_lbrace >
978
+ >
979
+ >
980
+ >
981
+ (src);
982
+ }
733
983
 
734
984
  const char* static_string(const char* src) {
735
985
  const char* pos = src;
@@ -739,31 +989,86 @@ namespace Sass {
739
989
  return (p == 0) ? t.end : 0;
740
990
  }
741
991
 
992
+ const char* unicode_seq(const char* src) {
993
+ return sequence <
994
+ alternatives <
995
+ exactly< 'U' >,
996
+ exactly< 'u' >
997
+ >,
998
+ exactly< '+' >,
999
+ padded_token <
1000
+ 6, xdigit,
1001
+ exactly < '?' >
1002
+ >
1003
+ >(src);
1004
+ }
1005
+
742
1006
  const char* static_component(const char* src) {
743
1007
  return alternatives< identifier,
744
1008
  static_string,
745
1009
  percentage,
746
1010
  hex,
1011
+ exactly<'|'>,
1012
+ // exactly<'+'>,
1013
+ sequence < number, identifier >,
747
1014
  number,
748
1015
  sequence< exactly<'!'>, word<important_kwd> >
749
1016
  >(src);
750
1017
  }
751
1018
 
1019
+ const char* static_property(const char* src) {
1020
+ return
1021
+ sequence <
1022
+ zero_plus<
1023
+ sequence <
1024
+ optional_css_comments,
1025
+ alternatives <
1026
+ exactly<','>,
1027
+ exactly<'('>,
1028
+ exactly<')'>,
1029
+ kwd_optional,
1030
+ quoted_string,
1031
+ interpolant,
1032
+ identifier,
1033
+ percentage,
1034
+ dimension,
1035
+ variable,
1036
+ alnum,
1037
+ sequence <
1038
+ exactly <'\\'>,
1039
+ any_char
1040
+ >
1041
+ >
1042
+ >
1043
+ >,
1044
+ lookahead <
1045
+ sequence <
1046
+ optional_css_comments,
1047
+ alternatives <
1048
+ exactly <';'>,
1049
+ exactly <'}'>,
1050
+ end_of_file
1051
+ >
1052
+ >
1053
+ >
1054
+ >(src);
1055
+ }
1056
+
752
1057
  const char* static_value(const char* src) {
753
1058
  return sequence< sequence<
754
1059
  static_component,
755
1060
  zero_plus< identifier >
756
1061
  >,
757
1062
  zero_plus < sequence<
758
- alternatives<
759
- sequence< optional_spaces, alternatives<
760
- exactly < '/' >,
761
- exactly < ',' >,
762
- exactly < ' ' >
763
- >, optional_spaces >,
764
- spaces
765
- >,
766
- static_component
1063
+ alternatives<
1064
+ sequence< optional_spaces, alternatives<
1065
+ exactly < '/' >,
1066
+ exactly < ',' >,
1067
+ exactly < ' ' >
1068
+ >, optional_spaces >,
1069
+ spaces
1070
+ >,
1071
+ static_component
767
1072
  > >,
768
1073
  optional_css_whitespace,
769
1074
  alternatives< exactly<';'>, exactly<'}'> >
@@ -780,5 +1085,48 @@ namespace Sass {
780
1085
  >(src);
781
1086
  }
782
1087
 
1088
+ const char* type_selector(const char* src) {
1089
+ return sequence< optional<namespace_schema>, identifier>(src);
1090
+ }
1091
+ const char* re_type_selector(const char* src) {
1092
+ return alternatives< type_selector, universal, quoted_string, dimension, percentage, number, identifier_alnums >(src);
1093
+ }
1094
+ const char* re_type_selector2(const char* src) {
1095
+ return alternatives< type_selector, universal, quoted_string, dimension, percentage, number, identifier_alnums >(src);
1096
+ }
1097
+ const char* re_static_expression(const char* src) {
1098
+ return sequence< number, optional_spaces, exactly<'/'>, optional_spaces, number >(src);
1099
+ }
1100
+
1101
+ template <size_t size, prelexer mx, prelexer pad>
1102
+ const char* padded_token(const char* src)
1103
+ {
1104
+ size_t got = 0;
1105
+ const char* pos = src;
1106
+ while (got < size) {
1107
+ if (!mx(pos)) break;
1108
+ ++ pos; ++ got;
1109
+ }
1110
+ while (got < size) {
1111
+ if (!pad(pos)) break;
1112
+ ++ pos; ++ got;
1113
+ }
1114
+ return got ? pos : 0;
1115
+ }
1116
+
1117
+ template <size_t min, size_t max, prelexer mx>
1118
+ const char* minmax_range(const char* src)
1119
+ {
1120
+ size_t got = 0;
1121
+ const char* pos = src;
1122
+ while (got < max) {
1123
+ if (!mx(pos)) break;
1124
+ ++ pos; ++ got;
1125
+ }
1126
+ if (got < min) return 0;
1127
+ if (got > max) return 0;
1128
+ return pos;
1129
+ }
1130
+
783
1131
  }
784
1132
  }