traxxx/src/utils/convert.js

134 lines
2.8 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
const { convert, convertMany } = require('convert');
const { decode } = require('html-entities');
const logger = require('../logger')(__filename);
function inchesToCm(inches) {
if (!inches) return null;
return Math.round(Number(inches) * 2.54);
}
function feetInchesToCm(feet, inches) {
if (!feet && !inches) return null;
if (typeof feet === 'string' && !inches) {
const [feetPart, inchesPart] = feet.match(/\d+/g);
return feetInchesToCm(Number(feetPart), Number(inchesPart));
}
return Math.round((Number(feet) * 30.48) + ((Number(inches) || 0) * 2.54));
}
function cmToFeetInches(centimeters) {
if (!centimeters) return null;
const feet = Math.floor(centimeters / 30.48);
const inches = Math.round((centimeters / 2.54) % (feet * 12));
return { feet, inches };
}
function cmToInches(centimeters) {
return centimeters / 2.54;
}
function heightToCm(height) {
if (!height) return null;
const [feet, inches] = height.match(/\d+/g);
return feetInchesToCm(feet, inches);
}
function lbsToKg(lbs) {
if (!lbs) return null;
const pounds = lbs.toString().match(/\d+/)[0];
return Math.round(Number(pounds) * 0.453592);
}
function kgToLbs(kgs) {
if (!kgs) return null;
const kilos = kgs.toString().match(/\d+/)[0];
return Math.round(Number(kilos) / 0.453592);
}
function curateConvertInput(string) {
if (/[']|(fe*o*t)/.test(string)) {
const result = string.match(/(\d+).*?(\d+)/);
if (result) {
return `${result[1]}ft ${result[2]}in`;
}
}
return string;
}
function convertManyApi(input, to) {
const curatedInput = curateConvertInput(input);
return Math.round(convertMany(curatedInput).to(to)) || null;
}
function convertApi(rawInput, fromOrTo, to) {
if (!rawInput) {
return null;
}
const input = decode(rawInput); // remove html entities, e.g. 5' 8" for 5' 8"
try {
if (typeof input === 'string' && to === undefined) {
return convertManyApi(input, fromOrTo);
}
const inputNumber = Number(typeof input === 'string' ? input.match(/\d+(\.\d+)?/)?.[0] : input);
return Math.round(convert(inputNumber, fromOrTo).to(to)) || null;
} catch (error) {
logger.error(error);
return null;
}
}
function maleFeetUsToEu(input) {
if (!input) {
return null;
}
const size = Number(input.toString().match(/\d+(\.\d+)?/)?.[0]);
return Math.round((1.27 * size + 29.94) / 0.5) * 0.5; // round to nearest half
}
function femaleFeetUsToEu(input) {
if (!input) {
return null;
}
const size = Number(input.toString().match(/\d+(\.\d+)?/)?.[0]);
// return Math.round((1.27 * size + 28.67) / 0.5) * 0.5; // round to nearest half
return Math.round(1.27 * size + 28.67);
}
module.exports = {
cmToFeetInches,
cmToInches,
feetInchesToCm,
heightToCm,
inchesToCm,
lbsToKg,
kgToLbs,
maleFeetUsToEu,
femaleFeetUsToEu,
convert: convertApi,
};