sassc 2.3.0 → 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.
- 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
|