sassc 0.0.1
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 +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,150 @@
|
|
|
1
|
+
#define SASS_CONTEXT
|
|
2
|
+
|
|
3
|
+
#include <string>
|
|
4
|
+
#include <vector>
|
|
5
|
+
#include <map>
|
|
6
|
+
#include "kwd_arg_macros.hpp"
|
|
7
|
+
|
|
8
|
+
#ifndef SASS_MEMORY_MANAGER
|
|
9
|
+
#include "memory_manager.hpp"
|
|
10
|
+
#endif
|
|
11
|
+
|
|
12
|
+
#ifndef SASS_ENVIRONMENT
|
|
13
|
+
#include "environment.hpp"
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
#ifndef SASS_SOURCE_MAP
|
|
17
|
+
#include "source_map.hpp"
|
|
18
|
+
#endif
|
|
19
|
+
|
|
20
|
+
#ifndef SASS_SUBSET_MAP
|
|
21
|
+
#include "subset_map.hpp"
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
#define BUFFERSIZE 255
|
|
25
|
+
#include "b64/encode.h"
|
|
26
|
+
|
|
27
|
+
#include "sass_functions.h"
|
|
28
|
+
|
|
29
|
+
struct Sass_C_Function_Descriptor;
|
|
30
|
+
|
|
31
|
+
namespace Sass {
|
|
32
|
+
using namespace std;
|
|
33
|
+
class AST_Node;
|
|
34
|
+
class Block;
|
|
35
|
+
class Expression;
|
|
36
|
+
class Color;
|
|
37
|
+
struct Backtrace;
|
|
38
|
+
// typedef const char* Signature;
|
|
39
|
+
// struct Context;
|
|
40
|
+
// typedef Environment<AST_Node*> Env;
|
|
41
|
+
// typedef Expression* (*Native_Function)(Env&, Context&, Signature, string, size_t);
|
|
42
|
+
|
|
43
|
+
enum Output_Style { NESTED, EXPANDED, COMPACT, COMPRESSED, FORMATTED };
|
|
44
|
+
|
|
45
|
+
struct Sass_Queued {
|
|
46
|
+
string abs_path;
|
|
47
|
+
string load_path;
|
|
48
|
+
const char* source;
|
|
49
|
+
public:
|
|
50
|
+
Sass_Queued(const string& load_path, const string& abs_path, const char* source);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
struct Context {
|
|
54
|
+
Memory_Manager<AST_Node> mem;
|
|
55
|
+
|
|
56
|
+
const char* source_c_str;
|
|
57
|
+
|
|
58
|
+
// c-strs containing Sass file contents
|
|
59
|
+
// we will overtake ownership of memory
|
|
60
|
+
vector<const char*> sources;
|
|
61
|
+
// absolute paths to includes
|
|
62
|
+
vector<string> included_files;
|
|
63
|
+
// relative links to includes
|
|
64
|
+
vector<string> include_links;
|
|
65
|
+
// vectors above have same size
|
|
66
|
+
|
|
67
|
+
vector<string> include_paths; // lookup paths for includes
|
|
68
|
+
vector<Sass_Queued> queue; // queue of files to be parsed
|
|
69
|
+
map<string, Block*> style_sheets; // map of paths to ASTs
|
|
70
|
+
SourceMap source_map;
|
|
71
|
+
vector<Sass_C_Function_Callback> c_functions;
|
|
72
|
+
|
|
73
|
+
string image_path; // for the image-url Sass function
|
|
74
|
+
string input_path; // for relative paths in src-map
|
|
75
|
+
string output_path; // for relative paths to the output
|
|
76
|
+
bool source_comments; // for inline debug comments in css output
|
|
77
|
+
Output_Style output_style; // output style for the generated css code
|
|
78
|
+
string source_map_file; // path to source map file (enables feature)
|
|
79
|
+
bool source_map_embed; // embed in sourceMappingUrl (as data-url)
|
|
80
|
+
bool source_map_contents; // insert included contents into source map
|
|
81
|
+
bool omit_source_map_url; // disable source map comment in css output
|
|
82
|
+
bool is_indented_syntax_src; // treat source string as sass
|
|
83
|
+
|
|
84
|
+
// overload import calls
|
|
85
|
+
Sass_C_Import_Callback importer;
|
|
86
|
+
vector<struct Sass_Import*> import_stack;
|
|
87
|
+
|
|
88
|
+
map<string, Color*> names_to_colors;
|
|
89
|
+
map<int, string> colors_to_names;
|
|
90
|
+
|
|
91
|
+
size_t precision; // precision for outputting fractional numbers
|
|
92
|
+
bool _skip_source_map_update; // status flag to skip source map updates
|
|
93
|
+
|
|
94
|
+
KWD_ARG_SET(Data) {
|
|
95
|
+
KWD_ARG(Data, const char*, source_c_str);
|
|
96
|
+
KWD_ARG(Data, string, entry_point);
|
|
97
|
+
KWD_ARG(Data, string, input_path);
|
|
98
|
+
KWD_ARG(Data, string, output_path);
|
|
99
|
+
KWD_ARG(Data, string, image_path);
|
|
100
|
+
KWD_ARG(Data, const char*, include_paths_c_str);
|
|
101
|
+
KWD_ARG(Data, const char**, include_paths_array);
|
|
102
|
+
KWD_ARG(Data, vector<string>, include_paths);
|
|
103
|
+
KWD_ARG(Data, bool, source_comments);
|
|
104
|
+
KWD_ARG(Data, Output_Style, output_style);
|
|
105
|
+
KWD_ARG(Data, string, source_map_file);
|
|
106
|
+
KWD_ARG(Data, bool, omit_source_map_url);
|
|
107
|
+
KWD_ARG(Data, bool, is_indented_syntax_src);
|
|
108
|
+
KWD_ARG(Data, size_t, precision);
|
|
109
|
+
KWD_ARG(Data, bool, _skip_source_map_update);
|
|
110
|
+
KWD_ARG(Data, bool, source_map_embed);
|
|
111
|
+
KWD_ARG(Data, bool, source_map_contents);
|
|
112
|
+
KWD_ARG(Data, Sass_C_Import_Callback, importer);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
Context(Data);
|
|
116
|
+
~Context();
|
|
117
|
+
static string get_cwd();
|
|
118
|
+
void setup_color_map();
|
|
119
|
+
string add_file(string);
|
|
120
|
+
Block* parse_file();
|
|
121
|
+
string add_file(string, string);
|
|
122
|
+
Block* parse_string();
|
|
123
|
+
void add_source(string, string, const char*);
|
|
124
|
+
// allow to optionally overwrite the input path
|
|
125
|
+
// default argument for input_path is string("stdin")
|
|
126
|
+
// usefull to influence the source-map generating etc.
|
|
127
|
+
char* compile_file();
|
|
128
|
+
char* compile_string();
|
|
129
|
+
char* compile_block(Block* root);
|
|
130
|
+
char* generate_source_map();
|
|
131
|
+
|
|
132
|
+
vector<string> get_included_files(size_t skip = 0);
|
|
133
|
+
|
|
134
|
+
private:
|
|
135
|
+
void collect_include_paths(const char* paths_str);
|
|
136
|
+
void collect_include_paths(const char** paths_array);
|
|
137
|
+
string format_source_mapping_url(const string& file);
|
|
138
|
+
|
|
139
|
+
string cwd;
|
|
140
|
+
|
|
141
|
+
// void register_built_in_functions(Env* env);
|
|
142
|
+
// void register_function(Signature sig, Native_Function f, Env* env);
|
|
143
|
+
// void register_function(Signature sig, Native_Function f, size_t arity, Env* env);
|
|
144
|
+
// void register_overload_stub(string name, Env* env);
|
|
145
|
+
|
|
146
|
+
public:
|
|
147
|
+
Subset_Map<string, pair<Complex_Selector*, Compound_Selector*> > subset_map;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#include "contextualize.hpp"
|
|
2
|
+
#include "ast.hpp"
|
|
3
|
+
#include "eval.hpp"
|
|
4
|
+
#include "backtrace.hpp"
|
|
5
|
+
#include "to_string.hpp"
|
|
6
|
+
#include "parser.hpp"
|
|
7
|
+
|
|
8
|
+
namespace Sass {
|
|
9
|
+
|
|
10
|
+
Contextualize::Contextualize(Context& ctx, Eval* eval, Env* env, Backtrace* bt, Selector* placeholder, Selector* extender)
|
|
11
|
+
: ctx(ctx), eval(eval), env(env), parent(0), backtrace(bt), placeholder(placeholder), extender(extender)
|
|
12
|
+
{ }
|
|
13
|
+
|
|
14
|
+
Contextualize::~Contextualize() { }
|
|
15
|
+
|
|
16
|
+
Selector* Contextualize::fallback_impl(AST_Node* n)
|
|
17
|
+
{ return parent; }
|
|
18
|
+
|
|
19
|
+
Contextualize* Contextualize::with(Selector* s, Env* e, Backtrace* bt, Selector* p, Selector* ex)
|
|
20
|
+
{
|
|
21
|
+
parent = s;
|
|
22
|
+
env = e;
|
|
23
|
+
backtrace = bt;
|
|
24
|
+
placeholder = p;
|
|
25
|
+
extender = ex;
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
Selector* Contextualize::operator()(Selector_Schema* s)
|
|
30
|
+
{
|
|
31
|
+
To_String to_string;
|
|
32
|
+
string result_str(s->contents()->perform(eval->with(env, backtrace))->perform(&to_string));
|
|
33
|
+
result_str += '{'; // the parser looks for a brace to end the selector
|
|
34
|
+
Selector* result_sel = Parser::from_c_str(result_str.c_str(), ctx, s->path(), s->position()).parse_selector_group();
|
|
35
|
+
return result_sel->perform(this);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
Selector* Contextualize::operator()(Selector_List* s)
|
|
39
|
+
{
|
|
40
|
+
Selector_List* p = static_cast<Selector_List*>(parent);
|
|
41
|
+
Selector_List* ss = 0;
|
|
42
|
+
if (p) {
|
|
43
|
+
ss = new (ctx.mem) Selector_List(s->path(), s->position(), p->length() * s->length());
|
|
44
|
+
for (size_t i = 0, L = p->length(); i < L; ++i) {
|
|
45
|
+
for (size_t j = 0, L = s->length(); j < L; ++j) {
|
|
46
|
+
parent = (*p)[i];
|
|
47
|
+
Complex_Selector* comb = static_cast<Complex_Selector*>((*s)[j]->perform(this));
|
|
48
|
+
if (comb) *ss << comb;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
ss = new (ctx.mem) Selector_List(s->path(), s->position(), s->length());
|
|
54
|
+
for (size_t j = 0, L = s->length(); j < L; ++j) {
|
|
55
|
+
Complex_Selector* comb = static_cast<Complex_Selector*>((*s)[j]->perform(this));
|
|
56
|
+
if (comb) *ss << comb;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return ss->length() ? ss : 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
Selector* Contextualize::operator()(Complex_Selector* s)
|
|
63
|
+
{
|
|
64
|
+
To_String to_string;
|
|
65
|
+
Complex_Selector* ss = new (ctx.mem) Complex_Selector(*s);
|
|
66
|
+
Compound_Selector* new_head = 0;
|
|
67
|
+
Complex_Selector* new_tail = 0;
|
|
68
|
+
if (ss->head()) {
|
|
69
|
+
new_head = static_cast<Compound_Selector*>(s->head()->perform(this));
|
|
70
|
+
ss->head(new_head);
|
|
71
|
+
}
|
|
72
|
+
if (ss->tail()) {
|
|
73
|
+
new_tail = static_cast<Complex_Selector*>(s->tail()->perform(this));
|
|
74
|
+
ss->tail(new_tail);
|
|
75
|
+
}
|
|
76
|
+
if ((new_head && new_head->has_placeholder()) || (new_tail && new_tail->has_placeholder())) {
|
|
77
|
+
ss->has_placeholder(true);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
ss->has_placeholder(false);
|
|
81
|
+
}
|
|
82
|
+
if (!ss->head() && ss->combinator() == Complex_Selector::ANCESTOR_OF) {
|
|
83
|
+
return ss->tail();
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return ss;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
Selector* Contextualize::operator()(Compound_Selector* s)
|
|
91
|
+
{
|
|
92
|
+
To_String to_string;
|
|
93
|
+
if (placeholder && extender && s->perform(&to_string) == placeholder->perform(&to_string)) {
|
|
94
|
+
return extender;
|
|
95
|
+
}
|
|
96
|
+
Compound_Selector* ss = new (ctx.mem) Compound_Selector(s->path(), s->position(), s->length());
|
|
97
|
+
for (size_t i = 0, L = s->length(); i < L; ++i) {
|
|
98
|
+
Simple_Selector* simp = static_cast<Simple_Selector*>((*s)[i]->perform(this));
|
|
99
|
+
if (simp) *ss << simp;
|
|
100
|
+
}
|
|
101
|
+
return ss->length() ? ss : 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
Selector* Contextualize::operator()(Wrapped_Selector* s)
|
|
105
|
+
{
|
|
106
|
+
Selector* old_parent = parent;
|
|
107
|
+
parent = 0;
|
|
108
|
+
Wrapped_Selector* neg = new (ctx.mem) Wrapped_Selector(s->path(),
|
|
109
|
+
s->position(),
|
|
110
|
+
s->name(),
|
|
111
|
+
s->selector()->perform(this));
|
|
112
|
+
parent = old_parent;
|
|
113
|
+
return neg;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
Selector* Contextualize::operator()(Pseudo_Selector* s)
|
|
117
|
+
{ return s; }
|
|
118
|
+
|
|
119
|
+
Selector* Contextualize::operator()(Attribute_Selector* s)
|
|
120
|
+
{
|
|
121
|
+
// the value might be interpolated; evaluate it
|
|
122
|
+
String* v = s->value();
|
|
123
|
+
if (v && eval) {
|
|
124
|
+
v = static_cast<String*>(v->perform(eval->with(env, backtrace)));
|
|
125
|
+
}
|
|
126
|
+
Attribute_Selector* ss = new (ctx.mem) Attribute_Selector(*s);
|
|
127
|
+
ss->value(v);
|
|
128
|
+
return ss;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
Selector* Contextualize::operator()(Selector_Qualifier* s)
|
|
132
|
+
{ return s; }
|
|
133
|
+
|
|
134
|
+
Selector* Contextualize::operator()(Type_Selector* s)
|
|
135
|
+
{ return s; }
|
|
136
|
+
|
|
137
|
+
Selector* Contextualize::operator()(Selector_Placeholder* p)
|
|
138
|
+
{
|
|
139
|
+
To_String to_string;
|
|
140
|
+
if (placeholder && extender && p->perform(&to_string) == placeholder->perform(&to_string)) {
|
|
141
|
+
return extender;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
return p;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
Selector* Contextualize::operator()(Selector_Reference* s)
|
|
149
|
+
{
|
|
150
|
+
if (!parent) return 0;
|
|
151
|
+
Selector_Reference* ss = new (ctx.mem) Selector_Reference(*s);
|
|
152
|
+
ss->selector(parent);
|
|
153
|
+
return ss;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#define SASS_CONTEXTUALIZE
|
|
2
|
+
|
|
3
|
+
#ifndef SASS_ENVIRONMENT
|
|
4
|
+
#include "environment.hpp"
|
|
5
|
+
#endif
|
|
6
|
+
|
|
7
|
+
#ifndef SASS_OPERATION
|
|
8
|
+
#include "operation.hpp"
|
|
9
|
+
#endif
|
|
10
|
+
|
|
11
|
+
namespace Sass {
|
|
12
|
+
class AST_Node;
|
|
13
|
+
class Selector;
|
|
14
|
+
class Selector_Schema;
|
|
15
|
+
class Selector_List;
|
|
16
|
+
class Complex_Selector;
|
|
17
|
+
class Compound_Selector;
|
|
18
|
+
class Wrapped_Selector;
|
|
19
|
+
class Pseudo_Selector;
|
|
20
|
+
class Attribute_Selector;
|
|
21
|
+
class Selector_Qualifier;
|
|
22
|
+
class Type_Selector;
|
|
23
|
+
class Selector_Placeholder;
|
|
24
|
+
class Selector_Reference;
|
|
25
|
+
class Simple_Selector;
|
|
26
|
+
struct Context;
|
|
27
|
+
class Eval;
|
|
28
|
+
struct Backtrace;
|
|
29
|
+
|
|
30
|
+
typedef Environment<AST_Node*> Env;
|
|
31
|
+
|
|
32
|
+
class Contextualize : public Operation_CRTP<Selector*, Contextualize> {
|
|
33
|
+
|
|
34
|
+
Context& ctx;
|
|
35
|
+
Eval* eval;
|
|
36
|
+
Env* env;
|
|
37
|
+
Selector* parent;
|
|
38
|
+
Backtrace* backtrace;
|
|
39
|
+
|
|
40
|
+
Selector* fallback_impl(AST_Node* n);
|
|
41
|
+
|
|
42
|
+
public:
|
|
43
|
+
Selector* placeholder;
|
|
44
|
+
Selector* extender;
|
|
45
|
+
Contextualize(Context&, Eval*, Env*, Backtrace*, Selector* placeholder = 0, Selector* extender = 0);
|
|
46
|
+
virtual ~Contextualize();
|
|
47
|
+
Contextualize* with(Selector*, Env*, Backtrace*, Selector* placeholder = 0, Selector* extender = 0);
|
|
48
|
+
using Operation<Selector*>::operator();
|
|
49
|
+
|
|
50
|
+
Selector* operator()(Selector_Schema*);
|
|
51
|
+
Selector* operator()(Selector_List*);
|
|
52
|
+
Selector* operator()(Complex_Selector*);
|
|
53
|
+
Selector* operator()(Compound_Selector*);
|
|
54
|
+
Selector* operator()(Wrapped_Selector*);
|
|
55
|
+
Selector* operator()(Pseudo_Selector*);
|
|
56
|
+
Selector* operator()(Attribute_Selector*);
|
|
57
|
+
Selector* operator()(Selector_Qualifier*);
|
|
58
|
+
Selector* operator()(Type_Selector*);
|
|
59
|
+
Selector* operator()(Selector_Placeholder*);
|
|
60
|
+
Selector* operator()(Selector_Reference*);
|
|
61
|
+
|
|
62
|
+
template <typename U>
|
|
63
|
+
Selector* fallback(U x) { return fallback_impl(x); }
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#ifndef DEBUG_H
|
|
2
|
+
#define DEBUG_H
|
|
3
|
+
|
|
4
|
+
#include <stdint.h>
|
|
5
|
+
|
|
6
|
+
enum dbg_lvl_t : uint32_t {
|
|
7
|
+
NONE = 0,
|
|
8
|
+
TRIM = 1,
|
|
9
|
+
CHUNKS = 2,
|
|
10
|
+
SUBWEAVE = 4,
|
|
11
|
+
WEAVE = 8,
|
|
12
|
+
EXTEND_COMPOUND = 16,
|
|
13
|
+
EXTEND_COMPLEX = 32,
|
|
14
|
+
LCS = 64,
|
|
15
|
+
EXTEND_OBJECT = 128,
|
|
16
|
+
ALL = UINT32_MAX
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
#ifdef DEBUG
|
|
20
|
+
|
|
21
|
+
#ifndef DEBUG_LVL
|
|
22
|
+
const uint32_t debug_lvl = UINT32_MAX;
|
|
23
|
+
#else
|
|
24
|
+
const uint32_t debug_lvl = (DEBUG_LVL);
|
|
25
|
+
#endif // DEBUG_LVL
|
|
26
|
+
|
|
27
|
+
#define DEBUG_PRINT(lvl, x) if((lvl) & debug_lvl) { std::cerr << x; }
|
|
28
|
+
#define DEBUG_PRINTLN(lvl, x) if((lvl) & debug_lvl) { std::cerr << x << std::endl; }
|
|
29
|
+
#define DEBUG_EXEC(lvl, x) if((lvl) & debug_lvl) { x; }
|
|
30
|
+
|
|
31
|
+
#else // DEBUG
|
|
32
|
+
|
|
33
|
+
#define DEBUG_PRINT(lvl, x)
|
|
34
|
+
#define DEBUG_PRINTLN(lvl, x)
|
|
35
|
+
#define DEBUG_EXEC(lvl, x)
|
|
36
|
+
|
|
37
|
+
#endif // DEBUG
|
|
38
|
+
|
|
39
|
+
#endif // DEBUG_H
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#define SASS_ENVIRONMENT
|
|
2
|
+
|
|
3
|
+
#include <string>
|
|
4
|
+
#include <map>
|
|
5
|
+
#include "ast_def_macros.hpp"
|
|
6
|
+
#include <iostream>
|
|
7
|
+
|
|
8
|
+
namespace Sass {
|
|
9
|
+
using std::string;
|
|
10
|
+
using std::map;
|
|
11
|
+
using std::cerr;
|
|
12
|
+
using std::endl;
|
|
13
|
+
|
|
14
|
+
template <typename T>
|
|
15
|
+
class Environment {
|
|
16
|
+
// TODO: test with unordered_map
|
|
17
|
+
map<string, T> current_frame_;
|
|
18
|
+
ADD_PROPERTY(Environment*, parent);
|
|
19
|
+
|
|
20
|
+
public:
|
|
21
|
+
Environment() : current_frame_(map<string, T>()), parent_(0) { }
|
|
22
|
+
|
|
23
|
+
map<string, T>& current_frame() { return current_frame_; }
|
|
24
|
+
|
|
25
|
+
void link(Environment& env) { parent_ = &env; }
|
|
26
|
+
void link(Environment* env) { parent_ = env; }
|
|
27
|
+
|
|
28
|
+
bool has(const string key) const
|
|
29
|
+
{
|
|
30
|
+
if (current_frame_.count(key)) return true;
|
|
31
|
+
else if (parent_) return parent_->has(key);
|
|
32
|
+
else return false;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
bool current_frame_has(const string key) const
|
|
36
|
+
{ return !!current_frame_.count(key); }
|
|
37
|
+
|
|
38
|
+
Environment* grandparent() const
|
|
39
|
+
{
|
|
40
|
+
if(parent_ && parent_->parent_) return parent_->parent_;
|
|
41
|
+
else return 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
bool global_frame_has(const string key) const
|
|
45
|
+
{
|
|
46
|
+
if(parent_ && !grandparent()) {
|
|
47
|
+
return has(key);
|
|
48
|
+
}
|
|
49
|
+
else if(parent_) {
|
|
50
|
+
return parent_->global_frame_has(key);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
T& operator[](const string key)
|
|
58
|
+
{
|
|
59
|
+
if (current_frame_.count(key)) return current_frame_[key];
|
|
60
|
+
else if (parent_) return (*parent_)[key];
|
|
61
|
+
else return current_frame_[key];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
void print()
|
|
65
|
+
{
|
|
66
|
+
for (typename map<string, T>::iterator i = current_frame_.begin(); i != current_frame_.end(); ++i) {
|
|
67
|
+
cerr << i->first << endl;
|
|
68
|
+
}
|
|
69
|
+
if (parent_) {
|
|
70
|
+
cerr << "---" << endl;
|
|
71
|
+
parent_->print();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|