Skip to content

Architektur des Helpers

Ein Code-Überblick zur Orientierung vor dem Beitragen. Der Einstiegspunkt ist main.user.ts; alles andere lebt in src/. Die genannten Dateien sind die Quelle der Wahrheit; diese Seite kartiert sie nur.

Ablauf beim Start

main.user.ts wartet auf die Initialisierung des SDK und führt dann aus:

  1. unsafeWindow.SDK_INITIALIZED → holt die Instanz via unsafeWindow.getWmeSdk({ scriptId, scriptName }).
  2. activateLanguage(): liest die WME-Locale und richtet i18next darauf aus.
  3. createLayers(): instanziiert jede Ebene und legt sie in einer Map<string, Layer> ab.
  4. addScriptTab(): registriert den Skript-Tab (wmeSDK.Sidebar.registerScriptTab()) und füllt ihn.
  5. Beim Ereignis wme-ready: restoreState() für jede Ebene (stellt angehakte Kästchen und Renderings wieder her).

Das Ebenenmodell

Die gesamte Kartenlogik ist um eine Ebenenhierarchie organisiert. Jede Ebene besitzt ihr Kästchen im Ebenenwähler, ihre Ereignisse und ihre Persistenz.

KlasseDateiRolle
Layer (abstrakt)src/layer.tsFundament: fügt das Kästchen hinzu (LayerSwitcher.addLayerCheckbox), verwaltet den Toggle (wme-layer-checkbox-toggled → speichern + addToMap/removeFromMap), stellt den Zustand wieder her.
TileLayersrc/tileLayer.tsRaster-Ebene (swisstopo-WMTS-Kacheln). Konfigurationsgesteuert: name, servers, tileWidth/Height, fileName, zIndex.
FeatureLayer (abstrakt)src/featureLayer.tsVektor-Ebene. Verwaltet render / Neufilterung / Klicks / wme-map-move-end. Unterklassen implementieren: fetchData (async Generator), mapRecordToFeature, getRecordId, shouldDrawRecord, featureClicked.

Zustand persistiert via src/storage.ts (saveLayerState, isLayerEnabled).

Seitenleiste

Die Tab-UI ist ein Baum von Elementen (src/sidebar.ts): SidebarTab enthält SidebarSection, Paragraph und SidebarItem. Jedes Element hat eine render()-Methode, die HTML erzeugt; das Ganze wird in tabPane.innerHTML eingefügt.

Übersetzungen

i18next, Namespace common. Schlüssel werden über i18next.t("common:...", "fallback") aufgelöst und leben in locales/<lang>/common.json (de, en, fr, it), verdrahtet über locales/i18n.

Build-Kette

main.user.ts + src/  →  Rollup  →  .out/main.user.js  →  + header.js  →  releases/*.user.js

npm run watch lässt diese Kette fortlaufend laufen; npm run build einmal.

Karte von src/

  • Ebenen: layer.ts, tileLayer.ts, featureLayer.ts, sbbDataLayer.ts, publicTransportStopsLayer.ts, clusterManager.ts
  • Pipeline ÖV-Haltestellen: stopCityMatcher.ts, stopGeometry.ts, stopNameCleaner.ts, stopNameFormatter.ts, stopValidity.ts (+ ihre *.test.ts)
  • POIs / Venues: venueMatcher.ts, wazeVenueFetcher.ts
  • Strassennamen-Prüfung: street-name-checker/ (separates Modul)
  • Infra: storage.ts, utils.ts, reloadButton.ts

Separate Module

Der Strassennamen-Prüfer (initStreetNameChecker) läuft mit seinem eigenen scriptId und seinem eigenen Tab; registerScriptTab() wirft einen Fehler, wenn der scriptId des Hosts bereits einen Tab besitzt.

Déjouons le trafic, ensembleGemeinsam dem Verkehr entfliehenSuperiamo il traffico, tutti assiemeOutsmarting traffic, together

Waze Community Schweiz · Community-Dokumentation, nicht mit Waze/Google verbunden