From 253c24e30a535bf9ec7a89bba874dbac9d312ed6 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 2 Sep 2025 13:17:45 +0000 Subject: [PATCH] Markers --- index.html | 1 - markers.js | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index bbc9e47..3a40336 100644 --- a/index.html +++ b/index.html @@ -119,7 +119,6 @@ if (hash.length >= 2) { } } - new CenteredTiles({ tileSize: TILE, noWrap: true, diff --git a/markers.js b/markers.js index e69de29..3f28bb3 100644 --- a/markers.js +++ b/markers.js @@ -0,0 +1,91 @@ +// === CONFIG === +const WIKI_API = 'https://wiki.arenos.danielnagel.at/api.php'; // dein Wiki-Host (mit index.php) +const CATEGORY_TITLE = 'Kategorie:Orte'; // Hauptkategorie +const MAX_PAGES = 500; // genug Luft + +// Hilfsfunktion: MediaWiki API-URL bauen +function apiURL(params) { + const u = new URL(WIKI_API); + u.search = new URLSearchParams({ ...params, format: 'json', origin: '*' }).toString(); + return u.toString(); +} + +// 1) Alle Mitglieder einer Kategorie holen +async function fetchCategoryMembers(categoryTitle) { + const url = apiURL({ + action: 'query', + list: 'categorymembers', + cmtitle: categoryTitle, + cmlimit: String(MAX_PAGES) + }); + const res = await fetch(url); + if (!res.ok) throw new Error(`categorymembers failed: ${res.status}`); + const data = await res.json(); + return data?.query?.categorymembers || []; +} + +// 2) Gerendertes HTML einer Seite holen (damit
drin ist) +async function fetchPageHTML(title) { + const url = apiURL({ + action: 'parse', + page: title, + prop: 'text' + }); + const res = await fetch(url); + if (!res.ok) throw new Error(`parse failed for ${title}: ${res.status}`); + const data = await res.json(); + const html = data?.parse?.text?.['*'] || ''; + const div = document.createElement('div'); + div.innerHTML = html; + return div; +} + +// 3) Daten aus dem versteckten Div extrahieren +function extractPlaceData(container) { + const node = container.querySelector('.place-data'); + if (!node) return null; + const name = node.getAttribute('data-name') || ''; + const xStr = node.getAttribute('data-x') || ''; + const yStr = node.getAttribute('data-y') || ''; + const desc = node.getAttribute('data-description') || ''; + const link = node.getAttribute('data-link') || ''; + const x = parseFloat(xStr); + const y = parseFloat(yStr); + if (Number.isNaN(x) || Number.isNaN(y)) return null; + return { name, x, y, desc, link }; +} + +// 4) Marker laden + hinzufügen +async function loadWikiMarkers(map) { + try { + const pages = await fetchCategoryMembers(CATEGORY_TITLE); + + // Optionales Bounding, falls du später auto-fit willst + const layers = []; + for (const p of pages) { + try { + const html = await fetchPageHTML(p.title); + const d = extractPlaceData(html); + if (!d) continue; + + // Leaflet: Bei CRS.Simple = [y, x] + const m = L.marker([d.y, d.x]).addTo(map); + const wikiLink = d.link || `https://wiki.arenos.danielnagel.at/index.php/${encodeURIComponent(p.title)}`; + const popup = ` + ${d.name || p.title}
+ ${d.desc ? `${d.desc}
` : ''} + Open in Wiki + `; + m.bindPopup(popup); + layers.push(m); + + } catch (e) { + console.warn('skip page due to parse error:', p.title, e); + } + } + + } catch (e) { + console.error('Failed to load wiki markers:', e); + } +} +