@@ -18,31 +18,31 @@ var h = /^[0-9a-fA-F]$/,
1818
1919
2020function isHexDigit ( c ) {
21- return c !== null && h . test ( c ) ;
21+ return c != null && h . test ( c ) ;
2222}
2323
2424function isDigit ( c ) {
25- return c !== null && / \d / . test ( c ) ;
25+ return c != null && / \d / . test ( c ) ;
2626}
2727
2828function isWhitespace ( c ) {
29- return c !== null && whitespace . test ( c ) ;
29+ return c != null && whitespace . test ( c ) ;
3030}
3131
3232function isNewLine ( c ) {
33- return c !== null && nl . test ( c ) ;
33+ return c != null && nl . test ( c ) ;
3434}
3535
3636function isNameStart ( c ) {
37- return c !== null && / [ a - z _ \u00A0 - \uFFFF \\ ] / i. test ( c ) ;
37+ return c != null && / [ a - z _ \u00A0 - \uFFFF \\ ] / i. test ( c ) ;
3838}
3939
4040function isNameChar ( c ) {
41- return c !== null && ( isNameStart ( c ) || / [ 0 - 9 \- \\ ] / . test ( c ) ) ;
41+ return c != null && ( isNameStart ( c ) || / [ 0 - 9 \- \\ ] / . test ( c ) ) ;
4242}
4343
4444function isIdentStart ( c ) {
45- return c !== null && ( isNameStart ( c ) || / - \\ / . test ( c ) ) ;
45+ return c != null && ( isNameStart ( c ) || / - \\ / . test ( c ) ) ;
4646}
4747
4848function mix ( receiver , supplier ) {
@@ -54,6 +54,16 @@ function mix(receiver, supplier) {
5454 return receiver ;
5555}
5656
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+
5767//-----------------------------------------------------------------------------
5868// CSS Token Stream
5969//-----------------------------------------------------------------------------
@@ -89,7 +99,6 @@ TokenStream.prototype = mix(new TokenStreamBase(), {
8999
90100 c = reader . read ( ) ;
91101
92-
93102 while ( c ) {
94103 switch ( c ) {
95104
@@ -170,16 +179,31 @@ TokenStream.prototype = mix(new TokenStreamBase(), {
170179 /*
171180 * Potential tokens:
172181 * - CDC
173- * - MINUS
174182 * - NUMBER
175183 * - DIMENSION
176184 * - PERCENTAGE
185+ * - IDENT
186+ * - MINUS
177187 */
178188 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 ) === "->" ) {
180193 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 ) ;
183207 } else {
184208 token = this . charToken ( c , startLine , startCol ) ;
185209 }
@@ -242,48 +266,13 @@ TokenStream.prototype = mix(new TokenStreamBase(), {
242266 case "u" :
243267 if ( reader . peek ( ) === "+" ) {
244268 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 ) ;
279269 } else {
280- /*
281- * Potential tokens:
282- * - CHAR
283- * - PLUS
284- */
285- token = this . charToken ( c , startLine , startCol ) ;
270+ token = this . _getDefaultToken ( c , startLine , startCol ) ;
286271 }
272+ break ;
273+
274+ default :
275+ token = this . _getDefaultToken ( c , startLine , startCol ) ;
287276
288277 }
289278
@@ -299,6 +288,58 @@ TokenStream.prototype = mix(new TokenStreamBase(), {
299288 return token ;
300289 } ,
301290
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+
302343 //-------------------------------------------------------------------------
303344 // Methods to create tokens
304345 //-------------------------------------------------------------------------
0 commit comments