/
normalizeUnits.ts
46 lines (39 loc) · 1.44 KB
/
normalizeUnits.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import {
ErrorNormalizeUnits,
ErrorNormalizeUnitsNoRemSize,
ErrorNormalizeUnitsUndefined
} from '../errors/errors';
/**
* @description Normalize and convert units
*/
export function normalizeUnits(
value: number,
currentUnit: string,
newUnit: string,
remSize?: number
): string {
if (!value || !currentUnit || !newUnit) throw Error(ErrorNormalizeUnits);
const rootSize = setRootSize(currentUnit);
const unitSize = setUnitSize(value, newUnit, remSize);
if (rootSize === undefined || unitSize === undefined) throw Error(ErrorNormalizeUnitsUndefined);
return getAdjustedValues(value, rootSize, unitSize, newUnit);
}
function setRootSize(currentUnit: string): number | undefined {
if (currentUnit === 'px' || currentUnit === 'percent') return 1;
return undefined;
}
function setUnitSize(value: number, newUnit: string, remSize?: number): number | undefined {
if (newUnit === 'unitless') return value / 100;
else if (newUnit === 'rem' || newUnit === 'em' || newUnit === 'px') {
if (!remSize) throw Error(ErrorNormalizeUnitsNoRemSize);
return remSize;
} else return undefined;
}
function getAdjustedValues(value: number, rootSize: number, unitSize: number, newUnit: string) {
if (newUnit === 'unitless') return `${unitSize}`;
else if (newUnit === 'px') return `${value}${newUnit}`;
else {
const adjustedValue = rootSize && unitSize ? value * (rootSize / unitSize) : value;
return `${adjustedValue}${newUnit}`;
}
}