@kreiseck/kasseneck-api 1.0.0 → 1.1.1
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 +67 -0
- package/dist/cjs/pos/texte.d.ts +51 -0
- package/dist/cjs/pos/texte.js +32 -0
- package/dist/cjs/printing/code-table-preview.d.ts +15 -0
- package/dist/cjs/printing/code-table-preview.js +24 -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 +2 -0
- package/dist/cjs/printing/index.js +8 -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 +58 -0
- package/dist/cjs/receipt/code-table-test-sheet.js +155 -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 +51 -0
- package/dist/esm/pos/texte.js +32 -0
- package/dist/esm/printing/code-table-preview.d.ts +15 -0
- package/dist/esm/printing/code-table-preview.js +21 -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 +2 -0
- package/dist/esm/printing/index.js +2 -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 +58 -0
- package/dist/esm/receipt/code-table-test-sheet.js +149 -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-preview.json +14 -0
- 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 +209 -0
- package/fixtures/expected/code-table-test-sheet.mm58.hex +62 -0
- package/fixtures/expected/code-table-test-sheet.mm80.hex +63 -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 +58 -1
- package/fixtures/surface.json +1 -1
- package/package.json +4 -2
|
@@ -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,6 @@
|
|
|
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';
|
|
5
|
+
export { codeTablePreviewText } from './code-table-preview.js';
|
|
4
6
|
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.codeTablePreviewText = 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; } });
|
|
@@ -38,6 +43,8 @@ Object.defineProperty(exports, "computeQrSizing", { enumerable: true, get: funct
|
|
|
38
43
|
Object.defineProperty(exports, "qrSizingFor", { enumerable: true, get: function () { return qr_groesse_js_1.qrSizingFor; } });
|
|
39
44
|
var printable_js_1 = require("./printable.js");
|
|
40
45
|
Object.defineProperty(exports, "escPosPrintableText", { enumerable: true, get: function () { return printable_js_1.escPosPrintableText; } });
|
|
46
|
+
var code_table_preview_js_1 = require("./code-table-preview.js");
|
|
47
|
+
Object.defineProperty(exports, "codeTablePreviewText", { enumerable: true, get: function () { return code_table_preview_js_1.codeTablePreviewText; } });
|
|
41
48
|
var webusb_js_1 = require("./webusb.js");
|
|
42
49
|
Object.defineProperty(exports, "USB_VENDOR_EPSON", { enumerable: true, get: function () { return webusb_js_1.USB_VENDOR_EPSON; } });
|
|
43
50
|
Object.defineProperty(exports, "USB_CLASS_PRINTER", { enumerable: true, get: function () { return webusb_js_1.USB_CLASS_PRINTER; } });
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* ersatzlos weg, alles Uebrige auf `?`. Ein Artikelname aus einer
|
|
16
16
|
* ERP-Uebernahme mit Gedankenstrich soll den Beleg nicht verhindern.
|
|
17
17
|
*/
|
|
18
|
+
import type { PosCodeTable } from './escpos.js';
|
|
18
19
|
/**
|
|
19
20
|
* Ersetzt alles, was der Bondrucker nicht darstellen kann, durch eine
|
|
20
21
|
* druckbare Entsprechung. Reine Funktion, ohne Zustand und ohne Drucker.
|
|
@@ -22,6 +23,17 @@
|
|
|
22
23
|
* Vor `escPosText`/`escPosRow` anwenden, wenn der Text aus fremder Hand kommt
|
|
23
24
|
* (Artikelstamm, ERP-Uebernahme, Kundenname). `•` wird hier zu `*`, und der
|
|
24
25
|
* Erzeuger sagt dasselbe — auch wer diese Funktion weglaesst, bekommt also
|
|
25
|
-
* dasselbe Zeichen (siehe ZEICHEN_ERSATZ in
|
|
26
|
+
* dasselbe Zeichen (siehe ZEICHEN_ERSATZ in code-tables.ts).
|
|
27
|
+
*
|
|
28
|
+
* Mit `codeTable` wird der Text fuer genau diese Tabelle fertig gemacht:
|
|
29
|
+
* - eine Tabelle des Katalogs (`CodeTableId`): `€` bleibt stehen, wenn die
|
|
30
|
+
* Tabelle es hat (der Drucker bekommt das echte Byte), sonst `EUR`; jedes
|
|
31
|
+
* der zehn Zeichen, das der Tabelle fehlt (`§` auf pc437, alle Umlaute auf
|
|
32
|
+
* `replacement` ...), wird schon hier zu seinen Ersatzbuchstaben. Danach
|
|
33
|
+
* ist jedes Zeichen genau ein Byte, und Spalten, die am Text gerechnet
|
|
34
|
+
* werden, stimmen auch am Papier.
|
|
35
|
+
* - `CP437` (alter Name): wie `pc437`, also `§` -> `Par.`.
|
|
36
|
+
* - ohne Angabe, `null` oder `CP1252`: genau wie bisher (Bons ohne gewaehlte
|
|
37
|
+
* Tabelle bleiben byte-gleich).
|
|
26
38
|
*/
|
|
27
|
-
export declare function escPosPrintableText(text: string): string;
|
|
39
|
+
export declare function escPosPrintableText(text: string, codeTable?: PosCodeTable | null): string;
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
20
|
exports.escPosPrintableText = escPosPrintableText;
|
|
21
|
+
const code_tables_js_1 = require("./code-tables.js");
|
|
21
22
|
/** Ersetzungen aus print_paper.dart, Schluessel sind Unicode-Codepunkte. */
|
|
22
23
|
const ERSETZUNGEN = new Map([
|
|
23
24
|
[0x2013, '-'], // – Halbgeviertstrich
|
|
@@ -66,12 +67,34 @@ function istEmojiOderNullbreite(codepunkt) {
|
|
|
66
67
|
* Vor `escPosText`/`escPosRow` anwenden, wenn der Text aus fremder Hand kommt
|
|
67
68
|
* (Artikelstamm, ERP-Uebernahme, Kundenname). `•` wird hier zu `*`, und der
|
|
68
69
|
* Erzeuger sagt dasselbe — auch wer diese Funktion weglaesst, bekommt also
|
|
69
|
-
* dasselbe Zeichen (siehe ZEICHEN_ERSATZ in
|
|
70
|
+
* dasselbe Zeichen (siehe ZEICHEN_ERSATZ in code-tables.ts).
|
|
71
|
+
*
|
|
72
|
+
* Mit `codeTable` wird der Text fuer genau diese Tabelle fertig gemacht:
|
|
73
|
+
* - eine Tabelle des Katalogs (`CodeTableId`): `€` bleibt stehen, wenn die
|
|
74
|
+
* Tabelle es hat (der Drucker bekommt das echte Byte), sonst `EUR`; jedes
|
|
75
|
+
* der zehn Zeichen, das der Tabelle fehlt (`§` auf pc437, alle Umlaute auf
|
|
76
|
+
* `replacement` ...), wird schon hier zu seinen Ersatzbuchstaben. Danach
|
|
77
|
+
* ist jedes Zeichen genau ein Byte, und Spalten, die am Text gerechnet
|
|
78
|
+
* werden, stimmen auch am Papier.
|
|
79
|
+
* - `CP437` (alter Name): wie `pc437`, also `§` -> `Par.`.
|
|
80
|
+
* - ohne Angabe, `null` oder `CP1252`: genau wie bisher (Bons ohne gewaehlte
|
|
81
|
+
* Tabelle bleiben byte-gleich).
|
|
70
82
|
*/
|
|
71
|
-
function escPosPrintableText(text) {
|
|
83
|
+
function escPosPrintableText(text, codeTable) {
|
|
84
|
+
const tabelle = tabelleFuerErsatz(codeTable);
|
|
85
|
+
const fehlend = tabelle === null ? [] : (0, code_tables_js_1.codeTableById)(tabelle).missing;
|
|
86
|
+
const echtesEuro = tabelle !== null && !fehlend.includes('€');
|
|
72
87
|
let ergebnis = '';
|
|
73
88
|
for (const zeichen of text) {
|
|
74
89
|
const codepunkt = zeichen.codePointAt(0);
|
|
90
|
+
if (fehlend.includes(zeichen)) {
|
|
91
|
+
ergebnis += (0, code_tables_js_1.ersatzBuchstaben)(zeichen);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (codepunkt === 0x20ac && echtesEuro) {
|
|
95
|
+
ergebnis += zeichen;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
75
98
|
const ersatz = ERSETZUNGEN.get(codepunkt);
|
|
76
99
|
if (ersatz !== undefined) {
|
|
77
100
|
ergebnis += ersatz;
|
|
@@ -88,3 +111,14 @@ function escPosPrintableText(text) {
|
|
|
88
111
|
}
|
|
89
112
|
return ergebnis;
|
|
90
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Tabelle, deren fehlende Zeichen schon am Text ersetzt werden. `null` heisst
|
|
116
|
+
* alter Weg ohne Aenderung (keine Wahl, `null`, `CP1252`).
|
|
117
|
+
*/
|
|
118
|
+
function tabelleFuerErsatz(codeTable) {
|
|
119
|
+
if (codeTable === undefined || codeTable === null || codeTable === 'CP1252')
|
|
120
|
+
return null;
|
|
121
|
+
if (codeTable === 'CP437')
|
|
122
|
+
return 'pc437';
|
|
123
|
+
return codeTable;
|
|
124
|
+
}
|
package/dist/cjs/react/index.js
CHANGED
|
@@ -96,6 +96,13 @@ function ReceiptSheetLines({ sheet: blatt, logoUrl, renderQr, qrHidden: qrVerdec
|
|
|
96
96
|
return ((0, jsx_runtime_1.jsx)("div", { className: klasse, "data-zeichen": z, style: blattStil, children: blatt.blocks.map((b, i) => {
|
|
97
97
|
switch (b.kind) {
|
|
98
98
|
case 'line':
|
|
99
|
+
if (b.doubleSizeLead !== undefined && b.doubleSizeLead > 0) {
|
|
100
|
+
// Wie am Papier (`GS !` doppelt): die Nummernzelle in doppelter
|
|
101
|
+
// Schrift, die Zeile zwei Zeilen hoch, der Rest auf der Grundlinie.
|
|
102
|
+
// `ch` im Span misst die doppelte Schrift, darum die halbe Zahl.
|
|
103
|
+
const n = b.doubleSizeLead;
|
|
104
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "keck-blatt-zeile keck-blatt-zeile--gross", style: { display: 'flex', alignItems: 'flex-end', whiteSpace: 'pre', height: '4ch', overflow: 'hidden', fontWeight: b.bold ? 'bold' : 'normal' }, children: [(0, jsx_runtime_1.jsx)("span", { style: { fontSize: '2em', width: `${n / 2}ch`, lineHeight: '2ch', fontWeight: 'bold', textAlign: 'center', flex: 'none' }, children: b.text.slice(0, n).trim() }), (0, jsx_runtime_1.jsx)("span", { style: { lineHeight: '2ch' }, children: b.text.slice(n) })] }, i));
|
|
105
|
+
}
|
|
99
106
|
return ((0, jsx_runtime_1.jsx)("div", { className: "keck-blatt-zeile", style: { whiteSpace: 'pre', height: '2ch', lineHeight: '2ch', overflow: 'hidden', fontWeight: b.bold ? 'bold' : 'normal' }, children: b.text }, i));
|
|
100
107
|
case 'logo':
|
|
101
108
|
return ((0, jsx_runtime_1.jsx)("div", { className: "keck-blatt-logo", style: { height: `${b.heightLines * 2}ch`, display: 'flex', justifyContent: 'center' }, children: logoUrl === undefined ? null : ((0, jsx_runtime_1.jsx)("img", { src: logoUrl, alt: "", "aria-hidden": "true", style: { width: `${b.widthFraction * z}ch`, height: `${b.heightLines * 2}ch`, objectFit: 'contain' } })) }, i));
|
|
@@ -40,6 +40,15 @@ export type SheetBlock = {
|
|
|
40
40
|
readonly text: string;
|
|
41
41
|
readonly bold: boolean;
|
|
42
42
|
readonly blank: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Die ersten n Spalten sind EINE Zelle, deren Inhalt (ohne Leerraum)
|
|
45
|
+
* doppelt breit und doppelt hoch steht -- die Zeile ist dann zwei
|
|
46
|
+
* Zeilen hoch. Nur das Testblatt des Zeichensatzes setzt das (Nummern
|
|
47
|
+
* links); fehlt es, ist alles einfach gross. Ein Zeichner, der das Feld
|
|
48
|
+
* nicht kennt, zeigt die Zeile in einfacher Groesse, die Spalten
|
|
49
|
+
* bleiben dieselben.
|
|
50
|
+
*/
|
|
51
|
+
readonly doubleSizeLead?: number;
|
|
43
52
|
} | {
|
|
44
53
|
readonly kind: 'logo';
|
|
45
54
|
readonly widthFraction: number;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Erzeugt von scripts/zeichensatz-vorlage.py -- nicht von Hand aendern.
|
|
3
|
+
// Schrift: Menlo Regular 20 px (sha256 dc256e0b39c2a6fec947129d421fef41b8b429f58f9b6e5d1b148c87f775c1f6), Schwelle 160.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.CODE_TABLE_REFERENCE_RASTER = void 0;
|
|
6
|
+
/** Die Vorlage-Zeile als Rasterbild: 384 x 24 Punkte, MSB zuerst, je Zeile auf volle Bytes aufgefuellt; base64. */
|
|
7
|
+
exports.CODE_TABLE_REFERENCE_RASTER = {
|
|
8
|
+
width: 384,
|
|
9
|
+
height: 24,
|
|
10
|
+
bits: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGYAAGYAAGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGYAAGYAAGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGYAAGYAAGYAABgAADwAAIEAAH4AAB8AAD4AADwAAAAAAAAAAAAAAAAAAAAAAAAAAGYAAGYAAGYAADwAAH4AAcOAAOcAAD8AAH4AAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAMMAAcOAAMMAAHAAAGAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAMMAAcOAAMMAAOAAAGAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAH4AAMMAAGYAAcOAAcOAAMwAAMAAAHAAAGYAAAAAAAAAAAAAAAAAAAAAAAAAAOcAAOcAAMMAAGYAAYGAAcOAANgAAfwAAHgAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAMMAAMMAAGYAAYGAAcOAANgAAfwAAM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAcOAAMMAAGcAAYGAAcOAANwAAMAAAMcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAYGAAMMAAMMAAYGAAcOAAM4AAfgAAMMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAYGAAMMAAP8AAYGAAcOAAMcAA/gAAOMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcMAAYGAAMMAAP8AAcGAAcOAAMGAAMAAAHsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYMAAcOAAMMAAcOAAcOAAcOAAMGAAOAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYMAAMMAAMMAAYGAAMMAAMMAAMGAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO8AAOcAAP8AAYGAAP8AAP8AAPOAAH8AAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAH4AAH8AA4HAAH4AAH4AAP8AAD8AAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
|
|
11
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Das Testblatt fuer den Zeichensatz: welche Code-Tabelle druckt auf diesem
|
|
3
|
+
* Drucker die Umlaute richtig?
|
|
4
|
+
*
|
|
5
|
+
* Oben steht die Vorlage-Zeile als Rasterbild -- ein Bild druckt jeder
|
|
6
|
+
* Drucker gleich, egal welche Tabelle er gerade hat. Darunter je Tabelle des
|
|
7
|
+
* Katalogs eine Zeile mit ihrer Nummer (gross), umgeschaltet mit `ESC t n`
|
|
8
|
+
* und mit den Bytes dieser Tabelle. Richtig ist die Zeile ohne falsches
|
|
9
|
+
* Zeichen; eine Luecke (Zeichen fehlt der Tabelle) ist in Ordnung, bei
|
|
10
|
+
* mehreren die mit den wenigsten Luecken, sonst Zeile 6 (Ersatzbuchstaben).
|
|
11
|
+
* Nicht „die erste Zeile mit richtigen Umlauten“: ein Drucker mit nur PC437
|
|
12
|
+
* druckt Zeile 2 und 3 mit richtigen Umlauten, aber falschem € und §.
|
|
13
|
+
*
|
|
14
|
+
* Alles ausserhalb der Testzeilen steht mit Ersatzbuchstaben (reines ASCII),
|
|
15
|
+
* auch die Anleitung: „Lücke“ aus dem Katalog steht am Blatt als „Luecke“.
|
|
16
|
+
*
|
|
17
|
+
* Bildschirm und Papier zeigen dasselbe Blatt: `codeTableTestSheet` liefert
|
|
18
|
+
* es im Zeilenmodell des Beleg-Blatts (`ReceiptSheet`), `codeTableTestSheetBytes`
|
|
19
|
+
* druckt genau diese Zeilen. Das Blatt hat immer 32 Spalten (58 mm); auf
|
|
20
|
+
* 80 mm steht der Block ueber den linken Rand (`GS L`) mittig.
|
|
21
|
+
*
|
|
22
|
+
* Gemeinsamer Prueffall mit dem Dart-Zwilling:
|
|
23
|
+
* `fixtures/expected/code-table-test-sheet.{mm58,mm80}.hex` und `.lines.json`.
|
|
24
|
+
*/
|
|
25
|
+
import type { ReceiptSheet } from './blatt.js';
|
|
26
|
+
import { type CodeTable, type CodeTableId } from '../printing/code-tables.js';
|
|
27
|
+
import { type PosPaperSize, type RasterImage } from '../printing/escpos.js';
|
|
28
|
+
/** Spalten des Testblatts -- immer 58-mm-Format. */
|
|
29
|
+
export declare const CODE_TABLE_TEST_SHEET_CHARS = 32;
|
|
30
|
+
export interface CodeTableTestSheetInput {
|
|
31
|
+
/** Kassen-Kennung fuer die Kopfzeile (keine Personendaten). */
|
|
32
|
+
cashregisterLabel: string;
|
|
33
|
+
/** Zeitpunkt des Drucks; die Kopfzeile zeigt ihn in Wiener Zeit. */
|
|
34
|
+
time: Date;
|
|
35
|
+
/** Papier des Druckers; das Blatt bleibt 32 Spalten, auf 80 mm mittig. */
|
|
36
|
+
paper: PosPaperSize;
|
|
37
|
+
}
|
|
38
|
+
/** Eine Testzeile: Nummer, Tabelle und die Zeichen, die ihr fehlen (fuer „ohne €“ am Bildschirm). */
|
|
39
|
+
export interface CodeTableTestSheetRow {
|
|
40
|
+
readonly number: CodeTable['number'];
|
|
41
|
+
readonly codeTable: CodeTableId;
|
|
42
|
+
readonly missing: readonly string[];
|
|
43
|
+
}
|
|
44
|
+
/** Das Testblatt im Zeilenmodell des Beleg-Blatts, dazu die Testzeilen. */
|
|
45
|
+
export interface CodeTableTestSheet extends ReceiptSheet {
|
|
46
|
+
readonly rows: readonly CodeTableTestSheetRow[];
|
|
47
|
+
}
|
|
48
|
+
/** Die Vorlage-Zeile als Rasterbild (384 x 24 Punkte), wie sie am Papier steht. */
|
|
49
|
+
export declare function codeTableReferenceImage(): RasterImage;
|
|
50
|
+
/** Das Testblatt im Zeilenmodell des Beleg-Blatts -- dieselben Zeilen wie am Papier. */
|
|
51
|
+
export declare function codeTableTestSheet(options: CodeTableTestSheetInput): CodeTableTestSheet;
|
|
52
|
+
/**
|
|
53
|
+
* Das Testblatt als ESC/POS-Bytes. Jede Testzeile schaltet nach ihrer
|
|
54
|
+
* Nummer einmal mit `FS .` + `ESC t n` auf ihre Tabelle und traegt deren Bytes (`encodeForCodeTable`,
|
|
55
|
+
* also das echte €-Byte, wo die Tabelle es hat). Die Nummer steht doppelt
|
|
56
|
+
* breit und hoch (`GS !`), die Vorlage als Rasterbild (`GS v 0`).
|
|
57
|
+
*/
|
|
58
|
+
export declare function codeTableTestSheetBytes(options: CodeTableTestSheetInput): Uint8Array;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CODE_TABLE_TEST_SHEET_CHARS = void 0;
|
|
4
|
+
exports.codeTableReferenceImage = codeTableReferenceImage;
|
|
5
|
+
exports.codeTableTestSheet = codeTableTestSheet;
|
|
6
|
+
exports.codeTableTestSheetBytes = codeTableTestSheetBytes;
|
|
7
|
+
const marke_js_1 = require("./marke.js");
|
|
8
|
+
const vienna_time_js_1 = require("../vienna-time.js");
|
|
9
|
+
const texte_js_1 = require("../pos/texte.js");
|
|
10
|
+
const code_tables_js_1 = require("../printing/code-tables.js");
|
|
11
|
+
const code_table_reference_data_js_1 = require("./code-table-reference-data.js");
|
|
12
|
+
const escpos_js_1 = require("../printing/escpos.js");
|
|
13
|
+
/** Spalten des Testblatts -- immer 58-mm-Format. */
|
|
14
|
+
exports.CODE_TABLE_TEST_SHEET_CHARS = 32;
|
|
15
|
+
/** Die zehn Zeichen der Vorlage, in der Reihenfolge des Katalogs. */
|
|
16
|
+
const VORLAGE = ['ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß', '€', '§', '°'];
|
|
17
|
+
/** Spalte des ersten Zeichens; danach jede zweite. Muss zu scripts/zeichensatz-vorlage.py passen. */
|
|
18
|
+
const ERSTE_SPALTE = 5;
|
|
19
|
+
/** Breite der Nummernzelle: eine Ziffer doppelt breit. */
|
|
20
|
+
const NUMMER_SPALTEN = 2;
|
|
21
|
+
const TRENNER = ' | ';
|
|
22
|
+
/** Punkte je Blatt-Zeile: 32 Zeichen zu 12 Punkten. */
|
|
23
|
+
const BLATT_PUNKTE = exports.CODE_TABLE_TEST_SHEET_CHARS * 12;
|
|
24
|
+
/** Linker Rand, der den 32-Spalten-Block auf 80 mm (576 Punkte) mittig setzt. */
|
|
25
|
+
const RAND_80 = (576 - BLATT_PUNKTE) / 2;
|
|
26
|
+
const GS = 0x1d;
|
|
27
|
+
const ESC = 0x1b;
|
|
28
|
+
/** `ESC t` der Vorgabe ohne gewaehlte Tabelle (WPC1252). */
|
|
29
|
+
const VORGABE_ESC_T = 16;
|
|
30
|
+
/** Die Vorlage-Zeile als Rasterbild (384 x 24 Punkte), wie sie am Papier steht. */
|
|
31
|
+
function codeTableReferenceImage() {
|
|
32
|
+
const r = code_table_reference_data_js_1.CODE_TABLE_REFERENCE_RASTER;
|
|
33
|
+
return (0, marke_js_1.entpackeRasterBits)(r.bits, r.width, r.height);
|
|
34
|
+
}
|
|
35
|
+
/** Text in reines ASCII (Ersatzbuchstaben): steht auf jedem Drucker gleich, egal welche Tabelle gilt. */
|
|
36
|
+
function nurAscii(text) {
|
|
37
|
+
return String.fromCharCode(...(0, code_tables_js_1.encodeForCodeTable)(text, 'replacement'));
|
|
38
|
+
}
|
|
39
|
+
function zeile(text, bold = false, ausrichtung = 'left') {
|
|
40
|
+
const rest = exports.CODE_TABLE_TEST_SHEET_CHARS - text.length;
|
|
41
|
+
const links = ausrichtung === 'center' ? Math.floor(rest / 2) : 0;
|
|
42
|
+
return { kind: 'line', text: ' '.repeat(links) + text + ' '.repeat(rest - links), bold, blank: false };
|
|
43
|
+
}
|
|
44
|
+
function zeilen(text, bold = false, ausrichtung = 'left') {
|
|
45
|
+
return (0, escpos_js_1.wrapText)(nurAscii(text), exports.CODE_TABLE_TEST_SHEET_CHARS).map((t) => zeile(t, bold, ausrichtung));
|
|
46
|
+
}
|
|
47
|
+
/** Die Zeichen einer Tabelle an ihren Spalten; ein fehlendes Zeichen laesst seine Luecke. */
|
|
48
|
+
function zeichenDerTabelle(tabelle) {
|
|
49
|
+
return VORLAGE.map((z) => (tabelle.missing.includes(z) ? ' ' : z)).join(' ').trimEnd();
|
|
50
|
+
}
|
|
51
|
+
function nummernZeile(nummer, text) {
|
|
52
|
+
const kopf = String(nummer).padStart(NUMMER_SPALTEN, ' ') + TRENNER;
|
|
53
|
+
return { ...zeile(kopf + text), doubleSizeLead: NUMMER_SPALTEN };
|
|
54
|
+
}
|
|
55
|
+
const zweistellig = (n) => String(n).padStart(2, '0');
|
|
56
|
+
/** Das Testblatt im Zeilenmodell des Beleg-Blatts -- dieselben Zeilen wie am Papier. */
|
|
57
|
+
function codeTableTestSheet(options) {
|
|
58
|
+
return blattBauen(options).blatt;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Baut das Blatt und merkt sich dabei, welcher Block die Vorlage-Zeile ist.
|
|
62
|
+
* Die Bytes suchen sie nicht am Text (der ist `nurAscii` und kann sich
|
|
63
|
+
* aendern), sondern nehmen genau diese Stelle.
|
|
64
|
+
*/
|
|
65
|
+
function blattBauen(options) {
|
|
66
|
+
const z = exports.CODE_TABLE_TEST_SHEET_CHARS;
|
|
67
|
+
const uhr = (0, vienna_time_js_1.toViennaWallClock)(options.time);
|
|
68
|
+
const zeit = `${zweistellig(uhr.day)}.${zweistellig(uhr.month)}. ${zweistellig(uhr.hour)}:${zweistellig(uhr.minute)}`;
|
|
69
|
+
const doppelt = zeile('='.repeat(z));
|
|
70
|
+
const einfach = zeile('-'.repeat(z));
|
|
71
|
+
const einzug = ' '.repeat(ERSTE_SPALTE);
|
|
72
|
+
const bloecke = [
|
|
73
|
+
doppelt,
|
|
74
|
+
...zeilen((0, texte_js_1.labelText)('codetable.title'), true, 'center'),
|
|
75
|
+
...zeilen(`${options.cashregisterLabel.trim()} ${zeit}`, false, 'center'),
|
|
76
|
+
doppelt,
|
|
77
|
+
...zeilen((0, texte_js_1.labelText)('codetable.reference')),
|
|
78
|
+
];
|
|
79
|
+
// Am Papier ein Bild (`codeTableReferenceImage`), am Bildschirm Text.
|
|
80
|
+
const vorlage = bloecke.length;
|
|
81
|
+
bloecke.push(zeile(einzug + VORLAGE.join(' ')), einfach);
|
|
82
|
+
const ersatz = code_tables_js_1.CODE_TABLES.find((t) => t.id === 'replacement');
|
|
83
|
+
for (const t of code_tables_js_1.CODE_TABLES) {
|
|
84
|
+
if (t === ersatz)
|
|
85
|
+
continue;
|
|
86
|
+
bloecke.push(nummernZeile(t.number, zeichenDerTabelle(t)));
|
|
87
|
+
}
|
|
88
|
+
bloecke.push(einfach);
|
|
89
|
+
const ersatzText = String.fromCharCode(...(0, code_tables_js_1.encodeForCodeTable)(VORLAGE.join(' '), 'replacement'));
|
|
90
|
+
const [ersteErsatz = '', ...restErsatz] = (0, escpos_js_1.wrapText)(ersatzText, z - ERSTE_SPALTE);
|
|
91
|
+
bloecke.push(nummernZeile(ersatz.number, ersteErsatz));
|
|
92
|
+
for (const t of restErsatz)
|
|
93
|
+
bloecke.push(zeile(einzug + t));
|
|
94
|
+
bloecke.push(zeile(einzug + nurAscii((0, texte_js_1.labelText)('codetable.replacement_note'))));
|
|
95
|
+
bloecke.push(doppelt);
|
|
96
|
+
bloecke.push(...zeilen((0, texte_js_1.labelText)('codetable.instruction_title'), true));
|
|
97
|
+
bloecke.push(...zeilen((0, texte_js_1.messageText)('codetable.instruction')));
|
|
98
|
+
bloecke.push(...zeilen((0, texte_js_1.messageText)('codetable.instruction_none', { number: ersatz.number })));
|
|
99
|
+
bloecke.push(doppelt);
|
|
100
|
+
return {
|
|
101
|
+
blatt: {
|
|
102
|
+
charsPerLine: z,
|
|
103
|
+
blocks: bloecke,
|
|
104
|
+
rows: code_tables_js_1.CODE_TABLES.map((t) => ({ number: t.number, codeTable: t.id, missing: t.missing })),
|
|
105
|
+
},
|
|
106
|
+
vorlage,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Das Testblatt als ESC/POS-Bytes. Jede Testzeile schaltet nach ihrer
|
|
111
|
+
* Nummer einmal mit `FS .` + `ESC t n` auf ihre Tabelle und traegt deren Bytes (`encodeForCodeTable`,
|
|
112
|
+
* also das echte €-Byte, wo die Tabelle es hat). Die Nummer steht doppelt
|
|
113
|
+
* breit und hoch (`GS !`), die Vorlage als Rasterbild (`GS v 0`).
|
|
114
|
+
*/
|
|
115
|
+
function codeTableTestSheetBytes(options) {
|
|
116
|
+
const { blatt, vorlage: vorlageIndex } = blattBauen(options);
|
|
117
|
+
const vorlage = blatt.blocks[vorlageIndex];
|
|
118
|
+
if (vorlage === undefined || vorlage.kind !== 'line')
|
|
119
|
+
throw new Error(`Testblatt: Vorlage-Zeile fehlt (Block ${vorlageIndex})`);
|
|
120
|
+
// Das Dokument ist immer 58 mm: 32 Spalten, Druckbereich 384 Punkte.
|
|
121
|
+
const doc = (0, escpos_js_1.createEscPosDocument)({ paperSize: 'mm58', codeTable: null });
|
|
122
|
+
(0, escpos_js_1.escPosReset)(doc);
|
|
123
|
+
if (options.paper === 'mm80')
|
|
124
|
+
doc.bytes.push(GS, 0x4c, RAND_80 & 0xff, RAND_80 >> 8);
|
|
125
|
+
let tabellen = 0;
|
|
126
|
+
for (const block of blatt.blocks) {
|
|
127
|
+
if (block.kind !== 'line')
|
|
128
|
+
continue;
|
|
129
|
+
if (block === vorlage) {
|
|
130
|
+
(0, escpos_js_1.escPosRasterImage)(doc, codeTableReferenceImage(), { align: 'left' });
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (block.doubleSizeLead === undefined) {
|
|
134
|
+
(0, escpos_js_1.escPosText)(doc, block.text.trimEnd(), { styles: { align: 'left', bold: block.bold } });
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const tabelle = blatt.rows[tabellen];
|
|
138
|
+
tabellen += 1;
|
|
139
|
+
const nummer = block.text.slice(0, block.doubleSizeLead).trim();
|
|
140
|
+
// Die Ziffer ist ASCII und steht in jeder Tabelle gleich: keine Umschaltung
|
|
141
|
+
// davor, die Zeile schaltet genau einmal, vor ihren eigenen Bytes.
|
|
142
|
+
(0, escpos_js_1.escPosSetStyles)(doc, { align: 'left', bold: true, width: 2, height: 2 });
|
|
143
|
+
doc.bytes.push(...(0, code_tables_js_1.encodeForCodeTable)(nummer, 'replacement'));
|
|
144
|
+
(0, escpos_js_1.escPosSetStyles)(doc, { align: 'left', codeTable: tabelle.codeTable });
|
|
145
|
+
doc.bytes.push(...(0, code_tables_js_1.encodeForCodeTable)(block.text.slice(block.doubleSizeLead).trimEnd(), tabelle.codeTable), 0x0a);
|
|
146
|
+
}
|
|
147
|
+
// Endzustand wie ohne Wahl: Tabelle 16 (WPC1252) und auf 80 mm Rand 0.
|
|
148
|
+
// Ein Druck danach ohne `ESC @` steht sonst in der Tabelle der letzten
|
|
149
|
+
// Testzeile und um den Rand verschoben.
|
|
150
|
+
doc.bytes.push(ESC, 0x74, VORGABE_ESC_T);
|
|
151
|
+
if (options.paper === 'mm80')
|
|
152
|
+
doc.bytes.push(GS, 0x4c, 0, 0);
|
|
153
|
+
(0, escpos_js_1.escPosCut)(doc, 'full');
|
|
154
|
+
return (0, escpos_js_1.escPosBytes)(doc);
|
|
155
|
+
}
|
|
@@ -6,4 +6,5 @@ export { type SheetLogoSize, type SheetLogo, type LogoDimensions, type SheetBloc
|
|
|
6
6
|
export { rasterizeLogo } from './bild.js';
|
|
7
7
|
export { type BrandMarkRaster, BRAND_MARK_RASTERS, BRAND_MARK_PATHS } from './marke-daten.js';
|
|
8
8
|
export { brandMarkImage } from './marke.js';
|
|
9
|
+
export { type CodeTableTestSheetInput, type CodeTableTestSheetRow, type CodeTableTestSheet, CODE_TABLE_TEST_SHEET_CHARS, codeTableTestSheet, codeTableTestSheetBytes, codeTableReferenceImage, } from './code-table-test-sheet.js';
|
|
9
10
|
export { type ReceiptDueTip, type ReceiptDueTipRecipient, type ReceiptDueOptions, type ReceiptDueBuckets, type ReceiptDueBreakdown, type ReceiptDueErrorReason, receiptDueCents, receiptDueBreakdown, ReceiptDueError, RECEIPT_DUE_ERROR_REASONS, isReceiptDueError, } from './due.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isReceiptDueError = exports.RECEIPT_DUE_ERROR_REASONS = exports.ReceiptDueError = exports.receiptDueBreakdown = exports.receiptDueCents = exports.brandMarkImage = exports.BRAND_MARK_PATHS = exports.BRAND_MARK_RASTERS = exports.rasterizeLogo = exports.receiptSheet = exports.qrSheetWidthFraction = exports.logoRasterSize = exports.isLogoPixelSizeAllowed = exports.logoDimensions = exports.paperSizeForChars = exports.DOTS_PER_LINE = exports.DOTS_PER_CHAR = exports.LOGO_MAX_PIXELS = exports.SHEET_LOGO_SIZES = exports.eposDirectStatus = exports.eposDirectPrint = exports.eposParseResponse = exports.eposSoapEnvelope = exports.eposServiceUrl = exports.eposImageXml = exports.eposXmlEscape = exports.eposPrintXmlResult = exports.eposPrintXml = exports.EposConnectionError = exports.CHARS_PER_PAPER_SIZE = exports.gridToText = exports.gridColumnWidths = exports.renderReceiptGrid = exports.escPosLayoutResult = exports.escPosLayoutBytes = exports.assertLogoRaster = exports.formatCents = exports.SMALL_BUSINESS_NOTICE = exports.CURRENT_LAYOUT_RULESET = exports.receiptZdaText = exports.receiptIsSmallBusinessConsistent = exports.receiptAmountsAreZero = exports.receiptIsZero = exports.receiptSignatureIsTest = exports.receiptSignatureFailed = exports.buildReceiptLayout = void 0;
|
|
3
|
+
exports.isReceiptDueError = exports.RECEIPT_DUE_ERROR_REASONS = exports.ReceiptDueError = exports.receiptDueBreakdown = exports.receiptDueCents = exports.codeTableReferenceImage = exports.codeTableTestSheetBytes = exports.codeTableTestSheet = exports.CODE_TABLE_TEST_SHEET_CHARS = exports.brandMarkImage = exports.BRAND_MARK_PATHS = exports.BRAND_MARK_RASTERS = exports.rasterizeLogo = exports.receiptSheet = exports.qrSheetWidthFraction = exports.logoRasterSize = exports.isLogoPixelSizeAllowed = exports.logoDimensions = exports.paperSizeForChars = exports.DOTS_PER_LINE = exports.DOTS_PER_CHAR = exports.LOGO_MAX_PIXELS = exports.SHEET_LOGO_SIZES = exports.eposDirectStatus = exports.eposDirectPrint = exports.eposParseResponse = exports.eposSoapEnvelope = exports.eposServiceUrl = exports.eposImageXml = exports.eposXmlEscape = exports.eposPrintXmlResult = exports.eposPrintXml = exports.EposConnectionError = exports.CHARS_PER_PAPER_SIZE = exports.gridToText = exports.gridColumnWidths = exports.renderReceiptGrid = exports.escPosLayoutResult = exports.escPosLayoutBytes = exports.assertLogoRaster = exports.formatCents = exports.SMALL_BUSINESS_NOTICE = exports.CURRENT_LAYOUT_RULESET = exports.receiptZdaText = exports.receiptIsSmallBusinessConsistent = exports.receiptAmountsAreZero = exports.receiptIsZero = exports.receiptSignatureIsTest = exports.receiptSignatureFailed = exports.buildReceiptLayout = void 0;
|
|
4
4
|
var layout_js_1 = require("./layout.js");
|
|
5
5
|
Object.defineProperty(exports, "buildReceiptLayout", { enumerable: true, get: function () { return layout_js_1.buildReceiptLayout; } });
|
|
6
6
|
Object.defineProperty(exports, "receiptSignatureFailed", { enumerable: true, get: function () { return layout_js_1.receiptSignatureFailed; } });
|
|
@@ -50,6 +50,11 @@ Object.defineProperty(exports, "BRAND_MARK_RASTERS", { enumerable: true, get: fu
|
|
|
50
50
|
Object.defineProperty(exports, "BRAND_MARK_PATHS", { enumerable: true, get: function () { return marke_daten_js_1.BRAND_MARK_PATHS; } });
|
|
51
51
|
var marke_js_1 = require("./marke.js");
|
|
52
52
|
Object.defineProperty(exports, "brandMarkImage", { enumerable: true, get: function () { return marke_js_1.brandMarkImage; } });
|
|
53
|
+
var code_table_test_sheet_js_1 = require("./code-table-test-sheet.js");
|
|
54
|
+
Object.defineProperty(exports, "CODE_TABLE_TEST_SHEET_CHARS", { enumerable: true, get: function () { return code_table_test_sheet_js_1.CODE_TABLE_TEST_SHEET_CHARS; } });
|
|
55
|
+
Object.defineProperty(exports, "codeTableTestSheet", { enumerable: true, get: function () { return code_table_test_sheet_js_1.codeTableTestSheet; } });
|
|
56
|
+
Object.defineProperty(exports, "codeTableTestSheetBytes", { enumerable: true, get: function () { return code_table_test_sheet_js_1.codeTableTestSheetBytes; } });
|
|
57
|
+
Object.defineProperty(exports, "codeTableReferenceImage", { enumerable: true, get: function () { return code_table_test_sheet_js_1.codeTableReferenceImage; } });
|
|
53
58
|
var due_js_1 = require("./due.js");
|
|
54
59
|
Object.defineProperty(exports, "receiptDueCents", { enumerable: true, get: function () { return due_js_1.receiptDueCents; } });
|
|
55
60
|
Object.defineProperty(exports, "receiptDueBreakdown", { enumerable: true, get: function () { return due_js_1.receiptDueBreakdown; } });
|
|
@@ -55,7 +55,12 @@ export declare function blattFuerDruck(layout: ReceiptLayout, optionen: {
|
|
|
55
55
|
export interface EscPosLayoutOptions {
|
|
56
56
|
/** Papierbreite; Vorgabe ist die des Layouts (dessen Spaltenbreiten daran haengen). */
|
|
57
57
|
paperSize?: PosPaperSize;
|
|
58
|
-
/**
|
|
58
|
+
/**
|
|
59
|
+
* Codepage des Druckers, Vorgabe `CP1252`; `null` laesst die des Geraets
|
|
60
|
+
* stehen. Eine Tabelle des Katalogs (`CodeTableId`, im Drucker-Wizard
|
|
61
|
+
* gewaehlt) druckt `€`, `§`, `°` als echtes Byte, wo die Tabelle sie hat,
|
|
62
|
+
* sonst als Ersatzbuchstaben; ohne Wahl bleibt der Bon byte-gleich.
|
|
63
|
+
*/
|
|
59
64
|
codeTable?: PosCodeTable | null;
|
|
60
65
|
/** Papierschnitt am Ende: `true` (voll), `'partial'` oder `false`. Vorgabe `true`. */
|
|
61
66
|
cut?: boolean | PosCutMode;
|
|
@@ -40,17 +40,21 @@ function blattFuerDruck(layout, optionen) {
|
|
|
40
40
|
/**
|
|
41
41
|
* Druckbar gemachtes Layout: Texte durch [escPosPrintableText] (Codepage,
|
|
42
42
|
* "EUR" statt "€", Striche), damit das Raster mit den Zeichen rechnet, die
|
|
43
|
-
* wirklich aufs Papier gehen.
|
|
43
|
+
* wirklich aufs Papier gehen. Mit gewaehlter Tabelle bleibt "€", wo die
|
|
44
|
+
* Tabelle es hat, und fehlende Zeichen werden schon hier zu
|
|
45
|
+
* Ersatzbuchstaben: jedes Zeichen ist danach genau ein Byte. Der QR-Inhalt
|
|
46
|
+
* bleibt unveraendert.
|
|
44
47
|
*/
|
|
45
|
-
function druckbaresLayout(layout) {
|
|
48
|
+
function druckbaresLayout(layout, codeTable) {
|
|
49
|
+
const druckbar = (text) => (0, index_js_1.escPosPrintableText)(text, codeTable);
|
|
46
50
|
return {
|
|
47
51
|
...layout,
|
|
48
52
|
lines: layout.lines.map((z) => {
|
|
49
53
|
switch (z.kind) {
|
|
50
|
-
case 'text': return { ...z, text: (
|
|
51
|
-
case 'banner': return { ...z, text: (
|
|
52
|
-
case 'columns': return { ...z, columns: z.columns.map((c) => ({ ...c, text: (
|
|
53
|
-
case 'rule': return { ...z, char: (
|
|
54
|
+
case 'text': return { ...z, text: druckbar(z.text) };
|
|
55
|
+
case 'banner': return { ...z, text: druckbar(z.text) };
|
|
56
|
+
case 'columns': return { ...z, columns: z.columns.map((c) => ({ ...c, text: druckbar(c.text) })) };
|
|
57
|
+
case 'rule': return { ...z, char: druckbar(z.char) || '-' };
|
|
54
58
|
default: return z;
|
|
55
59
|
}
|
|
56
60
|
}),
|
|
@@ -140,7 +144,7 @@ function escPosLayoutResult(layout, options = {}) {
|
|
|
140
144
|
};
|
|
141
145
|
// `blattFuerDruck` prueft das Logo-Raster bereits VOR der Rueckgabe -- die
|
|
142
146
|
// Schleife unten schreibt darum nie ein Byte auf ein falsch grosses Logo.
|
|
143
|
-
const blatt = blattFuerDruck(druckbaresLayout(layout), {
|
|
147
|
+
const blatt = blattFuerDruck(druckbaresLayout(layout, options.codeTable), {
|
|
144
148
|
zeichen: grid_js_1.CHARS_PER_PAPER_SIZE[paperSize],
|
|
145
149
|
logo: options.logo,
|
|
146
150
|
marke: options.brandMark,
|
package/dist/cjs/version.d.ts
CHANGED
package/dist/cjs/version.js
CHANGED