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 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
- | Tag | Description |
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
- Example:
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
- "<C><B>MY STORE</B></C>\n" +
190
- "================================\n" +
191
- "Item 1 $5.00\n" +
192
- "Item 2 $3.50\n" +
193
- "================================\n" +
194
- "<B>TOTAL $8.50</B>\n",
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":"AAuEA,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;AASF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM,CA+DrE"}
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"}
@@ -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
- const init_printer_bytes = Buffer.from([27, 64]);
6
- const l_start_bytes = Buffer.from([27, 97, 0]);
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([]); // [ 27, 97, 0 ];
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
- const default_space_bytes = Buffer.from([27, 50]);
13
- const reset_bytes = Buffer.from([27, 97, 0, 29, 33, 0, 27, 50]);
14
- const m_start_bytes = Buffer.from([27, 33, 16, 28, 33, 8]);
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
- const d_start_bytes = Buffer.from([27, 33, 32, 28, 33, 4]);
25
- const d_end_bytes = Buffer.from([27, 33, 0, 28, 33, 0]);
26
- const cut_bytes = Buffer.from([27, 105]);
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
- "<L>": l_start_bytes,
59
- "</L>": l_end_bytes,
60
- "<R>": r_start_bytes,
61
- "</R>": r_end_bytes,
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
- // add bytes for changing font and justifying text
87
- for (const tag in controller) {
88
- if (text.substring(i, i + tag.length) === tag) {
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":"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"}
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.2.0",
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",
@@ -4,34 +4,150 @@ import * as iconv from "iconv-lite";
4
4
 
5
5
  import BufferHelper from "./buffer-helper";
6
6
 
7
- const init_printer_bytes = Buffer.from([27, 64]);
8
- const l_start_bytes = Buffer.from([27, 97, 0]);
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([]); // [ 27, 97, 0 ];
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
- const default_space_bytes = Buffer.from([27, 50]);
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([27, 97, 0, 29, 33, 0, 27, 50]);
18
- const m_start_bytes = Buffer.from([27, 33, 16, 28, 33, 8]);
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
- const cut_bytes = Buffer.from([27, 105]);
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
- "<L>": l_start_bytes,
67
- "</L>": l_end_bytes,
68
- "<R>": r_start_bytes,
69
- "</R>": r_end_bytes,
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
- // add bytes for changing font and justifying text
110
- for (const tag in controller) {
111
- if (text.substring(i, i + tag.length) === tag) {
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