react-native-reanimated
Version:
More powerful alternative to Animated library for React Native.
84 lines (79 loc) • 2.16 kB
JavaScript
;
import { isLength } from "../utils/guards.js";
const LENGTH_MAPPINGS = ['offsetX', 'offsetY', 'blurRadius', 'spreadDistance'];
export const CSS_NUMBER_PATTERN = String.raw`[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?`;
const ANGLE_UNIT_REGEX = new RegExp(`^(${CSS_NUMBER_PATTERN})(deg|grad|rad|turn)$`, 'i');
const SHADOW_PARTS_REGEX = /(?:[^\s()]+|\([^()]*\))+/g;
const SHADOW_SPLIT_REGEX = /(?:[^,()]+|\([^)]*\))+(?=\s*,|$)/g;
export function parseBoxShadowString(value) {
'worklet';
if (value === 'none') {
return [];
}
const shadows = value.match(SHADOW_SPLIT_REGEX) || [];
return shadows.map(shadow => {
const result = {
offsetX: 0,
offsetY: 0
};
let foundLengthsCount = 0;
const parts = shadow.match(SHADOW_PARTS_REGEX) || [];
parts.forEach(part => {
if (isLength(part)) {
result[LENGTH_MAPPINGS[foundLengthsCount++]] = part;
} else if (part === 'inset') {
result.inset = true;
} else {
result.color = part.trim();
}
});
return result;
});
}
export function splitByComma(str) {
'worklet';
// split by comma not enclosed in parentheses
const parts = [];
let current = '';
let depth = 0;
for (const char of str) {
if (char === '(') {
depth++;
} else if (char === ')') {
depth--;
} else if (char === ',' && depth === 0) {
parts.push(current.trim());
current = '';
continue;
}
current += char;
}
parts.push(current.trim());
return parts;
}
export function splitByWhitespace(str) {
'worklet';
// split by whitespace not enclosed in parentheses
return str.split(/\s+(?![^()]*\))/);
}
export function getAngleInDegrees(angle) {
'worklet';
const match = angle.match(ANGLE_UNIT_REGEX);
if (!match) {
return null;
}
const numericValue = parseFloat(match[1]);
switch (match[2].toLowerCase()) {
case 'deg':
return numericValue;
case 'grad':
return numericValue * 0.9;
case 'rad':
return numericValue * 180 / Math.PI;
case 'turn':
return numericValue * 360;
default:
return null;
}
}
//# sourceMappingURL=parsers.js.map