wireless-desc-converter 1.0.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.
@@ -0,0 +1,534 @@
1
+ /**
2
+ * 淘宝新版图文编辑器 wirelessDesc 适配模块
3
+ *
4
+ * 独立 npm 包入口,核心逻辑复用项目 src/util/wirelessDesc.js
5
+ * 此文件为零依赖版本,可直接在任何 JS 环境使用
6
+ *
7
+ * API 设计:
8
+ * - htmlToWirelessDesc(html, options?) 异步,统一用 async/await 调用
9
+ * - 不需要异步补全时,不传 resolvers 即可,仍然 await
10
+ *
11
+ * @module wireless-desc-converter
12
+ */
13
+
14
+ // ==================== 常量定义 ====================
15
+
16
+ var MODULE_WIDTH = 620;
17
+ var SPLIT_HEIGHT = 1240;
18
+ var MAX_HEIGHT = 100000;
19
+ var VERSION = '1.0.0';
20
+
21
+ var IMAGE_MIN_WIDTH = 480;
22
+ var IMAGE_MAX_WIDTH = 1500;
23
+ var IMAGE_MAX_HEIGHT = 2000;
24
+
25
+ // ==================== 内部工具方法 ====================
26
+
27
+ function generateGroupId() {
28
+ return 'group' + Date.now() + Math.floor(Math.random() * 10000);
29
+ }
30
+
31
+ function inputField(id, value) {
32
+ var field = { id: id, type: 'input' };
33
+ if (value !== undefined && value !== null) {
34
+ field.value = { value: String(value) };
35
+ }
36
+ return field;
37
+ }
38
+
39
+ function singleCheckField(id, value) {
40
+ return {
41
+ id: id,
42
+ type: 'singleCheck',
43
+ value: { value: String(value) }
44
+ };
45
+ }
46
+
47
+ function extractImages(html) {
48
+ var imgReg = /<img[^>]*?(?:>)/gi;
49
+ var srcReg = /src\s*=\s*['"]?([^'"\s>]*)['"\s>]?/i;
50
+ var results = [];
51
+ var match;
52
+ while ((match = imgReg.exec(html)) !== null) {
53
+ var srcMatch = match[0].match(srcReg);
54
+ if (srcMatch && srcMatch[1]) {
55
+ results.push({ url: srcMatch[1], html: match[0] });
56
+ }
57
+ }
58
+ return results;
59
+ }
60
+
61
+ function extractText(html) {
62
+ return html
63
+ .replace(/<img[^>]*?(?:>)/gi, '')
64
+ .replace(/<br\s*\/?>/gi, '\n')
65
+ .replace(/<\/p>/gi, '\n')
66
+ .replace(/<\/h[1-6]>/gi, '\n')
67
+ .replace(/<\/div>/gi, '\n')
68
+ .replace(/<\/li>/gi, '\n')
69
+ .replace(/<.+?>/g, '')
70
+ .replace(/&nbsp;/g, ' ')
71
+ .replace(/&amp;/g, '&')
72
+ .replace(/&lt;/g, '<')
73
+ .replace(/&gt;/g, '>')
74
+ .replace(/&quot;/g, '"')
75
+ .replace(/&#39;/g, "'")
76
+ .replace(/\n{3,}/g, '\n\n')
77
+ .trim();
78
+ }
79
+
80
+ function extractStyles(html) {
81
+ var styles = {};
82
+ var styleReg = /style\s*=\s*['"]([^'"]*)['"]/i;
83
+ var styleMatch = html.match(styleReg);
84
+ if (styleMatch) {
85
+ var styleStr = styleMatch[1];
86
+ var colorMatch = styleStr.match(/color\s*:\s*([^;]+)/i);
87
+ if (colorMatch) styles.color = colorMatch[1].trim();
88
+ var fontSizeMatch = styleStr.match(/font-size\s*:\s*([^;]+)/i);
89
+ if (fontSizeMatch) {
90
+ styles.fontSize = mapFontSize(parseInt(fontSizeMatch[1].trim().replace(/px/i, ''), 10));
91
+ }
92
+ var alignMatch = styleStr.match(/text-align\s*:\s*([^;]+)/i);
93
+ if (alignMatch) styles.textAlign = alignMatch[1].trim();
94
+ var fontMatch = styleStr.match(/font-family\s*:\s*([^;]+)/i);
95
+ if (fontMatch) styles.fontFamily = fontMatch[1].trim();
96
+ }
97
+ var headingReg = /<h(\d)[^>]*>/i;
98
+ var headingMatch = html.match(headingReg);
99
+ if (headingMatch && !styles.fontSize) {
100
+ styles.fontSize = mapHeadingSize(parseInt(headingMatch[1], 10));
101
+ }
102
+ if (!styles.textAlign) {
103
+ if (/<center/i.test(html) || /align\s*=\s*['"]center['"]/i.test(html)) {
104
+ styles.textAlign = 'center';
105
+ } else if (/align\s*=\s*['"]right['"]/i.test(html)) {
106
+ styles.textAlign = 'right';
107
+ }
108
+ }
109
+ return styles;
110
+ }
111
+
112
+ function mapFontSize(size) {
113
+ var allowed = [12, 14, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 44, 48, 52, 56, 60];
114
+ var closest = allowed[0];
115
+ var minDiff = Math.abs(size - allowed[0]);
116
+ for (var i = 1; i < allowed.length; i++) {
117
+ var diff = Math.abs(size - allowed[i]);
118
+ if (diff < minDiff) { minDiff = diff; closest = allowed[i]; }
119
+ }
120
+ return String(closest);
121
+ }
122
+
123
+ function mapHeadingSize(level) {
124
+ var map = { 1: '28', 2: '24', 3: '20', 4: '18', 5: '16', 6: '14' };
125
+ return map[level] || '14';
126
+ }
127
+
128
+ function parseHtmlSegments(html) {
129
+ var segments = [];
130
+ var imgReg = /<img[^>]*?(?:>)/gi;
131
+ var parts = html.split(imgReg);
132
+ var images = extractImages(html);
133
+ for (var i = 0; i < parts.length; i++) {
134
+ var textContent = extractText(parts[i]);
135
+ var styles = extractStyles(parts[i]);
136
+ if (textContent) {
137
+ segments.push({ type: 'text', content: textContent, styles: styles });
138
+ }
139
+ if (i < images.length) {
140
+ segments.push({ type: 'image', url: images[i].url });
141
+ }
142
+ }
143
+ return segments;
144
+ }
145
+
146
+ // ==================== 模块构造方法 ====================
147
+
148
+ function buildVersionModule() {
149
+ return inputField('version', VERSION);
150
+ }
151
+
152
+ function buildConfigModule(options) {
153
+ options = options || {};
154
+ return {
155
+ id: 'config', type: 'complex',
156
+ value: {
157
+ props: [
158
+ inputField('maxHeight', options.maxHeight || MAX_HEIGHT),
159
+ inputField('width', options.width || MODULE_WIDTH),
160
+ inputField('splitHeight', options.splitHeight || SPLIT_HEIGHT)
161
+ ]
162
+ }
163
+ };
164
+ }
165
+
166
+ function buildTextModule(params) {
167
+ params = params || {};
168
+ var text = params.text || '';
169
+ var images = params.images || [];
170
+ var styles = params.styles || {};
171
+ var groupId = params.id || generateGroupId();
172
+ var index = params.index !== undefined ? params.index : 1;
173
+ var fieldId = 'text_' + index;
174
+
175
+ var imageValues = [];
176
+ for (var i = 0; i < images.length; i++) {
177
+ imageValues.push({
178
+ props: [
179
+ inputField('width', images[i].width || MODULE_WIDTH),
180
+ inputField('url', images[i].url || ''),
181
+ inputField('height', images[i].height || '')
182
+ ]
183
+ });
184
+ }
185
+
186
+ var sampleValues = [];
187
+ if (images.length > 0) {
188
+ sampleValues.push({
189
+ props: [inputField('width'), inputField('url', images[0].url || ''), inputField('height')]
190
+ });
191
+ }
192
+
193
+ var textStyleProps = [
194
+ singleCheckField('fontFamily', styles.fontFamily || 'ali-webfont'),
195
+ inputField('color', styles.color || '#333333'),
196
+ inputField('top', styles.top || '10'),
197
+ singleCheckField('textAlign', styles.textAlign || 'left'),
198
+ inputField('left', styles.left || '0'),
199
+ inputField('bottom', styles.bottom || '10'),
200
+ inputField('width', styles.width || MODULE_WIDTH),
201
+ singleCheckField('fontSize', styles.fontSize || '14'),
202
+ inputField('right', styles.right || '0'),
203
+ inputField('value', text),
204
+ inputField('height', styles.height || '')
205
+ ];
206
+
207
+ return {
208
+ id: fieldId, type: 'complex',
209
+ value: {
210
+ props: [
211
+ { id: 'images', type: 'multiComplex', values: imageValues },
212
+ singleCheckField('enable', 'true'),
213
+ singleCheckField('countHeight', 'false'),
214
+ inputField('id', groupId),
215
+ { id: 'textStyle', type: 'complex', value: { props: textStyleProps } },
216
+ { id: 'sample', type: 'multiComplex', values: sampleValues }
217
+ ]
218
+ }
219
+ };
220
+ }
221
+
222
+ function buildImageModule(params) {
223
+ params = params || {};
224
+ var url = params.url || '';
225
+ var width = params.width || MODULE_WIDTH;
226
+ var height = params.height || '';
227
+ var hotAreas = params.hotAreas || [];
228
+ var groupId = params.id || generateGroupId();
229
+ var index = params.index !== undefined ? params.index : 0;
230
+ var fieldId = 'image_hot_area_' + index;
231
+
232
+ var hotAreaValues = [];
233
+ for (var i = 0; i < hotAreas.length; i++) {
234
+ hotAreaValues.push({
235
+ props: [
236
+ inputField('start_x', hotAreas[i].start_x),
237
+ inputField('start_y', hotAreas[i].start_y),
238
+ inputField('end_x', hotAreas[i].end_x),
239
+ inputField('end_y', hotAreas[i].end_y),
240
+ inputField('link', hotAreas[i].link || '')
241
+ ]
242
+ });
243
+ }
244
+
245
+ var sampleValues = [];
246
+ if (url) {
247
+ sampleValues.push({
248
+ props: [inputField('width', width), inputField('url', url), inputField('height', height)]
249
+ });
250
+ }
251
+
252
+ return {
253
+ id: fieldId, type: 'complex',
254
+ value: {
255
+ props: [
256
+ { id: 'image', type: 'complex', value: {
257
+ props: [inputField('width', width), inputField('url', url), inputField('height', height)]
258
+ }},
259
+ singleCheckField('enable', 'true'),
260
+ singleCheckField('countHeight', 'true'),
261
+ { id: 'hot_area', type: 'multiComplex', values: hotAreaValues },
262
+ inputField('id', groupId),
263
+ { id: 'sample', type: 'multiComplex', values: sampleValues }
264
+ ]
265
+ }
266
+ };
267
+ }
268
+
269
+ function buildRichTextModule(params) {
270
+ params = params || {};
271
+ var groupId = params.id || generateGroupId();
272
+ var index = params.index !== undefined ? params.index : 0;
273
+ var fieldId = 'rich_text_' + index;
274
+ return {
275
+ id: fieldId, type: 'complex',
276
+ value: {
277
+ props: [
278
+ singleCheckField('enable', 'false'),
279
+ singleCheckField('countHeight', 'false'),
280
+ inputField('id', groupId),
281
+ { id: 'html', type: 'complex', value: {
282
+ props: [inputField('text', params.html || ''), inputField('width', ''), inputField('height', '')]
283
+ }},
284
+ { id: 'sample', type: 'multiComplex', values: [] }
285
+ ]
286
+ }
287
+ };
288
+ }
289
+
290
+ // ==================== 内部更新方法 ====================
291
+
292
+ function updateTextImages(textModule, images) {
293
+ var imageValues = [];
294
+ for (var k = 0; k < images.length; k++) {
295
+ imageValues.push({
296
+ props: [
297
+ inputField('width', images[k].width || MODULE_WIDTH),
298
+ inputField('url', images[k].url || ''),
299
+ inputField('height', images[k].height || '')
300
+ ]
301
+ });
302
+ }
303
+ var moduleProps = textModule.value.props;
304
+ for (var p = 0; p < moduleProps.length; p++) {
305
+ if (moduleProps[p].id === 'images') moduleProps[p].values = imageValues;
306
+ if (moduleProps[p].id === 'sample' && images.length > 0) {
307
+ moduleProps[p].values = [{
308
+ props: [inputField('width'), inputField('url', images[0].url || ''), inputField('height')]
309
+ }];
310
+ }
311
+ }
312
+ }
313
+
314
+ function updateImageSize(imageModule, size) {
315
+ var scaledWidth = MODULE_WIDTH;
316
+ var scaledHeight = '';
317
+ if (size.width && size.height) {
318
+ var ratio = MODULE_WIDTH / size.width;
319
+ scaledWidth = MODULE_WIDTH;
320
+ scaledHeight = Math.round(size.height * ratio);
321
+ if (scaledWidth < IMAGE_MIN_WIDTH) scaledWidth = IMAGE_MIN_WIDTH;
322
+ if (scaledWidth > IMAGE_MAX_WIDTH) scaledWidth = IMAGE_MAX_WIDTH;
323
+ if (scaledHeight > IMAGE_MAX_HEIGHT) scaledHeight = IMAGE_MAX_HEIGHT;
324
+ }
325
+ var moduleProps = imageModule.value.props;
326
+ for (var ip = 0; ip < moduleProps.length; ip++) {
327
+ if (moduleProps[ip].id === 'image' && moduleProps[ip].value && moduleProps[ip].value.props) {
328
+ var imageProps = moduleProps[ip].value.props;
329
+ for (var j = 0; j < imageProps.length; j++) {
330
+ if (imageProps[j].id === 'width') imageProps[j] = inputField('width', scaledWidth);
331
+ else if (imageProps[j].id === 'height') imageProps[j] = inputField('height', scaledHeight);
332
+ }
333
+ }
334
+ if (moduleProps[ip].id === 'sample' && moduleProps[ip].values && moduleProps[ip].values.length) {
335
+ var sampleProps = moduleProps[ip].values[0].props;
336
+ for (var sp = 0; sp < sampleProps.length; sp++) {
337
+ if (sampleProps[sp].id === 'width') sampleProps[sp] = inputField('width', scaledWidth);
338
+ else if (sampleProps[sp].id === 'height') sampleProps[sp] = inputField('height', scaledHeight);
339
+ }
340
+ }
341
+ }
342
+ }
343
+
344
+ // ==================== 核心转换方法 ====================
345
+
346
+ /**
347
+ * 将 HTML 富文本转换为淘宝新版图文编辑器 wirelessDesc 结构
348
+ *
349
+ * 异步方法,统一用 async/await 调用。
350
+ * 不需要异步补全(图片尺寸、文字合图)时,不传 resolvers 即可。
351
+ *
352
+ * @param {string} html - 原始 HTML 富文本
353
+ * @param {Object} [options] - 配置选项
354
+ * @param {string} [options.maxHeight=100000] - 编辑器最大高度
355
+ * @param {string} [options.width=620] - 编辑器模块宽度
356
+ * @param {string} [options.splitHeight=1240] - 切图高度
357
+ * @param {Array} [options.existingModules] - 已存在的模块
358
+ * @param {Function} [options.imageSize] - 图片尺寸获取函数
359
+ * 参数: { url } 返回 Promise<{ width, height }>
360
+ * @param {Function} [options.textImage] - 文字合图函数
361
+ * 参数: { text, styles, index } 返回 Promise<Array<{ url, width, height }>>
362
+ * @returns {Promise<Object>} wirelessDesc 结构化 JSON
363
+ *
364
+ * @example
365
+ * // 最简用法
366
+ * const desc = await htmlToWirelessDesc(html);
367
+ * const jsonStr = JSON.stringify(desc);
368
+ *
369
+ * @example
370
+ * // 需要异步补全
371
+ * const desc = await htmlToWirelessDesc(html, {
372
+ * imageSize: async ({ url }) => getImageSize(url),
373
+ * textImage: async ({ text, styles }) => renderText(text, styles)
374
+ * });
375
+ */
376
+ async function htmlToWirelessDesc(html, options) {
377
+ options = options || {};
378
+
379
+ if (!html || typeof html !== 'string') {
380
+ return buildEmptyWirelessDesc(options);
381
+ }
382
+
383
+ var segments = parseHtmlSegments(html);
384
+ var textCounter = 0;
385
+ var imageCounter = 0;
386
+ var props = [];
387
+
388
+ if (options.existingModules && options.existingModules.length) {
389
+ for (var e = 0; e < options.existingModules.length; e++) {
390
+ props.push(options.existingModules[e]);
391
+ }
392
+ }
393
+
394
+ for (var i = 0; i < segments.length; i++) {
395
+ var seg = segments[i];
396
+ if (seg.type === 'text') {
397
+ textCounter++;
398
+ props.push(buildTextModule({ text: seg.content, styles: seg.styles, index: textCounter }));
399
+ } else if (seg.type === 'image') {
400
+ imageCounter++;
401
+ props.push(buildImageModule({ url: seg.url, width: MODULE_WIDTH, height: '', index: imageCounter }));
402
+ }
403
+ }
404
+
405
+ props.push(buildVersionModule());
406
+ props.push(buildConfigModule(options));
407
+
408
+ var wirelessDesc = {
409
+ id: 'wirelessDesc', name: '旺铺无线详情描述', type: 'complex',
410
+ value: { props: props }
411
+ };
412
+
413
+ // 异步补全:图片尺寸 & 文字合图
414
+ var hasImageResolver = typeof options.imageSize === 'function';
415
+ var hasTextResolver = typeof options.textImage === 'function';
416
+
417
+ if (hasImageResolver || hasTextResolver) {
418
+ var tasks = [];
419
+
420
+ for (var j = 0; j < props.length; j++) {
421
+ var module = props[j];
422
+ if (module.type !== 'complex' || !module.value || !module.value.props) continue;
423
+ var moduleId = module.id || '';
424
+
425
+ // 文字模块 → 调用 textImage
426
+ if (hasTextResolver && moduleId.indexOf('text_') === 0) {
427
+ var textStyle = null;
428
+ var moduleProps = module.value.props;
429
+ for (var p = 0; p < moduleProps.length; p++) {
430
+ if (moduleProps[p].id === 'textStyle') { textStyle = moduleProps[p]; break; }
431
+ }
432
+ if (textStyle && textStyle.value && textStyle.value.props) {
433
+ var textValue = '';
434
+ var styles = {};
435
+ var styleProps = textStyle.value.props;
436
+ for (var s = 0; s < styleProps.length; s++) {
437
+ var sp = styleProps[s];
438
+ if (!sp.value || !sp.value.value) continue;
439
+ if (sp.id === 'value') textValue = sp.value.value;
440
+ else if (sp.id === 'fontFamily') styles.fontFamily = sp.value.value;
441
+ else if (sp.id === 'color') styles.color = sp.value.value;
442
+ else if (sp.id === 'fontSize') styles.fontSize = sp.value.value;
443
+ else if (sp.id === 'textAlign') styles.textAlign = sp.value.value;
444
+ }
445
+ var moduleIndex = parseInt(moduleId.split('_')[1], 10) || 1;
446
+ tasks.push((async function(mod, text, st, idx) {
447
+ try {
448
+ var images = await options.textImage({ text: text, styles: st, index: idx });
449
+ if (Array.isArray(images) && images.length) {
450
+ updateTextImages(mod, images);
451
+ }
452
+ } catch (e) {}
453
+ })(module, textValue, styles, moduleIndex));
454
+ }
455
+ }
456
+
457
+ // 图片模块 → 调用 imageSize
458
+ if (hasImageResolver && moduleId.indexOf('image_hot_area_') === 0) {
459
+ var imageUrl = '';
460
+ var moduleProps2 = module.value.props;
461
+ for (var ip = 0; ip < moduleProps2.length; ip++) {
462
+ if (moduleProps2[ip].id === 'image' && moduleProps2[ip].value && moduleProps2[ip].value.props) {
463
+ var imgFields = moduleProps2[ip].value.props;
464
+ for (var k = 0; k < imgFields.length; k++) {
465
+ if (imgFields[k].id === 'url' && imgFields[k].value) {
466
+ imageUrl = imgFields[k].value.value;
467
+ break;
468
+ }
469
+ }
470
+ break;
471
+ }
472
+ }
473
+ if (imageUrl) {
474
+ tasks.push((async function(mod, url) {
475
+ try {
476
+ var size = await options.imageSize({ url: url });
477
+ if (size && size.width && size.height) {
478
+ updateImageSize(mod, size);
479
+ }
480
+ } catch (e) {}
481
+ })(module, imageUrl));
482
+ }
483
+ }
484
+ }
485
+
486
+ if (tasks.length > 0) {
487
+ await Promise.all(tasks);
488
+ }
489
+ }
490
+
491
+ return wirelessDesc;
492
+ }
493
+
494
+ // ==================== 辅助方法 ====================
495
+
496
+ function buildEmptyWirelessDesc(options) {
497
+ return {
498
+ id: 'wirelessDesc', name: '旺铺无线详情描述', type: 'complex',
499
+ value: { props: [buildVersionModule(), buildConfigModule(options)] }
500
+ };
501
+ }
502
+
503
+ function validateHeight(wirelessDesc, maxHeight) {
504
+ maxHeight = maxHeight || MAX_HEIGHT;
505
+ var totalHeight = 0;
506
+ var props = (wirelessDesc.value && wirelessDesc.value.props) || [];
507
+ for (var i = 0; i < props.length; i++) {
508
+ var module = props[i];
509
+ if (module.type !== 'complex' || !module.value || !module.value.props) continue;
510
+ var countHeight = false;
511
+ var moduleHeight = 0;
512
+ var moduleProps = module.value.props;
513
+ for (var j = 0; j < moduleProps.length; j++) {
514
+ var field = moduleProps[j];
515
+ if (field.id === 'countHeight' && field.value && field.value.value === 'true') countHeight = true;
516
+ if (field.id === 'image' && field.value && field.value.props) {
517
+ for (var k = 0; k < field.value.props.length; k++) {
518
+ if (field.value.props[k].id === 'height' && field.value.props[k].value) {
519
+ moduleHeight = parseInt(field.value.props[k].value.value, 10) || 0;
520
+ }
521
+ }
522
+ }
523
+ }
524
+ if (countHeight) totalHeight += moduleHeight;
525
+ }
526
+ return { valid: totalHeight <= maxHeight, totalHeight: totalHeight, maxHeight: maxHeight };
527
+ }
528
+
529
+ function serializeWirelessDesc(wirelessDesc) {
530
+ return JSON.stringify(wirelessDesc);
531
+ }
532
+
533
+ export { IMAGE_MAX_HEIGHT, IMAGE_MAX_WIDTH, IMAGE_MIN_WIDTH, MAX_HEIGHT, MODULE_WIDTH, SPLIT_HEIGHT, VERSION, buildConfigModule, buildEmptyWirelessDesc, buildImageModule, buildRichTextModule, buildTextModule, buildVersionModule, extractImages, extractStyles, extractText, htmlToWirelessDesc, mapFontSize, mapHeadingSize, parseHtmlSegments, serializeWirelessDesc, validateHeight };
534
+ //# sourceMappingURL=wireless-desc-converter.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireless-desc-converter.esm.js","sources":["../src/index.js"],"sourcesContent":["/**\n * 淘宝新版图文编辑器 wirelessDesc 适配模块\n *\n * 独立 npm 包入口,核心逻辑复用项目 src/util/wirelessDesc.js\n * 此文件为零依赖版本,可直接在任何 JS 环境使用\n *\n * API 设计:\n * - htmlToWirelessDesc(html, options?) 异步,统一用 async/await 调用\n * - 不需要异步补全时,不传 resolvers 即可,仍然 await\n *\n * @module wireless-desc-converter\n */\n\n// ==================== 常量定义 ====================\n\nvar MODULE_WIDTH = 620;\nvar SPLIT_HEIGHT = 1240;\nvar MAX_HEIGHT = 100000;\nvar VERSION = '1.0.0';\n\nvar IMAGE_MIN_WIDTH = 480;\nvar IMAGE_MAX_WIDTH = 1500;\nvar IMAGE_MAX_HEIGHT = 2000;\n\n// ==================== 内部工具方法 ====================\n\nfunction generateGroupId() {\n return 'group' + Date.now() + Math.floor(Math.random() * 10000);\n}\n\nfunction inputField(id, value) {\n var field = { id: id, type: 'input' };\n if (value !== undefined && value !== null) {\n field.value = { value: String(value) };\n }\n return field;\n}\n\nfunction singleCheckField(id, value) {\n return {\n id: id,\n type: 'singleCheck',\n value: { value: String(value) }\n };\n}\n\nfunction extractImages(html) {\n var imgReg = /<img[^>]*?(?:>)/gi;\n var srcReg = /src\\s*=\\s*['\"]?([^'\"\\s>]*)['\"\\s>]?/i;\n var results = [];\n var match;\n while ((match = imgReg.exec(html)) !== null) {\n var srcMatch = match[0].match(srcReg);\n if (srcMatch && srcMatch[1]) {\n results.push({ url: srcMatch[1], html: match[0] });\n }\n }\n return results;\n}\n\nfunction extractText(html) {\n return html\n .replace(/<img[^>]*?(?:>)/gi, '')\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/p>/gi, '\\n')\n .replace(/<\\/h[1-6]>/gi, '\\n')\n .replace(/<\\/div>/gi, '\\n')\n .replace(/<\\/li>/gi, '\\n')\n .replace(/<.+?>/g, '')\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nfunction extractStyles(html) {\n var styles = {};\n var styleReg = /style\\s*=\\s*['\"]([^'\"]*)['\"]/i;\n var styleMatch = html.match(styleReg);\n if (styleMatch) {\n var styleStr = styleMatch[1];\n var colorMatch = styleStr.match(/color\\s*:\\s*([^;]+)/i);\n if (colorMatch) styles.color = colorMatch[1].trim();\n var fontSizeMatch = styleStr.match(/font-size\\s*:\\s*([^;]+)/i);\n if (fontSizeMatch) {\n styles.fontSize = mapFontSize(parseInt(fontSizeMatch[1].trim().replace(/px/i, ''), 10));\n }\n var alignMatch = styleStr.match(/text-align\\s*:\\s*([^;]+)/i);\n if (alignMatch) styles.textAlign = alignMatch[1].trim();\n var fontMatch = styleStr.match(/font-family\\s*:\\s*([^;]+)/i);\n if (fontMatch) styles.fontFamily = fontMatch[1].trim();\n }\n var headingReg = /<h(\\d)[^>]*>/i;\n var headingMatch = html.match(headingReg);\n if (headingMatch && !styles.fontSize) {\n styles.fontSize = mapHeadingSize(parseInt(headingMatch[1], 10));\n }\n if (!styles.textAlign) {\n if (/<center/i.test(html) || /align\\s*=\\s*['\"]center['\"]/i.test(html)) {\n styles.textAlign = 'center';\n } else if (/align\\s*=\\s*['\"]right['\"]/i.test(html)) {\n styles.textAlign = 'right';\n }\n }\n return styles;\n}\n\nfunction mapFontSize(size) {\n var allowed = [12, 14, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 44, 48, 52, 56, 60];\n var closest = allowed[0];\n var minDiff = Math.abs(size - allowed[0]);\n for (var i = 1; i < allowed.length; i++) {\n var diff = Math.abs(size - allowed[i]);\n if (diff < minDiff) { minDiff = diff; closest = allowed[i]; }\n }\n return String(closest);\n}\n\nfunction mapHeadingSize(level) {\n var map = { 1: '28', 2: '24', 3: '20', 4: '18', 5: '16', 6: '14' };\n return map[level] || '14';\n}\n\nfunction parseHtmlSegments(html) {\n var segments = [];\n var imgReg = /<img[^>]*?(?:>)/gi;\n var parts = html.split(imgReg);\n var images = extractImages(html);\n for (var i = 0; i < parts.length; i++) {\n var textContent = extractText(parts[i]);\n var styles = extractStyles(parts[i]);\n if (textContent) {\n segments.push({ type: 'text', content: textContent, styles: styles });\n }\n if (i < images.length) {\n segments.push({ type: 'image', url: images[i].url });\n }\n }\n return segments;\n}\n\n// ==================== 模块构造方法 ====================\n\nfunction buildVersionModule() {\n return inputField('version', VERSION);\n}\n\nfunction buildConfigModule(options) {\n options = options || {};\n return {\n id: 'config', type: 'complex',\n value: {\n props: [\n inputField('maxHeight', options.maxHeight || MAX_HEIGHT),\n inputField('width', options.width || MODULE_WIDTH),\n inputField('splitHeight', options.splitHeight || SPLIT_HEIGHT)\n ]\n }\n };\n}\n\nfunction buildTextModule(params) {\n params = params || {};\n var text = params.text || '';\n var images = params.images || [];\n var styles = params.styles || {};\n var groupId = params.id || generateGroupId();\n var index = params.index !== undefined ? params.index : 1;\n var fieldId = 'text_' + index;\n\n var imageValues = [];\n for (var i = 0; i < images.length; i++) {\n imageValues.push({\n props: [\n inputField('width', images[i].width || MODULE_WIDTH),\n inputField('url', images[i].url || ''),\n inputField('height', images[i].height || '')\n ]\n });\n }\n\n var sampleValues = [];\n if (images.length > 0) {\n sampleValues.push({\n props: [inputField('width'), inputField('url', images[0].url || ''), inputField('height')]\n });\n }\n\n var textStyleProps = [\n singleCheckField('fontFamily', styles.fontFamily || 'ali-webfont'),\n inputField('color', styles.color || '#333333'),\n inputField('top', styles.top || '10'),\n singleCheckField('textAlign', styles.textAlign || 'left'),\n inputField('left', styles.left || '0'),\n inputField('bottom', styles.bottom || '10'),\n inputField('width', styles.width || MODULE_WIDTH),\n singleCheckField('fontSize', styles.fontSize || '14'),\n inputField('right', styles.right || '0'),\n inputField('value', text),\n inputField('height', styles.height || '')\n ];\n\n return {\n id: fieldId, type: 'complex',\n value: {\n props: [\n { id: 'images', type: 'multiComplex', values: imageValues },\n singleCheckField('enable', 'true'),\n singleCheckField('countHeight', 'false'),\n inputField('id', groupId),\n { id: 'textStyle', type: 'complex', value: { props: textStyleProps } },\n { id: 'sample', type: 'multiComplex', values: sampleValues }\n ]\n }\n };\n}\n\nfunction buildImageModule(params) {\n params = params || {};\n var url = params.url || '';\n var width = params.width || MODULE_WIDTH;\n var height = params.height || '';\n var hotAreas = params.hotAreas || [];\n var groupId = params.id || generateGroupId();\n var index = params.index !== undefined ? params.index : 0;\n var fieldId = 'image_hot_area_' + index;\n\n var hotAreaValues = [];\n for (var i = 0; i < hotAreas.length; i++) {\n hotAreaValues.push({\n props: [\n inputField('start_x', hotAreas[i].start_x),\n inputField('start_y', hotAreas[i].start_y),\n inputField('end_x', hotAreas[i].end_x),\n inputField('end_y', hotAreas[i].end_y),\n inputField('link', hotAreas[i].link || '')\n ]\n });\n }\n\n var sampleValues = [];\n if (url) {\n sampleValues.push({\n props: [inputField('width', width), inputField('url', url), inputField('height', height)]\n });\n }\n\n return {\n id: fieldId, type: 'complex',\n value: {\n props: [\n { id: 'image', type: 'complex', value: {\n props: [inputField('width', width), inputField('url', url), inputField('height', height)]\n }},\n singleCheckField('enable', 'true'),\n singleCheckField('countHeight', 'true'),\n { id: 'hot_area', type: 'multiComplex', values: hotAreaValues },\n inputField('id', groupId),\n { id: 'sample', type: 'multiComplex', values: sampleValues }\n ]\n }\n };\n}\n\nfunction buildRichTextModule(params) {\n params = params || {};\n var groupId = params.id || generateGroupId();\n var index = params.index !== undefined ? params.index : 0;\n var fieldId = 'rich_text_' + index;\n return {\n id: fieldId, type: 'complex',\n value: {\n props: [\n singleCheckField('enable', 'false'),\n singleCheckField('countHeight', 'false'),\n inputField('id', groupId),\n { id: 'html', type: 'complex', value: {\n props: [inputField('text', params.html || ''), inputField('width', ''), inputField('height', '')]\n }},\n { id: 'sample', type: 'multiComplex', values: [] }\n ]\n }\n };\n}\n\n// ==================== 内部更新方法 ====================\n\nfunction updateTextImages(textModule, images) {\n var imageValues = [];\n for (var k = 0; k < images.length; k++) {\n imageValues.push({\n props: [\n inputField('width', images[k].width || MODULE_WIDTH),\n inputField('url', images[k].url || ''),\n inputField('height', images[k].height || '')\n ]\n });\n }\n var moduleProps = textModule.value.props;\n for (var p = 0; p < moduleProps.length; p++) {\n if (moduleProps[p].id === 'images') moduleProps[p].values = imageValues;\n if (moduleProps[p].id === 'sample' && images.length > 0) {\n moduleProps[p].values = [{\n props: [inputField('width'), inputField('url', images[0].url || ''), inputField('height')]\n }];\n }\n }\n}\n\nfunction updateImageSize(imageModule, size) {\n var scaledWidth = MODULE_WIDTH;\n var scaledHeight = '';\n if (size.width && size.height) {\n var ratio = MODULE_WIDTH / size.width;\n scaledWidth = MODULE_WIDTH;\n scaledHeight = Math.round(size.height * ratio);\n if (scaledWidth < IMAGE_MIN_WIDTH) scaledWidth = IMAGE_MIN_WIDTH;\n if (scaledWidth > IMAGE_MAX_WIDTH) scaledWidth = IMAGE_MAX_WIDTH;\n if (scaledHeight > IMAGE_MAX_HEIGHT) scaledHeight = IMAGE_MAX_HEIGHT;\n }\n var moduleProps = imageModule.value.props;\n for (var ip = 0; ip < moduleProps.length; ip++) {\n if (moduleProps[ip].id === 'image' && moduleProps[ip].value && moduleProps[ip].value.props) {\n var imageProps = moduleProps[ip].value.props;\n for (var j = 0; j < imageProps.length; j++) {\n if (imageProps[j].id === 'width') imageProps[j] = inputField('width', scaledWidth);\n else if (imageProps[j].id === 'height') imageProps[j] = inputField('height', scaledHeight);\n }\n }\n if (moduleProps[ip].id === 'sample' && moduleProps[ip].values && moduleProps[ip].values.length) {\n var sampleProps = moduleProps[ip].values[0].props;\n for (var sp = 0; sp < sampleProps.length; sp++) {\n if (sampleProps[sp].id === 'width') sampleProps[sp] = inputField('width', scaledWidth);\n else if (sampleProps[sp].id === 'height') sampleProps[sp] = inputField('height', scaledHeight);\n }\n }\n }\n}\n\n// ==================== 核心转换方法 ====================\n\n/**\n * 将 HTML 富文本转换为淘宝新版图文编辑器 wirelessDesc 结构\n *\n * 异步方法,统一用 async/await 调用。\n * 不需要异步补全(图片尺寸、文字合图)时,不传 resolvers 即可。\n *\n * @param {string} html - 原始 HTML 富文本\n * @param {Object} [options] - 配置选项\n * @param {string} [options.maxHeight=100000] - 编辑器最大高度\n * @param {string} [options.width=620] - 编辑器模块宽度\n * @param {string} [options.splitHeight=1240] - 切图高度\n * @param {Array} [options.existingModules] - 已存在的模块\n * @param {Function} [options.imageSize] - 图片尺寸获取函数\n * 参数: { url } 返回 Promise<{ width, height }>\n * @param {Function} [options.textImage] - 文字合图函数\n * 参数: { text, styles, index } 返回 Promise<Array<{ url, width, height }>>\n * @returns {Promise<Object>} wirelessDesc 结构化 JSON\n *\n * @example\n * // 最简用法\n * const desc = await htmlToWirelessDesc(html);\n * const jsonStr = JSON.stringify(desc);\n *\n * @example\n * // 需要异步补全\n * const desc = await htmlToWirelessDesc(html, {\n * imageSize: async ({ url }) => getImageSize(url),\n * textImage: async ({ text, styles }) => renderText(text, styles)\n * });\n */\nasync function htmlToWirelessDesc(html, options) {\n options = options || {};\n\n if (!html || typeof html !== 'string') {\n return buildEmptyWirelessDesc(options);\n }\n\n var segments = parseHtmlSegments(html);\n var textCounter = 0;\n var imageCounter = 0;\n var props = [];\n\n if (options.existingModules && options.existingModules.length) {\n for (var e = 0; e < options.existingModules.length; e++) {\n props.push(options.existingModules[e]);\n }\n }\n\n for (var i = 0; i < segments.length; i++) {\n var seg = segments[i];\n if (seg.type === 'text') {\n textCounter++;\n props.push(buildTextModule({ text: seg.content, styles: seg.styles, index: textCounter }));\n } else if (seg.type === 'image') {\n imageCounter++;\n props.push(buildImageModule({ url: seg.url, width: MODULE_WIDTH, height: '', index: imageCounter }));\n }\n }\n\n props.push(buildVersionModule());\n props.push(buildConfigModule(options));\n\n var wirelessDesc = {\n id: 'wirelessDesc', name: '旺铺无线详情描述', type: 'complex',\n value: { props: props }\n };\n\n // 异步补全:图片尺寸 & 文字合图\n var hasImageResolver = typeof options.imageSize === 'function';\n var hasTextResolver = typeof options.textImage === 'function';\n\n if (hasImageResolver || hasTextResolver) {\n var tasks = [];\n\n for (var j = 0; j < props.length; j++) {\n var module = props[j];\n if (module.type !== 'complex' || !module.value || !module.value.props) continue;\n var moduleId = module.id || '';\n\n // 文字模块 → 调用 textImage\n if (hasTextResolver && moduleId.indexOf('text_') === 0) {\n var textStyle = null;\n var moduleProps = module.value.props;\n for (var p = 0; p < moduleProps.length; p++) {\n if (moduleProps[p].id === 'textStyle') { textStyle = moduleProps[p]; break; }\n }\n if (textStyle && textStyle.value && textStyle.value.props) {\n var textValue = '';\n var styles = {};\n var styleProps = textStyle.value.props;\n for (var s = 0; s < styleProps.length; s++) {\n var sp = styleProps[s];\n if (!sp.value || !sp.value.value) continue;\n if (sp.id === 'value') textValue = sp.value.value;\n else if (sp.id === 'fontFamily') styles.fontFamily = sp.value.value;\n else if (sp.id === 'color') styles.color = sp.value.value;\n else if (sp.id === 'fontSize') styles.fontSize = sp.value.value;\n else if (sp.id === 'textAlign') styles.textAlign = sp.value.value;\n }\n var moduleIndex = parseInt(moduleId.split('_')[1], 10) || 1;\n tasks.push((async function(mod, text, st, idx) {\n try {\n var images = await options.textImage({ text: text, styles: st, index: idx });\n if (Array.isArray(images) && images.length) {\n updateTextImages(mod, images);\n }\n } catch (e) {}\n })(module, textValue, styles, moduleIndex));\n }\n }\n\n // 图片模块 → 调用 imageSize\n if (hasImageResolver && moduleId.indexOf('image_hot_area_') === 0) {\n var imageUrl = '';\n var moduleProps2 = module.value.props;\n for (var ip = 0; ip < moduleProps2.length; ip++) {\n if (moduleProps2[ip].id === 'image' && moduleProps2[ip].value && moduleProps2[ip].value.props) {\n var imgFields = moduleProps2[ip].value.props;\n for (var k = 0; k < imgFields.length; k++) {\n if (imgFields[k].id === 'url' && imgFields[k].value) {\n imageUrl = imgFields[k].value.value;\n break;\n }\n }\n break;\n }\n }\n if (imageUrl) {\n tasks.push((async function(mod, url) {\n try {\n var size = await options.imageSize({ url: url });\n if (size && size.width && size.height) {\n updateImageSize(mod, size);\n }\n } catch (e) {}\n })(module, imageUrl));\n }\n }\n }\n\n if (tasks.length > 0) {\n await Promise.all(tasks);\n }\n }\n\n return wirelessDesc;\n}\n\n// ==================== 辅助方法 ====================\n\nfunction buildEmptyWirelessDesc(options) {\n return {\n id: 'wirelessDesc', name: '旺铺无线详情描述', type: 'complex',\n value: { props: [buildVersionModule(), buildConfigModule(options)] }\n };\n}\n\nfunction validateHeight(wirelessDesc, maxHeight) {\n maxHeight = maxHeight || MAX_HEIGHT;\n var totalHeight = 0;\n var props = (wirelessDesc.value && wirelessDesc.value.props) || [];\n for (var i = 0; i < props.length; i++) {\n var module = props[i];\n if (module.type !== 'complex' || !module.value || !module.value.props) continue;\n var countHeight = false;\n var moduleHeight = 0;\n var moduleProps = module.value.props;\n for (var j = 0; j < moduleProps.length; j++) {\n var field = moduleProps[j];\n if (field.id === 'countHeight' && field.value && field.value.value === 'true') countHeight = true;\n if (field.id === 'image' && field.value && field.value.props) {\n for (var k = 0; k < field.value.props.length; k++) {\n if (field.value.props[k].id === 'height' && field.value.props[k].value) {\n moduleHeight = parseInt(field.value.props[k].value.value, 10) || 0;\n }\n }\n }\n }\n if (countHeight) totalHeight += moduleHeight;\n }\n return { valid: totalHeight <= maxHeight, totalHeight: totalHeight, maxHeight: maxHeight };\n}\n\nfunction serializeWirelessDesc(wirelessDesc) {\n return JSON.stringify(wirelessDesc);\n}\n\n// ==================== 导出 ====================\n\nexport {\n // 核心转换\n htmlToWirelessDesc,\n\n // 辅助方法\n buildEmptyWirelessDesc,\n validateHeight,\n serializeWirelessDesc,\n\n // 模块构造\n buildTextModule,\n buildImageModule,\n buildRichTextModule,\n buildVersionModule,\n buildConfigModule,\n\n // 内部工具\n extractImages,\n extractText,\n extractStyles,\n parseHtmlSegments,\n mapFontSize,\n mapHeadingSize,\n\n // 常量\n MODULE_WIDTH,\n SPLIT_HEIGHT,\n MAX_HEIGHT,\n VERSION,\n IMAGE_MIN_WIDTH,\n IMAGE_MAX_WIDTH,\n IMAGE_MAX_HEIGHT\n};\n"],"names":[],"mappings":"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"}