waffensachkunde

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

/ app src shared begriffsbruecke.ts

3,9 KB Rohdatei
app/src/shared/begriffsbruecke.ts — 100 Zeilen
1 /**
2 * Vom Wort des Prüflings zum Wort des Katalogs.
3 *
4 * ## Warum es das gibt
5 *
6 * Der Wortschatz eines Kursteilnehmers ist nicht der des Gesetzgebers.
7 * Nachgemessen am amtlichen Katalog finden **null Fragen**: „Diebstahl“,
8 * „gestohlen“, „verloren“, „Pfefferspray“, „Elektroschocker“, „Umzug“,
9 * „Todesfall“, „Springmesser“. Der Katalog sagt stattdessen „abhanden“,
10 * „Reizstoff“, „Elektroimpulsgerät“, „Wohnung“, „verstorben“. Das sind genau
11 * die Wörter, die niemand tippt, der sie noch nicht kennt – und das ist die
12 * erste Suche, die ein Kursteilnehmer eintippt.
13 *
14 * ## Warum als Festwert im Quelltext und nicht als Inhaltsdatei
15 *
16 * Dieselbe Überlegung wie bei `hilfe.ts` und `kontakt.ts`: Die Liste ist
17 * klein, sie gehört zur Bedienung und nicht zum Lehrstoff, und sie ist mit
18 * dem Quelltext versioniert und getestet. Eine eigene Inhaltsdatei brächte
19 * Schema, Validierung im Hauptprozess, einen Ladeweg und einen
20 * Pflegeprozess – für zwei Dutzend Wortpaare.
21 *
22 * ## Sie wirkt sichtbar, nie heimlich
23 *
24 * Es findet **keine** stille Erweiterung der Suche statt. Die Brücke wird als
25 * Angebot mit der Zahl in der Beschriftung gezeigt: „Der Katalog nennt das
26 * ‚Sicherheitsbehältnis‘ – auch danach suchen (23 Fragen)“. Wer eine
27 * Trefferliste sieht, soll wissen, wonach gesucht wurde.
28 *
29 * ## Was sie nicht ist
30 *
31 * Kein Glossar – das erklärt Begriffe und steht in `content/glossar.json`.
32 * Kein Stemmer und keine Tippfehlertoleranz. Nur eine Übersetzung zwischen
33 * zwei Wortschätzen, für die Fälle, in denen der Katalog schweigt.
34 */
35
36 export interface Brueckeneintrag {
37 /** Wörter, die jemand tippt, der die Fachsprache nicht kennt. */
38 readonly gesucht: readonly string[];
39 /** Wörter, unter denen der Katalog dieselbe Sache führt. */
40 readonly katalog: readonly string[];
41 }
42
43 export const BEGRIFFSBRUECKE: readonly Brueckeneintrag[] = Object.freeze([
44 Object.freeze({
45 gesucht: Object.freeze(['tresor', 'waffenschrank', 'panzerschrank', 'safe', 'stahlschrank']),
46 katalog: Object.freeze(['Sicherheitsbehältnis', 'Widerstandsgrad', 'Aufbewahrung']),
47 }),
48 Object.freeze({
49 gesucht: Object.freeze([
50 'diebstahl',
51 'gestohlen',
52 'geklaut',
53 'klauen',
54 'verloren',
55 'weggekommen',
56 'einbruch',
57 ]),
58 katalog: Object.freeze(['abhanden', 'Verlust', 'unverzüglich']),
59 }),
60 Object.freeze({
61 gesucht: Object.freeze(['pfefferspray', 'reizgas', 'tränengas', 'cs-gas', 'abwehrspray']),
62 katalog: Object.freeze(['Reizstoff']),
63 }),
64 Object.freeze({
65 gesucht: Object.freeze(['elektroschocker', 'taser', 'schocker']),
66 katalog: Object.freeze(['Elektroimpulsgerät']),
67 }),
68 Object.freeze({
69 gesucht: Object.freeze(['springmesser', 'butterflymesser', 'faustmesser', 'klappmesser']),
70 katalog: Object.freeze(['Messer', 'Hieb', 'Stoß']),
71 }),
72 Object.freeze({
73 gesucht: Object.freeze(['erbwaffe', 'geerbt', 'vererbt', 'todesfall', 'gestorben', 'nachlass']),
74 katalog: Object.freeze(['Erbe', 'verstorben', 'Blockiersystem']),
75 }),
76 Object.freeze({
77 gesucht: Object.freeze(['umzug', 'umgezogen', 'ummelden', 'adressänderung', 'wohnungswechsel']),
78 katalog: Object.freeze(['Wohnung', 'anzeigen']),
79 }),
80 Object.freeze({
81 gesucht: Object.freeze(['nachtsichtgerät', 'laserpointer', 'zielhilfe', 'rotpunkt']),
82 katalog: Object.freeze(['Zielscheinwerfer']),
83 }),
84 Object.freeze({
85 gesucht: Object.freeze(['betrunken', 'alkoholisiert', 'drogen', 'promille']),
86 katalog: Object.freeze(['Alkohol']),
87 }),
88 Object.freeze({
89 gesucht: Object.freeze(['putzen', 'reinigen', 'pflegen', 'ölen']),
90 katalog: Object.freeze(['instand']),
91 }),
92 Object.freeze({
93 gesucht: Object.freeze(['dekowaffe', 'deko', 'salutwaffe', 'attrappe']),
94 katalog: Object.freeze(['unbrauchbar', 'Dekoration']),
95 }),
96 Object.freeze({
97 gesucht: Object.freeze(['sammler', 'sammeln']),
98 katalog: Object.freeze(['Sammlung']),
99 }),
100 ]);