sassc 2.0.1 → 2.1.0.pre1

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.
Files changed (200) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +7 -3
  5. data/CHANGELOG.md +3 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +23 -8
  9. data/ext/extconf.rb +39 -0
  10. data/ext/libsass/.gitignore +1 -0
  11. data/ext/libsass/GNUmakefile.am +23 -39
  12. data/ext/libsass/Makefile +56 -91
  13. data/ext/libsass/Makefile.conf +16 -2
  14. data/ext/libsass/configure.ac +8 -12
  15. data/ext/libsass/include/sass/base.h +1 -0
  16. data/ext/libsass/include/sass/context.h +1 -1
  17. data/ext/libsass/src/GNUmakefile.am +1 -5
  18. data/ext/libsass/src/ast.cpp +747 -2010
  19. data/ext/libsass/src/ast.hpp +239 -2383
  20. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  21. data/ext/libsass/src/ast2c.hpp +39 -0
  22. data/ext/libsass/src/ast_def_macros.hpp +62 -10
  23. data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
  24. data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
  25. data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
  26. data/ext/libsass/src/ast_sel_unify.cpp +280 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1475 -0
  28. data/ext/libsass/src/ast_selectors.hpp +568 -0
  29. data/ext/libsass/src/ast_supports.cpp +130 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +967 -0
  32. data/ext/libsass/src/ast_values.hpp +489 -0
  33. data/ext/libsass/src/backtrace.cpp +4 -0
  34. data/ext/libsass/src/base64vlq.cpp +3 -0
  35. data/ext/libsass/src/bind.cpp +18 -17
  36. data/ext/libsass/src/bind.hpp +3 -1
  37. data/ext/libsass/src/c2ast.cpp +64 -0
  38. data/ext/libsass/src/c2ast.hpp +14 -0
  39. data/ext/libsass/src/cencode.c +2 -2
  40. data/ext/libsass/src/check_nesting.cpp +52 -56
  41. data/ext/libsass/src/check_nesting.hpp +35 -34
  42. data/ext/libsass/src/color_maps.cpp +156 -153
  43. data/ext/libsass/src/color_maps.hpp +152 -152
  44. data/ext/libsass/src/constants.cpp +15 -0
  45. data/ext/libsass/src/constants.hpp +13 -0
  46. data/ext/libsass/src/context.cpp +24 -14
  47. data/ext/libsass/src/context.hpp +6 -6
  48. data/ext/libsass/src/cssize.cpp +69 -71
  49. data/ext/libsass/src/cssize.hpp +50 -50
  50. data/ext/libsass/src/debugger.hpp +117 -110
  51. data/ext/libsass/src/emitter.cpp +13 -12
  52. data/ext/libsass/src/emitter.hpp +13 -9
  53. data/ext/libsass/src/environment.cpp +15 -1
  54. data/ext/libsass/src/environment.hpp +6 -0
  55. data/ext/libsass/src/error_handling.cpp +36 -59
  56. data/ext/libsass/src/error_handling.hpp +29 -16
  57. data/ext/libsass/src/eval.cpp +302 -323
  58. data/ext/libsass/src/eval.hpp +64 -55
  59. data/ext/libsass/src/expand.cpp +94 -88
  60. data/ext/libsass/src/expand.hpp +33 -37
  61. data/ext/libsass/src/extend.cpp +38 -36
  62. data/ext/libsass/src/extend.hpp +15 -15
  63. data/ext/libsass/src/file.cpp +34 -2
  64. data/ext/libsass/src/fn_colors.cpp +594 -0
  65. data/ext/libsass/src/fn_colors.hpp +85 -0
  66. data/ext/libsass/src/fn_lists.cpp +284 -0
  67. data/ext/libsass/src/fn_lists.hpp +34 -0
  68. data/ext/libsass/src/fn_maps.cpp +94 -0
  69. data/ext/libsass/src/fn_maps.hpp +30 -0
  70. data/ext/libsass/src/fn_miscs.cpp +256 -0
  71. data/ext/libsass/src/fn_miscs.hpp +40 -0
  72. data/ext/libsass/src/fn_numbers.cpp +220 -0
  73. data/ext/libsass/src/fn_numbers.hpp +45 -0
  74. data/ext/libsass/src/fn_selectors.cpp +235 -0
  75. data/ext/libsass/src/fn_selectors.hpp +35 -0
  76. data/ext/libsass/src/fn_strings.cpp +254 -0
  77. data/ext/libsass/src/fn_strings.hpp +34 -0
  78. data/ext/libsass/src/fn_utils.cpp +156 -0
  79. data/ext/libsass/src/fn_utils.hpp +56 -0
  80. data/ext/libsass/src/inspect.cpp +101 -152
  81. data/ext/libsass/src/inspect.hpp +69 -73
  82. data/ext/libsass/src/json.cpp +2 -2
  83. data/ext/libsass/src/lexer.cpp +6 -3
  84. data/ext/libsass/src/listize.cpp +9 -11
  85. data/ext/libsass/src/listize.hpp +11 -7
  86. data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
  87. data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
  88. data/ext/libsass/src/node.cpp +13 -10
  89. data/ext/libsass/src/node.hpp +3 -3
  90. data/ext/libsass/src/operation.hpp +184 -144
  91. data/ext/libsass/src/operators.cpp +43 -17
  92. data/ext/libsass/src/operators.hpp +5 -5
  93. data/ext/libsass/src/output.cpp +21 -18
  94. data/ext/libsass/src/output.hpp +14 -21
  95. data/ext/libsass/src/parser.cpp +215 -183
  96. data/ext/libsass/src/parser.hpp +28 -24
  97. data/ext/libsass/src/plugins.cpp +5 -1
  98. data/ext/libsass/src/position.cpp +3 -0
  99. data/ext/libsass/src/prelexer.cpp +9 -3
  100. data/ext/libsass/src/prelexer.hpp +9 -9
  101. data/ext/libsass/src/remove_placeholders.cpp +14 -11
  102. data/ext/libsass/src/remove_placeholders.hpp +8 -9
  103. data/ext/libsass/src/sass.cpp +9 -3
  104. data/ext/libsass/src/sass.hpp +12 -9
  105. data/ext/libsass/src/sass2scss.cpp +45 -14
  106. data/ext/libsass/src/sass_context.cpp +18 -15
  107. data/ext/libsass/src/sass_functions.cpp +6 -3
  108. data/ext/libsass/src/sass_functions.hpp +1 -1
  109. data/ext/libsass/src/sass_util.cpp +3 -0
  110. data/ext/libsass/src/sass_values.cpp +21 -13
  111. data/ext/libsass/src/source_map.cpp +5 -2
  112. data/ext/libsass/src/source_map.hpp +2 -2
  113. data/ext/libsass/src/subset_map.cpp +4 -1
  114. data/ext/libsass/src/to_value.cpp +23 -21
  115. data/ext/libsass/src/to_value.hpp +18 -22
  116. data/ext/libsass/src/units.cpp +4 -0
  117. data/ext/libsass/src/units.hpp +1 -0
  118. data/ext/libsass/src/utf8/checked.h +12 -10
  119. data/ext/libsass/src/utf8/core.h +3 -0
  120. data/ext/libsass/src/utf8_string.cpp +3 -0
  121. data/ext/libsass/src/util.cpp +67 -75
  122. data/ext/libsass/src/util.hpp +64 -19
  123. data/ext/libsass/src/util_string.cpp +75 -0
  124. data/ext/libsass/src/util_string.hpp +19 -0
  125. data/ext/libsass/src/values.cpp +22 -13
  126. data/ext/libsass/src/values.hpp +2 -2
  127. data/ext/libsass/win/libsass.targets +30 -4
  128. data/ext/libsass/win/libsass.vcxproj.filters +82 -4
  129. data/lib/sassc.rb +24 -0
  130. data/lib/sassc/engine.rb +2 -2
  131. data/lib/sassc/native.rb +8 -1
  132. data/lib/sassc/version.rb +1 -1
  133. data/sassc.gemspec +19 -11
  134. data/test/engine_test.rb +26 -1
  135. data/test/native_test.rb +1 -1
  136. metadata +66 -72
  137. data/ext/Rakefile +0 -3
  138. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  139. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  140. data/ext/libsass/.travis.yml +0 -64
  141. data/ext/libsass/Readme.md +0 -104
  142. data/ext/libsass/SECURITY.md +0 -10
  143. data/ext/libsass/appveyor.yml +0 -91
  144. data/ext/libsass/docs/README.md +0 -20
  145. data/ext/libsass/docs/api-context-example.md +0 -45
  146. data/ext/libsass/docs/api-context-internal.md +0 -163
  147. data/ext/libsass/docs/api-context.md +0 -295
  148. data/ext/libsass/docs/api-doc.md +0 -215
  149. data/ext/libsass/docs/api-function-example.md +0 -67
  150. data/ext/libsass/docs/api-function-internal.md +0 -8
  151. data/ext/libsass/docs/api-function.md +0 -74
  152. data/ext/libsass/docs/api-importer-example.md +0 -112
  153. data/ext/libsass/docs/api-importer-internal.md +0 -20
  154. data/ext/libsass/docs/api-importer.md +0 -86
  155. data/ext/libsass/docs/api-value-example.md +0 -55
  156. data/ext/libsass/docs/api-value-internal.md +0 -76
  157. data/ext/libsass/docs/api-value.md +0 -154
  158. data/ext/libsass/docs/build-on-darwin.md +0 -27
  159. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  160. data/ext/libsass/docs/build-on-windows.md +0 -139
  161. data/ext/libsass/docs/build-shared-library.md +0 -35
  162. data/ext/libsass/docs/build-with-autotools.md +0 -78
  163. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  164. data/ext/libsass/docs/build-with-mingw.md +0 -107
  165. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  166. data/ext/libsass/docs/build.md +0 -97
  167. data/ext/libsass/docs/compatibility-plan.md +0 -48
  168. data/ext/libsass/docs/contributing.md +0 -17
  169. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  170. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  171. data/ext/libsass/docs/implementations.md +0 -56
  172. data/ext/libsass/docs/plugins.md +0 -47
  173. data/ext/libsass/docs/setup-environment.md +0 -68
  174. data/ext/libsass/docs/source-map-internals.md +0 -51
  175. data/ext/libsass/docs/trace.md +0 -26
  176. data/ext/libsass/docs/triage.md +0 -17
  177. data/ext/libsass/docs/unicode.md +0 -39
  178. data/ext/libsass/extconf.rb +0 -6
  179. data/ext/libsass/script/bootstrap +0 -13
  180. data/ext/libsass/script/branding +0 -10
  181. data/ext/libsass/script/ci-build-libsass +0 -134
  182. data/ext/libsass/script/ci-build-plugin +0 -62
  183. data/ext/libsass/script/ci-install-compiler +0 -6
  184. data/ext/libsass/script/ci-install-deps +0 -20
  185. data/ext/libsass/script/ci-report-coverage +0 -42
  186. data/ext/libsass/script/spec +0 -5
  187. data/ext/libsass/script/tap-driver +0 -652
  188. data/ext/libsass/script/tap-runner +0 -1
  189. data/ext/libsass/script/test-leaks.pl +0 -103
  190. data/ext/libsass/src/functions.cpp +0 -2234
  191. data/ext/libsass/src/functions.hpp +0 -198
  192. data/ext/libsass/src/to_c.hpp +0 -39
  193. data/ext/libsass/test/test_node.cpp +0 -94
  194. data/ext/libsass/test/test_paths.cpp +0 -28
  195. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  196. data/ext/libsass/test/test_specificity.cpp +0 -25
  197. data/ext/libsass/test/test_subset_map.cpp +0 -472
  198. data/ext/libsass/test/test_superselector.cpp +0 -69
  199. data/ext/libsass/test/test_unification.cpp +0 -31
  200. data/lib/tasks/libsass.rb +0 -33
