1 #ifndef SASS_CONTEXT_H 2 #define SASS_CONTEXT_H 3 4 // sass.hpp must go before all system headers to get the 5 // __EXTENSIONS__ fix on Solaris. 6 #include "sass.hpp" 7 #include "ast.hpp" 8 9 10 #define BUFFERSIZE 255 11 #include "b64/encode.h" 12 13 #include "sass_context.hpp" 14 #include "stylesheet.hpp" 15 #include "plugins.hpp" 16 #include "output.hpp" 17 18 namespace Sass { 19 20 class Context { 21 public: 22 void import_url (Import* imp, sass::string load_path, const sass::string& ctx_path); call_headers(const sass::string & load_path,const char * ctx_path,SourceSpan & pstate,Import * imp)23 bool call_headers(const sass::string& load_path, const char* ctx_path, SourceSpan& pstate, Import* imp) 24 { return call_loader(load_path, ctx_path, pstate, imp, c_headers, false); }; call_importers(const sass::string & load_path,const char * ctx_path,SourceSpan & pstate,Import * imp)25 bool call_importers(const sass::string& load_path, const char* ctx_path, SourceSpan& pstate, Import* imp) 26 { return call_loader(load_path, ctx_path, pstate, imp, c_importers, true); }; 27 28 private: 29 bool call_loader(const sass::string& load_path, const char* ctx_path, SourceSpan& pstate, Import* imp, sass::vector<Sass_Importer_Entry> importers, bool only_one = true); 30 31 public: 32 const sass::string CWD; 33 struct Sass_Options& c_options; 34 sass::string entry_path; 35 size_t head_imports; 36 Plugins plugins; 37 Output emitter; 38 39 // generic ast node garbage container 40 // used to avoid possible circular refs 41 CallStack ast_gc; 42 // resources add under our control 43 // these are guaranteed to be freed 44 sass::vector<char*> strings; 45 sass::vector<Resource> resources; 46 std::map<const sass::string, StyleSheet> sheets; 47 ImporterStack import_stack; 48 sass::vector<Sass_Callee> callee_stack; 49 sass::vector<Backtrace> traces; 50 Extender extender; 51 52 struct Sass_Compiler* c_compiler; 53 54 // absolute paths to includes 55 sass::vector<sass::string> included_files; 56 // relative includes for sourcemap 57 sass::vector<sass::string> srcmap_links; 58 // vectors above have same size 59 60 sass::vector<sass::string> plugin_paths; // relative paths to load plugins 61 sass::vector<sass::string> include_paths; // lookup paths for includes 62 63 void apply_custom_headers(Block_Obj root, const char* path, SourceSpan pstate); 64 65 sass::vector<Sass_Importer_Entry> c_headers; 66 sass::vector<Sass_Importer_Entry> c_importers; 67 sass::vector<Sass_Function_Entry> c_functions; 68 69 void add_c_header(Sass_Importer_Entry header); 70 void add_c_importer(Sass_Importer_Entry importer); 71 void add_c_function(Sass_Function_Entry function); 72 73 const sass::string indent; // String to be used for indentation 74 const sass::string linefeed; // String to be used for line feeds 75 const sass::string input_path; // for relative paths in src-map 76 const sass::string output_path; // for relative paths to the output 77 const sass::string source_map_file; // path to source map file (enables feature) 78 const sass::string source_map_root; // path for sourceRoot property (pass-through) 79 80 virtual ~Context(); 81 Context(struct Sass_Context&); 82 virtual Block_Obj parse() = 0; 83 virtual Block_Obj compile(); 84 virtual char* render(Block_Obj root); 85 virtual char* render_srcmap(); 86 87 void register_resource(const Include&, const Resource&); 88 void register_resource(const Include&, const Resource&, SourceSpan&); 89 sass::vector<Include> find_includes(const Importer& import); 90 Include load_import(const Importer&, SourceSpan pstate); 91 output_style()92 Sass_Output_Style output_style() { return c_options.output_style; }; 93 sass::vector<sass::string> get_included_files(bool skip = false, size_t headers = 0); 94 95 private: 96 void collect_plugin_paths(const char* paths_str); 97 void collect_plugin_paths(string_list* paths_array); 98 void collect_include_paths(const char* paths_str); 99 void collect_include_paths(string_list* paths_array); 100 sass::string format_embedded_source_map(); 101 sass::string format_source_mapping_url(const sass::string& out_path); 102 103 104 // void register_built_in_functions(Env* env); 105 // void register_function(Signature sig, Native_Function f, Env* env); 106 // void register_function(Signature sig, Native_Function f, size_t arity, Env* env); 107 // void register_overload_stub(sass::string name, Env* env); 108 109 public: cwd()110 const sass::string& cwd() { return CWD; }; 111 }; 112 113 class File_Context : public Context { 114 public: File_Context(struct Sass_File_Context & ctx)115 File_Context(struct Sass_File_Context& ctx) 116 : Context(ctx) 117 { } 118 virtual ~File_Context(); 119 virtual Block_Obj parse(); 120 }; 121 122 class Data_Context : public Context { 123 public: 124 char* source_c_str; 125 char* srcmap_c_str; Data_Context(struct Sass_Data_Context & ctx)126 Data_Context(struct Sass_Data_Context& ctx) 127 : Context(ctx) 128 { 129 source_c_str = ctx.source_string; 130 srcmap_c_str = ctx.srcmap_string; 131 ctx.source_string = 0; // passed away 132 ctx.srcmap_string = 0; // passed away 133 } 134 virtual ~Data_Context(); 135 virtual Block_Obj parse(); 136 }; 137 138 } 139 140 #endif 141