sassc 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.gitmodules +3 -0
- data/.travis.yml +9 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +24 -0
- data/Rakefile +21 -0
- data/ext/libsass/.editorconfig +15 -0
- data/ext/libsass/.gitattributes +2 -0
- data/ext/libsass/.gitignore +61 -0
- data/ext/libsass/.travis.yml +38 -0
- data/ext/libsass/COPYING +25 -0
- data/ext/libsass/INSTALL +1 -0
- data/ext/libsass/LICENSE +25 -0
- data/ext/libsass/Makefile +223 -0
- data/ext/libsass/Makefile.am +145 -0
- data/ext/libsass/Readme.md +93 -0
- data/ext/libsass/appveyor.yml +76 -0
- data/ext/libsass/ast.cpp +581 -0
- data/ext/libsass/ast.hpp +1949 -0
- data/ext/libsass/ast_def_macros.hpp +16 -0
- data/ext/libsass/ast_factory.hpp +87 -0
- data/ext/libsass/ast_fwd_decl.hpp +72 -0
- data/ext/libsass/b64/cencode.h +32 -0
- data/ext/libsass/b64/encode.h +77 -0
- data/ext/libsass/backtrace.hpp +81 -0
- data/ext/libsass/base64vlq.cpp +43 -0
- data/ext/libsass/base64vlq.hpp +28 -0
- data/ext/libsass/bind.cpp +187 -0
- data/ext/libsass/bind.hpp +18 -0
- data/ext/libsass/cencode.c +102 -0
- data/ext/libsass/color_names.hpp +324 -0
- data/ext/libsass/configure.ac +130 -0
- data/ext/libsass/constants.cpp +144 -0
- data/ext/libsass/constants.hpp +145 -0
- data/ext/libsass/context.cpp +507 -0
- data/ext/libsass/context.hpp +150 -0
- data/ext/libsass/contextualize.cpp +157 -0
- data/ext/libsass/contextualize.hpp +65 -0
- data/ext/libsass/copy_c_str.cpp +13 -0
- data/ext/libsass/copy_c_str.hpp +5 -0
- data/ext/libsass/debug.hpp +39 -0
- data/ext/libsass/environment.hpp +75 -0
- data/ext/libsass/error_handling.cpp +28 -0
- data/ext/libsass/error_handling.hpp +28 -0
- data/ext/libsass/eval.cpp +1149 -0
- data/ext/libsass/eval.hpp +80 -0
- data/ext/libsass/expand.cpp +430 -0
- data/ext/libsass/expand.hpp +77 -0
- data/ext/libsass/extconf.rb +6 -0
- data/ext/libsass/extend.cpp +1962 -0
- data/ext/libsass/extend.hpp +50 -0
- data/ext/libsass/file.cpp +291 -0
- data/ext/libsass/file.hpp +18 -0
- data/ext/libsass/functions.cpp +1565 -0
- data/ext/libsass/functions.hpp +187 -0
- data/ext/libsass/inspect.cpp +727 -0
- data/ext/libsass/inspect.hpp +108 -0
- data/ext/libsass/json.cpp +1411 -0
- data/ext/libsass/json.hpp +117 -0
- data/ext/libsass/kwd_arg_macros.hpp +23 -0
- data/ext/libsass/m4/.gitkeep +0 -0
- data/ext/libsass/mapping.hpp +17 -0
- data/ext/libsass/memory_manager.hpp +54 -0
- data/ext/libsass/node.cpp +251 -0
- data/ext/libsass/node.hpp +122 -0
- data/ext/libsass/operation.hpp +153 -0
- data/ext/libsass/output_compressed.cpp +401 -0
- data/ext/libsass/output_compressed.hpp +95 -0
- data/ext/libsass/output_nested.cpp +364 -0
- data/ext/libsass/output_nested.hpp +108 -0
- data/ext/libsass/parser.cpp +2016 -0
- data/ext/libsass/parser.hpp +264 -0
- data/ext/libsass/paths.hpp +69 -0
- data/ext/libsass/position.hpp +22 -0
- data/ext/libsass/posix/getopt.c +562 -0
- data/ext/libsass/posix/getopt.h +95 -0
- data/ext/libsass/prelexer.cpp +688 -0
- data/ext/libsass/prelexer.hpp +513 -0
- data/ext/libsass/remove_placeholders.cpp +59 -0
- data/ext/libsass/remove_placeholders.hpp +43 -0
- data/ext/libsass/res/resource.rc +35 -0
- data/ext/libsass/sass.cpp +33 -0
- data/ext/libsass/sass.h +60 -0
- data/ext/libsass/sass2scss.cpp +834 -0
- data/ext/libsass/sass2scss.h +110 -0
- data/ext/libsass/sass_context.cpp +709 -0
- data/ext/libsass/sass_context.h +120 -0
- data/ext/libsass/sass_functions.cpp +137 -0
- data/ext/libsass/sass_functions.h +90 -0
- data/ext/libsass/sass_interface.cpp +277 -0
- data/ext/libsass/sass_interface.h +97 -0
- data/ext/libsass/sass_util.cpp +136 -0
- data/ext/libsass/sass_util.hpp +259 -0
- data/ext/libsass/sass_values.cpp +337 -0
- data/ext/libsass/sass_values.h +124 -0
- data/ext/libsass/script/bootstrap +10 -0
- data/ext/libsass/script/branding +10 -0
- data/ext/libsass/script/ci-build-libsass +72 -0
- data/ext/libsass/script/ci-install-compiler +4 -0
- data/ext/libsass/script/ci-install-deps +19 -0
- data/ext/libsass/script/ci-report-coverage +25 -0
- data/ext/libsass/script/coveralls-debug +32 -0
- data/ext/libsass/script/spec +5 -0
- data/ext/libsass/script/tap-driver +652 -0
- data/ext/libsass/script/tap-runner +1 -0
- data/ext/libsass/source_map.cpp +133 -0
- data/ext/libsass/source_map.hpp +46 -0
- data/ext/libsass/subset_map.hpp +145 -0
- data/ext/libsass/support/libsass.pc.in +11 -0
- data/ext/libsass/test-driver +127 -0
- data/ext/libsass/test/test_node.cpp +98 -0
- data/ext/libsass/test/test_paths.cpp +29 -0
- data/ext/libsass/test/test_selector_difference.cpp +28 -0
- data/ext/libsass/test/test_specificity.cpp +28 -0
- data/ext/libsass/test/test_subset_map.cpp +472 -0
- data/ext/libsass/test/test_superselector.cpp +71 -0
- data/ext/libsass/test/test_unification.cpp +33 -0
- data/ext/libsass/to_c.cpp +61 -0
- data/ext/libsass/to_c.hpp +44 -0
- data/ext/libsass/to_string.cpp +29 -0
- data/ext/libsass/to_string.hpp +32 -0
- data/ext/libsass/token.hpp +32 -0
- data/ext/libsass/units.cpp +54 -0
- data/ext/libsass/units.hpp +10 -0
- data/ext/libsass/utf8.h +34 -0
- data/ext/libsass/utf8/checked.h +327 -0
- data/ext/libsass/utf8/core.h +329 -0
- data/ext/libsass/utf8/unchecked.h +228 -0
- data/ext/libsass/utf8_string.cpp +102 -0
- data/ext/libsass/utf8_string.hpp +36 -0
- data/ext/libsass/util.cpp +189 -0
- data/ext/libsass/util.hpp +26 -0
- data/ext/libsass/win/libsass.filters +291 -0
- data/ext/libsass/win/libsass.sln +28 -0
- data/ext/libsass/win/libsass.vcxproj +255 -0
- data/lib/sassc.rb +6 -0
- data/lib/sassc/engine.rb +13 -0
- data/lib/sassc/native.rb +44 -0
- data/lib/sassc/native/native_context_api.rb +140 -0
- data/lib/sassc/native/native_functions_api.rb +41 -0
- data/lib/sassc/native/sass_input_style.rb +11 -0
- data/lib/sassc/native/sass_output_style.rb +10 -0
- data/lib/sassc/native/sass_value.rb +95 -0
- data/lib/sassc/native/string_list.rb +8 -0
- data/lib/sassc/version.rb +3 -0
- data/sassc.gemspec +43 -0
- data/test/smoke_test.rb +171 -0
- data/test/test_helper.rb +4 -0
- metadata +281 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
#define ATTACH_OPERATIONS()\
|
2
|
+
virtual void perform(Operation<void>* op) { (*op)(this); }\
|
3
|
+
virtual AST_Node* perform(Operation<AST_Node*>* op) { return (*op)(this); }\
|
4
|
+
virtual Statement* perform(Operation<Statement*>* op) { return (*op)(this); }\
|
5
|
+
virtual Expression* perform(Operation<Expression*>* op) { return (*op)(this); }\
|
6
|
+
virtual Selector* perform(Operation<Selector*>* op) { return (*op)(this); }\
|
7
|
+
virtual string perform(Operation<string>* op) { return (*op)(this); }\
|
8
|
+
virtual Sass_Value* perform(Operation<Sass_Value*>* op) { return (*op)(this); }
|
9
|
+
|
10
|
+
#define ADD_PROPERTY(type, name)\
|
11
|
+
protected:\
|
12
|
+
type name##_;\
|
13
|
+
public:\
|
14
|
+
type name() const { return name##_; }\
|
15
|
+
type name(type name##__) { return name##_ = name##__; }\
|
16
|
+
private:
|
@@ -0,0 +1,87 @@
|
|
1
|
+
#define SASS_AST_FACTORY
|
2
|
+
|
3
|
+
#include <vector>
|
4
|
+
|
5
|
+
#ifndef SASS_AST
|
6
|
+
#include "ast.hpp"
|
7
|
+
#endif
|
8
|
+
|
9
|
+
namespace Sass {
|
10
|
+
using namespace std;
|
11
|
+
|
12
|
+
class AST_Factory {
|
13
|
+
vector<AST_Node*> nodes;
|
14
|
+
public:
|
15
|
+
// statements
|
16
|
+
Block* new_Block(string p, size_t l, size_t s = 0, bool r = false);
|
17
|
+
Ruleset* new_Ruleset(string p, size_t l, Selector* s, Block* b);
|
18
|
+
Propset* new_Propset(string p, size_t l, String* pf, Block* b);
|
19
|
+
Feature_Query* new_Feature_Query(string p, size_t l, Feature_Query* f, Block* b);
|
20
|
+
Media_Query* new_Media_Query(string p, size_t l, List* q, Block* b);
|
21
|
+
At_Rule* new_At_Rule(string p, size_t l, string kwd, Selector* sel, Block* b);
|
22
|
+
Declaration* new_Declaration(string p, size_t l, String* prop, List* vals);
|
23
|
+
Assignment* new_Assignment(string p, size_t l, string var, Expression* val, bool guarded = false);
|
24
|
+
Import<Function_Call*>* new_CSS_Import(string p, size_t l, Function_Call* loc);
|
25
|
+
Import<String*>* new_SASS_Import(string p, size_t l, String* loc);
|
26
|
+
Warning* new_Warning(string p, size_t l, Expression* msg);
|
27
|
+
Error* new_Error(string p, size_t l, Expression* msg);
|
28
|
+
Debug* new_Debug(string p, size_t l, Expression* val);
|
29
|
+
Comment* new_Comment(string p, size_t l, String* txt);
|
30
|
+
If* new_If(string p, size_t l, Expression* pred, Block* con, Block* alt = 0);
|
31
|
+
For* new_For(string p, size_t l, string var, Expression* lo, Expression* hi, Block* b, bool inc);
|
32
|
+
Each* new_Each(string p, size_t l, vector<string> vars, Expression* lst, Block* b);
|
33
|
+
While* new_While(string p, size_t l, Expression* pred, Block* b);
|
34
|
+
Extension* new_Extension(string p, size_t l, Selector* s);
|
35
|
+
Definition<MIXIN>* new_Mixin_Definition(string p, size_t l, string n, Parameters* params, Block* b);
|
36
|
+
Definition<FUNCTION>* new_Function_Definition(string p, size_t l, string n, Parameters* params, Block* b);
|
37
|
+
Mixin_Call* new_Mixin_Call(string p, size_t l, string n, Arguments* args, Block* b = 0);
|
38
|
+
// expressions
|
39
|
+
List* new_List(string p, size_t l, size_t size = 0, List::Separator sep = List::space, bool argl = false);
|
40
|
+
Map* new_Map(string p, size_t l, size_t size = 0);
|
41
|
+
Binary_Expression<AND>* new_And(string p, size_t l, Expression* lhs, Expression* rhs);
|
42
|
+
Binary_Expression<OR>* new_Or(string p, size_t l, Expression* lhs, Expression* rhs);
|
43
|
+
Binary_Expression<EQ>* new_Eq(string p, size_t l, Expression* lhs, Expression* rhs);
|
44
|
+
Binary_Expression<NEQ>* new_Neq(string p, size_t l, Expression* lhs, Expression* rhs);
|
45
|
+
Binary_Expression<GT>* new_Gt(string p, size_t l, Expression* lhs, Expression* rhs);
|
46
|
+
Binary_Expression<GTE>* new_Gte(string p, size_t l, Expression* lhs, Expression* rhs);
|
47
|
+
Binary_Expression<LT>* new_Lt(string p, size_t l, Expression* lhs, Expression* rhs);
|
48
|
+
Binary_Expression<LTE>* new_Lte(string p, size_t l, Expression* lhs, Expression* rhs);
|
49
|
+
Binary_Expression<ADD>* new_Add(string p, size_t l, Expression* lhs, Expression* rhs);
|
50
|
+
Binary_Expression<SUB>* new_Sub(string p, size_t l, Expression* lhs, Expression* rhs);
|
51
|
+
Binary_Expression<MUL>* new_Mul(string p, size_t l, Expression* lhs, Expression* rhs);
|
52
|
+
Binary_Expression<DIV>* new_Div(string p, size_t l, Expression* lhs, Expression* rhs);
|
53
|
+
Negation* new_Negation(string p, size_t l, Expression* o);
|
54
|
+
Function_Call* new_Function_Call(string p, size_t l, String* n, Arguments* args);
|
55
|
+
Variable* new_Variable(string p, size_t l, string n);
|
56
|
+
Textual<NUMBER>* new_Textual_Number(string p, size_t l, string val);
|
57
|
+
Textual<PERCENTAGE>* new_Textual_Percentage(string p, size_t l, string val);
|
58
|
+
Textual<DIMENSION>* new_Textual_Dimension(string p, size_t l, string val);
|
59
|
+
Textual<HEX>* new_Textual_Hex(string p, size_t l, string val);
|
60
|
+
Number* new_Number(string p, size_t l, double val);
|
61
|
+
Percentage* new_Percentage(string p, size_t l, double val);
|
62
|
+
Dimension* new_Dimension(string p, size_t l, double val, string unit);
|
63
|
+
Color* new_Color(string p, size_t l, double r, double g, double b, double a = 1, string disp = "");
|
64
|
+
Boolean* new_Boolean(string p, size_t l, bool val);
|
65
|
+
String_Schema* new_String_Schema(string p, size_t l, size_t size = 0);
|
66
|
+
String_Constant* new_String_Constant(string p, size_t l, string val);
|
67
|
+
String_Constant* new_String_Constant(string p, size_t l, const char* beg);
|
68
|
+
String_Constant* new_String_Constant(string p, size_t l, const char* beg, const char* end);
|
69
|
+
Feature_Query_Condition* new_Feature_Query_Condition(string p, size_t l, String* f, Expression* v);
|
70
|
+
Media_Expression* new_Media_Expression(string p, size_t l, String* f, Expression* v);
|
71
|
+
// parameters and arguments
|
72
|
+
Parameter* new_Parameter(string p, size_t l, string n, Expression* def = 0, bool rest = false);
|
73
|
+
Parameters* new_Parameters(string p, size_t l);
|
74
|
+
Argument* new_Argument(string p, size_t l, Expression* val, string n = "", bool rest = false);
|
75
|
+
Arguments* new_Arguments(string p, size_t l);
|
76
|
+
// selectors
|
77
|
+
Selector_Schema* new_Selector_Schema(string p, size_t l, String* c);
|
78
|
+
Simple_Selector* new_Simple_Selector(string p, size_t l, string c);
|
79
|
+
Reference_Selector* new_Reference_Selector(string p, size_t l);
|
80
|
+
Placeholder_Selector* new_Placeholder_Selector(string p, size_t l, string n);
|
81
|
+
Pseudo_Selector* new_Pseudo_Selector(string p, size_t l, string n, Expression* expr = 0);
|
82
|
+
Wrapped_Selector* new_Wrapped_Selector(string p, size_t l, string n, Simple_Base* sel);
|
83
|
+
Compound_Selector* new_Compound_Selector(string p, size_t l, size_t s = 0);
|
84
|
+
Complex_Selector* new_Complex_Selector(string p, size_t l, Complex_Selector::Combinator c, Complex_Selector* ctx, Compound_Selector* sel);
|
85
|
+
Selector_List* new_Selector_List(string p, size_t l, size_t s = 0);
|
86
|
+
};
|
87
|
+
}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
/////////////////////////////////////////////
|
2
|
+
// Forward declarations for the AST visitors.
|
3
|
+
/////////////////////////////////////////////
|
4
|
+
namespace Sass {
|
5
|
+
|
6
|
+
class AST_Node;
|
7
|
+
// statements
|
8
|
+
class Statement;
|
9
|
+
class Block;
|
10
|
+
class Ruleset;
|
11
|
+
class Propset;
|
12
|
+
class Media_Block;
|
13
|
+
class Feature_Block;
|
14
|
+
class At_Rule;
|
15
|
+
class Declaration;
|
16
|
+
class Assignment;
|
17
|
+
class Import;
|
18
|
+
class Import_Stub;
|
19
|
+
class Warning;
|
20
|
+
class Error;
|
21
|
+
class Debug;
|
22
|
+
class Comment;
|
23
|
+
class If;
|
24
|
+
class For;
|
25
|
+
class Each;
|
26
|
+
class While;
|
27
|
+
class Return;
|
28
|
+
class Content;
|
29
|
+
class Extension;
|
30
|
+
class Definition;
|
31
|
+
class Mixin_Call;
|
32
|
+
// expressions
|
33
|
+
class Expression;
|
34
|
+
class List;
|
35
|
+
class Map;
|
36
|
+
class Binary_Expression;
|
37
|
+
class Unary_Expression;
|
38
|
+
class Function_Call;
|
39
|
+
class Function_Call_Schema;
|
40
|
+
class Variable;
|
41
|
+
class Textual;
|
42
|
+
class Number;
|
43
|
+
class Color;
|
44
|
+
class Boolean;
|
45
|
+
class String_Schema;
|
46
|
+
class String;
|
47
|
+
class String_Constant;
|
48
|
+
class Media_Query;
|
49
|
+
class Media_Query_Expression;
|
50
|
+
class Feature_Query;
|
51
|
+
class Feature_Query_Condition;
|
52
|
+
class Null;
|
53
|
+
// parameters and arguments
|
54
|
+
class Parameter;
|
55
|
+
class Parameters;
|
56
|
+
class Argument;
|
57
|
+
class Arguments;
|
58
|
+
// selectors
|
59
|
+
class Selector;
|
60
|
+
class Selector_Schema;
|
61
|
+
class Selector_Reference;
|
62
|
+
class Selector_Placeholder;
|
63
|
+
class Type_Selector;
|
64
|
+
class Selector_Qualifier;
|
65
|
+
class Attribute_Selector;
|
66
|
+
class Pseudo_Selector;
|
67
|
+
class Wrapped_Selector;
|
68
|
+
class Compound_Selector;
|
69
|
+
class Complex_Selector;
|
70
|
+
class Selector_List;
|
71
|
+
|
72
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
/*
|
2
|
+
cencode.h - c header for a base64 encoding algorithm
|
3
|
+
|
4
|
+
This is part of the libb64 project, and has been placed in the public domain.
|
5
|
+
For details, see http://sourceforge.net/projects/libb64
|
6
|
+
*/
|
7
|
+
|
8
|
+
#ifndef BASE64_CENCODE_H
|
9
|
+
#define BASE64_CENCODE_H
|
10
|
+
|
11
|
+
typedef enum
|
12
|
+
{
|
13
|
+
step_A, step_B, step_C
|
14
|
+
} base64_encodestep;
|
15
|
+
|
16
|
+
typedef struct
|
17
|
+
{
|
18
|
+
base64_encodestep step;
|
19
|
+
char result;
|
20
|
+
int stepcount;
|
21
|
+
} base64_encodestate;
|
22
|
+
|
23
|
+
void base64_init_encodestate(base64_encodestate* state_in);
|
24
|
+
|
25
|
+
char base64_encode_value(char value_in);
|
26
|
+
|
27
|
+
int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in);
|
28
|
+
|
29
|
+
int base64_encode_blockend(char* code_out, base64_encodestate* state_in);
|
30
|
+
|
31
|
+
#endif /* BASE64_CENCODE_H */
|
32
|
+
|
@@ -0,0 +1,77 @@
|
|
1
|
+
// :mode=c++:
|
2
|
+
/*
|
3
|
+
encode.h - c++ wrapper for a base64 encoding algorithm
|
4
|
+
|
5
|
+
This is part of the libb64 project, and has been placed in the public domain.
|
6
|
+
For details, see http://sourceforge.net/projects/libb64
|
7
|
+
*/
|
8
|
+
#ifndef BASE64_ENCODE_H
|
9
|
+
#define BASE64_ENCODE_H
|
10
|
+
|
11
|
+
#include <iostream>
|
12
|
+
|
13
|
+
namespace base64
|
14
|
+
{
|
15
|
+
extern "C"
|
16
|
+
{
|
17
|
+
#include "cencode.h"
|
18
|
+
}
|
19
|
+
|
20
|
+
struct encoder
|
21
|
+
{
|
22
|
+
base64_encodestate _state;
|
23
|
+
int _buffersize;
|
24
|
+
|
25
|
+
encoder(int buffersize_in = BUFFERSIZE)
|
26
|
+
: _buffersize(buffersize_in)
|
27
|
+
{}
|
28
|
+
|
29
|
+
int encode(char value_in)
|
30
|
+
{
|
31
|
+
return base64_encode_value(value_in);
|
32
|
+
}
|
33
|
+
|
34
|
+
int encode(const char* code_in, const int length_in, char* plaintext_out)
|
35
|
+
{
|
36
|
+
return base64_encode_block(code_in, length_in, plaintext_out, &_state);
|
37
|
+
}
|
38
|
+
|
39
|
+
int encode_end(char* plaintext_out)
|
40
|
+
{
|
41
|
+
return base64_encode_blockend(plaintext_out, &_state);
|
42
|
+
}
|
43
|
+
|
44
|
+
void encode(std::istream& istream_in, std::ostream& ostream_in)
|
45
|
+
{
|
46
|
+
base64_init_encodestate(&_state);
|
47
|
+
//
|
48
|
+
const int N = _buffersize;
|
49
|
+
char* plaintext = new char[N];
|
50
|
+
char* code = new char[2*N];
|
51
|
+
int plainlength;
|
52
|
+
int codelength;
|
53
|
+
|
54
|
+
do
|
55
|
+
{
|
56
|
+
istream_in.read(plaintext, N);
|
57
|
+
plainlength = istream_in.gcount();
|
58
|
+
//
|
59
|
+
codelength = encode(plaintext, plainlength, code);
|
60
|
+
ostream_in.write(code, codelength);
|
61
|
+
}
|
62
|
+
while (istream_in.good() && plainlength > 0);
|
63
|
+
|
64
|
+
codelength = encode_end(code);
|
65
|
+
ostream_in.write(code, codelength);
|
66
|
+
//
|
67
|
+
base64_init_encodestate(&_state);
|
68
|
+
|
69
|
+
delete [] code;
|
70
|
+
delete [] plaintext;
|
71
|
+
}
|
72
|
+
};
|
73
|
+
|
74
|
+
} // namespace base64
|
75
|
+
|
76
|
+
#endif // BASE64_ENCODE_H
|
77
|
+
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#define SASS_BACKTRACE
|
2
|
+
|
3
|
+
#include <sstream>
|
4
|
+
|
5
|
+
#ifndef SASS_POSITION
|
6
|
+
#include "position.hpp"
|
7
|
+
#endif
|
8
|
+
|
9
|
+
#ifndef SASS_FILE
|
10
|
+
#include "file.hpp"
|
11
|
+
#endif
|
12
|
+
|
13
|
+
namespace Sass {
|
14
|
+
|
15
|
+
using namespace std;
|
16
|
+
|
17
|
+
struct Backtrace {
|
18
|
+
|
19
|
+
Backtrace* parent;
|
20
|
+
string path;
|
21
|
+
Position position;
|
22
|
+
string caller;
|
23
|
+
|
24
|
+
Backtrace(Backtrace* prn, string pth, Position position, string c)
|
25
|
+
: parent(prn),
|
26
|
+
path(pth),
|
27
|
+
position(position),
|
28
|
+
caller(c)
|
29
|
+
{ }
|
30
|
+
|
31
|
+
string to_string(bool warning = false)
|
32
|
+
{
|
33
|
+
size_t i = -1;
|
34
|
+
stringstream ss;
|
35
|
+
string cwd(Sass::File::get_cwd());
|
36
|
+
Backtrace* this_point = this;
|
37
|
+
|
38
|
+
if (!warning) ss << endl << "Backtrace:";
|
39
|
+
// the first tracepoint (which is parent-less) is an empty placeholder
|
40
|
+
while (this_point->parent) {
|
41
|
+
|
42
|
+
// make path relative to the current directory
|
43
|
+
string rel_path(Sass::File::resolve_relative_path(this_point->path, cwd, cwd));
|
44
|
+
|
45
|
+
if (warning) {
|
46
|
+
ss << endl
|
47
|
+
<< "\t"
|
48
|
+
<< (++i == 0 ? "on" : "from")
|
49
|
+
<< " line "
|
50
|
+
<< this_point->position.line
|
51
|
+
<< " of "
|
52
|
+
<< rel_path;
|
53
|
+
} else {
|
54
|
+
ss << endl
|
55
|
+
<< "\t"
|
56
|
+
<< rel_path
|
57
|
+
<< ":"
|
58
|
+
<< this_point->position.line
|
59
|
+
<< this_point->parent->caller;
|
60
|
+
}
|
61
|
+
|
62
|
+
this_point = this_point->parent;
|
63
|
+
}
|
64
|
+
|
65
|
+
return ss.str();
|
66
|
+
}
|
67
|
+
|
68
|
+
size_t depth()
|
69
|
+
{
|
70
|
+
size_t d = 0;
|
71
|
+
Backtrace* p = parent;
|
72
|
+
while (p) {
|
73
|
+
++d;
|
74
|
+
p = p->parent;
|
75
|
+
}
|
76
|
+
return d-1;
|
77
|
+
}
|
78
|
+
|
79
|
+
};
|
80
|
+
|
81
|
+
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#include "base64vlq.hpp"
|
2
|
+
|
3
|
+
namespace Sass {
|
4
|
+
|
5
|
+
string Base64VLQ::encode(const int number) const
|
6
|
+
{
|
7
|
+
string encoded = "";
|
8
|
+
|
9
|
+
int vlq = to_vlq_signed(number);
|
10
|
+
|
11
|
+
do {
|
12
|
+
int digit = vlq & VLQ_BASE_MASK;
|
13
|
+
vlq >>= VLQ_BASE_SHIFT;
|
14
|
+
if (vlq > 0) {
|
15
|
+
digit |= VLQ_CONTINUATION_BIT;
|
16
|
+
}
|
17
|
+
encoded += base64_encode(digit);
|
18
|
+
} while (vlq > 0);
|
19
|
+
|
20
|
+
return encoded;
|
21
|
+
}
|
22
|
+
|
23
|
+
char Base64VLQ::base64_encode(const int number) const
|
24
|
+
{
|
25
|
+
int index = number;
|
26
|
+
if (index < 0) index = 0;
|
27
|
+
if (index > 63) index = 63;
|
28
|
+
return CHARACTERS[index];
|
29
|
+
}
|
30
|
+
|
31
|
+
int Base64VLQ::to_vlq_signed(const int number) const
|
32
|
+
{
|
33
|
+
return (number < 0) ? ((-number) << 1) + 1 : (number << 1) + 0;
|
34
|
+
}
|
35
|
+
|
36
|
+
const char* Base64VLQ::CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
37
|
+
|
38
|
+
const int Base64VLQ::VLQ_BASE_SHIFT = 5;
|
39
|
+
const int Base64VLQ::VLQ_BASE = 1 << VLQ_BASE_SHIFT;
|
40
|
+
const int Base64VLQ::VLQ_BASE_MASK = VLQ_BASE - 1;
|
41
|
+
const int Base64VLQ::VLQ_CONTINUATION_BIT = VLQ_BASE;
|
42
|
+
|
43
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#define SASS_BASE64VLQ
|
2
|
+
|
3
|
+
#include <string>
|
4
|
+
|
5
|
+
namespace Sass {
|
6
|
+
using std::string;
|
7
|
+
|
8
|
+
class Base64VLQ {
|
9
|
+
|
10
|
+
public:
|
11
|
+
|
12
|
+
string encode(const int number) const;
|
13
|
+
|
14
|
+
private:
|
15
|
+
|
16
|
+
char base64_encode(const int number) const;
|
17
|
+
|
18
|
+
int to_vlq_signed(const int number) const;
|
19
|
+
|
20
|
+
static const char* CHARACTERS;
|
21
|
+
|
22
|
+
static const int VLQ_BASE_SHIFT;
|
23
|
+
static const int VLQ_BASE;
|
24
|
+
static const int VLQ_BASE_MASK;
|
25
|
+
static const int VLQ_CONTINUATION_BIT;
|
26
|
+
};
|
27
|
+
|
28
|
+
}
|
@@ -0,0 +1,187 @@
|
|
1
|
+
#include "bind.hpp"
|
2
|
+
#include "ast.hpp"
|
3
|
+
#include "context.hpp"
|
4
|
+
#include "eval.hpp"
|
5
|
+
#include <map>
|
6
|
+
#include <iostream>
|
7
|
+
#include <sstream>
|
8
|
+
#include "to_string.hpp"
|
9
|
+
|
10
|
+
namespace Sass {
|
11
|
+
using namespace std;
|
12
|
+
|
13
|
+
void bind(string callee, Parameters* ps, Arguments* as, Context& ctx, Env* env, Eval* eval)
|
14
|
+
{
|
15
|
+
map<string, Parameter*> param_map;
|
16
|
+
|
17
|
+
// Set up a map to ensure named arguments refer to actual parameters. Also
|
18
|
+
// eval each default value left-to-right, wrt env, populating env as we go.
|
19
|
+
for (size_t i = 0, L = ps->length(); i < L; ++i) {
|
20
|
+
Parameter* p = (*ps)[i];
|
21
|
+
param_map[p->name()] = p;
|
22
|
+
// if (p->default_value()) {
|
23
|
+
// env->current_frame()[p->name()] = p->default_value()->perform(eval->with(env));
|
24
|
+
// }
|
25
|
+
}
|
26
|
+
|
27
|
+
// plug in all args; if we have leftover params, deal with it later
|
28
|
+
size_t ip = 0, LP = ps->length();
|
29
|
+
size_t ia = 0, LA = as->length();
|
30
|
+
while (ia < LA) {
|
31
|
+
if (ip >= LP) {
|
32
|
+
stringstream msg;
|
33
|
+
msg << callee << " only takes " << LP << " arguments; "
|
34
|
+
<< "given " << LA;
|
35
|
+
error(msg.str(), as->path(), as->position());
|
36
|
+
}
|
37
|
+
Parameter* p = (*ps)[ip];
|
38
|
+
Argument* a = (*as)[ia];
|
39
|
+
|
40
|
+
// If the current parameter is the rest parameter, process and break the loop
|
41
|
+
if (p->is_rest_parameter()) {
|
42
|
+
if (a->is_rest_argument()) {
|
43
|
+
// rest param and rest arg -- just add one to the other
|
44
|
+
if (env->current_frame_has(p->name())) {
|
45
|
+
*static_cast<List*>(env->current_frame()[p->name()])
|
46
|
+
+= static_cast<List*>(a->value());
|
47
|
+
}
|
48
|
+
else {
|
49
|
+
env->current_frame()[p->name()] = a->value();
|
50
|
+
}
|
51
|
+
} else {
|
52
|
+
|
53
|
+
// copy all remaining arguments into the rest parameter, preserving names
|
54
|
+
List* arglist = new (ctx.mem) List(p->path(),
|
55
|
+
p->position(),
|
56
|
+
0,
|
57
|
+
List::COMMA,
|
58
|
+
true);
|
59
|
+
env->current_frame()[p->name()] = arglist;
|
60
|
+
while (ia < LA) {
|
61
|
+
a = (*as)[ia];
|
62
|
+
(*arglist) << new (ctx.mem) Argument(a->path(),
|
63
|
+
a->position(),
|
64
|
+
a->value(),
|
65
|
+
a->name(),
|
66
|
+
false);
|
67
|
+
++ia;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
++ip;
|
71
|
+
break;
|
72
|
+
}
|
73
|
+
|
74
|
+
// If the current argument is the rest argument, extract a value for processing
|
75
|
+
else if (a->is_rest_argument()) {
|
76
|
+
// normal param and rest arg
|
77
|
+
List* arglist = static_cast<List*>(a->value());
|
78
|
+
// empty rest arg - treat all args as default values
|
79
|
+
if (!arglist->length()) {
|
80
|
+
break;
|
81
|
+
}
|
82
|
+
// otherwise move one of the rest args into the param, converting to argument if necessary
|
83
|
+
if (arglist->is_arglist()) {
|
84
|
+
a = static_cast<Argument*>((*arglist)[0]);
|
85
|
+
} else {
|
86
|
+
Expression* a_to_convert = (*arglist)[0];
|
87
|
+
a = new (ctx.mem) Argument(a_to_convert->path(), a_to_convert->position(), a_to_convert, "", false);
|
88
|
+
}
|
89
|
+
arglist->elements().erase(arglist->elements().begin());
|
90
|
+
if (!arglist->length() || (!arglist->is_arglist() && ip + 1 == LP)) {
|
91
|
+
++ia;
|
92
|
+
}
|
93
|
+
} else if (a->is_keyword_argument()) {
|
94
|
+
Map* argmap = static_cast<Map*>(a->value());
|
95
|
+
|
96
|
+
for (auto key : argmap->keys()) {
|
97
|
+
string name = "$" + unquote(static_cast<String_Constant*>(key)->value());
|
98
|
+
|
99
|
+
if (!param_map.count(name)) {
|
100
|
+
stringstream msg;
|
101
|
+
msg << callee << " has no parameter named " << name;
|
102
|
+
error(msg.str(), a->path(), a->position());
|
103
|
+
}
|
104
|
+
env->current_frame()[name] = argmap->at(key);
|
105
|
+
}
|
106
|
+
++ia;
|
107
|
+
continue;
|
108
|
+
} else {
|
109
|
+
++ia;
|
110
|
+
}
|
111
|
+
|
112
|
+
if (a->name().empty()) {
|
113
|
+
if (env->current_frame_has(p->name())) {
|
114
|
+
stringstream msg;
|
115
|
+
msg << "parameter " << p->name()
|
116
|
+
<< " provided more than once in call to " << callee;
|
117
|
+
error(msg.str(), a->path(), a->position());
|
118
|
+
}
|
119
|
+
// ordinal arg -- bind it to the next param
|
120
|
+
env->current_frame()[p->name()] = a->value();
|
121
|
+
++ip;
|
122
|
+
}
|
123
|
+
else {
|
124
|
+
// named arg -- bind it to the appropriately named param
|
125
|
+
if (!param_map.count(a->name())) {
|
126
|
+
stringstream msg;
|
127
|
+
msg << callee << " has no parameter named " << a->name();
|
128
|
+
error(msg.str(), a->path(), a->position());
|
129
|
+
}
|
130
|
+
if (param_map[a->name()]->is_rest_parameter()) {
|
131
|
+
stringstream msg;
|
132
|
+
msg << "argument " << a->name() << " of " << callee
|
133
|
+
<< "cannot be used as named argument";
|
134
|
+
error(msg.str(), a->path(), a->position());
|
135
|
+
}
|
136
|
+
if (env->current_frame_has(a->name())) {
|
137
|
+
stringstream msg;
|
138
|
+
msg << "parameter " << p->name()
|
139
|
+
<< "provided more than once in call to " << callee;
|
140
|
+
error(msg.str(), a->path(), a->position());
|
141
|
+
}
|
142
|
+
env->current_frame()[a->name()] = a->value();
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
146
|
+
// If we make it here, we're out of args but may have leftover params.
|
147
|
+
// That's only okay if they have default values, or were already bound by
|
148
|
+
// named arguments, or if it's a single rest-param.
|
149
|
+
for (size_t i = ip; i < LP; ++i) {
|
150
|
+
To_String to_string;
|
151
|
+
Parameter* leftover = (*ps)[i];
|
152
|
+
// cerr << "env for default params:" << endl;
|
153
|
+
// env->print();
|
154
|
+
// cerr << "********" << endl;
|
155
|
+
if (!env->current_frame_has(leftover->name())) {
|
156
|
+
if (leftover->is_rest_parameter()) {
|
157
|
+
env->current_frame()[leftover->name()] = new (ctx.mem) List(leftover->path(),
|
158
|
+
leftover->position(),
|
159
|
+
0,
|
160
|
+
List::COMMA,
|
161
|
+
true);
|
162
|
+
}
|
163
|
+
else if (leftover->default_value()) {
|
164
|
+
// make sure to eval the default value in the env that we've been populating
|
165
|
+
Env* old_env = eval->env;
|
166
|
+
Backtrace* old_bt = eval->backtrace;
|
167
|
+
Expression* dv = leftover->default_value()->perform(eval->with(env, eval->backtrace));
|
168
|
+
eval->env = old_env;
|
169
|
+
eval->backtrace = old_bt;
|
170
|
+
// dv->perform(&to_string);
|
171
|
+
env->current_frame()[leftover->name()] = dv;
|
172
|
+
}
|
173
|
+
else {
|
174
|
+
// param is unbound and has no default value -- error
|
175
|
+
stringstream msg;
|
176
|
+
msg << "required parameter " << leftover->name()
|
177
|
+
<< " is missing in call to " << callee;
|
178
|
+
error(msg.str(), as->path(), as->position());
|
179
|
+
}
|
180
|
+
}
|
181
|
+
}
|
182
|
+
|
183
|
+
return;
|
184
|
+
}
|
185
|
+
|
186
|
+
|
187
|
+
}
|