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.
51 lines
1.6 KiB
51 lines
1.6 KiB
import { StyleSheet } from 'react-native';
|
|
import deepMap from './deep-map';
|
|
|
|
// Groups Size Func Factor
|
|
// 1 2 3
|
|
const validScaleSheetRegex = /^(\-?\d+(?:\.\d{1,3})?)@(mv?s(\d+(?:\.\d{1,2})?)?|s|vs)r?$/;
|
|
|
|
const scaleByAnnotation = (scale, verticalScale, moderateScale, moderateVerticalScale) => (value) => {
|
|
if (!validScaleSheetRegex.test(value)) {
|
|
return value;
|
|
}
|
|
|
|
const regexExecResult = validScaleSheetRegex.exec(value);
|
|
|
|
const size = parseFloat(regexExecResult[1]);
|
|
let scaleFunc = regexExecResult[2];
|
|
const scaleFactor = regexExecResult[3]; // string or undefined
|
|
|
|
if (scaleFactor)
|
|
scaleFunc = scaleFunc.slice(0, - scaleFactor.length); // Remove the factor from it
|
|
|
|
const shouldRound = value.endsWith('r');
|
|
|
|
let result;
|
|
|
|
switch (scaleFunc) {
|
|
case 's':
|
|
result = scale(size);
|
|
break;
|
|
case 'vs':
|
|
result = verticalScale(size);
|
|
break;
|
|
case 'ms':
|
|
result = moderateScale(size, scaleFactor);
|
|
break;
|
|
case 'mvs':
|
|
result = moderateVerticalScale(size, scaleFactor);
|
|
break;
|
|
}
|
|
|
|
return shouldRound ? Math.round(result) : result;
|
|
};
|
|
|
|
const scaledSheetCreator = (scale, verticalScale, moderateScale, moderateVerticalScale) => {
|
|
const scaleFunc = scaleByAnnotation(scale, verticalScale, moderateScale, moderateVerticalScale);
|
|
return {
|
|
create: styleSheet => StyleSheet.create(deepMap(styleSheet, scaleFunc))
|
|
};
|
|
};
|
|
|
|
export default scaledSheetCreator; |