Skip to content

Commit 2fbfb35

Browse files
committed
Merge pull request #17 from TrySound/source-index
Added sourceIndex props
2 parents 9db4123 + 68bf8df commit 2fbfb35

File tree

3 files changed

+170
-167
lines changed

3 files changed

+170
-167
lines changed

lib/parse.js

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ module.exports = function (input) {
3232
code = value.charCodeAt(next);
3333
} while (code <= 32);
3434
token = value.slice(pos, next);
35-
pos = next;
3635

3736
prev = tokens[tokens.length - 1];
3837
if (code === closeParentheses && balanced) {
@@ -42,14 +41,16 @@ module.exports = function (input) {
4241
} else if (code === slash || code === comma || code === colon) {
4342
before = token;
4443
} else {
45-
tokens.push({ type: 'space', value: token });
44+
tokens.push({ type: 'space', sourceIndex: pos, value: token });
4645
}
4746

47+
pos = next;
48+
4849
// Quotes
4950
} else if (code === singleQuote || code === doubleQuote) {
5051
next = pos;
5152
quote = code === singleQuote ? '\'' : '"';
52-
token = { type: 'string', quote: quote };
53+
token = { type: 'string', sourceIndex: pos, quote: quote };
5354
do {
5455
escape = false;
5556
next = value.indexOf(quote, next + 1);
@@ -74,12 +75,13 @@ module.exports = function (input) {
7475
// Dividers
7576
} else if (code === slash || code === comma || code === colon) {
7677
token = value[pos];
77-
pos += 1;
78-
code = value.charCodeAt(pos);
7978

80-
tokens.push({ type: 'div', value: token, before: before, after: '' });
79+
tokens.push({ type: 'div', sourceIndex: pos - before.length, value: token, before: before, after: '' });
8180
before = '';
8281

82+
pos += 1;
83+
code = value.charCodeAt(pos);
84+
8385
// Open parentheses
8486
} else if (openParentheses === code) {
8587
// Whitespaces after open parentheses
@@ -88,7 +90,7 @@ module.exports = function (input) {
8890
next += 1;
8991
code = value.charCodeAt(next);
9092
} while (code <= 32);
91-
token = { type: 'function', value: name, before: value.slice(pos + 1, next) };
93+
token = { type: 'function', sourceIndex: pos - name.length, value: name, before: value.slice(pos + 1, next) };
9294
pos = next;
9395

9496
if (name === 'url' && code !== singleQuote && code !== doubleQuote) {
@@ -113,10 +115,10 @@ module.exports = function (input) {
113115
whitespacePos -= 1;
114116
code = value.charCodeAt(whitespacePos);
115117
} while (code <= 32);
116-
token.nodes = [{ type: 'word', value: value.slice(pos, whitespacePos + 1) }];
118+
token.nodes = [{ type: 'word', sourceIndex: pos, value: value.slice(pos, whitespacePos + 1) }];
117119
if (token.unclosed && whitespacePos + 1 !== next) {
118120
token.after = '';
119-
token.nodes.push({ type: 'space', value: value.slice(whitespacePos + 1, next) });
121+
token.nodes.push({ type: 'space', sourceIndex: whitespacePos + 1, value: value.slice(whitespacePos + 1, next) });
120122
} else {
121123
token.after = value.slice(whitespacePos + 1, next);
122124
}
@@ -161,13 +163,14 @@ module.exports = function (input) {
161163
code === openParentheses || code === closeParentheses && balanced
162164
));
163165
token = value.slice(pos, next);
164-
pos = next;
165166

166167
if (openParentheses === code) {
167168
name = token;
168169
} else {
169-
tokens.push({ type: 'word', value: token });
170+
tokens.push({ type: 'word', sourceIndex: pos, value: token });
170171
}
172+
173+
pos = next;
171174
}
172175
}
173176

test/index.js

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ test('ValueParser', function (t) {
2828
});
2929

3030
t.deepEqual(result, [
31-
{ type: 'function', value: 'fn', before: ' ', after: '', nodes: [] },
32-
{ type: 'function', value: 'fn2', before: ' ', after: '', nodes: [
33-
{ type: 'function', value: 'fn3', before: '', after: '', nodes: [] }
31+
{ type: 'function', sourceIndex: 0, value: 'fn', before: ' ', after: '', nodes: [] },
32+
{ type: 'function', sourceIndex: 6, value: 'fn2', before: ' ', after: '', nodes: [
33+
{ type: 'function', sourceIndex: 11, value: 'fn3', before: '', after: '', nodes: [] }
3434
] },
35-
{ type: 'function', value: 'fn3', before: '', after: '', nodes: [] },
35+
{ type: 'function', sourceIndex: 11, value: 'fn3', before: '', after: '', nodes: [] },
3636
], 'should process all functions');
3737

3838

@@ -48,9 +48,9 @@ test('ValueParser', function (t) {
4848
});
4949

5050
t.deepEqual(result, [
51-
{ type: 'function', value: 'fn', before: ' ', after: '', nodes: [] },
52-
{ type: 'function', value: 'fn2', before: ' ', after: '', nodes: [
53-
{ type: 'function', value: 'fn3', before: '', after: '', nodes: [] }
51+
{ type: 'function', sourceIndex: 0, value: 'fn', before: ' ', after: '', nodes: [] },
52+
{ type: 'function', sourceIndex: 6, value: 'fn2', before: ' ', after: '', nodes: [
53+
{ type: 'function', sourceIndex: 11, value: 'fn3', before: '', after: '', nodes: [] }
5454
] },
5555
], 'shouldn\'t process functions after falsy callback');
5656

@@ -65,10 +65,10 @@ test('ValueParser', function (t) {
6565
});
6666

6767
t.deepEqual(result, [
68-
{ type: 'function', value: 'fn', before: ' ', after: '', nodes: [] },
69-
{ type: 'space', value: ' '},
70-
{ type: 'word', value: 'fn2', before: ' ', after: '', nodes: [
71-
{ type: 'function', value: 'fn3', before: '', after: '', nodes: [] }
68+
{ type: 'function', sourceIndex: 0, value: 'fn', before: ' ', after: '', nodes: [] },
69+
{ type: 'space', sourceIndex: 5, value: ' '},
70+
{ type: 'word', sourceIndex: 6, value: 'fn2', before: ' ', after: '', nodes: [
71+
{ type: 'function', sourceIndex: 11, value: 'fn3', before: '', after: '', nodes: [] }
7272
] },
7373
], 'shouldn\'t process nodes with defined non-function type');
7474

@@ -82,9 +82,9 @@ test('ValueParser', function (t) {
8282
}, true);
8383

8484
t.deepEqual(result, [
85-
{ type: 'function', value: 'fn3', before: '', after: '', nodes: [] },
86-
{ type: 'function', value: 'fn2', before: ' ', after: '', nodes: [
87-
{ type: 'function', value: 'fn3', before: '', after: '', nodes: [] }
85+
{ type: 'function', sourceIndex: 5, value: 'fn3', before: '', after: '', nodes: [] },
86+
{ type: 'function', sourceIndex: 0, value: 'fn2', before: ' ', after: '', nodes: [
87+
{ type: 'function', sourceIndex: 5, value: 'fn3', before: '', after: '', nodes: [] }
8888
] },
8989
], 'should process all functions with reverse mode');
9090
});

0 commit comments

Comments
 (0)