@einsatzzeichen/core
v3.0.0
Published
Kompositions- und Render-Kern (SVG, Canvas, Layout, Validierung) für Einsatzzeichen
Maintainers
Readme
@einsatzzeichen/core
Das Produkt von Einsatzzeichen: Bausteine und Geometrie der Zeichen (Grundzeichen, Organisationsfarben, Stärken, Kopfmarken, Piktogramme, Render-Themes, Textlaufweiten), Kompositionsmotor, Regelvalidierung, Layout-Profile sowie Renderer für SVG und Canvas. Ohne Fremd- und ohne Node-Abhängigkeit, läuft auch im Browser. Für die Nutzung reichen @einsatzzeichen/core, @einsatzzeichen/schema und ein Ausgabekanal; das Prüfpaket @einsatzzeichen/conformance ist nicht nötig.
Ein Zeichen zeichnen
drawSymbol() macht aus einer SymbolSpec eine Zeichnung — mit der Standardbelegung der Bausteine (DEFAULT_PORTS) und einer aus der Spec abgeleiteten Beschreibung für Screenreader. Wer einzelne Bausteine tauschen will, ruft compose(spec, { ...DEFAULT_PORTS, … }) selbst auf.
import { drawSymbol, renderSvg } from '@einsatzzeichen/core';
import type { SymbolSpec } from '@einsatzzeichen/schema';
// E.1.1 „Bergungsgruppe" des THW
const spec: SymbolSpec = {
kind: 'formation',
whiteInnerContour: true,
organization: 'thw',
strength: 'gruppe',
labels: { center: 'B', bottomRight: 'THW' },
};
const svg = renderSvg(drawSymbol(spec, { title: 'Bergungsgruppe' }), { size: 64 });Verstößt die Spec gegen eine Regel, wirft drawSymbol() eine CompositionError mit der Regel-ID jedes Befunds.
Aus der Grammatik speisen
Für Oberflächen und Skripte, die Zeichen zusammensetzen lassen:
SPEC_FIELD_VALUES/specFieldValues(field)— der Wertevorrat je Feld derSymbolSpec.vocabulary(spec, field)— welche Werte zur übrigen Spec passen; je Wertallowedoderblockedmit Grundrule(erklärte Regeln) odernot-measured. Gerechnet überdrawSymbol(). Ein Skript beginnt beivocabulary({}, 'kind').checkSpec(spec)— die Zeichnung oder der erklärte Grund, warum es keine gibt, statt eines Wurfs.explainIssue()/explainRejection()— Titel, Erklärung und Feld je Regel.symbolProvenance(spec)—verbatimoderderived.serializeSpec/parseSpec/encodeSpecParam/decodeSpecParam— die kanonische Form für Dateien und Links.
import { checkSpec, vocabulary } from '@einsatzzeichen/core';
const fills = vocabulary({ kind: 'formation', organization: 'thw' }, 'technicalFill');
// → alle `blocked`, reason 'rule': Organisation und technische Füllung schließen sich aus
const result = checkSpec({ kind: 'formation', organization: 'thw', strength: 'gruppe' });
if (!result.ok && result.reason === 'rule') console.log(result.issues.map((issue) => issue.title));Freistehende Zeichen
Pfeile (5.2), Linien und Grenzen (2.14–2.20), Wetter (5.8.7) und Tierzustände (5.8.6) stehen ohne Grundzeichen auf der Lagekarte. Sie haben eine eigene Beschreibung neben der SymbolSpec, erkennbar am Feld kind: ein Pfeil folgt einem selbst gelegten Verlauf, das Wetter zeigt einen Wert allein oder die Wolke mit einem Niederschlag in einer von vier Stärken.
drawFreestanding(spec)zeichnet sie,drawAnySpec(spec)nimmt beide Arten.checkAnySpec(spec)gibt die Zeichnung oder den erklärten Grund zurück; die Regeln (validateFreestandingSpec,FREESTANDING_RULE_IDS) sind überexplainIssue()erklärbar.serializeAnySpec/parseAnySpec/encodeAnySpecParam/decodeAnySpecParamschreiben sie in dieselbe Hülle, unterfreestandingstattspec.
import { drawAnySpec, renderSvg } from '@einsatzzeichen/core';
const svg = renderSvg(
drawAnySpec({ kind: 'weather', values: ['weather-cloudy', 'weather-snowing'], intensity: 'moderate' }),
{ size: 64 },
);Installation
pnpm add @einsatzzeichen/coreTeil des Monorepos einsatzzeichen — ein semantisches Symbolsystem für taktische Zeichen der Gefahrenabwehr. Dokumentation und Hintergründe im Repository.
Lizenz
MIT
