sassc 2.2.1 → 2.3.0

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 (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
  }