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
package/dist/lang/tsc.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TSC/TSPL2 language module — compile + preview.
|
|
3
|
+
* Preview code copied from portakal (https://github.com/productdevbook/portakal) — MIT.
|
|
4
|
+
* parse/validate are intentionally omitted from this package.
|
|
5
|
+
*/
|
|
6
|
+
import { compileToTSC } from "../languages/tsc.js";
|
|
7
|
+
import { rasterizeElement } from "../raster.js";
|
|
8
|
+
/** TSC font pixel dimensions: { width, height } */
|
|
9
|
+
const TSC_FONTS = {
|
|
10
|
+
"1": { w: 8, h: 12 },
|
|
11
|
+
"2": { w: 12, h: 20 },
|
|
12
|
+
"3": { w: 16, h: 24 },
|
|
13
|
+
"4": { w: 24, h: 32 },
|
|
14
|
+
"5": { w: 32, h: 48 },
|
|
15
|
+
"6": { w: 14, h: 19 },
|
|
16
|
+
"7": { w: 21, h: 27 },
|
|
17
|
+
"8": { w: 14, h: 25 },
|
|
18
|
+
};
|
|
19
|
+
function escapeXml(s) {
|
|
20
|
+
return s
|
|
21
|
+
.replace(/&/g, "&")
|
|
22
|
+
.replace(/</g, "<")
|
|
23
|
+
.replace(/>/g, ">")
|
|
24
|
+
.replace(/"/g, """);
|
|
25
|
+
}
|
|
26
|
+
function tscFontSize(font, size, yScale, font0Mode, dpi, fontBase) {
|
|
27
|
+
const f = TSC_FONTS[font ?? "2"];
|
|
28
|
+
if (f)
|
|
29
|
+
return f.h * (yScale ?? size ?? 1);
|
|
30
|
+
// Font "0" (scalable): size unit follows the printer's font0Mode.
|
|
31
|
+
if (font0Mode === "points")
|
|
32
|
+
return (size ?? 12) * (dpi / 72);
|
|
33
|
+
return fontBase.height * (size ?? 1);
|
|
34
|
+
}
|
|
35
|
+
function tscCharWidth(font, size, xScale, font0Mode, dpi, fontBase, charWidthFactor) {
|
|
36
|
+
const f = TSC_FONTS[font ?? "2"];
|
|
37
|
+
if (f)
|
|
38
|
+
return f.w * (xScale ?? size ?? 1);
|
|
39
|
+
// Font "0": proportional, avg char ≈ charWidthFactor × line height.
|
|
40
|
+
return tscFontSize(font, size, xScale, font0Mode, dpi, fontBase) * charWidthFactor;
|
|
41
|
+
}
|
|
42
|
+
function renderElement(el, font0Mode, dpi, fontBase, defaultCharWidthFactor) {
|
|
43
|
+
switch (el.type) {
|
|
44
|
+
case "text": {
|
|
45
|
+
const o = el.options;
|
|
46
|
+
const x = o.x ?? 0;
|
|
47
|
+
const y = o.y ?? 0;
|
|
48
|
+
const charWidthFactor = o.charWidthFactor ?? defaultCharWidthFactor;
|
|
49
|
+
const fs = tscFontSize(o.font, o.size, o.yScale, font0Mode, dpi, fontBase);
|
|
50
|
+
const cw = tscCharWidth(o.font, o.size, o.xScale, font0Mode, dpi, fontBase, charWidthFactor);
|
|
51
|
+
const weight = o.bold ? "bold" : "normal";
|
|
52
|
+
const transform = o.rotation ? ` transform="rotate(${o.rotation} ${x} ${y})"` : "";
|
|
53
|
+
// Text anchor for alignment. When maxWidth is set (BLOCK), anchor within
|
|
54
|
+
// that box. When the template manually positioned text (no maxWidth),
|
|
55
|
+
// `align` tells the preview to anchor relative to the computed x.
|
|
56
|
+
let anchor = "";
|
|
57
|
+
let textX = x;
|
|
58
|
+
if (o.maxWidth && o.align === "center") {
|
|
59
|
+
anchor = ' text-anchor="middle"';
|
|
60
|
+
textX = x + o.maxWidth / 2;
|
|
61
|
+
}
|
|
62
|
+
else if (o.maxWidth && o.align === "right") {
|
|
63
|
+
anchor = ' text-anchor="end"';
|
|
64
|
+
textX = x + o.maxWidth;
|
|
65
|
+
}
|
|
66
|
+
else if (o.align === "center") {
|
|
67
|
+
// Template-computed center: x is the left edge of the centered text.
|
|
68
|
+
anchor = ' text-anchor="middle"';
|
|
69
|
+
textX = x + (el.content.length * cw) / 2;
|
|
70
|
+
}
|
|
71
|
+
else if (o.align === "right") {
|
|
72
|
+
anchor = ' text-anchor="end"';
|
|
73
|
+
textX = x + el.content.length * cw;
|
|
74
|
+
}
|
|
75
|
+
if (o.reverse) {
|
|
76
|
+
const tw = el.content.length * cw;
|
|
77
|
+
return (`<rect x="${x - 1}" y="${y - 1}" width="${tw + 2}" height="${fs + 2}" fill="#000"/>` +
|
|
78
|
+
`<text x="${textX}" y="${y + fs * 0.85}" fill="#fff" font-size="${fs}" font-weight="${weight}" font-family="monospace"${anchor}${transform}>${escapeXml(el.content)}</text>`);
|
|
79
|
+
}
|
|
80
|
+
return `<text x="${textX}" y="${y + fs * 0.85}" fill="#000" font-size="${fs}" font-weight="${weight}" font-family="monospace"${anchor}${transform}>${escapeXml(el.content)}</text>`;
|
|
81
|
+
}
|
|
82
|
+
case "image": {
|
|
83
|
+
const o = el.options;
|
|
84
|
+
const x = o.x ?? 0;
|
|
85
|
+
const y = o.y ?? 0;
|
|
86
|
+
const bmp = el.bitmap;
|
|
87
|
+
const w = o.width ?? bmp.width;
|
|
88
|
+
const h = o.height ?? bmp.height;
|
|
89
|
+
const step = Math.max(1, Math.floor(Math.max(bmp.width, bmp.height) / 100));
|
|
90
|
+
const sx = w / bmp.width;
|
|
91
|
+
const sy = h / bmp.height;
|
|
92
|
+
let svg = "";
|
|
93
|
+
for (let py = 0; py < bmp.height; py += step) {
|
|
94
|
+
for (let px = 0; px < bmp.width; px += step) {
|
|
95
|
+
const byteIdx = py * bmp.bytesPerRow + Math.floor(px / 8);
|
|
96
|
+
const bitIdx = 7 - (px % 8);
|
|
97
|
+
if ((bmp.data[byteIdx] >> bitIdx) & 1) {
|
|
98
|
+
svg += `<rect x="${x + px * sx}" y="${y + py * sy}" width="${step * sx}" height="${step * sy}" fill="#000"/>`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return svg;
|
|
103
|
+
}
|
|
104
|
+
case "box": {
|
|
105
|
+
const o = el.options;
|
|
106
|
+
const t = o.thickness ?? 1;
|
|
107
|
+
const rx = o.radius ?? 0;
|
|
108
|
+
// TSC BOX: coordinates are outer boundary, border draws inward
|
|
109
|
+
if (t >= Math.min(o.width, o.height)) {
|
|
110
|
+
return `<rect x="${o.x}" y="${o.y}" width="${o.width}" height="${o.height}" fill="#000" rx="${rx}"/>`;
|
|
111
|
+
}
|
|
112
|
+
return `<rect x="${o.x + t / 2}" y="${o.y + t / 2}" width="${o.width - t}" height="${o.height - t}" fill="none" stroke="#000" stroke-width="${t}" rx="${rx}"/>`;
|
|
113
|
+
}
|
|
114
|
+
case "line": {
|
|
115
|
+
const o = el.options;
|
|
116
|
+
const t = o.thickness ?? 1;
|
|
117
|
+
// TSC BAR: filled rectangle
|
|
118
|
+
if (o.y1 === o.y2) {
|
|
119
|
+
return `<rect x="${Math.min(o.x1, o.x2)}" y="${o.y1}" width="${Math.abs(o.x2 - o.x1)}" height="${t}" fill="#000"/>`;
|
|
120
|
+
}
|
|
121
|
+
if (o.x1 === o.x2) {
|
|
122
|
+
return `<rect x="${o.x1}" y="${Math.min(o.y1, o.y2)}" width="${t}" height="${Math.abs(o.y2 - o.y1)}" fill="#000"/>`;
|
|
123
|
+
}
|
|
124
|
+
return `<line x1="${o.x1}" y1="${o.y1}" x2="${o.x2}" y2="${o.y2}" stroke="#000" stroke-width="${t}"/>`;
|
|
125
|
+
}
|
|
126
|
+
case "circle": {
|
|
127
|
+
const o = el.options;
|
|
128
|
+
const t = o.thickness ?? 1;
|
|
129
|
+
const r = o.diameter / 2;
|
|
130
|
+
if (t >= r)
|
|
131
|
+
return `<circle cx="${o.x + r}" cy="${o.y + r}" r="${r}" fill="#000"/>`;
|
|
132
|
+
return `<circle cx="${o.x + r}" cy="${o.y + r}" r="${r - t / 2}" fill="none" stroke="#000" stroke-width="${t}"/>`;
|
|
133
|
+
}
|
|
134
|
+
case "ellipse": {
|
|
135
|
+
const o = el.options;
|
|
136
|
+
const t = o.thickness ?? 1;
|
|
137
|
+
return `<ellipse cx="${o.x + o.width / 2}" cy="${o.y + o.height / 2}" rx="${o.width / 2}" ry="${o.height / 2}" fill="none" stroke="#000" stroke-width="${t}"/>`;
|
|
138
|
+
}
|
|
139
|
+
case "reverse": {
|
|
140
|
+
const o = el.options;
|
|
141
|
+
return `<rect x="${o.x}" y="${o.y}" width="${o.width}" height="${o.height}" fill="#000"/>`;
|
|
142
|
+
}
|
|
143
|
+
case "erase": {
|
|
144
|
+
const o = el.options;
|
|
145
|
+
return `<rect x="${o.x}" y="${o.y}" width="${o.width}" height="${o.height}" fill="#fff"/>`;
|
|
146
|
+
}
|
|
147
|
+
case "barcode":
|
|
148
|
+
case "qrcode":
|
|
149
|
+
case "matrix": {
|
|
150
|
+
// Real rendering: rasterize via etiket (same as the compiler) and draw
|
|
151
|
+
// the actual 1-bit pixels, so the preview matches what prints.
|
|
152
|
+
const o = el.options;
|
|
153
|
+
const x = o.x ?? 0;
|
|
154
|
+
const y = o.y ?? 0;
|
|
155
|
+
const bmp = rasterizeElement(el);
|
|
156
|
+
const step = Math.max(1, Math.floor(Math.max(bmp.width, bmp.height) / 100));
|
|
157
|
+
let svg = "";
|
|
158
|
+
for (let py = 0; py < bmp.height; py += step) {
|
|
159
|
+
for (let px = 0; px < bmp.width; px += step) {
|
|
160
|
+
const byteIdx = py * bmp.bytesPerRow + Math.floor(px / 8);
|
|
161
|
+
const bitIdx = 7 - (px % 8);
|
|
162
|
+
if ((bmp.data[byteIdx] >> bitIdx) & 1) {
|
|
163
|
+
svg += `<rect x="${x + px}" y="${y + py}" width="${step}" height="${step}" fill="#000"/>`;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Human-readable text below the symbol (matches printer behavior).
|
|
168
|
+
const content = el.type === "barcode" || el.type === "qrcode" ? el.content : "";
|
|
169
|
+
const showText = el.type === "barcode"
|
|
170
|
+
? o.readable !== false
|
|
171
|
+
: o.showText !== false;
|
|
172
|
+
if (content && showText) {
|
|
173
|
+
svg += `<text x="${x + bmp.width / 2}" y="${y + bmp.height + 12}" text-anchor="middle" fill="#000" font-size="10" font-family="monospace">${escapeXml(content)}</text>`;
|
|
174
|
+
}
|
|
175
|
+
return svg;
|
|
176
|
+
}
|
|
177
|
+
case "raw":
|
|
178
|
+
return "";
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function renderPreviewSVG(resolved) {
|
|
182
|
+
const w = resolved.widthDots;
|
|
183
|
+
const h = resolved.heightDots > 0 ? resolved.heightDots : 400;
|
|
184
|
+
const pad = 10;
|
|
185
|
+
const svgW = w + pad * 2;
|
|
186
|
+
const svgH = h + pad * 2;
|
|
187
|
+
let els = "";
|
|
188
|
+
for (const el of resolved.elements) {
|
|
189
|
+
els += renderElement(el, resolved.font0Mode, resolved.dpi, resolved.fontBase, resolved.charWidthFactor);
|
|
190
|
+
}
|
|
191
|
+
return [
|
|
192
|
+
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${svgW} ${svgH}" width="${svgW}" height="${svgH}">`,
|
|
193
|
+
`<rect x="0" y="0" width="${svgW}" height="${svgH}" fill="#f5f5f4" rx="4"/>`,
|
|
194
|
+
`<rect x="${pad}" y="${pad}" width="${w}" height="${h}" fill="#fff" stroke="#e5e5e5" stroke-width="1" rx="2"/>`,
|
|
195
|
+
`<g transform="translate(${pad},${pad})">`,
|
|
196
|
+
els,
|
|
197
|
+
"</g>",
|
|
198
|
+
`<text x="${svgW / 2}" y="${svgH - 1}" text-anchor="middle" fill="#a1a1aa" font-size="8" font-family="monospace">${w}×${h} dots (${resolved.dpi} DPI) — TSC</text>`,
|
|
199
|
+
"</svg>",
|
|
200
|
+
].join("\n");
|
|
201
|
+
}
|
|
202
|
+
/** TSC language module */
|
|
203
|
+
export const tsc = {
|
|
204
|
+
/** Compile label to TSC/TSPL2 commands */
|
|
205
|
+
compile(builder) {
|
|
206
|
+
return compileToTSC(builder.resolve());
|
|
207
|
+
},
|
|
208
|
+
/** Render label preview with TSC-specific font metrics */
|
|
209
|
+
preview(builder) {
|
|
210
|
+
return renderPreviewSVG(builder.resolve());
|
|
211
|
+
},
|
|
212
|
+
/** Render from resolved label */
|
|
213
|
+
previewResolved(resolved) {
|
|
214
|
+
return renderPreviewSVG(resolved);
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
//# sourceMappingURL=tsc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsc.js","sourceRoot":"","sources":["../../src/lang/tsc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZPL II language module — compile + preview.
|
|
3
|
+
* Preview code copied from portakal (https://github.com/productdevbook/portakal) — MIT.
|
|
4
|
+
* parse/validate are intentionally omitted from this package.
|
|
5
|
+
*/
|
|
6
|
+
import type { LabelBuilder } from "../builder.js";
|
|
7
|
+
import type { ResolvedLabel } from "../types.js";
|
|
8
|
+
/** ZPL language module */
|
|
9
|
+
export declare const zpl: {
|
|
10
|
+
/** Compile label to ZPL II commands */
|
|
11
|
+
compile(builder: LabelBuilder): string;
|
|
12
|
+
/** Render label preview with ZPL-specific font metrics */
|
|
13
|
+
preview(builder: LabelBuilder): string;
|
|
14
|
+
/** Render from resolved label */
|
|
15
|
+
previewResolved(resolved: ResolvedLabel): string;
|
|
16
|
+
};
|
package/dist/lang/zpl.js
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZPL II language module — compile + preview.
|
|
3
|
+
* Preview code copied from portakal (https://github.com/productdevbook/portakal) — MIT.
|
|
4
|
+
* parse/validate are intentionally omitted from this package.
|
|
5
|
+
*/
|
|
6
|
+
import { compileToZPL } from "../languages/zpl.js";
|
|
7
|
+
import { rasterizeElement } from "../raster.js";
|
|
8
|
+
/** ZPL font pixel dimensions at 203 DPI: { width, height } */
|
|
9
|
+
const ZPL_FONTS = {
|
|
10
|
+
A: { w: 5, h: 9 },
|
|
11
|
+
B: { w: 7, h: 11 },
|
|
12
|
+
C: { w: 10, h: 18 },
|
|
13
|
+
D: { w: 10, h: 18 },
|
|
14
|
+
E: { w: 15, h: 28 },
|
|
15
|
+
F: { w: 13, h: 26 },
|
|
16
|
+
G: { w: 40, h: 60 },
|
|
17
|
+
H: { w: 13, h: 21 },
|
|
18
|
+
P: { w: 18, h: 20 },
|
|
19
|
+
Q: { w: 24, h: 28 },
|
|
20
|
+
R: { w: 31, h: 35 },
|
|
21
|
+
S: { w: 35, h: 40 },
|
|
22
|
+
T: { w: 42, h: 48 },
|
|
23
|
+
U: { w: 53, h: 59 },
|
|
24
|
+
V: { w: 71, h: 80 },
|
|
25
|
+
"0": { w: 15, h: 18 }, // base for scalable — actual size from ^A params
|
|
26
|
+
};
|
|
27
|
+
function escapeXml(s) {
|
|
28
|
+
return s
|
|
29
|
+
.replace(/&/g, "&")
|
|
30
|
+
.replace(/</g, "<")
|
|
31
|
+
.replace(/>/g, ">")
|
|
32
|
+
.replace(/"/g, """);
|
|
33
|
+
}
|
|
34
|
+
/** Is this a scalable/proportional font? Font 0 is CG Triumvirate (proportional). */
|
|
35
|
+
function isProportionalFont(font) {
|
|
36
|
+
return (font ?? "0") === "0";
|
|
37
|
+
}
|
|
38
|
+
function zplFontSize(font, size, yScale, font0Mode, dpi, fontBase) {
|
|
39
|
+
// yScale = raw dot height from ^A or ^CF command
|
|
40
|
+
if (yScale && yScale > 10)
|
|
41
|
+
return yScale;
|
|
42
|
+
const f = ZPL_FONTS[(font ?? "0").toUpperCase()];
|
|
43
|
+
if (f && size)
|
|
44
|
+
return f.h * size;
|
|
45
|
+
if (f)
|
|
46
|
+
return f.h;
|
|
47
|
+
// Font "0" (scalable): size unit follows the printer's font0Mode.
|
|
48
|
+
if (font0Mode === "points")
|
|
49
|
+
return (size ?? 12) * (dpi / 72);
|
|
50
|
+
return fontBase.height * (size ?? 1);
|
|
51
|
+
}
|
|
52
|
+
/** Baseline offset from top of character cell. */
|
|
53
|
+
function zplBaselineRatio(font) {
|
|
54
|
+
// Font 0 (CG Triumvirate / Helvetica-like): ascent ≈ 0.78
|
|
55
|
+
// Bitmap fonts A-H: ascent ≈ 0.82
|
|
56
|
+
return isProportionalFont(font) ? 0.78 : 0.82;
|
|
57
|
+
}
|
|
58
|
+
/** CSS font-family for ZPL font. Uses single quotes for SVG attribute compatibility. */
|
|
59
|
+
function zplFontFamily(font) {
|
|
60
|
+
if (isProportionalFont(font)) {
|
|
61
|
+
return "'Helvetica Neue', Helvetica, Arial, sans-serif";
|
|
62
|
+
}
|
|
63
|
+
return "monospace";
|
|
64
|
+
}
|
|
65
|
+
function renderElement(el, font0Mode, dpi, fontBase, defaultCharWidthFactor) {
|
|
66
|
+
switch (el.type) {
|
|
67
|
+
case "text": {
|
|
68
|
+
const o = el.options;
|
|
69
|
+
const x = o.x ?? 0;
|
|
70
|
+
const y = o.y ?? 0;
|
|
71
|
+
const charWidthFactor = o.charWidthFactor ?? defaultCharWidthFactor;
|
|
72
|
+
const fs = zplFontSize(o.font, o.size, o.yScale, font0Mode, dpi, fontBase);
|
|
73
|
+
const baseline = zplBaselineRatio(o.font);
|
|
74
|
+
const fontFamily = zplFontFamily(o.font);
|
|
75
|
+
const weight = o.bold ? "bold" : "normal";
|
|
76
|
+
const transform = o.rotation ? ` transform="rotate(${o.rotation} ${x} ${y})"` : "";
|
|
77
|
+
// Text anchor for ^FB alignment. With maxWidth, anchor within that box.
|
|
78
|
+
// Without it, the template may have manually positioned text; `align`
|
|
79
|
+
// then anchors relative to the computed x.
|
|
80
|
+
let anchor = "";
|
|
81
|
+
let textX = x;
|
|
82
|
+
if (o.maxWidth && o.align === "center") {
|
|
83
|
+
anchor = ' text-anchor="middle"';
|
|
84
|
+
textX = x + o.maxWidth / 2;
|
|
85
|
+
}
|
|
86
|
+
else if (o.maxWidth && o.align === "right") {
|
|
87
|
+
anchor = ' text-anchor="end"';
|
|
88
|
+
textX = x + o.maxWidth;
|
|
89
|
+
}
|
|
90
|
+
else if (o.align === "center") {
|
|
91
|
+
const cw = fs * charWidthFactor; // avg char width for font "0"
|
|
92
|
+
anchor = ' text-anchor="middle"';
|
|
93
|
+
textX = x + (el.content.length * cw) / 2;
|
|
94
|
+
}
|
|
95
|
+
else if (o.align === "right") {
|
|
96
|
+
const cw = fs * charWidthFactor;
|
|
97
|
+
anchor = ' text-anchor="end"';
|
|
98
|
+
textX = x + el.content.length * cw;
|
|
99
|
+
}
|
|
100
|
+
const fill = o.reverse ? "#fff" : "#000";
|
|
101
|
+
const svgY = Math.round((y + fs * baseline) * 100) / 100;
|
|
102
|
+
return `<text x="${textX}" y="${svgY}" fill="${fill}" font-size="${fs}" font-weight="${weight}" font-family="${fontFamily}"${anchor}${transform}>${escapeXml(el.content)}</text>`;
|
|
103
|
+
}
|
|
104
|
+
case "image": {
|
|
105
|
+
const o = el.options;
|
|
106
|
+
const x = o.x ?? 0;
|
|
107
|
+
const y = o.y ?? 0;
|
|
108
|
+
const bmp = el.bitmap;
|
|
109
|
+
const w = o.width ?? bmp.width;
|
|
110
|
+
const h = o.height ?? bmp.height;
|
|
111
|
+
const step = Math.max(1, Math.floor(Math.max(bmp.width, bmp.height) / 100));
|
|
112
|
+
const sx = w / bmp.width;
|
|
113
|
+
const sy = h / bmp.height;
|
|
114
|
+
let svg = "";
|
|
115
|
+
for (let py = 0; py < bmp.height; py += step) {
|
|
116
|
+
for (let px = 0; px < bmp.width; px += step) {
|
|
117
|
+
const byteIdx = py * bmp.bytesPerRow + Math.floor(px / 8);
|
|
118
|
+
const bitIdx = 7 - (px % 8);
|
|
119
|
+
if ((bmp.data[byteIdx] >> bitIdx) & 1) {
|
|
120
|
+
svg += `<rect x="${x + px * sx}" y="${y + py * sy}" width="${step * sx}" height="${step * sy}" fill="#000"/>`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return svg;
|
|
125
|
+
}
|
|
126
|
+
case "box": {
|
|
127
|
+
const o = el.options;
|
|
128
|
+
const t = o.thickness ?? 1;
|
|
129
|
+
const rx = o.radius ?? 0;
|
|
130
|
+
// ZPL ^GB: filled when thickness >= min(width, height)
|
|
131
|
+
if (t >= Math.min(o.width, o.height)) {
|
|
132
|
+
return `<rect x="${o.x}" y="${o.y}" width="${o.width}" height="${o.height}" fill="#000" rx="${rx}"/>`;
|
|
133
|
+
}
|
|
134
|
+
// ZPL border draws inward
|
|
135
|
+
return `<rect x="${o.x + t / 2}" y="${o.y + t / 2}" width="${o.width - t}" height="${o.height - t}" fill="none" stroke="#000" stroke-width="${t}" rx="${rx}"/>`;
|
|
136
|
+
}
|
|
137
|
+
case "line": {
|
|
138
|
+
const o = el.options;
|
|
139
|
+
const t = o.thickness ?? 1;
|
|
140
|
+
// ZPL uses ^GB for lines (thin boxes)
|
|
141
|
+
if (o.y1 === o.y2) {
|
|
142
|
+
return `<rect x="${Math.min(o.x1, o.x2)}" y="${o.y1}" width="${Math.abs(o.x2 - o.x1)}" height="${t}" fill="#000"/>`;
|
|
143
|
+
}
|
|
144
|
+
if (o.x1 === o.x2) {
|
|
145
|
+
return `<rect x="${o.x1}" y="${Math.min(o.y1, o.y2)}" width="${t}" height="${Math.abs(o.y2 - o.y1)}" fill="#000"/>`;
|
|
146
|
+
}
|
|
147
|
+
return `<line x1="${o.x1}" y1="${o.y1}" x2="${o.x2}" y2="${o.y2}" stroke="#000" stroke-width="${t}"/>`;
|
|
148
|
+
}
|
|
149
|
+
case "circle": {
|
|
150
|
+
const o = el.options;
|
|
151
|
+
const t = o.thickness ?? 1;
|
|
152
|
+
const r = o.diameter / 2;
|
|
153
|
+
if (t >= r)
|
|
154
|
+
return `<circle cx="${o.x + r}" cy="${o.y + r}" r="${r}" fill="#000"/>`;
|
|
155
|
+
return `<circle cx="${o.x + r}" cy="${o.y + r}" r="${r - t / 2}" fill="none" stroke="#000" stroke-width="${t}"/>`;
|
|
156
|
+
}
|
|
157
|
+
case "ellipse":
|
|
158
|
+
case "reverse":
|
|
159
|
+
return "";
|
|
160
|
+
case "erase": {
|
|
161
|
+
// White fill — used for ^FR XOR effect (e.g., Intershipping logo)
|
|
162
|
+
const o = el.options;
|
|
163
|
+
return `<rect x="${o.x}" y="${o.y}" width="${o.width}" height="${o.height}" fill="#fff"/>`;
|
|
164
|
+
}
|
|
165
|
+
case "barcode":
|
|
166
|
+
case "qrcode":
|
|
167
|
+
case "matrix": {
|
|
168
|
+
// Real rendering: rasterize via etiket (same as the compiler) and draw
|
|
169
|
+
// the actual 1-bit pixels, so the preview matches what prints.
|
|
170
|
+
const o = el.options;
|
|
171
|
+
const x = o.x ?? 0;
|
|
172
|
+
const y = o.y ?? 0;
|
|
173
|
+
const bmp = rasterizeElement(el);
|
|
174
|
+
const step = Math.max(1, Math.floor(Math.max(bmp.width, bmp.height) / 100));
|
|
175
|
+
let svg = "";
|
|
176
|
+
for (let py = 0; py < bmp.height; py += step) {
|
|
177
|
+
for (let px = 0; px < bmp.width; px += step) {
|
|
178
|
+
const byteIdx = py * bmp.bytesPerRow + Math.floor(px / 8);
|
|
179
|
+
const bitIdx = 7 - (px % 8);
|
|
180
|
+
if ((bmp.data[byteIdx] >> bitIdx) & 1) {
|
|
181
|
+
svg += `<rect x="${x + px}" y="${y + py}" width="${step}" height="${step}" fill="#000"/>`;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Human-readable text below the symbol (matches printer behavior).
|
|
186
|
+
const content = el.type === "barcode" || el.type === "qrcode" ? el.content : "";
|
|
187
|
+
const showText = el.type === "barcode"
|
|
188
|
+
? o.readable !== false
|
|
189
|
+
: o.showText !== false;
|
|
190
|
+
if (content && showText) {
|
|
191
|
+
svg += `<text x="${x + bmp.width / 2}" y="${y + bmp.height + 12}" text-anchor="middle" fill="#000" font-size="10" font-family="monospace">${escapeXml(content)}</text>`;
|
|
192
|
+
}
|
|
193
|
+
return svg;
|
|
194
|
+
}
|
|
195
|
+
case "raw": {
|
|
196
|
+
// Parse barcode raw ZPL for placeholder rendering
|
|
197
|
+
if (typeof el.content === "string" && el.content.includes("^B")) {
|
|
198
|
+
const byMatch = el.content.match(/\^BY(\d+)/);
|
|
199
|
+
const foMatch = el.content.match(/\^FO(\d+),(\d+)/);
|
|
200
|
+
const bcMatch = el.content.match(/\^B([A-Z0-9])N?,(\d+)/);
|
|
201
|
+
const fdMatch = el.content.match(/\^FD(.+?)\^FS/);
|
|
202
|
+
if (foMatch && fdMatch) {
|
|
203
|
+
const bx = Number(foMatch[1]);
|
|
204
|
+
const by = Number(foMatch[2]);
|
|
205
|
+
const bh = bcMatch ? Number(bcMatch[2]) : 80;
|
|
206
|
+
const data = fdMatch[1];
|
|
207
|
+
const mw = byMatch ? Number(byMatch[1]) : 2;
|
|
208
|
+
// Code 128 width: (dataChars + 2) * 11 + 13 modules × moduleWidth
|
|
209
|
+
const bw = ((data.length + 2) * 11 + 13) * mw;
|
|
210
|
+
// Barcode placeholder: striped pattern using SVG pattern
|
|
211
|
+
const pid = `bp${bx}${by}`;
|
|
212
|
+
const textY = by + bh + 15;
|
|
213
|
+
return [
|
|
214
|
+
`<defs><pattern id="${pid}" width="${mw * 2}" height="${bh}" patternUnits="userSpaceOnUse">`,
|
|
215
|
+
`<rect width="${mw}" height="${bh}" fill="#000"/>`,
|
|
216
|
+
`</pattern></defs>`,
|
|
217
|
+
`<rect x="${bx}" y="${by}" width="${bw}" height="${bh}" fill="url(#${pid})"/>`,
|
|
218
|
+
`<text x="${bx + bw / 2}" y="${textY}" text-anchor="middle" fill="#000" font-size="14" font-family="monospace">${escapeXml(data)}</text>`,
|
|
219
|
+
].join("");
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return "";
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function renderPreviewSVG(resolved) {
|
|
227
|
+
const w = resolved.widthDots;
|
|
228
|
+
const h = resolved.heightDots > 0 ? resolved.heightDots : 1218;
|
|
229
|
+
const pad = 10;
|
|
230
|
+
const svgW = w + pad * 2;
|
|
231
|
+
const svgH = h + pad * 2;
|
|
232
|
+
let els = "";
|
|
233
|
+
for (const el of resolved.elements) {
|
|
234
|
+
els += renderElement(el, resolved.font0Mode, resolved.dpi, resolved.fontBase, resolved.charWidthFactor);
|
|
235
|
+
}
|
|
236
|
+
return [
|
|
237
|
+
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${svgW} ${svgH}" width="${svgW}" height="${svgH}">`,
|
|
238
|
+
`<rect x="0" y="0" width="${svgW}" height="${svgH}" fill="#f5f5f4" rx="4"/>`,
|
|
239
|
+
`<rect x="${pad}" y="${pad}" width="${w}" height="${h}" fill="#fff" stroke="#e5e5e5" stroke-width="1" rx="2"/>`,
|
|
240
|
+
`<g transform="translate(${pad},${pad})">`,
|
|
241
|
+
els,
|
|
242
|
+
"</g>",
|
|
243
|
+
`<text x="${svgW / 2}" y="${svgH - 1}" text-anchor="middle" fill="#a1a1aa" font-size="8" font-family="monospace">${w}×${h} dots (${resolved.dpi} DPI) — ZPL</text>`,
|
|
244
|
+
"</svg>",
|
|
245
|
+
].join("\n");
|
|
246
|
+
}
|
|
247
|
+
/** ZPL language module */
|
|
248
|
+
export const zpl = {
|
|
249
|
+
/** Compile label to ZPL II commands */
|
|
250
|
+
compile(builder) {
|
|
251
|
+
return compileToZPL(builder.resolve());
|
|
252
|
+
},
|
|
253
|
+
/** Render label preview with ZPL-specific font metrics */
|
|
254
|
+
preview(builder) {
|
|
255
|
+
return renderPreviewSVG(builder.resolve());
|
|
256
|
+
},
|
|
257
|
+
/** Render from resolved label */
|
|
258
|
+
previewResolved(resolved) {
|
|
259
|
+
return renderPreviewSVG(resolved);
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
//# sourceMappingURL=zpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zpl.js","sourceRoot":"","sources":["../../src/lang/zpl.ts"],"names":[],"mappings":"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"}
|