diff --git a/scripts/parse-maps.js b/scripts/parse-maps.js index 31539ee..c4194a1 100644 --- a/scripts/parse-maps.js +++ b/scripts/parse-maps.js @@ -6,6 +6,8 @@ const inputDir = './static/mapFiles/yaml'; const outputDir = './static/mapFiles/json'; const indexFile = './static/map-index.json'; +const noiseRegex = /\s+(single line|junction|jn|junc|jct|gf|north|south|east|west)\.?$/i; + if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir, { recursive: true }); const mapList = []; @@ -18,12 +20,37 @@ fs.readdirSync(inputDir).forEach((file) => { const fileName = file.replace('.yaml', '.json'); fs.writeFileSync(path.join(outputDir, fileName), JSON.stringify(content)); + const contentSet = new Set(); + +if (Array.isArray(content.routeDetail)) { + content.routeDetail.forEach(item => { + if ((item.type === 'junction' || item.type === 'station') && item.name) { + let cleanName = item.name; + + // Run the replacement in a loop or twice to catch nested noise + // e.g., "Reading West Junction" + // Pass 1: "Reading West" + // Pass 2: "Reading" + let previousName; + do { + previousName = cleanName; + cleanName = cleanName.replace(noiseRegex, '').trim(); + } while (cleanName !== previousName); + + if (cleanName) { + contentSet.add(cleanName); + } + } + }); +} + mapList.push({ routeId: content.routeId || null, routeStart: content.routeStart || null, routeEnd: content.routeEnd || null, created: content.created || null, - checked: content.checked || null + checked: content.checked || null, + contents: Array.from(contentSet), }); } }); diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index f4ca3ca..e919cee 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -2,19 +2,23 @@ import logo from '$lib/assets/round-logo-text.svg'; import type { PageData } from './$types'; import { resolve } from '$app/paths'; - export let data: PageData; - import favicon from '$lib/assets/favicon.svg'; + + let { data }: { data: PageData } = $props(); + let searchTerm = $state(''); - let searchTerm = ''; + let filteredMaps = $derived( + data.maps.filter((m) => { + const term = searchTerm.toLowerCase(); - $: filteredMaps = data.maps.filter( - (m) => - m.routeId.toString().includes(searchTerm) || - m.routeStart.toLowerCase().includes(searchTerm.toLowerCase()) || - m.routeEnd.toLowerCase().includes(searchTerm.toLowerCase()) + if (m.routeId.toString().includes(term)) return true; + + return m.contents.some(location => + location.toLowerCase().includes(term) + ); + }) ); - const vibrate = (patern: number | number[] = 10) => { + const vibrate = (pattern: number | number[] = 10) => { if (typeof window !== 'undefined' && window.navigator.vibrate) { window.navigator.vibrate(pattern); } @@ -53,21 +57,20 @@ alt="OwlBoard Logo" class="main-logo" /> -