1
0
Fork 0
freesewing/packages/components/src/utils/index.js

162 lines
4.1 KiB
JavaScript
Raw Normal View History

// Needed to use JSX
import React from "react";
export const smallestImperialStep = 0.396875;
export const roundMm = (val, units) => {
if (units === "imperial") return Math.round(val * 1000000) / 1000000;
else return Math.round(val * 10) / 10;
};
export const roundMmDown = (val, units) => {
if (units === "imperial") return val - (val % smallestImperialStep);
else return Math.floor(val * 10) / 10;
};
export const roundMmUp = (val, units) => {
if (units === "imperial") return val - (val % 0.396875);
else return Math.ceil(val * 10) / 10;
};
const formatImperial = (
neg,
inch,
numo = false,
deno = false,
format = "html"
) => {
if (format === "html") {
if (numo)
return (
<span>
{neg}
{inch} <sup>{numo}</sup>/<sub>{deno}</sub>"
</span>
);
else
return (
<span>
{neg}
{inch}"
</span>
);
} else {
if (numo) return neg + inch;
else return neg + inch + " " + numo + "/" + deno;
}
};
export const formatMm = (val, units, format = "html") => {
val = roundMm(val);
let H = format === "html" ? true : false;
if (units === "imperial") {
if (val == 0) return formatImperial("", 0, false, false, format);
let negative = "";
let inches = "";
let rest = "";
let fraction = val / 25.4;
if (fraction < 0) {
fraction = fraction * -1;
negative = "-";
}
if (Math.abs(fraction) < 1) rest = fraction;
else {
inches = Math.floor(fraction);
rest = fraction - inches;
}
let fraction128 = Math.round(rest * 128);
if (fraction128 == 0) return formatImperial(negative, inches);
if (fraction128 % 64 == 0)
return formatImperial(negative, inches, fraction128 / 64, 2);
if (fraction128 % 32 == 0)
return formatImperial(negative, inches, fraction128 / 32, 4);
if (fraction128 % 16 == 0)
return formatImperial(negative, inches, fraction128 / 16, 8);
if (fraction128 % 8 == 0)
return formatImperial(negative, inches, fraction128 / 8, 16);
if (fraction128 % 4 == 0)
return formatImperial(negative, inches, fraction128 / 4, 32);
if (fraction128 % 2 == 0)
return formatImperial(negative, inches, fraction128 / 2, 64);
return negative + fraction;
} else {
if (format === "html") return roundMm(val / 10) + "cm";
else return roundMm(val / 10);
}
};
export const defaultSa = {
imperial: 15.875,
metric: 10
};
export const sliderStep = {
metric: 0.1,
imperial: 0.396875
};
export const optionType = option => {
if (typeof option === "object") {
if (typeof option.pct !== "undefined") return "pct";
if (typeof option.mm !== "undefined") return "mm";
if (typeof option.deg !== "undefined") return "deg";
if (typeof option.count !== "undefined") return "count";
if (typeof option.bool !== "undefined") return "bool";
if (typeof option.list !== "undefined") return "list";
return "unknown";
}
return "constant";
};
export const defaultGist = {
settings: {
embed: true,
sa: 0,
complete: true,
paperless: false,
locale: "en",
units: "metric",
margin: 2,
options: {}
}
};
export const gistDefaults = (config, gist) => {
let options = {};
for (let option of Object.keys(config.options)) {
if (
typeof gist.options !== "undefined" &&
typeof gist.options[option] !== undefined
)
options[option] = gist.options[option];
else options[option] = optionDefault(config.options[option]);
}
delete gist.options;
let settings = JSON.parse(JSON.stringify(defaultGist.settings));
delete settings.locale;
delete settings.units;
for (let setting of Object.keys(settings)) {
if (typeof gist.settings[setting] !== undefined) {
settings[setting] = gist.settings[setting];
}
}
settings.options = options;
return settings;
};
export const optionDefault = option => {
let type = optionType(option);
switch (optionType(option)) {
case "constant":
return option;
break;
case "list":
return option.dflt;
break;
default:
return option[type];
}
};