Initial Commit
This commit is contained in:
52
backend/src/features/vehicles/domain/name-normalizer.ts
Normal file
52
backend/src/features/vehicles/domain/name-normalizer.ts
Normal 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user