sassc4 2.4.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 (216) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +16 -0
  5. data/CHANGELOG.md +97 -0
  6. data/CODE_OF_CONDUCT.md +10 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +80 -0
  10. data/Rakefile +51 -0
  11. data/ext/depend +4 -0
  12. data/ext/extconf.rb +92 -0
  13. data/ext/libsass/VERSION +1 -0
  14. data/ext/libsass/contrib/plugin.cpp +60 -0
  15. data/ext/libsass/include/sass/base.h +97 -0
  16. data/ext/libsass/include/sass/context.h +174 -0
  17. data/ext/libsass/include/sass/functions.h +139 -0
  18. data/ext/libsass/include/sass/values.h +145 -0
  19. data/ext/libsass/include/sass/version.h +12 -0
  20. data/ext/libsass/include/sass.h +15 -0
  21. data/ext/libsass/include/sass2scss.h +120 -0
  22. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  23. data/ext/libsass/src/ast.cpp +953 -0
  24. data/ext/libsass/src/ast.hpp +1064 -0
  25. data/ext/libsass/src/ast2c.cpp +80 -0
  26. data/ext/libsass/src/ast2c.hpp +39 -0
  27. data/ext/libsass/src/ast_def_macros.hpp +140 -0
  28. data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
  29. data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
  30. data/ext/libsass/src/ast_helpers.hpp +316 -0
  31. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  32. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  33. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  34. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  35. data/ext/libsass/src/ast_selectors.cpp +1070 -0
  36. data/ext/libsass/src/ast_selectors.hpp +523 -0
  37. data/ext/libsass/src/ast_supports.cpp +114 -0
  38. data/ext/libsass/src/ast_supports.hpp +121 -0
  39. data/ext/libsass/src/ast_values.cpp +1154 -0
  40. data/ext/libsass/src/ast_values.hpp +498 -0
  41. data/ext/libsass/src/b64/cencode.h +32 -0
  42. data/ext/libsass/src/b64/encode.h +79 -0
  43. data/ext/libsass/src/backtrace.cpp +50 -0
  44. data/ext/libsass/src/backtrace.hpp +29 -0
  45. data/ext/libsass/src/base64vlq.cpp +47 -0
  46. data/ext/libsass/src/base64vlq.hpp +30 -0
  47. data/ext/libsass/src/bind.cpp +312 -0
  48. data/ext/libsass/src/bind.hpp +15 -0
  49. data/ext/libsass/src/c2ast.cpp +64 -0
  50. data/ext/libsass/src/c2ast.hpp +14 -0
  51. data/ext/libsass/src/c99func.c +54 -0
  52. data/ext/libsass/src/cencode.c +106 -0
  53. data/ext/libsass/src/check_nesting.cpp +393 -0
  54. data/ext/libsass/src/check_nesting.hpp +70 -0
  55. data/ext/libsass/src/color_maps.cpp +652 -0
  56. data/ext/libsass/src/color_maps.hpp +323 -0
  57. data/ext/libsass/src/color_spaces.cpp +241 -0
  58. data/ext/libsass/src/color_spaces.hpp +227 -0
  59. data/ext/libsass/src/constants.cpp +199 -0
  60. data/ext/libsass/src/constants.hpp +200 -0
  61. data/ext/libsass/src/context.cpp +870 -0
  62. data/ext/libsass/src/context.hpp +140 -0
  63. data/ext/libsass/src/cssize.cpp +521 -0
  64. data/ext/libsass/src/cssize.hpp +71 -0
  65. data/ext/libsass/src/dart_helpers.hpp +199 -0
  66. data/ext/libsass/src/debug.hpp +43 -0
  67. data/ext/libsass/src/debugger.hpp +964 -0
  68. data/ext/libsass/src/emitter.cpp +297 -0
  69. data/ext/libsass/src/emitter.hpp +101 -0
  70. data/ext/libsass/src/environment.cpp +260 -0
  71. data/ext/libsass/src/environment.hpp +124 -0
  72. data/ext/libsass/src/error_handling.cpp +239 -0
  73. data/ext/libsass/src/error_handling.hpp +248 -0
  74. data/ext/libsass/src/eval.cpp +1543 -0
  75. data/ext/libsass/src/eval.hpp +110 -0
  76. data/ext/libsass/src/eval_selectors.cpp +75 -0
  77. data/ext/libsass/src/expand.cpp +875 -0
  78. data/ext/libsass/src/expand.hpp +98 -0
  79. data/ext/libsass/src/extender.cpp +1226 -0
  80. data/ext/libsass/src/extender.hpp +399 -0
  81. data/ext/libsass/src/extension.cpp +43 -0
  82. data/ext/libsass/src/extension.hpp +89 -0
  83. data/ext/libsass/src/file.cpp +531 -0
  84. data/ext/libsass/src/file.hpp +124 -0
  85. data/ext/libsass/src/fn_colors.cpp +836 -0
  86. data/ext/libsass/src/fn_colors.hpp +99 -0
  87. data/ext/libsass/src/fn_lists.cpp +285 -0
  88. data/ext/libsass/src/fn_lists.hpp +34 -0
  89. data/ext/libsass/src/fn_maps.cpp +94 -0
  90. data/ext/libsass/src/fn_maps.hpp +30 -0
  91. data/ext/libsass/src/fn_miscs.cpp +248 -0
  92. data/ext/libsass/src/fn_miscs.hpp +40 -0
  93. data/ext/libsass/src/fn_numbers.cpp +246 -0
  94. data/ext/libsass/src/fn_numbers.hpp +45 -0
  95. data/ext/libsass/src/fn_selectors.cpp +205 -0
  96. data/ext/libsass/src/fn_selectors.hpp +35 -0
  97. data/ext/libsass/src/fn_strings.cpp +268 -0
  98. data/ext/libsass/src/fn_strings.hpp +34 -0
  99. data/ext/libsass/src/fn_utils.cpp +159 -0
  100. data/ext/libsass/src/fn_utils.hpp +62 -0
  101. data/ext/libsass/src/inspect.cpp +1126 -0
  102. data/ext/libsass/src/inspect.hpp +101 -0
  103. data/ext/libsass/src/json.cpp +1436 -0
  104. data/ext/libsass/src/json.hpp +117 -0
  105. data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
  106. data/ext/libsass/src/lexer.cpp +122 -0
  107. data/ext/libsass/src/lexer.hpp +304 -0
  108. data/ext/libsass/src/listize.cpp +70 -0
  109. data/ext/libsass/src/listize.hpp +37 -0
  110. data/ext/libsass/src/mapping.hpp +19 -0
  111. data/ext/libsass/src/memory/allocator.cpp +48 -0
  112. data/ext/libsass/src/memory/allocator.hpp +138 -0
  113. data/ext/libsass/src/memory/config.hpp +20 -0
  114. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  115. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  116. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  117. data/ext/libsass/src/memory.hpp +12 -0
  118. data/ext/libsass/src/operation.hpp +223 -0
  119. data/ext/libsass/src/operators.cpp +267 -0
  120. data/ext/libsass/src/operators.hpp +30 -0
  121. data/ext/libsass/src/ordered_map.hpp +112 -0
  122. data/ext/libsass/src/output.cpp +320 -0
  123. data/ext/libsass/src/output.hpp +47 -0
  124. data/ext/libsass/src/parser.cpp +3059 -0
  125. data/ext/libsass/src/parser.hpp +395 -0
  126. data/ext/libsass/src/parser_selectors.cpp +189 -0
  127. data/ext/libsass/src/permutate.hpp +164 -0
  128. data/ext/libsass/src/plugins.cpp +188 -0
  129. data/ext/libsass/src/plugins.hpp +57 -0
  130. data/ext/libsass/src/position.cpp +163 -0
  131. data/ext/libsass/src/position.hpp +147 -0
  132. data/ext/libsass/src/prelexer.cpp +1780 -0
  133. data/ext/libsass/src/prelexer.hpp +484 -0
  134. data/ext/libsass/src/remove_placeholders.cpp +86 -0
  135. data/ext/libsass/src/remove_placeholders.hpp +37 -0
  136. data/ext/libsass/src/sass.cpp +156 -0
  137. data/ext/libsass/src/sass.hpp +147 -0
  138. data/ext/libsass/src/sass2scss.cpp +895 -0
  139. data/ext/libsass/src/sass_context.cpp +742 -0
  140. data/ext/libsass/src/sass_context.hpp +129 -0
  141. data/ext/libsass/src/sass_functions.cpp +210 -0
  142. data/ext/libsass/src/sass_functions.hpp +50 -0
  143. data/ext/libsass/src/sass_values.cpp +362 -0
  144. data/ext/libsass/src/sass_values.hpp +82 -0
  145. data/ext/libsass/src/settings.hpp +19 -0
  146. data/ext/libsass/src/source.cpp +69 -0
  147. data/ext/libsass/src/source.hpp +95 -0
  148. data/ext/libsass/src/source_data.hpp +32 -0
  149. data/ext/libsass/src/source_map.cpp +202 -0
  150. data/ext/libsass/src/source_map.hpp +65 -0
  151. data/ext/libsass/src/stylesheet.cpp +22 -0
  152. data/ext/libsass/src/stylesheet.hpp +57 -0
  153. data/ext/libsass/src/to_value.cpp +114 -0
  154. data/ext/libsass/src/to_value.hpp +46 -0
  155. data/ext/libsass/src/units.cpp +507 -0
  156. data/ext/libsass/src/units.hpp +110 -0
  157. data/ext/libsass/src/utf8/checked.h +336 -0
  158. data/ext/libsass/src/utf8/core.h +332 -0
  159. data/ext/libsass/src/utf8/unchecked.h +235 -0
  160. data/ext/libsass/src/utf8.h +34 -0
  161. data/ext/libsass/src/utf8_string.cpp +104 -0
  162. data/ext/libsass/src/utf8_string.hpp +38 -0
  163. data/ext/libsass/src/util.cpp +723 -0
  164. data/ext/libsass/src/util.hpp +105 -0
  165. data/ext/libsass/src/util_string.cpp +125 -0
  166. data/ext/libsass/src/util_string.hpp +73 -0
  167. data/ext/libsass/src/values.cpp +140 -0
  168. data/ext/libsass/src/values.hpp +12 -0
  169. data/lib/sassc/dependency.rb +17 -0
  170. data/lib/sassc/engine.rb +141 -0
  171. data/lib/sassc/error.rb +37 -0
  172. data/lib/sassc/functions_handler.rb +73 -0
  173. data/lib/sassc/import_handler.rb +50 -0
  174. data/lib/sassc/importer.rb +31 -0
  175. data/lib/sassc/native/native_context_api.rb +147 -0
  176. data/lib/sassc/native/native_functions_api.rb +159 -0
  177. data/lib/sassc/native/sass2scss_api.rb +10 -0
  178. data/lib/sassc/native/sass_input_style.rb +13 -0
  179. data/lib/sassc/native/sass_output_style.rb +12 -0
  180. data/lib/sassc/native/sass_value.rb +97 -0
  181. data/lib/sassc/native/string_list.rb +10 -0
  182. data/lib/sassc/native.rb +64 -0
  183. data/lib/sassc/sass_2_scss.rb +9 -0
  184. data/lib/sassc/script/functions.rb +8 -0
  185. data/lib/sassc/script/value/bool.rb +32 -0
  186. data/lib/sassc/script/value/color.rb +95 -0
  187. data/lib/sassc/script/value/list.rb +136 -0
  188. data/lib/sassc/script/value/map.rb +69 -0
  189. data/lib/sassc/script/value/number.rb +389 -0
  190. data/lib/sassc/script/value/string.rb +96 -0
  191. data/lib/sassc/script/value.rb +137 -0
  192. data/lib/sassc/script/value_conversion/base.rb +13 -0
  193. data/lib/sassc/script/value_conversion/bool.rb +13 -0
  194. data/lib/sassc/script/value_conversion/color.rb +18 -0
  195. data/lib/sassc/script/value_conversion/list.rb +25 -0
  196. data/lib/sassc/script/value_conversion/map.rb +21 -0
  197. data/lib/sassc/script/value_conversion/number.rb +13 -0
  198. data/lib/sassc/script/value_conversion/string.rb +17 -0
  199. data/lib/sassc/script/value_conversion.rb +69 -0
  200. data/lib/sassc/script.rb +17 -0
  201. data/lib/sassc/util/normalized_map.rb +117 -0
  202. data/lib/sassc/util.rb +231 -0
  203. data/lib/sassc/version.rb +5 -0
  204. data/lib/sassc.rb +57 -0
  205. data/sassc.gemspec +69 -0
  206. data/test/css_color_level4_test.rb +168 -0
  207. data/test/custom_importer_test.rb +127 -0
  208. data/test/engine_test.rb +314 -0
  209. data/test/error_test.rb +29 -0
  210. data/test/fixtures/paths.scss +10 -0
  211. data/test/functions_test.rb +340 -0
  212. data/test/native_test.rb +213 -0
  213. data/test/output_style_test.rb +107 -0
  214. data/test/sass_2_scss_test.rb +14 -0
  215. data/test/test_helper.rb +45 -0
  216. metadata +396 -0
