@zhin.js/html-renderer 3.0.14 → 3.0.16

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/lib/image.js ADDED
@@ -0,0 +1,236 @@
1
+ import zlib from 'node:zlib';
2
+ const PNG_SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
3
+ const CHANNELS = {
4
+ 0: 1,
5
+ 2: 3,
6
+ 4: 2,
7
+ 6: 4,
8
+ };
9
+ const CRC_TABLE = (() => {
10
+ const table = new Int32Array(256);
11
+ for (let n = 0; n < 256; n++) {
12
+ let c = n;
13
+ for (let k = 0; k < 8; k++) {
14
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
15
+ }
16
+ table[n] = c;
17
+ }
18
+ return table;
19
+ })();
20
+ function crc32(buf) {
21
+ let c = -1;
22
+ for (let i = 0; i < buf.length; i++) {
23
+ c = CRC_TABLE[(c ^ buf[i]) & 0xff] ^ (c >>> 8);
24
+ }
25
+ return (c ^ -1) >>> 0;
26
+ }
27
+ function readChunks(buf) {
28
+ if (buf.length < 8 || !buf.subarray(0, 8).equals(PNG_SIGNATURE))
29
+ return null;
30
+ const chunks = [];
31
+ let offset = 8;
32
+ while (offset + 8 <= buf.length) {
33
+ const length = buf.readUInt32BE(offset);
34
+ const type = buf.toString('ascii', offset + 4, offset + 8);
35
+ const start = offset + 8;
36
+ const end = start + length;
37
+ if (end + 4 > buf.length)
38
+ return null;
39
+ chunks.push({ type, data: buf.subarray(start, end) });
40
+ offset = end + 4;
41
+ if (type === 'IEND')
42
+ break;
43
+ }
44
+ return chunks;
45
+ }
46
+ function writeChunk(type, data) {
47
+ const length = Buffer.alloc(4);
48
+ length.writeUInt32BE(data.length, 0);
49
+ const typeAndData = Buffer.concat([Buffer.from(type, 'ascii'), data]);
50
+ const crc = Buffer.alloc(4);
51
+ crc.writeUInt32BE(crc32(typeAndData), 0);
52
+ return Buffer.concat([length, typeAndData, crc]);
53
+ }
54
+ export function readImageSize(buf) {
55
+ const png = readPngInfo(buf);
56
+ if (png)
57
+ return { width: png.width, height: png.height };
58
+ return readJpegSize(buf) ?? readWebpSize(buf);
59
+ }
60
+ export function readPngInfo(buf) {
61
+ if (buf.length < 33 || !buf.subarray(0, 8).equals(PNG_SIGNATURE))
62
+ return null;
63
+ if (buf.toString('ascii', 12, 16) !== 'IHDR')
64
+ return null;
65
+ return {
66
+ width: buf.readUInt32BE(16),
67
+ height: buf.readUInt32BE(20),
68
+ bitDepth: buf[24],
69
+ colorType: buf[25],
70
+ interlace: buf[28],
71
+ };
72
+ }
73
+ function readJpegSize(buf) {
74
+ if (buf.length < 4 || buf[0] !== 0xff || buf[1] !== 0xd8)
75
+ return null;
76
+ let offset = 2;
77
+ while (offset + 9 < buf.length) {
78
+ if (buf[offset] !== 0xff) {
79
+ offset++;
80
+ continue;
81
+ }
82
+ const marker = buf[offset + 1];
83
+ if (marker === 0xff) {
84
+ offset++;
85
+ continue;
86
+ }
87
+ if (marker === 0xd8 || (marker >= 0xd0 && marker <= 0xd9) || marker === 0x01) {
88
+ offset += 2;
89
+ continue;
90
+ }
91
+ const length = buf.readUInt16BE(offset + 2);
92
+ const isFrameHeader = marker >= 0xc0 && marker <= 0xcf
93
+ && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc;
94
+ if (isFrameHeader) {
95
+ return {
96
+ height: buf.readUInt16BE(offset + 5),
97
+ width: buf.readUInt16BE(offset + 7),
98
+ };
99
+ }
100
+ offset += 2 + length;
101
+ }
102
+ return null;
103
+ }
104
+ function readWebpSize(buf) {
105
+ if (buf.length < 30)
106
+ return null;
107
+ if (buf.toString('ascii', 0, 4) !== 'RIFF' || buf.toString('ascii', 8, 12) !== 'WEBP') {
108
+ return null;
109
+ }
110
+ const chunk = buf.toString('ascii', 12, 16);
111
+ if (chunk === 'VP8X') {
112
+ return {
113
+ width: (buf.readUIntLE(24, 3) & 0xffffff) + 1,
114
+ height: (buf.readUIntLE(27, 3) & 0xffffff) + 1,
115
+ };
116
+ }
117
+ if (chunk === 'VP8 ') {
118
+ return {
119
+ width: buf.readUInt16LE(26) & 0x3fff,
120
+ height: buf.readUInt16LE(28) & 0x3fff,
121
+ };
122
+ }
123
+ if (chunk === 'VP8L') {
124
+ const bits = buf.readUInt32LE(21);
125
+ return {
126
+ width: (bits & 0x3fff) + 1,
127
+ height: ((bits >> 14) & 0x3fff) + 1,
128
+ };
129
+ }
130
+ return null;
131
+ }
132
+ function paeth(a, b, c) {
133
+ const p = a + b - c;
134
+ const pa = Math.abs(p - a);
135
+ const pb = Math.abs(p - b);
136
+ const pc = Math.abs(p - c);
137
+ if (pa <= pb && pa <= pc)
138
+ return a;
139
+ if (pb <= pc)
140
+ return b;
141
+ return c;
142
+ }
143
+ function unfilter(filtered, width, height, bpp) {
144
+ const stride = width * bpp;
145
+ const out = Buffer.alloc(stride * height);
146
+ for (let y = 0; y < height; y++) {
147
+ const filterType = filtered[y * (stride + 1)];
148
+ const src = y * (stride + 1) + 1;
149
+ const dst = y * stride;
150
+ const up = dst - stride;
151
+ for (let x = 0; x < stride; x++) {
152
+ const rawByte = filtered[src + x];
153
+ const a = x >= bpp ? out[dst + x - bpp] : 0;
154
+ const b = y > 0 ? out[up + x] : 0;
155
+ const c = x >= bpp && y > 0 ? out[up + x - bpp] : 0;
156
+ let value;
157
+ switch (filterType) {
158
+ case 0:
159
+ value = rawByte;
160
+ break;
161
+ case 1:
162
+ value = rawByte + a;
163
+ break;
164
+ case 2:
165
+ value = rawByte + b;
166
+ break;
167
+ case 3:
168
+ value = rawByte + ((a + b) >> 1);
169
+ break;
170
+ case 4:
171
+ value = rawByte + paeth(a, b, c);
172
+ break;
173
+ default: value = rawByte;
174
+ }
175
+ out[dst + x] = value & 0xff;
176
+ }
177
+ }
178
+ return out;
179
+ }
180
+ export function splitPng(buf, sliceHeight, level = 3) {
181
+ const info = readPngInfo(buf);
182
+ if (!info)
183
+ return null;
184
+ if (info.interlace !== 0 || info.bitDepth !== 8)
185
+ return null;
186
+ const channels = CHANNELS[info.colorType];
187
+ if (!channels)
188
+ return null;
189
+ const height = Math.max(1, Math.floor(sliceHeight));
190
+ if (height >= info.height)
191
+ return [buf];
192
+ const chunks = readChunks(buf);
193
+ if (!chunks)
194
+ return null;
195
+ const idat = chunks.filter((item) => item.type === 'IDAT').map((item) => item.data);
196
+ if (idat.length === 0)
197
+ return null;
198
+ let inflated;
199
+ try {
200
+ inflated = zlib.inflateSync(Buffer.concat(idat));
201
+ }
202
+ catch {
203
+ return null;
204
+ }
205
+ const stride = info.width * channels;
206
+ if (inflated.length < (stride + 1) * info.height)
207
+ return null;
208
+ const pixels = unfilter(inflated, info.width, info.height, channels);
209
+ const extras = chunks.filter((item) => ['PLTE', 'tRNS', 'gAMA', 'sRGB', 'cHRM', 'iCCP', 'pHYs'].includes(item.type));
210
+ const list = [];
211
+ for (let top = 0; top < info.height; top += height) {
212
+ const sliceRows = Math.min(height, info.height - top);
213
+ const body = Buffer.alloc((stride + 1) * sliceRows);
214
+ for (let y = 0; y < sliceRows; y++) {
215
+ body[y * (stride + 1)] = 0;
216
+ pixels.copy(body, y * (stride + 1) + 1, (top + y) * stride, (top + y + 1) * stride);
217
+ }
218
+ const ihdr = Buffer.alloc(13);
219
+ ihdr.writeUInt32BE(info.width, 0);
220
+ ihdr.writeUInt32BE(sliceRows, 4);
221
+ ihdr[8] = info.bitDepth;
222
+ ihdr[9] = info.colorType;
223
+ ihdr[10] = 0;
224
+ ihdr[11] = 0;
225
+ ihdr[12] = 0;
226
+ list.push(Buffer.concat([
227
+ PNG_SIGNATURE,
228
+ writeChunk('IHDR', ihdr),
229
+ ...extras.map((item) => writeChunk(item.type, item.data)),
230
+ writeChunk('IDAT', zlib.deflateSync(body, { level })),
231
+ writeChunk('IEND', Buffer.alloc(0)),
232
+ ]));
233
+ }
234
+ return list;
235
+ }
236
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export { createHtmlRenderer, serializeJsxToHtml } from './renderer.js';
1
+ export { createHtmlRenderer } from './renderer.js';
2
+ export { serializeJsxToHtml } from './jsx.js';
2
3
  export { registerAiTextAsImageOutput, extractPlainTextForImage } from './ai-text-as-image.js';