@@ -1,6 +1,8 @@
1
1
  #ifndef SASS_PARSER_H
2
2
  #define SASS_PARSER_H
3
3
 
4
+ #include "sass.hpp"
5
+
4
6
  #include <string>
5
7
  #include <vector>
6
8
 
@@ -38,7 +40,7 @@ namespace Sass {
38
40
  Context& ctx;
39
41
  std::vector<Block_Obj> block_stack;
40
42
  std::vector<Scope> stack;
41
- Media_Block_Ptr last_media_block;
43
+ Media_Block* last_media_block;
42
44
  const char* source;
43
45
  const char* position;
44
46
  const char* end;
@@ -48,23 +50,24 @@ namespace Sass {
48
50
  Backtraces traces;
49
51
  size_t indentation;
50
52
  size_t nestings;
53
+ bool allow_parent;
51
54
 
52
55
  Token lexed;
53
56
 
54
- Parser(Context& ctx, const ParserState& pstate, Backtraces traces)
57
+ Parser(Context& ctx, const ParserState& pstate, Backtraces traces, bool allow_parent = true)
55
58
  : ParserState(pstate), ctx(ctx), block_stack(), stack(0), last_media_block(),
56
59
  source(0), position(0), end(0), before_token(pstate), after_token(pstate),
57
- pstate(pstate), traces(traces), indentation(0), nestings(0)
58
- {
60
+ pstate(pstate), traces(traces), indentation(0), nestings(0), allow_parent(allow_parent)
61
+ {
59
62
  stack.push_back(Scope::Root);
60
63
  }
61
64
 
62
65
  // static Parser from_string(const std::string& src, Context& ctx, ParserState pstate = ParserState("[STRING]"));
63
- static Parser from_c_str(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[CSTRING]"), const char* source = 0);
64
- static Parser from_c_str(const char* beg, const char* end, Context& ctx, Backtraces, ParserState pstate = ParserState("[CSTRING]"), const char* source = 0);
65
- static Parser from_token(Token t, Context& ctx, Backtraces, ParserState pstate = ParserState("[TOKEN]"), const char* source = 0);
66
+ static Parser from_c_str(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[CSTRING]"), const char* source = nullptr, bool allow_parent = true);
67
+ 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);
68
+ static Parser from_token(Token t, Context& ctx, Backtraces, ParserState pstate = ParserState("[TOKEN]"), const char* source = nullptr);
66
69
  // special static parsers to convert strings into certain selectors
67
- static Selector_List_Obj parse_selector(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[SELECTOR]"), const char* source = 0);
70
+ static Selector_List_Obj parse_selector(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[SELECTOR]"), const char* source = nullptr, bool allow_parent = true);
68
71
 
69
72
  #ifdef __clang__
70
73
 
@@ -285,14 +288,13 @@ namespace Sass {
285
288
  Expression_Obj parse_value();
286
289
  Function_Call_Obj parse_calc_function();
287
290
  Function_Call_Obj parse_function_call();
288
- Function_Call_Schema_Obj parse_function_call_schema();
291
+ Function_Call_Obj parse_function_call_schema();
289
292
  String_Obj parse_url_function_string();
290
293
  String_Obj parse_url_function_argument();
291
294
  String_Obj parse_interpolated_chunk(Token, bool constant = false, bool css = true);
292
295
  String_Obj parse_string();
293
- String_Constant_Obj parse_static_value();
294
- String_Schema_Obj parse_css_variable_value(bool top_level = true);
295
- String_Schema_Obj parse_css_variable_value_token(bool top_level = true);
296
+ Value_Obj parse_static_value();
297
+ String_Schema_Obj parse_css_variable_value();
296
298
  String_Obj parse_ie_property();
297
299
  String_Obj parse_ie_keyword_arg();
298
300
  String_Schema_Obj parse_value_schema(const char* stop);
@@ -309,12 +311,12 @@ namespace Sass {
309
311
  Media_Query_Obj parse_media_query();
310
312
  Media_Query_Expression_Obj parse_media_expression();
311
313
  Supports_Block_Obj parse_supports_directive();
312
- Supports_Condition_Obj parse_supports_condition();
314
+ Supports_Condition_Obj parse_supports_condition(bool top_level);
313
315
  Supports_Condition_Obj parse_supports_negation();
314
- Supports_Condition_Obj parse_supports_operator();
316
+ Supports_Condition_Obj parse_supports_operator(bool top_level);
315
317
  Supports_Condition_Obj parse_supports_interpolation();
316
318
  Supports_Condition_Obj parse_supports_declaration();
317
- Supports_Condition_Obj parse_supports_condition_in_parens();
319
+ Supports_Condition_Obj parse_supports_condition_in_parens(bool parens_required);
318
320
  At_Root_Block_Obj parse_at_root_block();
319
321
  At_Root_Query_Obj parse_at_root_query();
320
322
  String_Schema_Obj parse_almost_any_value();
@@ -325,6 +327,8 @@ namespace Sass {
325
327
  Error_Obj parse_error();
326
328
  Debug_Obj parse_debug();
327
329
 
330
+ Value* color_or_string(const std::string& lexed) const;
331
+
328
332
  // be more like ruby sass
329
333
  Expression_Obj lex_almost_any_value_token();
330
334
  Expression_Obj lex_almost_any_value_chars();
@@ -373,19 +377,19 @@ namespace Sass {
373
377
  return SASS_MEMORY_NEW(String_Constant, pstate, lexed);
374
378
  }
375
379
  }
376
- return 0;
380
+ return {};
377
381
  }
378
382
 
379
383
  public:
380
- static Number_Ptr lexed_number(const ParserState& pstate, const std::string& parsed);
381
- static Number_Ptr lexed_dimension(const ParserState& pstate, const std::string& parsed);
382
- static Number_Ptr lexed_percentage(const ParserState& pstate, const std::string& parsed);
383
- static Expression_Ptr lexed_hex_color(const ParserState& pstate, const std::string& parsed);
384
+ static Number* lexed_number(const ParserState& pstate, const std::string& parsed);
385
+ static Number* lexed_dimension(const ParserState& pstate, const std::string& parsed);
386
+ static Number* lexed_percentage(const ParserState& pstate, const std::string& parsed);
387
+ static Value* lexed_hex_color(const ParserState& pstate, const std::string& parsed);
384
388
  private:
385
- Number_Ptr lexed_number(const std::string& parsed) { return lexed_number(pstate, parsed); };
386
- Number_Ptr lexed_dimension(const std::string& parsed) { return lexed_dimension(pstate, parsed); };
387
- Number_Ptr lexed_percentage(const std::string& parsed) { return lexed_percentage(pstate, parsed); };
388
- Expression_Ptr lexed_hex_color(const std::string& parsed) { return lexed_hex_color(pstate, parsed); };
389
+ Number* lexed_number(const std::string& parsed) { return lexed_number(pstate, parsed); };
390
+ Number* lexed_dimension(const std::string& parsed) { return lexed_dimension(pstate, parsed); };
391
+ Number* lexed_percentage(const std::string& parsed) { return lexed_percentage(pstate, parsed); };
392
+ Value* lexed_hex_color(const std::string& parsed) { return lexed_hex_color(pstate, parsed); };
389
393
 
390
394
  static const char* re_attr_sensitive_close(const char* src);
391
395
  static const char* re_attr_insensitive_close(const char* src);
@@ -1,7 +1,11 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include <iostream>
3
6
  #include "output.hpp"
4
7
  #include "plugins.hpp"
8
+ #include "util.hpp"
5
9
 
6
10
  #ifdef _WIN32
7
11
  #include <windows.h>
@@ -154,7 +158,7 @@ namespace Sass {
154
158
  }
155
159
  }
156
160
  }
157
- catch (utf8::invalid_utf8)
161
+ catch (utf8::invalid_utf8&)
158
162
  {
159
163
  // report the error to the console (should not happen)
160
164
  // implementors should make sure to provide valid utf8
@@ -1,4 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include "position.hpp"
3
6
 
4
7
  namespace Sass {
@@ -1,4 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include <cctype>
3
6
  #include <iostream>
4
7
  #include <iomanip>
@@ -260,7 +263,7 @@ namespace Sass {
260
263
  >(src);
261
264
  }
262
265
 
263
- // Match a line comment (/.*?(?=\n|\r\n?|\Z)/.
266
+ // Match a line comment (/.*?(?=\n|\r\n?|\f|\Z)/.
264
267
  const char* line_comment(const char* src)
265
268
  {
266
269
  return sequence<
@@ -1260,6 +1263,9 @@ namespace Sass {
1260
1263
  const char* kwd_lte(const char* src) {
1261
1264
  return exactly<lte>(src);
1262
1265
  }
1266
+ const char* kwd_using(const char* src) {
1267
+ return keyword<using_kwd>(src);
1268
+ }
1263
1269
 
1264
1270
  // match specific IE syntax
1265
1271
  const char* ie_progid(const char* src) {
@@ -1394,7 +1400,7 @@ namespace Sass {
1394
1400
  }*/
1395
1401
 
1396
1402
  const char* H(const char* src) {
1397
- return std::isxdigit(*src) ? src+1 : 0;
1403
+ return std::isxdigit(static_cast<unsigned char>(*src)) ? src+1 : 0;
1398
1404
  }
1399
1405
 
1400
1406
  const char* W(const char* src) {
@@ -1606,7 +1612,7 @@ namespace Sass {
1606
1612
  >(src);
1607
1613
  }
1608
1614
 
1609
- extern const char css_variable_url_top_level_negates[] = "()[]{}\"'#/;!";
1615
+ extern const char css_variable_url_top_level_negates[] = "()[]{}\"'#/;";
1610
1616
  const char* css_variable_top_level_value(const char* src) {
1611
1617
  return sequence<
1612
1618
  alternatives<
@@ -25,6 +25,7 @@ namespace Sass {
25
25
  const char* kwd_gte(const char* src);
26
26
  const char* kwd_lt(const char* src);
27
27
  const char* kwd_lte(const char* src);
28
+ const char* kwd_using(const char* src);
28
29
 
29
30
  // Match standard control chars
30
31
  const char* kwd_at(const char* src);
@@ -64,16 +65,15 @@ namespace Sass {
64
65
  size_t level = 0;
65
66
  bool in_squote = false;
66
67
  bool in_dquote = false;
67
- // bool in_braces = false;
68
-
69
- while (*src) {
70
-
71
- // check for abort condition
72
- if (end && src >= end) break;
68
+ bool in_backslash_escape = false;
73
69
 
70
+ while ((end == nullptr || src < end) && *src != '\0') {
74
71
  // has escaped sequence?
75
- if (*src == '\\') {
76
- ++ src; // skip this (and next)
72
+ if (in_backslash_escape) {
73
+ in_backslash_escape = false;
74
+ }
75
+ else if (*src == '\\') {
76
+ in_backslash_escape = true;
77
77
  }
78
78
  else if (*src == '"') {
79
79
  in_dquote = ! in_dquote;
@@ -119,7 +119,7 @@ namespace Sass {
119
119
  // first start/opener must be consumed already!
120
120
  template<prelexer start, prelexer stop>
121
121
  const char* skip_over_scopes(const char* src) {
122
- return skip_over_scopes<start, stop>(src, 0);
122
+ return skip_over_scopes<start, stop>(src, nullptr);
123
123
  }
124
124
 
125
125
  // Match a sequence of characters delimited by the supplied chars.
@@ -1,4 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include "remove_placeholders.hpp"
3
6
  #include "context.hpp"
4
7
  #include "inspect.hpp"
@@ -9,16 +12,16 @@ namespace Sass {
9
12
  Remove_Placeholders::Remove_Placeholders()
10
13
  { }
11
14
 
12
- void Remove_Placeholders::operator()(Block_Ptr b) {
15
+ void Remove_Placeholders::operator()(Block* b) {
13
16
  for (size_t i = 0, L = b->length(); i < L; ++i) {
14
- Statement_Ptr st = b->at(i);
17
+ Statement* st = b->at(i);
15
18
  st->perform(this);
16
19
  }
17
20
  }
18
21
 
19
- Selector_List_Ptr Remove_Placeholders::remove_placeholders(Selector_List_Ptr sl)
22
+ Selector_List* Remove_Placeholders::remove_placeholders(Selector_List* sl)
20
23
  {
21
- Selector_List_Ptr new_sl = SASS_MEMORY_NEW(Selector_List, sl->pstate());
24
+ Selector_List* new_sl = SASS_MEMORY_NEW(Selector_List, sl->pstate());
22
25
 
23
26
  for (size_t i = 0, L = sl->length(); i < L; ++i) {
24
27
  if (!sl->at(i)->contains_placeholder()) {
@@ -31,7 +34,7 @@ namespace Sass {
31
34
  }
32
35
 
33
36
 
34
- void Remove_Placeholders::operator()(Ruleset_Ptr r) {
37
+ void Remove_Placeholders::operator()(Ruleset* r) {
35
38
  // Create a new selector group without placeholders
36
39
  Selector_List_Obj sl = Cast<Selector_List>(r->selector());
37
40
 
@@ -43,9 +46,9 @@ namespace Sass {
43
46
  while (cs) {
44
47
  if (cs->head()) {
45
48
  for (Simple_Selector_Obj& ss : cs->head()->elements()) {
46
- if (Wrapped_Selector_Ptr ws = Cast<Wrapped_Selector>(ss)) {
47
- if (Selector_List_Ptr wsl = Cast<Selector_List>(ws->selector())) {
48
- Selector_List_Ptr clean = remove_placeholders(wsl);
49
+ if (Wrapped_Selector* ws = Cast<Wrapped_Selector>(ss)) {
50
+ if (Selector_List* wsl = Cast<Selector_List>(ws->selector())) {
51
+ Selector_List* clean = remove_placeholders(wsl);
49
52
  // also clean superflous parent selectors
50
53
  // probably not really the correct place
51
54
  clean->remove_parent_selectors();
@@ -70,14 +73,14 @@ namespace Sass {
70
73
  }
71
74
  }
72
75
 
73
- void Remove_Placeholders::operator()(Media_Block_Ptr m) {
76
+ void Remove_Placeholders::operator()(Media_Block* m) {
74
77
  operator()(m->block());
75
78
  }
76
- void Remove_Placeholders::operator()(Supports_Block_Ptr m) {
79
+ void Remove_Placeholders::operator()(Supports_Block* m) {
77
80
  operator()(m->block());
78
81
  }
79
82
 
80
- void Remove_Placeholders::operator()(Directive_Ptr a) {
83
+ void Remove_Placeholders::operator()(Directive* a) {
81
84
  if (a->block()) a->block()->perform(this);
82
85
  }
83
86
 
@@ -11,23 +11,22 @@ namespace Sass {
11
11
 
12
12
  class Remove_Placeholders : public Operation_CRTP<void, Remove_Placeholders> {
13
13
 
14
- void fallback_impl(AST_Node_Ptr n) {}
15
-
16
14
  public:
17
- Selector_List_Ptr remove_placeholders(Selector_List_Ptr);
15
+ Selector_List* remove_placeholders(Selector_List*);
18
16
 
19
17
  public:
20
18
  Remove_Placeholders();
21
19
  ~Remove_Placeholders() { }
22
20
 
23
- void operator()(Block_Ptr);
24
- void operator()(Ruleset_Ptr);
25
- void operator()(Media_Block_Ptr);
26
- void operator()(Supports_Block_Ptr);
27
- void operator()(Directive_Ptr);
21
+ void operator()(Block*);
22
+ void operator()(Ruleset*);
23
+ void operator()(Media_Block*);
24
+ void operator()(Supports_Block*);
25
+ void operator()(Directive*);
28
26
 
27
+ // ignore missed types
29
28
  template <typename U>
30
- void fallback(U x) { return fallback_impl(x); }
29
+ void fallback(U x) {}
31
30
  };
32
31
 
33
32
  }
@@ -1,4 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include <cstdlib>
3
6
  #include <cstring>
4
7
  #include <vector>
@@ -7,6 +10,7 @@
7
10
  #include "sass.h"
8
11
  #include "file.hpp"
9
12
  #include "util.hpp"
13
+ #include "context.hpp"
10
14
  #include "sass_context.hpp"
11
15
  #include "sass_functions.hpp"
12
16
 
@@ -33,8 +37,10 @@ extern "C" {
33
37
  void* ADDCALL sass_alloc_memory(size_t size)
34
38
  {
35
39
  void* ptr = malloc(size);
36
- if (ptr == NULL)
37
- out_of_memory();
40
+ if (ptr == NULL) {
41
+ std::cerr << "Out of memory.\n";
42
+ exit(EXIT_FAILURE);
43
+ }
38
44
  return ptr;
39
45
  }
40
46
 
@@ -146,4 +152,4 @@ namespace Sass {
146
152
  return sass_copy_c_string(str.c_str());
147
153
  }
148
154
 
149
- }
155
+ }
@@ -14,11 +14,17 @@
14
14
  // aplies to MSVC and MinGW
15
15
  #ifdef _WIN32
16
16
  // we do not want the ERROR macro
17
- # define NOGDI
17
+ # ifndef NOGDI
18
+ # define NOGDI
19
+ # endif
18
20
  // we do not want the min/max macro
19
- # define NOMINMAX
21
+ # ifndef NOMINMAX
22
+ # define NOMINMAX
23
+ # endif
20
24
  // we do not want the IN/OUT macro
21
- # define _NO_W32_PSEUDO_MODIFIERS
25
+ # ifndef _NO_W32_PSEUDO_MODIFIERS
26
+ # define _NO_W32_PSEUDO_MODIFIERS
27
+ # endif
22
28
  #endif
23
29
 
24
30
 
@@ -90,13 +96,10 @@ struct Sass_Inspect_Options {
90
96
  // Precision for fractional numbers
91
97
  int precision;
92
98
 
93
- // Do not compress colors in selectors
94
- bool in_selector;
95
-
96
99
  // initialization list (constructor with defaults)
97
100
  Sass_Inspect_Options(Sass_Output_Style style = Sass::NESTED,
98
- int precision = 5, bool in_selector = false)
99
- : output_style(style), precision(precision), in_selector(in_selector)
101
+ int precision = 10)
102
+ : output_style(style), precision(precision)
100
103
  { }
101
104
 
102
105
  };
@@ -125,7 +128,7 @@ struct Sass_Output_Options : Sass_Inspect_Options {
125
128
 
126
129
  // initialization list (constructor with defaults)
127
130
  Sass_Output_Options(Sass_Output_Style style = Sass::NESTED,
128
- int precision = 5,
131
+ int precision = 10,
129
132
  const char* indent = " ",
130
133
  const char* linefeed = "\n",
131
134
  bool source_comments = false)
@@ -154,6 +154,21 @@ namespace Sass
154
154
 
155
155
  }
156
156
 
157
+ static size_t findFirstCharacter (std::string& sass, size_t pos)
158
+ {
159
+ return sass.find_first_not_of(SASS2SCSS_FIND_WHITESPACE, pos);
160
+ }
161
+
162
+ static size_t findLastCharacter (std::string& sass, size_t pos)
163
+ {
164
+ return sass.find_last_not_of(SASS2SCSS_FIND_WHITESPACE, pos);
165
+ }
166
+
167
+ static bool isUrl (std::string& sass, size_t pos)
168
+ {
169
+ return sass[pos] == 'u' && sass[pos+1] == 'r' && sass[pos+2] == 'l' && sass[pos+3] == '(';
170
+ }
171
+
157
172
  // check if there is some char data
158
173
  // will ignore everything in comments
159
174
  static bool hasCharData (std::string& sass)
@@ -587,6 +602,7 @@ namespace Sass
587
602
  sass.substr(pos_left, 5) == "@warn" ||
588
603
  sass.substr(pos_left, 6) == "@debug" ||
589
604
  sass.substr(pos_left, 6) == "@error" ||
605
+ sass.substr(pos_left, 6) == "@value" ||
590
606
  sass.substr(pos_left, 8) == "@charset" ||
591
607
  sass.substr(pos_left, 10) == "@namespace"
592
608
  ) { sass = indent + sass.substr(pos_left); }
@@ -606,23 +622,38 @@ namespace Sass
606
622
  {
607
623
  // get positions for the actual import url
608
624
  size_t pos_import = sass.find_first_of(SASS2SCSS_FIND_WHITESPACE, pos_left + 7);
609
- size_t pos_quote = sass.find_first_not_of(SASS2SCSS_FIND_WHITESPACE, pos_import);
610
- // leave proper urls untouched
611
- if (sass.substr(pos_quote, 4) != "url(")
612
- {
613
- // check if the url appears to be already quoted
614
- if (sass.substr(pos_quote, 1) != "\"" && sass.substr(pos_quote, 1) != "\'")
615
- {
616
- // get position of the last char on the line
617
- size_t pos_end = sass.find_last_not_of(SASS2SCSS_FIND_WHITESPACE);
618
- // assertion check for valid result
619
- if (pos_end != std::string::npos)
620
- {
621
- // add quotes around the full line after the import statement
622
- sass = sass.substr(0, pos_quote) + "\"" + sass.substr(pos_quote, pos_end - pos_quote + 1) + "\"";
625
+ size_t pos = sass.find_first_not_of(SASS2SCSS_FIND_WHITESPACE, pos_import);
626
+ size_t start = pos;
627
+ bool in_dqstr = false;
628
+ bool in_sqstr = false;
629
+ bool is_escaped = false;
630
+ do {
631
+ if (is_escaped) {
632
+ is_escaped = false;
633
+ }
634
+ else if (sass[pos] == '\\') {
635
+ is_escaped = true;
636
+ }
637
+ else if (sass[pos] == '"') {
638
+ if (!in_sqstr) in_dqstr = ! in_dqstr;
639
+ }
640
+ else if (sass[pos] == '\'') {
641
+ if (!in_dqstr) in_sqstr = ! in_sqstr;
642
+ }
643
+ else if (in_dqstr || in_sqstr) {
644
+ // skip over quoted stuff
645
+ }
646
+ else if (sass[pos] == ',' || sass[pos] == 0) {
647
+ if (sass[start] != '"' && sass[start] != '\'' && !isUrl(sass, start)) {
648
+ size_t end = findLastCharacter(sass, pos - 1) + 1;
649
+ sass = sass.replace(end, 0, "\"");
650
+ sass = sass.replace(start, 0, "\"");
651
+ pos += 2;
623
652
  }
653
+ start = findFirstCharacter(sass, pos + 1);
624
654
  }
625
655
  }
656
+ while (sass[pos++] != 0);
626
657
 
627
658
  }
628
659
  else if (