UNPKG

@cityssm/street-name-normalize

Version:

Takes street names with various abbreviations and attempts to expand them.

31 lines (30 loc) 1.74 kB
import hasOwn from 'object.hasown'; import { applyCase, classifyStreetNamePiece, normalizeStreetNamePiece } from './helpers.js'; import { DEFAULT_OPTIONS } from './options.js'; if (!Object.hasOwn) { Object.hasOwn = hasOwn; } export function normalizeStreetName(unnormalizedStreetName, userOptions = {}) { const options = Object.assign({}, DEFAULT_OPTIONS, userOptions); const unnormalizedStreetNamePieces = (unnormalizedStreetName ?? '').split(' '); const normalizedStreetNamePieces = []; let currentStreetNamePieceType = ''; for (const unnormalizedStreetNamePiece of unnormalizedStreetNamePieces) { if (unnormalizedStreetNamePiece === '') { continue; } currentStreetNamePieceType = Object.hasOwn(options.classifyStreetNamePieceOverrides, unnormalizedStreetNamePiece.toLowerCase()) ? options.classifyStreetNamePieceOverrides[unnormalizedStreetNamePiece.toLowerCase()] : classifyStreetNamePiece(unnormalizedStreetNamePiece, currentStreetNamePieceType); let normalizedStreetNamePiece = normalizeStreetNamePiece(unnormalizedStreetNamePiece, currentStreetNamePieceType); if (currentStreetNamePieceType === 'name' && Object.hasOwn(options.namePieceSubstitutions, normalizedStreetNamePiece.toLowerCase())) { normalizedStreetNamePiece = options.namePieceSubstitutions[normalizedStreetNamePiece.toLowerCase()]; } normalizedStreetNamePiece = applyCase(normalizedStreetNamePiece, options.outputCase); normalizedStreetNamePieces.push(normalizedStreetNamePiece); } return normalizedStreetNamePieces.join(' '); } export default normalizeStreetName;