Skip to content

Commit 4d88d5f

Browse files
committed
Handle quoted strings in apostrophes correctly (Fixes #9)
Will also leave URLs schemes in unquoted string alone!
1 parent cf43905 commit 4d88d5f

File tree

1 file changed

+30
-15
lines changed

1 file changed

+30
-15
lines changed

sass2scss.cpp

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,15 @@ namespace Sass
185185
{
186186

187187
size_t col_pos = 0;
188+
bool apoed = false;
188189
bool quoted = false;
189190
bool comment = false;
190191

191192
while (col_pos != string::npos)
192193
{
193194

194195
// process all interesting chars
195-
col_pos = sass.find_first_of("\"/\\*", col_pos);
196+
col_pos = sass.find_first_of("\"\'/\\*", col_pos);
196197

197198
// assertion for valid result
198199
if (col_pos != string::npos)
@@ -201,34 +202,43 @@ namespace Sass
201202
if (sass.at(col_pos) == '\"')
202203
{
203204
// invert quote bool
204-
quoted = !quoted;
205+
if (!apoed && !comment) quoted = !quoted;
205206
}
206-
else if (sass.at(col_pos) == '/')
207+
else if (sass.at(col_pos) == '\'')
207208
{
208-
if (col_pos > 0 && sass.at(col_pos - 1) == '*')
209+
// invert quote bool
210+
if (!quoted && !comment) apoed = !apoed;
211+
}
212+
else if (col_pos > 0 && sass.at(col_pos) == '/')
213+
{
214+
if (sass.at(col_pos - 1) == '*')
209215
{
210216
comment = false;
211217
}
212218
// next needs to be a slash too
213-
else if (col_pos > 0 && sass.at(col_pos - 1) == '/')
219+
else if (sass.at(col_pos - 1) == '/')
214220
{
215-
// only found if not in quote or comment
216-
if (!quoted && !comment) return col_pos - 1;
221+
// maybe it looks like a url scheme?
222+
if (col_pos < 2 || sass.at(col_pos - 2) != ':')
223+
{
224+
// only found if not in quote or comment
225+
if (!quoted && !apoed && !comment) return col_pos - 1;
226+
}
217227
}
218228
}
219229
else if (sass.at(col_pos) == '\\')
220230
{
221231
// skip next char if in quote
222-
if (quoted) col_pos ++;
232+
if (quoted || apoed) col_pos ++;
223233
}
224234
// this might be a comment opener
225-
else if (sass.at(col_pos) == '*')
235+
else if (col_pos > 0 && sass.at(col_pos) == '*')
226236
{
227237
// opening a multiline comment
228-
if (col_pos > 0 && sass.at(col_pos - 1) == '/')
238+
if (sass.at(col_pos - 1) == '/')
229239
{
230240
// we are now in a comment
231-
if (!quoted) comment = true;
241+
if (!quoted && !apoed) comment = true;
232242
}
233243
}
234244

@@ -254,6 +264,7 @@ namespace Sass
254264
size_t col_pos = 0;
255265
size_t open_pos = 0;
256266
size_t close_pos = 0;
267+
bool apoed = false;
257268
bool quoted = false;
258269
bool comment = false;
259270

@@ -262,7 +273,7 @@ namespace Sass
262273
{
263274

264275
// process all interesting chars
265-
col_pos = sass.find_first_of("\"/\\*", col_pos);
276+
col_pos = sass.find_first_of("\"\'/\\*", col_pos);
266277

267278
// assertion for valid result
268279
if (col_pos != string::npos)
@@ -271,7 +282,11 @@ namespace Sass
271282
// found quoted string delimiter
272283
if (sass.at(col_pos) == '\"')
273284
{
274-
if (!comment) quoted = !quoted;
285+
if (!apoed && !comment) quoted = !quoted;
286+
}
287+
else if (sass.at(col_pos) == '\'')
288+
{
289+
if (!quoted && !comment) apoed = !apoed;
275290
}
276291
// found possible comment closer
277292
else if (sass.at(col_pos) == '/')
@@ -285,13 +300,13 @@ namespace Sass
285300
else if (sass.at(col_pos) == '\\')
286301
{
287302
// skip escaped char
288-
if (quoted) col_pos ++;
303+
if (quoted || apoed) col_pos ++;
289304
}
290305
// this might be a comment opener
291306
else if (sass.at(col_pos) == '*')
292307
{
293308
// look back to see if it is actually an opener
294-
if (!quoted && col_pos > 0 && sass.at(col_pos - 1) == '/')
309+
if (!quoted && !apoed && col_pos > 0 && sass.at(col_pos - 1) == '/')
295310
{
296311
comment = true; open_pos = col_pos - 1;
297312
clean += sass.substr(close_pos, open_pos - close_pos);

0 commit comments

Comments
 (0)