react-native-earl-thermal-printer 1.2.0 → 1.3.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/README.md +100 -15
- package/dist/utils/EPToolkit.d.ts +4 -1
- package/dist/utils/EPToolkit.d.ts.map +1 -1
- package/dist/utils/EPToolkit.js +212 -20
- package/dist/utils/EPToolkit.js.map +1 -1
- package/package.json +1 -1
- package/src/utils/EPToolkit.ts +270 -20
package/README.md
CHANGED
|
@@ -172,26 +172,111 @@ interface PrinterOptions {
|
|
|
172
172
|
|
|
173
173
|
## ESC/POS Formatting Tags
|
|
174
174
|
|
|
175
|
-
The text helpers (`printText`, `printBill`) support inline formatting tags
|
|
175
|
+
The text helpers (`printText`, `printBill`) support inline formatting tags.
|
|
176
|
+
All formatting **resets automatically on every `\n`** (newline), so tags apply per-line.
|
|
176
177
|
|
|
177
|
-
|
|
178
|
-
| -------------- | ---------------------- |
|
|
179
|
-
| `<B>...</B>` | **Bold** |
|
|
180
|
-
| `<C>...</C>` | Center-aligned |
|
|
181
|
-
| `<D>...</D>` | Double-width |
|
|
182
|
-
| `<DB>...</DB>` | Double-width bold |
|
|
183
|
-
| `<M>...</M>` | Medium (double-height) |
|
|
178
|
+
### Text Style
|
|
184
179
|
|
|
185
|
-
|
|
180
|
+
| Tag | Description |
|
|
181
|
+
| ---------------------- | ---------------------------------------------------- |
|
|
182
|
+
| `<BOLD>...</BOLD>` | Bold / emphasis (no size change) |
|
|
183
|
+
| `<U>...</U>` | Underline (1-dot thin) |
|
|
184
|
+
| `<U2>...</U2>` | Underline (2-dot thick) |
|
|
185
|
+
| `<REV>...</REV>` | Reverse (white text on black background) |
|
|
186
|
+
| `<UPDOWN>...</UPDOWN>` | Upside-down printing |
|
|
187
|
+
|
|
188
|
+
### Font Selection
|
|
189
|
+
|
|
190
|
+
| Tag | Description |
|
|
191
|
+
| ----------- | ------------------------------------------------------- |
|
|
192
|
+
| `<FONT_A>` | Select Font A — default, typically 12×24 dots |
|
|
193
|
+
| `<FONT_B>` | Select Font B — smaller, typically 9×17 dots |
|
|
194
|
+
|
|
195
|
+
### Text Alignment
|
|
196
|
+
|
|
197
|
+
| Tag | Description |
|
|
198
|
+
| ------------ | -------------- |
|
|
199
|
+
| `<L>...</L>` | Left-aligned |
|
|
200
|
+
| `<C>...</C>` | Center-aligned |
|
|
201
|
+
| `<R>...</R>` | Right-aligned |
|
|
202
|
+
|
|
203
|
+
### Font Size — Presets
|
|
204
|
+
|
|
205
|
+
These use the **GS !** command for clean size multipliers (1×–8×).
|
|
206
|
+
|
|
207
|
+
| Tag | Width | Height | Description |
|
|
208
|
+
| -------------- | :---: | :----: | ------------------ |
|
|
209
|
+
| `<W2>...</W2>` | 2× | 1× | Wide |
|
|
210
|
+
| `<W3>...</W3>` | 3× | 1× | Extra-wide |
|
|
211
|
+
| `<H2>...</H2>` | 1× | 2× | Tall |
|
|
212
|
+
| `<H3>...</H3>` | 1× | 3× | Extra-tall |
|
|
213
|
+
| `<X2>...</X2>` | 2× | 2× | Double size |
|
|
214
|
+
| `<X3>...</X3>` | 3× | 3× | Triple size |
|
|
215
|
+
| `<X4>...</X4>` | 4× | 4× | Quadruple size |
|
|
216
|
+
|
|
217
|
+
### Font Size — Custom
|
|
218
|
+
|
|
219
|
+
Use `<FS:W,H>` for arbitrary width/height multipliers (1–8):
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
<FS:2,3>Big text</FS> ← width ×2, height ×3
|
|
223
|
+
<FS:1,5>Very tall</FS> ← width ×1, height ×5
|
|
224
|
+
<FS:8,8>Maximum size</FS> ← width ×8, height ×8
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Spacing Control
|
|
228
|
+
|
|
229
|
+
| Tag | Description |
|
|
230
|
+
| ----------------------- | ------------------------------------------------------------ |
|
|
231
|
+
| `<LINESPC:N>` | Set line spacing to N dots (0–255). Close with `</LINESPC>`. |
|
|
232
|
+
| `<CHARSPC:N>` | Set character spacing to N dots (0–255). Close with `</CHARSPC>`. |
|
|
233
|
+
|
|
234
|
+
### Legacy Size Tags
|
|
235
|
+
|
|
236
|
+
These use the older **ESC !** command and are kept for backward compatibility.
|
|
237
|
+
|
|
238
|
+
| Tag | Description |
|
|
239
|
+
| -------------- | ---------------------------------------- |
|
|
240
|
+
| `<B>...</B>` | Big (double-height + double-width) |
|
|
241
|
+
| `<D>...</D>` | Double-width |
|
|
242
|
+
| `<DB>...</DB>` | Double-width + bold emphasis |
|
|
243
|
+
| `<M>...</M>` | Medium (double-height) |
|
|
244
|
+
| `<CM>...</CM>` | Center + medium |
|
|
245
|
+
| `<CB>...</CB>` | Center + big |
|
|
246
|
+
| `<CD>...</CD>` | Center + double-width |
|
|
247
|
+
|
|
248
|
+
### Actions & Utilities
|
|
249
|
+
|
|
250
|
+
| Tag | Description |
|
|
251
|
+
| ------------ | ------------------------------------------------- |
|
|
252
|
+
| `<PARTCUT>` | Partial paper cut (mid-document) |
|
|
253
|
+
| `<DRAWER>` | Open cash drawer (ESC p pulse) |
|
|
254
|
+
| `<TAB>` | Insert horizontal tab (0x09) |
|
|
255
|
+
| `<FEED:N>` | Feed N blank lines (1–255) |
|
|
256
|
+
| `<RESET>` | Reset all formatting to defaults |
|
|
257
|
+
|
|
258
|
+
### Raw Bytes
|
|
259
|
+
|
|
260
|
+
For power users who need direct ESC/POS control:
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
<RAW:1B,40> ← sends ESC @ (initialize printer)
|
|
264
|
+
<RAW:1D,56,00> ← sends GS V 0 (full cut, alternative)
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Combining Tags
|
|
268
|
+
|
|
269
|
+
Tags can be freely combined on the same line:
|
|
186
270
|
|
|
187
271
|
```tsx
|
|
188
272
|
await NetPrinter.printBill(
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
273
|
+
"<C><BOLD><X2>MY STORE</X2></BOLD></C>\n" +
|
|
274
|
+
"<C><U>================================</U></C>\n" +
|
|
275
|
+
"<FONT_B>Item 1 $5.00\n" +
|
|
276
|
+
"Item 2 $3.50\n" +
|
|
277
|
+
"<FONT_A><BOLD>================================</BOLD>\n" +
|
|
278
|
+
"<R><FS:2,2>TOTAL $8.50</FS></R>\n" +
|
|
279
|
+
"<C><REV> THANK YOU! </REV></C>\n"
|
|
195
280
|
);
|
|
196
281
|
```
|
|
197
282
|
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
declare function sizeBytes(w: number, h: number): Buffer;
|
|
2
|
+
declare function lineSpacingBytes(n: number): Buffer;
|
|
3
|
+
declare function charSpacingBytes(n: number): Buffer;
|
|
1
4
|
type IOptions = {
|
|
2
5
|
beep: boolean;
|
|
3
6
|
cut: boolean;
|
|
@@ -5,5 +8,5 @@ type IOptions = {
|
|
|
5
8
|
encoding: string;
|
|
6
9
|
};
|
|
7
10
|
export declare function exchange_text(text: string, options: IOptions): Buffer;
|
|
8
|
-
export {};
|
|
11
|
+
export { sizeBytes, lineSpacingBytes, charSpacingBytes };
|
|
9
12
|
//# sourceMappingURL=EPToolkit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EPToolkit.d.ts","sourceRoot":"","sources":["../../src/utils/EPToolkit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EPToolkit.d.ts","sourceRoot":"","sources":["../../src/utils/EPToolkit.ts"],"names":[],"mappings":"AA0GA,iBAAS,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAI/C;AAeD,iBAAS,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAMD,iBAAS,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AA2JD,KAAK,QAAQ,GAAG;IACf,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAWF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM,CAwFrE;AAID,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC"}
|
package/dist/utils/EPToolkit.js
CHANGED
|
@@ -2,30 +2,114 @@ import { Buffer } from "buffer";
|
|
|
2
2
|
import * as iconv from "iconv-lite";
|
|
3
3
|
// import * as Jimp from "jimp";
|
|
4
4
|
import BufferHelper from "./buffer-helper";
|
|
5
|
-
|
|
6
|
-
const
|
|
5
|
+
// ── Printer initialization ──────────────────────────────────────────────────
|
|
6
|
+
const init_printer_bytes = Buffer.from([27, 64]); // ESC @
|
|
7
|
+
// ── Alignment ───────────────────────────────────────────────────────────────
|
|
8
|
+
const l_start_bytes = Buffer.from([27, 97, 0]); // ESC a 0 — Left
|
|
7
9
|
const l_end_bytes = Buffer.from([]);
|
|
8
|
-
const c_start_bytes = Buffer.from([27, 97, 1]);
|
|
9
|
-
const c_end_bytes = Buffer.from([]);
|
|
10
|
-
const r_start_bytes = Buffer.from([27, 97, 2]);
|
|
10
|
+
const c_start_bytes = Buffer.from([27, 97, 1]); // ESC a 1 — Center
|
|
11
|
+
const c_end_bytes = Buffer.from([]);
|
|
12
|
+
const r_start_bytes = Buffer.from([27, 97, 2]); // ESC a 2 — Right
|
|
11
13
|
const r_end_bytes = Buffer.from([]);
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
14
|
+
// ── Spacing ─────────────────────────────────────────────────────────────────
|
|
15
|
+
const default_space_bytes = Buffer.from([27, 50]); // ESC 2 — Default line spacing
|
|
16
|
+
// ── Reset (sent after every newline) ────────────────────────────────────────
|
|
17
|
+
const reset_bytes = Buffer.from([
|
|
18
|
+
27,
|
|
19
|
+
97,
|
|
20
|
+
0, // ESC a 0 — Left align
|
|
21
|
+
29,
|
|
22
|
+
33,
|
|
23
|
+
0, // GS ! 0 — Normal character size
|
|
24
|
+
27,
|
|
25
|
+
33,
|
|
26
|
+
0, // ESC ! 0 — Normal print mode
|
|
27
|
+
28,
|
|
28
|
+
33,
|
|
29
|
+
0, // FS ! 0 — Normal CJK mode
|
|
30
|
+
27,
|
|
31
|
+
45,
|
|
32
|
+
0, // ESC - 0 — Underline off
|
|
33
|
+
27,
|
|
34
|
+
69,
|
|
35
|
+
0, // ESC E 0 — Bold/emphasis off
|
|
36
|
+
29,
|
|
37
|
+
66,
|
|
38
|
+
0, // GS B 0 — Reverse off
|
|
39
|
+
27,
|
|
40
|
+
123,
|
|
41
|
+
0, // ESC { 0 — Upside-down off
|
|
42
|
+
27,
|
|
43
|
+
50, // ESC 2 — Default line spacing
|
|
44
|
+
]);
|
|
45
|
+
// ── Legacy formatting (ESC ! / FS !) ────────────────────────────────────────
|
|
46
|
+
// These use the master print-mode byte; kept for backward compatibility.
|
|
47
|
+
const m_start_bytes = Buffer.from([27, 33, 16, 28, 33, 8]); // Double-height
|
|
15
48
|
const m_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
16
|
-
const b_start_bytes = Buffer.from([27, 33, 48, 28, 33, 12]);
|
|
49
|
+
const b_start_bytes = Buffer.from([27, 33, 48, 28, 33, 12]); // Double-height + double-width
|
|
17
50
|
const b_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
51
|
+
const d_start_bytes = Buffer.from([27, 33, 32, 28, 33, 4]); // Double-width
|
|
52
|
+
const d_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
53
|
+
const db_start_bytes = Buffer.from([27, 33, 40, 28, 33, 12]); // Double-width + bold emphasis
|
|
54
|
+
const db_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
55
|
+
// ── Legacy alignment + size combos ──────────────────────────────────────────
|
|
18
56
|
const cm_start_bytes = Buffer.from([27, 97, 1, 27, 33, 16, 28, 33, 8]);
|
|
19
57
|
const cm_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
20
58
|
const cb_start_bytes = Buffer.from([27, 97, 1, 27, 33, 48, 28, 33, 12]);
|
|
21
59
|
const cb_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
22
60
|
const cd_start_bytes = Buffer.from([27, 97, 1, 27, 33, 32, 28, 33, 4]);
|
|
23
61
|
const cd_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
const
|
|
62
|
+
// ── Underline ───────────────────────────────────────────────────────────────
|
|
63
|
+
const u_start_bytes = Buffer.from([27, 45, 1]); // ESC - 1 — 1-dot underline
|
|
64
|
+
const u_end_bytes = Buffer.from([27, 45, 0]); // ESC - 0 — underline off
|
|
65
|
+
const u2_start_bytes = Buffer.from([27, 45, 2]); // ESC - 2 — 2-dot (thick) underline
|
|
66
|
+
const u2_end_bytes = Buffer.from([27, 45, 0]);
|
|
67
|
+
// ── Bold / Emphasis (no size change) ────────────────────────────────────────
|
|
68
|
+
const bold_start_bytes = Buffer.from([27, 69, 1]); // ESC E 1
|
|
69
|
+
const bold_end_bytes = Buffer.from([27, 69, 0]); // ESC E 0
|
|
70
|
+
// ── Reverse (white-on-black) ────────────────────────────────────────────────
|
|
71
|
+
const rev_start_bytes = Buffer.from([29, 66, 1]); // GS B 1
|
|
72
|
+
const rev_end_bytes = Buffer.from([29, 66, 0]); // GS B 0
|
|
73
|
+
// ── Upside-down ─────────────────────────────────────────────────────────────
|
|
74
|
+
const updown_start_bytes = Buffer.from([27, 123, 1]); // ESC { 1
|
|
75
|
+
const updown_end_bytes = Buffer.from([27, 123, 0]); // ESC { 0
|
|
76
|
+
// ── Font selection ──────────────────────────────────────────────────────────
|
|
77
|
+
const font_a_bytes = Buffer.from([27, 77, 0]); // ESC M 0 — Font A (default, 12×24)
|
|
78
|
+
const font_b_bytes = Buffer.from([27, 77, 1]); // ESC M 1 — Font B (smaller, 9×17)
|
|
79
|
+
// ── Character size helpers (GS ! n) ─────────────────────────────────────────
|
|
80
|
+
// Width multiplier = bits 0-3 (0–7 → 1×–8×)
|
|
81
|
+
// Height multiplier = bits 4-7 (0–7 → 1×–8×)
|
|
82
|
+
function sizeBytes(w, h) {
|
|
83
|
+
const cw = Math.min(Math.max(w, 1), 8) - 1;
|
|
84
|
+
const ch = Math.min(Math.max(h, 1), 8) - 1;
|
|
85
|
+
return Buffer.from([29, 33, cw | (ch << 4)]); // GS ! n
|
|
86
|
+
}
|
|
87
|
+
const size_reset_bytes = Buffer.from([29, 33, 0]); // GS ! 0 — 1×1
|
|
88
|
+
// Pre-built size presets
|
|
89
|
+
const w2_start_bytes = sizeBytes(2, 1); // Width ×2
|
|
90
|
+
const w3_start_bytes = sizeBytes(3, 1); // Width ×3
|
|
91
|
+
const h2_start_bytes = sizeBytes(1, 2); // Height ×2
|
|
92
|
+
const h3_start_bytes = sizeBytes(1, 3); // Height ×3
|
|
93
|
+
const x2_start_bytes = sizeBytes(2, 2); // Width ×2, Height ×2
|
|
94
|
+
const x3_start_bytes = sizeBytes(3, 3); // Width ×3, Height ×3
|
|
95
|
+
const x4_start_bytes = sizeBytes(4, 4); // Width ×4, Height ×4
|
|
96
|
+
// ── Line spacing ────────────────────────────────────────────────────────────
|
|
97
|
+
function lineSpacingBytes(n) {
|
|
98
|
+
return Buffer.from([27, 51, Math.min(Math.max(n, 0), 255)]); // ESC 3 n
|
|
99
|
+
}
|
|
100
|
+
const default_line_spacing_bytes = Buffer.from([27, 50]); // ESC 2
|
|
101
|
+
// ── Character spacing ───────────────────────────────────────────────────────
|
|
102
|
+
function charSpacingBytes(n) {
|
|
103
|
+
return Buffer.from([27, 32, Math.min(Math.max(n, 0), 255)]); // ESC SP n
|
|
104
|
+
}
|
|
105
|
+
// ── Cut / Beep / Tail ───────────────────────────────────────────────────────
|
|
106
|
+
const cut_bytes = Buffer.from([27, 105]); // ESC i — full cut
|
|
107
|
+
const partial_cut_bytes = Buffer.from([27, 109]); // ESC m — partial cut
|
|
27
108
|
const beep_bytes = Buffer.from([27, 66, 3, 2]);
|
|
28
109
|
const line_bytes = Buffer.from([10, 10, 10, 10, 10]);
|
|
110
|
+
// ── Cash drawer ─────────────────────────────────────────────────────────────
|
|
111
|
+
const drawer_bytes = Buffer.from([27, 112, 0, 60, 120]); // ESC p 0 60 120
|
|
112
|
+
// ── Encoding ────────────────────────────────────────────────────────────────
|
|
29
113
|
const encoding_mappings_bytes = {
|
|
30
114
|
// single byte encodings
|
|
31
115
|
CP437: Buffer.from([27, 116, 0]),
|
|
@@ -40,32 +124,117 @@ const options_controller = {
|
|
|
40
124
|
tailingLine: line_bytes,
|
|
41
125
|
encoding: encoding_mappings_bytes,
|
|
42
126
|
};
|
|
127
|
+
// ── Static tag → bytes map ──────────────────────────────────────────────────
|
|
128
|
+
// Tags are matched longest-first at parse time to avoid prefix collisions.
|
|
43
129
|
const controller = {
|
|
130
|
+
// Legacy formatting
|
|
44
131
|
"<M>": m_start_bytes,
|
|
45
132
|
"</M>": m_end_bytes,
|
|
46
133
|
"<B>": b_start_bytes,
|
|
47
134
|
"</B>": b_end_bytes,
|
|
48
135
|
"<D>": d_start_bytes,
|
|
49
136
|
"</D>": d_end_bytes,
|
|
137
|
+
"<DB>": db_start_bytes,
|
|
138
|
+
"</DB>": db_end_bytes,
|
|
139
|
+
// Alignment
|
|
50
140
|
"<C>": c_start_bytes,
|
|
51
141
|
"</C>": c_end_bytes,
|
|
142
|
+
"<L>": l_start_bytes,
|
|
143
|
+
"</L>": l_end_bytes,
|
|
144
|
+
"<R>": r_start_bytes,
|
|
145
|
+
"</R>": r_end_bytes,
|
|
146
|
+
// Legacy alignment + size combos
|
|
52
147
|
"<CM>": cm_start_bytes,
|
|
53
148
|
"</CM>": cm_end_bytes,
|
|
54
149
|
"<CD>": cd_start_bytes,
|
|
55
150
|
"</CD>": cd_end_bytes,
|
|
56
151
|
"<CB>": cb_start_bytes,
|
|
57
152
|
"</CB>": cb_end_bytes,
|
|
58
|
-
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
153
|
+
// Underline
|
|
154
|
+
"<U>": u_start_bytes,
|
|
155
|
+
"</U>": u_end_bytes,
|
|
156
|
+
"<U2>": u2_start_bytes,
|
|
157
|
+
"</U2>": u2_end_bytes,
|
|
158
|
+
// Bold emphasis only (no size change)
|
|
159
|
+
"<BOLD>": bold_start_bytes,
|
|
160
|
+
"</BOLD>": bold_end_bytes,
|
|
161
|
+
// Reverse (white on black)
|
|
162
|
+
"<REV>": rev_start_bytes,
|
|
163
|
+
"</REV>": rev_end_bytes,
|
|
164
|
+
// Upside-down
|
|
165
|
+
"<UPDOWN>": updown_start_bytes,
|
|
166
|
+
"</UPDOWN>": updown_end_bytes,
|
|
167
|
+
// Font selection
|
|
168
|
+
"<FONT_A>": font_a_bytes,
|
|
169
|
+
"<FONT_B>": font_b_bytes,
|
|
170
|
+
// Size presets (GS !)
|
|
171
|
+
"<W2>": w2_start_bytes,
|
|
172
|
+
"</W2>": size_reset_bytes,
|
|
173
|
+
"<W3>": w3_start_bytes,
|
|
174
|
+
"</W3>": size_reset_bytes,
|
|
175
|
+
"<H2>": h2_start_bytes,
|
|
176
|
+
"</H2>": size_reset_bytes,
|
|
177
|
+
"<H3>": h3_start_bytes,
|
|
178
|
+
"</H3>": size_reset_bytes,
|
|
179
|
+
"<X2>": x2_start_bytes,
|
|
180
|
+
"</X2>": size_reset_bytes,
|
|
181
|
+
"<X3>": x3_start_bytes,
|
|
182
|
+
"</X3>": size_reset_bytes,
|
|
183
|
+
"<X4>": x4_start_bytes,
|
|
184
|
+
"</X4>": size_reset_bytes,
|
|
185
|
+
// Close tags for parameterized tags
|
|
186
|
+
"</FS>": size_reset_bytes,
|
|
187
|
+
"</LINESPC>": default_line_spacing_bytes,
|
|
188
|
+
"</CHARSPC>": Buffer.from([27, 32, 0]),
|
|
189
|
+
// Inline action tags (no closing tag)
|
|
190
|
+
"<PARTCUT>": partial_cut_bytes,
|
|
191
|
+
"<DRAWER>": drawer_bytes,
|
|
192
|
+
"<TAB>": Buffer.from([9]),
|
|
193
|
+
"<RESET>": reset_bytes,
|
|
62
194
|
};
|
|
195
|
+
// Sort tag keys longest-first so that e.g. "</BOLD>" is tried before "</B>"
|
|
196
|
+
const sorted_tags = Object.keys(controller).sort((a, b) => b.length - a.length);
|
|
197
|
+
// ── Parameterized tag regexes ───────────────────────────────────────────────
|
|
198
|
+
const parameterized_tags = [
|
|
199
|
+
{
|
|
200
|
+
// <FS:W,H> — custom font size (width 1–8, height 1–8)
|
|
201
|
+
regex: /^<FS:(\d+),(\d+)>/,
|
|
202
|
+
handler: (m) => sizeBytes(parseInt(m[1], 10), parseInt(m[2], 10)),
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
// <LINESPC:N> — line spacing in dots (0–255)
|
|
206
|
+
regex: /^<LINESPC:(\d+)>/,
|
|
207
|
+
handler: (m) => lineSpacingBytes(parseInt(m[1], 10)),
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
// <CHARSPC:N> — character spacing in dots (0–255)
|
|
211
|
+
regex: /^<CHARSPC:(\d+)>/,
|
|
212
|
+
handler: (m) => charSpacingBytes(parseInt(m[1], 10)),
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
// <FEED:N> — feed N lines (1–255)
|
|
216
|
+
regex: /^<FEED:(\d+)>/,
|
|
217
|
+
handler: (m) => {
|
|
218
|
+
const n = Math.min(Math.max(parseInt(m[1], 10), 1), 255);
|
|
219
|
+
return Buffer.from([27, 100, n]); // ESC d n
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
// <RAW:HH,HH,...> — send raw hex bytes
|
|
224
|
+
regex: /^<RAW:([0-9A-Fa-f,]+)>/,
|
|
225
|
+
handler: (m) => {
|
|
226
|
+
const hexParts = m[1].split(",").filter(Boolean);
|
|
227
|
+
return Buffer.from(hexParts.map((h) => parseInt(h, 16)));
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
];
|
|
63
231
|
const default_options = {
|
|
64
232
|
beep: false,
|
|
65
233
|
cut: true,
|
|
66
234
|
tailingLine: true,
|
|
67
235
|
encoding: "UTF8",
|
|
68
236
|
};
|
|
237
|
+
// ── Main text → buffer converter ────────────────────────────────────────────
|
|
69
238
|
export function exchange_text(text, options) {
|
|
70
239
|
const m_options = options || default_options;
|
|
71
240
|
let bytes = new BufferHelper();
|
|
@@ -80,17 +249,38 @@ export function exchange_text(text, options) {
|
|
|
80
249
|
for (let i = 0; i < text.length; i++) {
|
|
81
250
|
let ch = text[i];
|
|
82
251
|
switch (ch) {
|
|
83
|
-
case "<":
|
|
252
|
+
case "<": {
|
|
84
253
|
bytes.concat(iconv.encode(temp, m_options.encoding));
|
|
85
254
|
temp = "";
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
255
|
+
const remaining = text.substring(i);
|
|
256
|
+
// 1. Try static tags (longest-first to avoid prefix collisions)
|
|
257
|
+
let matched = false;
|
|
258
|
+
for (const tag of sorted_tags) {
|
|
259
|
+
if (remaining.startsWith(tag)) {
|
|
89
260
|
bytes.concat(controller[tag]);
|
|
90
261
|
i += tag.length - 1;
|
|
262
|
+
matched = true;
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// 2. Try parameterized tags
|
|
267
|
+
if (!matched) {
|
|
268
|
+
for (const pt of parameterized_tags) {
|
|
269
|
+
const m = remaining.match(pt.regex);
|
|
270
|
+
if (m) {
|
|
271
|
+
bytes.concat(pt.handler(m));
|
|
272
|
+
i += m[0].length - 1;
|
|
273
|
+
matched = true;
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
91
276
|
}
|
|
92
277
|
}
|
|
278
|
+
// 3. Not a known tag — keep the literal '<'
|
|
279
|
+
if (!matched) {
|
|
280
|
+
temp = "<";
|
|
281
|
+
}
|
|
93
282
|
break;
|
|
283
|
+
}
|
|
94
284
|
case "\n":
|
|
95
285
|
temp = `${temp}${ch}`;
|
|
96
286
|
bytes.concat(iconv.encode(temp, m_options.encoding));
|
|
@@ -118,6 +308,8 @@ export function exchange_text(text, options) {
|
|
|
118
308
|
}
|
|
119
309
|
return bytes.toBuffer();
|
|
120
310
|
}
|
|
311
|
+
// ── Public helpers (re-exported for advanced usage) ─────────────────────────
|
|
312
|
+
export { sizeBytes, lineSpacingBytes, charSpacingBytes };
|
|
121
313
|
// export async function exchange_image(
|
|
122
314
|
// imagePath: string,
|
|
123
315
|
// threshold: number
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EPToolkit.js","sourceRoot":"","sources":["../../src/utils/EPToolkit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,gCAAgC;AAEhC,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAE3C,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACjD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB;AACtD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAEpC,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAElD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAChE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACxD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACxD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACzD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACxE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACzD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACzD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAExD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AACzC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAErD,MAAM,uBAAuB,GAA8B;IAC1D,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAChC,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,kBAAkB,GAAG;IAC1B,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,UAAU;IACvB,QAAQ,EAAE,uBAAuB;CACjC,CAAC;AAEF,MAAM,UAAU,GAA8B;IAC7C,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,WAAW;CACnB,CAAC;AASF,MAAM,eAAe,GAAa;IACjC,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,IAAI;IACT,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,MAAM;CAChB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAiB;IAC5D,MAAM,SAAS,GAAG,OAAO,IAAI,eAAe,CAAC;IAE7C,IAAI,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;IAC/B,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAEjC,eAAe;IACf,IACC,SAAS,CAAC,UAAU,CAAC;QACrB,kBAAkB,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,EACpD,CAAC;QACF,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAElC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,QAAQ,EAAE,EAAE,CAAC;YACZ,KAAK,GAAG;gBACP,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACrD,IAAI,GAAG,EAAE,CAAC;gBACV,kDAAkD;gBAClD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;oBAC9B,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;wBAC/C,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC9B,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;oBACrB,CAAC;gBACF,CAAC;gBACD,MAAM;YACP,KAAK,IAAI;gBACR,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,CAAC;gBACtB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACrD,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC1B,IAAI,GAAG,EAAE,CAAC;gBACV,MAAM;YACP;gBACC,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,CAAC;gBACtB,MAAM;QACR,CAAC;IACF,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEpE,+BAA+B;IAC/B,IACC,OAAO,SAAS,CAAC,aAAa,CAAC,KAAK,SAAS;QAC7C,kBAAkB,CAAC,aAAa,CAAC,EAChC,CAAC;QACF,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,SAAS,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1E,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC;AAED,wCAAwC;AACxC,uBAAuB;AACvB,sBAAsB;AACtB,uBAAuB;AACvB,oCAAoC;AAEpC,UAAU;AACV,qEAAqE;AACrE,oDAAoD;AACpD,sEAAsE;AAEtE,eAAe;AACf,yCAAyC;AACzC,qDAAqD;AAErD,cAAc;AACd,2CAA2C;AAC3C,sCAAsC;AACtC,yEAAyE;AACzE,gCAAgC;AAChC,wDAAwD;AACxD,8BAA8B;AAC9B,qDAAqD;AACrD,6DAA6D;AAC7D,yCAAyC;AACzC,kDAAkD;AAClD,wCAAwC;AACxC,sDAAsD;AACtD,wDAAwD;AACxD,yDAAyD;AACzD,gBAAgB;AAChB,cAAc;AACd,YAAY;AACZ,gEAAgE;AAChE,6BAA6B;AAC7B,UAAU;AACV,4BAA4B;AAC5B,gBAAgB;AAChB,sBAAsB;AACtB,0BAA0B;AAC1B,MAAM;AACN,6BAA6B;AAC7B,IAAI"}
|
|
1
|
+
{"version":3,"file":"EPToolkit.js","sourceRoot":"","sources":["../../src/utils/EPToolkit.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-earl-thermal-printer",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "A modern, high-performance thermal printer library for React Native. Built with the New Architecture (TurboModules) for synchronous communication, zero legacy bridge overhead, and Android 12+ Bluetooth compliance.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
package/src/utils/EPToolkit.ts
CHANGED
|
@@ -4,34 +4,150 @@ import * as iconv from "iconv-lite";
|
|
|
4
4
|
|
|
5
5
|
import BufferHelper from "./buffer-helper";
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
// ── Printer initialization ──────────────────────────────────────────────────
|
|
8
|
+
|
|
9
|
+
const init_printer_bytes = Buffer.from([27, 64]); // ESC @
|
|
10
|
+
|
|
11
|
+
// ── Alignment ───────────────────────────────────────────────────────────────
|
|
12
|
+
|
|
13
|
+
const l_start_bytes = Buffer.from([27, 97, 0]); // ESC a 0 — Left
|
|
9
14
|
const l_end_bytes = Buffer.from([]);
|
|
10
|
-
const c_start_bytes = Buffer.from([27, 97, 1]);
|
|
11
|
-
const c_end_bytes = Buffer.from([]);
|
|
12
|
-
const r_start_bytes = Buffer.from([27, 97, 2]);
|
|
15
|
+
const c_start_bytes = Buffer.from([27, 97, 1]); // ESC a 1 — Center
|
|
16
|
+
const c_end_bytes = Buffer.from([]);
|
|
17
|
+
const r_start_bytes = Buffer.from([27, 97, 2]); // ESC a 2 — Right
|
|
13
18
|
const r_end_bytes = Buffer.from([]);
|
|
14
19
|
|
|
15
|
-
|
|
20
|
+
// ── Spacing ─────────────────────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
const default_space_bytes = Buffer.from([27, 50]); // ESC 2 — Default line spacing
|
|
23
|
+
|
|
24
|
+
// ── Reset (sent after every newline) ────────────────────────────────────────
|
|
16
25
|
|
|
17
|
-
const reset_bytes = Buffer.from([
|
|
18
|
-
|
|
26
|
+
const reset_bytes = Buffer.from([
|
|
27
|
+
27,
|
|
28
|
+
97,
|
|
29
|
+
0, // ESC a 0 — Left align
|
|
30
|
+
29,
|
|
31
|
+
33,
|
|
32
|
+
0, // GS ! 0 — Normal character size
|
|
33
|
+
27,
|
|
34
|
+
33,
|
|
35
|
+
0, // ESC ! 0 — Normal print mode
|
|
36
|
+
28,
|
|
37
|
+
33,
|
|
38
|
+
0, // FS ! 0 — Normal CJK mode
|
|
39
|
+
27,
|
|
40
|
+
45,
|
|
41
|
+
0, // ESC - 0 — Underline off
|
|
42
|
+
27,
|
|
43
|
+
69,
|
|
44
|
+
0, // ESC E 0 — Bold/emphasis off
|
|
45
|
+
29,
|
|
46
|
+
66,
|
|
47
|
+
0, // GS B 0 — Reverse off
|
|
48
|
+
27,
|
|
49
|
+
123,
|
|
50
|
+
0, // ESC { 0 — Upside-down off
|
|
51
|
+
27,
|
|
52
|
+
50, // ESC 2 — Default line spacing
|
|
53
|
+
]);
|
|
54
|
+
|
|
55
|
+
// ── Legacy formatting (ESC ! / FS !) ────────────────────────────────────────
|
|
56
|
+
// These use the master print-mode byte; kept for backward compatibility.
|
|
57
|
+
|
|
58
|
+
const m_start_bytes = Buffer.from([27, 33, 16, 28, 33, 8]); // Double-height
|
|
19
59
|
const m_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
20
|
-
const b_start_bytes = Buffer.from([27, 33, 48, 28, 33, 12]);
|
|
60
|
+
const b_start_bytes = Buffer.from([27, 33, 48, 28, 33, 12]); // Double-height + double-width
|
|
21
61
|
const b_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
62
|
+
const d_start_bytes = Buffer.from([27, 33, 32, 28, 33, 4]); // Double-width
|
|
63
|
+
const d_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
64
|
+
const db_start_bytes = Buffer.from([27, 33, 40, 28, 33, 12]); // Double-width + bold emphasis
|
|
65
|
+
const db_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
66
|
+
|
|
67
|
+
// ── Legacy alignment + size combos ──────────────────────────────────────────
|
|
68
|
+
|
|
22
69
|
const cm_start_bytes = Buffer.from([27, 97, 1, 27, 33, 16, 28, 33, 8]);
|
|
23
70
|
const cm_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
24
71
|
const cb_start_bytes = Buffer.from([27, 97, 1, 27, 33, 48, 28, 33, 12]);
|
|
25
72
|
const cb_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
26
73
|
const cd_start_bytes = Buffer.from([27, 97, 1, 27, 33, 32, 28, 33, 4]);
|
|
27
74
|
const cd_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
28
|
-
const d_start_bytes = Buffer.from([27, 33, 32, 28, 33, 4]);
|
|
29
|
-
const d_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
|
|
30
75
|
|
|
31
|
-
|
|
76
|
+
// ── Underline ───────────────────────────────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
const u_start_bytes = Buffer.from([27, 45, 1]); // ESC - 1 — 1-dot underline
|
|
79
|
+
const u_end_bytes = Buffer.from([27, 45, 0]); // ESC - 0 — underline off
|
|
80
|
+
const u2_start_bytes = Buffer.from([27, 45, 2]); // ESC - 2 — 2-dot (thick) underline
|
|
81
|
+
const u2_end_bytes = Buffer.from([27, 45, 0]);
|
|
82
|
+
|
|
83
|
+
// ── Bold / Emphasis (no size change) ────────────────────────────────────────
|
|
84
|
+
|
|
85
|
+
const bold_start_bytes = Buffer.from([27, 69, 1]); // ESC E 1
|
|
86
|
+
const bold_end_bytes = Buffer.from([27, 69, 0]); // ESC E 0
|
|
87
|
+
|
|
88
|
+
// ── Reverse (white-on-black) ────────────────────────────────────────────────
|
|
89
|
+
|
|
90
|
+
const rev_start_bytes = Buffer.from([29, 66, 1]); // GS B 1
|
|
91
|
+
const rev_end_bytes = Buffer.from([29, 66, 0]); // GS B 0
|
|
92
|
+
|
|
93
|
+
// ── Upside-down ─────────────────────────────────────────────────────────────
|
|
94
|
+
|
|
95
|
+
const updown_start_bytes = Buffer.from([27, 123, 1]); // ESC { 1
|
|
96
|
+
const updown_end_bytes = Buffer.from([27, 123, 0]); // ESC { 0
|
|
97
|
+
|
|
98
|
+
// ── Font selection ──────────────────────────────────────────────────────────
|
|
99
|
+
|
|
100
|
+
const font_a_bytes = Buffer.from([27, 77, 0]); // ESC M 0 — Font A (default, 12×24)
|
|
101
|
+
const font_b_bytes = Buffer.from([27, 77, 1]); // ESC M 1 — Font B (smaller, 9×17)
|
|
102
|
+
|
|
103
|
+
// ── Character size helpers (GS ! n) ─────────────────────────────────────────
|
|
104
|
+
// Width multiplier = bits 0-3 (0–7 → 1×–8×)
|
|
105
|
+
// Height multiplier = bits 4-7 (0–7 → 1×–8×)
|
|
106
|
+
|
|
107
|
+
function sizeBytes(w: number, h: number): Buffer {
|
|
108
|
+
const cw = Math.min(Math.max(w, 1), 8) - 1;
|
|
109
|
+
const ch = Math.min(Math.max(h, 1), 8) - 1;
|
|
110
|
+
return Buffer.from([29, 33, cw | (ch << 4)]); // GS ! n
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const size_reset_bytes = Buffer.from([29, 33, 0]); // GS ! 0 — 1×1
|
|
114
|
+
|
|
115
|
+
// Pre-built size presets
|
|
116
|
+
const w2_start_bytes = sizeBytes(2, 1); // Width ×2
|
|
117
|
+
const w3_start_bytes = sizeBytes(3, 1); // Width ×3
|
|
118
|
+
const h2_start_bytes = sizeBytes(1, 2); // Height ×2
|
|
119
|
+
const h3_start_bytes = sizeBytes(1, 3); // Height ×3
|
|
120
|
+
const x2_start_bytes = sizeBytes(2, 2); // Width ×2, Height ×2
|
|
121
|
+
const x3_start_bytes = sizeBytes(3, 3); // Width ×3, Height ×3
|
|
122
|
+
const x4_start_bytes = sizeBytes(4, 4); // Width ×4, Height ×4
|
|
123
|
+
|
|
124
|
+
// ── Line spacing ────────────────────────────────────────────────────────────
|
|
125
|
+
|
|
126
|
+
function lineSpacingBytes(n: number): Buffer {
|
|
127
|
+
return Buffer.from([27, 51, Math.min(Math.max(n, 0), 255)]); // ESC 3 n
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const default_line_spacing_bytes = Buffer.from([27, 50]); // ESC 2
|
|
131
|
+
|
|
132
|
+
// ── Character spacing ───────────────────────────────────────────────────────
|
|
133
|
+
|
|
134
|
+
function charSpacingBytes(n: number): Buffer {
|
|
135
|
+
return Buffer.from([27, 32, Math.min(Math.max(n, 0), 255)]); // ESC SP n
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// ── Cut / Beep / Tail ───────────────────────────────────────────────────────
|
|
139
|
+
|
|
140
|
+
const cut_bytes = Buffer.from([27, 105]); // ESC i — full cut
|
|
141
|
+
const partial_cut_bytes = Buffer.from([27, 109]); // ESC m — partial cut
|
|
32
142
|
const beep_bytes = Buffer.from([27, 66, 3, 2]);
|
|
33
143
|
const line_bytes = Buffer.from([10, 10, 10, 10, 10]);
|
|
34
144
|
|
|
145
|
+
// ── Cash drawer ─────────────────────────────────────────────────────────────
|
|
146
|
+
|
|
147
|
+
const drawer_bytes = Buffer.from([27, 112, 0, 60, 120]); // ESC p 0 60 120
|
|
148
|
+
|
|
149
|
+
// ── Encoding ────────────────────────────────────────────────────────────────
|
|
150
|
+
|
|
35
151
|
const encoding_mappings_bytes: { [key: string]: Buffer } = {
|
|
36
152
|
// single byte encodings
|
|
37
153
|
CP437: Buffer.from([27, 116, 0]),
|
|
@@ -48,27 +164,130 @@ const options_controller = {
|
|
|
48
164
|
encoding: encoding_mappings_bytes,
|
|
49
165
|
};
|
|
50
166
|
|
|
167
|
+
// ── Static tag → bytes map ──────────────────────────────────────────────────
|
|
168
|
+
// Tags are matched longest-first at parse time to avoid prefix collisions.
|
|
169
|
+
|
|
51
170
|
const controller: { [key: string]: Buffer } = {
|
|
171
|
+
// Legacy formatting
|
|
52
172
|
"<M>": m_start_bytes,
|
|
53
173
|
"</M>": m_end_bytes,
|
|
54
174
|
"<B>": b_start_bytes,
|
|
55
175
|
"</B>": b_end_bytes,
|
|
56
176
|
"<D>": d_start_bytes,
|
|
57
177
|
"</D>": d_end_bytes,
|
|
178
|
+
"<DB>": db_start_bytes,
|
|
179
|
+
"</DB>": db_end_bytes,
|
|
180
|
+
|
|
181
|
+
// Alignment
|
|
58
182
|
"<C>": c_start_bytes,
|
|
59
183
|
"</C>": c_end_bytes,
|
|
184
|
+
"<L>": l_start_bytes,
|
|
185
|
+
"</L>": l_end_bytes,
|
|
186
|
+
"<R>": r_start_bytes,
|
|
187
|
+
"</R>": r_end_bytes,
|
|
188
|
+
|
|
189
|
+
// Legacy alignment + size combos
|
|
60
190
|
"<CM>": cm_start_bytes,
|
|
61
191
|
"</CM>": cm_end_bytes,
|
|
62
192
|
"<CD>": cd_start_bytes,
|
|
63
193
|
"</CD>": cd_end_bytes,
|
|
64
194
|
"<CB>": cb_start_bytes,
|
|
65
195
|
"</CB>": cb_end_bytes,
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
"<
|
|
69
|
-
"</
|
|
196
|
+
|
|
197
|
+
// Underline
|
|
198
|
+
"<U>": u_start_bytes,
|
|
199
|
+
"</U>": u_end_bytes,
|
|
200
|
+
"<U2>": u2_start_bytes,
|
|
201
|
+
"</U2>": u2_end_bytes,
|
|
202
|
+
|
|
203
|
+
// Bold emphasis only (no size change)
|
|
204
|
+
"<BOLD>": bold_start_bytes,
|
|
205
|
+
"</BOLD>": bold_end_bytes,
|
|
206
|
+
|
|
207
|
+
// Reverse (white on black)
|
|
208
|
+
"<REV>": rev_start_bytes,
|
|
209
|
+
"</REV>": rev_end_bytes,
|
|
210
|
+
|
|
211
|
+
// Upside-down
|
|
212
|
+
"<UPDOWN>": updown_start_bytes,
|
|
213
|
+
"</UPDOWN>": updown_end_bytes,
|
|
214
|
+
|
|
215
|
+
// Font selection
|
|
216
|
+
"<FONT_A>": font_a_bytes,
|
|
217
|
+
"<FONT_B>": font_b_bytes,
|
|
218
|
+
|
|
219
|
+
// Size presets (GS !)
|
|
220
|
+
"<W2>": w2_start_bytes,
|
|
221
|
+
"</W2>": size_reset_bytes,
|
|
222
|
+
"<W3>": w3_start_bytes,
|
|
223
|
+
"</W3>": size_reset_bytes,
|
|
224
|
+
"<H2>": h2_start_bytes,
|
|
225
|
+
"</H2>": size_reset_bytes,
|
|
226
|
+
"<H3>": h3_start_bytes,
|
|
227
|
+
"</H3>": size_reset_bytes,
|
|
228
|
+
"<X2>": x2_start_bytes,
|
|
229
|
+
"</X2>": size_reset_bytes,
|
|
230
|
+
"<X3>": x3_start_bytes,
|
|
231
|
+
"</X3>": size_reset_bytes,
|
|
232
|
+
"<X4>": x4_start_bytes,
|
|
233
|
+
"</X4>": size_reset_bytes,
|
|
234
|
+
|
|
235
|
+
// Close tags for parameterized tags
|
|
236
|
+
"</FS>": size_reset_bytes,
|
|
237
|
+
"</LINESPC>": default_line_spacing_bytes,
|
|
238
|
+
"</CHARSPC>": Buffer.from([27, 32, 0]),
|
|
239
|
+
|
|
240
|
+
// Inline action tags (no closing tag)
|
|
241
|
+
"<PARTCUT>": partial_cut_bytes,
|
|
242
|
+
"<DRAWER>": drawer_bytes,
|
|
243
|
+
"<TAB>": Buffer.from([9]),
|
|
244
|
+
"<RESET>": reset_bytes,
|
|
70
245
|
};
|
|
71
246
|
|
|
247
|
+
// Sort tag keys longest-first so that e.g. "</BOLD>" is tried before "</B>"
|
|
248
|
+
const sorted_tags = Object.keys(controller).sort((a, b) => b.length - a.length);
|
|
249
|
+
|
|
250
|
+
// ── Parameterized tag regexes ───────────────────────────────────────────────
|
|
251
|
+
|
|
252
|
+
const parameterized_tags: Array<{
|
|
253
|
+
regex: RegExp;
|
|
254
|
+
handler: (match: RegExpMatchArray) => Buffer;
|
|
255
|
+
}> = [
|
|
256
|
+
{
|
|
257
|
+
// <FS:W,H> — custom font size (width 1–8, height 1–8)
|
|
258
|
+
regex: /^<FS:(\d+),(\d+)>/,
|
|
259
|
+
handler: (m) => sizeBytes(parseInt(m[1], 10), parseInt(m[2], 10)),
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
// <LINESPC:N> — line spacing in dots (0–255)
|
|
263
|
+
regex: /^<LINESPC:(\d+)>/,
|
|
264
|
+
handler: (m) => lineSpacingBytes(parseInt(m[1], 10)),
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
// <CHARSPC:N> — character spacing in dots (0–255)
|
|
268
|
+
regex: /^<CHARSPC:(\d+)>/,
|
|
269
|
+
handler: (m) => charSpacingBytes(parseInt(m[1], 10)),
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
// <FEED:N> — feed N lines (1–255)
|
|
273
|
+
regex: /^<FEED:(\d+)>/,
|
|
274
|
+
handler: (m) => {
|
|
275
|
+
const n = Math.min(Math.max(parseInt(m[1], 10), 1), 255);
|
|
276
|
+
return Buffer.from([27, 100, n]); // ESC d n
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
// <RAW:HH,HH,...> — send raw hex bytes
|
|
281
|
+
regex: /^<RAW:([0-9A-Fa-f,]+)>/,
|
|
282
|
+
handler: (m) => {
|
|
283
|
+
const hexParts = m[1].split(",").filter(Boolean);
|
|
284
|
+
return Buffer.from(hexParts.map((h) => parseInt(h, 16)));
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
];
|
|
288
|
+
|
|
289
|
+
// ── Options ─────────────────────────────────────────────────────────────────
|
|
290
|
+
|
|
72
291
|
type IOptions = {
|
|
73
292
|
beep: boolean;
|
|
74
293
|
cut: boolean;
|
|
@@ -83,6 +302,8 @@ const default_options: IOptions = {
|
|
|
83
302
|
encoding: "UTF8",
|
|
84
303
|
};
|
|
85
304
|
|
|
305
|
+
// ── Main text → buffer converter ────────────────────────────────────────────
|
|
306
|
+
|
|
86
307
|
export function exchange_text(text: string, options: IOptions): Buffer {
|
|
87
308
|
const m_options = options || default_options;
|
|
88
309
|
|
|
@@ -103,17 +324,42 @@ export function exchange_text(text: string, options: IOptions): Buffer {
|
|
|
103
324
|
for (let i = 0; i < text.length; i++) {
|
|
104
325
|
let ch = text[i];
|
|
105
326
|
switch (ch) {
|
|
106
|
-
case "<":
|
|
327
|
+
case "<": {
|
|
107
328
|
bytes.concat(iconv.encode(temp, m_options.encoding));
|
|
108
329
|
temp = "";
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
330
|
+
|
|
331
|
+
const remaining = text.substring(i);
|
|
332
|
+
|
|
333
|
+
// 1. Try static tags (longest-first to avoid prefix collisions)
|
|
334
|
+
let matched = false;
|
|
335
|
+
for (const tag of sorted_tags) {
|
|
336
|
+
if (remaining.startsWith(tag)) {
|
|
112
337
|
bytes.concat(controller[tag]);
|
|
113
338
|
i += tag.length - 1;
|
|
339
|
+
matched = true;
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// 2. Try parameterized tags
|
|
345
|
+
if (!matched) {
|
|
346
|
+
for (const pt of parameterized_tags) {
|
|
347
|
+
const m = remaining.match(pt.regex);
|
|
348
|
+
if (m) {
|
|
349
|
+
bytes.concat(pt.handler(m));
|
|
350
|
+
i += m[0].length - 1;
|
|
351
|
+
matched = true;
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
114
354
|
}
|
|
115
355
|
}
|
|
356
|
+
|
|
357
|
+
// 3. Not a known tag — keep the literal '<'
|
|
358
|
+
if (!matched) {
|
|
359
|
+
temp = "<";
|
|
360
|
+
}
|
|
116
361
|
break;
|
|
362
|
+
}
|
|
117
363
|
case "\n":
|
|
118
364
|
temp = `${temp}${ch}`;
|
|
119
365
|
bytes.concat(iconv.encode(temp, m_options.encoding));
|
|
@@ -148,6 +394,10 @@ export function exchange_text(text: string, options: IOptions): Buffer {
|
|
|
148
394
|
return bytes.toBuffer();
|
|
149
395
|
}
|
|
150
396
|
|
|
397
|
+
// ── Public helpers (re-exported for advanced usage) ─────────────────────────
|
|
398
|
+
|
|
399
|
+
export { sizeBytes, lineSpacingBytes, charSpacingBytes };
|
|
400
|
+
|
|
151
401
|
// export async function exchange_image(
|
|
152
402
|
// imagePath: string,
|
|
153
403
|
// threshold: number
|