waffensachkunde

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

/ app src shared themen.ts

2,4 KB Rohdatei
app/src/shared/themen.ts — 68 Zeilen
1 /**
2 * Die Feingliederung der Kapitel II bis IV – Vertrag und Zugriff.
3 *
4 * ## Wozu
5 *
6 * Der amtliche Katalog gliedert **nur Kapitel I** in Abschnitte. Für 230
7 * Fragen aus den Kapiteln II, III und IV steht `abschnitt` auf `null`, und
8 * alles, was auf Bereichen aufsetzt, arbeitet für sie zwangsläufig auf
9 * Kapitelebene: Wer in der Simulation an Munitionskunde scheitert, sah bis
10 * 0.22.0 nur „Kapitel II schwach“ und konnte nur das ganze Kapitel nachüben –
11 * 92 Fragen.
12 *
13 * ## Redaktionell, nicht amtlich
14 *
15 * Die Gliederung ist eine Einschätzung dieser Software und steht deshalb in
16 * einer eigenen Datei, nicht im Katalog – genau wie Erklärungen und Glossar.
17 * Der amtliche Katalog bleibt unangetastet, und die Oberfläche sagt dazu,
18 * woher die Gruppen stammen.
19 *
20 * ## Vollständigkeit
21 *
22 * `data-pipeline/themen_bauen.py` schreibt die Datei nur, wenn **jede** Frage
23 * der Kapitel II bis IV in genau einer Gruppe liegt. Eine lückenhafte
24 * Gliederung wäre schlimmer als keine: „Thema üben“ überginge dann Fragen,
25 * ohne es zu sagen.
26 */
27
28 /** Eine Themengruppe innerhalb eines Kapitels. */
29 export interface Themengruppe {
30 /** Kennung wie „II.7“ – von dieser Software vergeben, nicht amtlich. */
31 readonly id: string;
32 /** Kapitel, zu dem die Gruppe gehört. */
33 readonly kapitel: string;
34 readonly titel: string;
35 readonly fragen: readonly string[];
36 }
37
38 export interface ThemenMeta {
39 readonly version: number;
40 readonly stand: string;
41 readonly hinweis: string;
42 }
43
44 export interface Themen {
45 readonly meta: ThemenMeta;
46 readonly gruppen: readonly Themengruppe[];
47 }
48
49 export const THEMEN_LEER: Themen = Object.freeze({
50 meta: Object.freeze({ version: 0, stand: '', hinweis: '' }),
51 gruppen: Object.freeze([]),
52 });
53
54 /** Die Gruppen eines Kapitels, in der Reihenfolge der Datei. */
55 export function gruppenZuKapitel(themen: Themen, kapitelId: string): Themengruppe[] {
56 return themen.gruppen.filter((gruppe) => gruppe.kapitel === kapitelId);
57 }
58
59 /**
60 * Die Gruppe, in der eine Frage liegt – oder `null`.
61 *
62 * `null` ist der Regelfall für Kapitel I: Dort gibt es die amtlichen
63 * Abschnitte, und eine zweite Gliederung daneben wäre eine Zahl, die
64 * auseinanderläuft.
65 */
66 export function gruppeZuFrage(themen: Themen, frageId: string): Themengruppe | null {
67 return themen.gruppen.find((gruppe) => gruppe.fragen.includes(frageId)) ?? null;
68 }