portakal-lite 0.0.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/LICENSE +25 -0
- package/README.md +159 -0
- package/dist/builder.d.ts +39 -0
- package/dist/builder.js +250 -0
- package/dist/builder.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/lang/tsc.d.ts +16 -0
- package/dist/lang/tsc.js +217 -0
- package/dist/lang/tsc.js.map +1 -0
- package/dist/lang/zpl.d.ts +16 -0
- package/dist/lang/zpl.js +262 -0
- package/dist/lang/zpl.js.map +1 -0
- package/dist/languages/tsc.d.ts +3 -0
- package/dist/languages/tsc.js +161 -0
- package/dist/languages/tsc.js.map +1 -0
- package/dist/languages/zpl.d.ts +3 -0
- package/dist/languages/zpl.js +205 -0
- package/dist/languages/zpl.js.map +1 -0
- package/dist/profiles.d.ts +61 -0
- package/dist/profiles.js +102 -0
- package/dist/profiles.js.map +1 -0
- package/dist/raster.d.ts +39 -0
- package/dist/raster.js +204 -0
- package/dist/raster.js.map +1 -0
- package/dist/receipt.d.ts +22 -0
- package/dist/receipt.js +91 -0
- package/dist/receipt.js.map +1 -0
- package/dist/types.d.ts +336 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +15 -0
- package/dist/utils.js +28 -0
- package/dist/utils.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { bytesToTSC, rasterizeElement } from "../raster.js";
|
|
2
|
+
/**
|
|
3
|
+
* TSC/TSPL2 compiler. Command generation is identical to portakal; the
|
|
4
|
+
* difference is `sanitizeTSCString()` which prevents command injection via
|
|
5
|
+
* TEXT/BLOCK content (quotes and control characters that would break out of
|
|
6
|
+
* the quoted string and inject commands like CLS or PRINT).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Make a string safe to embed in a TSC quoted argument.
|
|
10
|
+
* TSC has no in-band escape, so: strip control characters (0x00-0x1F, 0x7F)
|
|
11
|
+
* and replace double quotes with single quotes. The result stays a single
|
|
12
|
+
* well-formed quoted string and cannot inject new commands.
|
|
13
|
+
*/
|
|
14
|
+
function sanitizeTSCString(s) {
|
|
15
|
+
let out = "";
|
|
16
|
+
for (let i = 0; i < s.length; i++) {
|
|
17
|
+
const c = s.charCodeAt(i);
|
|
18
|
+
if (c === 0x22) {
|
|
19
|
+
out += "'"; // double quote
|
|
20
|
+
}
|
|
21
|
+
else if (c < 0x20 || c === 0x7f) {
|
|
22
|
+
out += " "; // control characters
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
out += s[i];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
function compileElement(el, font0Mode) {
|
|
31
|
+
switch (el.type) {
|
|
32
|
+
case "text": {
|
|
33
|
+
const o = el.options;
|
|
34
|
+
const x = o.x ?? 0;
|
|
35
|
+
const y = o.y ?? 0;
|
|
36
|
+
const font = o.font ?? "2";
|
|
37
|
+
const rotation = o.rotation ?? 0;
|
|
38
|
+
// Font "0" size semantics depend on firmware:
|
|
39
|
+
// - "multiplier": `size` scales the DPI-based base (12×24 @ 203).
|
|
40
|
+
// - "points": `size` is a point size (1pt = 1/72in); TSC passes it
|
|
41
|
+
// through as TEXT x,y,"0",rot,w_pt,h_pt.
|
|
42
|
+
const size = o.size ?? 1;
|
|
43
|
+
const isScalable = font === "0";
|
|
44
|
+
const xMul = isScalable && font0Mode === "points" ? size : (o.xScale ?? size);
|
|
45
|
+
const yMul = isScalable && font0Mode === "points" ? size : (o.yScale ?? size);
|
|
46
|
+
if (o.maxWidth) {
|
|
47
|
+
const align = o.align === "center" ? 2 : o.align === "right" ? 3 : 1;
|
|
48
|
+
const spacing = o.lineSpacing ?? 0;
|
|
49
|
+
const height = o.maxHeight ?? o.maxWidth;
|
|
50
|
+
return `BLOCK ${x},${y},${o.maxWidth},${height},"${font}",${rotation},${xMul},${yMul},${spacing},${align},"${sanitizeTSCString(el.content)}"`;
|
|
51
|
+
}
|
|
52
|
+
return `TEXT ${x},${y},"${font}",${rotation},${xMul},${yMul},"${sanitizeTSCString(el.content)}"`;
|
|
53
|
+
}
|
|
54
|
+
case "image": {
|
|
55
|
+
const o = el.options;
|
|
56
|
+
const x = o.x ?? 0;
|
|
57
|
+
const y = o.y ?? 0;
|
|
58
|
+
const bmp = el.bitmap;
|
|
59
|
+
return `BITMAP ${x},${y},${bmp.bytesPerRow},${bmp.height},0,`;
|
|
60
|
+
}
|
|
61
|
+
case "box": {
|
|
62
|
+
const o = el.options;
|
|
63
|
+
const x2 = o.x + o.width;
|
|
64
|
+
const y2 = o.y + o.height;
|
|
65
|
+
const t = o.thickness ?? 1;
|
|
66
|
+
if (o.radius) {
|
|
67
|
+
return `BOX ${o.x},${o.y},${x2},${y2},${t},${o.radius}`;
|
|
68
|
+
}
|
|
69
|
+
return `BOX ${o.x},${o.y},${x2},${y2},${t}`;
|
|
70
|
+
}
|
|
71
|
+
case "line": {
|
|
72
|
+
const o = el.options;
|
|
73
|
+
const t = o.thickness ?? 1;
|
|
74
|
+
if (o.y1 === o.y2) {
|
|
75
|
+
const w = Math.abs(o.x2 - o.x1);
|
|
76
|
+
return `BAR ${Math.min(o.x1, o.x2)},${o.y1},${w},${t}`;
|
|
77
|
+
}
|
|
78
|
+
if (o.x1 === o.x2) {
|
|
79
|
+
const h = Math.abs(o.y2 - o.y1);
|
|
80
|
+
return `BAR ${o.x1},${Math.min(o.y1, o.y2)},${t},${h}`;
|
|
81
|
+
}
|
|
82
|
+
return `DIAGONAL ${o.x1},${o.y1},${o.x2},${o.y2},${t}`;
|
|
83
|
+
}
|
|
84
|
+
case "circle": {
|
|
85
|
+
const o = el.options;
|
|
86
|
+
const t = o.thickness ?? 1;
|
|
87
|
+
return `CIRCLE ${o.x},${o.y},${o.diameter},${t}`;
|
|
88
|
+
}
|
|
89
|
+
case "ellipse": {
|
|
90
|
+
const o = el.options;
|
|
91
|
+
const t = o.thickness ?? 1;
|
|
92
|
+
return `ELLIPSE ${o.x},${o.y},${o.width},${o.height},${t}`;
|
|
93
|
+
}
|
|
94
|
+
case "reverse": {
|
|
95
|
+
const o = el.options;
|
|
96
|
+
return `REVERSE ${o.x},${o.y},${o.width},${o.height}`;
|
|
97
|
+
}
|
|
98
|
+
case "erase": {
|
|
99
|
+
const o = el.options;
|
|
100
|
+
return `ERASE ${o.x},${o.y},${o.width},${o.height}`;
|
|
101
|
+
}
|
|
102
|
+
case "barcode": {
|
|
103
|
+
const o = el.options;
|
|
104
|
+
const x = o.x ?? 0;
|
|
105
|
+
const y = o.y ?? 0;
|
|
106
|
+
if (el.symbology === "code128") {
|
|
107
|
+
// TSC BARCODE: x,y,"type",height,readable,rotation,narrow,wide,"content"
|
|
108
|
+
const height = o.height ?? 80;
|
|
109
|
+
const readable = o.readable === false ? 0 : 1;
|
|
110
|
+
const rotation = o.rotation ?? 0;
|
|
111
|
+
const narrow = o.moduleWidth ?? 2;
|
|
112
|
+
const wide = narrow * (o.ratio ?? 2);
|
|
113
|
+
return `BARCODE ${x},${y},"128",${height},${readable},${rotation},${narrow},${wide},"${sanitizeTSCString(el.content)}"`;
|
|
114
|
+
}
|
|
115
|
+
// Non-native 1D → rasterize and emit as BITMAP
|
|
116
|
+
const bitmap = rasterizeElement(el);
|
|
117
|
+
return `BITMAP ${x},${y},${bitmap.bytesPerRow},${bitmap.height},0,${bytesToTSC(bitmap.data)}`;
|
|
118
|
+
}
|
|
119
|
+
case "qrcode": {
|
|
120
|
+
const o = el.options;
|
|
121
|
+
const x = o.x ?? 0;
|
|
122
|
+
const y = o.y ?? 0;
|
|
123
|
+
// TSC QRCODE: x,y,ECC,cellwidth,mode,rotation,"content"
|
|
124
|
+
// ECC (L/M/Q/H) and mode (A/M) are NOT quoted in TSPL.
|
|
125
|
+
const ecc = o.ecc ?? "M";
|
|
126
|
+
const cellWidth = o.cellSize ?? 6;
|
|
127
|
+
const rotation = o.rotation ?? 0;
|
|
128
|
+
return `QRCODE ${x},${y},${ecc},${cellWidth},A,${rotation},"${sanitizeTSCString(el.content)}"`;
|
|
129
|
+
}
|
|
130
|
+
case "matrix": {
|
|
131
|
+
// Raster path — emit the bitmap as a TSC BITMAP command.
|
|
132
|
+
const o = el.options;
|
|
133
|
+
const x = o.x ?? 0;
|
|
134
|
+
const y = o.y ?? 0;
|
|
135
|
+
const bitmap = rasterizeElement(el);
|
|
136
|
+
return `BITMAP ${x},${y},${bitmap.bytesPerRow},${bitmap.height},0,${bytesToTSC(bitmap.data)}`;
|
|
137
|
+
}
|
|
138
|
+
case "raw":
|
|
139
|
+
return typeof el.content === "string" ? el.content : "";
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Compile a resolved label to TSC/TSPL2 command string */
|
|
143
|
+
export function compileToTSC(label) {
|
|
144
|
+
const lines = [];
|
|
145
|
+
const dpi = label.dpi;
|
|
146
|
+
const wMM = Math.round((label.widthDots / dpi) * 25.4);
|
|
147
|
+
const hMM = label.heightDots > 0 ? Math.round((label.heightDots / dpi) * 25.4) : 0;
|
|
148
|
+
const gMM = Math.round((label.gapDots / dpi) * 25.4);
|
|
149
|
+
lines.push(`SIZE ${wMM} mm,${hMM} mm`);
|
|
150
|
+
lines.push(`GAP ${gMM} mm,0 mm`);
|
|
151
|
+
lines.push(`SPEED ${label.speed}`);
|
|
152
|
+
lines.push(`DENSITY ${label.density}`);
|
|
153
|
+
lines.push(`DIRECTION ${label.direction}`);
|
|
154
|
+
lines.push("CLS");
|
|
155
|
+
for (const el of label.elements) {
|
|
156
|
+
lines.push(compileElement(el, label.font0Mode));
|
|
157
|
+
}
|
|
158
|
+
lines.push(`PRINT ${label.copies}`);
|
|
159
|
+
return lines.join("\r\n") + "\r\n";
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=tsc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsc.js","sourceRoot":"","sources":["../../src/languages/tsc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { bytesToHex, rasterizeElement } from "../raster.js";
|
|
2
|
+
/**
|
|
3
|
+
* ZPL II compiler. Command generation is identical to portakal except for one
|
|
4
|
+
* security hardening: `^FD` data is emitted with `^FH_` and Zebra hex-escapes.
|
|
5
|
+
* Carets, tildes, underscores and control characters in text can otherwise
|
|
6
|
+
* break out of the field and inject arbitrary ZPL commands.
|
|
7
|
+
*/
|
|
8
|
+
const HEX_DIGITS = "0123456789ABCDEF";
|
|
9
|
+
/**
|
|
10
|
+
* Zebra ^FH hex-escape encoding: printable ASCII passes through unchanged;
|
|
11
|
+
* `^`, `~`, `_` and control characters are emitted as `_HH`. Because `_` is
|
|
12
|
+
* always escaped, the sequence cannot be misinterpreted by the printer.
|
|
13
|
+
*/
|
|
14
|
+
function encodeZPLData(s) {
|
|
15
|
+
let out = "";
|
|
16
|
+
for (let i = 0; i < s.length; i++) {
|
|
17
|
+
const code = s.charCodeAt(i);
|
|
18
|
+
if ((code >= 0x20 && code <= 0x5d) || // printable except ^ (0x5e)
|
|
19
|
+
code === 0x60 || // backtick
|
|
20
|
+
(code >= 0x61 && code <= 0x7d) // printable except ~ (0x7e) and DEL (0x7f)
|
|
21
|
+
) {
|
|
22
|
+
out += s[i];
|
|
23
|
+
}
|
|
24
|
+
else if (code <= 0xff) {
|
|
25
|
+
out += "_" + HEX_DIGITS[code >> 4] + HEX_DIGITS[code & 0x0f];
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Non-Latin-1: encode UTF-8 bytes individually so the printer
|
|
29
|
+
// (with ^CI28) receives the same text.
|
|
30
|
+
const bytes = encodeUtf8(s.charCodeAt(i));
|
|
31
|
+
for (const b of bytes) {
|
|
32
|
+
out += "_" + HEX_DIGITS[b >> 4] + HEX_DIGITS[b & 0x0f];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
function encodeUtf8(code) {
|
|
39
|
+
const bytes = [];
|
|
40
|
+
if (code <= 0x7f) {
|
|
41
|
+
bytes.push(code);
|
|
42
|
+
}
|
|
43
|
+
else if (code <= 0x7ff) {
|
|
44
|
+
bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));
|
|
45
|
+
}
|
|
46
|
+
else if (code <= 0xffff) {
|
|
47
|
+
bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
bytes.push(0xf0 | (code >> 18), 0x80 | ((code >> 12) & 0x3f), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
|
|
51
|
+
}
|
|
52
|
+
return bytes;
|
|
53
|
+
}
|
|
54
|
+
function zplRotation(r) {
|
|
55
|
+
switch (r) {
|
|
56
|
+
case 90:
|
|
57
|
+
return "R";
|
|
58
|
+
case 180:
|
|
59
|
+
return "I";
|
|
60
|
+
case 270:
|
|
61
|
+
return "B";
|
|
62
|
+
default:
|
|
63
|
+
return "N";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function compileElement(el, fontBase, font0Mode, dpi) {
|
|
67
|
+
switch (el.type) {
|
|
68
|
+
case "text": {
|
|
69
|
+
const o = el.options;
|
|
70
|
+
const x = o.x ?? 0;
|
|
71
|
+
const y = o.y ?? 0;
|
|
72
|
+
const rot = zplRotation(o.rotation ?? 0);
|
|
73
|
+
const font = o.font ?? "0";
|
|
74
|
+
// Font "0" size semantics depend on firmware:
|
|
75
|
+
// - "multiplier": `size` × fontBase → ^A h,w dots.
|
|
76
|
+
// - "points": `size` (pt) × dpi/72 → ^A h,w dots.
|
|
77
|
+
const isScalable = font === "0";
|
|
78
|
+
const ptToDots = dpi / 72;
|
|
79
|
+
const h = isScalable
|
|
80
|
+
? Math.round((o.size ?? 1) * (font0Mode === "points" ? ptToDots : fontBase.height))
|
|
81
|
+
: Math.round((o.size ?? 1) * fontBase.height);
|
|
82
|
+
const w = o.xScale != null
|
|
83
|
+
? Math.round(o.xScale * (font0Mode === "points" ? ptToDots : fontBase.width))
|
|
84
|
+
: h;
|
|
85
|
+
let cmd = `^FO${x},${y}`;
|
|
86
|
+
cmd += `^A${font}${rot},${h},${w}`;
|
|
87
|
+
if (o.maxWidth) {
|
|
88
|
+
const justify = o.align === "center" ? "C" : o.align === "right" ? "R" : "L";
|
|
89
|
+
const lines = 999;
|
|
90
|
+
cmd += `^FB${o.maxWidth},${lines},0,${justify}`;
|
|
91
|
+
}
|
|
92
|
+
if (o.reverse) {
|
|
93
|
+
cmd += "^FR";
|
|
94
|
+
}
|
|
95
|
+
cmd += `^FH_^FD${encodeZPLData(el.content)}^FS`;
|
|
96
|
+
return cmd;
|
|
97
|
+
}
|
|
98
|
+
case "image": {
|
|
99
|
+
const o = el.options;
|
|
100
|
+
const x = o.x ?? 0;
|
|
101
|
+
const y = o.y ?? 0;
|
|
102
|
+
const bmp = el.bitmap;
|
|
103
|
+
const totalBytes = bmp.data.length;
|
|
104
|
+
let hex = "";
|
|
105
|
+
for (let i = 0; i < bmp.data.length; i++) {
|
|
106
|
+
hex += bmp.data[i].toString(16).padStart(2, "0").toUpperCase();
|
|
107
|
+
}
|
|
108
|
+
return `^FO${x},${y}^GFA,${totalBytes},${totalBytes},${bmp.bytesPerRow},${hex}^FS`;
|
|
109
|
+
}
|
|
110
|
+
case "box": {
|
|
111
|
+
const o = el.options;
|
|
112
|
+
const t = o.thickness ?? 1;
|
|
113
|
+
const radiusDots = o.radius ?? 0;
|
|
114
|
+
// Convert dot radius to ZPL 0-8 index: index = radius / (shorter_side/2) * 8
|
|
115
|
+
const maxR = Math.min(o.width, o.height) / 2;
|
|
116
|
+
const rIndex = maxR > 0 && radiusDots > 0 ? Math.min(8, Math.round((radiusDots / maxR) * 8)) : 0;
|
|
117
|
+
return `^FO${o.x},${o.y}^GB${o.width},${o.height},${t},B,${rIndex}^FS`;
|
|
118
|
+
}
|
|
119
|
+
case "line": {
|
|
120
|
+
const o = el.options;
|
|
121
|
+
const t = o.thickness ?? 1;
|
|
122
|
+
if (o.y1 === o.y2) {
|
|
123
|
+
const w = Math.abs(o.x2 - o.x1);
|
|
124
|
+
return `^FO${Math.min(o.x1, o.x2)},${o.y1}^GB${w},${t},${t}^FS`;
|
|
125
|
+
}
|
|
126
|
+
if (o.x1 === o.x2) {
|
|
127
|
+
const h = Math.abs(o.y2 - o.y1);
|
|
128
|
+
return `^FO${o.x1},${Math.min(o.y1, o.y2)}^GB${t},${h},${t}^FS`;
|
|
129
|
+
}
|
|
130
|
+
const w = Math.abs(o.x2 - o.x1);
|
|
131
|
+
const h = Math.abs(o.y2 - o.y1);
|
|
132
|
+
const dir = o.x2 > o.x1 === o.y2 > o.y1 ? "R" : "L";
|
|
133
|
+
return `^FO${Math.min(o.x1, o.x2)},${Math.min(o.y1, o.y2)}^GD${w},${h},${t},B,${dir}^FS`;
|
|
134
|
+
}
|
|
135
|
+
case "circle": {
|
|
136
|
+
const o = el.options;
|
|
137
|
+
const t = o.thickness ?? 1;
|
|
138
|
+
return `^FO${o.x},${o.y}^GC${o.diameter},${t},B^FS`;
|
|
139
|
+
}
|
|
140
|
+
case "barcode": {
|
|
141
|
+
const o = el.options;
|
|
142
|
+
const x = o.x ?? 0;
|
|
143
|
+
const y = o.y ?? 0;
|
|
144
|
+
if (el.symbology === "code128") {
|
|
145
|
+
// ^BY moduleWidth, ratio, height
|
|
146
|
+
const mw = o.moduleWidth ?? 2;
|
|
147
|
+
const ratio = o.ratio ?? 2;
|
|
148
|
+
const h = o.height ?? 80;
|
|
149
|
+
// ^BC rotation, height, interpretable, interpretableLineAbove
|
|
150
|
+
const rot = zplRotation(o.rotation ?? 0);
|
|
151
|
+
const readable = o.readable === false ? "N" : "Y";
|
|
152
|
+
const fs = o.fontSize ?? 2;
|
|
153
|
+
return `^FO${x},${y}^BY${mw},${ratio},${h}^BC${rot},${readable},N,${fs},^FH_^FD${encodeZPLData(el.content)}^FS`;
|
|
154
|
+
}
|
|
155
|
+
// Non-native 1D → rasterize and emit as ^GFA
|
|
156
|
+
const bitmap = rasterizeElement(el);
|
|
157
|
+
return `^FO${x},${y}^GFA,${bitmap.data.length},${bitmap.data.length},${bitmap.bytesPerRow},${bytesToHex(bitmap.data)}^FS`;
|
|
158
|
+
}
|
|
159
|
+
case "qrcode": {
|
|
160
|
+
const o = el.options;
|
|
161
|
+
const x = o.x ?? 0;
|
|
162
|
+
const y = o.y ?? 0;
|
|
163
|
+
// ^BQ orientation, model, magnification, errorCorrection
|
|
164
|
+
const rot = zplRotation(o.rotation ?? 0);
|
|
165
|
+
const ecc = o.ecc ?? "M";
|
|
166
|
+
const cw = o.cellSize ?? 6;
|
|
167
|
+
return `^FO${x},${y}^BQ${rot},${ecc},${cw},${ecc}^FH_^FD${encodeZPLData(el.content)}^FS`;
|
|
168
|
+
}
|
|
169
|
+
case "matrix": {
|
|
170
|
+
const o = el.options;
|
|
171
|
+
const x = o.x ?? 0;
|
|
172
|
+
const y = o.y ?? 0;
|
|
173
|
+
const bitmap = rasterizeElement(el);
|
|
174
|
+
return `^FO${x},${y}^GFA,${bitmap.data.length},${bitmap.data.length},${bitmap.bytesPerRow},${bytesToHex(bitmap.data)}^FS`;
|
|
175
|
+
}
|
|
176
|
+
case "ellipse":
|
|
177
|
+
case "reverse":
|
|
178
|
+
case "erase":
|
|
179
|
+
return "";
|
|
180
|
+
case "raw":
|
|
181
|
+
return typeof el.content === "string" ? el.content : "";
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/** Compile a resolved label to ZPL II command string */
|
|
185
|
+
export function compileToZPL(label) {
|
|
186
|
+
const lines = [];
|
|
187
|
+
lines.push("^XA");
|
|
188
|
+
lines.push(`^PW${label.widthDots}`);
|
|
189
|
+
if (label.heightDots > 0) {
|
|
190
|
+
lines.push(`^LL${label.heightDots}`);
|
|
191
|
+
}
|
|
192
|
+
if (label.marginDots > 0) {
|
|
193
|
+
lines.push(`^ML${label.marginDots}`);
|
|
194
|
+
}
|
|
195
|
+
lines.push(`^PR${label.speed}`);
|
|
196
|
+
lines.push(`~SD${label.density * 2}`);
|
|
197
|
+
lines.push("^CI28");
|
|
198
|
+
for (const el of label.elements) {
|
|
199
|
+
lines.push(compileElement(el, label.fontBase, label.font0Mode, label.dpi));
|
|
200
|
+
}
|
|
201
|
+
lines.push(`^PQ${label.copies}`);
|
|
202
|
+
lines.push("^XZ");
|
|
203
|
+
return lines.join("\n") + "\n";
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=zpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zpl.js","sourceRoot":"","sources":["../../src/languages/zpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Printer capability profiles — trimmed to TSC and ZPL label printers.
|
|
3
|
+
* Derived from portakal (https://github.com/productdevbook/portakal) — MIT.
|
|
4
|
+
*/
|
|
5
|
+
export type PrinterLanguage = "tsc" | "zpl";
|
|
6
|
+
export type CutterType = "none" | "partial" | "full";
|
|
7
|
+
export type ImageMode = "raster" | "column" | "nvGraphics";
|
|
8
|
+
export interface PrinterProfile {
|
|
9
|
+
/** Printer model name */
|
|
10
|
+
name: string;
|
|
11
|
+
/** Manufacturer */
|
|
12
|
+
vendor: string;
|
|
13
|
+
/** Primary printer language */
|
|
14
|
+
language: PrinterLanguage;
|
|
15
|
+
/** Paper width in mm */
|
|
16
|
+
paperWidth: number;
|
|
17
|
+
/** Print width in dots */
|
|
18
|
+
dotsPerLine: number;
|
|
19
|
+
/** Printer DPI */
|
|
20
|
+
dpi: number;
|
|
21
|
+
/**
|
|
22
|
+
* TSPL font "0" base character size in dots (width × height), which is
|
|
23
|
+
* DPI-dependent: 12×24 @ 203 DPI, 18×36 @ 300 DPI. Used when `font0Mode`
|
|
24
|
+
* is "multiplier": `size` scales this base.
|
|
25
|
+
*/
|
|
26
|
+
fontBase: {
|
|
27
|
+
width: number;
|
|
28
|
+
height: number;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* How TSPL font "0" sizes are interpreted:
|
|
32
|
+
* - "multiplier": `size` is a multiplier of `fontBase` (bitmap-style).
|
|
33
|
+
* - "points": `size` is a point size (TrueType-style, 1pt = 1/72in).
|
|
34
|
+
* Firmware varies; the TSC manual describes points for TSPL2, but many
|
|
35
|
+
* models treat it as a multiplier. Default "multiplier".
|
|
36
|
+
*/
|
|
37
|
+
font0Mode: "multiplier" | "points";
|
|
38
|
+
/** Characters per line (Font A) */
|
|
39
|
+
charsPerLine: number;
|
|
40
|
+
/** USB Vendor ID (hex) */
|
|
41
|
+
usbVendorId?: number;
|
|
42
|
+
/** USB Product ID (hex) */
|
|
43
|
+
usbProductId?: number;
|
|
44
|
+
/** Features */
|
|
45
|
+
features: {
|
|
46
|
+
cutter: CutterType;
|
|
47
|
+
cashDrawer: boolean;
|
|
48
|
+
imageMode: ImageMode[];
|
|
49
|
+
cjk: boolean;
|
|
50
|
+
nativeUtf8: boolean;
|
|
51
|
+
codePages: number[];
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** Built-in printer profiles */
|
|
55
|
+
export declare const PRINTER_PROFILES: Record<string, PrinterProfile>;
|
|
56
|
+
/** Get a printer profile by model ID */
|
|
57
|
+
export declare function getProfile(modelId: string): PrinterProfile | undefined;
|
|
58
|
+
/** List all available profile IDs */
|
|
59
|
+
export declare function listProfiles(): string[];
|
|
60
|
+
/** Find profiles by language */
|
|
61
|
+
export declare function findByLanguage(language: PrinterLanguage): PrinterProfile[];
|
package/dist/profiles.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Printer capability profiles — trimmed to TSC and ZPL label printers.
|
|
3
|
+
* Derived from portakal (https://github.com/productdevbook/portakal) — MIT.
|
|
4
|
+
*/
|
|
5
|
+
/** Built-in printer profiles */
|
|
6
|
+
export const PRINTER_PROFILES = {
|
|
7
|
+
// === TSC Label Printers ===
|
|
8
|
+
"tsc-te200": {
|
|
9
|
+
name: "TSC TE200",
|
|
10
|
+
vendor: "TSC",
|
|
11
|
+
language: "tsc",
|
|
12
|
+
paperWidth: 108,
|
|
13
|
+
dotsPerLine: 832,
|
|
14
|
+
dpi: 203,
|
|
15
|
+
fontBase: { width: 12, height: 24 },
|
|
16
|
+
font0Mode: "multiplier",
|
|
17
|
+
charsPerLine: 0,
|
|
18
|
+
usbVendorId: 0x1203,
|
|
19
|
+
features: {
|
|
20
|
+
cutter: "none",
|
|
21
|
+
cashDrawer: false,
|
|
22
|
+
imageMode: ["raster"],
|
|
23
|
+
cjk: true,
|
|
24
|
+
nativeUtf8: false,
|
|
25
|
+
codePages: [],
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
"tsc-te310": {
|
|
29
|
+
name: "TSC TE310",
|
|
30
|
+
vendor: "TSC",
|
|
31
|
+
language: "tsc",
|
|
32
|
+
paperWidth: 108,
|
|
33
|
+
dotsPerLine: 1276,
|
|
34
|
+
dpi: 300,
|
|
35
|
+
fontBase: { width: 18, height: 36 },
|
|
36
|
+
font0Mode: "multiplier",
|
|
37
|
+
charsPerLine: 0,
|
|
38
|
+
usbVendorId: 0x1203,
|
|
39
|
+
features: {
|
|
40
|
+
cutter: "none",
|
|
41
|
+
cashDrawer: false,
|
|
42
|
+
imageMode: ["raster"],
|
|
43
|
+
cjk: true,
|
|
44
|
+
nativeUtf8: false,
|
|
45
|
+
codePages: [],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
// === Zebra Label Printers ===
|
|
49
|
+
"zebra-zd420": {
|
|
50
|
+
name: "Zebra ZD420",
|
|
51
|
+
vendor: "Zebra",
|
|
52
|
+
language: "zpl",
|
|
53
|
+
paperWidth: 108,
|
|
54
|
+
dotsPerLine: 832,
|
|
55
|
+
dpi: 203,
|
|
56
|
+
fontBase: { width: 12, height: 24 },
|
|
57
|
+
font0Mode: "multiplier",
|
|
58
|
+
charsPerLine: 0,
|
|
59
|
+
usbVendorId: 0x0a5f,
|
|
60
|
+
features: {
|
|
61
|
+
cutter: "full",
|
|
62
|
+
cashDrawer: false,
|
|
63
|
+
imageMode: ["raster"],
|
|
64
|
+
cjk: false,
|
|
65
|
+
nativeUtf8: true,
|
|
66
|
+
codePages: [],
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
"zebra-zt410": {
|
|
70
|
+
name: "Zebra ZT410",
|
|
71
|
+
vendor: "Zebra",
|
|
72
|
+
language: "zpl",
|
|
73
|
+
paperWidth: 104,
|
|
74
|
+
dotsPerLine: 832,
|
|
75
|
+
dpi: 203,
|
|
76
|
+
fontBase: { width: 12, height: 24 },
|
|
77
|
+
font0Mode: "multiplier",
|
|
78
|
+
charsPerLine: 0,
|
|
79
|
+
usbVendorId: 0x0a5f,
|
|
80
|
+
features: {
|
|
81
|
+
cutter: "full",
|
|
82
|
+
cashDrawer: false,
|
|
83
|
+
imageMode: ["raster"],
|
|
84
|
+
cjk: false,
|
|
85
|
+
nativeUtf8: true,
|
|
86
|
+
codePages: [],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
/** Get a printer profile by model ID */
|
|
91
|
+
export function getProfile(modelId) {
|
|
92
|
+
return PRINTER_PROFILES[modelId];
|
|
93
|
+
}
|
|
94
|
+
/** List all available profile IDs */
|
|
95
|
+
export function listProfiles() {
|
|
96
|
+
return Object.keys(PRINTER_PROFILES);
|
|
97
|
+
}
|
|
98
|
+
/** Find profiles by language */
|
|
99
|
+
export function findByLanguage(language) {
|
|
100
|
+
return Object.values(PRINTER_PROFILES).filter((p) => p.language === language);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"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"}
|
package/dist/raster.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rasterization helpers — turn etiket's raw encodings into a 1-bit
|
|
3
|
+
* MonochromeBitmap that compilers emit as TSC BITMAP / ZPL ^GFA graphics.
|
|
4
|
+
*
|
|
5
|
+
* etiket raw encoders return:
|
|
6
|
+
* - 1D: `bars: number[]` — alternating bar/space widths in modules
|
|
7
|
+
* - 2D: `matrix: boolean[][]` — module grid
|
|
8
|
+
* - postal: height-modulated bars (POSTNET/PLANET/RM4SCC/...)
|
|
9
|
+
*
|
|
10
|
+
* All content is rendered as pixels, so it is inherently injection-safe.
|
|
11
|
+
*/
|
|
12
|
+
import type { LabelElement, MonochromeBitmap } from "./types.js";
|
|
13
|
+
export interface RasterizeOptions {
|
|
14
|
+
/** Module width in dots (1D narrow bar, 2D cell). Default 2 (1D) / 6 (2D). */
|
|
15
|
+
moduleWidth?: number;
|
|
16
|
+
/** Bar height in dots (1D only). Default 80. */
|
|
17
|
+
height?: number;
|
|
18
|
+
/** Rotation in degrees (0|90|180|270). Default 0. */
|
|
19
|
+
rotation?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Rasterize a 1D bar pattern (`bars` = alternating bar/space module widths,
|
|
23
|
+
* starting with a bar) into a monochrome bitmap.
|
|
24
|
+
*/
|
|
25
|
+
export declare function rasterizeBars(bars: number[], opts?: RasterizeOptions): MonochromeBitmap;
|
|
26
|
+
/**
|
|
27
|
+
* Rasterize a 2D module matrix into a monochrome bitmap.
|
|
28
|
+
* Each cell becomes `cellSize`×`cellSize` dots.
|
|
29
|
+
*/
|
|
30
|
+
export declare function rasterizeMatrix(matrix: boolean[][], opts?: RasterizeOptions): MonochromeBitmap;
|
|
31
|
+
/**
|
|
32
|
+
* Rasterize a barcode/QR/matrix element into a MonochromeBitmap using etiket's
|
|
33
|
+
* raw encoders. Throws InvalidConfigError on empty/invalid encodings.
|
|
34
|
+
*/
|
|
35
|
+
export declare function rasterizeElement(el: LabelElement): MonochromeBitmap;
|
|
36
|
+
/** Convert a Uint8Array to a TSC BITMAP data payload (comma-separated bytes). */
|
|
37
|
+
export declare function bytesToTSC(data: Uint8Array): string;
|
|
38
|
+
/** Convert a Uint8Array to uppercase hex (ZPL ^GFA payload). */
|
|
39
|
+
export declare function bytesToHex(data: Uint8Array): string;
|