3
- export type { FontConfig, HtmlRendererAiTextAsImageConfig, HtmlRendererConfig, HtmlRendererLogger, HtmlRendererService, OutputFormat, RenderOptions, RenderResult, } from './types.js';
4
- /** 动态 import 时使用的包名(与 package.json name 一致) */
4
+ export type { FontConfig, HtmlComponent, HtmlRendererAiTextAsImageConfig, HtmlRendererConfig, HtmlRendererLogger, HtmlRendererService, OutputFormat, RenderOptions, RenderResult, RasterFormat, WaitUntil, } from './types.js';
5
5
  export declare const HTML_RENDERER_PACKAGE = "@zhin.js/html-renderer";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC9F,YAAY,EACV,UAAU,EACV,+BAA+B,EAC/B,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,+CAA+C;AAC/C,eAAO,MAAM,qBAAqB,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC9F,YAAY,EACV,UAAU,EACV,aAAa,EACb,+BAA+B,EAC/B,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,qBAAqB,2BAA2B,CAAC"}
package/lib/index.js CHANGED
@@ -1,5 +1,5 @@
1
- export { createHtmlRenderer, serializeJsxToHtml } from './renderer.js';
1
+ export { createHtmlRenderer } from './renderer.js';
2
+ export { serializeJsxToHtml } from './jsx.js';
2
3
  export { registerAiTextAsImageOutput, extractPlainTextForImage } from './ai-text-as-image.js';
