sassc 2.2.1 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +13 -0
  4. data/Rakefile +1 -3
  5. data/ext/extconf.rb +13 -5
  6. data/ext/libsass/VERSION +1 -1
  7. data/ext/libsass/include/sass/base.h +2 -1
  8. data/ext/libsass/include/sass/context.h +1 -0
  9. data/ext/libsass/src/ast.cpp +49 -59
  10. data/ext/libsass/src/ast.hpp +263 -102
  11. data/ext/libsass/src/ast_def_macros.hpp +8 -0
  12. data/ext/libsass/src/ast_fwd_decl.cpp +2 -1
  13. data/ext/libsass/src/ast_fwd_decl.hpp +40 -116
  14. data/ext/libsass/src/ast_helpers.hpp +292 -0
  15. data/ext/libsass/src/ast_sel_cmp.cpp +209 -722
  16. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  17. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  18. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  19. data/ext/libsass/src/ast_selectors.cpp +559 -1001
  20. data/ext/libsass/src/ast_selectors.hpp +311 -367
  21. data/ext/libsass/src/ast_supports.cpp +1 -17
  22. data/ext/libsass/src/ast_values.cpp +216 -29
  23. data/ext/libsass/src/ast_values.hpp +42 -33
  24. data/ext/libsass/src/bind.cpp +1 -1
  25. data/ext/libsass/src/cencode.c +4 -6
  26. data/ext/libsass/src/check_nesting.cpp +5 -6
  27. data/ext/libsass/src/check_nesting.hpp +4 -0
  28. data/ext/libsass/src/color_maps.cpp +11 -10
  29. data/ext/libsass/src/color_maps.hpp +0 -8
  30. data/ext/libsass/src/constants.cpp +5 -0
  31. data/ext/libsass/src/constants.hpp +6 -0
  32. data/ext/libsass/src/context.cpp +30 -60
  33. data/ext/libsass/src/context.hpp +8 -20
  34. data/ext/libsass/src/cssize.cpp +36 -120
  35. data/ext/libsass/src/cssize.hpp +4 -10
  36. data/ext/libsass/src/dart_helpers.hpp +199 -0
  37. data/ext/libsass/src/debugger.hpp +364 -207
  38. data/ext/libsass/src/emitter.cpp +3 -4
  39. data/ext/libsass/src/emitter.hpp +0 -2
  40. data/ext/libsass/src/environment.hpp +5 -0
  41. data/ext/libsass/src/error_handling.cpp +21 -0
  42. data/ext/libsass/src/error_handling.hpp +25 -3
  43. data/ext/libsass/src/eval.cpp +33 -153
  44. data/ext/libsass/src/eval.hpp +11 -13
  45. data/ext/libsass/src/eval_selectors.cpp +75 -0
  46. data/ext/libsass/src/expand.cpp +214 -167
  47. data/ext/libsass/src/expand.hpp +26 -6
  48. data/ext/libsass/src/extender.cpp +1186 -0
  49. data/ext/libsass/src/extender.hpp +399 -0
  50. data/ext/libsass/src/extension.cpp +43 -0
  51. data/ext/libsass/src/extension.hpp +89 -0
  52. data/ext/libsass/src/file.cpp +15 -14
  53. data/ext/libsass/src/file.hpp +5 -12
  54. data/ext/libsass/src/fn_colors.cpp +12 -10
  55. data/ext/libsass/src/fn_lists.cpp +12 -11
  56. data/ext/libsass/src/fn_miscs.cpp +22 -34
  57. data/ext/libsass/src/fn_numbers.cpp +13 -6
  58. data/ext/libsass/src/fn_selectors.cpp +94 -124
  59. data/ext/libsass/src/fn_strings.cpp +16 -14
  60. data/ext/libsass/src/fn_utils.cpp +5 -6
  61. data/ext/libsass/src/fn_utils.hpp +9 -3
  62. data/ext/libsass/src/inspect.cpp +154 -117
  63. data/ext/libsass/src/inspect.hpp +10 -8
  64. data/ext/libsass/src/lexer.cpp +17 -81
  65. data/ext/libsass/src/lexer.hpp +5 -16
  66. data/ext/libsass/src/listize.cpp +22 -36
  67. data/ext/libsass/src/listize.hpp +8 -9
  68. data/ext/libsass/src/memory/SharedPtr.hpp +39 -5
  69. data/ext/libsass/src/operation.hpp +27 -17
  70. data/ext/libsass/src/operators.cpp +1 -0
  71. data/ext/libsass/src/ordered_map.hpp +112 -0
  72. data/ext/libsass/src/output.cpp +30 -49
  73. data/ext/libsass/src/output.hpp +1 -1
  74. data/ext/libsass/src/parser.cpp +211 -381
  75. data/ext/libsass/src/parser.hpp +17 -15
  76. data/ext/libsass/src/parser_selectors.cpp +189 -0
  77. data/ext/libsass/src/permutate.hpp +140 -0
  78. data/ext/libsass/src/position.hpp +1 -1
  79. data/ext/libsass/src/prelexer.cpp +6 -6
  80. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  81. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  82. data/ext/libsass/src/sass.hpp +1 -0
  83. data/ext/libsass/src/sass2scss.cpp +4 -4
  84. data/ext/libsass/src/sass_context.cpp +42 -91
  85. data/ext/libsass/src/sass_context.hpp +2 -2
  86. data/ext/libsass/src/sass_functions.cpp +1 -1
  87. data/ext/libsass/src/sass_values.cpp +0 -1
  88. data/ext/libsass/src/stylesheet.cpp +22 -0
  89. data/ext/libsass/src/stylesheet.hpp +57 -0
  90. data/ext/libsass/src/to_value.cpp +2 -2
  91. data/ext/libsass/src/to_value.hpp +1 -1
  92. data/ext/libsass/src/units.cpp +5 -3
  93. data/ext/libsass/src/util.cpp +10 -12
  94. data/ext/libsass/src/util.hpp +2 -3
  95. data/ext/libsass/src/util_string.cpp +111 -61
  96. data/ext/libsass/src/util_string.hpp +61 -8
  97. data/lib/sassc/engine.rb +5 -3
  98. data/lib/sassc/functions_handler.rb +8 -8
  99. data/lib/sassc/native.rb +1 -1
  100. data/lib/sassc/script.rb +4 -4
  101. data/lib/sassc/version.rb +1 -1
  102. data/test/functions_test.rb +18 -1
  103. data/test/native_test.rb +1 -1
  104. metadata +17 -12
  105. data/ext/libsass/src/extend.cpp +0 -2132
  106. data/ext/libsass/src/extend.hpp +0 -86
  107. data/ext/libsass/src/node.cpp +0 -322
  108. data/ext/libsass/src/node.hpp +0 -118
  109. data/ext/libsass/src/paths.hpp +0 -71
  110. data/ext/libsass/src/sass_util.cpp +0 -152
  111. data/ext/libsass/src/sass_util.hpp +0 -256
  112. data/ext/libsass/src/subset_map.cpp +0 -58
  113. data/ext/libsass/src/subset_map.hpp +0 -76
