Skip to content

Commit e8a4aa0

Browse files
committed
Added sourceIndex to function node
1 parent 238c435 commit e8a4aa0

File tree

3 files changed

+46
-46
lines changed

3 files changed

+46
-46
lines changed

lib/parse.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ module.exports = function (input) {
8989
next += 1;
9090
code = value.charCodeAt(next);
9191
} while (code <= 32);
92-
token = { type: 'function', value: name, before: value.slice(pos + 1, next) };
92+
token = { type: 'function', sourceIndex: pos - name.length, value: name, before: value.slice(pos + 1, next) };
9393
pos = next;
9494

9595
if (name === 'url' && code !== singleQuote && code !== doubleQuote) {

test/index.js

+13-13
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: [] },
68+
{ type: 'function', sourceIndex: 0, value: 'fn', before: ' ', after: '', nodes: [] },
6969
{ type: 'space', sourceIndex: 5, value: ' '},
70-
{ type: 'word', value: 'fn2', before: ' ', after: '', nodes: [
71-
{ type: 'function', value: 'fn3', before: '', after: '', nodes: [] }
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
});

test/parse.js

+32-32
Original file line numberDiff line numberDiff line change
@@ -35,47 +35,47 @@ var tests = [{
3535
message: 'should process unopened parentheses as word',
3636
fixture: '() )wo)rd)',
3737
expected: [
38-
{ type: 'function', value: '', before: '', after: '', nodes: [] },
38+
{ type: 'function', sourceIndex: 0, value: '', before: '', after: '', nodes: [] },
3939
{ type: 'space', sourceIndex: 2, value: ' ' },
4040
{ type: 'word', sourceIndex: 3, value: ')wo)rd)' }
4141
]
4242
}, {
4343
message: 'should add before prop',
4444
fixture: '( )',
4545
expected: [
46-
{ type: 'function', value: '', before: ' ', after: '', nodes: [] }
46+
{ type: 'function', sourceIndex: 0, value: '', before: ' ', after: '', nodes: [] }
4747
]
4848
}, {
4949
message: 'should add before and after prop',
5050
fixture: '( | )',
5151
expected: [
52-
{ type: 'function', value: '', before: ' ', after: ' ', nodes: [
52+
{ type: 'function', sourceIndex: 0, value: '', before: ' ', after: ' ', nodes: [
5353
{ type: 'word', sourceIndex: 2, value: '|' }
5454
] }
5555
]
5656
}, {
5757
message: 'should add value prop',
5858
fixture: 'name()',
5959
expected: [
60-
{ type: 'function', value: 'name', before: '', after: '', nodes: [] }
60+
{ type: 'function', sourceIndex: 0, value: 'name', before: '', after: '', nodes: [] }
6161
]
6262
}, {
6363
message: 'should process nested functions',
6464
fixture: '((()))',
6565
expected: [
66-
{ type: 'function', value: '', before: '', after: '', nodes: [
67-
{ type: 'function', value: '', before: '', after: '', nodes: [
68-
{ type: 'function', value: '', before: '', after: '', nodes: [] }
66+
{ type: 'function', sourceIndex: 0, value: '', before: '', after: '', nodes: [
67+
{ type: 'function', sourceIndex: 1, value: '', before: '', after: '', nodes: [
68+
{ type: 'function', sourceIndex: 2, value: '', before: '', after: '', nodes: [] }
6969
] }
7070
] }
7171
]
7272
}, {
7373
message: 'should process advanced nested functions',
7474
fixture: '( calc(( ) ))word',
7575
expected: [
76-
{ type: 'function', value: '', before: ' ', after: '', nodes: [
77-
{ type: 'function', value: 'calc', before: '', after: ' ', nodes: [
78-
{ type: 'function', value: '', before: ' ', after: '', nodes: [] }
76+
{ type: 'function', sourceIndex: 0, value: '', before: ' ', after: '', nodes: [
77+
{ type: 'function', sourceIndex: 2, value: 'calc', before: '', after: ' ', nodes: [
78+
{ type: 'function', sourceIndex: 7, value: '', before: ' ', after: '', nodes: [] }
7979
] }
8080
] },
8181
{ type: 'word', sourceIndex: 13, value: 'word' }
@@ -108,7 +108,7 @@ var tests = [{
108108
message: 'should process divider in function',
109109
fixture: '( , )',
110110
expected: [
111-
{ type: 'function', value: '', before: ' ', after: ' ', nodes: [
111+
{ type: 'function', sourceIndex: 0, value: '', before: ' ', after: ' ', nodes: [
112112
{ type: 'div', value: ',', before: '', after: '' }
113113
] }
114114
]
@@ -221,7 +221,7 @@ var tests = [{
221221
message: 'should correctly proceess color value',
222222
fixture: 'rgba( 29, 439 , 29 )',
223223
expected: [
224-
{ type: 'function', value: 'rgba', before: ' ', after: ' ', nodes: [
224+
{ type: 'function', sourceIndex: 0, value: 'rgba', before: ' ', after: ' ', nodes: [
225225
{ type: 'word', sourceIndex: 6, value: '29' },
226226
{ type: 'div', value: ',', before: '', after: ' ' },
227227
{ type: 'word', sourceIndex: 10, value: '439' },
@@ -233,15 +233,15 @@ var tests = [{
233233
message: 'should correctly process url function',
234234
fixture: 'url( /gfx/img/bg.jpg )',
235235
expected: [
236-
{ type: 'function', value: 'url', before: ' ', after: ' ', nodes: [
236+
{ type: 'function', sourceIndex: 0, value: 'url', before: ' ', after: ' ', nodes: [
237237
{ type: 'word', sourceIndex: 5, value: '/gfx/img/bg.jpg' }
238238
] }
239239
]
240240
}, {
241241
message: 'should add unclosed: true prop for url function',
242242
fixture: 'url( /gfx/img/bg.jpg ',
243243
expected: [
244-
{ type: 'function', value: 'url', before: ' ', after: '', unclosed: true, nodes: [
244+
{ type: 'function', sourceIndex: 0, value: 'url', before: ' ', after: '', unclosed: true, nodes: [
245245
{ type: 'word', sourceIndex: 5, value: '/gfx/img/bg.jpg' },
246246
{ type: 'space', sourceIndex: 20, value: ' ' }
247247
] }
@@ -250,7 +250,7 @@ var tests = [{
250250
message: 'should correctly process url function with quoted first argument',
251251
fixture: 'url( "/gfx/img/bg.jpg" hello )',
252252
expected: [
253-
{ type: 'function', value: 'url', before: ' ', after: ' ', nodes: [
253+
{ type: 'function', sourceIndex: 0, value: 'url', before: ' ', after: ' ', nodes: [
254254
{ type: 'string', sourceIndex: 5, quote: '"', value: '/gfx/img/bg.jpg' },
255255
{ type: 'space', sourceIndex: 22, value: ' ' },
256256
{ type: 'word', sourceIndex: 23, value: 'hello' }
@@ -260,9 +260,9 @@ var tests = [{
260260
message: 'should correctly process nested calc functions',
261261
fixture: 'calc(((768px - 100vw) / 2) - 15px)',
262262
expected: [
263-
{type: 'function', value: 'calc', before: '', after: '', nodes: [
264-
{ type: 'function', value: '', before: '', after: '', nodes: [
265-
{ type: 'function', value: '', before: '', after: '', nodes: [
263+
{type: 'function', sourceIndex: 0, value: 'calc', before: '', after: '', nodes: [
264+
{ type: 'function', sourceIndex: 5, value: '', before: '', after: '', nodes: [
265+
{ type: 'function', sourceIndex: 6, value: '', before: '', after: '', nodes: [
266266
{ type: 'word', sourceIndex: 7, value: '768px' },
267267
{ type: 'space', sourceIndex: 12, value: ' ' },
268268
{ type: 'word', sourceIndex: 13, value: '-' },
@@ -282,15 +282,15 @@ var tests = [{
282282
message: 'should process colons with params',
283283
fixture: '(min-width: 700px) and (orientation: \\$landscape)',
284284
expected: [
285-
{ type: 'function', value: '', before: '', after: '', nodes: [
285+
{ type: 'function', sourceIndex: 0, value: '', before: '', after: '', nodes: [
286286
{ type: 'word', sourceIndex: 1, value: 'min-width' },
287287
{ type: 'div', value: ':', before: '', after: ' ' },
288288
{ type: 'word', sourceIndex: 12, value: '700px' }
289289
] },
290290
{ type: 'space', sourceIndex: 18, value: ' ' },
291291
{ type: 'word', sourceIndex: 19, value: 'and' },
292292
{ type: 'space', sourceIndex: 22, value: ' ' },
293-
{ type: 'function', value: '', before: '', after: '', nodes: [
293+
{ type: 'function', sourceIndex: 23, value: '', before: '', after: '', nodes: [
294294
{ type: 'word', sourceIndex: 24, value: 'orientation' },
295295
{ type: 'div', value: ':', before: '', after: ' ' },
296296
{ type: 'word', sourceIndex: 37, value: '\\$landscape' }
@@ -300,26 +300,26 @@ var tests = [{
300300
message: 'should escape parentheses with backslash',
301301
fixture: 'url( http://website.com/assets\\)_test )',
302302
expected: [
303-
{ type: 'function', value: 'url', before: ' ', after: ' ', nodes: [
303+
{ type: 'function', sourceIndex: 0, value: 'url', before: ' ', after: ' ', nodes: [
304304
{ type: 'word', sourceIndex: 5, value: 'http://website.com/assets\\)_test' }
305305
] }
306306
]
307307
}, {
308308
message: 'should parse parentheses correctly',
309309
fixture: 'fn1(fn2(255), fn3(.2)), fn4(fn5(255,.2), fn6)',
310310
expected: [
311-
{ type: 'function', value: 'fn1', before: '', after: '', nodes: [
312-
{ type: 'function', value: 'fn2', before: '', after: '', nodes: [
311+
{ type: 'function', sourceIndex: 0, value: 'fn1', before: '', after: '', nodes: [
312+
{ type: 'function', sourceIndex: 4, value: 'fn2', before: '', after: '', nodes: [
313313
{ type: 'word', sourceIndex: 8, value: '255' }
314314
] },
315315
{ type: 'div', value: ',', before: '', after: ' ' },
316-
{ type: 'function', value: 'fn3', before: '', after: '', nodes: [
316+
{ type: 'function', sourceIndex: 14, value: 'fn3', before: '', after: '', nodes: [
317317
{ type: 'word', sourceIndex: 18, value: '.2' }
318318
] },
319319
] },
320320
{ type: 'div', value: ',', before: '', after: ' ' },
321-
{ type: 'function', value: 'fn4', before: '', after: '', nodes: [
322-
{ type: 'function', value: 'fn5', before: '', after: '', nodes: [
321+
{ type: 'function', sourceIndex: 24, value: 'fn4', before: '', after: '', nodes: [
322+
{ type: 'function', sourceIndex: 28, value: 'fn5', before: '', after: '', nodes: [
323323
{ type: 'word', sourceIndex: 32, value: '255' },
324324
{ type: 'div', value: ',', before: '', after: '' },
325325
{ type: 'word', sourceIndex: 36, value: '.2' }
@@ -332,7 +332,7 @@ var tests = [{
332332
message: 'shouldn\'t throw an error on unclosed function',
333333
fixture: '(0 32 word ',
334334
expected: [
335-
{ type: 'function', value: '', before: '', after: '', unclosed: true, nodes: [
335+
{ type: 'function', sourceIndex: 0, value: '', before: '', after: '', unclosed: true, nodes: [
336336
{ type: 'word', sourceIndex: 1, value: '0' },
337337
{ type: 'space', sourceIndex: 2, value: ' ' },
338338
{ type: 'word', sourceIndex: 3, value: '32' },
@@ -345,9 +345,9 @@ var tests = [{
345345
message: 'should add unclosed: true prop for every unclosed function',
346346
fixture: '( ( ( ) ',
347347
expected: [
348-
{ type: 'function', value: '', before: ' ', after: '', unclosed: true, nodes: [
349-
{ type: 'function', value: '', before: ' ', after: '', unclosed: true, nodes: [
350-
{ type: 'function', value: '', before: ' ', after: '', nodes: [] },
348+
{ type: 'function', sourceIndex: 0, value: '', before: ' ', after: '', unclosed: true, nodes: [
349+
{ type: 'function', sourceIndex: 2, value: '', before: ' ', after: '', unclosed: true, nodes: [
350+
{ type: 'function', sourceIndex: 4, value: '', before: ' ', after: '', nodes: [] },
351351
{ type: 'space', sourceIndex: 7, value: ' ' }
352352
] }
353353
] }
@@ -375,11 +375,11 @@ var tests = [{
375375
message: 'should parse double url and comma',
376376
fixture: 'url(foo/bar.jpg), url(http://website.com/img.jpg)',
377377
expected: [
378-
{ type: 'function', value: 'url', before: '', after: '', nodes: [
378+
{ type: 'function', sourceIndex: 0, value: 'url', before: '', after: '', nodes: [
379379
{ type: 'word', sourceIndex: 4, value: 'foo/bar.jpg' }
380380
] },
381381
{ type: 'div', value: ',', before: '', after: ' ' },
382-
{ type: 'function', value: 'url', before: '', after: '', nodes: [
382+
{ type: 'function', sourceIndex: 18, value: 'url', before: '', after: '', nodes: [
383383
{ type: 'word', sourceIndex: 22, value: 'http://website.com/img.jpg' }
384384
] },
385385
]

0 commit comments

Comments
 (0)