mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 18:34:02 +00:00
- One place-name key for server and tiles, so "St. Paul" and "Saint Paul"
agree in Nominatim name checks.
- Tile street names: a lone letter is a direction only beside another name
word ("E Street" is not "East Street"), and a trailing quadrant ("E St NW")
may go unsaid in the ask.
- A building cut at the tile edge that is nearer the point than any whole
one leaves the point instead of a farther neighbour standing in; an edge
without a tile buffer counts as a cut, so a cut area never answers grounds.
- A batch building install re-judges only results that installed; a late
timeout during caption conversion keeps the pending point drawn; a failed
plain recaption keeps the old mark addressable.
- An interrupted Nominatim dispatch is reclaimed by the next lock owner ten
minutes after the start its marker names; node:sqlite loads on first use
without its experimental warning.
- PHOTON_URL accepts only https, which the page's connect-src allows.
- Shared OpenFreeMap tiles decode each layer when a consumer first selects
it; outline selection reuses the shared ring area and simplification, and
ground probes the shared ring centroid; the grounds word list lives once.
45 lines
1.3 KiB
JavaScript
45 lines
1.3 KiB
JavaScript
/** Latin letters that Unicode decomposition does not fold to plain ASCII. */
|
||
const FOLD = {
|
||
ß: 'ss',
|
||
ø: 'o',
|
||
æ: 'ae',
|
||
ł: 'l',
|
||
đ: 'd',
|
||
ı: 'i',
|
||
œ: 'oe',
|
||
þ: 'th',
|
||
};
|
||
|
||
/**
|
||
* Comparable form of a place name, shared by the bundled packs, the
|
||
* OpenFreeMap street and grounds matchers and the Nominatim server: case
|
||
* folded, accents removed from Latin letters only, punctuation and symbols
|
||
* collapsed to single spaces, and a leading "the" dropped. Other scripts keep
|
||
* their marks, so "कुल मार्ग" and "काली मार्ग" stay distinct while "São Paulo",
|
||
* "sao paulo" and "SÃO PAULO!" meet.
|
||
*
|
||
* @param {unknown} value
|
||
* @returns {string}
|
||
*/
|
||
export function foldPlaceName(value) {
|
||
return String(value ?? '')
|
||
.toLowerCase()
|
||
.replace(/[ßøæłđıœþ]/g, (c) => FOLD[c])
|
||
.normalize('NFKD')
|
||
.replace(/(\p{Script=Latin})\p{M}+/gu, '$1')
|
||
.normalize('NFKC')
|
||
.replace(/[^\p{L}\p{M}\p{N}]+/gu, ' ')
|
||
.trim()
|
||
.replace(/^the /, '');
|
||
}
|
||
|
||
/**
|
||
* Fold a name for matching (see `foldPlaceName`), with "saint" and "sainte"
|
||
* shortened the way US place names abbreviate them.
|
||
*/
|
||
export function normalizePlaceName(value) {
|
||
return foldPlaceName(value)
|
||
.replace(/\bsaint\b/g, 'st')
|
||
.replace(/\bsainte\b/g, 'ste');
|
||
}
|