waffensachkunde
Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.
/ app src shared begriffsbruecke.ts
| 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 | ]); |