sassc 2.0.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +9 -3
  5. data/CHANGELOG.md +36 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +43 -7
  9. data/ext/depend +4 -0
  10. data/ext/extconf.rb +92 -0
  11. data/ext/libsass/VERSION +1 -0
  12. data/ext/libsass/include/sass/base.h +9 -1
  13. data/ext/libsass/include/sass/context.h +5 -1
  14. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  15. data/ext/libsass/src/ast.cpp +755 -2028
  16. data/ext/libsass/src/ast.hpp +492 -2477
  17. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  18. data/ext/libsass/src/ast2c.hpp +39 -0
  19. data/ext/libsass/src/ast_def_macros.hpp +70 -10
  20. data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
  21. data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
  22. data/ext/libsass/src/ast_helpers.hpp +292 -0
  23. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  24. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  25. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  26. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1043 -0
  28. data/ext/libsass/src/ast_selectors.hpp +522 -0
  29. data/ext/libsass/src/ast_supports.cpp +114 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +1154 -0
  32. data/ext/libsass/src/ast_values.hpp +498 -0
  33. data/ext/libsass/src/backtrace.cpp +11 -7
  34. data/ext/libsass/src/backtrace.hpp +5 -5
  35. data/ext/libsass/src/base64vlq.cpp +5 -2
  36. data/ext/libsass/src/base64vlq.hpp +1 -1
  37. data/ext/libsass/src/bind.cpp +35 -34
  38. data/ext/libsass/src/bind.hpp +3 -1
  39. data/ext/libsass/src/c2ast.cpp +64 -0
  40. data/ext/libsass/src/c2ast.hpp +14 -0
  41. data/ext/libsass/src/cencode.c +4 -6
  42. data/ext/libsass/src/check_nesting.cpp +83 -88
  43. data/ext/libsass/src/check_nesting.hpp +39 -34
  44. data/ext/libsass/src/color_maps.cpp +168 -164
  45. data/ext/libsass/src/color_maps.hpp +152 -160
  46. data/ext/libsass/src/constants.cpp +20 -0
  47. data/ext/libsass/src/constants.hpp +19 -0
  48. data/ext/libsass/src/context.cpp +104 -121
  49. data/ext/libsass/src/context.hpp +43 -55
  50. data/ext/libsass/src/cssize.cpp +103 -188
  51. data/ext/libsass/src/cssize.hpp +45 -51
  52. data/ext/libsass/src/dart_helpers.hpp +199 -0
  53. data/ext/libsass/src/debugger.hpp +524 -361
  54. data/ext/libsass/src/emitter.cpp +26 -26
  55. data/ext/libsass/src/emitter.hpp +20 -18
  56. data/ext/libsass/src/environment.cpp +41 -27
  57. data/ext/libsass/src/environment.hpp +33 -22
  58. data/ext/libsass/src/error_handling.cpp +92 -94
  59. data/ext/libsass/src/error_handling.hpp +73 -50
  60. data/ext/libsass/src/eval.cpp +380 -515
  61. data/ext/libsass/src/eval.hpp +64 -57
  62. data/ext/libsass/src/eval_selectors.cpp +75 -0
  63. data/ext/libsass/src/expand.cpp +322 -263
  64. data/ext/libsass/src/expand.hpp +55 -39
  65. data/ext/libsass/src/extender.cpp +1188 -0
  66. data/ext/libsass/src/extender.hpp +399 -0
  67. data/ext/libsass/src/extension.cpp +43 -0
  68. data/ext/libsass/src/extension.hpp +89 -0
  69. data/ext/libsass/src/file.cpp +134 -88
  70. data/ext/libsass/src/file.hpp +28 -37
  71. data/ext/libsass/src/fn_colors.cpp +596 -0
  72. data/ext/libsass/src/fn_colors.hpp +85 -0
  73. data/ext/libsass/src/fn_lists.cpp +285 -0
  74. data/ext/libsass/src/fn_lists.hpp +34 -0
  75. data/ext/libsass/src/fn_maps.cpp +94 -0
  76. data/ext/libsass/src/fn_maps.hpp +30 -0
  77. data/ext/libsass/src/fn_miscs.cpp +244 -0
  78. data/ext/libsass/src/fn_miscs.hpp +40 -0
  79. data/ext/libsass/src/fn_numbers.cpp +227 -0
  80. data/ext/libsass/src/fn_numbers.hpp +45 -0
  81. data/ext/libsass/src/fn_selectors.cpp +205 -0
  82. data/ext/libsass/src/fn_selectors.hpp +35 -0
  83. data/ext/libsass/src/fn_strings.cpp +268 -0
  84. data/ext/libsass/src/fn_strings.hpp +34 -0
  85. data/ext/libsass/src/fn_utils.cpp +158 -0
  86. data/ext/libsass/src/fn_utils.hpp +62 -0
  87. data/ext/libsass/src/inspect.cpp +253 -266
  88. data/ext/libsass/src/inspect.hpp +72 -74
  89. data/ext/libsass/src/json.cpp +2 -2
  90. data/ext/libsass/src/lexer.cpp +25 -84
  91. data/ext/libsass/src/lexer.hpp +5 -16
  92. data/ext/libsass/src/listize.cpp +27 -43
  93. data/ext/libsass/src/listize.hpp +14 -11
  94. data/ext/libsass/src/mapping.hpp +1 -0
  95. data/ext/libsass/src/memory.hpp +12 -0
  96. data/ext/libsass/src/memory/allocator.cpp +48 -0
  97. data/ext/libsass/src/memory/allocator.hpp +138 -0
  98. data/ext/libsass/src/memory/config.hpp +20 -0
  99. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  100. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  101. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  102. data/ext/libsass/src/operation.hpp +193 -143
  103. data/ext/libsass/src/operators.cpp +56 -29
  104. data/ext/libsass/src/operators.hpp +11 -11
  105. data/ext/libsass/src/ordered_map.hpp +112 -0
  106. data/ext/libsass/src/output.cpp +59 -75
  107. data/ext/libsass/src/output.hpp +15 -22
  108. data/ext/libsass/src/parser.cpp +662 -818
  109. data/ext/libsass/src/parser.hpp +96 -100
  110. data/ext/libsass/src/parser_selectors.cpp +189 -0
  111. data/ext/libsass/src/permutate.hpp +164 -0
  112. data/ext/libsass/src/plugins.cpp +12 -8
  113. data/ext/libsass/src/plugins.hpp +8 -8
  114. data/ext/libsass/src/position.cpp +10 -26
  115. data/ext/libsass/src/position.hpp +44 -21
  116. data/ext/libsass/src/prelexer.cpp +14 -8
  117. data/ext/libsass/src/prelexer.hpp +9 -9
  118. data/ext/libsass/src/remove_placeholders.cpp +59 -57
  119. data/ext/libsass/src/remove_placeholders.hpp +20 -18
  120. data/ext/libsass/src/sass.cpp +25 -18
  121. data/ext/libsass/src/sass.hpp +22 -14
  122. data/ext/libsass/src/sass2scss.cpp +49 -18
  123. data/ext/libsass/src/sass_context.cpp +104 -132
  124. data/ext/libsass/src/sass_context.hpp +2 -2
  125. data/ext/libsass/src/sass_functions.cpp +7 -4
  126. data/ext/libsass/src/sass_functions.hpp +1 -1
  127. data/ext/libsass/src/sass_values.cpp +26 -21
  128. data/ext/libsass/src/settings.hpp +19 -0
  129. data/ext/libsass/src/source.cpp +69 -0
  130. data/ext/libsass/src/source.hpp +95 -0
  131. data/ext/libsass/src/source_data.hpp +32 -0
  132. data/ext/libsass/src/source_map.cpp +27 -20
  133. data/ext/libsass/src/source_map.hpp +14 -11
  134. data/ext/libsass/src/stylesheet.cpp +22 -0
  135. data/ext/libsass/src/stylesheet.hpp +57 -0
  136. data/ext/libsass/src/to_value.cpp +24 -22
  137. data/ext/libsass/src/to_value.hpp +18 -22
  138. data/ext/libsass/src/units.cpp +28 -22
  139. data/ext/libsass/src/units.hpp +9 -8
  140. data/ext/libsass/src/utf8/checked.h +12 -10
  141. data/ext/libsass/src/utf8/core.h +3 -0
  142. data/ext/libsass/src/utf8_string.cpp +12 -10
  143. data/ext/libsass/src/utf8_string.hpp +7 -6
  144. data/ext/libsass/src/util.cpp +97 -107
  145. data/ext/libsass/src/util.hpp +74 -30
  146. data/ext/libsass/src/util_string.cpp +125 -0
  147. data/ext/libsass/src/util_string.hpp +73 -0
  148. data/ext/libsass/src/values.cpp +33 -24
  149. data/ext/libsass/src/values.hpp +2 -2
  150. data/lib/sassc.rb +24 -0
  151. data/lib/sassc/engine.rb +7 -5
  152. data/lib/sassc/functions_handler.rb +11 -13
  153. data/lib/sassc/native.rb +10 -9
  154. data/lib/sassc/native/native_functions_api.rb +0 -5
  155. data/lib/sassc/script.rb +4 -6
  156. data/lib/sassc/version.rb +1 -1
  157. data/sassc.gemspec +32 -12
  158. data/test/engine_test.rb +32 -2
  159. data/test/functions_test.rb +38 -1
  160. data/test/native_test.rb +4 -4
  161. metadata +95 -109
  162. data/ext/Rakefile +0 -3
  163. data/ext/libsass/.editorconfig +0 -15
  164. data/ext/libsass/.gitattributes +0 -2
  165. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  166. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  167. data/ext/libsass/.gitignore +0 -85
  168. data/ext/libsass/.travis.yml +0 -64
  169. data/ext/libsass/COPYING +0 -25
  170. data/ext/libsass/GNUmakefile.am +0 -88
  171. data/ext/libsass/INSTALL +0 -1
  172. data/ext/libsass/LICENSE +0 -25
  173. data/ext/libsass/Makefile +0 -351
  174. data/ext/libsass/Makefile.conf +0 -55
  175. data/ext/libsass/Readme.md +0 -104
  176. data/ext/libsass/SECURITY.md +0 -10
  177. data/ext/libsass/appveyor.yml +0 -91
  178. data/ext/libsass/configure.ac +0 -138
  179. data/ext/libsass/contrib/libsass.spec +0 -66
  180. data/ext/libsass/docs/README.md +0 -20
  181. data/ext/libsass/docs/api-context-example.md +0 -45
  182. data/ext/libsass/docs/api-context-internal.md +0 -163
  183. data/ext/libsass/docs/api-context.md +0 -295
  184. data/ext/libsass/docs/api-doc.md +0 -215
  185. data/ext/libsass/docs/api-function-example.md +0 -67
  186. data/ext/libsass/docs/api-function-internal.md +0 -8
  187. data/ext/libsass/docs/api-function.md +0 -74
  188. data/ext/libsass/docs/api-importer-example.md +0 -112
  189. data/ext/libsass/docs/api-importer-internal.md +0 -20
  190. data/ext/libsass/docs/api-importer.md +0 -86
  191. data/ext/libsass/docs/api-value-example.md +0 -55
  192. data/ext/libsass/docs/api-value-internal.md +0 -76
  193. data/ext/libsass/docs/api-value.md +0 -154
  194. data/ext/libsass/docs/build-on-darwin.md +0 -27
  195. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  196. data/ext/libsass/docs/build-on-windows.md +0 -139
  197. data/ext/libsass/docs/build-shared-library.md +0 -35
  198. data/ext/libsass/docs/build-with-autotools.md +0 -78
  199. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  200. data/ext/libsass/docs/build-with-mingw.md +0 -107
  201. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  202. data/ext/libsass/docs/build.md +0 -97
  203. data/ext/libsass/docs/compatibility-plan.md +0 -48
  204. data/ext/libsass/docs/contributing.md +0 -17
  205. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  206. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  207. data/ext/libsass/docs/implementations.md +0 -56
  208. data/ext/libsass/docs/plugins.md +0 -47
  209. data/ext/libsass/docs/setup-environment.md +0 -68
  210. data/ext/libsass/docs/source-map-internals.md +0 -51
  211. data/ext/libsass/docs/trace.md +0 -26
  212. data/ext/libsass/docs/triage.md +0 -17
  213. data/ext/libsass/docs/unicode.md +0 -39
  214. data/ext/libsass/extconf.rb +0 -6
  215. data/ext/libsass/include/sass/version.h.in +0 -12
  216. data/ext/libsass/m4/.gitkeep +0 -0
  217. data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
  218. data/ext/libsass/res/resource.rc +0 -35
  219. data/ext/libsass/script/bootstrap +0 -13
  220. data/ext/libsass/script/branding +0 -10
  221. data/ext/libsass/script/ci-build-libsass +0 -134
  222. data/ext/libsass/script/ci-build-plugin +0 -62
  223. data/ext/libsass/script/ci-install-compiler +0 -6
  224. data/ext/libsass/script/ci-install-deps +0 -20
  225. data/ext/libsass/script/ci-report-coverage +0 -42
  226. data/ext/libsass/script/spec +0 -5
  227. data/ext/libsass/script/tap-driver +0 -652
  228. data/ext/libsass/script/tap-runner +0 -1
  229. data/ext/libsass/script/test-leaks.pl +0 -103
  230. data/ext/libsass/src/GNUmakefile.am +0 -54
  231. data/ext/libsass/src/extend.cpp +0 -2130
  232. data/ext/libsass/src/extend.hpp +0 -86
  233. data/ext/libsass/src/functions.cpp +0 -2234
  234. data/ext/libsass/src/functions.hpp +0 -198
  235. data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
  236. data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
  237. data/ext/libsass/src/node.cpp +0 -319
  238. data/ext/libsass/src/node.hpp +0 -118
  239. data/ext/libsass/src/paths.hpp +0 -71
  240. data/ext/libsass/src/sass_util.cpp +0 -149
  241. data/ext/libsass/src/sass_util.hpp +0 -256
  242. data/ext/libsass/src/subset_map.cpp +0 -55
  243. data/ext/libsass/src/subset_map.hpp +0 -76
  244. data/ext/libsass/src/support/libsass.pc.in +0 -11
  245. data/ext/libsass/src/to_c.hpp +0 -39
  246. data/ext/libsass/test/test_node.cpp +0 -94
  247. data/ext/libsass/test/test_paths.cpp +0 -28
  248. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  249. data/ext/libsass/test/test_specificity.cpp +0 -25
  250. data/ext/libsass/test/test_subset_map.cpp +0 -472
  251. data/ext/libsass/test/test_superselector.cpp +0 -69
  252. data/ext/libsass/test/test_unification.cpp +0 -31
  253. data/ext/libsass/version.sh +0 -10
  254. data/ext/libsass/win/libsass.sln +0 -39
  255. data/ext/libsass/win/libsass.sln.DotSettings +0 -9
  256. data/ext/libsass/win/libsass.targets +0 -118
  257. data/ext/libsass/win/libsass.vcxproj +0 -188
  258. data/ext/libsass/win/libsass.vcxproj.filters +0 -357
  259. data/lib/sassc/native/lib_c.rb +0 -21
  260. data/lib/tasks/libsass.rb +0 -33
