Add next 40 backlog calculators (banana dose, bar/barn, awg-swg)

This commit is contained in:
Codex Agent
2026-03-08 02:58:17 +00:00
parent 962b6d090d
commit 25a671535a
3 changed files with 201 additions and 56 deletions

View File

@@ -1,5 +1,5 @@
// THIS FILE IS AUTO-GENERATED BY migrate.py
export type CalcType = 'standard' | 'inverse' | '3col' | '3col-mul' | 'base' | 'text-bin' | 'bin-text' | 'dms-dd' | 'dd-dms' | 'dec-frac' | 'db-int' | 'db-spl' | 'db-v' | 'db-w' | 'awg' | 'brinell-rockwell' | 'ev-lux' | 'aov' | 'swg' | 'rockwell-vickers' | 'sus-cst' | 'molarity';
export type CalcType = 'standard' | 'inverse' | '3col' | '3col-mul' | 'base' | 'text-bin' | 'bin-text' | 'dms-dd' | 'dd-dms' | 'dec-frac' | 'db-int' | 'db-spl' | 'db-v' | 'db-w' | 'awg' | 'awg-swg' | 'brinell-rockwell' | 'ev-lux' | 'aov' | 'swg' | 'rockwell-vickers' | 'sus-cst' | 'molarity';
export interface CalculatorDef {
slug: string;
@@ -1888,6 +1888,47 @@ export const calculators: CalculatorDef[] = [
{"slug": "attograms-to-troy-ounces", "name": "Attograms to Troy Ounces", "category": "weight", "type": "standard", "labels": {"in1": "Attograms", "in2": "Troy Ounces"}, "factor": 3.215074656862798e-20},
{"slug": "attograms-to-yoctograms", "name": "Attograms to Yoctograms", "category": "weight", "type": "standard", "labels": {"in1": "Attograms", "in2": "Yoctograms"}, "factor": 999999.9999999999},
{"slug": "attograms-to-zeptograms", "name": "Attograms to Zeptograms", "category": "weight", "type": "standard", "labels": {"in1": "Attograms", "in2": "Zeptograms"}, "factor": 1000.0},
{"slug": "awg-to-swg", "name": "Awg to Swg", "category": "electrical", "type": "awg-swg", "labels": {"in1": "Awg", "in2": "Swg"}, "factor": 1},
{"slug": "banana-equivalent-dose-to-becquerel", "name": "Banana Equivalent Dose to Becquerel", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Becquerel"}, "factor": 15.0},
{"slug": "banana-equivalent-dose-to-coulomb-per-kilogram", "name": "Banana Equivalent Dose to Coulomb Per Kilogram", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Coulomb Per Kilogram"}, "factor": 2.94e-09},
{"slug": "banana-equivalent-dose-to-counts-per-minute", "name": "Banana Equivalent Dose to Counts Per Minute", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Counts Per Minute"}, "factor": 900.0},
{"slug": "banana-equivalent-dose-to-curie", "name": "Banana Equivalent Dose to Curie", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Curie"}, "factor": 4.054054054054054e-10},
{"slug": "banana-equivalent-dose-to-disintegrations-per-second", "name": "Banana Equivalent Dose to Disintegrations Per Second", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Disintegrations Per Second"}, "factor": 15.0},
{"slug": "banana-equivalent-dose-to-gray", "name": "Banana Equivalent Dose to Gray", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Gray"}, "factor": 1e-07},
{"slug": "banana-equivalent-dose-to-millirem", "name": "Banana Equivalent Dose to Millirem", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Millirem"}, "factor": 0.009999999999999998},
{"slug": "banana-equivalent-dose-to-millisievert", "name": "Banana Equivalent Dose to Millisievert", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Millisievert"}, "factor": 9.999999999999999e-05},
{"slug": "banana-equivalent-dose-to-picocurie", "name": "Banana Equivalent Dose to Picocurie", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Picocurie"}, "factor": 405.4054054054054},
{"slug": "banana-equivalent-dose-to-rad", "name": "Banana Equivalent Dose to Rad", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Rad"}, "factor": 9.999999999999999e-06},
{"slug": "banana-equivalent-dose-to-rem", "name": "Banana Equivalent Dose to Rem", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Rem"}, "factor": 9.999999999999999e-06},
{"slug": "banana-equivalent-dose-to-roentgen", "name": "Banana Equivalent Dose to Roentgen", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Roentgen"}, "factor": 1.14e-05},
{"slug": "banana-equivalent-dose-to-rutherford", "name": "Banana Equivalent Dose to Rutherford", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Rutherford"}, "factor": 1.5e-05},
{"slug": "banana-equivalent-dose-to-sievert", "name": "Banana Equivalent Dose to Sievert", "category": "radiation", "type": "standard", "labels": {"in1": "Banana Equivalent Dose", "in2": "Sievert"}, "factor": 1e-07},
{"slug": "bar-to-barye", "name": "Bar to Barye", "category": "pressure", "type": "standard", "labels": {"in1": "Bar", "in2": "Barye"}, "factor": 1000000.0},
{"slug": "bar-to-cmhg", "name": "Bar to Cmhg", "category": "pressure", "type": "standard", "labels": {"in1": "Bar", "in2": "Cmhg"}, "factor": 75.00637554192106},
{"slug": "bar-to-dynes-per-sq-cm", "name": "Bar to Dynes Per Sq Cm", "category": "pressure", "type": "standard", "labels": {"in1": "Bar", "in2": "Dynes Per Sq Cm"}, "factor": 1000000.0},
{"slug": "bar-to-feet-of-seawater", "name": "Bar to Feet Of Seawater", "category": "length", "type": "standard", "labels": {"in1": "Bar", "in2": "Feet Of Seawater"}, "factor": 32.5945812686106},
{"slug": "bar-to-feet-of-water", "name": "Bar to Feet Of Water", "category": "length", "type": "standard", "labels": {"in1": "Bar", "in2": "Feet Of Water"}, "factor": 33.49601339491917},
{"slug": "bar-to-hectopascals", "name": "Bar to Hectopascals", "category": "pressure", "type": "standard", "labels": {"in1": "Bar", "in2": "Hectopascals"}, "factor": 1000.0},
{"slug": "bar-to-inches-of-mercury", "name": "Bar to Inches Of Mercury", "category": "pressure", "type": "standard", "labels": {"in1": "Bar", "in2": "Inches Of Mercury"}, "factor": 29.529980164712324},
{"slug": "bar-to-kilopascals", "name": "Bar to Kilopascals", "category": "pressure", "type": "standard", "labels": {"in1": "Bar", "in2": "Kilopascals"}, "factor": 100.0},
{"slug": "bar-to-millibars", "name": "Bar to Millibars", "category": "pressure", "type": "standard", "labels": {"in1": "Bar", "in2": "Millibars"}, "factor": 1000.0},
{"slug": "bar-to-millimeters-of-mercury", "name": "Bar to Millimeters Of Mercury", "category": "pressure", "type": "standard", "labels": {"in1": "Bar", "in2": "Millimeters Of Mercury"}, "factor": 750.0637554192106},
{"slug": "bar-to-pascals", "name": "Bar to Pascals", "category": "pressure", "type": "standard", "labels": {"in1": "Bar", "in2": "Pascals"}, "factor": 100000.0},
{"slug": "bar-to-technical-atmosphere", "name": "Bar to Technical Atmosphere", "category": "pressure", "type": "standard", "labels": {"in1": "Bar", "in2": "Technical Atmosphere"}, "factor": 1.0197162129779282},
{"slug": "bar-to-technical-atmosphere-at", "name": "Bar to Technical Atmosphere (at)", "category": "pressure", "type": "standard", "labels": {"in1": "Bar", "in2": "Technical Atmosphere (at)"}, "factor": 1.0197162129779282},
{"slug": "barns-to-ares", "name": "Barns to Ares", "category": "area", "type": "standard", "labels": {"in1": "Barns", "in2": "Ares"}, "factor": 9.999999999999999e-31},
{"slug": "barns-to-circular-mils", "name": "Barns to Circular Mils", "category": "area", "type": "standard", "labels": {"in1": "Barns", "in2": "Circular Mils"}, "factor": 1.9735252413899847e-19},
{"slug": "barns-to-dunams", "name": "Barns to Dunams", "category": "area", "type": "standard", "labels": {"in1": "Barns", "in2": "Dunams"}, "factor": 9.999999999999999e-32},
{"slug": "barns-to-hectares", "name": "Barns to Hectares", "category": "area", "type": "standard", "labels": {"in1": "Barns", "in2": "Hectares"}, "factor": 9.999999999999999e-33},
{"slug": "barns-to-roods", "name": "Barns to Roods", "category": "area", "type": "standard", "labels": {"in1": "Barns", "in2": "Roods"}, "factor": 9.884215258686612e-32},
{"slug": "barns-to-sections", "name": "Barns to Sections", "category": "area", "type": "standard", "labels": {"in1": "Barns", "in2": "Sections"}, "factor": 3.8610215854244585e-35},
{"slug": "barns-to-square-centimeters", "name": "Barns to Square Centimeters", "category": "area", "type": "standard", "labels": {"in1": "Barns", "in2": "Square Centimeters"}, "factor": 1e-24},
{"slug": "barns-to-square-feet", "name": "Barns to Square Feet", "category": "area", "type": "standard", "labels": {"in1": "Barns", "in2": "Square Feet"}, "factor": 1.0763910416709721e-27},
{"slug": "barns-to-square-inches", "name": "Barns to Square Inches", "category": "area", "type": "standard", "labels": {"in1": "Barns", "in2": "Square Inches"}, "factor": 1.5500031000062e-25},
{"slug": "barns-to-square-kilometers", "name": "Barns to Square Kilometers", "category": "area", "type": "standard", "labels": {"in1": "Barns", "in2": "Square Kilometers"}, "factor": 1e-34},
{"slug": "barns-to-square-miles", "name": "Barns to Square Miles", "category": "area", "type": "standard", "labels": {"in1": "Barns", "in2": "Square Miles"}, "factor": 3.8610215854244585e-35},
];
const slugIndex = new Map(calculators.map(c => [c.slug, c]));

View File

@@ -129,26 +129,47 @@ export function solve(
}
break;
case 'dec-frac':
if (source === 1) {
if (!isNaN(v1)) {
const parts = v1.toString().split('.');
const len = parts[1] ? parts[1].length : 0;
const den = Math.pow(10, len);
const num = v1 * den;
const div = gcd(num, den);
out.val2 = `${num / div}/${den / div}`;
} else { out.val2 = ''; }
} else {
const parts = rawVal2.split('/');
case 'dec-frac': {
// Two calculators share this type:
// - decimal -> fraction
// - fraction -> decimal
// Detect which direction the left field represents via its label.
const fractionFirst = calc.labels.in1.toLowerCase().includes('fraction');
const decimalToFraction = (n: number) => {
if (isNaN(n)) return '';
const parts = n.toString().split('.');
const len = parts[1] ? parts[1].length : 0;
const den = Math.pow(10, len);
const num = n * den;
const div = gcd(num, den);
return `${num / div}/${den / div}`;
};
const fractionToDecimal = (raw: string) => {
const parts = raw.split('/');
if (parts.length === 2 && !isNaN(Number(parts[0])) && !isNaN(Number(parts[1])) && Number(parts[1]) !== 0) {
out.val1 = fmt(Number(parts[0]) / Number(parts[1]));
return fmt(Number(parts[0]) / Number(parts[1]));
}
const f = parseFloat(parts[0]);
return !isNaN(f) ? f.toString() : '';
};
if (fractionFirst) {
if (source === 1) {
out.val2 = fractionToDecimal(rawVal1);
} else {
const f = parseFloat(parts[0]);
out.val1 = !isNaN(f) ? f.toString() : '';
out.val1 = decimalToFraction(v2);
}
} else {
if (source === 1) {
out.val2 = decimalToFraction(v1);
} else {
out.val1 = fractionToDecimal(rawVal2);
}
}
break;
}
case 'db-int':
if (source === 1) {
@@ -232,6 +253,49 @@ export function solve(
break;
}
case 'awg-swg': {
const log92 = Math.log(92);
const awgToDiameterMm = (g: number) => 0.127 * Math.pow(92, (36 - g) / 39);
const diameterMmToAwg = (d: number) => 36 - 39 * Math.log(d / 0.127) / log92;
const swgTable: Record<number, number> = {
0: 8.23, 1: 7.62, 2: 7.01, 3: 6.4, 4: 5.89, 5: 5.385, 6: 4.877,
7: 4.47, 8: 4.064, 9: 3.658, 10: 3.251, 11: 2.946, 12: 2.642, 13: 2.337,
14: 2.032, 15: 1.829, 16: 1.626, 17: 1.422, 18: 1.219, 19: 1.016,
20: 0.914, 21: 0.813, 22: 0.711, 23: 0.61, 24: 0.559, 25: 0.508,
26: 0.457, 27: 0.417, 28: 0.376, 29: 0.345, 30: 0.315, 31: 0.294,
32: 0.274, 33: 0.254, 34: 0.234, 35: 0.213, 36: 0.193,
37: 0.173, 38: 0.152, 39: 0.132, 40: 0.122, 41: 0.112, 42: 0.102,
43: 0.091, 44: 0.081, 45: 0.071, 46: 0.061, 47: 0.051, 48: 0.04,
49: 0.03, 50: 0.025
};
const nearestSwg = (diamMm: number) => {
let bestGauge = 0;
let bestDiff = Number.POSITIVE_INFINITY;
for (const [gStr, d] of Object.entries(swgTable)) {
const diff = Math.abs(diamMm - d);
if (diff < bestDiff) { bestDiff = diff; bestGauge = Number(gStr); }
}
return bestGauge;
};
if (source === 1) {
// AWG -> SWG
if (!isNaN(v1)) {
const diam = awgToDiameterMm(v1);
out.val2 = fmt(nearestSwg(diam));
} else { out.val2 = ''; }
} else {
// SWG -> AWG
if (!isNaN(v2)) {
const diam = swgTable[Math.round(v2)];
if (diam) out.val1 = fmt(diameterMmToAwg(diam));
else out.val1 = '';
} else { out.val1 = ''; }
}
break;
}
case 'ev-lux': {
const isEvFirst = calc.labels.in1.toLowerCase().includes('ev');
const toLux = (ev: number) => 2.5 * Math.pow(2, ev);