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)
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								};
							 |