sassc 2.0.1 → 2.1.0.pre1

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