3
- /** 动态 import 时使用的包名(与 package.json name 一致) */
4
4
  export const HTML_RENDERER_PACKAGE = '@zhin.js/html-renderer';
5
5
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAY9F,+CAA+C;AAC/C,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAe9F,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC"}
package/lib/jsx.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function serializeJsxToHtml(element: unknown): string;
2
+ //# sourceMappingURL=jsx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx.d.ts","sourceRoot":"","sources":["../src/jsx.ts"],"names":[],"mappings":"AAUA,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAuC3D"}
package/lib/jsx.js ADDED
@@ -0,0 +1,43 @@
1
+ const SELF_CLOSING = new Set(['img', 'br', 'hr', 'input', 'meta', 'link']);
2
+ function escape(value) {
3
+ return value
4
+ .replace(/&/g, '&amp;')
5
+ .replace(/</g, '&lt;')
6
+ .replace(/>/g, '&gt;')
7
+ .replace(/"/g, '&quot;');
8
+ }
9
+ export function serializeJsxToHtml(element) {
10
+ if (typeof element === 'string')
11
+ return escape(element);
12
+ if (typeof element === 'number')
13
+ return String(element);
14
+ if (element == null || typeof element === 'boolean')
15
+ return '';
16
+ if (Array.isArray(element))
17
+ return element.map(serializeJsxToHtml).join('');
18
+ if (typeof element === 'object' && 'type' in element) {
19
+ const { type, props = {} } = element;
20
+ const { children, style, dangerouslySetInnerHTML, ...rest } = props;
21
+ let styleText = '';
22
+ if (style && typeof style === 'object') {
23
+ styleText = Object.entries(style)
24
+ .map(([key, value]) => `${key.replace(/([A-Z])/g, '-$1').toLowerCase()}: ${value}`)
25
+ .join('; ');
26
+ }
27
+ const attrs = Object.entries(rest)
28
+ .filter(([key, value]) => key !== 'dangerouslySetInnerHTML' && value != null && value !== false)
29
+ .map(([key, value]) => `${key}="${escape(String(value))}"`)
30
+ .join(' ');
31
+ const styleAttr = styleText ? ` style="${escape(styleText)}"` : '';
32
+ const attrText = attrs ? ` ${attrs}` : '';
33
+ if (dangerouslySetInnerHTML?.__html) {
34
+ return `<${type}${attrText}${styleAttr}>${dangerouslySetInnerHTML.__html}</${type}>`;
35
+ }
36
+ const inner = serializeJsxToHtml(children);
37
+ if (SELF_CLOSING.has(type) && !inner)
38
+ return `<${type}${attrText}${styleAttr} />`;
39
+ return `<${type}${attrText}${styleAttr}>${inner}</${type}>`;
40
+ }
41
+ return '';
42
+ }
43
+ //# sourceMappingURL=jsx.js.map
package/lib/jsx.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx.js","sourceRoot":"","sources":["../src/jsx.ts"],"names":[],"mappings":"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"}
package/lib/renderer.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import type { HtmlRendererConfig, HtmlRendererLogger, HtmlRendererService } from './types.js';
2
- export declare function serializeJsxToHtml(element: unknown): string;
3
2
  export declare function createHtmlRenderer(config?: HtmlRendererConfig, logger?: HtmlRendererLogger): HtmlRendererService;
3
+ export { serializeJsxToHtml } from './jsx.js';
4
4
  //# sourceMappingURL=renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EAGpB,MAAM,YAAY,CAAC;AA4MpB,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA8C3D;AAED,wBAAgB,kBAAkB,CAChC,MAAM,GAAE,kBAAuB,EAC/B,MAAM,CAAC,EAAE,kBAAkB,GAC1B,mBAAmB,CA4GrB"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EAGpB,MAAM,YAAY,CAAC;AA0CpB,wBAAgB,kBAAkB,CAChC,MAAM,GAAE,kBAAuB,EAC/B,MAAM,CAAC,EAAE,kBAAkB,GAC1B,mBAAmB,CAgKrB;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}