Skip to content

Commit 0dee7ad

Browse files
committed
Upgrade sass2scss to version 1.1.2
- Support @value statements - Support comma separated imports
1 parent 569d43c commit 0dee7ad

File tree

1 file changed

+45
-14
lines changed

1 file changed

+45
-14
lines changed

src/sass2scss.cpp

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,21 @@ namespace Sass
154154

155155
}
156156

157+
static size_t findFirstCharacter (std::string& sass, size_t pos)
158+
{
159+
return sass.find_first_not_of(SASS2SCSS_FIND_WHITESPACE, pos);
160+
}
161+
162+
static size_t findLastCharacter (std::string& sass, size_t pos)
163+
{
164+
return sass.find_last_not_of(SASS2SCSS_FIND_WHITESPACE, pos);
165+
}
166+
167+
static bool isUrl (std::string& sass, size_t pos)
168+
{
169+
return sass[pos] == 'u' && sass[pos+1] == 'r' && sass[pos+2] == 'l' && sass[pos+3] == '(';
170+
}
171+
157172
// check if there is some char data
158173
// will ignore everything in comments
159174
static bool hasCharData (std::string& sass)
@@ -587,6 +602,7 @@ namespace Sass
587602
sass.substr(pos_left, 5) == "@warn" ||
588603
sass.substr(pos_left, 6) == "@debug" ||
589604
sass.substr(pos_left, 6) == "@error" ||
605+
sass.substr(pos_left, 6) == "@value" ||
590606
sass.substr(pos_left, 8) == "@charset" ||
591607
sass.substr(pos_left, 10) == "@namespace"
592608
) { sass = indent + sass.substr(pos_left); }
@@ -606,23 +622,38 @@ namespace Sass
606622
{
607623
// get positions for the actual import url
608624
size_t pos_import = sass.find_first_of(SASS2SCSS_FIND_WHITESPACE, pos_left + 7);
609-
size_t pos_quote = sass.find_first_not_of(SASS2SCSS_FIND_WHITESPACE, pos_import);
610-
// leave proper urls untouched
611-
if (sass.substr(pos_quote, 4) != "url(")
612-
{
613-
// check if the url appears to be already quoted
614-
if (sass.substr(pos_quote, 1) != "\"" && sass.substr(pos_quote, 1) != "\'")
615-
{
616-
// get position of the last char on the line
617-
size_t pos_end = sass.find_last_not_of(SASS2SCSS_FIND_WHITESPACE);
618-
// assertion check for valid result
619-
if (pos_end != std::string::npos)
620-
{
621-
// add quotes around the full line after the import statement
622-
sass = sass.substr(0, pos_quote) + "\"" + sass.substr(pos_quote, pos_end - pos_quote + 1) + "\"";
625+
size_t pos = sass.find_first_not_of(SASS2SCSS_FIND_WHITESPACE, pos_import);
626+
size_t start = pos;
627+
bool in_dqstr = false;
628+
bool in_sqstr = false;
629+
bool is_escaped = false;
630+
do {
631+
if (is_escaped) {
632+
is_escaped = false;
633+
}
634+
else if (sass[pos] == '\\') {
635+
is_escaped = true;
636+
}
637+
else if (sass[pos] == '"') {
638+
if (!in_sqstr) in_dqstr = ! in_dqstr;
639+
}
640+
else if (sass[pos] == '\'') {
641+
if (!in_dqstr) in_sqstr = ! in_sqstr;
642+
}
643+
else if (in_dqstr || in_sqstr) {
644+
// skip over quoted stuff
645+
}
646+
else if (sass[pos] == ',' || sass[pos] == 0) {
647+
if (sass[start] != '"' && sass[start] != '\'' && !isUrl(sass, start)) {
648+
size_t end = findLastCharacter(sass, pos - 1) + 1;
649+
sass = sass.replace(end, 0, "\"");
650+
sass = sass.replace(start, 0, "\"");
651+
pos += 2;
623652
}
653+
start = findFirstCharacter(sass, pos + 1);
624654
}
625655
}
656+
while (sass[pos++] != 0);
626657

627658
}
628659
else if (

0 commit comments

Comments
 (0)