1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
30
  
31
  
32
  
33
  
34
  
35
  
36
  
37
  
38
  
39
  
40
  
41
  
42
  
43
  
44
  
45
  
46
  
47
  
48
  
49
  
50
  
51
  
52
  
53
  
54
  
55
  
56
  
57
  
58
  
59
  
60
  
61
  
62
  
63
  
64
  
65
  
66
  
67
  
68
  
69
  
70
  
71
  
72
  
73
  
74
  
75
  
76
  
77
  
78
  
79
  
80
  
81
  
82
  
83
  
84
  
85
  
86
  
#include "sass.hpp" 
#include "remove_placeholders.hpp" 
#include "context.hpp" 
#include "inspect.hpp" 
#include <iostream> 
 
namespace Sass { 
 
    Remove_Placeholders::Remove_Placeholders() 
    { } 
 
    void Remove_Placeholders::operator()(Block_Ptr b) { 
        for (size_t i = 0, L = b->length(); i < L; ++i) { 
            Statement_Ptr st = b->at(i); 
            st->perform(this); 
        } 
    } 
 
    Selector_List_Ptr Remove_Placeholders::remove_placeholders(Selector_List_Ptr sl) 
    { 
      Selector_List_Ptr new_sl = SASS_MEMORY_NEW(Selector_List, sl->pstate()); 
 
      for (size_t i = 0, L = sl->length(); i < L; ++i) { 
          if (!sl->at(i)->contains_placeholder()) { 
              new_sl->append(sl->at(i)); 
          } 
      } 
 
      return new_sl; 
 
    } 
 
 
    void Remove_Placeholders::operator()(Ruleset_Ptr r) { 
        // Create a new selector group without placeholders 
        Selector_List_Obj sl = Cast<Selector_List>(r->selector()); 
 
        if (sl) { 
          // Set the new placeholder selector list 
          r->selector(remove_placeholders(sl)); 
          // Remove placeholders in wrapped selectors 
          for (Complex_Selector_Obj cs : sl->elements()) { 
            while (cs) { 
              if (cs->head()) { 
                for (Simple_Selector_Obj& ss : cs->head()->elements()) { 
                  if (Wrapped_Selector_Ptr ws = Cast<Wrapped_Selector>(ss)) { 
                    if (Selector_List_Ptr wsl = Cast<Selector_List>(ws->selector())) { 
                      Selector_List_Ptr clean = remove_placeholders(wsl); 
                      // also clean superflous parent selectors 
                      // probably not really the correct place 
                      clean->remove_parent_selectors(); 
                      ws->selector(clean); 
                    } 
                  } 
                } 
              } 
              cs = cs->tail(); 
            } 
          } 
        } 
 
        // Iterate into child blocks 
        Block_Obj b = r->block(); 
 
        for (size_t i = 0, L = b->length(); i < L; ++i) { 
            if (b->at(i)) { 
                Statement_Obj st = b->at(i); 
                st->perform(this); 
            } 
        } 
    } 
 
    void Remove_Placeholders::operator()(Media_Block_Ptr m) { 
        operator()(m->block()); 
    } 
    void Remove_Placeholders::operator()(Supports_Block_Ptr m) { 
        operator()(m->block()); 
    } 
 
    void Remove_Placeholders::operator()(Directive_Ptr a) { 
        if (a->block()) a->block()->perform(this); 
    } 
 
}