From 4029b88e2c79eaed519c829e373ac916f426f311 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Mon, 2 Feb 2026 18:38:26 +0100 Subject: Initial commit --- main.js | 188 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 main.js (limited to 'main.js') diff --git a/main.js b/main.js new file mode 100644 index 0000000..6cb3ca9 --- /dev/null +++ b/main.js @@ -0,0 +1,188 @@ +import { buildGPX } from 'gpx-builder'; +import { OsmAndBuilder } from './OsmAndBuilder/index.ts'; +const { Link, Point } = OsmAndBuilder.MODELS; + +// icons from https://github.com/osmandapp/OsmAnd-resources/tree/master/icons +const ICONS_MAPPING = { + 'src/images/appel22.png': 'shop_greengrocer', + 'src/images/braamboos22.png': 'scrub', + 'src/images/fruit22groen.png': 'vineyard', + 'src/images/garnaal22groen.png': 'reef', // or shop_seafood + 'src/images/noten22groen.png': 'nuts', + 'src/images/overig22groen.png': 'village_green', + 'src/images/paddo22.png': 'military_nuclear_explosion_site', + 'src/images/paddo22groen.png': 'military_nuclear_explosion_site', + 'src/images/peer22.png': 'shop_greengrocer', + 'src/images/planten22groen.png': 'cannabis', // or herbalist + 'src/images/schelp22.png': 'reef', // or shop_seafood + 'src/images/walnoot22.png': 'nuts', +}; +const COLOR_MAPPING_GROUPS = { + 'src/images/garnaal22groen.png': '#f55a52', + 'src/images/noten22groen.png': '#c89760', + 'src/images/overig22groen.png': '#888888', + 'src/images/paddo22.png': '#e2b973', + 'src/images/paddo22groen.png': '#e2b973', + 'src/images/planten22groen.png': '#72a35a', + 'src/images/schelp22.png': '#f55a52', + 'src/images/walnoot22.png': '#c89760', +}; +const COLOR_MAPPING_NAMES = { + 'aalbes': '#da3939', + 'aardbei': '#cf0e08', + 'Amerikaanse_kornoelje': '#e8e9e5', + 'appel': '#da233d', + 'bosbes': '#5a637f', + 'braam': '#060910', + 'druif': '#95b2e2', + 'duindoorn': '#f08916', + 'framboos': '#e53351', + 'gele_kornoelje': '#dfc428', + 'Japanse_Kornoelje': '#dee0e5', + 'jeverbes': '#5f7b98', + 'kers': '#853149', + 'kiwi': '#8bbb2b', + 'krentenboom': '#6d659a', + 'lampionplant': '#f59317', + 'Lijsterbes': '#f35436', + 'linde': '#a0d031', + 'mirabellen': '#e0b630', + 'mispel': '#c76f42', + 'Moerbei': '#19172b', + 'papiermoerbei': '#e12f20', + 'peer': '#b6bd33', + 'pruim': '#955e87', + 'rode_bes': '#da3939', + 'rozenbottel': '#ea1b31', + 'sleedoorn': '#7e93bf', + 'vijg': '#7b6178', + 'vlierbes': '#0e0d12', + 'vossenbes': '#f21900', +}; + +let icons = {}; +let colors = {}; + +fetch('https://app.wildplukwijzer.nl/leafle.js') + .then(response => { + if (!response.ok) + throw new Error (`Failed to retrieve Wildplukwijzer data (${response.status})`); + return response.text(); + }) + .then(response => { + response = response + .split('\n') + .filter(line => line.match(/ = new markerIcon/)) + .map(line => line + .replace(/^(var )?icon_/, 'icons[\'') + .replace(' = new markerIcon({ iconUrl: ', '\'] = ') + .replace(' })', '')) + .join('\n'); + eval(response); + for (let k in icons) { + colors[k] = k in COLOR_MAPPING_NAMES ? COLOR_MAPPING_NAMES[k] : COLOR_MAPPING_GROUPS[icons[k]]; + icons[k] = ICONS_MAPPING[icons[k]]; + } + }).then(() => +fetch('https://app.wildplukwijzer.nl/?hideheader=true')) + .then(response => { + if (!response.ok) + throw new Error (`Failed to retrieve Wildplukwijzer data (${response.status})`); + return response.text(); + }) + .then(response => { + // Extract the relevant JavaScript code from the response + response = response.split('\n'); + let line = null; + do line = response.shift(); while (!line.match(/let AllMarkers = /)); + + // A Leaflet shim with the functions expected by the code we'll extract + let L = { + layerGroup: () => [], + marker: (latlng, settings) => { + if (!settings.icon) + throw new Error(`unknown icon ${settings.icon}`); + let obj = { + lat: latlng[0], + lng: latlng[1], + icon: settings.icon, + }; + obj.addTo = function (soort) { + soort = soort.replace(/ /g, '_'); + if (!(soort in colors)) + throw new Error(`${soort} not in colors`); + obj.color = colors[soort]; + return obj; + }; + obj.bindPopup = function (desc, settings) { + obj.name = desc + .replace(/^.*

(.*)<\/h1>.*$/s, '$1') + .replace(/^./, c => c.toUpperCase()) + .replace(/_/g, ' '); + + obj.type = obj.name; + + obj.img = desc + .replace(/^.*/s, '') + .replace('

Informatie over de plukplek

', '') + .replace(/