sassc 2.0.1 → 2.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +7 -3
  5. data/CHANGELOG.md +3 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +23 -8
  9. data/ext/extconf.rb +39 -0
  10. data/ext/libsass/.gitignore +1 -0
  11. data/ext/libsass/GNUmakefile.am +23 -39
  12. data/ext/libsass/Makefile +56 -91
  13. data/ext/libsass/Makefile.conf +16 -2
  14. data/ext/libsass/configure.ac +8 -12
  15. data/ext/libsass/include/sass/base.h +1 -0
  16. data/ext/libsass/include/sass/context.h +1 -1
  17. data/ext/libsass/src/GNUmakefile.am +1 -5
  18. data/ext/libsass/src/ast.cpp +747 -2010
  19. data/ext/libsass/src/ast.hpp +239 -2383
  20. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  21. data/ext/libsass/src/ast2c.hpp +39 -0
  22. data/ext/libsass/src/ast_def_macros.hpp +62 -10
  23. data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
  24. data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
  25. data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
  26. data/ext/libsass/src/ast_sel_unify.cpp +280 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1475 -0
  28. data/ext/libsass/src/ast_selectors.hpp +568 -0
  29. data/ext/libsass/src/ast_supports.cpp +130 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +967 -0
  32. data/ext/libsass/src/ast_values.hpp +489 -0
  33. data/ext/libsass/src/backtrace.cpp +4 -0
  34. data/ext/libsass/src/base64vlq.cpp +3 -0
  35. data/ext/libsass/src/bind.cpp +18 -17
  36. data/ext/libsass/src/bind.hpp +3 -1
  37. data/ext/libsass/src/c2ast.cpp +64 -0
  38. data/ext/libsass/src/c2ast.hpp +14 -0
  39. data/ext/libsass/src/cencode.c +2 -2
  40. data/ext/libsass/src/check_nesting.cpp +52 -56
  41. data/ext/libsass/src/check_nesting.hpp +35 -34
  42. data/ext/libsass/src/color_maps.cpp +156 -153
  43. data/ext/libsass/src/color_maps.hpp +152 -152
  44. data/ext/libsass/src/constants.cpp +15 -0
  45. data/ext/libsass/src/constants.hpp +13 -0
  46. data/ext/libsass/src/context.cpp +24 -14
  47. data/ext/libsass/src/context.hpp +6 -6
  48. data/ext/libsass/src/cssize.cpp +69 -71
  49. data/ext/libsass/src/cssize.hpp +50 -50
  50. data/ext/libsass/src/debugger.hpp +117 -110
  51. data/ext/libsass/src/emitter.cpp +13 -12
  52. data/ext/libsass/src/emitter.hpp +13 -9
  53. data/ext/libsass/src/environment.cpp +15 -1
  54. data/ext/libsass/src/environment.hpp +6 -0
  55. data/ext/libsass/src/error_handling.cpp +36 -59
  56. data/ext/libsass/src/error_handling.hpp +29 -16
  57. data/ext/libsass/src/eval.cpp +302 -323
  58. data/ext/libsass/src/eval.hpp +64 -55
  59. data/ext/libsass/src/expand.cpp +94 -88
  60. data/ext/libsass/src/expand.hpp +33 -37
  61. data/ext/libsass/src/extend.cpp +38 -36
  62. data/ext/libsass/src/extend.hpp +15 -15
  63. data/ext/libsass/src/file.cpp +34 -2
  64. data/ext/libsass/src/fn_colors.cpp +594 -0
  65. data/ext/libsass/src/fn_colors.hpp +85 -0
  66. data/ext/libsass/src/fn_lists.cpp +284 -0
  67. data/ext/libsass/src/fn_lists.hpp +34 -0
  68. data/ext/libsass/src/fn_maps.cpp +94 -0
  69. data/ext/libsass/src/fn_maps.hpp +30 -0
  70. data/ext/libsass/src/fn_miscs.cpp +256 -0
  71. data/ext/libsass/src/fn_miscs.hpp +40 -0
  72. data/ext/libsass/src/fn_numbers.cpp +220 -0
  73. data/ext/libsass/src/fn_numbers.hpp +45 -0
  74. data/ext/libsass/src/fn_selectors.cpp +235 -0
  75. data/ext/libsass/src/fn_selectors.hpp +35 -0
  76. data/ext/libsass/src/fn_strings.cpp +254 -0
  77. data/ext/libsass/src/fn_strings.hpp +34 -0
  78. data/ext/libsass/src/fn_utils.cpp +156 -0
  79. data/ext/libsass/src/fn_utils.hpp +56 -0
  80. data/ext/libsass/src/inspect.cpp +101 -152
  81. data/ext/libsass/src/inspect.hpp +69 -73
  82. data/ext/libsass/src/json.cpp +2 -2
  83. data/ext/libsass/src/lexer.cpp +6 -3
  84. data/ext/libsass/src/listize.cpp +9 -11
  85. data/ext/libsass/src/listize.hpp +11 -7
  86. data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
  87. data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
  88. data/ext/libsass/src/node.cpp +13 -10
  89. data/ext/libsass/src/node.hpp +3 -3
  90. data/ext/libsass/src/operation.hpp +184 -144
  91. data/ext/libsass/src/operators.cpp +43 -17
  92. data/ext/libsass/src/operators.hpp +5 -5
  93. data/ext/libsass/src/output.cpp +21 -18
  94. data/ext/libsass/src/output.hpp +14 -21
  95. data/ext/libsass/src/parser.cpp +215 -183
  96. data/ext/libsass/src/parser.hpp +28 -24
  97. data/ext/libsass/src/plugins.cpp +5 -1
  98. data/ext/libsass/src/position.cpp +3 -0
  99. data/ext/libsass/src/prelexer.cpp +9 -3
  100. data/ext/libsass/src/prelexer.hpp +9 -9
  101. data/ext/libsass/src/remove_placeholders.cpp +14 -11
  102. data/ext/libsass/src/remove_placeholders.hpp +8 -9
  103. data/ext/libsass/src/sass.cpp +9 -3
  104. data/ext/libsass/src/sass.hpp +12 -9
  105. data/ext/libsass/src/sass2scss.cpp +45 -14
  106. data/ext/libsass/src/sass_context.cpp +18 -15
  107. data/ext/libsass/src/sass_functions.cpp +6 -3
  108. data/ext/libsass/src/sass_functions.hpp +1 -1
  109. data/ext/libsass/src/sass_util.cpp +3 -0
  110. data/ext/libsass/src/sass_values.cpp +21 -13
  111. data/ext/libsass/src/source_map.cpp +5 -2
  112. data/ext/libsass/src/source_map.hpp +2 -2
  113. data/ext/libsass/src/subset_map.cpp +4 -1
  114. data/ext/libsass/src/to_value.cpp +23 -21
  115. data/ext/libsass/src/to_value.hpp +18 -22
  116. data/ext/libsass/src/units.cpp +4 -0
  117. data/ext/libsass/src/units.hpp +1 -0
  118. data/ext/libsass/src/utf8/checked.h +12 -10
  119. data/ext/libsass/src/utf8/core.h +3 -0
  120. data/ext/libsass/src/utf8_string.cpp +3 -0
  121. data/ext/libsass/src/util.cpp +67 -75
  122. data/ext/libsass/src/util.hpp +64 -19
  123. data/ext/libsass/src/util_string.cpp +75 -0
  124. data/ext/libsass/src/util_string.hpp +19 -0
  125. data/ext/libsass/src/values.cpp +22 -13
  126. data/ext/libsass/src/values.hpp +2 -2
  127. data/ext/libsass/win/libsass.targets +30 -4
  128. data/ext/libsass/win/libsass.vcxproj.filters +82 -4
  129. data/lib/sassc.rb +24 -0
  130. data/lib/sassc/engine.rb +2 -2
  131. data/lib/sassc/native.rb +8 -1
  132. data/lib/sassc/version.rb +1 -1
  133. data/sassc.gemspec +19 -11
  134. data/test/engine_test.rb +26 -1
  135. data/test/native_test.rb +1 -1
  136. metadata +66 -72
  137. data/ext/Rakefile +0 -3
  138. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  139. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  140. data/ext/libsass/.travis.yml +0 -64
  141. data/ext/libsass/Readme.md +0 -104
  142. data/ext/libsass/SECURITY.md +0 -10
  143. data/ext/libsass/appveyor.yml +0 -91
  144. data/ext/libsass/docs/README.md +0 -20
  145. data/ext/libsass/docs/api-context-example.md +0 -45
  146. data/ext/libsass/docs/api-context-internal.md +0 -163
  147. data/ext/libsass/docs/api-context.md +0 -295
  148. data/ext/libsass/docs/api-doc.md +0 -215
  149. data/ext/libsass/docs/api-function-example.md +0 -67
  150. data/ext/libsass/docs/api-function-internal.md +0 -8
  151. data/ext/libsass/docs/api-function.md +0 -74
  152. data/ext/libsass/docs/api-importer-example.md +0 -112
  153. data/ext/libsass/docs/api-importer-internal.md +0 -20
  154. data/ext/libsass/docs/api-importer.md +0 -86
  155. data/ext/libsass/docs/api-value-example.md +0 -55
  156. data/ext/libsass/docs/api-value-internal.md +0 -76
  157. data/ext/libsass/docs/api-value.md +0 -154
  158. data/ext/libsass/docs/build-on-darwin.md +0 -27
  159. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  160. data/ext/libsass/docs/build-on-windows.md +0 -139
  161. data/ext/libsass/docs/build-shared-library.md +0 -35
  162. data/ext/libsass/docs/build-with-autotools.md +0 -78
  163. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  164. data/ext/libsass/docs/build-with-mingw.md +0 -107
  165. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  166. data/ext/libsass/docs/build.md +0 -97
  167. data/ext/libsass/docs/compatibility-plan.md +0 -48
  168. data/ext/libsass/docs/contributing.md +0 -17
  169. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  170. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  171. data/ext/libsass/docs/implementations.md +0 -56
  172. data/ext/libsass/docs/plugins.md +0 -47
  173. data/ext/libsass/docs/setup-environment.md +0 -68
  174. data/ext/libsass/docs/source-map-internals.md +0 -51
  175. data/ext/libsass/docs/trace.md +0 -26
  176. data/ext/libsass/docs/triage.md +0 -17
  177. data/ext/libsass/docs/unicode.md +0 -39
  178. data/ext/libsass/extconf.rb +0 -6
  179. data/ext/libsass/script/bootstrap +0 -13
  180. data/ext/libsass/script/branding +0 -10
  181. data/ext/libsass/script/ci-build-libsass +0 -134
  182. data/ext/libsass/script/ci-build-plugin +0 -62
  183. data/ext/libsass/script/ci-install-compiler +0 -6
  184. data/ext/libsass/script/ci-install-deps +0 -20
  185. data/ext/libsass/script/ci-report-coverage +0 -42
  186. data/ext/libsass/script/spec +0 -5
  187. data/ext/libsass/script/tap-driver +0 -652
  188. data/ext/libsass/script/tap-runner +0 -1
  189. data/ext/libsass/script/test-leaks.pl +0 -103
  190. data/ext/libsass/src/functions.cpp +0 -2234
  191. data/ext/libsass/src/functions.hpp +0 -198
  192. data/ext/libsass/src/to_c.hpp +0 -39
  193. data/ext/libsass/test/test_node.cpp +0 -94
  194. data/ext/libsass/test/test_paths.cpp +0 -28
  195. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  196. data/ext/libsass/test/test_specificity.cpp +0 -25
  197. data/ext/libsass/test/test_subset_map.cpp +0 -472
  198. data/ext/libsass/test/test_superselector.cpp +0 -69
  199. data/ext/libsass/test/test_unification.cpp +0 -31
  200. data/lib/tasks/libsass.rb +0 -33