@@ -1,319 +0,0 @@
1
- #include "sass.hpp"
2
- #include <vector>
3
-
4
- #include "node.hpp"
5
- #include "context.hpp"
6
- #include "parser.hpp"
7
-
8
- namespace Sass {
9
-
10
-
11
- Node Node::createCombinator(const Complex_Selector::Combinator& combinator) {
12
- NodeDequePtr null;
13
- return Node(COMBINATOR, combinator, NULL /*pSelector*/, null /*pCollection*/);
14
- }
15
-
16
-
17
- Node Node::createSelector(const Complex_Selector& pSelector) {
18
- NodeDequePtr null;
19
-
20
- Complex_Selector_Ptr pStripped = SASS_MEMORY_COPY(&pSelector);
21
- pStripped->tail(NULL);
22
- pStripped->combinator(Complex_Selector::ANCESTOR_OF);
23
-
24
- Node n(SELECTOR, Complex_Selector::ANCESTOR_OF, pStripped, null /*pCollection*/);
25
- n.got_line_feed = pSelector.has_line_feed();
26
- return n;
27
- }
28
-
29
-
30
- Node Node::createCollection() {
31
- NodeDequePtr pEmptyCollection = std::make_shared<NodeDeque>();
32
- return Node(COLLECTION, Complex_Selector::ANCESTOR_OF, NULL /*pSelector*/, pEmptyCollection);
33
- }
34
-
35
-
36
- Node Node::createCollection(const NodeDeque& values) {
37
- NodeDequePtr pShallowCopiedCollection = std::make_shared<NodeDeque>(values);
38
- return Node(COLLECTION, Complex_Selector::ANCESTOR_OF, NULL /*pSelector*/, pShallowCopiedCollection);
39
- }
40
-
41
-
42
- Node Node::createNil() {
43
- NodeDequePtr null;
44
- return Node(NIL, Complex_Selector::ANCESTOR_OF, NULL /*pSelector*/, null /*pCollection*/);
45
- }
46
-
47
-
48
- Node::Node(const TYPE& type, Complex_Selector::Combinator combinator, Complex_Selector_Ptr pSelector, NodeDequePtr& pCollection)
49
- : got_line_feed(false), mType(type), mCombinator(combinator), mpSelector(pSelector), mpCollection(pCollection)
50
- { if (pSelector) got_line_feed = pSelector->has_line_feed(); }
51
-
52
-
53
- Node Node::klone() const {
54
- NodeDequePtr pNewCollection = std::make_shared<NodeDeque>();
55
- if (mpCollection) {
56
- for (NodeDeque::iterator iter = mpCollection->begin(), iterEnd = mpCollection->end(); iter != iterEnd; iter++) {
57
- Node& toClone = *iter;
58
- pNewCollection->push_back(toClone.klone());
59
- }
60
- }
61
-
62
- Node n(mType, mCombinator, mpSelector ? SASS_MEMORY_COPY(mpSelector) : NULL, pNewCollection);
63
- n.got_line_feed = got_line_feed;
64
- return n;
65
- }
66
-
67
-
68
- bool Node::contains(const Node& potentialChild) const {
69
- bool found = false;
70
-
71
- for (NodeDeque::iterator iter = mpCollection->begin(), iterEnd = mpCollection->end(); iter != iterEnd; iter++) {
72
- Node& toTest = *iter;
73
-
74
- if (toTest == potentialChild) {
75
- found = true;
76
- break;
77
- }
78
- }
79
-
80
- return found;
81
- }
82
-
83
-
84
- bool Node::operator==(const Node& rhs) const {
85
- if (this->type() != rhs.type()) {
86
- return false;
87
- }
88
-
89
- if (this->isCombinator()) {
90
-
91
- return this->combinator() == rhs.combinator();
92
-
93
- } else if (this->isNil()) {
94
-
95
- return true; // no state to check
96
-
97
- } else if (this->isSelector()){
98
-
99
- return *this->selector() == *rhs.selector();
100
-
101
- } else if (this->isCollection()) {
102
-
103
- if (this->collection()->size() != rhs.collection()->size()) {
104
- return false;
105
- }
106
-
107
- for (NodeDeque::iterator lhsIter = this->collection()->begin(), lhsIterEnd = this->collection()->end(),
108
- rhsIter = rhs.collection()->begin(); lhsIter != lhsIterEnd; lhsIter++, rhsIter++) {
109
-
110
- if (*lhsIter != *rhsIter) {
111
- return false;
112
- }
113
-
114
- }
115
-
116
- return true;
117
-
118
- }
119
-
120
- // We shouldn't get here.
121
- throw "Comparing unknown node types. A new type was probably added and this method wasn't implemented for it.";
122
- }
123
-
124
-
125
- void Node::plus(Node& rhs) {
126
- if (!this->isCollection() || !rhs.isCollection()) {
127
- throw "Both the current node and rhs must be collections.";
128
- }
129
- this->collection()->insert(this->collection()->end(), rhs.collection()->begin(), rhs.collection()->end());
130
- }
131
-
132
- #ifdef DEBUG
133
- std::ostream& operator<<(std::ostream& os, const Node& node) {
134
-
135
- if (node.isCombinator()) {
136
-
137
- switch (node.combinator()) {
138
- case Complex_Selector::ANCESTOR_OF: os << "\" \""; break;
139
- case Complex_Selector::PARENT_OF: os << "\">\""; break;
140
- case Complex_Selector::PRECEDES: os << "\"~\""; break;
141
- case Complex_Selector::ADJACENT_TO: os << "\"+\""; break;
142
- case Complex_Selector::REFERENCE: os << "\"/\""; break;
143
- }
144
-
145
- } else if (node.isNil()) {
146
-
147
- os << "nil";
148
-
149
- } else if (node.isSelector()){
150
-
151
- os << node.selector()->head()->to_string();
152
-
153
- } else if (node.isCollection()) {
154
-
155
- os << "[";
156
-
157
- for (NodeDeque::iterator iter = node.collection()->begin(), iterBegin = node.collection()->begin(), iterEnd = node.collection()->end(); iter != iterEnd; iter++) {
158
- if (iter != iterBegin) {
159
- os << ", ";
160
- }
161
-
162
- os << (*iter);
163
- }
164
-
165
- os << "]";
166
-
167
- }
168
-
169
- return os;
170
-
171
- }
172
- #endif
173
-
174
-
175
- Node complexSelectorToNode(Complex_Selector_Ptr pToConvert) {
176
- if (pToConvert == NULL) {
177
- return Node::createNil();
178
- }
179
- Node node = Node::createCollection();
180
- node.got_line_feed = pToConvert->has_line_feed();
181
- bool has_lf = pToConvert->has_line_feed();
182
-
183
- // unwrap the selector from parent ref
184
- if (pToConvert->head() && pToConvert->head()->has_parent_ref()) {
185
- Complex_Selector_Obj tail = pToConvert->tail();
186
- if (tail) tail->has_line_feed(pToConvert->has_line_feed());
187
- pToConvert = tail;
188
- }
189
-
190
- while (pToConvert) {
191
-
192
- bool empty_parent_ref = pToConvert->head() && pToConvert->head()->is_empty_reference();
193
-
194
- // the first Complex_Selector may contain a dummy head pointer, skip it.
195
- if (pToConvert->head() && !empty_parent_ref) {
196
- node.collection()->push_back(Node::createSelector(*pToConvert));
197
- if (has_lf) node.collection()->back().got_line_feed = has_lf;
198
- if (pToConvert->head() || empty_parent_ref) {
199
- if (pToConvert->tail()) {
200
- pToConvert->tail()->has_line_feed(pToConvert->has_line_feed());
201
- }
202
- }
203
- has_lf = false;
204
- }
205
-
206
- if (pToConvert->combinator() != Complex_Selector::ANCESTOR_OF) {
207
- node.collection()->push_back(Node::createCombinator(pToConvert->combinator()));
208
- if (has_lf) node.collection()->back().got_line_feed = has_lf;
209
- has_lf = false;
210
- }
211
-
212
- if (pToConvert && empty_parent_ref && pToConvert->tail()) {
213
- // pToConvert->tail()->has_line_feed(pToConvert->has_line_feed());
214
- }
215
-
216
- pToConvert = pToConvert->tail();
217
- }
218
-
219
- return node;
220
- }
221
-
222
-
223
- Complex_Selector_Ptr nodeToComplexSelector(const Node& toConvert) {
224
- if (toConvert.isNil()) {
225
- return NULL;
226
- }
227
-
228
-
229
- if (!toConvert.isCollection()) {
230
- throw "The node to convert to a Complex_Selector_Ptr must be a collection type or nil.";
231
- }
232
-
233
-
234
- NodeDeque& childNodes = *toConvert.collection();
235
-
236
- std::string noPath("");
237
- Complex_Selector_Obj pFirst = SASS_MEMORY_NEW(Complex_Selector, ParserState("[NODE]"), Complex_Selector::ANCESTOR_OF, NULL, NULL);
238
-
239
- Complex_Selector_Obj pCurrent = pFirst;
240
-
241
- if (toConvert.isSelector()) pFirst->has_line_feed(toConvert.got_line_feed);
242
- if (toConvert.isCombinator()) pFirst->has_line_feed(toConvert.got_line_feed);
243
-
244
- for (NodeDeque::iterator childIter = childNodes.begin(), childIterEnd = childNodes.end(); childIter != childIterEnd; childIter++) {
245
-
246
- Node& child = *childIter;
247
-
248
- if (child.isSelector()) {
249
- // JMA - need to clone the selector, because they can end up getting shared across Node
250
- // collections, and can result in an infinite loop during the call to parentSuperselector()
251
- pCurrent->tail(SASS_MEMORY_COPY(child.selector()));
252
- // if (child.got_line_feed) pCurrent->has_line_feed(child.got_line_feed);
253
- pCurrent = pCurrent->tail();
254
- } else if (child.isCombinator()) {
255
- pCurrent->combinator(child.combinator());
256
- if (child.got_line_feed) pCurrent->has_line_feed(child.got_line_feed);
257
-
258
- // if the next node is also a combinator, create another Complex_Selector to hold it so it doesn't replace the current combinator
259
- if (childIter+1 != childIterEnd) {
260
- Node& nextNode = *(childIter+1);
261
- if (nextNode.isCombinator()) {
262
- pCurrent->tail(SASS_MEMORY_NEW(Complex_Selector, ParserState("[NODE]"), Complex_Selector::ANCESTOR_OF, NULL, NULL));
263
- if (nextNode.got_line_feed) pCurrent->tail()->has_line_feed(nextNode.got_line_feed);
264
- pCurrent = pCurrent->tail();
265
- }
266
- }
267
- } else {
268
- throw "The node to convert's children must be only combinators or selectors.";
269
- }
270
- }
271
-
272
- // Put the dummy Compound_Selector in the first position, for consistency with the rest of libsass
273
- Compound_Selector_Ptr fakeHead = SASS_MEMORY_NEW(Compound_Selector, ParserState("[NODE]"), 1);
274
- Parent_Selector_Ptr selectorRef = SASS_MEMORY_NEW(Parent_Selector, ParserState("[NODE]"));
275
- fakeHead->elements().push_back(selectorRef);
276
- if (toConvert.got_line_feed) pFirst->has_line_feed(toConvert.got_line_feed);
277
- // pFirst->has_line_feed(pFirst->has_line_feed() || pFirst->tail()->has_line_feed() || toConvert.got_line_feed);
278
- pFirst->head(fakeHead);
279
- return SASS_MEMORY_COPY(pFirst);
280
- }
281
-
282
- // A very naive trim function, which removes duplicates in a node
283
- // This is only used in Complex_Selector::unify_with for now, may need modifications to fit other needs
284
- Node Node::naiveTrim(Node& seqses) {
285
-
286
- std::vector<Node*> res;
287
- std::vector<Complex_Selector_Obj> known;
288
-
289
- NodeDeque::reverse_iterator seqsesIter = seqses.collection()->rbegin(),
290
- seqsesIterEnd = seqses.collection()->rend();
291
-
292
- for (; seqsesIter != seqsesIterEnd; ++seqsesIter)
293
- {
294
- Node& seqs1 = *seqsesIter;
295
- if( seqs1.isSelector() ) {
296
- Complex_Selector_Obj sel = seqs1.selector();
297
- std::vector<Complex_Selector_Obj>::iterator it;
298
- bool found = false;
299
- for (it = known.begin(); it != known.end(); ++it) {
300
- if (**it == *sel) { found = true; break; }
301
- }
302
- if( !found ) {
303
- known.push_back(seqs1.selector());
304
- res.push_back(&seqs1);
305
- }
306
- } else {
307
- res.push_back(&seqs1);
308
- }
309
- }
310
-
311
- Node result = Node::createCollection();
312
-
313
- for (size_t i = res.size() - 1; i != std::string::npos; --i) {
314
- result.collection()->push_back(*res[i]);
315
- }
316
-
317
- return result;
318
- }
319
- }
@@ -1,118 +0,0 @@
1
- #ifndef SASS_NODE_H
2
- #define SASS_NODE_H
3
-
4
- #include <deque>
5
- #include <memory>
6
-
7
- #include "ast.hpp"
8
-
9
-
10
- namespace Sass {
11
-
12
-
13
-
14
-
15
- class Context;
16
-
17
- /*
18
- There are a lot of stumbling blocks when trying to port the ruby extend code to C++. The biggest is the choice of
19
- data type. The ruby code will pretty seamlessly switch types between an Array<SimpleSequence or Op> (libsass'
20
- equivalent is the Complex_Selector) to a Sequence, which contains more metadata about the sequence than just the
21
- selector info. They also have the ability to have arbitrary nestings of arrays like [1, [2]], which is hard to
22
- implement using Array equivalents in C++ (like the deque or vector). They also have the ability to include nil
23
- in the arrays, like [1, nil, 3], which has potential semantic differences than an empty array [1, [], 3]. To be
24
- able to represent all of these as unique cases, we need to create a tree of variant objects. The tree nature allows
25
- the inconsistent nesting levels. The variant nature (while making some of the C++ code uglier) allows the code to
26
- more closely match the ruby code, which is a huge benefit when attempting to implement an complex algorithm like
27
- the Extend operator.
28
-
29
- Note that the current libsass data model also pairs the combinator with the Complex_Selector that follows it, but
30
- ruby sass has no such restriction, so we attempt to create a data structure that can handle them split apart.
31
- */
32
-
33
- class Node;
34
- typedef std::deque<Node> NodeDeque;
35
- typedef std::shared_ptr<NodeDeque> NodeDequePtr;
36
-
37
- class Node {
38
- public:
39
- enum TYPE {
40
- SELECTOR,
41
- COMBINATOR,
42
- COLLECTION,
43
- NIL
44
- };
45
-
46
- TYPE type() const { return mType; }
47
- bool isCombinator() const { return mType == COMBINATOR; }
48
- bool isSelector() const { return mType == SELECTOR; }
49
- bool isCollection() const { return mType == COLLECTION; }
50
- bool isNil() const { return mType == NIL; }
51
- bool got_line_feed;
52
-
53
- Complex_Selector::Combinator combinator() const { return mCombinator; }
54
-
55
- Complex_Selector_Obj selector() { return mpSelector; }
56
- Complex_Selector_Obj selector() const { return mpSelector; }
57
-
58
- NodeDequePtr collection() { return mpCollection; }
59
- const NodeDequePtr collection() const { return mpCollection; }
60
-
61
- static Node createCombinator(const Complex_Selector::Combinator& combinator);
62
-
63
- // This method will klone the selector, stripping off the tail and combinator
64
- static Node createSelector(const Complex_Selector& pSelector);
65
-
66
- static Node createCollection();
67
- static Node createCollection(const NodeDeque& values);
68
-
69
- static Node createNil();
70
- static Node naiveTrim(Node& seqses);
71
-
72
- Node klone() const;
73
-
74
- bool operator==(const Node& rhs) const;
75
- inline bool operator!=(const Node& rhs) const { return !(*this == rhs); }
76
-
77
-
78
- /*
79
- COLLECTION FUNCTIONS
80
-
81
- Most types don't need any helper methods (nil and combinator due to their simplicity and
82
- selector due to the fact that we leverage the non-node selector code on the Complex_Selector
83
- whereever possible). The following methods are intended to be called on Node objects whose
84
- type is COLLECTION only.
85
- */
86
-
87
- // rhs and this must be node collections. Shallow copy the nodes from rhs to the end of this.
88
- // This function DOES NOT remove the nodes from rhs.
89
- void plus(Node& rhs);
90
-
91
- // potentialChild must be a node collection of selectors/combinators. this must be a collection
92
- // of collections of nodes/combinators. This method checks if potentialChild is a child of this
93
- // Node.
94
- bool contains(const Node& potentialChild) const;
95
-
96
- private:
97
- // Private constructor; Use the static methods (like createCombinator and createSelector)
98
- // to instantiate this object. This is more expressive, and it allows us to break apart each
99
- // case into separate functions.
100
- Node(const TYPE& type, Complex_Selector::Combinator combinator, Complex_Selector_Ptr pSelector, NodeDequePtr& pCollection);
101
-
102
- TYPE mType;
103
-
104
- // TODO: can we union these to save on memory?
105
- Complex_Selector::Combinator mCombinator;
106
- Complex_Selector_Obj mpSelector;
107
- NodeDequePtr mpCollection;
108
- };
109
-
110
- #ifdef DEBUG
111
- std::ostream& operator<<(std::ostream& os, const Node& node);
112
- #endif
113
- Node complexSelectorToNode(Complex_Selector_Ptr pToConvert);
114
- Complex_Selector_Ptr nodeToComplexSelector(const Node& toConvert);
115
-
116
- }
117
-
118
- #endif
@@ -1,71 +0,0 @@
1
- #ifndef SASS_PATHS_H
2
- #define SASS_PATHS_H
3
-
4
- #include <string>
5
- #include <vector>
6
- #include <sstream>
7
-
8
-
9
- template<typename T>
10
- std::string vector_to_string(std::vector<T> v)
11
- {
12
- std::stringstream buffer;
13
- buffer << "[";
14
-
15
- if (!v.empty())
16
- { buffer << v[0]; }
17
- else
18
- { buffer << "]"; }
19
-
20
- if (v.size() == 1)
21
- { buffer << "]"; }
22
- else
23
- {
24
- for (size_t i = 1, S = v.size(); i < S; ++i) buffer << ", " << v[i];
25
- buffer << "]";
26
- }
27
-
28
- return buffer.str();
29
- }
30
-
31
- namespace Sass {
32
-
33
-
34
- template<typename T>
35
- std::vector<std::vector<T> > paths(std::vector<std::vector<T> > strata, size_t from_end = 0)
36
- {
37
- if (strata.empty()) {
38
- return std::vector<std::vector<T> >();
39
- }
40
-
41
- size_t end = strata.size() - from_end;
42
- if (end <= 1) {
43
- std::vector<std::vector<T> > starting_points;
44
- starting_points.reserve(strata[0].size());
45
- for (size_t i = 0, S = strata[0].size(); i < S; ++i) {
46
- std::vector<T> starting_point;
47
- starting_point.push_back(strata[0][i]);
48
- starting_points.push_back(starting_point);
49
- }
50
- return starting_points;
51
- }
52
-
53
- std::vector<std::vector<T> > up_to_here = paths(strata, from_end + 1);
54
- std::vector<T> here = strata[end-1];
55
-
56
- std::vector<std::vector<T> > branches;
57
- branches.reserve(up_to_here.size() * here.size());
58
- for (size_t i = 0, S1 = up_to_here.size(); i < S1; ++i) {
59
- for (size_t j = 0, S2 = here.size(); j < S2; ++j) {
60
- std::vector<T> branch = up_to_here[i];
61
- branch.push_back(here[j]);
62
- branches.push_back(branch);
63
- }
64
- }
65
-
66
- return branches;
67
- }
68
-
69
- }
70
-
71
- #endif