@@ -97,38 +97,29 @@ function parse (input, options) {
97
97
98
98
var stack = [ ]
99
99
100
- var tokenStart = function ( ) { }
101
- var tokenEnd = function ( v ) { return v }
102
-
103
- /* tokenize({
104
- raw: '...',
105
- type: 'whitespace'|'comment'|'key'|'literal'|'separator'|'newline',
106
- value: 'number'|'string'|'whatever',
107
- path: [...],
108
- })
109
- */
110
- if ( options . _tokenize ) {
111
- ; ( function ( ) {
112
- var start = null
113
- tokenStart = function ( ) {
114
- if ( start !== null ) throw Error ( 'internal error, token overlap' )
115
- start = position
116
- }
117
-
118
- tokenEnd = function ( v , type ) {
119
- if ( start !== position ) {
120
- var hash = {
121
- raw : input . substr ( start , position - start ) ,
122
- type : type ,
123
- stack : stack . slice ( 0 )
124
- }
125
- if ( v !== undefined ) hash . value = v
126
- options . _tokenize . call ( null , hash )
100
+ var startToken = function ( ) { }
101
+ var endToken = function ( v ) { return v }
102
+
103
+ var tokenize = options . tokenize
104
+ if ( tokenize ) {
105
+ var tokenStart = null
106
+ startToken = function ( ) {
107
+ if ( tokenStart !== null ) throw Error ( 'internal error, token overlap' )
108
+ tokenStart = position
109
+ }
110
+ endToken = function ( v , type ) {
111
+ if ( tokenStart !== position ) {
112
+ var hash = {
113
+ raw : input . substr ( tokenStart , position - tokenStart ) ,
114
+ type : type ,
115
+ stack : stack . slice ( 0 )
127
116
}
128
- start = null
129
- return v
117
+ if ( v !== undefined ) hash . value = v
118
+ tokenize ( hash )
130
119
}
131
- } ) ( )
120
+ tokenStart = null
121
+ return v
122
+ }
132
123
}
133
124
134
125
function fail ( message ) {
@@ -165,36 +156,36 @@ function parse (input, options) {
165
156
166
157
function parseGeneric ( ) {
167
158
while ( position < length ) {
168
- tokenStart ( )
159
+ startToken ( )
169
160
var chr = input [ position ++ ]
170
161
171
162
if ( chr === '"' || ( chr === '\'' && json5 ) ) {
172
- return tokenEnd ( parseString ( chr ) , 'literal' )
163
+ return endToken ( parseString ( chr ) , 'literal' )
173
164
} else if ( chr === '{' ) {
174
- tokenEnd ( undefined , 'separator' )
165
+ endToken ( undefined , 'separator' )
175
166
return parseObject ( )
176
167
} else if ( chr === '[' ) {
177
- tokenEnd ( undefined , 'separator' )
168
+ endToken ( undefined , 'separator' )
178
169
return parseArray ( )
179
170
} else if ( chr === '-' ||
180
171
chr === '.' ||
181
172
isDecDigit ( chr ) ||
182
173
// + number Infinity NaN
183
174
( json5 && ( chr === '+' || chr === 'I' || chr === 'N' ) )
184
175
) {
185
- return tokenEnd ( parseNumber ( ) , 'literal' )
176
+ return endToken ( parseNumber ( ) , 'literal' )
186
177
} else if ( chr === 'n' ) {
187
178
parseKeyword ( 'null' )
188
- return tokenEnd ( null , 'literal' )
179
+ return endToken ( null , 'literal' )
189
180
} else if ( chr === 't' ) {
190
181
parseKeyword ( 'true' )
191
- return tokenEnd ( true , 'literal' )
182
+ return endToken ( true , 'literal' )
192
183
} else if ( chr === 'f' ) {
193
184
parseKeyword ( 'false' )
194
- return tokenEnd ( false , 'literal' )
185
+ return endToken ( false , 'literal' )
195
186
} else {
196
187
position --
197
- return tokenEnd ( undefined )
188
+ return endToken ( undefined )
198
189
}
199
190
}
200
191
}
@@ -203,20 +194,20 @@ function parse (input, options) {
203
194
var result
204
195
205
196
while ( position < length ) {
206
- tokenStart ( )
197
+ startToken ( )
207
198
var chr = input [ position ++ ]
208
199
209
200
if ( chr === '"' || ( chr === '\'' && json5 ) ) {
210
- return tokenEnd ( parseString ( chr ) , 'key' )
201
+ return endToken ( parseString ( chr ) , 'key' )
211
202
} else if ( chr === '{' ) {
212
- tokenEnd ( undefined , 'separator' )
203
+ endToken ( undefined , 'separator' )
213
204
return parseObject ( )
214
205
} else if ( chr === '[' ) {
215
- tokenEnd ( undefined , 'separator' )
206
+ endToken ( undefined , 'separator' )
216
207
return parseArray ( )
217
208
} else if ( chr === '.' || isDecDigit ( chr )
218
209
) {
219
- return tokenEnd ( parseNumber ( true ) , 'key' )
210
+ return endToken ( parseNumber ( true ) , 'key' )
220
211
} else if ( ( json5 && Uni . isIdentifierStart ( chr ) ) ||
221
212
( chr === '\\' && input [ position ] === 'u' ) ) {
222
213
// unicode char or a unicode sequence
@@ -225,30 +216,30 @@ function parse (input, options) {
225
216
226
217
if ( result === undefined ) {
227
218
position = rollback
228
- return tokenEnd ( undefined )
219
+ return endToken ( undefined )
229
220
} else {
230
- return tokenEnd ( result , 'key' )
221
+ return endToken ( result , 'key' )
231
222
}
232
223
} else {
233
224
position --
234
- return tokenEnd ( undefined )
225
+ return endToken ( undefined )
235
226
}
236
227
}
237
228
}
238
229
239
230
function skipWhiteSpace ( ) {
240
- tokenStart ( )
231
+ startToken ( )
241
232
while ( position < length ) {
242
233
var chr = input [ position ++ ]
243
234
244
235
if ( isLineTerminator ( chr ) ) {
245
236
position --
246
- tokenEnd ( undefined , 'whitespace' )
247
- tokenStart ( )
237
+ endToken ( undefined , 'whitespace' )
238
+ startToken ( )
248
239
position ++
249
240
newLine ( chr )
250
- tokenEnd ( undefined , 'newline' )
251
- tokenStart ( )
241
+ endToken ( undefined , 'newline' )
242
+ startToken ( )
252
243
} else if ( isWhiteSpace ( chr ) ) {
253
244
// nothing
254
245
@@ -257,18 +248,18 @@ function parse (input, options) {
257
248
( input [ position ] === '/' || input [ position ] === '*' )
258
249
) {
259
250
position --
260
- tokenEnd ( undefined , 'whitespace' )
261
- tokenStart ( )
251
+ endToken ( undefined , 'whitespace' )
252
+ startToken ( )
262
253
position ++
263
254
skipComment ( input [ position ++ ] === '*' )
264
- tokenEnd ( undefined , 'comment' )
265
- tokenStart ( )
255
+ endToken ( undefined , 'comment' )
256
+ startToken ( )
266
257
} else {
267
258
position --
268
259
break
269
260
}
270
261
}
271
- return tokenEnd ( undefined , 'whitespace' )
262
+ return endToken ( undefined , 'whitespace' )
272
263
}
273
264
274
265
function skipComment ( multi ) {
@@ -322,9 +313,9 @@ function parse (input, options) {
322
313
skipWhiteSpace ( )
323
314
var key = parseKey ( )
324
315
skipWhiteSpace ( )
325
- tokenStart ( )
316
+ startToken ( )
326
317
var chr = input [ position ++ ]
327
- tokenEnd ( undefined , 'separator' )
318
+ endToken ( undefined , 'separator' )
328
319
329
320
if ( chr === '}' && key === undefined ) {
330
321
if ( ! json5 && isNotEmpty ) {
@@ -369,9 +360,9 @@ function parse (input, options) {
369
360
370
361
skipWhiteSpace ( )
371
362
372
- tokenStart ( )
363
+ startToken ( )
373
364
chr = input [ position ++ ]
374
- tokenEnd ( undefined , 'separator' )
365
+ endToken ( undefined , 'separator' )
375
366
376
367
if ( chr === ',' ) {
377
368
continue
@@ -398,9 +389,9 @@ function parse (input, options) {
398
389
var item = parseGeneric ( )
399
390
stack . pop ( )
400
391
skipWhiteSpace ( )
401
- tokenStart ( )
392
+ startToken ( )
402
393
var chr = input [ position ++ ]
403
- tokenEnd ( undefined , 'separator' )
394
+ endToken ( undefined , 'separator' )
404
395
405
396
if ( item !== undefined ) {
406
397
if ( typeof ( options . reviver ) === 'function' ) {
@@ -713,7 +704,7 @@ exports.parse = function parseJSON (input, options) {
713
704
exports . tokenize = function tokenizeJSON ( input , options ) {
714
705
if ( options == null ) options = { }
715
706
716
- options . _tokenize = function ( smth ) {
707
+ options . tokenize = function ( smth ) {
717
708
if ( options . _addstack ) smth . stack . unshift . apply ( smth . stack , options . _addstack )
718
709
tokens . push ( smth )
719
710
}
0 commit comments