Initial Commit

This commit is contained in:
Eric Gullickson
2025-09-17 16:09:15 -05:00
parent 0cdb9803de
commit a052040e3a
373 changed files with 437090 additions and 6773 deletions

View File

@@ -0,0 +1,52 @@
/**
* Normalizes vehicle make and model names for human-friendly display.
* - Replaces underscores with spaces
* - Collapses whitespace
* - Title-cases standard words
* - Uppercases common acronyms (e.g., HD, GT, Z06)
*/
const MODEL_ACRONYMS = new Set([
'HD','GT','GL','SE','LE','XLE','RS','SVT','XR','ST','FX4','TRD','ZR1','Z06','GTI','GLI','SI','SS','LT','LTZ','RT','SRT','SR','SR5','XSE','SEL'
]);
export function normalizeModelName(input?: string | null): string | undefined {
if (input == null) return input ?? undefined;
let s = String(input).replace(/_/g, ' ');
s = s.replace(/\s+/g, ' ').trim();
if (s.length === 0) return s;
const tokens = s.split(' ');
const normalized = tokens.map(t => {
const raw = t;
const upper = raw.toUpperCase();
const lower = raw.toLowerCase();
// Uppercase known acronyms (match case-insensitively)
if (MODEL_ACRONYMS.has(upper)) return upper;
// Tokens with letters+digits (e.g., Z06) prefer uppercase
if (/^[a-z0-9]+$/i.test(raw) && /[a-z]/i.test(raw) && /\d/.test(raw) && raw.length <= 4) {
return upper;
}
// Pure letters: title case
if (/^[a-z]+$/i.test(raw)) {
return lower.charAt(0).toUpperCase() + lower.slice(1);
}
// Numbers or mixed/punctuated tokens: keep as-is except collapse case
return raw;
});
return normalized.join(' ');
}
export function normalizeMakeName(input?: string | null): string | undefined {
if (input == null) return input ?? undefined;
let s = String(input).replace(/_/g, ' ').replace(/\s+/g, ' ').trim();
if (s.length === 0) return s;
const title = s.toLowerCase().split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
// Special cases
if (/^bmw$/i.test(s)) return 'BMW';
if (/^gmc$/i.test(s)) return 'GMC';
if (/^mini$/i.test(s)) return 'MINI';
if (/^mclaren$/i.test(s)) return 'McLaren';
return title;
}