sassc 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ext/libsass/.gitignore +6 -0
  4. data/ext/libsass/.travis.yml +5 -1
  5. data/ext/libsass/Makefile +12 -3
  6. data/ext/libsass/Makefile.am +16 -28
  7. data/ext/libsass/Readme.md +1 -0
  8. data/ext/libsass/appveyor.yml +1 -2
  9. data/ext/libsass/ast.cpp +9 -0
  10. data/ext/libsass/ast.hpp +152 -55
  11. data/ext/libsass/ast_factory.hpp +2 -0
  12. data/ext/libsass/ast_fwd_decl.hpp +1 -0
  13. data/ext/libsass/backtrace.hpp +2 -2
  14. data/ext/libsass/bind.cpp +15 -13
  15. data/ext/libsass/configure.ac +17 -5
  16. data/ext/libsass/constants.cpp +22 -2
  17. data/ext/libsass/constants.hpp +21 -2
  18. data/ext/libsass/context.cpp +79 -57
  19. data/ext/libsass/context.hpp +23 -9
  20. data/ext/libsass/contextualize.cpp +2 -28
  21. data/ext/libsass/contextualize.hpp +6 -10
  22. data/ext/libsass/contextualize_eval.cpp +93 -0
  23. data/ext/libsass/contextualize_eval.hpp +44 -0
  24. data/ext/libsass/contrib/plugin.cpp +57 -0
  25. data/ext/libsass/cssize.cpp +3 -1
  26. data/ext/libsass/debugger.hpp +242 -83
  27. data/ext/libsass/emitter.cpp +1 -1
  28. data/ext/libsass/emitter.hpp +1 -1
  29. data/ext/libsass/environment.hpp +109 -25
  30. data/ext/libsass/error_handling.cpp +3 -3
  31. data/ext/libsass/error_handling.hpp +0 -1
  32. data/ext/libsass/eval.cpp +145 -61
  33. data/ext/libsass/eval.hpp +9 -1
  34. data/ext/libsass/expand.cpp +134 -60
  35. data/ext/libsass/expand.hpp +5 -2
  36. data/ext/libsass/extend.cpp +7 -5
  37. data/ext/libsass/file.cpp +176 -123
  38. data/ext/libsass/file.hpp +44 -7
  39. data/ext/libsass/functions.cpp +36 -17
  40. data/ext/libsass/functions.hpp +2 -2
  41. data/ext/libsass/inspect.cpp +23 -14
  42. data/ext/libsass/inspect.hpp +1 -0
  43. data/ext/libsass/json.cpp +132 -135
  44. data/ext/libsass/lexer.cpp +133 -0
  45. data/ext/libsass/lexer.hpp +239 -0
  46. data/ext/libsass/listize.cpp +83 -0
  47. data/ext/libsass/listize.hpp +41 -0
  48. data/ext/libsass/operation.hpp +2 -0
  49. data/ext/libsass/output.cpp +5 -6
  50. data/ext/libsass/parser.cpp +426 -388
  51. data/ext/libsass/parser.hpp +97 -109
  52. data/ext/libsass/plugins.cpp +15 -2
  53. data/ext/libsass/plugins.hpp +6 -4
  54. data/ext/libsass/position.cpp +52 -17
  55. data/ext/libsass/position.hpp +19 -17
  56. data/ext/libsass/prelexer.cpp +202 -235
  57. data/ext/libsass/prelexer.hpp +73 -333
  58. data/ext/libsass/sass.cpp +21 -11
  59. data/ext/libsass/sass.h +6 -6
  60. data/ext/libsass/sass_context.cpp +167 -81
  61. data/ext/libsass/sass_context.h +26 -6
  62. data/ext/libsass/sass_functions.cpp +49 -40
  63. data/ext/libsass/sass_functions.h +55 -43
  64. data/ext/libsass/sass_interface.cpp +9 -8
  65. data/ext/libsass/sass_interface.h +3 -3
  66. data/ext/libsass/sass_version.h +8 -0
  67. data/ext/libsass/sass_version.h.in +8 -0
  68. data/ext/libsass/script/ci-build-libsass +3 -3
  69. data/ext/libsass/script/ci-report-coverage +2 -1
  70. data/ext/libsass/source_map.cpp +2 -2
  71. data/ext/libsass/util.cpp +60 -11
  72. data/ext/libsass/util.hpp +6 -1
  73. data/ext/libsass/win/libsass.filters +12 -0
  74. data/ext/libsass/win/libsass.vcxproj +10 -0
  75. data/lib/sassc.rb +3 -1
  76. data/lib/sassc/cache_stores/base.rb +2 -0
  77. data/lib/sassc/dependency.rb +3 -1
  78. data/lib/sassc/engine.rb +31 -16
  79. data/lib/sassc/error.rb +3 -2
  80. data/lib/sassc/functions_handler.rb +54 -0
  81. data/lib/sassc/import_handler.rb +41 -0
  82. data/lib/sassc/importer.rb +4 -31
  83. data/lib/sassc/native.rb +1 -1
  84. data/lib/sassc/native/native_context_api.rb +3 -2
  85. data/lib/sassc/script.rb +0 -51
  86. data/lib/sassc/version.rb +1 -1
  87. data/sassc.gemspec +1 -0
  88. data/test/custom_importer_test.rb +72 -69
  89. data/test/engine_test.rb +53 -54
  90. data/test/functions_test.rb +40 -39
  91. data/test/native_test.rb +145 -149
  92. data/test/output_style_test.rb +98 -0
  93. data/test/test_helper.rb +21 -7
  94. metadata +28 -2
