waffensachkunde

Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.

/ app src main oberflaeche.ts

1,7 KB Rohdatei
app/src/main/oberflaeche.ts — 51 Zeilen
1 /**
2 * Wo die Oberfläche liegt – eine einzige Quelle für Fenster und Sperre.
3 *
4 * `fenster.ts` lädt diese Datei, `sicherheit.ts` lässt genau sie als
5 * Navigationsziel zu. Stünde der Pfad an beiden Stellen, könnten sie
6 * auseinanderlaufen – und zwar in die gefährliche Richtung: Die Sperre
7 * verböte dann entweder die eigene Seite oder ließe eine fremde durch.
8 */
9
10 import { join } from 'node:path';
11 import { pathToFileURL } from 'node:url';
12
13 /**
14 * Pfad der gebauten `index.html`.
15 *
16 * Relativ zum Ausgabeverzeichnis des Main-Prozesses (`out/main`), in das
17 * electron-vite dieses Modul bündelt.
18 */
19 export function oberflaechenDatei(): string {
20 return join(__dirname, '../renderer/index.html');
21 }
22
23 /** Dieselbe Datei als `file:`-URL, wie Electron sie beim Laden erzeugt. */
24 export function oberflaechenUrl(): string {
25 return pathToFileURL(oberflaechenDatei()).href;
26 }
27
28 /**
29 * Meinen zwei `file:`-URLs dieselbe Datei?
30 *
31 * Hash und Query bleiben außer Betracht – Sprungziele innerhalb der eigenen
32 * Seite sind unbedenklich. Groß- und Kleinschreibung ebenfalls: Unter Windows
33 * ist derselbe Pfad unabhängig davon dieselbe Datei, und der
34 * Laufwerksbuchstabe kommt nicht immer gleich geschrieben an.
35 *
36 * Als reine Funktion herausgezogen, damit sie ohne Electron prüfbar ist.
37 */
38 export function istGleicheDatei(ziel: string, eigene: string): boolean {
39 try {
40 const a = new URL(ziel);
41 const b = new URL(eigene);
42 if (a.protocol !== 'file:' || b.protocol !== 'file:') {
43 return false;
44 }
45 return (
46 decodeURIComponent(a.pathname).toLowerCase() === decodeURIComponent(b.pathname).toLowerCase()
47 );
48 } catch {
49 return false;
50 }
51 }