Reines Funktionen-Modul fuer die drei Scan-Funktionen

Kennung, deutsche Beschriftung, Codearten, laufende Suche und
Texterkennung je Funktion an einer einzigen Stelle (src/scan-modes.js),
ohne Browser-Zugriff und damit unter Node pruefbar. Funktion "QR-Code"
enthaelt bewusst kein DataMatrix.
This commit is contained in:
2026-07-29 13:36:58 +02:00
parent 5a055923fe
commit 9ef038ca98
2 changed files with 107 additions and 0 deletions
+68
View File
@@ -0,0 +1,68 @@
// Die drei Scan-Funktionen, die der Nutzer vor dem Scannen waehlt. Reines
// Modul ohne Browser-Zugriff (kein window/document/navigator) - einzige
// Quelle fuer Kennung, Beschriftung, Codearten und Verhalten je Funktion.
// Sowohl die Auswahl-Oberflaeche als auch main.js lesen ausschliesslich von
// hier - es darf keine zweite Stelle geben, an der Codearten oder
// Beschriftungen stehen.
//
// Ausdrueckliche Entscheidung des Auftraggebers (nicht abaendern): Funktion 2
// liest streng nur QR (QRCode, MicroQRCode, RMQRCode) - kein DataMatrix, auch
// wenn die 2D-Codes auf den eigenen RAM-Etiketten DataMatrix sind. Der
// Arbeitsablauf des Auftraggebers laeuft ueber Funktion 1 (Teilenummer im
// Strichcode); Funktion 2 dient anderer Ware.
/**
* @typedef {object} ScanMode
* @property {string} id Kennung, intern verwendet (main.js, Speicherung der Wahl).
* @property {string} label Deutsche Beschriftung fuer die Oberflaeche.
* @property {string[]} barcodeFormats An decodeBarcodes() zu uebergebende
* Codearten (zxing-wasm-Formatnamen). Leer, wenn die Funktion keine
* Barcode-Dekodierung nutzt.
* @property {boolean} continuousSearch Ob waehrend die Kamera laeuft
* fortwaehrend nach Codes gesucht wird (statt nur auf Knopfdruck).
* @property {boolean} useOcr Ob die Texterkennung (Tesseract) genutzt wird.
*/
/** @type {ScanMode[]} */
export const SCAN_MODES = [
{
id: 'barcode',
label: 'Strichcode',
// Eindimensionale Codes, wie sie auf Teilenummern-Etiketten vorkommen.
barcodeFormats: ['Code128', 'Code39', 'Code93', 'ITF', 'EAN13', 'EAN8', 'UPCA', 'UPCE', 'Codabar'],
continuousSearch: true,
useOcr: false,
},
{
id: 'qrcode',
label: 'QR-Code',
// Ausschliesslich QR-Varianten - bewusst kein DataMatrix, siehe Kommentar oben.
barcodeFormats: ['QRCode', 'MicroQRCode', 'RMQRCode'],
continuousSearch: true,
useOcr: false,
},
{
id: 'ocr',
label: 'Text erkennen',
// Keine Codes - allein die Texterkennung, auf Knopfdruck.
barcodeFormats: [],
continuousSearch: false,
useOcr: true,
},
];
/**
* Liefert die Funktion zu einer Kennung.
* @param {string} id
* @returns {ScanMode}
* @throws {Error} wenn die Kennung keiner der drei Funktionen entspricht -
* ein Programmfehler (main.js darf nie eine fremde Kennung durchreichen),
* kein regulaerer Ausgang.
*/
export function getScanMode(id) {
const mode = SCAN_MODES.find((candidate) => candidate.id === id);
if (!mode) {
throw new Error(`Unbekannte Scan-Funktion: ${id}`);
}
return mode;
}