You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					121 lines
				
				2.2 KiB
			
		
		
			
		
	
	
					121 lines
				
				2.2 KiB
			| 
											3 years ago
										 | var minus = "-".charCodeAt(0); | ||
|  | var plus = "+".charCodeAt(0); | ||
|  | var dot = ".".charCodeAt(0); | ||
|  | var exp = "e".charCodeAt(0); | ||
|  | var EXP = "E".charCodeAt(0); | ||
|  | 
 | ||
|  | // Check if three code points would start a number
 | ||
|  | // https://www.w3.org/TR/css-syntax-3/#starts-with-a-number
 | ||
|  | function likeNumber(value) { | ||
|  |   var code = value.charCodeAt(0); | ||
|  |   var nextCode; | ||
|  | 
 | ||
|  |   if (code === plus || code === minus) { | ||
|  |     nextCode = value.charCodeAt(1); | ||
|  | 
 | ||
|  |     if (nextCode >= 48 && nextCode <= 57) { | ||
|  |       return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     var nextNextCode = value.charCodeAt(2); | ||
|  | 
 | ||
|  |     if (nextCode === dot && nextNextCode >= 48 && nextNextCode <= 57) { | ||
|  |       return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     return false; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (code === dot) { | ||
|  |     nextCode = value.charCodeAt(1); | ||
|  | 
 | ||
|  |     if (nextCode >= 48 && nextCode <= 57) { | ||
|  |       return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     return false; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (code >= 48 && code <= 57) { | ||
|  |     return true; | ||
|  |   } | ||
|  | 
 | ||
|  |   return false; | ||
|  | } | ||
|  | 
 | ||
|  | // Consume a number
 | ||
|  | // https://www.w3.org/TR/css-syntax-3/#consume-number
 | ||
|  | module.exports = function(value) { | ||
|  |   var pos = 0; | ||
|  |   var length = value.length; | ||
|  |   var code; | ||
|  |   var nextCode; | ||
|  |   var nextNextCode; | ||
|  | 
 | ||
|  |   if (length === 0 || !likeNumber(value)) { | ||
|  |     return false; | ||
|  |   } | ||
|  | 
 | ||
|  |   code = value.charCodeAt(pos); | ||
|  | 
 | ||
|  |   if (code === plus || code === minus) { | ||
|  |     pos++; | ||
|  |   } | ||
|  | 
 | ||
|  |   while (pos < length) { | ||
|  |     code = value.charCodeAt(pos); | ||
|  | 
 | ||
|  |     if (code < 48 || code > 57) { | ||
|  |       break; | ||
|  |     } | ||
|  | 
 | ||
|  |     pos += 1; | ||
|  |   } | ||
|  | 
 | ||
|  |   code = value.charCodeAt(pos); | ||
|  |   nextCode = value.charCodeAt(pos + 1); | ||
|  | 
 | ||
|  |   if (code === dot && nextCode >= 48 && nextCode <= 57) { | ||
|  |     pos += 2; | ||
|  | 
 | ||
|  |     while (pos < length) { | ||
|  |       code = value.charCodeAt(pos); | ||
|  | 
 | ||
|  |       if (code < 48 || code > 57) { | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |       pos += 1; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   code = value.charCodeAt(pos); | ||
|  |   nextCode = value.charCodeAt(pos + 1); | ||
|  |   nextNextCode = value.charCodeAt(pos + 2); | ||
|  | 
 | ||
|  |   if ( | ||
|  |     (code === exp || code === EXP) && | ||
|  |     ((nextCode >= 48 && nextCode <= 57) || | ||
|  |       ((nextCode === plus || nextCode === minus) && | ||
|  |         nextNextCode >= 48 && | ||
|  |         nextNextCode <= 57)) | ||
|  |   ) { | ||
|  |     pos += nextCode === plus || nextCode === minus ? 3 : 2; | ||
|  | 
 | ||
|  |     while (pos < length) { | ||
|  |       code = value.charCodeAt(pos); | ||
|  | 
 | ||
|  |       if (code < 48 || code > 57) { | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |       pos += 1; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return { | ||
|  |     number: value.slice(0, pos), | ||
|  |     unit: value.slice(pos) | ||
|  |   }; | ||
|  | }; |