@@ -0,0 +1,484 @@
1
+ #ifndef SASS_PRELEXER_H
2
+ #define SASS_PRELEXER_H
3
+
4
+ #include <cstring>
5
+ #include "lexer.hpp"
6
+
7
+ namespace Sass {
8
+ // using namespace Lexer;
9
+ namespace Prelexer {
10
+
11
+ //####################################
12
+ // KEYWORD "REGEX" MATCHERS
13
+ //####################################
14
+
15
+ // Match Sass boolean keywords.
16
+ const char* kwd_true(const char* src);
17
+ const char* kwd_false(const char* src);
18
+ const char* kwd_only(const char* src);
19
+ const char* kwd_and(const char* src);
20
+ const char* kwd_or(const char* src);
21
+ const char* kwd_not(const char* src);
22
+ const char* kwd_eq(const char* src);
23
+ const char* kwd_neq(const char* src);
24
+ const char* kwd_gt(const char* src);
25
+ const char* kwd_gte(const char* src);
26
+ const char* kwd_lt(const char* src);
27
+ const char* kwd_lte(const char* src);
28
+ const char* kwd_using(const char* src);
29
+
30
+ // Match standard control chars
31
+ const char* kwd_at(const char* src);
32
+ const char* kwd_dot(const char* src);
33
+ const char* kwd_comma(const char* src);
34
+ const char* kwd_colon(const char* src);
35
+ const char* kwd_slash(const char* src);
36
+ const char* kwd_star(const char* src);
37
+ const char* kwd_plus(const char* src);
38
+ const char* kwd_minus(const char* src);
39
+
40
+ //####################################
41
+ // SPECIAL "REGEX" CONSTRUCTS
42
+ //####################################
43
+
44
+ // Match a sequence of characters delimited by the supplied chars.
45
+ template <char beg, char end, bool esc>
46
+ const char* delimited_by(const char* src) {
47
+ src = exactly<beg>(src);
48
+ if (!src) return 0;
49
+ const char* stop;
50
+ while (true) {
51
+ if (!*src) return 0;
52
+ stop = exactly<end>(src);
53
+ if (stop && (!esc || *(src - 1) != '\\')) return stop;
54
+ src = stop ? stop : src + 1;
55
+ }
56
+ }
57
+
58
+ // skip to delimiter (mx) inside given range
59
+ // this will savely skip over all quoted strings
60
+ // recursive skip stuff delimited by start/stop
61
+ // first start/opener must be consumed already!
62
+ template<prelexer start, prelexer stop>
63
+ const char* skip_over_scopes(const char* src, const char* end) {
64
+
65
+ size_t level = 0;
66
+ bool in_squote = false;
67
+ bool in_dquote = false;
68
+ bool in_backslash_escape = false;
69
+
70
+ while ((end == nullptr || src < end) && *src != '\0') {
71
+ // has escaped sequence?
72
+ if (in_backslash_escape) {
73
+ in_backslash_escape = false;
74
+ }
75
+ else if (*src == '\\') {
76
+ in_backslash_escape = true;
77
+ }
78
+ else if (*src == '"') {
79
+ in_dquote = ! in_dquote;
80
+ }
81
+ else if (*src == '\'') {
82
+ in_squote = ! in_squote;
83
+ }
84
+ else if (in_dquote || in_squote) {
85
+ // take everything literally
86
+ }
87
+
88
+ // find another opener inside?
89
+ else if (const char* pos = start(src)) {
90
+ ++ level; // increase counter
91
+ src = pos - 1; // advance position
92
+ }
93
+
94
+ // look for the closer (maybe final, maybe not)
95
+ else if (const char* final = stop(src)) {
96
+ // only close one level?
97
+ if (level > 0) -- level;
98
+ // return position at end of stop
99
+ // delimiter may be multiple chars
100
+ else return final;
101
+ // advance position
102
+ src = final - 1;
103
+ }
104
+
105
+ // next
106
+ ++ src;
107
+ }
108
+
109
+ return 0;
110
+ }
111
+
112
+ // skip to a skip delimited by parentheses
113
+ // uses smart `skip_over_scopes` internally
114
+ const char* parenthese_scope(const char* src);
115
+
116
+ // skip to delimiter (mx) inside given range
117
+ // this will savely skip over all quoted strings
118
+ // recursive skip stuff delimited by start/stop
119
+ // first start/opener must be consumed already!
120
+ template<prelexer start, prelexer stop>
121
+ const char* skip_over_scopes(const char* src) {
122
+ return skip_over_scopes<start, stop>(src, nullptr);
123
+ }
124
+
125
+ // Match a sequence of characters delimited by the supplied chars.
126
+ template <prelexer start, prelexer stop>
127
+ const char* recursive_scopes(const char* src) {
128
+ // parse opener
129
+ src = start(src);
130
+ // abort if not found
131
+ if (!src) return 0;
132
+ // parse the rest until final closer
133
+ return skip_over_scopes<start, stop>(src);
134
+ }
135
+
136
+ // Match a sequence of characters delimited by the supplied strings.
137
+ template <const char* beg, const char* end, bool esc>
138
+ const char* delimited_by(const char* src) {
139
+ src = exactly<beg>(src);
140
+ if (!src) return 0;
141
+ const char* stop;
142
+ while (true) {
143
+ if (!*src) return 0;
144
+ stop = exactly<end>(src);
145
+ if (stop && (!esc || *(src - 1) != '\\')) return stop;
146
+ src = stop ? stop : src + 1;
147
+ }
148
+ }
149
+
150
+ // Tries to match a certain number of times (between the supplied interval).
151
+ template<prelexer mx, size_t lo, size_t hi>
152
+ const char* between(const char* src) {
153
+ for (size_t i = 0; i < lo; ++i) {
154
+ src = mx(src);
155
+ if (!src) return 0;
156
+ }
157
+ for (size_t i = lo; i <= hi; ++i) {
158
+ const char* new_src = mx(src);
159
+ if (!new_src) return src;
160
+ src = new_src;
161
+ }
162
+ return src;
163
+ }
164
+
165
+ // equivalent of STRING_REGULAR_EXPRESSIONS
166
+ const char* re_string_double_open(const char* src);
167
+ const char* re_string_double_close(const char* src);
168
+ const char* re_string_single_open(const char* src);
169
+ const char* re_string_single_close(const char* src);
170
+ const char* re_string_uri_open(const char* src);
171
+ const char* re_string_uri_close(const char* src);
172
+
173
+ // Match a line comment.
174
+ const char* line_comment(const char* src);
175
+
176
+ // Match a block comment.
177
+ const char* block_comment(const char* src);
178
+ // Match either.
179
+ const char* comment(const char* src);
180
+ // Match double- and single-quoted strings.
181
+ const char* double_quoted_string(const char* src);
182
+ const char* single_quoted_string(const char* src);
183
+ const char* quoted_string(const char* src);
184
+ // Match interpolants.
185
+ const char* interpolant(const char* src);
186
+ // Match number prefix ([\+\-]+)
187
+ const char* number_prefix(const char* src);
188
+
189
+ // Match zero plus white-space or line_comments
190
+ const char* optional_css_whitespace(const char* src);
191
+ const char* css_whitespace(const char* src);
192
+ // Match optional_css_whitespace plus block_comments
193
+ const char* optional_css_comments(const char* src);
194
+ const char* css_comments(const char* src);
195
+
196
+ // Match one backslash escaped char
197
+ const char* escape_seq(const char* src);
198
+
199
+ // Match CSS css variables.
200
+ const char* custom_property_name(const char* src);
201
+ // Match a CSS identifier.
202
+ const char* identifier(const char* src);
203
+ const char* identifier_alpha(const char* src);
204
+ const char* identifier_alnum(const char* src);
205
+ const char* strict_identifier(const char* src);
206
+ const char* strict_identifier_alpha(const char* src);
207
+ const char* strict_identifier_alnum(const char* src);
208
+ // Match a CSS unit identifier.
209
+ const char* one_unit(const char* src);
210
+ const char* multiple_units(const char* src);
211
+ const char* unit_identifier(const char* src);
212
+ // const char* strict_identifier_alnums(const char* src);
213
+ // Match reference selector.
214
+ const char* re_reference_combinator(const char* src);
215
+ const char* static_reference_combinator(const char* src);
216
+ const char* schema_reference_combinator(const char* src);
217
+
218
+ // Match interpolant schemas
219
+ const char* identifier_schema(const char* src);
220
+ const char* value_schema(const char* src);
221
+ const char* sass_value(const char* src);
222
+ // const char* filename(const char* src);
223
+ // const char* filename_schema(const char* src);
224
+ // const char* url_schema(const char* src);
225
+ // const char* url_value(const char* src);
226
+ const char* vendor_prefix(const char* src);
227
+
228
+ const char* re_special_directive(const char* src);
229
+ const char* re_prefixed_directive(const char* src);
230
+ const char* re_almost_any_value_token(const char* src);
231
+
232
+ // Match CSS '@' keywords.
233
+ const char* at_keyword(const char* src);
234
+ const char* kwd_import(const char* src);
235
+ const char* kwd_at_root(const char* src);
236
+ const char* kwd_with_directive(const char* src);
237
+ const char* kwd_without_directive(const char* src);
238
+ const char* kwd_media(const char* src);
239
+ const char* kwd_supports_directive(const char* src);
240
+ // const char* keyframes(const char* src);
241
+ // const char* keyf(const char* src);
242
+ const char* kwd_mixin(const char* src);
243
+ const char* kwd_function(const char* src);
244
+ const char* kwd_return_directive(const char* src);
245
+ const char* kwd_include_directive(const char* src);
246
+ const char* kwd_content_directive(const char* src);
247
+ const char* kwd_charset_directive(const char* src);
248
+ const char* kwd_extend(const char* src);
249
+
250
+ const char* unicode_seq(const char* src);
251
+
252
+ const char* kwd_if_directive(const char* src);
253
+ const char* kwd_else_directive(const char* src);
254
+ const char* elseif_directive(const char* src);
255
+
256
+ const char* kwd_for_directive(const char* src);
257
+ const char* kwd_from(const char* src);
258
+ const char* kwd_to(const char* src);
259
+ const char* kwd_through(const char* src);
260
+
261
+ const char* kwd_each_directive(const char* src);
262
+ const char* kwd_in(const char* src);
263
+
264
+ const char* kwd_while_directive(const char* src);
265
+
266
+ const char* re_nothing(const char* src);
267
+
268
+ const char* re_special_fun(const char* src);
269
+
270
+ const char* kwd_warn(const char* src);
271
+ const char* kwd_err(const char* src);
272
+ const char* kwd_dbg(const char* src);
273
+
274
+ const char* kwd_null(const char* src);
275
+
276
+ const char* re_selector_list(const char* src);
277
+ const char* re_type_selector(const char* src);
278
+ const char* re_static_expression(const char* src);
279
+
280
+ // identifier that can start with hyphens
281
+ const char* css_identifier(const char* src);
282
+ const char* css_ip_identifier(const char* src);
283
+
284
+ // Match CSS type selectors
285
+ const char* namespace_schema(const char* src);
286
+ const char* namespace_prefix(const char* src);
287
+ const char* type_selector(const char* src);
288
+ const char* hyphens_and_identifier(const char* src);
289
+ const char* hyphens_and_name(const char* src);
290
+ const char* universal(const char* src);
291
+ // Match CSS id names.
292
+ const char* id_name(const char* src);
293
+ // Match CSS class names.
294
+ const char* class_name(const char* src);
295
+ // Attribute name in an attribute selector
296
+ const char* attribute_name(const char* src);
297
+ // Match placeholder selectors.
298
+ const char* placeholder(const char* src);
299
+ // Match CSS numeric constants.
300
+ const char* op(const char* src);
301
+ const char* sign(const char* src);
302
+ const char* unsigned_number(const char* src);
303
+ const char* number(const char* src);
304
+ const char* coefficient(const char* src);
305
+ const char* binomial(const char* src);
306
+ const char* percentage(const char* src);
307
+ const char* ampersand(const char* src);
308
+ const char* dimension(const char* src);
309
+ const char* hex(const char* src);
310
+ const char* hexa(const char* src);
311
+ const char* hex0(const char* src);
312
+ // const char* rgb_prefix(const char* src);
313
+ // Match CSS uri specifiers.
314
+ const char* uri_prefix(const char* src);
315
+ // Match CSS "!important" keyword.
316
+ const char* kwd_important(const char* src);
317
+ // Match CSS "!optional" keyword.
318
+ const char* kwd_optional(const char* src);
319
+ // Match Sass "!default" keyword.
320
+ const char* default_flag(const char* src);
321
+ const char* global_flag(const char* src);
322
+ // Match CSS pseudo-class/element prefixes
323
+ const char* pseudo_prefix(const char* src);
324
+ // Match CSS function call openers.
325
+ const char* re_functional(const char* src);
326
+ const char* re_pseudo_selector(const char* src);
327
+ const char* functional_schema(const char* src);
328
+ const char* pseudo_not(const char* src);
329
+ // Match CSS 'odd' and 'even' keywords for functional pseudo-classes.
330
+ const char* even(const char* src);
331
+ const char* odd(const char* src);
332
+ // Match CSS attribute-matching operators.
333
+ const char* exact_match(const char* src);
334
+ const char* class_match(const char* src);
335
+ const char* dash_match(const char* src);
336
+ const char* prefix_match(const char* src);
337
+ const char* suffix_match(const char* src);
338
+ const char* substring_match(const char* src);
339
+ // Match CSS combinators.
340
+ // const char* adjacent_to(const char* src);
341
+ // const char* precedes(const char* src);
342
+ // const char* parent_of(const char* src);
343
+ // const char* ancestor_of(const char* src);
344
+
345
+ // Match SCSS variable names.
346
+ const char* variable(const char* src);
347
+ const char* calc_fn_call(const char* src);
348
+
349
+ // IE stuff
350
+ const char* ie_progid(const char* src);
351
+ const char* ie_expression(const char* src);
352
+ const char* ie_property(const char* src);
353
+ const char* ie_keyword_arg(const char* src);
354
+ const char* ie_keyword_arg_value(const char* src);
355
+ const char* ie_keyword_arg_property(const char* src);
356
+
357
+ // characters that terminate parsing of a list
358
+ const char* list_terminator(const char* src);
359
+ const char* space_list_terminator(const char* src);
360
+
361
+ // match url()
362
+ const char* H(const char* src);
363
+ const char* W(const char* src);
364
+ // `UNICODE` makes VS sad
365
+ const char* UUNICODE(const char* src);
366
+ const char* NONASCII(const char* src);
367
+ const char* ESCAPE(const char* src);
368
+ const char* real_uri(const char* src);
369
+ const char* real_uri_suffix(const char* src);
370
+ // const char* real_uri_prefix(const char* src);
371
+ const char* real_uri_value(const char* src);
372
+
373
+ // Path matching functions.
374
+ // const char* folder(const char* src);
375
+ // const char* folders(const char* src);
376
+
377
+
378
+ const char* static_string(const char* src);
379
+ const char* static_component(const char* src);
380
+ const char* static_property(const char* src);
381
+ const char* static_value(const char* src);
382
+
383
+ const char* css_variable_value(const char* src);
384
+ const char* css_variable_top_level_value(const char* src);
385
+
386
+ // Utility functions for finding and counting characters in a string.
387
+ template<char c>
388
+ const char* find_first(const char* src) {
389
+ while (*src && *src != c) ++src;
390
+ return *src ? src : 0;
391
+ }
392
+ template<prelexer mx>
393
+ const char* find_first(const char* src) {
394
+ while (*src && !mx(src)) ++src;
395
+ return *src ? src : 0;
396
+ }
397
+ template<prelexer mx>
398
+ const char* find_first_in_interval(const char* beg, const char* end) {
399
+ bool esc = false;
400
+ while ((beg < end) && *beg) {
401
+ if (esc) esc = false;
402
+ else if (*beg == '\\') esc = true;
403
+ else if (mx(beg)) return beg;
404
+ ++beg;
405
+ }
406
+ return 0;
407
+ }
408
+ template<prelexer mx, prelexer skip>
409
+ const char* find_first_in_interval(const char* beg, const char* end) {
410
+ bool esc = false;
411
+ while ((beg < end) && *beg) {
412
+ if (esc) esc = false;
413
+ else if (*beg == '\\') esc = true;
414
+ else if (const char* pos = skip(beg)) beg = pos;
415
+ else if (mx(beg)) return beg;
416
+ ++beg;
417
+ }
418
+ return 0;
419
+ }
420
+ template <prelexer mx>
421
+ unsigned int count_interval(const char* beg, const char* end) {
422
+ unsigned int counter = 0;
423
+ bool esc = false;
424
+ while (beg < end && *beg) {
425
+ const char* p;
426
+ if (esc) {
427
+ esc = false;
428
+ ++beg;
429
+ } else if (*beg == '\\') {
430
+ esc = true;
431
+ ++beg;
432
+ } else if ((p = mx(beg))) {
433
+ ++counter;
434
+ beg = p;
435
+ }
436
+ else {
437
+ ++beg;
438
+ }
439
+ }
440
+ return counter;
441
+ }
442
+
443
+ template <size_t size, prelexer mx, prelexer pad>
444
+ const char* padded_token(const char* src)
445
+ {
446
+ size_t got = 0;
447
+ const char* pos = src;
448
+ while (got < size) {
449
+ if (!mx(pos)) break;
450
+ ++ pos; ++ got;
451
+ }
452
+ while (got < size) {
453
+ if (!pad(pos)) break;
454
+ ++ pos; ++ got;
455
+ }
456
+ return got ? pos : 0;
457
+ }
458
+
459
+ template <size_t min, size_t max, prelexer mx>
460
+ const char* minmax_range(const char* src)
461
+ {
462
+ size_t got = 0;
463
+ const char* pos = src;
464
+ while (got < max) {
465
+ if (!mx(pos)) break;
466
+ ++ pos; ++ got;
467
+ }
468
+ if (got < min) return 0;
469
+ if (got > max) return 0;
470
+ return pos;
471
+ }
472
+
473
+ template <char min, char max>
474
+ const char* char_range(const char* src)
475
+ {
476
+ if (*src < min) return 0;
477
+ if (*src > max) return 0;
478
+ return src + 1;
479
+ }
480
+
481
+ }
482
+ }
483
+
484
+ #endif
@@ -0,0 +1,86 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
3
+ #include "sass.hpp"
4
+ #include "ast.hpp"
5
+
6
+ #include "remove_placeholders.hpp"
7
+
8
+ namespace Sass {
9
+
10
+ Remove_Placeholders::Remove_Placeholders()
11
+ { }
12
+
13
+ void Remove_Placeholders::operator()(Block* b) {
14
+ for (size_t i = 0, L = b->length(); i < L; ++i) {
15
+ if (b->get(i)) b->get(i)->perform(this);
16
+ }
17
+ }
18
+
19
+ void Remove_Placeholders::remove_placeholders(SimpleSelector* simple)
20
+ {
21
+ if (PseudoSelector * pseudo = simple->getPseudoSelector()) {
22
+ if (pseudo->selector()) remove_placeholders(pseudo->selector());
23
+ }
24
+ }
25
+
26
+ void Remove_Placeholders::remove_placeholders(CompoundSelector* compound)
27
+ {
28
+ for (size_t i = 0, L = compound->length(); i < L; ++i) {
29
+ if (compound->get(i)) remove_placeholders(compound->get(i));
30
+ }
31
+ listEraseItemIf(compound->elements(), listIsEmpty<SimpleSelector>);
32
+ }
33
+
34
+ void Remove_Placeholders::remove_placeholders(ComplexSelector* complex)
35
+ {
36
+ if (complex->has_placeholder()) {
37
+ complex->clear(); // remove all
38
+ }
39
+ else {
40
+ for (size_t i = 0, L = complex->length(); i < L; ++i) {
41
+ if (CompoundSelector * compound = complex->get(i)->getCompound()) {
42
+ if (compound) remove_placeholders(compound);
43
+ }
44
+ }
45
+ listEraseItemIf(complex->elements(), listIsEmpty<SelectorComponent>);
46
+ }
47
+ }
48
+
49
+ SelectorList* Remove_Placeholders::remove_placeholders(SelectorList* sl)
50
+ {
51
+ for (size_t i = 0, L = sl->length(); i < L; ++i) {
52
+ if (sl->get(i)) remove_placeholders(sl->get(i));
53
+ }
54
+ listEraseItemIf(sl->elements(), listIsEmpty<ComplexSelector>);
55
+ return sl;
56
+ }
57
+
58
+ void Remove_Placeholders::operator()(CssMediaRule* rule)
59
+ {
60
+ if (rule->block()) operator()(rule->block());
61
+ }
62
+
63
+ void Remove_Placeholders::operator()(StyleRule* r)
64
+ {
65
+ if (SelectorListObj sl = r->selector()) {
66
+ // Set the new placeholder selector list
67
+ r->selector((remove_placeholders(sl)));
68
+ }
69
+ // Iterate into child blocks
70
+ Block_Obj b = r->block();
71
+ for (size_t i = 0, L = b->length(); i < L; ++i) {
72
+ if (b->get(i)) { b->get(i)->perform(this); }
73
+ }
74
+ }
75
+
76
+ void Remove_Placeholders::operator()(SupportsRule* m)
77
+ {
78
+ if (m->block()) operator()(m->block());
79
+ }
80
+
81
+ void Remove_Placeholders::operator()(AtRule* a)
82
+ {
83
+ if (a->block()) a->block()->perform(this);
84
+ }
85
+
86
+ }
@@ -0,0 +1,37 @@
1
+ #ifndef SASS_REMOVE_PLACEHOLDERS_H
2
+ #define SASS_REMOVE_PLACEHOLDERS_H
3
+
4
+ #include "ast_fwd_decl.hpp"
5
+ #include "operation.hpp"
6
+
7
+ namespace Sass {
8
+
9
+ class Remove_Placeholders : public Operation_CRTP<void, Remove_Placeholders> {
10
+
11
+ public:
12
+
13
+ SelectorList* remove_placeholders(SelectorList*);
14
+ void remove_placeholders(SimpleSelector* simple);
15
+ void remove_placeholders(CompoundSelector* complex);
16
+ void remove_placeholders(ComplexSelector* complex);
17
+
18
+
19
+ public:
20
+ Remove_Placeholders();
21
+ ~Remove_Placeholders() { }
22
+
23
+ void operator()(Block*);
24
+ void operator()(StyleRule*);
25
+ void operator()(CssMediaRule*);
26
+ void operator()(SupportsRule*);
27
+ void operator()(AtRule*);
28
+
29
+ // ignore missed types
30
+ template <typename U>
31
+ void fallback(U x) {}
32
+
33
+ };
34
+
35
+ }
36
+
37
+ #endif