sassc 2.3.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +5 -0
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/context.h +3 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +117 -117
- data/ext/libsass/src/ast.hpp +160 -162
- data/ext/libsass/src/ast_def_macros.hpp +10 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +2 -2
- data/ext/libsass/src/ast_fwd_decl.hpp +61 -52
- data/ext/libsass/src/ast_helpers.hpp +5 -5
- data/ext/libsass/src/ast_sel_cmp.cpp +18 -18
- data/ext/libsass/src/ast_sel_super.cpp +52 -52
- data/ext/libsass/src/ast_sel_unify.cpp +16 -16
- data/ext/libsass/src/ast_sel_weave.cpp +62 -62
- data/ext/libsass/src/ast_selectors.cpp +87 -77
- data/ext/libsass/src/ast_selectors.hpp +72 -62
- data/ext/libsass/src/ast_supports.cpp +35 -35
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +58 -58
- data/ext/libsass/src/ast_values.hpp +75 -75
- data/ext/libsass/src/backtrace.cpp +9 -9
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +2 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +17 -17
- data/ext/libsass/src/bind.hpp +1 -1
- data/ext/libsass/src/c2ast.cpp +3 -3
- data/ext/libsass/src/c2ast.hpp +1 -1
- data/ext/libsass/src/check_nesting.cpp +36 -36
- data/ext/libsass/src/check_nesting.hpp +2 -2
- data/ext/libsass/src/color_maps.cpp +5 -5
- data/ext/libsass/src/color_maps.hpp +1 -1
- data/ext/libsass/src/context.cpp +63 -60
- data/ext/libsass/src/context.hpp +33 -33
- data/ext/libsass/src/cssize.cpp +30 -29
- data/ext/libsass/src/cssize.hpp +13 -13
- data/ext/libsass/src/dart_helpers.hpp +5 -5
- data/ext/libsass/src/debugger.hpp +127 -128
- data/ext/libsass/src/emitter.cpp +12 -12
- data/ext/libsass/src/emitter.hpp +10 -10
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +24 -24
- data/ext/libsass/src/error_handling.cpp +42 -42
- data/ext/libsass/src/error_handling.hpp +38 -50
- data/ext/libsass/src/eval.cpp +138 -132
- data/ext/libsass/src/eval.hpp +17 -17
- data/ext/libsass/src/eval_selectors.cpp +3 -3
- data/ext/libsass/src/expand.cpp +70 -64
- data/ext/libsass/src/expand.hpp +12 -12
- data/ext/libsass/src/extender.cpp +55 -53
- data/ext/libsass/src/extender.hpp +14 -14
- data/ext/libsass/src/file.cpp +66 -58
- data/ext/libsass/src/file.hpp +23 -25
- data/ext/libsass/src/fn_colors.cpp +9 -9
- data/ext/libsass/src/fn_lists.cpp +18 -18
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +15 -15
- data/ext/libsass/src/fn_numbers.cpp +7 -7
- data/ext/libsass/src/fn_selectors.cpp +8 -8
- data/ext/libsass/src/fn_strings.cpp +34 -22
- data/ext/libsass/src/fn_utils.cpp +29 -26
- data/ext/libsass/src/fn_utils.hpp +10 -10
- data/ext/libsass/src/inspect.cpp +35 -34
- data/ext/libsass/src/inspect.hpp +21 -21
- data/ext/libsass/src/lexer.cpp +3 -1
- data/ext/libsass/src/listize.cpp +2 -2
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
- data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +18 -6
- data/ext/libsass/src/operation.hpp +44 -44
- data/ext/libsass/src/operators.cpp +18 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +18 -18
- data/ext/libsass/src/output.cpp +16 -16
- data/ext/libsass/src/output.hpp +5 -5
- data/ext/libsass/src/parser.cpp +327 -345
- data/ext/libsass/src/parser.hpp +77 -87
- data/ext/libsass/src/parser_selectors.cpp +6 -6
- data/ext/libsass/src/permutate.hpp +39 -15
- data/ext/libsass/src/plugins.cpp +7 -7
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +7 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/remove_placeholders.cpp +4 -4
- data/ext/libsass/src/remove_placeholders.hpp +3 -3
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +9 -5
- data/ext/libsass/src/sass_context.cpp +52 -34
- data/ext/libsass/src/sass_values.cpp +8 -10
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +22 -18
- data/ext/libsass/src/source_map.hpp +12 -9
- data/ext/libsass/src/units.cpp +19 -19
- data/ext/libsass/src/units.hpp +8 -8
- data/ext/libsass/src/utf8_string.cpp +9 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +38 -38
- data/ext/libsass/src/util.hpp +18 -18
- data/ext/libsass/src/util_string.cpp +13 -13
- data/ext/libsass/src/util_string.hpp +9 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/native.rb +3 -5
- data/lib/sassc/version.rb +1 -1
- data/test/native_test.rb +4 -4
- metadata +14 -5
- data/lib/sassc/native/lib_c.rb +0 -21
data/ext/libsass/src/parser.hpp
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
#include "context.hpp"
|
14
14
|
#include "position.hpp"
|
15
15
|
#include "prelexer.hpp"
|
16
|
+
#include "source.hpp"
|
16
17
|
|
17
18
|
#ifndef MAX_NESTING
|
18
19
|
// Note that this limit is not an exact science
|
@@ -34,41 +35,31 @@ struct Lookahead {
|
|
34
35
|
|
35
36
|
namespace Sass {
|
36
37
|
|
37
|
-
class Parser : public
|
38
|
+
class Parser : public SourceSpan {
|
38
39
|
public:
|
39
40
|
|
40
41
|
enum Scope { Root, Mixin, Function, Media, Control, Properties, Rules, AtRoot };
|
41
42
|
|
42
43
|
Context& ctx;
|
43
|
-
|
44
|
-
|
45
|
-
|
44
|
+
sass::vector<Block_Obj> block_stack;
|
45
|
+
sass::vector<Scope> stack;
|
46
|
+
SourceDataObj source;
|
47
|
+
const char* begin;
|
46
48
|
const char* position;
|
47
49
|
const char* end;
|
48
|
-
|
49
|
-
|
50
|
-
|
50
|
+
Offset before_token;
|
51
|
+
Offset after_token;
|
52
|
+
SourceSpan pstate;
|
51
53
|
Backtraces traces;
|
52
54
|
size_t indentation;
|
53
55
|
size_t nestings;
|
54
56
|
bool allow_parent;
|
55
|
-
|
56
57
|
Token lexed;
|
57
58
|
|
58
|
-
Parser(
|
59
|
-
: ParserState(pstate), ctx(ctx), block_stack(), stack(0),
|
60
|
-
source(0), position(0), end(0), before_token(pstate), after_token(pstate),
|
61
|
-
pstate(pstate), traces(traces), indentation(0), nestings(0), allow_parent(allow_parent)
|
62
|
-
{
|
63
|
-
stack.push_back(Scope::Root);
|
64
|
-
}
|
59
|
+
Parser(SourceData* source, Context& ctx, Backtraces, bool allow_parent = true);
|
65
60
|
|
66
|
-
// static Parser from_string(const std::string& src, Context& ctx, ParserState pstate = ParserState("[STRING]"));
|
67
|
-
static Parser from_c_str(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[CSTRING]"), const char* source = nullptr, bool allow_parent = true);
|
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);
|
69
|
-
static Parser from_token(Token t, Context& ctx, Backtraces, ParserState pstate = ParserState("[TOKEN]"), const char* source = nullptr);
|
70
61
|
// special static parsers to convert strings into certain selectors
|
71
|
-
static SelectorListObj parse_selector(
|
62
|
+
static SelectorListObj parse_selector(SourceData* source, Context& ctx, Backtraces, bool allow_parent = true);
|
72
63
|
|
73
64
|
#ifdef __clang__
|
74
65
|
|
@@ -84,7 +75,7 @@ namespace Sass {
|
|
84
75
|
|
85
76
|
|
86
77
|
// skip current token and next whitespace
|
87
|
-
// moves
|
78
|
+
// moves SourceSpan right before next token
|
88
79
|
void advanceToNextToken();
|
89
80
|
|
90
81
|
bool peek_newline(const char* start = 0);
|
@@ -189,7 +180,7 @@ namespace Sass {
|
|
189
180
|
after_token.add(it_before_token, it_after_token);
|
190
181
|
|
191
182
|
// ToDo: could probably do this incremental on original object (API wants offset?)
|
192
|
-
pstate =
|
183
|
+
pstate = SourceSpan(source, before_token, after_token - before_token);
|
193
184
|
|
194
185
|
// advance internal char iterator
|
195
186
|
return position = it_after_token;
|
@@ -206,9 +197,9 @@ namespace Sass {
|
|
206
197
|
Token prev = lexed;
|
207
198
|
// store previous pointer
|
208
199
|
const char* oldpos = position;
|
209
|
-
|
210
|
-
|
211
|
-
|
200
|
+
Offset bt = before_token;
|
201
|
+
Offset at = after_token;
|
202
|
+
SourceSpan op = pstate;
|
212
203
|
// throw away comments
|
213
204
|
// update srcmap position
|
214
205
|
lex < Prelexer::css_comments >();
|
@@ -240,13 +231,12 @@ namespace Sass {
|
|
240
231
|
|
241
232
|
#endif
|
242
233
|
|
243
|
-
void error(
|
244
|
-
void error(std::string msg, Position pos);
|
234
|
+
void error(sass::string msg);
|
245
235
|
// generate message with given and expected sample
|
246
236
|
// text before and in the middle are configurable
|
247
|
-
void css_error(const
|
248
|
-
const
|
249
|
-
const
|
237
|
+
void css_error(const sass::string& msg,
|
238
|
+
const sass::string& prefix = " after ",
|
239
|
+
const sass::string& middle = ", was: ",
|
250
240
|
const bool trim = true);
|
251
241
|
void read_bom();
|
252
242
|
|
@@ -259,34 +249,34 @@ namespace Sass {
|
|
259
249
|
Arguments_Obj parse_arguments();
|
260
250
|
Argument_Obj parse_argument();
|
261
251
|
Assignment_Obj parse_assignment();
|
262
|
-
|
252
|
+
StyleRuleObj parse_ruleset(Lookahead lookahead);
|
263
253
|
SelectorListObj parseSelectorList(bool chroot);
|
264
254
|
ComplexSelectorObj parseComplexSelector(bool chroot);
|
265
255
|
Selector_Schema_Obj parse_selector_schema(const char* end_of_selector, bool chroot);
|
266
256
|
CompoundSelectorObj parseCompoundSelector();
|
267
257
|
SimpleSelectorObj parse_simple_selector();
|
268
|
-
|
258
|
+
PseudoSelectorObj parse_negated_selector2();
|
269
259
|
Expression* parse_binominal();
|
270
260
|
SimpleSelectorObj parse_pseudo_selector();
|
271
|
-
|
261
|
+
AttributeSelectorObj parse_attribute_selector();
|
272
262
|
Block_Obj parse_block(bool is_root = false);
|
273
263
|
Block_Obj parse_css_block(bool is_root = false);
|
274
264
|
bool parse_block_nodes(bool is_root = false);
|
275
265
|
bool parse_block_node(bool is_root = false);
|
276
266
|
|
277
267
|
Declaration_Obj parse_declaration();
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
268
|
+
ExpressionObj parse_map();
|
269
|
+
ExpressionObj parse_bracket_list();
|
270
|
+
ExpressionObj parse_list(bool delayed = false);
|
271
|
+
ExpressionObj parse_comma_list(bool delayed = false);
|
272
|
+
ExpressionObj parse_space_list();
|
273
|
+
ExpressionObj parse_disjunction();
|
274
|
+
ExpressionObj parse_conjunction();
|
275
|
+
ExpressionObj parse_relation();
|
276
|
+
ExpressionObj parse_expression();
|
277
|
+
ExpressionObj parse_operators();
|
278
|
+
ExpressionObj parse_factor();
|
279
|
+
ExpressionObj parse_value();
|
290
280
|
Function_Call_Obj parse_calc_function();
|
291
281
|
Function_Call_Obj parse_function_call();
|
292
282
|
Function_Call_Obj parse_function_call_schema();
|
@@ -294,49 +284,49 @@ namespace Sass {
|
|
294
284
|
String_Obj parse_url_function_argument();
|
295
285
|
String_Obj parse_interpolated_chunk(Token, bool constant = false, bool css = true);
|
296
286
|
String_Obj parse_string();
|
297
|
-
|
287
|
+
ValueObj parse_static_value();
|
298
288
|
String_Schema_Obj parse_css_variable_value();
|
299
289
|
String_Obj parse_ie_property();
|
300
290
|
String_Obj parse_ie_keyword_arg();
|
301
291
|
String_Schema_Obj parse_value_schema(const char* stop);
|
302
292
|
String_Obj parse_identifier_schema();
|
303
293
|
If_Obj parse_if_directive(bool else_if = false);
|
304
|
-
|
305
|
-
|
306
|
-
|
294
|
+
ForRuleObj parse_for_directive();
|
295
|
+
EachRuleObj parse_each_directive();
|
296
|
+
WhileRuleObj parse_while_directive();
|
307
297
|
MediaRule_Obj parseMediaRule();
|
308
|
-
|
309
|
-
|
298
|
+
sass::vector<CssMediaQuery_Obj> parseCssMediaQueries();
|
299
|
+
sass::string parseIdentifier();
|
310
300
|
CssMediaQuery_Obj parseCssMediaQuery();
|
311
301
|
Return_Obj parse_return_directive();
|
312
302
|
Content_Obj parse_content_directive();
|
313
303
|
void parse_charset_directive();
|
314
304
|
List_Obj parse_media_queries();
|
315
305
|
Media_Query_Obj parse_media_query();
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
306
|
+
Media_Query_ExpressionObj parse_media_expression();
|
307
|
+
SupportsRuleObj parse_supports_directive();
|
308
|
+
SupportsConditionObj parse_supports_condition(bool top_level);
|
309
|
+
SupportsConditionObj parse_supports_negation();
|
310
|
+
SupportsConditionObj parse_supports_operator(bool top_level);
|
311
|
+
SupportsConditionObj parse_supports_interpolation();
|
312
|
+
SupportsConditionObj parse_supports_declaration();
|
313
|
+
SupportsConditionObj parse_supports_condition_in_parens(bool parens_required);
|
314
|
+
AtRootRuleObj parse_at_root_block();
|
325
315
|
At_Root_Query_Obj parse_at_root_query();
|
326
316
|
String_Schema_Obj parse_almost_any_value();
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
317
|
+
AtRuleObj parse_directive();
|
318
|
+
WarningRuleObj parse_warning();
|
319
|
+
ErrorRuleObj parse_error();
|
320
|
+
DebugRuleObj parse_debug();
|
331
321
|
|
332
|
-
Value* color_or_string(const
|
322
|
+
Value* color_or_string(const sass::string& lexed) const;
|
333
323
|
|
334
324
|
// be more like ruby sass
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
325
|
+
ExpressionObj lex_almost_any_value_token();
|
326
|
+
ExpressionObj lex_almost_any_value_chars();
|
327
|
+
ExpressionObj lex_interp_string();
|
328
|
+
ExpressionObj lex_interp_uri();
|
329
|
+
ExpressionObj lex_interpolation();
|
340
330
|
|
341
331
|
// these will throw errors
|
342
332
|
Token lex_variable();
|
@@ -348,28 +338,28 @@ namespace Sass {
|
|
348
338
|
Lookahead lookahead_for_selector(const char* start = 0);
|
349
339
|
Lookahead lookahead_for_include(const char* start = 0);
|
350
340
|
|
351
|
-
|
352
|
-
|
341
|
+
ExpressionObj fold_operands(ExpressionObj base, sass::vector<ExpressionObj>& operands, Operand op);
|
342
|
+
ExpressionObj fold_operands(ExpressionObj base, sass::vector<ExpressionObj>& operands, sass::vector<Operand>& ops, size_t i = 0);
|
353
343
|
|
354
|
-
void throw_syntax_error(
|
355
|
-
void throw_read_error(
|
344
|
+
void throw_syntax_error(sass::string message, size_t ln = 0);
|
345
|
+
void throw_read_error(sass::string message, size_t ln = 0);
|
356
346
|
|
357
347
|
|
358
348
|
template <Prelexer::prelexer open, Prelexer::prelexer close>
|
359
|
-
|
349
|
+
ExpressionObj lex_interp()
|
360
350
|
{
|
361
351
|
if (lex < open >(false)) {
|
362
352
|
String_Schema_Obj schema = SASS_MEMORY_NEW(String_Schema, pstate);
|
363
|
-
// std::cerr << "LEX [[" <<
|
353
|
+
// std::cerr << "LEX [[" << sass::string(lexed) << "]]\n";
|
364
354
|
schema->append(SASS_MEMORY_NEW(String_Constant, pstate, lexed));
|
365
355
|
if (position[0] == '#' && position[1] == '{') {
|
366
|
-
|
356
|
+
ExpressionObj itpl = lex_interpolation();
|
367
357
|
if (!itpl.isNull()) schema->append(itpl);
|
368
358
|
while (lex < close >(false)) {
|
369
|
-
// std::cerr << "LEX [[" <<
|
359
|
+
// std::cerr << "LEX [[" << sass::string(lexed) << "]]\n";
|
370
360
|
schema->append(SASS_MEMORY_NEW(String_Constant, pstate, lexed));
|
371
361
|
if (position[0] == '#' && position[1] == '{') {
|
372
|
-
|
362
|
+
ExpressionObj itpl = lex_interpolation();
|
373
363
|
if (!itpl.isNull()) schema->append(itpl);
|
374
364
|
} else {
|
375
365
|
return schema;
|
@@ -383,15 +373,15 @@ namespace Sass {
|
|
383
373
|
}
|
384
374
|
|
385
375
|
public:
|
386
|
-
static Number* lexed_number(const
|
387
|
-
static Number* lexed_dimension(const
|
388
|
-
static Number* lexed_percentage(const
|
389
|
-
static Value* lexed_hex_color(const
|
376
|
+
static Number* lexed_number(const SourceSpan& pstate, const sass::string& parsed);
|
377
|
+
static Number* lexed_dimension(const SourceSpan& pstate, const sass::string& parsed);
|
378
|
+
static Number* lexed_percentage(const SourceSpan& pstate, const sass::string& parsed);
|
379
|
+
static Value* lexed_hex_color(const SourceSpan& pstate, const sass::string& parsed);
|
390
380
|
private:
|
391
|
-
Number* lexed_number(const
|
392
|
-
Number* lexed_dimension(const
|
393
|
-
Number* lexed_percentage(const
|
394
|
-
Value* lexed_hex_color(const
|
381
|
+
Number* lexed_number(const sass::string& parsed) { return lexed_number(pstate, parsed); };
|
382
|
+
Number* lexed_dimension(const sass::string& parsed) { return lexed_dimension(pstate, parsed); };
|
383
|
+
Number* lexed_percentage(const sass::string& parsed) { return lexed_percentage(pstate, parsed); };
|
384
|
+
Value* lexed_hex_color(const sass::string& parsed) { return lexed_hex_color(pstate, parsed); };
|
395
385
|
|
396
386
|
static const char* re_attr_sensitive_close(const char* src);
|
397
387
|
static const char* re_attr_insensitive_close(const char* src);
|
@@ -139,16 +139,16 @@ namespace Sass {
|
|
139
139
|
{
|
140
140
|
// parent selector only allowed at start
|
141
141
|
// upcoming Sass may allow also trailing
|
142
|
-
|
143
|
-
|
142
|
+
SourceSpan state(pstate);
|
143
|
+
sass::string found("&");
|
144
144
|
if (lex < identifier >()) {
|
145
|
-
found +=
|
145
|
+
found += sass::string(lexed);
|
146
146
|
}
|
147
|
-
|
147
|
+
sass::string sel(seq->hasRealParent() ? "&" : "");
|
148
148
|
if (!seq->empty()) { sel = seq->last()->to_string({ NESTED, 5 }); }
|
149
149
|
// ToDo: parser should throw parser exceptions
|
150
150
|
error("Invalid CSS after \"" + sel + "\": expected \"{\", was \"" + found + "\"\n\n"
|
151
|
-
"\"" + found + "\" may only be used at the beginning of a compound selector."
|
151
|
+
"\"" + found + "\" may only be used at the beginning of a compound selector.");
|
152
152
|
}
|
153
153
|
// parse functional
|
154
154
|
else if (match < re_functional >())
|
@@ -159,7 +159,7 @@ namespace Sass {
|
|
159
159
|
// parse type selector
|
160
160
|
else if (lex< re_type_selector >(false))
|
161
161
|
{
|
162
|
-
seq->append(SASS_MEMORY_NEW(
|
162
|
+
seq->append(SASS_MEMORY_NEW(TypeSelector, pstate, lexed));
|
163
163
|
}
|
164
164
|
// peek for abort conditions
|
165
165
|
else if (peek< spaces >()) break;
|
@@ -7,37 +7,42 @@ namespace Sass {
|
|
7
7
|
|
8
8
|
// Returns a list of all possible paths through the given lists.
|
9
9
|
//
|
10
|
-
// For example, given `[[1, 2], [3, 4], [5]]`, this returns:
|
10
|
+
// For example, given `[[1, 2], [3, 4], [5, 6]]`, this returns:
|
11
11
|
//
|
12
12
|
// ```
|
13
13
|
// [[1, 3, 5],
|
14
14
|
// [2, 3, 5],
|
15
15
|
// [1, 4, 5],
|
16
|
-
// [2, 4, 5]
|
16
|
+
// [2, 4, 5],
|
17
|
+
// [1, 3, 6],
|
18
|
+
// [2, 3, 6],
|
19
|
+
// [1, 4, 6],
|
20
|
+
// [2, 4, 6]]
|
17
21
|
// ```
|
18
22
|
//
|
19
23
|
// Note: called `paths` in dart-sass
|
20
24
|
template <class T>
|
21
|
-
|
22
|
-
const
|
25
|
+
sass::vector<sass::vector<T>> permutate(
|
26
|
+
const sass::vector<sass::vector<T>>& in)
|
23
27
|
{
|
24
28
|
|
25
29
|
size_t L = in.size(), n = 0;
|
26
30
|
|
31
|
+
if (L == 0) return {};
|
27
32
|
// Exit early if any entry is empty
|
28
33
|
for (size_t i = 0; i < L; i += 1) {
|
29
34
|
if (in[i].size() == 0) return {};
|
30
35
|
}
|
31
36
|
|
32
37
|
size_t* state = new size_t[L + 1];
|
33
|
-
|
38
|
+
sass::vector<sass::vector<T>> out;
|
34
39
|
|
35
40
|
// First initialize all states for every permutation group
|
36
41
|
for (size_t i = 0; i < L; i += 1) {
|
37
42
|
state[i] = in[i].size() - 1;
|
38
43
|
}
|
39
44
|
while (true) {
|
40
|
-
|
45
|
+
sass::vector<T> perm;
|
41
46
|
// Create one permutation for state
|
42
47
|
for (size_t i = 0; i < L; i += 1) {
|
43
48
|
perm.push_back(in.at(i).at(in[i].size() - state[i] - 1));
|
@@ -73,19 +78,40 @@ namespace Sass {
|
|
73
78
|
}
|
74
79
|
// EO permutate
|
75
80
|
|
76
|
-
// ToDo: this variant is used in
|
81
|
+
// ToDo: this variant is used in resolveParentSelectors
|
82
|
+
// Returns a list of all possible paths through the given lists.
|
83
|
+
//
|
84
|
+
// For example, given `[[1, 2], [3, 4], [5, 6]]`, this returns:
|
85
|
+
//
|
86
|
+
// ```
|
87
|
+
// [[1, 3, 5],
|
88
|
+
// [1, 3, 6],
|
89
|
+
// [1, 4, 5],
|
90
|
+
// [1, 4, 6],
|
91
|
+
// [2, 3, 5],
|
92
|
+
// [2, 3, 6],
|
93
|
+
// [2, 4, 5],
|
94
|
+
// [2, 4, 6]]
|
95
|
+
// ```
|
96
|
+
//
|
77
97
|
template <class T>
|
78
|
-
|
79
|
-
permutateAlt(const
|
98
|
+
sass::vector<sass::vector<T>>
|
99
|
+
permutateAlt(const sass::vector<sass::vector<T>>& in) {
|
80
100
|
|
81
101
|
size_t L = in.size();
|
82
102
|
size_t n = in.size() - 1;
|
103
|
+
|
104
|
+
if (L == 0) return {};
|
105
|
+
// Exit early if any entry is empty
|
106
|
+
for (size_t i = 0; i < L; i += 1) {
|
107
|
+
if (in[i].size() == 0) return {};
|
108
|
+
}
|
109
|
+
|
83
110
|
size_t* state = new size_t[L];
|
84
|
-
|
111
|
+
sass::vector<sass::vector<T>> out;
|
85
112
|
|
86
113
|
// First initialize all states for every permutation group
|
87
114
|
for (size_t i = 0; i < L; i += 1) {
|
88
|
-
if (in[i].size() == 0) return {};
|
89
115
|
state[i] = in[i].size() - 1;
|
90
116
|
}
|
91
117
|
|
@@ -96,7 +122,7 @@ namespace Sass {
|
|
96
122
|
{ // std::cerr << state[p] << " "; }
|
97
123
|
// std::cerr << "\n";
|
98
124
|
*/
|
99
|
-
|
125
|
+
sass::vector<T> perm;
|
100
126
|
// Create one permutation for state
|
101
127
|
for (size_t i = 0; i < L; i += 1) {
|
102
128
|
perm.push_back(in.at(i).at(in[i].size() - state[i] - 1));
|
@@ -104,10 +130,8 @@ namespace Sass {
|
|
104
130
|
// Current group finished
|
105
131
|
if (state[n] == 0) {
|
106
132
|
// Find position of next decrement
|
107
|
-
while (n > 0 && state[--n] == 0)
|
108
|
-
{
|
133
|
+
while (n > 0 && state[--n] == 0) {}
|
109
134
|
|
110
|
-
}
|
111
135
|
// Check for end condition
|
112
136
|
if (state[n] != 0) {
|
113
137
|
// Decrease next on the left side
|
data/ext/libsass/src/plugins.cpp
CHANGED
@@ -44,18 +44,18 @@ namespace Sass {
|
|
44
44
|
if (!strcmp(our_version, "[na]")) return false;
|
45
45
|
|
46
46
|
// find the position of the second dot
|
47
|
-
size_t pos =
|
48
|
-
if (pos !=
|
47
|
+
size_t pos = sass::string(our_version).find('.', 0);
|
48
|
+
if (pos != sass::string::npos) pos = sass::string(our_version).find('.', pos + 1);
|
49
49
|
|
50
50
|
// if we do not have two dots we fallback to compare complete string
|
51
|
-
if (pos ==
|
51
|
+
if (pos == sass::string::npos) { return strcmp(their_version, our_version) ? 0 : 1; }
|
52
52
|
// otherwise only compare up to the second dot (major versions)
|
53
53
|
else { return strncmp(their_version, our_version, pos) ? 0 : 1; }
|
54
54
|
|
55
55
|
}
|
56
56
|
|
57
57
|
// load one specific plugin
|
58
|
-
bool Plugins::load_plugin (const
|
58
|
+
bool Plugins::load_plugin (const sass::string& path)
|
59
59
|
{
|
60
60
|
|
61
61
|
typedef const char* (*__plugin_version__)(void);
|
@@ -112,7 +112,7 @@ namespace Sass {
|
|
112
112
|
|
113
113
|
}
|
114
114
|
|
115
|
-
size_t Plugins::load_plugins(const
|
115
|
+
size_t Plugins::load_plugins(const sass::string& path)
|
116
116
|
{
|
117
117
|
|
118
118
|
// count plugins
|
@@ -126,7 +126,7 @@ namespace Sass {
|
|
126
126
|
// use wchar (utf16)
|
127
127
|
WIN32_FIND_DATAW data;
|
128
128
|
// trailing slash is guaranteed
|
129
|
-
|
129
|
+
sass::string globsrch(path + "*.dll");
|
130
130
|
// convert to wide chars (utf16) for system call
|
131
131
|
std::wstring wglobsrch(UTF_8::convert_to_utf16(globsrch));
|
132
132
|
HANDLE hFile = FindFirstFileW(wglobsrch.c_str(), &data);
|
@@ -140,7 +140,7 @@ namespace Sass {
|
|
140
140
|
try
|
141
141
|
{
|
142
142
|
// the system will report the filenames with wide chars (utf16)
|
143
|
-
|
143
|
+
sass::string entry = UTF_8::convert_from_utf16(data.cFileName);
|
144
144
|
// check if file ending matches exactly
|
145
145
|
if (!ends_with(entry, ".dll")) continue;
|
146
146
|
// load the plugin and increase counter
|