@@ -0,0 +1,45 @@
1
+ #ifndef SASS_FN_NUMBERS_H
2
+ #define SASS_FN_NUMBERS_H
3
+
4
+ #include "fn_utils.hpp"
5
+
6
+ namespace Sass {
7
+
8
+ namespace Functions {
9
+
10
+ // return a number object (copied since we want to have reduced units)
11
+ #define ARGN(argname) get_arg_n(argname, env, sig, pstate, traces) // Number copy
12
+
13
+ extern Signature percentage_sig;
14
+ extern Signature round_sig;
15
+ extern Signature ceil_sig;
16
+ extern Signature floor_sig;
17
+ extern Signature abs_sig;
18
+ extern Signature min_sig;
19
+ extern Signature max_sig;
20
+ extern Signature inspect_sig;
21
+ extern Signature random_sig;
22
+ extern Signature unique_id_sig;
23
+ extern Signature unit_sig;
24
+ extern Signature unitless_sig;
25
+ extern Signature comparable_sig;
26
+
27
+ BUILT_IN(percentage);
28
+ BUILT_IN(round);
29
+ BUILT_IN(ceil);
30
+ BUILT_IN(floor);
31
+ BUILT_IN(abs);
32
+ BUILT_IN(min);
33
+ BUILT_IN(max);
34
+ BUILT_IN(inspect);
35
+ BUILT_IN(random);
36
+ BUILT_IN(unique_id);
37
+ BUILT_IN(unit);
38
+ BUILT_IN(unitless);
39
+ BUILT_IN(comparable);
40
+
41
+ }
42
+
43
+ }
44
+
45
+ #endif
@@ -0,0 +1,235 @@
1
+ #include "parser.hpp"
2
+ #include "extend.hpp"
3
+ #include "fn_utils.hpp"
4
+ #include "fn_selectors.hpp"
5
+
6
+ namespace Sass {
7
+
8
+ namespace Functions {
9
+
10
+ Signature selector_nest_sig = "selector-nest($selectors...)";
11
+ BUILT_IN(selector_nest)
12
+ {
13
+ List* arglist = ARG("$selectors", List);
14
+
15
+ // Not enough parameters
16
+ if( arglist->length() == 0 )
17
+ error("$selectors: At least one selector must be passed for `selector-nest'", pstate, traces);
18
+
19
+ // Parse args into vector of selectors
20
+ SelectorStack parsedSelectors;
21
+ for (size_t i = 0, L = arglist->length(); i < L; ++i) {
22
+ Expression_Obj exp = Cast<Expression>(arglist->value_at_index(i));
23
+ if (exp->concrete_type() == Expression::NULL_VAL) {
24
+ std::stringstream msg;
25
+ msg << "$selectors: null is not a valid selector: it must be a string,\n";
26
+ msg << "a list of strings, or a list of lists of strings for 'selector-nest'";
27
+ error(msg.str(), pstate, traces);
28
+ }
29
+ if (String_Constant_Obj str = Cast<String_Constant>(exp)) {
30
+ str->quote_mark(0);
31
+ }
32
+ std::string exp_src = exp->to_string(ctx.c_options);
33
+ Selector_List_Obj sel = Parser::parse_selector(exp_src.c_str(), ctx, traces);
34
+ parsedSelectors.push_back(sel);
35
+ }
36
+
37
+ // Nothing to do
38
+ if( parsedSelectors.empty() ) {
39
+ return SASS_MEMORY_NEW(Null, pstate);
40
+ }
41
+
42
+ // Set the first element as the `result`, keep appending to as we go down the parsedSelector vector.
43
+ SelectorStack::iterator itr = parsedSelectors.begin();
44
+ Selector_List_Obj result = *itr;
45
+ ++itr;
46
+
47
+ for(;itr != parsedSelectors.end(); ++itr) {
48
+ Selector_List_Obj child = *itr;
49
+ std::vector<Complex_Selector_Obj> exploded;
50
+ selector_stack.push_back(result);
51
+ Selector_List_Obj rv = child->resolve_parent_refs(selector_stack, traces);
52
+ selector_stack.pop_back();
53
+ for (size_t m = 0, mLen = rv->length(); m < mLen; ++m) {
54
+ exploded.push_back((*rv)[m]);
55
+ }
56
+ result->elements(exploded);
57
+ }
58
+
59
+ Listize listize;
60
+ return Cast<Value>(result->perform(&listize));
61
+ }
62
+
63
+ Signature selector_append_sig = "selector-append($selectors...)";
64
+ BUILT_IN(selector_append)
65
+ {
66
+ List* arglist = ARG("$selectors", List);
67
+
68
+ // Not enough parameters
69
+ if( arglist->length() == 0 )
70
+ error("$selectors: At least one selector must be passed for `selector-append'", pstate, traces);
71
+
72
+ // Parse args into vector of selectors
73
+ SelectorStack parsedSelectors;
74
+ for (size_t i = 0, L = arglist->length(); i < L; ++i) {
75
+ Expression_Obj exp = Cast<Expression>(arglist->value_at_index(i));
76
+ if (exp->concrete_type() == Expression::NULL_VAL) {
77
+ std::stringstream msg;
78
+ msg << "$selectors: null is not a valid selector: it must be a string,\n";
79
+ msg << "a list of strings, or a list of lists of strings for 'selector-append'";
80
+ error(msg.str(), pstate, traces);
81
+ }
82
+ if (String_Constant* str = Cast<String_Constant>(exp)) {
83
+ str->quote_mark(0);
84
+ }
85
+ std::string exp_src = exp->to_string();
86
+ Selector_List_Obj sel = Parser::parse_selector(exp_src.c_str(), ctx, traces,
87
+ exp->pstate(), pstate.src,
88
+ /*allow_parent=*/false);
89
+
90
+ parsedSelectors.push_back(sel);
91
+ }
92
+
93
+ // Nothing to do
94
+ if( parsedSelectors.empty() ) {
95
+ return SASS_MEMORY_NEW(Null, pstate);
96
+ }
97
+
98
+ // Set the first element as the `result`, keep appending to as we go down the parsedSelector vector.
99
+ SelectorStack::iterator itr = parsedSelectors.begin();
100
+ Selector_List_Obj result = *itr;
101
+ ++itr;
102
+
103
+ for(;itr != parsedSelectors.end(); ++itr) {
104
+ Selector_List_Obj child = *itr;
105
+ std::vector<Complex_Selector_Obj> newElements;
106
+
107
+ // For every COMPLEX_SELECTOR in `result`
108
+ // For every COMPLEX_SELECTOR in `child`
109
+ // let parentSeqClone equal a copy of result->elements[i]
110
+ // let childSeq equal child->elements[j]
111
+ // Append all of childSeq head elements into parentSeqClone
112
+ // Set the innermost tail of parentSeqClone, to childSeq's tail
113
+ // Replace result->elements with newElements
114
+ for (size_t i = 0, resultLen = result->length(); i < resultLen; ++i) {
115
+ for (size_t j = 0, childLen = child->length(); j < childLen; ++j) {
116
+ Complex_Selector_Obj parentSeqClone = SASS_MEMORY_CLONE((*result)[i]);
117
+ Complex_Selector_Obj childSeq = (*child)[j];
118
+ Complex_Selector_Obj base = childSeq->tail();
119
+
120
+ // Must be a simple sequence
121
+ if( childSeq->combinator() != Complex_Selector::Combinator::ANCESTOR_OF ) {
122
+ error("Can't append \"" + childSeq->to_string() + "\" to \"" +
123
+ parentSeqClone->to_string() + "\" for `selector-append'", pstate, traces);
124
+ }
125
+
126
+ // Cannot be a Universal selector
127
+ Type_Selector_Obj pType = Cast<Type_Selector>(childSeq->head()->first());
128
+ if(pType && pType->name() == "*") {
129
+ error("Can't append \"" + childSeq->to_string() + "\" to \"" +
130
+ parentSeqClone->to_string() + "\" for `selector-append'", pstate, traces);
131
+ }
132
+
133
+ // TODO: Add check for namespace stuff
134
+
135
+ Complex_Selector* lastComponent = parentSeqClone->mutable_last();
136
+ if (lastComponent->head() == nullptr) {
137
+ std::string msg = "Parent \"" + parentSeqClone->to_string() + "\" is incompatible with \"" + base->to_string() + "\"";
138
+ error(msg, pstate, traces);
139
+ }
140
+ lastComponent->head()->concat(base->head());
141
+ lastComponent->tail(base->tail());
142
+
143
+ newElements.push_back(parentSeqClone);
144
+ }
145
+ }
146
+
147
+ result->elements(newElements);
148
+ }
149
+
150
+ Listize listize;
151
+ return Cast<Value>(result->perform(&listize));
152
+ }
153
+
154
+ Signature selector_unify_sig = "selector-unify($selector1, $selector2)";
155
+ BUILT_IN(selector_unify)
156
+ {
157
+ Selector_List_Obj selector1 = ARGSELS("$selector1");
158
+ Selector_List_Obj selector2 = ARGSELS("$selector2");
159
+
160
+ Selector_List_Obj result = selector1->unify_with(selector2);
161
+ Listize listize;
162
+ return Cast<Value>(result->perform(&listize));
163
+ }
164
+
165
+ Signature simple_selectors_sig = "simple-selectors($selector)";
166
+ BUILT_IN(simple_selectors)
167
+ {
168
+ Compound_Selector_Obj sel = ARGSEL("$selector");
169
+
170
+ List* l = SASS_MEMORY_NEW(List, sel->pstate(), sel->length(), SASS_COMMA);
171
+
172
+ for (size_t i = 0, L = sel->length(); i < L; ++i) {
173
+ Simple_Selector_Obj ss = (*sel)[i];
174
+ std::string ss_string = ss->to_string() ;
175
+
176
+ l->append(SASS_MEMORY_NEW(String_Quoted, ss->pstate(), ss_string));
177
+ }
178
+
179
+ return l;
180
+ }
181
+
182
+ Signature selector_extend_sig = "selector-extend($selector, $extendee, $extender)";
183
+ BUILT_IN(selector_extend)
184
+ {
185
+ Selector_List_Obj selector = ARGSELS("$selector");
186
+ Selector_List_Obj extendee = ARGSELS("$extendee");
187
+ Selector_List_Obj extender = ARGSELS("$extender");
188
+
189
+ Subset_Map subset_map;
190
+ extender->populate_extends(extendee, subset_map);
191
+ Extend extend(subset_map);
192
+
193
+ Selector_List_Obj result = extend.extendSelectorList(selector, false);
194
+
195
+ Listize listize;
196
+ return Cast<Value>(result->perform(&listize));
197
+ }
198
+
199
+ Signature selector_replace_sig = "selector-replace($selector, $original, $replacement)";
200
+ BUILT_IN(selector_replace)
201
+ {
202
+ Selector_List_Obj selector = ARGSELS("$selector");
203
+ Selector_List_Obj original = ARGSELS("$original");
204
+ Selector_List_Obj replacement = ARGSELS("$replacement");
205
+ Subset_Map subset_map;
206
+ replacement->populate_extends(original, subset_map);
207
+ Extend extend(subset_map);
208
+
209
+ Selector_List_Obj result = extend.extendSelectorList(selector, true);
210
+
211
+ Listize listize;
212
+ return Cast<Value>(result->perform(&listize));
213
+ }
214
+
215
+ Signature selector_parse_sig = "selector-parse($selector)";
216
+ BUILT_IN(selector_parse)
217
+ {
218
+ Selector_List_Obj sel = ARGSELS("$selector");
219
+
220
+ Listize listize;
221
+ return Cast<Value>(sel->perform(&listize));
222
+ }
223
+
224
+ Signature is_superselector_sig = "is-superselector($super, $sub)";
225
+ BUILT_IN(is_superselector)
226
+ {
227
+ Selector_List_Obj sel_sup = ARGSELS("$super");
228
+ Selector_List_Obj sel_sub = ARGSELS("$sub");
229
+ bool result = sel_sup->is_superselector_of(sel_sub);
230
+ return SASS_MEMORY_NEW(Boolean, pstate, result);
231
+ }
232
+
233
+ }
234
+
235
+ }
@@ -0,0 +1,35 @@
1
+ #ifndef SASS_FN_SELECTORS_H
2
+ #define SASS_FN_SELECTORS_H
3
+
4
+ #include "fn_utils.hpp"
5
+
6
+ namespace Sass {
7
+
8
+ namespace Functions {
9
+
10
+ #define ARGSEL(argname) get_arg_sel(argname, env, sig, pstate, traces, ctx)
11
+ #define ARGSELS(argname) get_arg_sels(argname, env, sig, pstate, traces, ctx)
12
+
13
+ BUILT_IN(selector_nest);
14
+ BUILT_IN(selector_append);
15
+ BUILT_IN(selector_extend);
16
+ BUILT_IN(selector_replace);
17
+ BUILT_IN(selector_unify);
18
+ BUILT_IN(is_superselector);
19
+ BUILT_IN(simple_selectors);
20
+ BUILT_IN(selector_parse);
21
+
22
+ extern Signature selector_nest_sig;
23
+ extern Signature selector_append_sig;
24
+ extern Signature selector_extend_sig;
25
+ extern Signature selector_replace_sig;
26
+ extern Signature selector_unify_sig;
27
+ extern Signature is_superselector_sig;
28
+ extern Signature simple_selectors_sig;
29
+ extern Signature selector_parse_sig;
30
+
31
+ }
32
+
33
+ }
34
+
35
+ #endif
@@ -0,0 +1,254 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
3
+ #include "sass.hpp"
4
+
5
+ #include <cctype>
6
+ #include "utf8.h"
7
+ #include "ast.hpp"
8
+ #include "fn_utils.hpp"
9
+ #include "fn_strings.hpp"
10
+
11
+ namespace Sass {
12
+
13
+ namespace Functions {
14
+
15
+ void handle_utf8_error (const ParserState& pstate, Backtraces traces)
16
+ {
17
+ try {
18
+ throw;
19
+ }
20
+ catch (utf8::invalid_code_point&) {
21
+ std::string msg("utf8::invalid_code_point");
22
+ error(msg, pstate, traces);
23
+ }
24
+ catch (utf8::not_enough_room&) {
25
+ std::string msg("utf8::not_enough_room");
26
+ error(msg, pstate, traces);
27
+ }
28
+ catch (utf8::invalid_utf8&) {
29
+ std::string msg("utf8::invalid_utf8");
30
+ error(msg, pstate, traces);
31
+ }
32
+ catch (...) { throw; }
33
+ }
34
+
35
+ ///////////////////
36
+ // STRING FUNCTIONS
37
+ ///////////////////
38
+
39
+ Signature unquote_sig = "unquote($string)";
40
+ BUILT_IN(sass_unquote)
41
+ {
42
+ AST_Node_Obj arg = env["$string"];
43
+ if (String_Quoted* string_quoted = Cast<String_Quoted>(arg)) {
44
+ String_Constant* result = SASS_MEMORY_NEW(String_Constant, pstate, string_quoted->value());
45
+ // remember if the string was quoted (color tokens)
46
+ result->is_delayed(true); // delay colors
47
+ return result;
48
+ }
49
+ else if (String_Constant* str = Cast<String_Constant>(arg)) {
50
+ return str;
51
+ }
52
+ else if (Value* ex = Cast<Value>(arg)) {
53
+ Sass_Output_Style oldstyle = ctx.c_options.output_style;
54
+ ctx.c_options.output_style = SASS_STYLE_NESTED;
55
+ std::string val(arg->to_string(ctx.c_options));
56
+ val = Cast<Null>(arg) ? "null" : val;
57
+ ctx.c_options.output_style = oldstyle;
58
+
59
+ deprecated_function("Passing " + val + ", a non-string value, to unquote()", pstate);
60
+ return ex;
61
+ }
62
+ throw std::runtime_error("Invalid Data Type for unquote");
63
+ }
64
+
65
+ Signature quote_sig = "quote($string)";
66
+ BUILT_IN(sass_quote)
67
+ {
68
+ const String_Constant* s = ARG("$string", String_Constant);
69
+ String_Quoted *result = SASS_MEMORY_NEW(
70
+ String_Quoted, pstate, s->value(),
71
+ /*q=*/'\0', /*keep_utf8_escapes=*/false, /*skip_unquoting=*/true);
72
+ result->quote_mark('*');
73
+ return result;
74
+ }
75
+
76
+ Signature str_length_sig = "str-length($string)";
77
+ BUILT_IN(str_length)
78
+ {
79
+ size_t len = std::string::npos;
80
+ try {
81
+ String_Constant* s = ARG("$string", String_Constant);
82
+ len = UTF_8::code_point_count(s->value(), 0, s->value().size());
83
+
84
+ }
85
+ // handle any invalid utf8 errors
86
+ // other errors will be re-thrown
87
+ catch (...) { handle_utf8_error(pstate, traces); }
88
+ // return something even if we had an error (-1)
89
+ return SASS_MEMORY_NEW(Number, pstate, (double)len);
90
+ }
91
+
92
+ Signature str_insert_sig = "str-insert($string, $insert, $index)";
93
+ BUILT_IN(str_insert)
94
+ {
95
+ std::string str;
96
+ try {
97
+ String_Constant* s = ARG("$string", String_Constant);
98
+ str = s->value();
99
+ String_Constant* i = ARG("$insert", String_Constant);
100
+ std::string ins = i->value();
101
+ double index = ARGVAL("$index");
102
+ size_t len = UTF_8::code_point_count(str, 0, str.size());
103
+
104
+ if (index > 0 && index <= len) {
105
+ // positive and within string length
106
+ str.insert(UTF_8::offset_at_position(str, static_cast<size_t>(index) - 1), ins);
107
+ }
108
+ else if (index > len) {
109
+ // positive and past string length
110
+ str += ins;
111
+ }
112
+ else if (index == 0) {
113
+ str = ins + str;
114
+ }
115
+ else if (std::abs(index) <= len) {
116
+ // negative and within string length
117
+ index += len + 1;
118
+ str.insert(UTF_8::offset_at_position(str, static_cast<size_t>(index)), ins);
119
+ }
120
+ else {
121
+ // negative and past string length
122
+ str = ins + str;
123
+ }
124
+
125
+ if (String_Quoted* ss = Cast<String_Quoted>(s)) {
126
+ if (ss->quote_mark()) str = quote(str);
127
+ }
128
+ }
129
+ // handle any invalid utf8 errors
130
+ // other errors will be re-thrown
131
+ catch (...) { handle_utf8_error(pstate, traces); }
132
+ return SASS_MEMORY_NEW(String_Quoted, pstate, str);
133
+ }
134
+
135
+ Signature str_index_sig = "str-index($string, $substring)";
136
+ BUILT_IN(str_index)
137
+ {
138
+ size_t index = std::string::npos;
139
+ try {
140
+ String_Constant* s = ARG("$string", String_Constant);
141
+ String_Constant* t = ARG("$substring", String_Constant);
142
+ std::string str = s->value();
143
+ std::string substr = t->value();
144
+
145
+ size_t c_index = str.find(substr);
146
+ if(c_index == std::string::npos) {
147
+ return SASS_MEMORY_NEW(Null, pstate);
148
+ }
149
+ index = UTF_8::code_point_count(str, 0, c_index) + 1;
150
+ }
151
+ // handle any invalid utf8 errors
152
+ // other errors will be re-thrown
153
+ catch (...) { handle_utf8_error(pstate, traces); }
154
+ // return something even if we had an error (-1)
155
+ return SASS_MEMORY_NEW(Number, pstate, (double)index);
156
+ }
157
+
158
+ Signature str_slice_sig = "str-slice($string, $start-at, $end-at:-1)";
159
+ BUILT_IN(str_slice)
160
+ {
161
+ std::string newstr;
162
+ try {
163
+ String_Constant* s = ARG("$string", String_Constant);
164
+ double start_at = ARGVAL("$start-at");
165
+ double end_at = ARGVAL("$end-at");
166
+ String_Quoted* ss = Cast<String_Quoted>(s);
167
+
168
+ std::string str(s->value());
169
+
170
+ size_t size = utf8::distance(str.begin(), str.end());
171
+
172
+ if (!Cast<Number>(env["$end-at"])) {
173
+ end_at = -1;
174
+ }
175
+
176
+ if (end_at == 0 || (end_at + size) < 0) {
177
+ if (ss && ss->quote_mark()) newstr = quote("");
178
+ return SASS_MEMORY_NEW(String_Quoted, pstate, newstr);
179
+ }
180
+
181
+ if (end_at < 0) {
182
+ end_at += size + 1;
183
+ if (end_at == 0) end_at = 1;
184
+ }
185
+ if (end_at > size) { end_at = (double)size; }
186
+ if (start_at < 0) {
187
+ start_at += size + 1;
188
+ if (start_at < 0) start_at = 0;
189
+ }
190
+ else if (start_at == 0) { ++ start_at; }
191
+
192
+ if (start_at <= end_at)
193
+ {
194
+ std::string::iterator start = str.begin();
195
+ utf8::advance(start, start_at - 1, str.end());
196
+ std::string::iterator end = start;
197
+ utf8::advance(end, end_at - start_at + 1, str.end());
198
+ newstr = std::string(start, end);
199
+ }
200
+ if (ss) {
201
+ if(ss->quote_mark()) newstr = quote(newstr);
202
+ }
203
+ }
204
+ // handle any invalid utf8 errors
205
+ // other errors will be re-thrown
206
+ catch (...) { handle_utf8_error(pstate, traces); }
207
+ return SASS_MEMORY_NEW(String_Quoted, pstate, newstr);
208
+ }
209
+
210
+ Signature to_upper_case_sig = "to-upper-case($string)";
211
+ BUILT_IN(to_upper_case)
212
+ {
213
+ String_Constant* s = ARG("$string", String_Constant);
214
+ std::string str = s->value();
215
+
216
+ for (size_t i = 0, L = str.length(); i < L; ++i) {
217
+ if (Sass::Util::isAscii(str[i])) {
218
+ str[i] = std::toupper(str[i]);
219
+ }
220
+ }
221
+
222
+ if (String_Quoted* ss = Cast<String_Quoted>(s)) {
223
+ String_Quoted* cpy = SASS_MEMORY_COPY(ss);
224
+ cpy->value(str);
225
+ return cpy;
226
+ } else {
227
+ return SASS_MEMORY_NEW(String_Quoted, pstate, str);
228
+ }
229
+ }
230
+
231
+ Signature to_lower_case_sig = "to-lower-case($string)";
232
+ BUILT_IN(to_lower_case)
233
+ {
234
+ String_Constant* s = ARG("$string", String_Constant);
235
+ std::string str = s->value();
236
+
237
+ for (size_t i = 0, L = str.length(); i < L; ++i) {
238
+ if (Sass::Util::isAscii(str[i])) {
239
+ str[i] = std::tolower(str[i]);
240
+ }
241
+ }
242
+
243
+ if (String_Quoted* ss = Cast<String_Quoted>(s)) {
244
+ String_Quoted* cpy = SASS_MEMORY_COPY(ss);
245
+ cpy->value(str);
246
+ return cpy;
247
+ } else {
248
+ return SASS_MEMORY_NEW(String_Quoted, pstate, str);
249
+ }
250
+ }
251
+
252
+ }
253
+
254
+ }