53 lines
1.9 KiB
TypeScript
53 lines
1.9 KiB
TypeScript
/**
|
||
* 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;
|
||
const 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;
|
||
}
|
||
|