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