@@ -25,10 +25,12 @@ namespace Sass {
25
25
  class Parser : public ParserState {
26
26
  private:
27
27
  void add_single_file (Import* imp, string import_path);
28
+ void import_single_file (Import* imp, string import_path);
28
29
  public:
29
30
  class AST_Node;
30
31
 
31
32
  enum Syntactic_Context { nothing, mixin_def, function_def };
33
+ bool do_import(const string& import_path, Import* imp, vector<Sass_Importer_Entry> importers, bool only_one = true);
32
34
 
33
35
  Context& ctx;
34
36
  vector<Block*> block_stack;
@@ -48,7 +50,7 @@ namespace Sass {
48
50
 
49
51
  Parser(Context& ctx, const ParserState& pstate)
50
52
  : ParserState(pstate), ctx(ctx), block_stack(0), stack(0), last_media_block(0),
51
- source(0), position(0), end(0), before_token(pstate), after_token(pstate), pstate("[NULL]"), indentation(0)
53
+ source(0), position(0), end(0), before_token(pstate), after_token(pstate), pstate(pstate), indentation(0)
52
54
  { in_at_root = false; stack.push_back(nothing); }
53
55
 
54
56
  // static Parser from_string(const string& src, Context& ctx, ParserState pstate = ParserState("[STRING]"));
@@ -71,140 +73,119 @@ namespace Sass {
71
73
 
72
74
  bool peek_newline(const char* start = 0);
73
75
 
76
+ // skip over spaces, tabs and line comments
74
77
  template <prelexer mx>
75
- const char* peek(const char* start = 0)
78
+ const char* sneak(const char* start = 0)
76
79
  {
77
- if (!start) start = position;
78
- const char* it_before_token;
79
- if (mx == block_comment) {
80
- it_before_token = // start;
81
- zero_plus< alternatives<spaces, line_comment> >(start);
82
- }
83
- else if (/*mx == ancestor_of ||*/ mx == no_spaces) {
84
- it_before_token = position;
85
- }
86
- else if (mx == spaces) {
87
- it_before_token = mx(start);
88
- if (it_before_token) {
89
- return it_before_token;
90
- }
91
- else {
92
- return 0;
93
- }
94
- }
95
- else if (mx == optional_spaces) {
96
- it_before_token = optional_spaces(start);
97
- }
98
- else if (mx == line_comment_prefix || mx == block_comment_prefix) {
99
- it_before_token = position;
100
- }
101
- else {
102
- it_before_token = optional_spaces_and_comments(start);
103
- }
104
- const char* it_after_token = mx(it_before_token);
105
- if (it_after_token) {
106
- return it_after_token;
107
- }
108
- else {
109
- return 0;
80
+
81
+ // maybe use optional start position from arguments?
82
+ const char* it_position = start ? start : position;
83
+
84
+ // skip white-space?
85
+ if (mx == spaces ||
86
+ mx == no_spaces ||
87
+ mx == css_comments ||
88
+ mx == css_whitespace ||
89
+ mx == optional_spaces ||
90
+ mx == optional_css_comments ||
91
+ mx == optional_css_whitespace
92
+ ) {
93
+ return it_position;
110
94
  }
95
+
96
+ // skip over spaces, tabs and sass line comments
97
+ const char* pos = optional_css_whitespace(it_position);
98
+ // always return a valid position
99
+ return pos ? pos : it_position;
100
+
111
101
  }
112
102
 
113
- // white-space handling is built into the lexer
114
- // this way you do not need to parse it yourself
115
- // some matchers don't accept certain white-space
103
+ // peek will only skip over space, tabs and line comment
104
+ // return the position where the lexer match will occur
116
105
  template <prelexer mx>
117
- const char* lex()
106
+ const char* peek(const char* start = 0)
118
107
  {
119
108
 
120
- // remeber interesting position
121
- const char* wspace_start = position;
122
-
123
- // advance position for next call
124
- before_token = after_token;
109
+ // sneak up to the actual token we want to lex
110
+ // this should skip over white-space if desired
111
+ const char* it_before_token = sneak < mx >(start);
125
112
 
126
- // after optional whitespace
127
- const char* it_before_token;
113
+ // match the given prelexer
114
+ return mx(it_before_token);
128
115
 
129
- if (mx == block_comment) {
130
- // a block comment can be preceded by spaces and/or line comments
131
- it_before_token = zero_plus< alternatives<spaces, line_comment> >(position);
132
- }
133
- else if (mx == url || mx == no_spaces) {
134
- // parse everything literally
135
- it_before_token = position;
136
- }
116
+ }
137
117
 
138
- else if (mx == spaces) {
139
- it_before_token = spaces(position);
140
- if (it_before_token) {
141
- return position = it_before_token;
142
- }
143
- else {
144
- return 0;
145
- }
146
- }
118
+ // white-space handling is built into the lexer
119
+ // this way you do not need to parse it yourself
120
+ // some matchers don't accept certain white-space
121
+ // we do not support start arg, since we manipulate
122
+ // sourcemap offset and we modify the position pointer!
123
+ // lex will only skip over space, tabs and line comment
124
+ template <prelexer mx>
125
+ const char* lex(bool lazy = true)
126
+ {
147
127
 
148
- else if (mx == optional_spaces_and_comments) {
149
- it_before_token = position;
150
- }
151
- else if (mx == spaces_and_comments) {
152
- it_before_token = position;
153
- }
128
+ // position considered before lexed token
129
+ // we can skip whitespace or comments for
130
+ // lazy developers (but we need control)
131
+ const char* it_before_token = position;
154
132
 
155
- else if (mx == optional_spaces) {
156
- // ToDo: what are optiona_spaces ???
157
- it_before_token = optional_spaces(position);
158
- }
159
- else {
160
- // most can be preceded by spaces and comments
161
- it_before_token = optional_spaces_and_comments(position);
162
- }
133
+ // sneak up to the actual token we want to lex
134
+ // this should skip over white-space if desired
135
+ if (lazy) it_before_token = sneak < mx >(position);
163
136
 
164
137
  // now call matcher to get position after token
165
138
  const char* it_after_token = mx(it_before_token);
139
+
166
140
  // assertion that we got a valid match
167
141
  if (it_after_token == 0) return 0;
142
+ // assertion that we actually lexed something
143
+ if (it_after_token == it_before_token) return 0;
168
144
 
169
- // add whitespace after previous and before this token
170
- while (position < it_before_token && *position) {
171
- if (*position == '\n') {
172
- ++ before_token.line;
173
- before_token.column = 0;
174
- } else {
175
- ++ before_token.column;
176
- }
177
- ++position;
178
- }
179
-
180
- // copy position
181
- after_token = before_token;
145
+ // create new lexed token object (holds all parse result information)
146
+ lexed = Token(position, it_before_token, it_after_token);
182
147
 
183
- Offset size(0, 0);
148
+ // advance position (add whitespace before current token)
149
+ before_token = after_token.add(position, it_before_token);
184
150
 
185
- // increase position to include current token
186
- while (position < it_after_token && *position) {
187
- if (*position == '\n') {
188
- ++ size.line;
189
- size.column = 0;
190
- } else {
191
- ++ size.column;
192
- }
193
- ++position;
194
- }
195
-
196
- after_token = after_token + size;
151
+ // update after_token position for current token
152
+ after_token.add(it_before_token, it_after_token);
197
153
 
198
- // create parsed token string (public member)
199
- lexed = Token(wspace_start, it_before_token, it_after_token, optional_spaces_and_comments(it_after_token) ? optional_spaces_and_comments(it_after_token) : it_after_token, before_token);
200
- Position pos(before_token.file, before_token.line, before_token.column);
201
- pstate = ParserState(path, lexed, pos, size);
154
+ // ToDo: could probably do this incremetal on original object (API wants offset?)
155
+ pstate = ParserState(path, source, lexed, before_token, after_token - before_token);
202
156
 
203
157
  // advance internal char iterator
204
158
  return position = it_after_token;
205
159
 
206
160
  }
207
161
 
162
+ // lex_css skips over space, tabs, line and block comment
163
+ // all block comments will be consumed and thrown away
164
+ // source-map position will point to token after the comment
165
+ template <prelexer mx>
166
+ const char* lex_css()
167
+ {
168
+ // copy old token
169
+ Token prev = lexed;
170
+ // throw away comments
171
+ // update srcmap position
172
+ lex < css_comments >();
173
+ // now lex a new token
174
+ const char* pos = lex< mx >();
175
+ // maybe restore prev token
176
+ if (pos == 0) lexed = prev;
177
+ // return match
178
+ return pos;
179
+ }
180
+
181
+ // all block comments will be skipped and thrown away
182
+ template <prelexer mx>
183
+ const char* peek_css(const char* start = 0)
184
+ {
185
+ // now peek a token (skip comments first)
186
+ return peek< mx >(peek < css_comments >(start));
187
+ }
188
+
208
189
  #ifdef __clang__
209
190
 
210
191
  #pragma clang diagnostic pop
@@ -212,6 +193,11 @@ namespace Sass {
212
193
  #endif
213
194
 
214
195
  void error(string msg, Position pos);
196
+ // generate message with given and expected sample
197
+ // text before and in the middle are configurable
198
+ void css_error(const string& msg,
199
+ const string& prefix = " after ",
200
+ const string& middle = ", was: ");
215
201
  void read_bom();
216
202
 
217
203
  Block* parse();
@@ -220,8 +206,8 @@ namespace Sass {
220
206
  Parameters* parse_parameters();
221
207
  Parameter* parse_parameter();
222
208
  Mixin_Call* parse_mixin_call();
223
- Arguments* parse_arguments();
224
- Argument* parse_argument();
209
+ Arguments* parse_arguments(bool has_url = false);
210
+ Argument* parse_argument(bool has_url = false);
225
211
  Assignment* parse_assignment();
226
212
  // Propset* parse_propset();
227
213
  Ruleset* parse_ruleset(Selector_Lookahead lookahead);
@@ -282,6 +268,8 @@ namespace Sass {
282
268
  Error* parse_error();
283
269
  Debug* parse_debug();
284
270
 
271
+ void parse_block_comments(Block* block);
272
+
285
273
  Selector_Lookahead lookahead_for_selector(const char* start = 0);
286
274
  Selector_Lookahead lookahead_for_extension_target(const char* start = 0);
287
275
 
@@ -45,7 +45,8 @@ namespace Sass {
45
45
  {
46
46
 
47
47
  typedef const char* (*__plugin_version__)(void);
48
- typedef Sass_C_Function_List (*__plugin_load_fns__)(void);
48
+ typedef Sass_Function_List (*__plugin_load_fns__)(void);
49
+ typedef Sass_Importer_List (*__plugin_load_imps__)(void);
49
50
 
50
51
  if (LOAD_LIB(plugin, path))
51
52
  {
@@ -57,9 +58,21 @@ namespace Sass {
57
58
  // try to get import address for "libsass_load_functions"
58
59
  if (LOAD_LIB_FN(__plugin_load_fns__, plugin_load_functions, "libsass_load_functions"))
59
60
  {
60
- Sass_C_Function_List fns = plugin_load_functions();
61
+ Sass_Function_List fns = plugin_load_functions();
61
62
  while (fns && *fns) { functions.push_back(*fns); ++ fns; }
62
63
  }
64
+ // try to get import address for "libsass_load_importers"
65
+ if (LOAD_LIB_FN(__plugin_load_imps__, plugin_load_importers, "libsass_load_importers"))
66
+ {
67
+ Sass_Importer_List imps = plugin_load_importers();
68
+ while (imps && *imps) { importers.push_back(*imps); ++ imps; }
69
+ }
70
+ // try to get import address for "libsass_load_headers"
71
+ if (LOAD_LIB_FN(__plugin_load_imps__, plugin_load_headers, "libsass_load_headers"))
72
+ {
73
+ Sass_Importer_List imps = plugin_load_headers();
74
+ while (imps && *imps) { headers.push_back(*imps); ++ imps; }
75
+ }
63
76
  // success
64
77
  return true;
65
78
  }
@@ -42,12 +42,14 @@ namespace Sass {
42
42
  size_t load_plugins(const string& path);
43
43
 
44
44
  public: // public accessors
45
- // const vector<Sass_C_Import_Callback> get_importers(void) { return importers; };
46
- const vector<Sass_C_Function_Callback> get_functions(void) { return functions; };
45
+ const vector<Sass_Importer_Entry> get_headers(void) { return headers; };
46
+ const vector<Sass_Importer_Entry> get_importers(void) { return importers; };
47
+ const vector<Sass_Function_Entry> get_functions(void) { return functions; };
47
48
 
48
49
  private: // private vars
49
- // vector<Sass_C_Import_Callback> importers;
50
- vector<Sass_C_Function_Callback> functions;
50
+ vector<Sass_Importer_Entry> headers;
51
+ vector<Sass_Importer_Entry> importers;
52
+ vector<Sass_Function_Entry> functions;
51
53
 
52
54
  };
53
55
 
@@ -19,20 +19,42 @@ namespace Sass {
19
19
  Offset::Offset(const size_t line, const size_t column)
20
20
  : line(line), column(column) { }
21
21
 
22
+ // init/create instance from const char substring
23
+ Offset Offset::init(const char* beg, const char* end)
24
+ {
25
+ Offset offset(0, 0);
26
+ if (end == 0) {
27
+ end += strlen(beg);
28
+ }
29
+ offset.add(beg, end);
30
+ return offset;
31
+ }
32
+
22
33
  // increase offset by given string (mostly called by lexer)
23
34
  // increase line counter and count columns on the last line
24
- Offset Offset::inc(const char* begin, const char* end) const
35
+ // ToDo: make the col count utf8 aware
36
+ Offset Offset::add(const char* begin, const char* end)
25
37
  {
26
- Offset offset(line, column);
38
+ if (end == 0) return *this;
27
39
  while (begin < end && *begin) {
28
40
  if (*begin == '\n') {
29
- ++ offset.line;
30
- offset.column = 0;
41
+ ++ line;
42
+ // start new line
43
+ column = 0;
31
44
  } else {
32
- ++ offset.column;
45
+ ++ column;
33
46
  }
34
47
  ++begin;
35
48
  }
49
+ return *this;
50
+ }
51
+
52
+ // increase offset by given string (mostly called by lexer)
53
+ // increase line counter and count columns on the last line
54
+ Offset Offset::inc(const char* begin, const char* end) const
55
+ {
56
+ Offset offset(line, column);
57
+ offset.add(begin, end);
36
58
  return offset;
37
59
  }
38
60
 
@@ -48,12 +70,17 @@ namespace Sass {
48
70
 
49
71
  void Offset::operator+= (const Offset &off)
50
72
  {
51
- *this = Offset(line + off.line, off.line > 0 ? off.column : off.column + column);
73
+ *this = Offset(line + off.line, off.line > 0 ? off.column : column + off.column);
52
74
  }
53
75
 
54
76
  Offset Offset::operator+ (const Offset &off) const
55
77
  {
56
- return Offset(line + off.line, off.line > 0 ? off.column : off.column + column);
78
+ return Offset(line + off.line, off.line > 0 ? off.column : column + off.column);
79
+ }
80
+
81
+ Offset Offset::operator- (const Offset &off) const
82
+ {
83
+ return Offset(line - off.line, off.line == line ? column - off.column : column);
57
84
  }
58
85
 
59
86
  Position::Position(const size_t file)
@@ -69,17 +96,20 @@ namespace Sass {
69
96
  : Offset(line, column), file(file) { }
70
97
 
71
98
 
72
- ParserState::ParserState(string path)
73
- : Position(-1, 0, 0), path(path), offset(0, 0), token() { }
99
+ ParserState::ParserState(string path, const char* src, const size_t file)
100
+ : Position(file, 0, 0), path(path), src(src), offset(0, 0), token() { }
74
101
 
75
- ParserState::ParserState(string path, const size_t file)
76
- : Position(file, 0, 0), path(path), offset(0, 0), token() { }
102
+ ParserState::ParserState(string path, const char* src, Position position, Offset offset)
103
+ : Position(position), path(path), src(src), offset(offset), token() { }
77
104
 
78
- ParserState::ParserState(string path, Position position, Offset offset)
79
- : Position(position), path(path), offset(offset), token() { }
105
+ ParserState::ParserState(string path, const char* src, Token token, Position position, Offset offset)
106
+ : Position(position), path(path), src(src), offset(offset), token(token) { }
80
107
 
81
- ParserState::ParserState(string path, Token token, Position position, Offset offset)
82
- : Position(position), path(path), offset(offset), token(token) { }
108
+ Position Position::add(const char* begin, const char* end)
109
+ {
110
+ Offset::add(begin, end);
111
+ return *this;
112
+ }
83
113
 
84
114
  Position Position::inc(const char* begin, const char* end) const
85
115
  {
@@ -100,12 +130,17 @@ namespace Sass {
100
130
 
101
131
  void Position::operator+= (const Offset &off)
102
132
  {
103
- *this = Position(file, line + off.line, off.line > 0 ? off.column : off.column + column);
133
+ *this = Position(file, line + off.line, off.line > 0 ? off.column : column + off.column);
104
134
  }
105
135
 
106
136
  const Position Position::operator+ (const Offset &off) const
107
137
  {
108
- return Position(file, line + off.line, off.line > 0 ? off.column : off.column + column);
138
+ return Position(file, line + off.line, off.line > 0 ? off.column : column + off.column);
139
+ }
140
+
141
+ const Offset Position::operator- (const Offset &off) const
142
+ {
143
+ return Offset(line - off.line, off.line == line ? column - off.column : column);
109
144
  }
110
145
 
111
146
  /* not used anymore - remove?
@@ -19,13 +19,18 @@ namespace Sass {
19
19
  Offset(const size_t line, const size_t column);
20
20
 
21
21
  // return new position, incremented by the given string
22
+ Offset add(const char* begin, const char* end);
22
23
  Offset inc(const char* begin, const char* end) const;
23
24
 
25
+ // init/create instance from const char substring
26
+ static Offset init(const char* beg, const char* end);
27
+
24
28
  public: // overload operators for position
25
29
  void operator+= (const Offset &pos);
26
30
  bool operator== (const Offset &pos) const;
27
31
  bool operator!= (const Offset &pos) const;
28
32
  Offset operator+ (const Offset &off) const;
33
+ Offset operator- (const Offset &off) const;
29
34
 
30
35
  public: // overload output stream operator
31
36
  // friend ostream& operator<<(ostream& strm, const Offset& off);
@@ -52,7 +57,9 @@ namespace Sass {
52
57
  bool operator== (const Position &pos) const;
53
58
  bool operator!= (const Position &pos) const;
54
59
  const Position operator+ (const Offset &off) const;
60
+ const Offset operator- (const Offset &off) const;
55
61
  // return new position, incremented by the given string
62
+ Position add(const char* begin, const char* end);
56
63
  Position inc(const char* begin, const char* end) const;
57
64
 
58
65
  public: // overload output stream operator
@@ -69,25 +76,19 @@ namespace Sass {
69
76
  const char* prefix;
70
77
  const char* begin;
71
78
  const char* end;
72
- const char* suffix;
73
- Position start;
74
- Position stop;
75
79
 
76
80
  Token()
77
- : prefix(0), begin(0), end(0), suffix(0), start(0), stop(0) { }
78
- Token(const char* b, const char* e, const Position pos)
79
- : prefix(b), begin(b), end(e), suffix(e), start(pos), stop(pos.inc(b, e)) { }
80
- Token(const char* s, const Position pos)
81
- : prefix(s), begin(s), end(s + strlen(s)), suffix(end), start(pos), stop(pos.inc(s, s + strlen(s))) { }
82
- Token(const char* p, const char* b, const char* e, const char* s, const Position pos)
83
- : prefix(p), begin(b), end(e), suffix(s), start(pos), stop(pos.inc(b, e)) { }
81
+ : prefix(0), begin(0), end(0) { }
82
+ Token(const char* b, const char* e)
83
+ : prefix(b), begin(b), end(e) { }
84
+ Token(const char* str)
85
+ : prefix(str), begin(str), end(str + strlen(str)) { }
86
+ Token(const char* p, const char* b, const char* e)
87
+ : prefix(p), begin(b), end(e) { }
84
88
 
85
89
  size_t length() const { return end - begin; }
86
90
  string ws_before() const { return string(prefix, begin); }
87
91
  string to_string() const { return string(begin, end); }
88
- string ws_after() const { return string(end, suffix); }
89
-
90
- // string unquote() const;
91
92
 
92
93
  operator bool() { return begin && end && begin >= end; }
93
94
  operator string() { return to_string(); }
@@ -98,17 +99,18 @@ namespace Sass {
98
99
  class ParserState : public Position {
99
100
 
100
101
  public: // c-tor
101
- ParserState(string path);
102
- ParserState(string path, const size_t file);
103
- ParserState(string path, Position position, Offset offset = Offset(0, 0));
104
- ParserState(string path, Token token, Position position, Offset offset = Offset(0, 0));
102
+ ParserState(string path, const char* src = 0, const size_t file = string::npos);
103
+ ParserState(string path, const char* src, Position position, Offset offset = Offset(0, 0));
104
+ ParserState(string path, const char* src, Token token, Position position, Offset offset = Offset(0, 0));
105
105
 
106
106
  public: // down casts
107
107
  Offset off() { return *this; };
108
108
  Position pos() { return *this; };
109
+ ParserState pstate() { return *this; };
109
110
 
110
111
  public:
111
112
  string path;
113
+ const char* src;
112
114
  Offset offset;
113
115
  Token token;
114
116