@kreiseck/kasseneck-api 1.0.0-rc.5 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/dist/cjs/pos/texte.d.ts +32 -0
- package/dist/cjs/pos/texte.js +16 -0
- package/dist/cjs/printing/code-tables.d.ts +77 -0
- package/dist/cjs/printing/code-tables.js +224 -0
- package/dist/cjs/printing/escpos.d.ts +19 -6
- package/dist/cjs/printing/escpos.js +27 -48
- package/dist/cjs/printing/index.d.ts +1 -0
- package/dist/cjs/printing/index.js +6 -1
- package/dist/cjs/printing/printable.d.ts +14 -2
- package/dist/cjs/printing/printable.js +36 -2
- package/dist/cjs/react/index.js +7 -0
- package/dist/cjs/receipt/blatt.d.ts +9 -0
- package/dist/cjs/receipt/code-table-reference-data.d.ts +6 -0
- package/dist/cjs/receipt/code-table-reference-data.js +11 -0
- package/dist/cjs/receipt/code-table-test-sheet.d.ts +52 -0
- package/dist/cjs/receipt/code-table-test-sheet.js +153 -0
- package/dist/cjs/receipt/index.d.ts +1 -0
- package/dist/cjs/receipt/index.js +6 -1
- package/dist/cjs/receipt/layout-escpos.d.ts +6 -1
- package/dist/cjs/receipt/layout-escpos.js +11 -7
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/pos/texte.d.ts +32 -0
- package/dist/esm/pos/texte.js +16 -0
- package/dist/esm/printing/code-tables.d.ts +77 -0
- package/dist/esm/printing/code-tables.js +215 -0
- package/dist/esm/printing/escpos.d.ts +19 -6
- package/dist/esm/printing/escpos.js +27 -48
- package/dist/esm/printing/index.d.ts +1 -0
- package/dist/esm/printing/index.js +1 -0
- package/dist/esm/printing/printable.d.ts +14 -2
- package/dist/esm/printing/printable.js +36 -2
- package/dist/esm/react/index.js +7 -0
- package/dist/esm/receipt/blatt.d.ts +9 -0
- package/dist/esm/receipt/code-table-reference-data.d.ts +6 -0
- package/dist/esm/receipt/code-table-reference-data.js +8 -0
- package/dist/esm/receipt/code-table-test-sheet.d.ts +52 -0
- package/dist/esm/receipt/code-table-test-sheet.js +147 -0
- package/dist/esm/receipt/index.d.ts +1 -0
- package/dist/esm/receipt/index.js +1 -0
- package/dist/esm/receipt/layout-escpos.d.ts +6 -1
- package/dist/esm/receipt/layout-escpos.js +11 -7
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/fixtures/code-table-receipts.json +84 -0
- package/fixtures/code-tables.json +12 -0
- package/fixtures/expected/code-table-receipt.long-item-name.iso8859_15.hex +27 -0
- package/fixtures/expected/code-table-receipt.long-item-name.pc437.hex +27 -0
- package/fixtures/expected/code-table-receipt.long-item-name.pc850.hex +27 -0
- package/fixtures/expected/code-table-receipt.long-item-name.pc858.hex +27 -0
- package/fixtures/expected/code-table-receipt.long-item-name.replacement.hex +27 -0
- package/fixtures/expected/code-table-receipt.long-item-name.wpc1252.hex +27 -0
- package/fixtures/expected/code-table-receipt.sale-cash.iso8859_15.hex +34 -0
- package/fixtures/expected/code-table-receipt.sale-cash.pc437.hex +34 -0
- package/fixtures/expected/code-table-receipt.sale-cash.pc850.hex +34 -0
- package/fixtures/expected/code-table-receipt.sale-cash.pc858.hex +34 -0
- package/fixtures/expected/code-table-receipt.sale-cash.replacement.hex +34 -0
- package/fixtures/expected/code-table-receipt.sale-cash.wpc1252.hex +34 -0
- package/fixtures/expected/code-table-receipt.special-characters.iso8859_15.hex +30 -0
- package/fixtures/expected/code-table-receipt.special-characters.pc437.hex +30 -0
- package/fixtures/expected/code-table-receipt.special-characters.pc850.hex +30 -0
- package/fixtures/expected/code-table-receipt.special-characters.pc858.hex +30 -0
- package/fixtures/expected/code-table-receipt.special-characters.replacement.hex +30 -0
- package/fixtures/expected/code-table-receipt.special-characters.wpc1252.hex +30 -0
- package/fixtures/expected/code-table-receipt.test-cashregister-sale.iso8859_15.hex +44 -0
- package/fixtures/expected/code-table-receipt.test-cashregister-sale.pc437.hex +44 -0
- package/fixtures/expected/code-table-receipt.test-cashregister-sale.pc850.hex +44 -0
- package/fixtures/expected/code-table-receipt.test-cashregister-sale.pc858.hex +44 -0
- package/fixtures/expected/code-table-receipt.test-cashregister-sale.replacement.hex +44 -0
- package/fixtures/expected/code-table-receipt.test-cashregister-sale.wpc1252.hex +44 -0
- package/fixtures/expected/code-table-test-sheet.lines.json +191 -0
- package/fixtures/expected/code-table-test-sheet.mm58.hex +59 -0
- package/fixtures/expected/code-table-test-sheet.mm80.hex +60 -0
- package/fixtures/hobex-hps-codes.json +1 -1
- package/fixtures/invoice-api.schema.json +1 -1
- package/fixtures/invoice-texts.json +1 -1
- package/fixtures/pos-texts.json +37 -1
- package/fixtures/surface.json +1 -1
- package/package.json +4 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,41 @@ Was vor 0.7.0 geschah, steht in der Commit-Historie (`git log`); ab hier wird
|
|
|
4
4
|
es hier geführt. Ein Eintrag nennt die Änderung **und ihren Grund** —
|
|
5
5
|
nur der Grund überlebt den nächsten Umbau.
|
|
6
6
|
|
|
7
|
+
## 1.1.0
|
|
8
|
+
|
|
9
|
+
Receipt printers that print umlauts and special characters correctly.
|
|
10
|
+
Reason: `ESC t n` selects the character table, but the number n differs
|
|
11
|
+
between manufacturers; many low-cost printers ignore `ESC t 16` or put
|
|
12
|
+
another table there and print garbage instead of `ä`. The printer wizard
|
|
13
|
+
now prints a test sheet, the user taps the first row that looks right, and
|
|
14
|
+
the register keeps that choice per printer on the device.
|
|
15
|
+
|
|
16
|
+
Additive, no breaking change. Without a chosen table every receipt is byte
|
|
17
|
+
for byte the same as in 1.0.0 (all golden receipts unchanged).
|
|
18
|
+
|
|
19
|
+
- **Code-table catalogue** (`./printing`): `CodeTableId`, `CodeTable`,
|
|
20
|
+
`CODE_TABLES` (six tables: `wpc1252` = `ESC t 16`, `pc858` = 19,
|
|
21
|
+
`pc850` = 2, `pc437` = 0, `iso8859_15` = 40, `replacement` = 0),
|
|
22
|
+
`codeTableById`, `codeTableFromSetting`, `encodeForCodeTable`. For
|
|
23
|
+
ä ö ü Ä Ö Ü ß € § ° every table answers with its own byte or, where the
|
|
24
|
+
table lacks the character, with replacement letters (`ae`, `EUR`, `Par.`,
|
|
25
|
+
`Grad`), never `?`. Shared contract with the Dart twin:
|
|
26
|
+
`fixtures/code-tables.json`.
|
|
27
|
+
- **Test sheet** (`./receipt`): `codeTableTestSheet` (line model for the
|
|
28
|
+
screen, 32 columns) and `codeTableTestSheetBytes` (ESC/POS, centred on
|
|
29
|
+
80 mm), `codeTableReferenceImage`. Contract:
|
|
30
|
+
`fixtures/expected/code-table-test-sheet.*`. New texts in
|
|
31
|
+
`fixtures/pos-texts.json` (`codetable.*`).
|
|
32
|
+
- **Receipts with a chosen table**: `escPosLayoutBytes(layout, { codeTable })`
|
|
33
|
+
accepts a `CodeTableId`. `€`, `§` and `°` go out as the table's real
|
|
34
|
+
byte where the table has them, otherwise as replacement letters. Missing
|
|
35
|
+
characters are replaced in the text before the columns are laid out, so
|
|
36
|
+
a character that becomes several letters never shifts a column.
|
|
37
|
+
`escPosPrintableText(text, codeTable?)` takes the same optional table;
|
|
38
|
+
without it (or with `null`/`CP1252`) it behaves as before.
|
|
39
|
+
- **`CP437` and `§`**: on the old `CP437` name `§` now prints as `Par.`
|
|
40
|
+
(was `?`), with the columns measured after the replacement.
|
|
41
|
+
|
|
7
42
|
## 1.0.0
|
|
8
43
|
|
|
9
44
|
The package speaks the English API `/v3` and nothing else, and its own
|
|
@@ -16,6 +51,10 @@ consumer migrates once. Rendered texts (messages, labels, printed receipts,
|
|
|
16
51
|
invoice PDFs) are byte for byte the same as in 0.31.0, and so are the printed
|
|
17
52
|
bytes of every golden receipt.
|
|
18
53
|
|
|
54
|
+
Released as `latest` on 30.09.2026, identical in content to 1.0.0-rc.5. The
|
|
55
|
+
web register (kasse.kasseneck.at) has run on rc.5 since 29.09.2026. 0.x stays
|
|
56
|
+
available under the `legacy` tag and on the `release/0.x` branch.
|
|
57
|
+
|
|
19
58
|
This entry is written in English, like the developer documentation from here
|
|
20
59
|
on.
|
|
21
60
|
|
package/dist/cjs/pos/texte.d.ts
CHANGED
|
@@ -469,6 +469,12 @@ declare const MELDUNGEN_ROH: {
|
|
|
469
469
|
readonly 'print.wizard_cancelled': {
|
|
470
470
|
readonly text: "Nichts gespeichert.";
|
|
471
471
|
};
|
|
472
|
+
readonly 'codetable.question': {
|
|
473
|
+
readonly text: "Welche Zeile sieht auf dem Papier aus wie oben?";
|
|
474
|
+
};
|
|
475
|
+
readonly 'codetable.instruction': {
|
|
476
|
+
readonly text: "Die Nummer der ersten Zeile, die genau wie oben aussieht, in der Kasse antippen.";
|
|
477
|
+
};
|
|
472
478
|
readonly 'bluetooth.off': {
|
|
473
479
|
readonly text: "Bluetooth ist ausgeschaltet. Bitte einschalten und erneut suchen.";
|
|
474
480
|
readonly only: readonly ["app"];
|
|
@@ -964,6 +970,32 @@ declare const BESCHRIFTUNGEN_ROH: {
|
|
|
964
970
|
readonly 'cancellation.difference': {
|
|
965
971
|
readonly text: "Differenz";
|
|
966
972
|
};
|
|
973
|
+
readonly 'codetable.title': {
|
|
974
|
+
readonly text: "ZEICHENSATZ-TEST";
|
|
975
|
+
};
|
|
976
|
+
readonly 'codetable.reference': {
|
|
977
|
+
readonly text: "So muss jede Zeile aussehen:";
|
|
978
|
+
};
|
|
979
|
+
readonly 'codetable.replacement_note': {
|
|
980
|
+
readonly text: "(Ersatz, passt immer)";
|
|
981
|
+
};
|
|
982
|
+
readonly 'codetable.missing': {
|
|
983
|
+
readonly text: "ohne {chars}";
|
|
984
|
+
readonly placeholders: readonly ["chars"];
|
|
985
|
+
};
|
|
986
|
+
readonly 'codetable.print_again': {
|
|
987
|
+
readonly text: "Nochmal drucken";
|
|
988
|
+
};
|
|
989
|
+
readonly 'codetable.not_checked': {
|
|
990
|
+
readonly text: "Umlaute noch nicht geprüft";
|
|
991
|
+
};
|
|
992
|
+
readonly 'codetable.check': {
|
|
993
|
+
readonly text: "Umlaute prüfen";
|
|
994
|
+
};
|
|
995
|
+
readonly 'codetable.current': {
|
|
996
|
+
readonly text: "Zeichensatz: Nr. {number}";
|
|
997
|
+
readonly placeholders: readonly ["number"];
|
|
998
|
+
};
|
|
967
999
|
};
|
|
968
1000
|
export type LabelKey = keyof typeof BESCHRIFTUNGEN_ROH;
|
|
969
1001
|
export declare const LABELS: Record<LabelKey, TextEntry>;
|
package/dist/cjs/pos/texte.js
CHANGED
|
@@ -255,6 +255,10 @@ const MELDUNGEN_ROH = {
|
|
|
255
255
|
// Abbrechen an jeder Stelle: nichts gespeichert. Der Satz sagt genau das,
|
|
256
256
|
// damit niemand einen halb eingerichteten Drucker vermutet.
|
|
257
257
|
'print.wizard_cancelled': { text: 'Nichts gespeichert.' },
|
|
258
|
+
// Zeichensatz-Test im Drucker-Wizard: das Testblatt nennt die Anleitung,
|
|
259
|
+
// der Bildschirm stellt die Frage daneben.
|
|
260
|
+
'codetable.question': { text: 'Welche Zeile sieht auf dem Papier aus wie oben?' },
|
|
261
|
+
'codetable.instruction': { text: 'Die Nummer der ersten Zeile, die genau wie oben aussieht, in der Kasse antippen.' },
|
|
258
262
|
'bluetooth.off': { text: 'Bluetooth ist ausgeschaltet. Bitte einschalten und erneut suchen.', only: ['app'] },
|
|
259
263
|
'bluetooth.permission_missing': { text: 'Bitte die Freigabe in den Geräte-Einstellungen erteilen.', only: ['app'] },
|
|
260
264
|
'bluetooth.search_failed': { text: 'Die Suche ist fehlgeschlagen: {reason}', placeholders: ['reason'], only: ['app'] },
|
|
@@ -566,6 +570,18 @@ const BESCHRIFTUNGEN_ROH = {
|
|
|
566
570
|
'cancellation.all_cash': { text: 'Alles bar' },
|
|
567
571
|
'cancellation.payment_remainder': { text: 'Rest {amount}', placeholders: ['amount'] },
|
|
568
572
|
'cancellation.difference': { text: 'Differenz' },
|
|
573
|
+
// --- Zeichensatz-Test (Testblatt und Drucker & Lade) ----------------------
|
|
574
|
+
// Das Testblatt druckt diese Texte; sie bleiben reines ASCII bis auf die
|
|
575
|
+
// Knoepfe am Bildschirm. `{chars}` sind die fehlenden Zeichen einer Zeile
|
|
576
|
+
// („€“ bzw. „€ §“), `{number}` die gewaehlte Zeile (1-6).
|
|
577
|
+
'codetable.title': { text: 'ZEICHENSATZ-TEST' },
|
|
578
|
+
'codetable.reference': { text: 'So muss jede Zeile aussehen:' },
|
|
579
|
+
'codetable.replacement_note': { text: '(Ersatz, passt immer)' },
|
|
580
|
+
'codetable.missing': { text: 'ohne {chars}', placeholders: ['chars'] },
|
|
581
|
+
'codetable.print_again': { text: 'Nochmal drucken' },
|
|
582
|
+
'codetable.not_checked': { text: 'Umlaute noch nicht geprüft' },
|
|
583
|
+
'codetable.check': { text: 'Umlaute prüfen' },
|
|
584
|
+
'codetable.current': { text: 'Zeichensatz: Nr. {number}', placeholders: ['number'] },
|
|
569
585
|
};
|
|
570
586
|
exports.LABELS = BESCHRIFTUNGEN_ROH;
|
|
571
587
|
/** Die Beschriftung zum Schluessel, Platzhalter ersetzt; fehlt ein Wert, wirft es wie `messageText`. */
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Katalog der Code-Tabellen fuer Bondrucker und die Umwandlung von Text in
|
|
3
|
+
* Bytes je Tabelle.
|
|
4
|
+
*
|
|
5
|
+
* Warum ein Katalog: `ESC t n` waehlt die Zeichentabelle, aber die Nummer n
|
|
6
|
+
* ist nicht einheitlich. Epson legt WPC1252 auf 16, viele guenstige Drucker
|
|
7
|
+
* nummerieren anders oder kennen die Tabelle gar nicht. Wer am Testblatt
|
|
8
|
+
* sieht, welche Nummer seine Umlaute richtig druckt, waehlt hier die
|
|
9
|
+
* passende Tabelle. Gemeinsamer Prueffall mit dem Dart-Zwilling:
|
|
10
|
+
* `fixtures/code-tables.json`.
|
|
11
|
+
*
|
|
12
|
+
* Jede Tabelle setzt die zehn deutschen Zeichen (Umlaute, ß, €, §, °) auf
|
|
13
|
+
* ein Byte oder, wo die Tabelle das Zeichen nicht hat, auf Ersatzbuchstaben
|
|
14
|
+
* (`€` -> `EUR`). Fuer diese zehn Zeichen kommt nie `?` heraus.
|
|
15
|
+
*/
|
|
16
|
+
/** Kennung einer Code-Tabelle. */
|
|
17
|
+
export type CodeTableId = 'wpc1252' | 'pc858' | 'pc850' | 'pc437' | 'iso8859_15' | 'replacement';
|
|
18
|
+
/** Eine Code-Tabelle des Katalogs. */
|
|
19
|
+
export interface CodeTable {
|
|
20
|
+
/** Kennung. */
|
|
21
|
+
id: CodeTableId;
|
|
22
|
+
/** Nummer auf dem Testblatt (1-6). */
|
|
23
|
+
number: 1 | 2 | 3 | 4 | 5 | 6;
|
|
24
|
+
/** n fuer `ESC t n`. */
|
|
25
|
+
escT: number;
|
|
26
|
+
/** Zeichen der zehn, die diese Tabelle nicht hat und durch Ersatzbuchstaben druckt. */
|
|
27
|
+
missing: readonly string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Ersatzbuchstaben fuer eines der zehn Zeichen (paketintern, fuer
|
|
31
|
+
* `escPosPrintableText` mit gewaehlter Tabelle).
|
|
32
|
+
*/
|
|
33
|
+
export declare function ersatzBuchstaben(zeichen: string): string;
|
|
34
|
+
/** Alle Code-Tabellen in der Reihenfolge des Testblatts (Nummer 1-6). */
|
|
35
|
+
export declare const CODE_TABLES: readonly CodeTable[];
|
|
36
|
+
/** Die Tabelle zu einer Kennung; eine unbekannte Kennung wird gemeldet. */
|
|
37
|
+
export declare function codeTableById(id: CodeTableId): CodeTable;
|
|
38
|
+
/**
|
|
39
|
+
* Tabelle aus der gespeicherten Einstellung (`cp1252`/`cp437`). Alles andere,
|
|
40
|
+
* auch keine Einstellung, ist die Vorgabe `wpc1252`.
|
|
41
|
+
*/
|
|
42
|
+
export declare function codeTableFromSetting(setting: 'cp1252' | 'cp437' | null | undefined): CodeTableId;
|
|
43
|
+
/**
|
|
44
|
+
* Zeichen, die das Vorbild vor dem Kodieren ersetzt (generator.dart `_encode`).
|
|
45
|
+
*
|
|
46
|
+
* **Eine bewusste Abweichung:** Fuer `•` sagt generator.dart `.`,
|
|
47
|
+
* print_paper.dart (portiert als `escPosPrintableText`) dagegen `*`. In Darts
|
|
48
|
+
* eigener Kette faellt das nie auf, weil print_paper vor dem Erzeuger ersetzt
|
|
49
|
+
* und der Erzeuger den Punkt nie zu sehen bekommt -- die gedruckte Antwort ist
|
|
50
|
+
* dort also `*`. Ein Verbraucher dieses Pakets kann `escPosText` aber auch
|
|
51
|
+
* direkt aufrufen, und dann duerfen nicht zwei Zeichen fuer dasselbe Zeichen
|
|
52
|
+
* herauskommen. Deshalb gilt hier dieselbe Antwort wie dort.
|
|
53
|
+
*/
|
|
54
|
+
export declare const ZEICHEN_ERSATZ: ReadonlyArray<readonly [string, string]>;
|
|
55
|
+
/**
|
|
56
|
+
* Latin-1-Byte -> CP437-Byte fuer die Zeichen, die CP437 kennt (deutsche
|
|
57
|
+
* Umlaute, ß, westeuropaeische Akzente, Waehrungs-/Sonderzeichen). Alles
|
|
58
|
+
* andere ab 0x80 hat in CP437 keinen Platz und wird zu "?".
|
|
59
|
+
*/
|
|
60
|
+
export declare const CP437_AUS_LATIN1: ReadonlyMap<number, number>;
|
|
61
|
+
/**
|
|
62
|
+
* Wandelt Text in die Bytes einer Code-Tabelle: erst die vorhandenen
|
|
63
|
+
* Ersetzungen (`ZEICHEN_ERSATZ`), dann die zehn deutschen Zeichen je Tabelle
|
|
64
|
+
* (Byte oder Ersatzbuchstaben), ASCII unveraendert, alles uebrige ueber die
|
|
65
|
+
* Abbildung der Tabelle, sonst `?`. Ein Zeichen, das die Tabelle nicht
|
|
66
|
+
* kennt, ist genau ein Byte; nur die Ersatzbuchstaben machen aus einem
|
|
67
|
+
* Zeichen mehrere. Spalten darum immer an den fertigen Bytes messen.
|
|
68
|
+
*/
|
|
69
|
+
export declare function encodeForCodeTable(text: string, table: CodeTableId): Uint8Array;
|
|
70
|
+
/** Wendet `ZEICHEN_ERSATZ` an (paketintern, nicht exportiert ueber den Einstieg). */
|
|
71
|
+
export declare function replaceKnownCharacters(text: string): string;
|
|
72
|
+
/**
|
|
73
|
+
* Wie `encodeForCodeTable`, aber fuer Text, der `ZEICHEN_ERSATZ` schon hinter
|
|
74
|
+
* sich hat (paketintern: der alte Pfad in `encodeEscPosText` ersetzt vor der
|
|
75
|
+
* Latin-1-Pruefung und soll nicht zweimal ersetzen).
|
|
76
|
+
*/
|
|
77
|
+
export declare function encodeReplaced(aufbereitet: string, table: CodeTableId): Uint8Array;
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Katalog der Code-Tabellen fuer Bondrucker und die Umwandlung von Text in
|
|
4
|
+
* Bytes je Tabelle.
|
|
5
|
+
*
|
|
6
|
+
* Warum ein Katalog: `ESC t n` waehlt die Zeichentabelle, aber die Nummer n
|
|
7
|
+
* ist nicht einheitlich. Epson legt WPC1252 auf 16, viele guenstige Drucker
|
|
8
|
+
* nummerieren anders oder kennen die Tabelle gar nicht. Wer am Testblatt
|
|
9
|
+
* sieht, welche Nummer seine Umlaute richtig druckt, waehlt hier die
|
|
10
|
+
* passende Tabelle. Gemeinsamer Prueffall mit dem Dart-Zwilling:
|
|
11
|
+
* `fixtures/code-tables.json`.
|
|
12
|
+
*
|
|
13
|
+
* Jede Tabelle setzt die zehn deutschen Zeichen (Umlaute, ß, €, §, °) auf
|
|
14
|
+
* ein Byte oder, wo die Tabelle das Zeichen nicht hat, auf Ersatzbuchstaben
|
|
15
|
+
* (`€` -> `EUR`). Fuer diese zehn Zeichen kommt nie `?` heraus.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.CP437_AUS_LATIN1 = exports.ZEICHEN_ERSATZ = exports.CODE_TABLES = void 0;
|
|
19
|
+
exports.ersatzBuchstaben = ersatzBuchstaben;
|
|
20
|
+
exports.codeTableById = codeTableById;
|
|
21
|
+
exports.codeTableFromSetting = codeTableFromSetting;
|
|
22
|
+
exports.encodeForCodeTable = encodeForCodeTable;
|
|
23
|
+
exports.replaceKnownCharacters = replaceKnownCharacters;
|
|
24
|
+
exports.encodeReplaced = encodeReplaced;
|
|
25
|
+
/** Die zehn Zeichen, fuer die jede Tabelle eine feste Antwort hat. */
|
|
26
|
+
const ZEHN_ZEICHEN = ['ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß', '€', '§', '°'];
|
|
27
|
+
/** Ersatzbuchstaben, wenn die Tabelle das Zeichen nicht hat. */
|
|
28
|
+
const ERSATZ_BUCHSTABEN = {
|
|
29
|
+
'ä': 'ae', 'ö': 'oe', 'ü': 'ue', 'Ä': 'Ae', 'Ö': 'Oe', 'Ü': 'Ue', 'ß': 'ss', '€': 'EUR', '§': 'Par.', '°': 'Grad',
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Byte je Zeichen und Tabelle; fehlt ein Zeichen, gilt der Ersatz. Werte aus
|
|
33
|
+
* den Zeichentabellen (Windows-1252, IBM 858/850/437, ISO 8859-15).
|
|
34
|
+
*/
|
|
35
|
+
const BYTES_JE_TABELLE = {
|
|
36
|
+
wpc1252: { 'ä': 0xe4, 'ö': 0xf6, 'ü': 0xfc, 'Ä': 0xc4, 'Ö': 0xd6, 'Ü': 0xdc, 'ß': 0xdf, '€': 0x80, '§': 0xa7, '°': 0xb0 },
|
|
37
|
+
pc858: { 'ä': 0x84, 'ö': 0x94, 'ü': 0x81, 'Ä': 0x8e, 'Ö': 0x99, 'Ü': 0x9a, 'ß': 0xe1, '€': 0xd5, '§': 0xf5, '°': 0xf8 },
|
|
38
|
+
pc850: { 'ä': 0x84, 'ö': 0x94, 'ü': 0x81, 'Ä': 0x8e, 'Ö': 0x99, 'Ü': 0x9a, 'ß': 0xe1, '§': 0xf5, '°': 0xf8 },
|
|
39
|
+
pc437: { 'ä': 0x84, 'ö': 0x94, 'ü': 0x81, 'Ä': 0x8e, 'Ö': 0x99, 'Ü': 0x9a, 'ß': 0xe1, '°': 0xf8 },
|
|
40
|
+
iso8859_15: { 'ä': 0xe4, 'ö': 0xf6, 'ü': 0xfc, 'Ä': 0xc4, 'Ö': 0xd6, 'Ü': 0xdc, 'ß': 0xdf, '€': 0xa4, '§': 0xa7, '°': 0xb0 },
|
|
41
|
+
replacement: {},
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Ersatzbuchstaben fuer eines der zehn Zeichen (paketintern, fuer
|
|
45
|
+
* `escPosPrintableText` mit gewaehlter Tabelle).
|
|
46
|
+
*/
|
|
47
|
+
function ersatzBuchstaben(zeichen) {
|
|
48
|
+
const ersatz = ERSATZ_BUCHSTABEN[zeichen];
|
|
49
|
+
if (ersatz === undefined)
|
|
50
|
+
throw new Error(`Kein Ersatz fuer ${zeichen}`);
|
|
51
|
+
return ersatz;
|
|
52
|
+
}
|
|
53
|
+
function tabelle(id, number, escT) {
|
|
54
|
+
const bytes = BYTES_JE_TABELLE[id];
|
|
55
|
+
return Object.freeze({ id, number, escT, missing: Object.freeze(ZEHN_ZEICHEN.filter((z) => bytes[z] === undefined)) });
|
|
56
|
+
}
|
|
57
|
+
/** Alle Code-Tabellen in der Reihenfolge des Testblatts (Nummer 1-6). */
|
|
58
|
+
exports.CODE_TABLES = Object.freeze([
|
|
59
|
+
tabelle('wpc1252', 1, 16),
|
|
60
|
+
tabelle('pc858', 2, 19),
|
|
61
|
+
tabelle('pc850', 3, 2),
|
|
62
|
+
tabelle('pc437', 4, 0),
|
|
63
|
+
tabelle('iso8859_15', 5, 40),
|
|
64
|
+
tabelle('replacement', 6, 0),
|
|
65
|
+
]);
|
|
66
|
+
/** Die Tabelle zu einer Kennung; eine unbekannte Kennung wird gemeldet. */
|
|
67
|
+
function codeTableById(id) {
|
|
68
|
+
const gefunden = exports.CODE_TABLES.find((t) => t.id === id);
|
|
69
|
+
if (gefunden === undefined)
|
|
70
|
+
throw new Error(`Unbekannte Code-Tabelle: ${String(id)}`);
|
|
71
|
+
return gefunden;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Tabelle aus der gespeicherten Einstellung (`cp1252`/`cp437`). Alles andere,
|
|
75
|
+
* auch keine Einstellung, ist die Vorgabe `wpc1252`.
|
|
76
|
+
*/
|
|
77
|
+
function codeTableFromSetting(setting) {
|
|
78
|
+
return setting === 'cp437' ? 'pc437' : 'wpc1252';
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Zeichen, die das Vorbild vor dem Kodieren ersetzt (generator.dart `_encode`).
|
|
82
|
+
*
|
|
83
|
+
* **Eine bewusste Abweichung:** Fuer `•` sagt generator.dart `.`,
|
|
84
|
+
* print_paper.dart (portiert als `escPosPrintableText`) dagegen `*`. In Darts
|
|
85
|
+
* eigener Kette faellt das nie auf, weil print_paper vor dem Erzeuger ersetzt
|
|
86
|
+
* und der Erzeuger den Punkt nie zu sehen bekommt -- die gedruckte Antwort ist
|
|
87
|
+
* dort also `*`. Ein Verbraucher dieses Pakets kann `escPosText` aber auch
|
|
88
|
+
* direkt aufrufen, und dann duerfen nicht zwei Zeichen fuer dasselbe Zeichen
|
|
89
|
+
* herauskommen. Deshalb gilt hier dieselbe Antwort wie dort.
|
|
90
|
+
*/
|
|
91
|
+
exports.ZEICHEN_ERSATZ = [
|
|
92
|
+
['’', "'"], // typografisches Apostroph
|
|
93
|
+
['´', "'"], // Akut
|
|
94
|
+
['•', '*'], // Aufzaehlungspunkt (siehe Kommentar oben)
|
|
95
|
+
];
|
|
96
|
+
/**
|
|
97
|
+
* Latin-1-Byte -> CP437-Byte fuer die Zeichen, die CP437 kennt (deutsche
|
|
98
|
+
* Umlaute, ß, westeuropaeische Akzente, Waehrungs-/Sonderzeichen). Alles
|
|
99
|
+
* andere ab 0x80 hat in CP437 keinen Platz und wird zu "?".
|
|
100
|
+
*/
|
|
101
|
+
exports.CP437_AUS_LATIN1 = new Map([
|
|
102
|
+
[0xc7, 0x80], [0xfc, 0x81], [0xe9, 0x82], [0xe2, 0x83], [0xe4, 0x84], [0xe0, 0x85], [0xe5, 0x86], [0xe7, 0x87],
|
|
103
|
+
[0xea, 0x88], [0xeb, 0x89], [0xe8, 0x8a], [0xef, 0x8b], [0xee, 0x8c], [0xec, 0x8d], [0xc4, 0x8e], [0xc5, 0x8f],
|
|
104
|
+
[0xc9, 0x90], [0xe6, 0x91], [0xc6, 0x92], [0xf4, 0x93], [0xf6, 0x94], [0xf2, 0x95], [0xfb, 0x96], [0xf9, 0x97],
|
|
105
|
+
[0xff, 0x98], [0xd6, 0x99], [0xdc, 0x9a], [0xa2, 0x9b], [0xa3, 0x9c], [0xa5, 0x9d], [0xe1, 0xa0], [0xed, 0xa1],
|
|
106
|
+
[0xf3, 0xa2], [0xfa, 0xa3], [0xf1, 0xa4], [0xd1, 0xa5], [0xaa, 0xa6], [0xba, 0xa7], [0xbf, 0xa8], [0xac, 0xaa],
|
|
107
|
+
[0xbd, 0xab], [0xbc, 0xac], [0xa1, 0xad], [0xab, 0xae], [0xbb, 0xaf], [0xdf, 0xe1], [0xb5, 0xe6], [0xb1, 0xf1],
|
|
108
|
+
[0xf7, 0xf6], [0xb0, 0xf8], [0xb7, 0xfa], [0xb2, 0xfd], [0xa0, 0xff],
|
|
109
|
+
]);
|
|
110
|
+
/**
|
|
111
|
+
* Latin-1-Byte -> PC850-Byte (IBM 850, gleich fuer 858 bis auf das €, das
|
|
112
|
+
* die zehn Zeichen oben schon setzen). PC850 hat fuer jedes Latin-1-Zeichen
|
|
113
|
+
* ab 0xA0 einen Platz; die Steuerzeichen 0x80-0x9F werden zu "?".
|
|
114
|
+
*/
|
|
115
|
+
const PC850_AUS_LATIN1 = new Map([
|
|
116
|
+
[0xa0, 0xff], [0xa1, 0xad], [0xa2, 0xbd], [0xa3, 0x9c], [0xa4, 0xcf], [0xa5, 0xbe], [0xa6, 0xdd], [0xa7, 0xf5],
|
|
117
|
+
[0xa8, 0xf9], [0xa9, 0xb8], [0xaa, 0xa6], [0xab, 0xae], [0xac, 0xaa], [0xad, 0xf0], [0xae, 0xa9], [0xaf, 0xee],
|
|
118
|
+
[0xb0, 0xf8], [0xb1, 0xf1], [0xb2, 0xfd], [0xb3, 0xfc], [0xb4, 0xef], [0xb5, 0xe6], [0xb6, 0xf4], [0xb7, 0xfa],
|
|
119
|
+
[0xb8, 0xf7], [0xb9, 0xfb], [0xba, 0xa7], [0xbb, 0xaf], [0xbc, 0xac], [0xbd, 0xab], [0xbe, 0xf3], [0xbf, 0xa8],
|
|
120
|
+
[0xc0, 0xb7], [0xc1, 0xb5], [0xc2, 0xb6], [0xc3, 0xc7], [0xc4, 0x8e], [0xc5, 0x8f], [0xc6, 0x92], [0xc7, 0x80],
|
|
121
|
+
[0xc8, 0xd4], [0xc9, 0x90], [0xca, 0xd2], [0xcb, 0xd3], [0xcc, 0xde], [0xcd, 0xd6], [0xce, 0xd7], [0xcf, 0xd8],
|
|
122
|
+
[0xd0, 0xd1], [0xd1, 0xa5], [0xd2, 0xe3], [0xd3, 0xe0], [0xd4, 0xe2], [0xd5, 0xe5], [0xd6, 0x99], [0xd7, 0x9e],
|
|
123
|
+
[0xd8, 0x9d], [0xd9, 0xeb], [0xda, 0xe9], [0xdb, 0xea], [0xdc, 0x9a], [0xdd, 0xed], [0xde, 0xe8], [0xdf, 0xe1],
|
|
124
|
+
[0xe0, 0x85], [0xe1, 0xa0], [0xe2, 0x83], [0xe3, 0xc6], [0xe4, 0x84], [0xe5, 0x86], [0xe6, 0x91], [0xe7, 0x87],
|
|
125
|
+
[0xe8, 0x8a], [0xe9, 0x82], [0xea, 0x88], [0xeb, 0x89], [0xec, 0x8d], [0xed, 0xa1], [0xee, 0x8c], [0xef, 0x8b],
|
|
126
|
+
[0xf0, 0xd0], [0xf1, 0xa4], [0xf2, 0x95], [0xf3, 0xa2], [0xf4, 0x93], [0xf5, 0xe4], [0xf6, 0x94], [0xf7, 0xf6],
|
|
127
|
+
[0xf8, 0x9b], [0xf9, 0x97], [0xfa, 0xa3], [0xfb, 0x96], [0xfc, 0x81], [0xfd, 0xec], [0xfe, 0xe7], [0xff, 0x98],
|
|
128
|
+
]);
|
|
129
|
+
const FRAGEZEICHEN = 0x3f;
|
|
130
|
+
/**
|
|
131
|
+
* Windows-1252 belegt 0x80-0x9F mit eigenen Zeichen (Latin-1 hat dort nur
|
|
132
|
+
* Steuerzeichen). € setzen die zehn Zeichen, ’ und • ersetzt ZEICHEN_ERSATZ
|
|
133
|
+
* vorher (eine Antwort auf jedem Ausgabeweg); der Rest steht hier.
|
|
134
|
+
*/
|
|
135
|
+
const WPC1252_NEU = new Map([
|
|
136
|
+
[0x201a, 0x82], [0x0192, 0x83], [0x201e, 0x84], [0x2026, 0x85], [0x2020, 0x86], [0x2021, 0x87], [0x02c6, 0x88],
|
|
137
|
+
[0x2030, 0x89], [0x0160, 0x8a], [0x2039, 0x8b], [0x0152, 0x8c], [0x017d, 0x8e], [0x2018, 0x91], [0x2019, 0x92],
|
|
138
|
+
[0x201c, 0x93], [0x201d, 0x94], [0x2022, 0x95], [0x2013, 0x96], [0x2014, 0x97], [0x02dc, 0x98], [0x2122, 0x99],
|
|
139
|
+
[0x0161, 0x9a], [0x203a, 0x9b], [0x0153, 0x9c], [0x017e, 0x9e], [0x0178, 0x9f],
|
|
140
|
+
]);
|
|
141
|
+
/**
|
|
142
|
+
* ISO 8859-15 belegt acht Stellen anders als Latin-1: dort stehen € Š š Ž ž
|
|
143
|
+
* Œ œ Ÿ statt ¤ ¦ ¨ ´ ¸ ¼ ½ ¾. Die acht Latin-1-Zeichen fehlen der Tabelle
|
|
144
|
+
* (Ersetzung, sonst `?`), die neuen stehen hier mit ihrem Byte (€ setzen
|
|
145
|
+
* schon die zehn Zeichen). C1-Steuerzeichen (0x80-0x9F) gehen nie roh hinaus.
|
|
146
|
+
*/
|
|
147
|
+
const ISO8859_15_ANDERS = new Set([0xa4, 0xa6, 0xa8, 0xb4, 0xb8, 0xbc, 0xbd, 0xbe]);
|
|
148
|
+
const ISO8859_15_NEU = new Map([
|
|
149
|
+
[0x0160, 0xa6], [0x0161, 0xa8], [0x017d, 0xb4], [0x017e, 0xb8], [0x0152, 0xbc], [0x0153, 0xbd], [0x0178, 0xbe],
|
|
150
|
+
]);
|
|
151
|
+
/** Byte fuer ein Zeichen ab 0x80, das nicht zu den zehn gehoert. */
|
|
152
|
+
function uebrigesZeichen(codepunkt, id) {
|
|
153
|
+
switch (id) {
|
|
154
|
+
case 'wpc1252':
|
|
155
|
+
if (codepunkt < 0xa0)
|
|
156
|
+
return FRAGEZEICHEN; // C1-Steuerzeichen
|
|
157
|
+
if (codepunkt <= 0xff)
|
|
158
|
+
return codepunkt;
|
|
159
|
+
return WPC1252_NEU.get(codepunkt) ?? FRAGEZEICHEN;
|
|
160
|
+
case 'iso8859_15':
|
|
161
|
+
if (codepunkt < 0xa0)
|
|
162
|
+
return FRAGEZEICHEN; // C1-Steuerzeichen
|
|
163
|
+
if (codepunkt <= 0xff)
|
|
164
|
+
return ISO8859_15_ANDERS.has(codepunkt) ? FRAGEZEICHEN : codepunkt;
|
|
165
|
+
return ISO8859_15_NEU.get(codepunkt) ?? FRAGEZEICHEN;
|
|
166
|
+
case 'pc437':
|
|
167
|
+
return exports.CP437_AUS_LATIN1.get(codepunkt) ?? FRAGEZEICHEN;
|
|
168
|
+
case 'pc858':
|
|
169
|
+
case 'pc850':
|
|
170
|
+
return PC850_AUS_LATIN1.get(codepunkt) ?? FRAGEZEICHEN;
|
|
171
|
+
case 'replacement':
|
|
172
|
+
return FRAGEZEICHEN;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Wandelt Text in die Bytes einer Code-Tabelle: erst die vorhandenen
|
|
177
|
+
* Ersetzungen (`ZEICHEN_ERSATZ`), dann die zehn deutschen Zeichen je Tabelle
|
|
178
|
+
* (Byte oder Ersatzbuchstaben), ASCII unveraendert, alles uebrige ueber die
|
|
179
|
+
* Abbildung der Tabelle, sonst `?`. Ein Zeichen, das die Tabelle nicht
|
|
180
|
+
* kennt, ist genau ein Byte; nur die Ersatzbuchstaben machen aus einem
|
|
181
|
+
* Zeichen mehrere. Spalten darum immer an den fertigen Bytes messen.
|
|
182
|
+
*/
|
|
183
|
+
function encodeForCodeTable(text, table) {
|
|
184
|
+
return encodeReplaced(replaceKnownCharacters(text), table);
|
|
185
|
+
}
|
|
186
|
+
/** Wendet `ZEICHEN_ERSATZ` an (paketintern, nicht exportiert ueber den Einstieg). */
|
|
187
|
+
function replaceKnownCharacters(text) {
|
|
188
|
+
let aufbereitet = text;
|
|
189
|
+
for (const [von, nach] of exports.ZEICHEN_ERSATZ) {
|
|
190
|
+
aufbereitet = aufbereitet.split(von).join(nach);
|
|
191
|
+
}
|
|
192
|
+
return aufbereitet;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Wie `encodeForCodeTable`, aber fuer Text, der `ZEICHEN_ERSATZ` schon hinter
|
|
196
|
+
* sich hat (paketintern: der alte Pfad in `encodeEscPosText` ersetzt vor der
|
|
197
|
+
* Latin-1-Pruefung und soll nicht zweimal ersetzen).
|
|
198
|
+
*/
|
|
199
|
+
function encodeReplaced(aufbereitet, table) {
|
|
200
|
+
const bytesDerTabelle = BYTES_JE_TABELLE[table];
|
|
201
|
+
if (bytesDerTabelle === undefined)
|
|
202
|
+
throw new Error(`Unbekannte Code-Tabelle: ${String(table)}`);
|
|
203
|
+
const bytes = [];
|
|
204
|
+
for (const zeichen of aufbereitet) {
|
|
205
|
+
const codepunkt = zeichen.codePointAt(0);
|
|
206
|
+
if (codepunkt < 0x80) {
|
|
207
|
+
bytes.push(codepunkt);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
const byte = bytesDerTabelle[zeichen];
|
|
211
|
+
if (byte !== undefined) {
|
|
212
|
+
bytes.push(byte);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const ersatz = ERSATZ_BUCHSTABEN[zeichen];
|
|
216
|
+
if (ersatz !== undefined) {
|
|
217
|
+
for (let i = 0; i < ersatz.length; i++)
|
|
218
|
+
bytes.push(ersatz.charCodeAt(i));
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
bytes.push(uebrigesZeichen(codepunkt, table));
|
|
222
|
+
}
|
|
223
|
+
return Uint8Array.from(bytes);
|
|
224
|
+
}
|
|
@@ -23,11 +23,14 @@
|
|
|
23
23
|
* `ESC t 16` und bleiben in CP437; dann werden die Umlaute auf ihre
|
|
24
24
|
* CP437-Plaetze umkodiert (ä = 0x84, ü = 0x81, ß = 0xE1, ...). Zeichen ohne
|
|
25
25
|
* CP437-Platz werden zu `?` — weiterhin ein Byte je Zeichen.
|
|
26
|
+
* Weitere Tabellen (PC858, PC850, ISO 8859-15, reine Ersatzbuchstaben) und
|
|
27
|
+
* ihre `ESC t`-Nummern stehen im Katalog `code-tables.ts`.
|
|
26
28
|
*
|
|
27
29
|
* Nicht enthalten (bewusst): Bilddekodierung (PNG/JPEG liest die Huelle),
|
|
28
30
|
* Capability-Profile einzelner Druckermodelle, Kassenlade, 1D-Barcodes.
|
|
29
31
|
* Fertige einfarbige Rasterbilder (Logo) gehen ueber [escPosRasterImage].
|
|
30
32
|
*/
|
|
33
|
+
import { type CodeTableId } from './code-tables.js';
|
|
31
34
|
import { type QrModuleSize } from './qr-groesse.js';
|
|
32
35
|
/** Papierbreite der Bonrolle. */
|
|
33
36
|
export type PosPaperSize = 'mm58' | 'mm80';
|
|
@@ -37,8 +40,12 @@ export type PosAlign = 'left' | 'center' | 'right';
|
|
|
37
40
|
export type PosFont = 'fontA' | 'fontB';
|
|
38
41
|
/** Voller oder teilweiser Papierschnitt. */
|
|
39
42
|
export type PosCutMode = 'full' | 'partial';
|
|
40
|
-
/**
|
|
41
|
-
|
|
43
|
+
/**
|
|
44
|
+
* Vom Drucker zu verwendende Codepage: eine Tabelle des Katalogs
|
|
45
|
+
* (`CODE_TABLES`) oder einer der alten Namen. `CP1252` entspricht `wpc1252`,
|
|
46
|
+
* `CP437` entspricht `pc437`.
|
|
47
|
+
*/
|
|
48
|
+
export type PosCodeTable = 'CP437' | 'CP1252' | CodeTableId;
|
|
42
49
|
/** Zeichenvergroesserung (1 = einfach, 2 = doppelt, ... bis 8). */
|
|
43
50
|
export type PosTextSize = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
|
|
44
51
|
/** Modulgroesse des QR-Codes (Punkte je Modul). */
|
|
@@ -171,10 +178,16 @@ export interface EscPosDocument {
|
|
|
171
178
|
styles: AktuelleStile;
|
|
172
179
|
}
|
|
173
180
|
/**
|
|
174
|
-
* Kodiert Text so, wie ihn der Drucker erwartet: ein Byte je Zeichen
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
181
|
+
* Kodiert Text so, wie ihn der Drucker erwartet: ein Byte je Zeichen in der
|
|
182
|
+
* gewaehlten Tabelle (`encodeForCodeTable`). Ein Umlaut wird damit zu genau
|
|
183
|
+
* einem Byte -- Voraussetzung dafuer, dass die Spaltenrechnung stimmt.
|
|
184
|
+
*
|
|
185
|
+
* Die alten Namen `CP1252` und `CP437` bleiben streng: ein Zeichen ausserhalb
|
|
186
|
+
* Latin-1 wird gemeldet statt verstuemmelt (vorher `escPosPrintableText`
|
|
187
|
+
* anwenden). `CP1252` gibt Latin-1 byte-gleich wie bisher aus (auch ein
|
|
188
|
+
* C1-Steuerzeichen roh, das `wpc1252` zu `?` macht); `CP437` hat die Bytes
|
|
189
|
+
* von `pc437`. Die Tabellen des Katalogs wandeln dagegen jedes Zeichen um
|
|
190
|
+
* (Ersatzbuchstaben, sonst `?`).
|
|
178
191
|
*/
|
|
179
192
|
export declare function encodeEscPosText(text: string, codeTable?: PosCodeTable): Uint8Array;
|
|
180
193
|
/** Zeichen je Zeile fuer Papier und Schrift (`fontA`, wenn nichts gesetzt ist). */
|
|
@@ -24,6 +24,8 @@
|
|
|
24
24
|
* `ESC t 16` und bleiben in CP437; dann werden die Umlaute auf ihre
|
|
25
25
|
* CP437-Plaetze umkodiert (ä = 0x84, ü = 0x81, ß = 0xE1, ...). Zeichen ohne
|
|
26
26
|
* CP437-Platz werden zu `?` — weiterhin ein Byte je Zeichen.
|
|
27
|
+
* Weitere Tabellen (PC858, PC850, ISO 8859-15, reine Ersatzbuchstaben) und
|
|
28
|
+
* ihre `ESC t`-Nummern stehen im Katalog `code-tables.ts`.
|
|
27
29
|
*
|
|
28
30
|
* Nicht enthalten (bewusst): Bilddekodierung (PNG/JPEG liest die Huelle),
|
|
29
31
|
* Capability-Profile einzelner Druckermodelle, Kassenlade, 1D-Barcodes.
|
|
@@ -54,6 +56,7 @@ exports.qrRasterDots = qrRasterDots;
|
|
|
54
56
|
exports.rasterRowsBytes = rasterRowsBytes;
|
|
55
57
|
exports.rasterRowsBase64 = rasterRowsBase64;
|
|
56
58
|
exports.escPosRasterImage = escPosRasterImage;
|
|
59
|
+
const code_tables_js_1 = require("./code-tables.js");
|
|
57
60
|
const qr_groesse_js_1 = require("./qr-groesse.js");
|
|
58
61
|
// -------------------------------------------------------------- Befehlsbytes
|
|
59
62
|
// Wortwoertlich aus commands.dart. Die Zahlen sind ASCII-Codes der dortigen
|
|
@@ -87,8 +90,15 @@ const C_POS = [ESC, 0x24]; // ESC $ nL nH
|
|
|
87
90
|
const C_FEED_N = [ESC, 0x64]; // ESC d n
|
|
88
91
|
const C_QR_HEADER = [GS, 0x28, 0x6b]; // GS ( k
|
|
89
92
|
const ZEILENUMBRUCH = 0x0a;
|
|
90
|
-
/**
|
|
91
|
-
|
|
93
|
+
/**
|
|
94
|
+
* Codepage-Nummern fuer `ESC t n`: die alten Namen aus capability_profile.dart
|
|
95
|
+
* (CP437 = 0, CP1252 = 16), dazu jede Tabelle des Katalogs.
|
|
96
|
+
*/
|
|
97
|
+
const CODEPAGE_ID = {
|
|
98
|
+
CP437: 0,
|
|
99
|
+
CP1252: 16,
|
|
100
|
+
...Object.fromEntries(code_tables_js_1.CODE_TABLES.map((t) => [t.id, t.escT])),
|
|
101
|
+
};
|
|
92
102
|
/** Korrekturstufen fuer GS ( k Funktion 169 — aus qrcode.dart. */
|
|
93
103
|
const QR_KORREKTUR = { L: 48, M: 49, Q: 50, H: 51 };
|
|
94
104
|
/** Nennbreite der Rolle in Millimetern — nur fuer Meldungstexte. */
|
|
@@ -108,22 +118,6 @@ const ZEICHEN_JE_ZEILE = {
|
|
|
108
118
|
mm58: { fontA: 32, fontB: 42 },
|
|
109
119
|
mm80: { fontA: 48, fontB: 64 },
|
|
110
120
|
};
|
|
111
|
-
/**
|
|
112
|
-
* Zeichen, die das Vorbild vor dem Kodieren ersetzt (generator.dart `_encode`).
|
|
113
|
-
*
|
|
114
|
-
* **Eine bewusste Abweichung:** Fuer `•` sagt generator.dart `.`,
|
|
115
|
-
* print_paper.dart (portiert als `escPosPrintableText`) dagegen `*`. In Darts
|
|
116
|
-
* eigener Kette faellt das nie auf, weil print_paper vor dem Erzeuger ersetzt
|
|
117
|
-
* und der Erzeuger den Punkt nie zu sehen bekommt — die gedruckte Antwort ist
|
|
118
|
-
* dort also `*`. Ein Verbraucher dieses Pakets kann `escPosText` aber auch
|
|
119
|
-
* direkt aufrufen, und dann duerfen nicht zwei Zeichen fuer dasselbe Zeichen
|
|
120
|
-
* herauskommen. Deshalb gilt hier dieselbe Antwort wie dort.
|
|
121
|
-
*/
|
|
122
|
-
const ZEICHEN_ERSATZ = [
|
|
123
|
-
['’', "'"], // typografisches Apostroph
|
|
124
|
-
['´', "'"], // Akut
|
|
125
|
-
['•', '*'], // Aufzaehlungspunkt (siehe Kommentar oben)
|
|
126
|
-
];
|
|
127
121
|
// ------------------------------------------------------------------ Helfer
|
|
128
122
|
function anhaengen(doc, bytes) {
|
|
129
123
|
const ziel = doc.bytes;
|
|
@@ -154,40 +148,25 @@ function latin1(text) {
|
|
|
154
148
|
return bytes;
|
|
155
149
|
}
|
|
156
150
|
/**
|
|
157
|
-
* Kodiert Text so, wie ihn der Drucker erwartet: ein Byte je Zeichen
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
151
|
+
* Kodiert Text so, wie ihn der Drucker erwartet: ein Byte je Zeichen in der
|
|
152
|
+
* gewaehlten Tabelle (`encodeForCodeTable`). Ein Umlaut wird damit zu genau
|
|
153
|
+
* einem Byte -- Voraussetzung dafuer, dass die Spaltenrechnung stimmt.
|
|
154
|
+
*
|
|
155
|
+
* Die alten Namen `CP1252` und `CP437` bleiben streng: ein Zeichen ausserhalb
|
|
156
|
+
* Latin-1 wird gemeldet statt verstuemmelt (vorher `escPosPrintableText`
|
|
157
|
+
* anwenden). `CP1252` gibt Latin-1 byte-gleich wie bisher aus (auch ein
|
|
158
|
+
* C1-Steuerzeichen roh, das `wpc1252` zu `?` macht); `CP437` hat die Bytes
|
|
159
|
+
* von `pc437`. Die Tabellen des Katalogs wandeln dagegen jedes Zeichen um
|
|
160
|
+
* (Ersatzbuchstaben, sonst `?`).
|
|
161
161
|
*/
|
|
162
162
|
function encodeEscPosText(text, codeTable = 'CP1252') {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
const bytes = latin1(aufbereitet);
|
|
168
|
-
if (codeTable !== 'CP437')
|
|
169
|
-
return bytes;
|
|
170
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
171
|
-
const b = bytes[i] ?? 0;
|
|
172
|
-
if (b >= 0x80)
|
|
173
|
-
bytes[i] = CP437_AUS_LATIN1.get(b) ?? 0x3f;
|
|
163
|
+
if (codeTable === 'CP1252' || codeTable === 'CP437') {
|
|
164
|
+
const aufbereitet = (0, code_tables_js_1.replaceKnownCharacters)(text);
|
|
165
|
+
const bytes = latin1(aufbereitet); // wirft ausserhalb Latin-1
|
|
166
|
+
return codeTable === 'CP1252' ? bytes : (0, code_tables_js_1.encodeReplaced)(aufbereitet, 'pc437');
|
|
174
167
|
}
|
|
175
|
-
return
|
|
168
|
+
return (0, code_tables_js_1.encodeForCodeTable)(text, codeTable);
|
|
176
169
|
}
|
|
177
|
-
/**
|
|
178
|
-
* Latin-1-Byte -> CP437-Byte fuer die Zeichen, die CP437 kennt (deutsche
|
|
179
|
-
* Umlaute, ß, westeuropaeische Akzente, Waehrungs-/Sonderzeichen). Alles
|
|
180
|
-
* andere ab 0x80 hat in CP437 keinen Platz und wird zu "?".
|
|
181
|
-
*/
|
|
182
|
-
const CP437_AUS_LATIN1 = new Map([
|
|
183
|
-
[0xc7, 0x80], [0xfc, 0x81], [0xe9, 0x82], [0xe2, 0x83], [0xe4, 0x84], [0xe0, 0x85], [0xe5, 0x86], [0xe7, 0x87],
|
|
184
|
-
[0xea, 0x88], [0xeb, 0x89], [0xe8, 0x8a], [0xef, 0x8b], [0xee, 0x8c], [0xec, 0x8d], [0xc4, 0x8e], [0xc5, 0x8f],
|
|
185
|
-
[0xc9, 0x90], [0xe6, 0x91], [0xc6, 0x92], [0xf4, 0x93], [0xf6, 0x94], [0xf2, 0x95], [0xfb, 0x96], [0xf9, 0x97],
|
|
186
|
-
[0xff, 0x98], [0xd6, 0x99], [0xdc, 0x9a], [0xa2, 0x9b], [0xa3, 0x9c], [0xa5, 0x9d], [0xe1, 0xa0], [0xed, 0xa1],
|
|
187
|
-
[0xf3, 0xa2], [0xfa, 0xa3], [0xf1, 0xa4], [0xd1, 0xa5], [0xaa, 0xa6], [0xba, 0xa7], [0xbf, 0xa8], [0xac, 0xaa],
|
|
188
|
-
[0xbd, 0xab], [0xbc, 0xac], [0xa1, 0xad], [0xab, 0xae], [0xbb, 0xaf], [0xdf, 0xe1], [0xb5, 0xe6], [0xb1, 0xf1],
|
|
189
|
-
[0xf7, 0xf6], [0xb0, 0xf8], [0xb7, 0xfa], [0xb2, 0xfd], [0xa0, 0xff],
|
|
190
|
-
]);
|
|
191
170
|
/** Zeichen je Zeile fuer Papier und Schrift (`fontA`, wenn nichts gesetzt ist). */
|
|
192
171
|
function escPosMaxCharsPerLine(paperSize, font) {
|
|
193
172
|
const breiten = ZEICHEN_JE_ZEILE[paperSize];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { type PosPaperSize, type PosAlign, type PosFont, type PosCutMode, type PosCodeTable, type PosTextSize, type QrSize, type QrCorrection, type QrMatrix, type PosStyles, type PosColumn, type EscPosOptions, type EscPosTextOptions, type EscPosHrOptions, type EscPosQrOptions, type EscPosQrRasterOptions, type EscPosDocument, createEscPosDocument, escPosBytes, escPosReset, escPosSetGlobalCodeTable, escPosSetGlobalFont, escPosSetStyles, escPosText, escPosEmptyLines, escPosFeed, escPosCut, escPosHr, escPosRow, escPosQrCode, escPosQrRaster, qrRasterDots, type RasterImage, rasterRowsBytes, rasterRowsBase64, escPosRasterImage, encodeEscPosText, qrCodeBytes, escPosMaxCharsPerLine, escPosWrapLines, wrapText, } from './escpos.js';
|
|
2
|
+
export { type CodeTableId, type CodeTable, CODE_TABLES, codeTableById, codeTableFromSetting, encodeForCodeTable, } from './code-tables.js';
|
|
2
3
|
export { type QrModuleSize, type QrSizing, QR_MODULE_SIZE_CAP, QR_QUIET_ZONE_MODULES, QR_MIN_MODULE_DOTS, QR_EXCEPTION_MODULE_DOTS, QR_MAX_MODULE_DOTS, QR_PRINT_WIDTH_DOTS, qrModuleCount, qrFitsInVersion, computeQrSizing, qrSizingFor, } from './qr-groesse.js';
|
|
3
4
|
export { escPosPrintableText } from './printable.js';
|
|
4
5
|
export { type UsbEndpointLike, type UsbAlternateLike, type UsbInterfaceLike, type UsbConfigurationLike, type UsbTransferOutResultLike, type UsbWriterLike, type UsbIdentityLike, type UsbDeviceLike, type UsbPrinterEndpoint, type UsbPrinterConnection, USB_VENDOR_EPSON, USB_CLASS_PRINTER, UsbTimeoutError, usbDeviceKey, usbFindPrinterEndpoint, usbWriteAll, usbConnectPrinter, usbPrint, usbDisconnect, } from './webusb.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.usbDisconnect = exports.usbPrint = exports.usbConnectPrinter = exports.usbWriteAll = exports.usbFindPrinterEndpoint = exports.usbDeviceKey = exports.UsbTimeoutError = exports.USB_CLASS_PRINTER = exports.USB_VENDOR_EPSON = exports.escPosPrintableText = exports.qrSizingFor = exports.computeQrSizing = exports.qrFitsInVersion = exports.qrModuleCount = exports.QR_PRINT_WIDTH_DOTS = exports.QR_MAX_MODULE_DOTS = exports.QR_EXCEPTION_MODULE_DOTS = exports.QR_MIN_MODULE_DOTS = exports.QR_QUIET_ZONE_MODULES = exports.QR_MODULE_SIZE_CAP = exports.wrapText = exports.escPosWrapLines = exports.escPosMaxCharsPerLine = exports.qrCodeBytes = exports.encodeEscPosText = exports.escPosRasterImage = exports.rasterRowsBase64 = exports.rasterRowsBytes = exports.qrRasterDots = exports.escPosQrRaster = exports.escPosQrCode = exports.escPosRow = exports.escPosHr = exports.escPosCut = exports.escPosFeed = exports.escPosEmptyLines = exports.escPosText = exports.escPosSetStyles = exports.escPosSetGlobalFont = exports.escPosSetGlobalCodeTable = exports.escPosReset = exports.escPosBytes = exports.createEscPosDocument = void 0;
|
|
3
|
+
exports.usbDisconnect = exports.usbPrint = exports.usbConnectPrinter = exports.usbWriteAll = exports.usbFindPrinterEndpoint = exports.usbDeviceKey = exports.UsbTimeoutError = exports.USB_CLASS_PRINTER = exports.USB_VENDOR_EPSON = exports.escPosPrintableText = exports.qrSizingFor = exports.computeQrSizing = exports.qrFitsInVersion = exports.qrModuleCount = exports.QR_PRINT_WIDTH_DOTS = exports.QR_MAX_MODULE_DOTS = exports.QR_EXCEPTION_MODULE_DOTS = exports.QR_MIN_MODULE_DOTS = exports.QR_QUIET_ZONE_MODULES = exports.QR_MODULE_SIZE_CAP = exports.encodeForCodeTable = exports.codeTableFromSetting = exports.codeTableById = exports.CODE_TABLES = exports.wrapText = exports.escPosWrapLines = exports.escPosMaxCharsPerLine = exports.qrCodeBytes = exports.encodeEscPosText = exports.escPosRasterImage = exports.rasterRowsBase64 = exports.rasterRowsBytes = exports.qrRasterDots = exports.escPosQrRaster = exports.escPosQrCode = exports.escPosRow = exports.escPosHr = exports.escPosCut = exports.escPosFeed = exports.escPosEmptyLines = exports.escPosText = exports.escPosSetStyles = exports.escPosSetGlobalFont = exports.escPosSetGlobalCodeTable = exports.escPosReset = exports.escPosBytes = exports.createEscPosDocument = void 0;
|
|
4
4
|
var escpos_js_1 = require("./escpos.js");
|
|
5
5
|
Object.defineProperty(exports, "createEscPosDocument", { enumerable: true, get: function () { return escpos_js_1.createEscPosDocument; } });
|
|
6
6
|
Object.defineProperty(exports, "escPosBytes", { enumerable: true, get: function () { return escpos_js_1.escPosBytes; } });
|
|
@@ -25,6 +25,11 @@ Object.defineProperty(exports, "qrCodeBytes", { enumerable: true, get: function
|
|
|
25
25
|
Object.defineProperty(exports, "escPosMaxCharsPerLine", { enumerable: true, get: function () { return escpos_js_1.escPosMaxCharsPerLine; } });
|
|
26
26
|
Object.defineProperty(exports, "escPosWrapLines", { enumerable: true, get: function () { return escpos_js_1.escPosWrapLines; } });
|
|
27
27
|
Object.defineProperty(exports, "wrapText", { enumerable: true, get: function () { return escpos_js_1.wrapText; } });
|
|
28
|
+
var code_tables_js_1 = require("./code-tables.js");
|
|
29
|
+
Object.defineProperty(exports, "CODE_TABLES", { enumerable: true, get: function () { return code_tables_js_1.CODE_TABLES; } });
|
|
30
|
+
Object.defineProperty(exports, "codeTableById", { enumerable: true, get: function () { return code_tables_js_1.codeTableById; } });
|
|
31
|
+
Object.defineProperty(exports, "codeTableFromSetting", { enumerable: true, get: function () { return code_tables_js_1.codeTableFromSetting; } });
|
|
32
|
+
Object.defineProperty(exports, "encodeForCodeTable", { enumerable: true, get: function () { return code_tables_js_1.encodeForCodeTable; } });
|
|
28
33
|
var qr_groesse_js_1 = require("./qr-groesse.js");
|
|
29
34
|
Object.defineProperty(exports, "QR_MODULE_SIZE_CAP", { enumerable: true, get: function () { return qr_groesse_js_1.QR_MODULE_SIZE_CAP; } });
|
|
30
35
|
Object.defineProperty(exports, "QR_QUIET_ZONE_MODULES", { enumerable: true, get: function () { return qr_groesse_js_1.QR_QUIET_ZONE_MODULES; } });
|