@@ -168,7 +168,7 @@ namespace Sass {
168
168
  }
169
169
  // consumed parameter
170
170
  ++ip;
171
- // no more paramaters
171
+ // no more parameters
172
172
  break;
173
173
  }
174
174
 
@@ -46,9 +46,8 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out,
46
46
  result = (fragment & 0x0fc) >> 2;
47
47
  *codechar++ = base64_encode_value(result);
48
48
  result = (fragment & 0x003) << 4;
49
- #ifndef _MSC_VER
50
- /* fall through */
51
- #endif
49
+ /* fall through */
50
+
52
51
  case step_B:
53
52
  if (plainchar == plaintextend)
54
53
  {
@@ -60,9 +59,8 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out,
60
59
  result |= (fragment & 0x0f0) >> 4;
61
60
  *codechar++ = base64_encode_value(result);
62
61
  result = (fragment & 0x00f) << 2;
63
- #ifndef _MSC_VER
64
- /* fall through */
65
- #endif
62
+ /* fall through */
63
+
66
64
  case step_C:
67
65
  if (plainchar == plaintextend)
68
66
  {
@@ -1,9 +1,7 @@
1
1
  // sass.hpp must go before all system headers to get the
2
2
  // __EXTENSIONS__ fix on Solaris.
3
3
  #include "sass.hpp"
4
-
5
- #include <vector>
6
-
4
+ #include "ast.hpp"
7
5
  #include "check_nesting.hpp"
8
6
 
9
7
  namespace Sass {
@@ -145,7 +143,7 @@ namespace Sass {
145
143
  if (is_charset(node))
146
144
  { this->invalid_charset_parent(this->parent, node); }
147
145
 
148
- if (Cast<Extension>(node))
146
+ if (Cast<ExtendRule>(node))
149
147
  { this->invalid_extend_parent(this->parent, node); }
150
148
 
151
149
  // if (Cast<Import>(node))
@@ -388,7 +386,8 @@ namespace Sass {
388
386
  {
389
387
  return Cast<Directive>(n) ||
390
388
  Cast<Import>(n) ||
391
- Cast<Media_Block>(n) ||
392
- Cast<Supports_Block>(n);
389
+ Cast<MediaRule>(n) ||
390
+ Cast<CssMediaRule>(n) ||
391
+ Cast<Supports_Block>(n);
393
392
  }
394
393
  }
@@ -1,8 +1,12 @@
1
1
  #ifndef SASS_CHECK_NESTING_H
2
2
  #define SASS_CHECK_NESTING_H
3
3
 
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
6
+ #include "sass.hpp"
4
7
  #include "ast.hpp"
5
8
  #include "operation.hpp"
9
+ #include <vector>
6
10
 
7
11
  namespace Sass {
8
12
 
@@ -4,6 +4,7 @@
4
4
 
5
5
  #include "ast.hpp"
6
6
  #include "color_maps.hpp"
7
+ #include "util_string.hpp"
7
8
 
8
9
  namespace Sass {
9
10
 
@@ -313,7 +314,7 @@ namespace Sass {
313
314
  const Color_RGBA transparent(color_table, 0, 0, 0, 0);
314
315
  }
315
316
 
316
- const std::map<const int, const char*> colors_to_names {
317
+ static const auto* const colors_to_names = new std::unordered_map<int, const char*> {
317
318
  { 240 * 0x10000 + 248 * 0x100 + 255, ColorNames::aliceblue },
318
319
  { 250 * 0x10000 + 235 * 0x100 + 215, ColorNames::antiquewhite },
319
320
  { 0 * 0x10000 + 255 * 0x100 + 255, ColorNames::cyan },
@@ -455,7 +456,7 @@ namespace Sass {
455
456
  { 102 * 0x10000 + 51 * 0x100 + 153, ColorNames::rebeccapurple }
456
457
  };
457
458
 
458
- const std::map<const char*, const Color_RGBA*, map_cmp_str> names_to_colors
459
+ static const auto *const names_to_colors = new std::unordered_map<std::string, const Color_RGBA*>
459
460
  {
460
461
  { ColorNames::aliceblue, &Colors::aliceblue },
461
462
  { ColorNames::antiquewhite, &Colors::antiquewhite },
@@ -616,23 +617,23 @@ namespace Sass {
616
617
  const Color_RGBA* name_to_color(const std::string& key)
617
618
  {
618
619
  // case insensitive lookup. See #2462
619
- std::string lower{key};
620
- std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
620
+ std::string lower = key;
621
+ Util::ascii_str_tolower(&lower);
621
622
 
622
- auto p = names_to_colors.find(lower.c_str());
623
- if (p != names_to_colors.end()) {
623
+ auto p = names_to_colors->find(lower);
624
+ if (p != names_to_colors->end()) {
624
625
  return p->second;
625
626
  }
626
- return 0;
627
+ return nullptr;
627
628
  }
628
629
 
629
630
  const char* color_to_name(const int key)
630
631
  {
631
- auto p = colors_to_names.find(key);
632
- if (p != colors_to_names.end()) {
632
+ auto p = colors_to_names->find(key);
633
+ if (p != colors_to_names->end()) {
633
634
  return p->second;
634
635
  }
635
- return 0;
636
+ return nullptr;
636
637
  }
637
638
 
638
639
  const char* color_to_name(const double key)
@@ -7,14 +7,6 @@
7
7
 
8
8
  namespace Sass {
9
9
 
10
- struct map_cmp_str
11
- {
12
- bool operator()(char const *a, char const *b) const
13
- {
14
- return std::strcmp(a, b) < 0;
15
- }
16
- };
17
-
18
10
  namespace ColorNames
19
11
  {
20
12
  extern const char aliceblue[];
@@ -45,6 +45,7 @@ namespace Sass {
45
45
  extern const char for_kwd[] = "@for";
46
46
  extern const char from_kwd[] = "from";
47
47
  extern const char to_kwd[] = "to";
48
+ extern const char of_kwd[] = "of";
48
49
  extern const char through_kwd[] = "through";
49
50
  extern const char each_kwd[] = "@each";
50
51
  extern const char in_kwd[] = "in";
@@ -161,6 +162,10 @@ namespace Sass {
161
162
  extern const char uri_chars[] = ":;/?!%&#@|[]{}'`^\"*+-.,_=~";
162
163
  extern const char real_uri_chars[] = "#%&";
163
164
 
165
+ extern const char selector_combinator_child[] = ">";
166
+ extern const char selector_combinator_general[] = "~";
167
+ extern const char selector_combinator_adjacent[] = "+";
168
+
164
169
  // some specific constant character classes
165
170
  // they must be static to be useable by lexer
166
171
  extern const char static_ops[] = "*/%";
@@ -43,6 +43,7 @@ namespace Sass {
43
43
  extern const char for_kwd[];
44
44
  extern const char from_kwd[];
45
45
  extern const char to_kwd[];
46
+ extern const char of_kwd[];
46
47
  extern const char through_kwd[];
47
48
  extern const char each_kwd[];
48
49
  extern const char in_kwd[];
@@ -161,6 +162,11 @@ namespace Sass {
161
162
  extern const char uri_chars[];
162
163
  extern const char real_uri_chars[];
163
164
 
165
+ // constants for selector combinators
166
+ extern const char selector_combinator_child[];
167
+ extern const char selector_combinator_general[];
168
+ extern const char selector_combinator_adjacent[];
169
+
164
170
  // some specific constant character classes
165
171
  // they must be static to be useable by lexer
166
172
  extern const char static_ops[];
@@ -1,44 +1,22 @@
1
1
  // sass.hpp must go before all system headers to get the
2
2
  // __EXTENSIONS__ fix on Solaris.
3
3
  #include "sass.hpp"
4
-
5
- #include <string>
6
- #include <cstdlib>
7
- #include <cstring>
8
- #include <iomanip>
9
- #include <sstream>
10
- #include <iostream>
11
-
12
4
  #include "ast.hpp"
13
- #include "util.hpp"
14
- #include "sass.h"
15
- #include "context.hpp"
16
- #include "plugins.hpp"
17
- #include "constants.hpp"
18
- #include "parser.hpp"
19
- #include "file.hpp"
20
- #include "inspect.hpp"
21
- #include "output.hpp"
22
- #include "expand.hpp"
23
- #include "eval.hpp"
24
- #include "check_nesting.hpp"
25
- #include "cssize.hpp"
26
- #include "listize.hpp"
27
- #include "extend.hpp"
5
+
28
6
  #include "remove_placeholders.hpp"
29
7
  #include "sass_functions.hpp"
30
- #include "backtrace.hpp"
31
- #include "sass2scss.h"
32
- #include "prelexer.hpp"
33
- #include "emitter.hpp"
34
- #include "fn_utils.hpp"
8
+ #include "check_nesting.hpp"
9
+ #include "fn_selectors.hpp"
10
+ #include "fn_strings.hpp"
11
+ #include "fn_numbers.hpp"
12
+ #include "fn_colors.hpp"
35
13
  #include "fn_miscs.hpp"
36
- #include "fn_maps.hpp"
37
14
  #include "fn_lists.hpp"
38
- #include "fn_colors.hpp"
39
- #include "fn_numbers.hpp"
40
- #include "fn_strings.hpp"
41
- #include "fn_selectors.hpp"
15
+ #include "fn_maps.hpp"
16
+ #include "context.hpp"
17
+ #include "expand.hpp"
18
+ #include "parser.hpp"
19
+ #include "cssize.hpp"
42
20
 
43
21
  namespace Sass {
44
22
  using namespace Constants;
@@ -50,23 +28,17 @@ namespace Sass {
50
28
 
51
29
  static std::string safe_input(const char* in_path)
52
30
  {
53
- // enforce some safe defaults
54
- // used to create relative file links
55
- std::string safe_path(in_path ? in_path : "");
56
- return safe_path == "" ? "stdin" : safe_path;
31
+ if (in_path == nullptr || in_path[0] == '\0') return "stdin";
32
+ return in_path;
57
33
  }
58
34
 
59
- static std::string safe_output(const char* out_path, const std::string& input_path = "")
35
+ static std::string safe_output(const char* out_path, std::string input_path)
60
36
  {
61
- std::string safe_path(out_path ? out_path : "");
62
- // maybe we can extract an output path from input path
63
- if (safe_path == "" && input_path != "") {
64
- int lastindex = static_cast<int>(input_path.find_last_of("."));
65
- return (lastindex > -1 ? input_path.substr(0, lastindex) : input_path) + ".css";
37
+ if (out_path == nullptr || out_path[0] == '\0') {
38
+ if (input_path.empty()) return "stdout";
39
+ return input_path.substr(0, input_path.find_last_of(".")) + ".css";
66
40
  }
67
- // enforce some safe defaults
68
- // used to create relative file links
69
- return safe_path == "" ? "stdout" : safe_path;
41
+ return out_path;
70
42
  }
71
43
 
72
44
  Context::Context(struct Sass_Context& c_ctx)
@@ -81,10 +53,10 @@ namespace Sass {
81
53
  strings(),
82
54
  resources(),
83
55
  sheets(),
84
- subset_map(),
85
56
  import_stack(),
86
57
  callee_stack(),
87
58
  traces(),
59
+ extender(Extender::NORMAL, traces),
88
60
  c_compiler(NULL),
89
61
 
90
62
  c_headers (std::vector<Sass_Importer_Entry>()),
@@ -160,7 +132,7 @@ namespace Sass {
160
132
  }
161
133
  // clear inner structures (vectors) and input source
162
134
  resources.clear(); import_stack.clear();
163
- subset_map.clear(), sheets.clear();
135
+ sheets.clear();
164
136
  }
165
137
 
166
138
  Data_Context::~Data_Context()
@@ -405,7 +377,7 @@ namespace Sass {
405
377
  // if (protocol.compare("file") && true) { }
406
378
  }
407
379
 
408
- // add urls (protocol other than file) and urls without procotol to `urls` member
380
+ // add urls (protocol other than file) and urls without protocol to `urls` member
409
381
  // ToDo: if ctx_path is already a file resource, we should not add it here?
410
382
  if (imp->import_queries() || protocol != "file" || imp_path.substr(0, 2) == "//") {
411
383
  imp->urls().push_back(SASS_MEMORY_NEW(String_Quoted, imp->pstate(), load_path));
@@ -529,7 +501,7 @@ namespace Sass {
529
501
  OutputBuffer emitted = emitter.get_buffer();
530
502
  // should we append a source map url?
531
503
  if (!c_options.omit_source_map_url) {
532
- // generate an embeded source map
504
+ // generate an embedded source map
533
505
  if (c_options.source_map_embed) {
534
506
  emitted.buffer += linefeed;
535
507
  emitted.buffer += format_embedded_source_map();
@@ -649,8 +621,6 @@ namespace Sass {
649
621
  return compile();
650
622
  }
651
623
 
652
-
653
-
654
624
  // parse root block from includes
655
625
  Block_Obj Context::compile()
656
626
  {
@@ -678,23 +648,23 @@ namespace Sass {
678
648
  }
679
649
  // expand and eval the tree
680
650
  root = expand(root);
651
+
652
+ Extension unsatisfied;
653
+ // check that all extends were used
654
+ if (extender.checkForUnsatisfiedExtends(unsatisfied)) {
655
+ throw Exception::UnsatisfiedExtend(traces, unsatisfied);
656
+ }
657
+
681
658
  // check nesting
682
659
  check_nesting(root);
683
660
  // merge and bubble certain rules
684
661
  root = cssize(root);
685
- // should we extend something?
686
- if (!subset_map.empty()) {
687
- // create crtp visitor object
688
- Extend extend(subset_map);
689
- extend.setEval(expand.eval);
690
- // extend tree nodes
691
- extend(root);
692
- }
693
662
 
694
663
  // clean up by removing empty placeholders
695
664
  // ToDo: maybe we can do this somewhere else?
696
665
  Remove_Placeholders remove_placeholders;
697
666
  root->perform(&remove_placeholders);
667
+
698
668
  // return processed tree
699
669
  return root;
700
670
  }
@@ -1,27 +1,19 @@
1
1
  #ifndef SASS_CONTEXT_H
2
2
  #define SASS_CONTEXT_H
3
3
 
4
- #include <string>
5
- #include <vector>
6
- #include <map>
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
+
7
9
 
8
10
  #define BUFFERSIZE 255
9
11
  #include "b64/encode.h"
10
12
 
11
- #include "ast_fwd_decl.hpp"
12
- #include "kwd_arg_macros.hpp"
13
- #include "ast_fwd_decl.hpp"
14
13
  #include "sass_context.hpp"
15
- #include "environment.hpp"
16
- #include "source_map.hpp"
17
- #include "subset_map.hpp"
18
- #include "backtrace.hpp"
19
- #include "output.hpp"
14
+ #include "stylesheet.hpp"
20
15
  #include "plugins.hpp"
21
- #include "file.hpp"
22
-
23
-
24
- struct Sass_Function;
16
+ #include "output.hpp"
25
17
 
26
18
  namespace Sass {
27
19
 
@@ -52,10 +44,10 @@ namespace Sass {
52
44
  std::vector<char*> strings;
53
45
  std::vector<Resource> resources;
54
46
  std::map<const std::string, StyleSheet> sheets;
55
- Subset_Map subset_map;
56
47
  ImporterStack import_stack;
57
48
  std::vector<Sass_Callee> callee_stack;
58
49
  std::vector<Backtrace> traces;
50
+ Extender extender;
59
51
 
60
52
  struct Sass_Compiler* c_compiler;
61
53
 
@@ -68,10 +60,6 @@ namespace Sass {
68
60
  std::vector<std::string> plugin_paths; // relative paths to load plugins
69
61
  std::vector<std::string> include_paths; // lookup paths for includes
70
62
 
71
-
72
-
73
-
74
-
75
63
  void apply_custom_headers(Block_Obj root, const char* path, ParserState pstate);
76
64
 
77
65
  std::vector<Sass_Importer_Entry> c_headers;
@@ -12,8 +12,7 @@
12
12
  namespace Sass {
13
13
 
14
14
  Cssize::Cssize(Context& ctx)
15
- : ctx(ctx),
16
- traces(ctx.traces),
15
+ : traces(ctx.traces),
17
16
  block_stack(BlockStack()),
18
17
  p_stack(std::vector<Statement*>())
19
18
  { }
@@ -149,7 +148,7 @@ namespace Sass {
149
148
  // this can return a string schema
150
149
  // string schema is not a statement!
151
150
  // r->block() is already a string schema
152
- // and that is comming from propset expand
151
+ // and that is coming from propset expand
153
152
  Block* bb = operator()(r->block());
154
153
  // this should protect us (at least a bit) from our mess
155
154
  // fixing this properly is harder that it should be ...
@@ -215,20 +214,23 @@ namespace Sass {
215
214
  return 0;
216
215
  }
217
216
 
218
- Statement* Cssize::operator()(Media_Block* m)
217
+ Statement* Cssize::operator()(CssMediaRule* m)
219
218
  {
220
219
  if (parent()->statement_type() == Statement::RULESET)
221
- { return bubble(m); }
220
+ {
221
+ return bubble(m);
222
+ }
222
223
 
223
224
  if (parent()->statement_type() == Statement::MEDIA)
224
- { return SASS_MEMORY_NEW(Bubble, m->pstate(), m); }
225
+ {
226
+ return SASS_MEMORY_NEW(Bubble, m->pstate(), m);
227
+ }
225
228
 
226
229
  p_stack.push_back(m);
227
230
 
228
- Media_Block_Obj mm = SASS_MEMORY_NEW(Media_Block,
229
- m->pstate(),
230
- m->media_queries(),
231
- operator()(m->block()));
231
+ CssMediaRuleObj mm = SASS_MEMORY_NEW(CssMediaRule, m->pstate(), m->block());
232
+ mm->concat(m->elements());
233
+ mm->block(operator()(m->block()));
232
234
  mm->tabs(m->tabs());
233
235
 
234
236
  p_stack.pop_back();
@@ -352,24 +354,24 @@ namespace Sass {
352
354
  return bubble;
353
355
  }
354
356
 
355
- Statement* Cssize::bubble(Media_Block* m)
357
+ Statement* Cssize::bubble(CssMediaRule* m)
356
358
  {
357
359
  Ruleset_Obj parent = Cast<Ruleset>(SASS_MEMORY_COPY(this->parent()));
358
360
 
359
361
  Block* bb = SASS_MEMORY_NEW(Block, parent->block()->pstate());
360
362
  Ruleset* new_rule = SASS_MEMORY_NEW(Ruleset,
361
- parent->pstate(),
362
- parent->selector(),
363
- bb);
363
+ parent->pstate(),
364
+ parent->selector(),
365
+ bb);
364
366
  new_rule->tabs(parent->tabs());
365
367
  new_rule->block()->concat(m->block());
366
368
 
367
369
  Block* wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
368
370
  wrapper_block->append(new_rule);
369
- Media_Block_Obj mm = SASS_MEMORY_NEW(Media_Block,
370
- m->pstate(),
371
- m->media_queries(),
372
- wrapper_block);
371
+ CssMediaRuleObj mm = SASS_MEMORY_NEW(CssMediaRule,
372
+ m->pstate(),
373
+ wrapper_block);
374
+ mm->concat(m->elements());
373
375
 
374
376
  mm->tabs(m->tabs());
375
377
 
@@ -381,12 +383,12 @@ namespace Sass {
381
383
  return Cast<Ruleset>(s) || s->bubbles();
382
384
  }
383
385
 
384
- Block* Cssize::flatten(Block* b)
386
+ Block* Cssize::flatten(const Block* b)
385
387
  {
386
388
  Block* result = SASS_MEMORY_NEW(Block, b->pstate(), 0, b->is_root());
387
389
  for (size_t i = 0, L = b->length(); i < L; ++i) {
388
390
  Statement* ss = b->at(i);
389
- if (Block* bb = Cast<Block>(ss)) {
391
+ if (const Block* bb = Cast<Block>(ss)) {
390
392
  Block_Obj bs = flatten(bb);
391
393
  for (size_t j = 0, K = bs->length(); j < K; ++j) {
392
394
  result->append(bs->at(j));
@@ -440,7 +442,7 @@ namespace Sass {
440
442
  previous_parent->block()->concat(slice);
441
443
  }
442
444
  else {
443
- previous_parent = Cast<Has_Block>(SASS_MEMORY_COPY(parent));
445
+ previous_parent = SASS_MEMORY_COPY(parent);
444
446
  previous_parent->block(slice);
445
447
  previous_parent->tabs(parent->tabs());
446
448
 
@@ -451,36 +453,24 @@ namespace Sass {
451
453
 
452
454
  for (size_t j = 0, K = slice->length(); j < K; ++j)
453
455
  {
454
- Statement* ss;
456
+ Statement_Obj ss;
455
457
  Statement_Obj stm = slice->at(j);
456
458
  // this has to go now here (too bad)
457
459
  Bubble_Obj node = Cast<Bubble>(stm);
458
- Media_Block* m1 = NULL;
459
- Media_Block* m2 = NULL;
460
- if (parent) m1 = Cast<Media_Block>(parent);
461
- if (node) m2 = Cast<Media_Block>(node->node());
462
- if (!parent ||
463
- parent->statement_type() != Statement::MEDIA ||
464
- node->node()->statement_type() != Statement::MEDIA ||
465
- (m1 && m2 && *m1->media_queries() == *m2->media_queries())
466
- )
467
- {
468
- ss = node->node();
469
- }
470
- else
471
- {
472
- List_Obj mq = merge_media_queries(
473
- Cast<Media_Block>(node->node()),
474
- Cast<Media_Block>(parent)
475
- );
476
- if (!mq->length()) continue;
477
- if (Media_Block* b = Cast<Media_Block>(node->node())) {
478
- b->media_queries(mq);
479
- }
460
+
461
+ CssMediaRule* rule1 = NULL;
462
+ CssMediaRule* rule2 = NULL;
463
+ if (parent) rule1 = Cast<CssMediaRule>(parent);
464
+ if (node) rule2 = Cast<CssMediaRule>(node->node());
465
+ if (rule1 || rule2) {
480
466
  ss = node->node();
481
467
  }
482
468
 
483
- if (!ss) continue;
469
+ ss = node->node();
470
+
471
+ if (!ss) {
472
+ continue;
473
+ }
484
474
 
485
475
  ss->tabs(ss->tabs() + node->tabs());
486
476
  ss->group_end(node->group_end());
@@ -516,7 +506,7 @@ namespace Sass {
516
506
  {
517
507
  for (size_t i = 0, L = b->length(); i < L; ++i) {
518
508
  Statement_Obj ith = b->at(i)->perform(this);
519
- if (Block* bb = Cast<Block>(ith)) {
509
+ if (Block_Obj bb = Cast<Block>(ith)) {
520
510
  for (size_t j = 0, K = bb->length(); j < K; ++j) {
521
511
  cur->append(bb->at(j));
522
512
  }
@@ -527,78 +517,4 @@ namespace Sass {
527
517
  }
528
518
  }
529
519
 
530
- List* Cssize::merge_media_queries(Media_Block* m1, Media_Block* m2)
531
- {
532
- List* qq = SASS_MEMORY_NEW(List,
533
- m1->media_queries()->pstate(),
534
- m1->media_queries()->length(),
535
- SASS_COMMA);
536
-
537
- for (size_t i = 0, L = m1->media_queries()->length(); i < L; i++) {
538
- for (size_t j = 0, K = m2->media_queries()->length(); j < K; j++) {
539
- Expression_Obj l1 = m1->media_queries()->at(i);
540
- Expression_Obj l2 = m2->media_queries()->at(j);
541
- Media_Query* mq1 = Cast<Media_Query>(l1);
542
- Media_Query* mq2 = Cast<Media_Query>(l2);
543
- Media_Query* mq = merge_media_query(mq1, mq2);
544
- if (mq) qq->append(mq);
545
- }
546
- }
547
-
548
- return qq;
549
- }
550
-
551
-
552
- Media_Query* Cssize::merge_media_query(Media_Query* mq1, Media_Query* mq2)
553
- {
554
-
555
- std::string type;
556
- std::string mod;
557
-
558
- std::string m1 = std::string(mq1->is_restricted() ? "only" : mq1->is_negated() ? "not" : "");
559
- std::string t1 = mq1->media_type() ? mq1->media_type()->to_string(ctx.c_options) : "";
560
- std::string m2 = std::string(mq2->is_restricted() ? "only" : mq2->is_negated() ? "not" : "");
561
- std::string t2 = mq2->media_type() ? mq2->media_type()->to_string(ctx.c_options) : "";
562
-
563
-
564
- if (t1.empty()) t1 = t2;
565
- if (t2.empty()) t2 = t1;
566
-
567
- if ((m1 == "not") ^ (m2 == "not")) {
568
- if (t1 == t2) {
569
- return 0;
570
- }
571
- type = m1 == "not" ? t2 : t1;
572
- mod = m1 == "not" ? m2 : m1;
573
- }
574
- else if (m1 == "not" && m2 == "not") {
575
- if (t1 != t2) {
576
- return 0;
577
- }
578
- type = t1;
579
- mod = "not";
580
- }
581
- else if (t1 != t2) {
582
- return 0;
583
- } else {
584
- type = t1;
585
- mod = m1.empty() ? m2 : m1;
586
- }
587
-
588
- Media_Query* mm = SASS_MEMORY_NEW(Media_Query,
589
- mq1->pstate(),
590
- {},
591
- mq1->length() + mq2->length(),
592
- mod == "not",
593
- mod == "only");
594
-
595
- if (!type.empty()) {
596
- mm->media_type(SASS_MEMORY_NEW(String_Quoted, mq1->pstate(), type));
597
- }
598
-
599
- mm->concat(mq2);
600
- mm->concat(mq1);
601
-
602
- return mm;
603
- }
604
520
  }