@@ -18,31 +18,31 @@ var h = /^[0-9a-fA-F]$/,
18
18
19
19
20
20
function isHexDigit ( c ) {
21
- return c !== null && h . test ( c ) ;
21
+ return c != null && h . test ( c ) ;
22
22
}
23
23
24
24
function isDigit ( c ) {
25
- return c !== null && / \d / . test ( c ) ;
25
+ return c != null && / \d / . test ( c ) ;
26
26
}
27
27
28
28
function isWhitespace ( c ) {
29
- return c !== null && whitespace . test ( c ) ;
29
+ return c != null && whitespace . test ( c ) ;
30
30
}
31
31
32
32
function isNewLine ( c ) {
33
- return c !== null && nl . test ( c ) ;
33
+ return c != null && nl . test ( c ) ;
34
34
}
35
35
36
36
function isNameStart ( c ) {
37
- return c !== null && / [ a - z _ \u00A0 - \uFFFF \\ ] / i. test ( c ) ;
37
+ return c != null && / [ a - z _ \u00A0 - \uFFFF \\ ] / i. test ( c ) ;
38
38
}
39
39
40
40
function isNameChar ( c ) {
41
- return c !== null && ( isNameStart ( c ) || / [ 0 - 9 \- \\ ] / . test ( c ) ) ;
41
+ return c != null && ( isNameStart ( c ) || / [ 0 - 9 \- \\ ] / . test ( c ) ) ;
42
42
}
43
43
44
44
function isIdentStart ( c ) {
45
- return c !== null && ( isNameStart ( c ) || / - \\ / . test ( c ) ) ;
45
+ return c != null && ( isNameStart ( c ) || / - \\ / . test ( c ) ) ;
46
46
}
47
47
48
48
function mix ( receiver , supplier ) {
@@ -54,6 +54,16 @@ function mix(receiver, supplier) {
54
54
return receiver ;
55
55
}
56
56
57
+ function wouldStartIdent ( twoCodePoints ) {
58
+ return typeof twoCodePoints === "string" &&
59
+ ( twoCodePoints [ 0 ] === "-" && isNameStart ( twoCodePoints [ 1 ] ) || isNameStart ( twoCodePoints [ 0 ] ) ) ;
60
+ }
61
+
62
+ function wouldStartUnsignedNumber ( twoCodePoints ) {
63
+ return typeof twoCodePoints === "string" &&
64
+ ( isDigit ( twoCodePoints [ 0 ] ) || ( twoCodePoints [ 0 ] === "." && isDigit ( twoCodePoints [ 1 ] ) ) ) ;
65
+ }
66
+
57
67
//-----------------------------------------------------------------------------
58
68
// CSS Token Stream
59
69
//-----------------------------------------------------------------------------
@@ -89,7 +99,6 @@ TokenStream.prototype = mix(new TokenStreamBase(), {
89
99
90
100
c = reader . read ( ) ;
91
101
92
-
93
102
while ( c ) {
94
103
switch ( c ) {
95
104
@@ -170,16 +179,31 @@ TokenStream.prototype = mix(new TokenStreamBase(), {
170
179
/*
171
180
* Potential tokens:
172
181
* - CDC
173
- * - MINUS
174
182
* - NUMBER
175
183
* - DIMENSION
176
184
* - PERCENTAGE
185
+ * - IDENT
186
+ * - MINUS
177
187
*/
178
188
case "-" :
179
- if ( reader . peek ( ) === "-" ) { // could be closing HTML-style comment
189
+ if ( wouldStartUnsignedNumber ( reader . peekCount ( 2 ) ) ) {
190
+ token = this . numberToken ( c , startLine , startCol ) ;
191
+ break ;
192
+ } else if ( reader . peekCount ( 2 ) === "->" ) {
180
193
token = this . htmlCommentEndToken ( c , startLine , startCol ) ;
181
- } else if ( isNameStart ( reader . peek ( ) ) ) {
182
- token = this . identOrFunctionToken ( c , startLine , startCol ) ;
194
+ } else {
195
+ token = this . _getDefaultToken ( c , startLine , startCol ) ;
196
+ }
197
+ break ;
198
+
199
+ /*
200
+ * Potential tokens:
201
+ * - NUMBER
202
+ * - PLUS
203
+ */
204
+ case "+" :
205
+ if ( wouldStartUnsignedNumber ( reader . peekCount ( 2 ) ) ) {
206
+ token = this . numberToken ( c , startLine , startCol ) ;
183
207
} else {
184
208
token = this . charToken ( c , startLine , startCol ) ;
185
209
}
@@ -242,48 +266,13 @@ TokenStream.prototype = mix(new TokenStreamBase(), {
242
266
case "u" :
243
267
if ( reader . peek ( ) === "+" ) {
244
268
token = this . unicodeRangeToken ( c , startLine , startCol ) ;
245
- break ;
246
- }
247
- /* falls through */
248
- default :
249
-
250
- /*
251
- * Potential tokens:
252
- * - NUMBER
253
- * - DIMENSION
254
- * - LENGTH
255
- * - FREQ
256
- * - TIME
257
- * - EMS
258
- * - EXS
259
- * - ANGLE
260
- */
261
- if ( isDigit ( c ) ) {
262
- token = this . numberToken ( c , startLine , startCol ) ;
263
- } else
264
-
265
- /*
266
- * Potential tokens:
267
- * - S
268
- */
269
- if ( isWhitespace ( c ) ) {
270
- token = this . whitespaceToken ( c , startLine , startCol ) ;
271
- } else
272
-
273
- /*
274
- * Potential tokens:
275
- * - IDENT
276
- */
277
- if ( isIdentStart ( c ) ) {
278
- token = this . identOrFunctionToken ( c , startLine , startCol ) ;
279
269
} else {
280
- /*
281
- * Potential tokens:
282
- * - CHAR
283
- * - PLUS
284
- */
285
- token = this . charToken ( c , startLine , startCol ) ;
270
+ token = this . _getDefaultToken ( c , startLine , startCol ) ;
286
271
}
272
+ break ;
273
+
274
+ default :
275
+ token = this . _getDefaultToken ( c , startLine , startCol ) ;
287
276
288
277
}
289
278
@@ -299,6 +288,58 @@ TokenStream.prototype = mix(new TokenStreamBase(), {
299
288
return token ;
300
289
} ,
301
290
291
+ /**
292
+ * Produces a token based on the given character and location in the
293
+ * stream, when no other case applies.
294
+ * Potential tokens:
295
+ * - NUMBER
296
+ * - DIMENSION
297
+ * - LENGTH
298
+ * - FREQ
299
+ * - TIME
300
+ * - EMS
301
+ * - EXS
302
+ * - ANGLE
303
+ * @param {String } c The character for the token.
304
+ * @param {int } startLine The beginning line for the character.
305
+ * @param {int } startCol The beginning column for the character.
306
+ * @return {Object } A token object.
307
+ * @method _getDefaultToken
308
+ */
309
+ _getDefaultToken : function ( c , startLine , startCol ) {
310
+ var reader = this . _reader ,
311
+ token = null ;
312
+
313
+ if ( isDigit ( c ) ) {
314
+ token = this . numberToken ( c , startLine , startCol ) ;
315
+ } else
316
+
317
+ /*
318
+ * Potential tokens:
319
+ * - S
320
+ */
321
+ if ( isWhitespace ( c ) ) {
322
+ token = this . whitespaceToken ( c , startLine , startCol ) ;
323
+ } else
324
+
325
+ /*
326
+ * Potential tokens:
327
+ * - IDENT
328
+ */
329
+ if ( wouldStartIdent ( c + reader . peekCount ( 1 ) ) ) {
330
+ token = this . identOrFunctionToken ( c , startLine , startCol ) ;
331
+ } else {
332
+ /*
333
+ * Potential tokens:
334
+ * - CHAR
335
+ * - PLUS
336
+ */
337
+ token = this . charToken ( c , startLine , startCol ) ;
338
+ }
339
+
340
+ return token ;
341
+ } ,
342
+
302
343
//-------------------------------------------------------------------------
303
344
// Methods to create tokens
304
345
//-------------------------------------------------------------------------
0 commit comments