mirror of
https://github.com/koala73/worldmonitor.git
synced 2026-04-25 17:14:57 +02:00
- Generate static location map from eladnava/pikud-haoref-api cities.json (1,478 entries) - Lazy-load translations in oref-alerts.ts with retry on failure - Add dispatchOrefBreakingAlert() with stable dedupe key and global cooldown bypass - Wire oref siren alerts into breaking news banner on initial fetch and polling updates
69 lines
2.3 KiB
JavaScript
69 lines
2.3 KiB
JavaScript
#!/usr/bin/env node
|
|
// Generates src/services/oref-locations.ts from eladnava/pikud-haoref-api cities.json
|
|
// Source: https://github.com/eladnava/pikud-haoref-api
|
|
// Run: node scripts/generate-oref-locations.mjs
|
|
|
|
import { writeFileSync } from 'fs';
|
|
import { join, dirname } from 'path';
|
|
import { fileURLToPath } from 'url';
|
|
|
|
const COMMIT_SHA = 'master';
|
|
const CITIES_URL = `https://raw.githubusercontent.com/eladnava/pikud-haoref-api/${COMMIT_SHA}/cities.json`;
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
const OUTPUT = join(__dirname, '..', 'src', 'services', 'oref-locations.ts');
|
|
|
|
function normalize(s) {
|
|
return s.normalize('NFKC').trim().replace(/\s+/g, ' ');
|
|
}
|
|
|
|
async function main() {
|
|
console.log('Fetching cities.json...');
|
|
const res = await fetch(CITIES_URL);
|
|
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
const cities = await res.json();
|
|
|
|
const map = new Map();
|
|
for (const c of cities) {
|
|
if (!c.name || !c.name_en || c.id === 0) continue;
|
|
const key = normalize(c.name);
|
|
if (!map.has(key)) map.set(key, c.name_en);
|
|
// Also add zone translations
|
|
if (c.zone && c.zone_en) {
|
|
const zoneKey = normalize(c.zone);
|
|
if (!map.has(zoneKey)) map.set(zoneKey, c.zone_en);
|
|
}
|
|
}
|
|
|
|
const sorted = [...map.entries()].sort((a, b) => a[0].localeCompare(b[0], 'he'));
|
|
|
|
const lines = [
|
|
'// Auto-generated by scripts/generate-oref-locations.mjs',
|
|
'// Source: https://github.com/eladnava/pikud-haoref-api/blob/master/cities.json',
|
|
`// Generated: ${new Date().toISOString().slice(0, 10)}`,
|
|
`// Entries: ${sorted.length}`,
|
|
'',
|
|
'const OREF_LOCATIONS: Record<string, string> = {',
|
|
];
|
|
|
|
for (const [heb, eng] of sorted) {
|
|
const escapedKey = heb.replace(/'/g, "\\'");
|
|
const escapedVal = eng.replace(/'/g, "\\'");
|
|
lines.push(` '${escapedKey}': '${escapedVal}',`);
|
|
}
|
|
|
|
lines.push('};');
|
|
lines.push('');
|
|
lines.push('export function translateLocation(hebrew: string): string {');
|
|
lines.push(" if (!hebrew) return hebrew;");
|
|
lines.push(" const key = hebrew.normalize('NFKC').trim().replace(/\\s+/g, ' ');");
|
|
lines.push(' return OREF_LOCATIONS[key] ?? hebrew;');
|
|
lines.push('}');
|
|
lines.push('');
|
|
|
|
writeFileSync(OUTPUT, lines.join('\n'));
|
|
console.log(`Wrote ${sorted.length} entries to ${OUTPUT}`);
|
|
}
|
|
|
|
main().catch(e => { console.error(e); process.exit(1); });
|