sassc 1.8.3 → 1.8.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -1
- data/ext/libsass/.editorconfig +1 -1
- data/ext/libsass/.gitignore +1 -0
- data/ext/libsass/LICENSE +1 -1
- data/ext/libsass/Makefile +20 -14
- data/ext/libsass/Makefile.conf +0 -1
- data/ext/libsass/Readme.md +3 -1
- data/ext/libsass/appveyor.yml +19 -11
- data/ext/libsass/docs/api-importer-example.md +2 -1235
- data/ext/libsass/docs/build-with-autotools.md +10 -0
- data/ext/libsass/docs/build-with-makefiles.md +18 -0
- data/ext/libsass/include/sass/base.h +4 -1
- data/ext/libsass/include/sass/values.h +2 -1
- data/ext/libsass/src/ast.cpp +279 -346
- data/ext/libsass/src/ast.hpp +234 -60
- data/ext/libsass/src/base64vlq.cpp +1 -0
- data/ext/libsass/src/bind.cpp +35 -45
- data/ext/libsass/src/bind.hpp +1 -0
- data/ext/libsass/src/color_maps.cpp +1 -0
- data/ext/libsass/src/constants.cpp +4 -1
- data/ext/libsass/src/constants.hpp +2 -1
- data/ext/libsass/src/context.cpp +41 -31
- data/ext/libsass/src/context.hpp +10 -10
- data/ext/libsass/src/cssize.cpp +7 -4
- data/ext/libsass/src/cssize.hpp +1 -3
- data/ext/libsass/src/debugger.hpp +73 -14
- data/ext/libsass/src/emitter.cpp +37 -25
- data/ext/libsass/src/emitter.hpp +10 -9
- data/ext/libsass/src/environment.cpp +16 -5
- data/ext/libsass/src/environment.hpp +5 -3
- data/ext/libsass/src/error_handling.cpp +91 -14
- data/ext/libsass/src/error_handling.hpp +105 -4
- data/ext/libsass/src/eval.cpp +519 -330
- data/ext/libsass/src/eval.hpp +12 -13
- data/ext/libsass/src/expand.cpp +92 -56
- data/ext/libsass/src/expand.hpp +5 -3
- data/ext/libsass/src/extend.cpp +60 -51
- data/ext/libsass/src/extend.hpp +1 -3
- data/ext/libsass/src/file.cpp +37 -27
- data/ext/libsass/src/functions.cpp +78 -62
- data/ext/libsass/src/functions.hpp +1 -0
- data/ext/libsass/src/inspect.cpp +293 -64
- data/ext/libsass/src/inspect.hpp +2 -0
- data/ext/libsass/src/lexer.cpp +1 -0
- data/ext/libsass/src/listize.cpp +14 -15
- data/ext/libsass/src/listize.hpp +3 -5
- data/ext/libsass/src/memory_manager.cpp +1 -0
- data/ext/libsass/src/node.cpp +2 -3
- data/ext/libsass/src/operation.hpp +70 -71
- data/ext/libsass/src/output.cpp +28 -32
- data/ext/libsass/src/output.hpp +1 -2
- data/ext/libsass/src/parser.cpp +402 -183
- data/ext/libsass/src/parser.hpp +19 -9
- data/ext/libsass/src/plugins.cpp +1 -0
- data/ext/libsass/src/position.cpp +1 -0
- data/ext/libsass/src/prelexer.cpp +134 -56
- data/ext/libsass/src/prelexer.hpp +51 -3
- data/ext/libsass/src/remove_placeholders.cpp +35 -9
- data/ext/libsass/src/remove_placeholders.hpp +4 -3
- data/ext/libsass/src/sass.cpp +1 -0
- data/ext/libsass/src/sass.hpp +129 -0
- data/ext/libsass/src/sass_context.cpp +31 -14
- data/ext/libsass/src/sass_context.hpp +2 -31
- data/ext/libsass/src/sass_functions.cpp +1 -0
- data/ext/libsass/src/sass_interface.cpp +5 -6
- data/ext/libsass/src/sass_util.cpp +1 -2
- data/ext/libsass/src/sass_util.hpp +5 -5
- data/ext/libsass/src/sass_values.cpp +13 -10
- data/ext/libsass/src/source_map.cpp +4 -3
- data/ext/libsass/src/source_map.hpp +2 -2
- data/ext/libsass/src/subset_map.hpp +0 -1
- data/ext/libsass/src/to_c.cpp +1 -0
- data/ext/libsass/src/to_c.hpp +1 -3
- data/ext/libsass/src/to_value.cpp +3 -5
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.cpp +96 -59
- data/ext/libsass/src/units.hpp +10 -8
- data/ext/libsass/src/utf8_string.cpp +5 -0
- data/ext/libsass/src/util.cpp +23 -156
- data/ext/libsass/src/util.hpp +10 -14
- data/ext/libsass/src/values.cpp +1 -0
- data/ext/libsass/test/test_node.cpp +2 -6
- data/ext/libsass/test/test_selector_difference.cpp +1 -3
- data/ext/libsass/test/test_specificity.cpp +0 -2
- data/ext/libsass/test/test_superselector.cpp +0 -2
- data/ext/libsass/test/test_unification.cpp +1 -3
- data/ext/libsass/win/libsass.targets +18 -5
- data/ext/libsass/win/libsass.vcxproj +9 -7
- data/ext/libsass/win/libsass.vcxproj.filters +148 -106
- data/lib/sassc/version.rb +1 -1
- data/test/engine_test.rb +12 -0
- data/test/native_test.rb +1 -1
- metadata +3 -4
- data/ext/libsass/src/to_string.cpp +0 -48
- data/ext/libsass/src/to_string.hpp +0 -38
data/ext/libsass/src/extend.hpp
CHANGED
@@ -25,9 +25,7 @@ namespace Sass {
|
|
25
25
|
static Node subweave(Node& one, Node& two, Context& ctx);
|
26
26
|
static Selector_List* extendSelectorList(Selector_List* pSelectorList, Context& ctx, ExtensionSubsetMap& subset_map, bool isReplace, bool& extendedSomething);
|
27
27
|
Extend(Context&, ExtensionSubsetMap&);
|
28
|
-
|
29
|
-
|
30
|
-
using Operation<void>::operator();
|
28
|
+
~Extend() { }
|
31
29
|
|
32
30
|
void operator()(Block*);
|
33
31
|
void operator()(Ruleset*);
|
data/ext/libsass/src/file.cpp
CHANGED
@@ -1,19 +1,15 @@
|
|
1
1
|
#ifdef _WIN32
|
2
|
-
#ifdef __MINGW32__
|
3
|
-
#ifndef off64_t
|
4
|
-
#define off64_t _off64_t /* Workaround for http://sourceforge.net/p/mingw/bugs/2024/ */
|
5
|
-
#endif
|
6
|
-
#endif
|
7
|
-
#include <direct.h>
|
8
|
-
#define
|
9
|
-
#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
|
2
|
+
# ifdef __MINGW32__
|
3
|
+
# ifndef off64_t
|
4
|
+
# define off64_t _off64_t /* Workaround for http://sourceforge.net/p/mingw/bugs/2024/ */
|
5
|
+
# endif
|
6
|
+
# endif
|
7
|
+
# include <direct.h>
|
8
|
+
# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
|
10
9
|
#else
|
11
|
-
#include <unistd.h>
|
10
|
+
# include <unistd.h>
|
12
11
|
#endif
|
13
|
-
#
|
14
|
-
#define NOMINMAX
|
15
|
-
#endif
|
16
|
-
|
12
|
+
#include "sass.hpp"
|
17
13
|
#include <iostream>
|
18
14
|
#include <fstream>
|
19
15
|
#include <cctype>
|
@@ -27,15 +23,24 @@
|
|
27
23
|
#include "sass2scss.h"
|
28
24
|
|
29
25
|
#ifdef _WIN32
|
30
|
-
#include <windows.h>
|
31
|
-
|
32
|
-
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
26
|
+
# include <windows.h>
|
27
|
+
|
28
|
+
# ifdef _MSC_VER
|
29
|
+
# include <codecvt>
|
30
|
+
inline static std::string wstring_to_string(const std::wstring& wstr)
|
31
|
+
{
|
32
|
+
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> wchar_converter;
|
33
|
+
return wchar_converter.to_bytes(wstr);
|
34
|
+
}
|
35
|
+
# else // mingw(/gcc) does not support C++11's codecvt yet.
|
36
|
+
inline static std::string wstring_to_string(const std::wstring &wstr)
|
37
|
+
{
|
38
|
+
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
|
39
|
+
std::string strTo(size_needed, 0);
|
40
|
+
WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
|
41
|
+
return strTo;
|
42
|
+
}
|
43
|
+
# endif
|
39
44
|
#endif
|
40
45
|
|
41
46
|
namespace Sass {
|
@@ -46,9 +51,12 @@ namespace Sass {
|
|
46
51
|
std::string get_cwd()
|
47
52
|
{
|
48
53
|
const size_t wd_len = 1024;
|
49
|
-
|
50
|
-
|
51
|
-
|
54
|
+
#ifndef _WIN32
|
55
|
+
char wd[wd_len];
|
56
|
+
std::string cwd = getcwd(wd, wd_len);
|
57
|
+
#else
|
58
|
+
wchar_t wd[wd_len];
|
59
|
+
std::string cwd = wstring_to_string(_wgetcwd(wd, wd_len));
|
52
60
|
//convert backslashes to forward slashes
|
53
61
|
replace(cwd.begin(), cwd.end(), '\\', '/');
|
54
62
|
#endif
|
@@ -184,8 +192,10 @@ namespace Sass {
|
|
184
192
|
if (l[l.length()-1] != '/') l += '/';
|
185
193
|
|
186
194
|
while ((r.length() > 3) && ((r.substr(0, 3) == "../") || (r.substr(0, 3)) == "..\\")) {
|
187
|
-
|
188
|
-
|
195
|
+
size_t L = l.length(), pos = find_last_folder_separator(l, L - 2);
|
196
|
+
bool is_slash = pos + 2 == L && (l[pos+1] == '/' || l[pos+1] == '\\');
|
197
|
+
bool is_self = pos + 3 == L && (l[pos+1] == '.');
|
198
|
+
if (!is_self && !is_slash) r = r.substr(3);
|
189
199
|
l = l.substr(0, pos == std::string::npos ? pos : pos + 1);
|
190
200
|
}
|
191
201
|
|
@@ -1,10 +1,10 @@
|
|
1
|
+
#include "sass.hpp"
|
1
2
|
#include "functions.hpp"
|
2
3
|
#include "ast.hpp"
|
3
4
|
#include "context.hpp"
|
4
5
|
#include "backtrace.hpp"
|
5
6
|
#include "parser.hpp"
|
6
7
|
#include "constants.hpp"
|
7
|
-
#include "to_string.hpp"
|
8
8
|
#include "inspect.hpp"
|
9
9
|
#include "extend.hpp"
|
10
10
|
#include "eval.hpp"
|
@@ -14,6 +14,7 @@
|
|
14
14
|
#include "sass/base.h"
|
15
15
|
#include "utf8.h"
|
16
16
|
|
17
|
+
#include <cstdint>
|
17
18
|
#include <cstdlib>
|
18
19
|
#include <cmath>
|
19
20
|
#include <cctype>
|
@@ -155,7 +156,6 @@ namespace Sass {
|
|
155
156
|
|
156
157
|
template <>
|
157
158
|
Selector_List* get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtrace* backtrace, Context& ctx) {
|
158
|
-
To_String to_string(&ctx, false);
|
159
159
|
Expression* exp = ARG(argname, Expression);
|
160
160
|
if (exp->concrete_type() == Expression::NULL_VAL) {
|
161
161
|
std::stringstream msg;
|
@@ -163,13 +163,15 @@ namespace Sass {
|
|
163
163
|
msg << "a list of strings, or a list of lists of strings for `" << function_name(sig) << "'";
|
164
164
|
error(msg.str(), pstate);
|
165
165
|
}
|
166
|
-
|
166
|
+
if (String_Constant* str =dynamic_cast<String_Constant*>(exp)) {
|
167
|
+
str->quote_mark(0);
|
168
|
+
}
|
169
|
+
std::string exp_src = exp->to_string(ctx.c_options) + "{";
|
167
170
|
return Parser::parse_selector(exp_src.c_str(), ctx);
|
168
171
|
}
|
169
172
|
|
170
173
|
template <>
|
171
174
|
Complex_Selector* get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtrace* backtrace, Context& ctx) {
|
172
|
-
To_String to_string(&ctx, false);
|
173
175
|
Expression* exp = ARG(argname, Expression);
|
174
176
|
if (exp->concrete_type() == Expression::NULL_VAL) {
|
175
177
|
std::stringstream msg;
|
@@ -177,21 +179,26 @@ namespace Sass {
|
|
177
179
|
msg << "a list of strings, or a list of lists of strings for `" << function_name(sig) << "'";
|
178
180
|
error(msg.str(), pstate);
|
179
181
|
}
|
180
|
-
|
182
|
+
if (String_Constant* str =dynamic_cast<String_Constant*>(exp)) {
|
183
|
+
str->quote_mark(0);
|
184
|
+
}
|
185
|
+
std::string exp_src = exp->to_string(ctx.c_options) + "{";
|
181
186
|
Selector_List* sel_list = Parser::parse_selector(exp_src.c_str(), ctx);
|
182
187
|
return (sel_list->length() > 0) ? sel_list->first() : 0;
|
183
188
|
}
|
184
189
|
|
185
190
|
template <>
|
186
191
|
Compound_Selector* get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtrace* backtrace, Context& ctx) {
|
187
|
-
To_String to_string(&ctx, false);
|
188
192
|
Expression* exp = ARG(argname, Expression);
|
189
193
|
if (exp->concrete_type() == Expression::NULL_VAL) {
|
190
194
|
std::stringstream msg;
|
191
195
|
msg << argname << ": null is not a string for `" << function_name(sig) << "'";
|
192
196
|
error(msg.str(), pstate);
|
193
197
|
}
|
194
|
-
|
198
|
+
if (String_Constant* str =dynamic_cast<String_Constant*>(exp)) {
|
199
|
+
str->quote_mark(0);
|
200
|
+
}
|
201
|
+
std::string exp_src = exp->to_string(ctx.c_options) + "{";
|
195
202
|
Selector_List* sel_list = Parser::parse_selector(exp_src.c_str(), ctx);
|
196
203
|
return (sel_list->length() > 0) ? sel_list->first()->tail()->head() : 0;
|
197
204
|
}
|
@@ -211,9 +218,9 @@ namespace Sass {
|
|
211
218
|
return seed;
|
212
219
|
}
|
213
220
|
#else
|
214
|
-
static std::random_device rd;
|
215
221
|
uint64_t GetSeed()
|
216
222
|
{
|
223
|
+
std::random_device rd;
|
217
224
|
return rd();
|
218
225
|
}
|
219
226
|
#endif
|
@@ -311,9 +318,9 @@ namespace Sass {
|
|
311
318
|
|
312
319
|
return SASS_MEMORY_NEW(ctx.mem, Color,
|
313
320
|
pstate,
|
314
|
-
Sass::round(w1*color1->r() + w2*color2->r()),
|
315
|
-
Sass::round(w1*color1->g() + w2*color2->g()),
|
316
|
-
Sass::round(w1*color1->b() + w2*color2->b()),
|
321
|
+
Sass::round(w1*color1->r() + w2*color2->r(), ctx.c_options.precision),
|
322
|
+
Sass::round(w1*color1->g() + w2*color2->g(), ctx.c_options.precision),
|
323
|
+
Sass::round(w1*color1->b() + w2*color2->b(), ctx.c_options.precision),
|
317
324
|
color1->a()*p + color2->a()*(1-p));
|
318
325
|
}
|
319
326
|
|
@@ -510,8 +517,7 @@ namespace Sass {
|
|
510
517
|
// CSS3 filter function overload: pass literal through directly
|
511
518
|
Number* amount = dynamic_cast<Number*>(env["$amount"]);
|
512
519
|
if (!amount) {
|
513
|
-
|
514
|
-
return SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, "saturate(" + env["$color"]->perform(&to_string) + ")");
|
520
|
+
return SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, "saturate(" + env["$color"]->to_string(ctx.c_options) + ")");
|
515
521
|
}
|
516
522
|
|
517
523
|
ARGR("$amount", Number, 0, 100);
|
@@ -571,8 +577,7 @@ namespace Sass {
|
|
571
577
|
// CSS3 filter function overload: pass literal through directly
|
572
578
|
Number* amount = dynamic_cast<Number*>(env["$color"]);
|
573
579
|
if (amount) {
|
574
|
-
|
575
|
-
return SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, "grayscale(" + amount->perform(&to_string) + ")");
|
580
|
+
return SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, "grayscale(" + amount->to_string(ctx.c_options) + ")");
|
576
581
|
}
|
577
582
|
|
578
583
|
Color* rgb_color = ARG("$color", Color);
|
@@ -608,8 +613,7 @@ namespace Sass {
|
|
608
613
|
// CSS3 filter function overload: pass literal through directly
|
609
614
|
Number* amount = dynamic_cast<Number*>(env["$color"]);
|
610
615
|
if (amount) {
|
611
|
-
|
612
|
-
return SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, "invert(" + amount->perform(&to_string) + ")");
|
616
|
+
return SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, "invert(" + amount->to_string(ctx.c_options) + ")");
|
613
617
|
}
|
614
618
|
|
615
619
|
Color* rgb_color = ARG("$color", Color);
|
@@ -636,8 +640,7 @@ namespace Sass {
|
|
636
640
|
// CSS3 filter function overload: pass literal through directly
|
637
641
|
Number* amount = dynamic_cast<Number*>(env["$color"]);
|
638
642
|
if (amount) {
|
639
|
-
|
640
|
-
return SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, "opacity(" + amount->perform(&to_string) + ")");
|
643
|
+
return SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, "opacity(" + amount->to_string(ctx.c_options) + ")");
|
641
644
|
}
|
642
645
|
|
643
646
|
return SASS_MEMORY_NEW(ctx.mem, Number, pstate, ARG("$color", Color)->a());
|
@@ -854,10 +857,10 @@ namespace Sass {
|
|
854
857
|
|
855
858
|
std::stringstream ss;
|
856
859
|
ss << '#' << std::setw(2) << std::setfill('0');
|
857
|
-
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(a));
|
858
|
-
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(r));
|
859
|
-
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(g));
|
860
|
-
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(b));
|
860
|
+
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(a, ctx.c_options.precision));
|
861
|
+
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(r, ctx.c_options.precision));
|
862
|
+
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(g, ctx.c_options.precision));
|
863
|
+
ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(b, ctx.c_options.precision));
|
861
864
|
|
862
865
|
std::string result(ss.str());
|
863
866
|
for (size_t i = 0, L = result.length(); i < L; ++i) {
|
@@ -884,9 +887,11 @@ namespace Sass {
|
|
884
887
|
return (Expression*) arg;
|
885
888
|
}
|
886
889
|
else {
|
887
|
-
|
888
|
-
|
890
|
+
Sass_Output_Style oldstyle = ctx.c_options.output_style;
|
891
|
+
ctx.c_options.output_style = SASS_STYLE_NESTED;
|
892
|
+
std::string val(arg->to_string(ctx.c_options));
|
889
893
|
val = dynamic_cast<Null*>(arg) ? "null" : val;
|
894
|
+
ctx.c_options.output_style = oldstyle;
|
890
895
|
|
891
896
|
deprecated_function("Passing " + val + ", a non-string value, to unquote()", pstate);
|
892
897
|
return (Expression*) arg;
|
@@ -896,9 +901,8 @@ namespace Sass {
|
|
896
901
|
Signature quote_sig = "quote($string)";
|
897
902
|
BUILT_IN(sass_quote)
|
898
903
|
{
|
899
|
-
To_String to_string(&ctx);
|
900
904
|
AST_Node* arg = env["$string"];
|
901
|
-
std::string str(quote(arg->
|
905
|
+
std::string str(quote(arg->to_string(ctx.c_options), String_Constant::double_quote()));
|
902
906
|
String_Quoted* result = SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, str);
|
903
907
|
result->is_delayed(true);
|
904
908
|
return result;
|
@@ -1088,7 +1092,7 @@ namespace Sass {
|
|
1088
1092
|
Number* n = ARG("$number", Number);
|
1089
1093
|
Number* r = SASS_MEMORY_NEW(ctx.mem, Number, *n);
|
1090
1094
|
r->pstate(pstate);
|
1091
|
-
r->value(Sass::round(r->value()));
|
1095
|
+
r->value(Sass::round(r->value(), ctx.c_options.precision));
|
1092
1096
|
return r;
|
1093
1097
|
}
|
1094
1098
|
|
@@ -1128,10 +1132,13 @@ namespace Sass {
|
|
1128
1132
|
List* arglist = ARG("$numbers", List);
|
1129
1133
|
Number* least = 0;
|
1130
1134
|
for (size_t i = 0, L = arglist->length(); i < L; ++i) {
|
1131
|
-
|
1132
|
-
|
1135
|
+
Expression* val = arglist->value_at_index(i);
|
1136
|
+
Number* xi = dynamic_cast<Number*>(val);
|
1137
|
+
if (!xi) {
|
1138
|
+
error("\"" + val->to_string(ctx.c_options) + "\" is not a number for `min'", pstate);
|
1139
|
+
}
|
1133
1140
|
if (least) {
|
1134
|
-
if (
|
1141
|
+
if (*xi < *least) least = xi;
|
1135
1142
|
} else least = xi;
|
1136
1143
|
}
|
1137
1144
|
return least;
|
@@ -1143,10 +1150,13 @@ namespace Sass {
|
|
1143
1150
|
List* arglist = ARG("$numbers", List);
|
1144
1151
|
Number* greatest = 0;
|
1145
1152
|
for (size_t i = 0, L = arglist->length(); i < L; ++i) {
|
1146
|
-
|
1147
|
-
|
1153
|
+
Expression* val = arglist->value_at_index(i);
|
1154
|
+
Number* xi = dynamic_cast<Number*>(val);
|
1155
|
+
if (!xi) {
|
1156
|
+
error("\"" + val->to_string(ctx.c_options) + "\" is not a number for `max'", pstate);
|
1157
|
+
}
|
1148
1158
|
if (greatest) {
|
1149
|
-
if (
|
1159
|
+
if (*greatest < *xi) greatest = xi;
|
1150
1160
|
} else greatest = xi;
|
1151
1161
|
}
|
1152
1162
|
return greatest;
|
@@ -1231,7 +1241,7 @@ namespace Sass {
|
|
1231
1241
|
double index = std::floor(n->value() < 0 ? len + n->value() : n->value() - 1);
|
1232
1242
|
if (index < 0 || index > len - 1) error("index out of bounds for `" + std::string(sig) + "`", pstate);
|
1233
1243
|
// return (*sl)[static_cast<int>(index)];
|
1234
|
-
Listize listize(ctx);
|
1244
|
+
Listize listize(ctx.mem);
|
1235
1245
|
return (*sl)[static_cast<int>(index)]->perform(&listize);
|
1236
1246
|
}
|
1237
1247
|
List* l = dynamic_cast<List*>(env["$list"]);
|
@@ -1326,7 +1336,7 @@ namespace Sass {
|
|
1326
1336
|
List* l = dynamic_cast<List*>(env["$list"]);
|
1327
1337
|
Expression* v = ARG("$val", Expression);
|
1328
1338
|
if (Selector_List* sl = dynamic_cast<Selector_List*>(env["$list"])) {
|
1329
|
-
Listize listize(ctx);
|
1339
|
+
Listize listize(ctx.mem);
|
1330
1340
|
l = dynamic_cast<List*>(sl->perform(&listize));
|
1331
1341
|
}
|
1332
1342
|
String_Constant* sep = ARG("$separator", String_Constant);
|
@@ -1662,6 +1672,9 @@ namespace Sass {
|
|
1662
1672
|
// MISCELLANEOUS FUNCTIONS
|
1663
1673
|
//////////////////////////
|
1664
1674
|
|
1675
|
+
// value.check_deprecated_interp if value.is_a?(Sass::Script::Value::String)
|
1676
|
+
// unquoted_string(value.to_sass)
|
1677
|
+
|
1665
1678
|
Signature inspect_sig = "inspect($value)";
|
1666
1679
|
BUILT_IN(inspect)
|
1667
1680
|
{
|
@@ -1673,23 +1686,23 @@ namespace Sass {
|
|
1673
1686
|
} else if (v->concrete_type() == Expression::STRING) {
|
1674
1687
|
return v;
|
1675
1688
|
} else {
|
1676
|
-
|
1677
|
-
v->concrete_type() == Expression::LIST;
|
1689
|
+
// ToDo: fix to_sass for nested parentheses
|
1678
1690
|
Sass_Output_Style old_style;
|
1679
|
-
old_style = ctx.c_options
|
1680
|
-
ctx.c_options
|
1681
|
-
|
1682
|
-
|
1683
|
-
|
1684
|
-
|
1685
|
-
|
1691
|
+
old_style = ctx.c_options.output_style;
|
1692
|
+
ctx.c_options.output_style = TO_SASS;
|
1693
|
+
Sass_Output_Options out(ctx.c_options);
|
1694
|
+
Emitter emitter(ctx.c_options);
|
1695
|
+
Inspect i(emitter);
|
1696
|
+
i.in_declaration = false;
|
1697
|
+
v->perform(&i);
|
1698
|
+
ctx.c_options.output_style = old_style;
|
1699
|
+
return SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, i.get_buffer());
|
1686
1700
|
}
|
1687
1701
|
// return v;
|
1688
1702
|
}
|
1689
1703
|
Signature selector_nest_sig = "selector-nest($selectors...)";
|
1690
1704
|
BUILT_IN(selector_nest)
|
1691
1705
|
{
|
1692
|
-
To_String to_string(&ctx, false);
|
1693
1706
|
List* arglist = ARG("$selectors", List);
|
1694
1707
|
|
1695
1708
|
// Not enough parameters
|
@@ -1706,7 +1719,10 @@ namespace Sass {
|
|
1706
1719
|
msg << "a list of strings, or a list of lists of strings for 'selector-nest'";
|
1707
1720
|
error(msg.str(), pstate);
|
1708
1721
|
}
|
1709
|
-
|
1722
|
+
if (String_Constant* str =dynamic_cast<String_Constant*>(exp)) {
|
1723
|
+
str->quote_mark(0);
|
1724
|
+
}
|
1725
|
+
std::string exp_src = exp->to_string(ctx.c_options) + "{";
|
1710
1726
|
Selector_List* sel = Parser::parse_selector(exp_src.c_str(), ctx);
|
1711
1727
|
parsedSelectors.push_back(sel);
|
1712
1728
|
}
|
@@ -1731,14 +1747,13 @@ namespace Sass {
|
|
1731
1747
|
result->elements(exploded);
|
1732
1748
|
}
|
1733
1749
|
|
1734
|
-
Listize listize(ctx);
|
1750
|
+
Listize listize(ctx.mem);
|
1735
1751
|
return result->perform(&listize);
|
1736
1752
|
}
|
1737
1753
|
|
1738
1754
|
Signature selector_append_sig = "selector-append($selectors...)";
|
1739
1755
|
BUILT_IN(selector_append)
|
1740
1756
|
{
|
1741
|
-
To_String to_string;
|
1742
1757
|
List* arglist = ARG("$selectors", List);
|
1743
1758
|
|
1744
1759
|
// Not enough parameters
|
@@ -1755,7 +1770,10 @@ namespace Sass {
|
|
1755
1770
|
msg << "a list of strings, or a list of lists of strings for 'selector-append'";
|
1756
1771
|
error(msg.str(), pstate);
|
1757
1772
|
}
|
1758
|
-
|
1773
|
+
if (String_Constant* str =dynamic_cast<String_Constant*>(exp)) {
|
1774
|
+
str->quote_mark(0);
|
1775
|
+
}
|
1776
|
+
std::string exp_src = exp->to_string() + "{";
|
1759
1777
|
Selector_List* sel = Parser::parse_selector(exp_src.c_str(), ctx);
|
1760
1778
|
parsedSelectors.push_back(sel);
|
1761
1779
|
}
|
@@ -1790,9 +1808,9 @@ namespace Sass {
|
|
1790
1808
|
// Must be a simple sequence
|
1791
1809
|
if( childSeq->combinator() != Complex_Selector::Combinator::ANCESTOR_OF ) {
|
1792
1810
|
std::string msg("Can't append `");
|
1793
|
-
msg += childSeq->
|
1811
|
+
msg += childSeq->to_string();
|
1794
1812
|
msg += "` to `";
|
1795
|
-
msg += parentSeqClone->
|
1813
|
+
msg += parentSeqClone->to_string();
|
1796
1814
|
msg += "`";
|
1797
1815
|
error(msg, pstate, backtrace);
|
1798
1816
|
}
|
@@ -1801,9 +1819,9 @@ namespace Sass {
|
|
1801
1819
|
Type_Selector* pType = dynamic_cast<Type_Selector*>(base->head()->first());
|
1802
1820
|
if(pType && pType->name() == "*") {
|
1803
1821
|
std::string msg("Can't append `");
|
1804
|
-
msg += childSeq->
|
1822
|
+
msg += childSeq->to_string();
|
1805
1823
|
msg += "` to `";
|
1806
|
-
msg += parentSeqClone->
|
1824
|
+
msg += parentSeqClone->to_string();
|
1807
1825
|
msg += "`";
|
1808
1826
|
error(msg, pstate, backtrace);
|
1809
1827
|
}
|
@@ -1823,7 +1841,7 @@ namespace Sass {
|
|
1823
1841
|
result->elements(newElements);
|
1824
1842
|
}
|
1825
1843
|
|
1826
|
-
Listize listize(ctx);
|
1844
|
+
Listize listize(ctx.mem);
|
1827
1845
|
return result->perform(&listize);
|
1828
1846
|
}
|
1829
1847
|
|
@@ -1834,7 +1852,7 @@ namespace Sass {
|
|
1834
1852
|
Selector_List* selector2 = ARGSEL("$selector2", Selector_List, p_contextualize);
|
1835
1853
|
|
1836
1854
|
Selector_List* result = selector1->unify_with(selector2, ctx);
|
1837
|
-
Listize listize(ctx);
|
1855
|
+
Listize listize(ctx.mem);
|
1838
1856
|
return result->perform(&listize);
|
1839
1857
|
}
|
1840
1858
|
|
@@ -1843,12 +1861,11 @@ namespace Sass {
|
|
1843
1861
|
{
|
1844
1862
|
Compound_Selector* sel = ARGSEL("$selector", Compound_Selector, p_contextualize);
|
1845
1863
|
|
1846
|
-
To_String to_string;
|
1847
1864
|
List* l = SASS_MEMORY_NEW(ctx.mem, List, sel->pstate(), sel->length(), SASS_COMMA);
|
1848
1865
|
|
1849
1866
|
for (size_t i = 0, L = sel->length(); i < L; ++i) {
|
1850
1867
|
Simple_Selector* ss = (*sel)[i];
|
1851
|
-
std::string ss_string = ss->
|
1868
|
+
std::string ss_string = ss->to_string() ;
|
1852
1869
|
|
1853
1870
|
*l << SASS_MEMORY_NEW(ctx.mem, String_Quoted, ss->pstate(), ss_string);
|
1854
1871
|
}
|
@@ -1869,7 +1886,7 @@ namespace Sass {
|
|
1869
1886
|
bool extendedSomething;
|
1870
1887
|
Selector_List* result = Extend::extendSelectorList(selector, ctx, subset_map, false, extendedSomething);
|
1871
1888
|
|
1872
|
-
Listize listize(ctx);
|
1889
|
+
Listize listize(ctx.mem);
|
1873
1890
|
return result->perform(&listize);
|
1874
1891
|
}
|
1875
1892
|
|
@@ -1886,7 +1903,7 @@ namespace Sass {
|
|
1886
1903
|
bool extendedSomething;
|
1887
1904
|
Selector_List* result = Extend::extendSelectorList(selector, ctx, subset_map, true, extendedSomething);
|
1888
1905
|
|
1889
|
-
Listize listize(ctx);
|
1906
|
+
Listize listize(ctx.mem);
|
1890
1907
|
return result->perform(&listize);
|
1891
1908
|
}
|
1892
1909
|
|
@@ -1895,14 +1912,13 @@ namespace Sass {
|
|
1895
1912
|
{
|
1896
1913
|
Selector_List* sel = ARGSEL("$selector", Selector_List, p_contextualize);
|
1897
1914
|
|
1898
|
-
Listize listize(ctx);
|
1915
|
+
Listize listize(ctx.mem);
|
1899
1916
|
return sel->perform(&listize);
|
1900
1917
|
}
|
1901
1918
|
|
1902
1919
|
Signature is_superselector_sig = "is-superselector($super, $sub)";
|
1903
1920
|
BUILT_IN(is_superselector)
|
1904
1921
|
{
|
1905
|
-
To_String to_string(&ctx, false);
|
1906
1922
|
Selector_List* sel_sup = ARGSEL("$super", Selector_List, p_contextualize);
|
1907
1923
|
Selector_List* sel_sub = ARGSEL("$sub", Selector_List, p_contextualize);
|
1908
1924
|
bool result = sel_sup->is_superselector_of(sel_sub);
|