weaver-e10-builder 1.5.11 → 1.5.12

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.
Files changed (172) hide show
  1. package/README.md +212 -189
  2. package/assets/image-style-observation.schema.json +1355 -0
  3. package/assets/layout-spec.schema.json +52 -0
  4. package/dist/commands/form-field-linkage.d.ts +55 -0
  5. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  6. package/dist/commands/form-field-linkage.js +1026 -12
  7. package/dist/commands/form-field-linkage.js.map +1 -1
  8. package/dist/commands/form-formula-linkage.d.ts +36 -0
  9. package/dist/commands/form-formula-linkage.d.ts.map +1 -1
  10. package/dist/commands/form-formula-linkage.js +107 -7
  11. package/dist/commands/form-formula-linkage.js.map +1 -1
  12. package/dist/commands/form-layout-restore.d.ts +3 -0
  13. package/dist/commands/form-layout-restore.d.ts.map +1 -0
  14. package/dist/commands/form-layout-restore.js +217 -0
  15. package/dist/commands/form-layout-restore.js.map +1 -0
  16. package/dist/commands/form-layout.d.ts.map +1 -1
  17. package/dist/commands/form-layout.js +11 -1
  18. package/dist/commands/form-layout.js.map +1 -1
  19. package/dist/commands/form-obj-meta.d.ts +12 -0
  20. package/dist/commands/form-obj-meta.d.ts.map +1 -0
  21. package/dist/commands/form-obj-meta.js +116 -0
  22. package/dist/commands/form-obj-meta.js.map +1 -0
  23. package/dist/commands/form-validate.d.ts.map +1 -1
  24. package/dist/commands/form-validate.js +167 -35
  25. package/dist/commands/form-validate.js.map +1 -1
  26. package/dist/commands/form.d.ts.map +1 -1
  27. package/dist/commands/form.js +26 -2
  28. package/dist/commands/form.js.map +1 -1
  29. package/dist/commands/menu.d.ts.map +1 -1
  30. package/dist/commands/menu.js +5 -3
  31. package/dist/commands/menu.js.map +1 -1
  32. package/dist/commands/wf-form.d.ts.map +1 -1
  33. package/dist/commands/wf-form.js +215 -13
  34. package/dist/commands/wf-form.js.map +1 -1
  35. package/dist/core/client.d.ts +2 -1
  36. package/dist/core/client.d.ts.map +1 -1
  37. package/dist/core/client.js +4 -2
  38. package/dist/core/client.js.map +1 -1
  39. package/dist/index.js +2 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/services/actionflow/calendar_mapper.d.ts.map +1 -1
  42. package/dist/services/actionflow/calendar_mapper.js +34 -14
  43. package/dist/services/actionflow/calendar_mapper.js.map +1 -1
  44. package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
  45. package/dist/services/actionflow/components/document_actions.js +113 -4
  46. package/dist/services/actionflow/components/document_actions.js.map +1 -1
  47. package/dist/services/actionflow/components/eb_get_data_by_id.d.ts.map +1 -1
  48. package/dist/services/actionflow/components/eb_get_data_by_id.js +18 -1
  49. package/dist/services/actionflow/components/eb_get_data_by_id.js.map +1 -1
  50. package/dist/services/actionflow/components/index.d.ts.map +1 -1
  51. package/dist/services/actionflow/components/index.js +2 -1
  52. package/dist/services/actionflow/components/index.js.map +1 -1
  53. package/dist/services/actionflow/components/schedule_create.d.ts.map +1 -1
  54. package/dist/services/actionflow/components/schedule_create.js +22 -6
  55. package/dist/services/actionflow/components/schedule_create.js.map +1 -1
  56. package/dist/services/actionflow/components/workflow_actions.d.ts +1 -0
  57. package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
  58. package/dist/services/actionflow/components/workflow_actions.js +31 -6
  59. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  60. package/dist/services/actionflow/document_source.d.ts +5 -0
  61. package/dist/services/actionflow/document_source.d.ts.map +1 -1
  62. package/dist/services/actionflow/document_source.js +16 -0
  63. package/dist/services/actionflow/document_source.js.map +1 -1
  64. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  65. package/dist/services/actionflow/formula_service.js +19 -8
  66. package/dist/services/actionflow/formula_service.js.map +1 -1
  67. package/dist/services/actionflow/preflight_service.d.ts +5 -0
  68. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  69. package/dist/services/actionflow/preflight_service.js +127 -2
  70. package/dist/services/actionflow/preflight_service.js.map +1 -1
  71. package/dist/services/actionflow/save_workflow_draft.d.ts +7 -0
  72. package/dist/services/actionflow/save_workflow_draft.d.ts.map +1 -1
  73. package/dist/services/actionflow/save_workflow_draft.js +1 -1
  74. package/dist/services/actionflow/save_workflow_draft.js.map +1 -1
  75. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  76. package/dist/services/actionflow/workflow_compiler.js +26 -0
  77. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  78. package/dist/services/form-formula-linkage.d.ts +4 -0
  79. package/dist/services/form-formula-linkage.d.ts.map +1 -1
  80. package/dist/services/form-formula-linkage.js +3 -1
  81. package/dist/services/form-formula-linkage.js.map +1 -1
  82. package/dist/services/form-layout-io.d.ts +18 -0
  83. package/dist/services/form-layout-io.d.ts.map +1 -0
  84. package/dist/services/form-layout-io.js +89 -0
  85. package/dist/services/form-layout-io.js.map +1 -0
  86. package/dist/services/form-layout-source/artifact.d.ts +8 -0
  87. package/dist/services/form-layout-source/artifact.d.ts.map +1 -0
  88. package/dist/services/form-layout-source/artifact.js +52 -0
  89. package/dist/services/form-layout-source/artifact.js.map +1 -0
  90. package/dist/services/form-layout-source/binding.d.ts +10 -0
  91. package/dist/services/form-layout-source/binding.d.ts.map +1 -0
  92. package/dist/services/form-layout-source/binding.js +43 -0
  93. package/dist/services/form-layout-source/binding.js.map +1 -0
  94. package/dist/services/form-layout-source/compile.d.ts +7 -0
  95. package/dist/services/form-layout-source/compile.d.ts.map +1 -0
  96. package/dist/services/form-layout-source/compile.js +262 -0
  97. package/dist/services/form-layout-source/compile.js.map +1 -0
  98. package/dist/services/form-layout-source/creation.d.ts +18 -0
  99. package/dist/services/form-layout-source/creation.d.ts.map +1 -0
  100. package/dist/services/form-layout-source/creation.js +42 -0
  101. package/dist/services/form-layout-source/creation.js.map +1 -0
  102. package/dist/services/form-layout-source/excel-extractor.d.ts +7 -0
  103. package/dist/services/form-layout-source/excel-extractor.d.ts.map +1 -0
  104. package/dist/services/form-layout-source/excel-extractor.js +342 -0
  105. package/dist/services/form-layout-source/excel-extractor.js.map +1 -0
  106. package/dist/services/form-layout-source/image-border.d.ts +9 -0
  107. package/dist/services/form-layout-source/image-border.d.ts.map +1 -0
  108. package/dist/services/form-layout-source/image-border.js +128 -0
  109. package/dist/services/form-layout-source/image-border.js.map +1 -0
  110. package/dist/services/form-layout-source/image-observation.d.ts +14 -0
  111. package/dist/services/form-layout-source/image-observation.d.ts.map +1 -0
  112. package/dist/services/form-layout-source/image-observation.js +90 -0
  113. package/dist/services/form-layout-source/image-observation.js.map +1 -0
  114. package/dist/services/form-layout-source/image-review.d.ts +32 -0
  115. package/dist/services/form-layout-source/image-review.d.ts.map +1 -0
  116. package/dist/services/form-layout-source/image-review.js +266 -0
  117. package/dist/services/form-layout-source/image-review.js.map +1 -0
  118. package/dist/services/form-layout-source/image-style.d.ts +16 -0
  119. package/dist/services/form-layout-source/image-style.d.ts.map +1 -0
  120. package/dist/services/form-layout-source/image-style.js +539 -0
  121. package/dist/services/form-layout-source/image-style.js.map +1 -0
  122. package/dist/services/form-layout-source/json.d.ts +3 -0
  123. package/dist/services/form-layout-source/json.d.ts.map +1 -0
  124. package/dist/services/form-layout-source/json.js +33 -0
  125. package/dist/services/form-layout-source/json.js.map +1 -0
  126. package/dist/services/form-layout-source/presentation.d.ts +23 -0
  127. package/dist/services/form-layout-source/presentation.d.ts.map +1 -0
  128. package/dist/services/form-layout-source/presentation.js +174 -0
  129. package/dist/services/form-layout-source/presentation.js.map +1 -0
  130. package/dist/services/form-layout-source/preview.d.ts +4 -0
  131. package/dist/services/form-layout-source/preview.d.ts.map +1 -0
  132. package/dist/services/form-layout-source/preview.js +49 -0
  133. package/dist/services/form-layout-source/preview.js.map +1 -0
  134. package/dist/services/form-layout-source/schema.d.ts +20 -0
  135. package/dist/services/form-layout-source/schema.d.ts.map +1 -0
  136. package/dist/services/form-layout-source/schema.js +149 -0
  137. package/dist/services/form-layout-source/schema.js.map +1 -0
  138. package/dist/services/form-layout-source/source-grid.d.ts +8 -0
  139. package/dist/services/form-layout-source/source-grid.d.ts.map +1 -0
  140. package/dist/services/form-layout-source/source-grid.js +61 -0
  141. package/dist/services/form-layout-source/source-grid.js.map +1 -0
  142. package/dist/services/form-layout-source/types.d.ts +242 -0
  143. package/dist/services/form-layout-source/types.d.ts.map +1 -0
  144. package/dist/services/form-layout-source/types.js +2 -0
  145. package/dist/services/form-layout-source/types.js.map +1 -0
  146. package/dist/services/form-layout-source/verify.d.ts +14 -0
  147. package/dist/services/form-layout-source/verify.d.ts.map +1 -0
  148. package/dist/services/form-layout-source/verify.js +226 -0
  149. package/dist/services/form-layout-source/verify.js.map +1 -0
  150. package/dist/services/form-obj-meta.d.ts +72 -0
  151. package/dist/services/form-obj-meta.d.ts.map +1 -0
  152. package/dist/services/form-obj-meta.js +103 -0
  153. package/dist/services/form-obj-meta.js.map +1 -0
  154. package/dist/services/validate-help.d.ts +25 -0
  155. package/dist/services/validate-help.d.ts.map +1 -0
  156. package/dist/services/validate-help.js +29 -0
  157. package/dist/services/validate-help.js.map +1 -0
  158. package/package.json +3 -1
  159. package/skill-docs/SKILL.md +15 -6
  160. package/skill-docs/_catalog.md +1 -0
  161. package/skill-docs/actionflows/references/components/document/DocumentSave.md +17 -17
  162. package/skill-docs/actionflows/references/components/workflow/ApproveCompletelyDelete.md +29 -0
  163. package/skill-docs/actionflows/references/components/workflow/ApproveDelete.md +1 -1
  164. package/skill-docs/assets/schemas/image-style-observation.schema.json +1355 -0
  165. package/skill-docs/references/common/guide-plan-template.md +3 -0
  166. package/skill-docs/references/common/ref-cli-commands.md +17 -4
  167. package/skill-docs/references/form/guide-create-form.md +2 -0
  168. package/skill-docs/references/form/guide-field-linkage.md +140 -55
  169. package/skill-docs/references/form/guide-form-layout-planning.md +6 -0
  170. package/skill-docs/references/form/guide-form-layout-source.md +366 -0
  171. package/skill-docs/references/form/guide-form-view.md +1 -1
  172. package/skill-docs/references/form/guide-formula-linkage.md +44 -1
@@ -0,0 +1,342 @@
1
+ import { readFileSync, statSync } from 'node:fs';
2
+ import { resolve, posix } from 'node:path';
3
+ import JSZip from 'jszip';
4
+ import { DOMParser } from '@xmldom/xmldom';
5
+ import { assert, byteHash, LIMITS, validateSheet, validateSource } from './schema.js';
6
+ const children = (node, name) => Array.from(node?.childNodes || []).filter((n) => n.nodeType === 1 && (!name || n.localName === name));
7
+ const child = (node, name) => children(node, name)[0];
8
+ const attr = (node, name) => node?.getAttribute(name) || '';
9
+ const num = (node, name, fallback) => attr(node, name) === '' ? fallback : Number(attr(node, name));
10
+ const enabled = (node) => !!node && attr(node, 'val') !== '0' && attr(node, 'val') !== 'false';
11
+ const all = (node, name) => Array.from(node?.getElementsByTagNameNS('*', name) || []);
12
+ const BORDER = { hair: 1, thin: 1, medium: 2, dashed: 3, dashDot: 3, dashDotDot: 3, dotted: 4, thick: 5, double: 6, mediumDashed: 8, mediumDashDot: 8, mediumDashDotDot: 8, slantDashDot: 8 };
13
+ const INDEXED = ['000000', 'FFFFFF', 'FF0000', '00FF00', '0000FF', 'FFFF00', 'FF00FF', '00FFFF', '000000', 'FFFFFF', 'FF0000', '00FF00', '0000FF', 'FFFF00', 'FF00FF', '00FFFF'];
14
+ export function cellPoint(ref) {
15
+ const match = /^([A-Z]+)([1-9]\d*)$/i.exec(ref);
16
+ assert(match, `无效单元格引用 ${ref}`);
17
+ let col = 0;
18
+ for (const letter of match[1].toUpperCase())
19
+ col = col * 26 + letter.charCodeAt(0) - 64;
20
+ return { row: Number(match[2]) - 1, col: col - 1 };
21
+ }
22
+ function range(ref) {
23
+ const [first, last] = ref.split(':');
24
+ const a = cellPoint(first);
25
+ const b = cellPoint(last || first);
26
+ assert(b.row >= a.row && b.col >= a.col, `无效范围 ${ref}`);
27
+ return { ...a, rowCount: b.row - a.row + 1, colCount: b.col - a.col + 1 };
28
+ }
29
+ /** 在解压之前检查 ZIP 中央目录大小与路径,JSZip 仅在限额闭合后读取条目。 */
30
+ function preflight(bytes) {
31
+ assert(bytes.length <= LIMITS.bytes, 'Excel 文件超过 20 MiB');
32
+ let end = -1;
33
+ for (let i = bytes.length - 22; i >= Math.max(0, bytes.length - 65557); i--)
34
+ if (bytes.readUInt32LE(i) === 0x06054b50 && i + 22 + bytes.readUInt16LE(i + 20) === bytes.length) {
35
+ end = i;
36
+ break;
37
+ }
38
+ assert(end >= 0, '只支持完整 XLSX ZIP 文件');
39
+ const count = bytes.readUInt16LE(end + 10);
40
+ let offset = bytes.readUInt32LE(end + 16);
41
+ let total = 0;
42
+ assert(count > 0 && count <= LIMITS.entries && bytes.readUInt16LE(end + 4) === 0 && bytes.readUInt16LE(end + 6) === 0, 'ZIP 条目或分卷无效');
43
+ const names = new Set();
44
+ for (let i = 0; i < count; i++) {
45
+ assert(offset + 46 <= end && bytes.readUInt32LE(offset) === 0x02014b50, 'ZIP 中央目录无效');
46
+ const size = bytes.readUInt32LE(offset + 24);
47
+ const length = bytes.readUInt16LE(offset + 28);
48
+ const extra = bytes.readUInt16LE(offset + 30);
49
+ const comment = bytes.readUInt16LE(offset + 32);
50
+ assert(offset + 46 + length + extra + comment <= end, 'ZIP 条目截断');
51
+ const name = bytes.subarray(offset + 46, offset + 46 + length).toString('utf8');
52
+ assert(!name.startsWith('/') && !name.includes('\\') && !name.split('/').includes('..') && !names.has(name), 'ZIP 路径越界或重复');
53
+ names.add(name);
54
+ assert(!/vbaProject|\.bin$/i.test(name) && !(bytes.readUInt16LE(offset + 8) & 1), '不支持宏或加密工作簿');
55
+ total += size;
56
+ assert(size <= LIMITS.expanded && total <= LIMITS.expanded, 'ZIP 展开大小超限');
57
+ offset += 46 + length + extra + comment;
58
+ }
59
+ }
60
+ async function xml(zip, name, optional = false) {
61
+ const file = zip.file(name);
62
+ if (optional && !file)
63
+ return null;
64
+ assert(file, `XLSX 缺少 ${name}`);
65
+ const text = await file.async('string');
66
+ assert(!/<!DOCTYPE|<!ENTITY/i.test(text), `XML 不允许外部实体 ${name}`);
67
+ let error = '';
68
+ const parsed = new DOMParser({ errorHandler: { warning: (s) => { error = s; }, error: (s) => { error = s; }, fatalError: (s) => { error = s; } } }).parseFromString(text, 'application/xml');
69
+ assert(!error && parsed.documentElement, `XML 格式错误 ${name}`);
70
+ return parsed;
71
+ }
72
+ function color(node, theme, unsupported) {
73
+ if (!node)
74
+ return undefined;
75
+ let hex = attr(node, 'rgb').slice(-6);
76
+ if (!hex && attr(node, 'theme') !== '')
77
+ hex = theme[Number(attr(node, 'theme'))];
78
+ if (!hex && attr(node, 'indexed') !== '')
79
+ hex = INDEXED[Number(attr(node, 'indexed'))];
80
+ if (!hex && attr(node, 'auto') === '1')
81
+ hex = '000000';
82
+ if (!hex || !/^[0-9a-f]{6}$/i.test(hex)) {
83
+ unsupported.push('无法解析的源颜色');
84
+ return undefined;
85
+ }
86
+ const tint = num(node, 'tint', 0);
87
+ if (tint)
88
+ hex = [0, 2, 4].map(i => { const n = parseInt(hex.slice(i, i + 2), 16); return Math.round(Math.max(0, Math.min(255, tint < 0 ? n * (1 + tint) : n * (1 - tint) + 255 * tint))).toString(16).padStart(2, '0'); }).join('');
89
+ return `#${hex.toUpperCase()}`;
90
+ }
91
+ function styleOf(index, tables, theme, unsupported) {
92
+ const xf = tables.xfs[index];
93
+ assert(xf || index === 0, `样式索引不存在 ${index}`);
94
+ if (!xf)
95
+ return {};
96
+ const style = {};
97
+ const font = tables.fonts[num(xf, 'fontId', 0)];
98
+ if (font) {
99
+ const size = Math.round(num(child(font, 'sz'), 'val', 11) * 96 / 72 * 10) / 10;
100
+ const family = attr(child(font, 'name'), 'val') || 'Calibri';
101
+ style.font = `${enabled(child(font, 'i')) ? 'italic ' : ''}${enabled(child(font, 'b')) ? '700 ' : ''}${size}px ${family}`;
102
+ const fg = color(child(font, 'color'), theme, unsupported);
103
+ if (fg)
104
+ style.foreColor = fg;
105
+ if (enabled(child(font, 'u')))
106
+ style.textDecoration = 1;
107
+ if (child(font, 'vertAlign') || child(font, 'strike'))
108
+ unsupported.push('字体上标、下标或删除线');
109
+ }
110
+ const fill = tables.fills[num(xf, 'fillId', 0)];
111
+ const pattern = child(fill, 'patternFill');
112
+ if (child(fill, 'gradientFill'))
113
+ unsupported.push('渐变填充');
114
+ if (pattern && attr(pattern, 'patternType') === 'solid') {
115
+ const bg = color(child(pattern, 'fgColor'), theme, unsupported);
116
+ if (bg)
117
+ style.backColor = bg;
118
+ }
119
+ else if (pattern && !['', 'none', 'gray125'].includes(attr(pattern, 'patternType')))
120
+ unsupported.push(`图案填充 ${attr(pattern, 'patternType')}`);
121
+ const border = tables.borders[num(xf, 'borderId', 0)];
122
+ for (const [key, side] of [['borderLeft', 'left'], ['borderRight', 'right'], ['borderTop', 'top'], ['borderBottom', 'bottom']]) {
123
+ const edge = child(border, side);
124
+ const kind = attr(edge, 'style');
125
+ if (!kind)
126
+ continue;
127
+ if (!BORDER[kind]) {
128
+ unsupported.push(`未知边框 ${kind}`);
129
+ continue;
130
+ }
131
+ style[key] = { style: BORDER[kind], color: color(child(edge, 'color'), theme, unsupported) || '#000000' };
132
+ }
133
+ if (attr(child(border, 'diagonal'), 'style'))
134
+ unsupported.push('斜线边框');
135
+ const align = child(xf, 'alignment');
136
+ for (const [native, xmlKey, values] of [['hAlign', 'horizontal', ['left', 'center', 'right', 'general']], ['vAlign', 'vertical', ['top', 'center', 'bottom']]]) {
137
+ const value = attr(align, xmlKey);
138
+ if (!value)
139
+ continue;
140
+ const idx = values.indexOf(value);
141
+ if (idx < 0)
142
+ unsupported.push(`对齐 ${xmlKey}=${value}`);
143
+ else
144
+ style[native] = idx;
145
+ }
146
+ if (attr(align, 'wrapText') !== '')
147
+ style.wordWrap = attr(align, 'wrapText') === '1';
148
+ if (attr(align, 'indent') !== '')
149
+ style.textIndent = num(align, 'indent', 0);
150
+ if (num(align, 'textRotation', 0) || attr(align, 'shrinkToFit') === '1')
151
+ unsupported.push('旋转文字或缩小字体');
152
+ if (num(xf, 'numFmtId', 0) !== 0)
153
+ unsupported.push(`数值格式 ${num(xf, 'numFmtId', 0)}(保留源值,未映射显示格式)`);
154
+ if (num(xf, 'xfId', 0) !== 0 || child(xf, 'protection'))
155
+ unsupported.push('命名样式关联或单元格保护未进入原生投影');
156
+ return style;
157
+ }
158
+ export async function extractExcelSource(path) {
159
+ assert(statSync(path).size <= LIMITS.bytes, 'Excel 文件超过 20 MiB');
160
+ const bytes = readFileSync(path);
161
+ preflight(bytes);
162
+ const zip = await JSZip.loadAsync(bytes);
163
+ const workbook = await xml(zip, 'xl/workbook.xml');
164
+ const relationships = await xml(zip, 'xl/_rels/workbook.xml.rels');
165
+ const rels = new Map();
166
+ for (const rel of all(relationships, 'Relationship')) {
167
+ if (attr(rel, 'TargetMode') === 'External')
168
+ continue;
169
+ const target = attr(rel, 'Target');
170
+ const normalized = target.startsWith('/') ? target.slice(1) : posix.normalize(posix.join('xl', target));
171
+ assert(normalized.startsWith('xl/') && !normalized.split('/').includes('..'), '工作簿关联越界');
172
+ rels.set(attr(rel, 'Id'), normalized);
173
+ }
174
+ const shared = await xml(zip, 'xl/sharedStrings.xml', true);
175
+ const sharedItems = all(shared, 'si');
176
+ const texts = sharedItems.map(si => all(si, 't').map(t => t.textContent || '').join(''));
177
+ const styles = await xml(zip, 'xl/styles.xml', true);
178
+ const styleRoot = styles?.documentElement;
179
+ const tables = { fonts: children(child(styleRoot, 'fonts')), fills: children(child(styleRoot, 'fills')), borders: children(child(styleRoot, 'borders')), xfs: children(child(styleRoot, 'cellXfs')) };
180
+ const themeXml = await xml(zip, 'xl/theme/theme1.xml', true);
181
+ const theme = children(all(themeXml, 'clrScheme')[0]).map(n => { const c = children(n)[0]; return attr(c, 'val') || attr(c, 'lastClr'); });
182
+ // OOXML 的主题索引先 light1/dark1,主题表本身却先 dark1/light1。
183
+ if (theme.length >= 4)
184
+ [theme[0], theme[1], theme[2], theme[3]] = [theme[1], theme[0], theme[3], theme[2]];
185
+ const unsupported = [];
186
+ const sheets = [];
187
+ let workbookCellCount = 0;
188
+ const sheetNodes = all(workbook, 'sheet');
189
+ assert(sheetNodes.length > 0 && sheetNodes.length <= 50, '工作表数量超限');
190
+ for (const sheetNode of sheetNodes) {
191
+ const name = attr(sheetNode, 'name');
192
+ const part = rels.get(attr(sheetNode, 'r:id'));
193
+ assert(part, `Sheet 缺少关联 ${name}`);
194
+ const doc = await xml(zip, part);
195
+ const spans = all(doc, 'mergeCell').map(n => range(attr(n, 'ref')));
196
+ const cells = [];
197
+ let rowCount = 1;
198
+ let columnCount = 1;
199
+ const rowsXml = all(doc, 'row');
200
+ const colsXml = all(doc, 'col');
201
+ assert(rowsXml.length <= LIMITS.rows && colsXml.length <= 16384, '行列元数据数量超限');
202
+ const rowsByIndex = new Map();
203
+ for (const row of rowsXml) {
204
+ const index = num(row, 'r', 1);
205
+ assert(!rowsByIndex.has(index), '重复行元数据');
206
+ rowsByIndex.set(index, row);
207
+ }
208
+ const colsByIndex = [];
209
+ for (const col of colsXml) {
210
+ const min = num(col, 'min', 1), max = num(col, 'max', 1);
211
+ assert(Number.isInteger(min) && Number.isInteger(max) && min > 0 && max >= min && max <= 16384, '列元数据范围无效');
212
+ for (let c = min - 1; c < Math.min(max, LIMITS.cols); c++) {
213
+ assert(!colsByIndex[c], '重复列元数据');
214
+ colsByIndex[c] = col;
215
+ }
216
+ }
217
+ for (const row of rowsXml)
218
+ for (const c of children(row, 'c')) {
219
+ assert(++workbookCellCount <= LIMITS.cells, '真实工作簿总单元格数量超限');
220
+ const p = cellPoint(attr(c, 'r'));
221
+ assert(p.row < LIMITS.rows && p.col < LIMITS.cols, `真实单元格超限 ${name}!${attr(c, 'r')}`);
222
+ rowCount = Math.max(rowCount, p.row + 1);
223
+ columnCount = Math.max(columnCount, p.col + 1);
224
+ const items = [];
225
+ const inherited = colsByIndex[p.col];
226
+ const index = num(c, 's', num(row, 's', num(inherited, 'style', 0)));
227
+ const target = { row: String(p.row), col: String(p.col), style: styleOf(index, tables, theme, items) };
228
+ const type = attr(c, 't');
229
+ const value = child(c, 'v')?.textContent;
230
+ if (type === 's') {
231
+ assert(/^\d+$/.test(value || '') && texts[Number(value)] !== undefined, '共享字符串索引无效');
232
+ target.value = texts[Number(value)];
233
+ }
234
+ else if (type === 'inlineStr')
235
+ target.value = all(child(c, 'is'), 't').map(t => t.textContent || '').join('');
236
+ else if (value !== undefined)
237
+ target.value = String(value);
238
+ const formula = child(c, 'f');
239
+ if (formula) {
240
+ if (/(?:DISPIMG|IMAGE)\s*\(/i.test(formula.textContent || '')) {
241
+ delete target.value;
242
+ unsupported.push(`${name}!${attr(c, 'r')}: 图片公式省略`);
243
+ }
244
+ else if (attr(formula, 't') && attr(formula, 't') !== 'normal')
245
+ unsupported.push(`${name}!${attr(c, 'r')}: 共享或数组公式`);
246
+ else
247
+ target.formula = formula.textContent || '';
248
+ }
249
+ if (type === 'e')
250
+ unsupported.push(`${name}!${attr(c, 'r')}: 源公式错误值`);
251
+ if (all(c, 'rPr').length || type === 's' && all(sharedItems[Number(value)], 'rPr').length)
252
+ unsupported.push(`${name}!${attr(c, 'r')}: 富文本局部样式未进入原生投影`);
253
+ items.forEach(item => unsupported.push(`${name}!${attr(c, 'r')}: ${item}`));
254
+ cells.push(target);
255
+ assert(cells.length <= LIMITS.cells, '真实单元格总数超限');
256
+ }
257
+ for (const row of rowsXml) {
258
+ const r = num(row, 'r', 1);
259
+ assert(Number.isInteger(r) && r > 0, '行元数据坐标无效');
260
+ if (r <= LIMITS.rows)
261
+ rowCount = Math.max(rowCount, r);
262
+ else
263
+ unsupported.push(`${name}: 超出布局范围的行元数据 ${r}`);
264
+ }
265
+ for (const span of spans) {
266
+ rowCount = Math.max(rowCount, span.row + span.rowCount);
267
+ columnCount = Math.max(columnCount, span.col + span.colCount);
268
+ }
269
+ const dim = attr(all(doc, 'dimension')[0], 'ref');
270
+ if (dim) {
271
+ const d = range(dim);
272
+ if (d.row + d.rowCount <= LIMITS.rows && d.col + d.colCount <= LIMITS.cols) {
273
+ rowCount = Math.max(rowCount, d.row + d.rowCount);
274
+ columnCount = Math.max(columnCount, d.col + d.colCount);
275
+ }
276
+ }
277
+ assert(rowCount <= LIMITS.rows && columnCount <= LIMITS.cols, '源合并区域超限');
278
+ const fmt = all(doc, 'sheetFormatPr')[0];
279
+ const rows = Array.from({ length: rowCount }, () => ({ size: num(fmt, 'defaultRowHeight', 15) * 96 / 72, visible: true }));
280
+ const columns = Array.from({ length: columnCount }, () => ({ size: Math.floor(num(fmt, 'defaultColWidth', 8.43) * 7 + 5), visible: true }));
281
+ for (const row of rowsXml) {
282
+ const r = num(row, 'r', 1) - 1;
283
+ if (r >= 0 && r < rowCount)
284
+ rows[r] = { size: num(row, 'ht', 15) * 96 / 72, visible: attr(row, 'hidden') !== '1' };
285
+ }
286
+ for (const col of colsXml)
287
+ for (let c = Math.max(0, num(col, 'min', 1) - 1); c < Math.min(columnCount, num(col, 'max', 1)); c++)
288
+ columns[c] = { size: Math.floor(num(col, 'width', 8.43) * 7 + 5), visible: attr(col, 'hidden') !== '1' };
289
+ const existing = new Set(cells.map(c => `${c.row},${c.col}`));
290
+ for (let r = 0; r < rowCount; r++) {
291
+ const rowStyle = rowsByIndex.get(r + 1);
292
+ for (let c = 0; c < columnCount; c++) {
293
+ if (existing.has(`${r},${c}`))
294
+ continue;
295
+ const colStyle = colsByIndex[c];
296
+ const index = num(rowStyle, 's', num(colStyle, 'style', 0));
297
+ if (!index)
298
+ continue;
299
+ assert(++workbookCellCount <= LIMITS.cells, '继承行列样式后单元格数量超限');
300
+ const items = [];
301
+ cells.push({ row: String(r), col: String(c), style: styleOf(index, tables, theme, items) });
302
+ items.forEach(item => unsupported.push(`${name}!${r},${c}: ${item}`));
303
+ }
304
+ }
305
+ for (const item of ['drawing', 'legacyDrawing', 'conditionalFormatting', 'dataValidations', 'hyperlinks', 'tableParts', 'sheetProtection', 'pane', 'autoFilter'])
306
+ if (all(doc, item).length)
307
+ unsupported.push(`${name}: ${item} 未进入原生样式投影`);
308
+ if ([...rowsXml, ...colsXml].some(n => num(n, 'outlineLevel', 0) || attr(n, 'collapsed') === '1'))
309
+ unsupported.push(`${name}: 行列分组未进入原生样式投影`);
310
+ validateSheet({ name, rowCount, columnCount, rows, columns, spans, cells });
311
+ // 合并单元格的语义只出现在锚点;边缘样式保留并补到锚点的外边框。
312
+ const byPosition = new Map(cells.map(c => [`${Number(c.row)},${Number(c.col)}`, c]));
313
+ for (const span of spans) {
314
+ let anchor = byPosition.get(`${span.row},${span.col}`);
315
+ if (!anchor) {
316
+ assert(++workbookCellCount <= LIMITS.cells, '合并锚点补齐后单元格数量超限');
317
+ anchor = { row: String(span.row), col: String(span.col), style: {} };
318
+ cells.push(anchor);
319
+ byPosition.set(`${span.row},${span.col}`, anchor);
320
+ }
321
+ for (let r = span.row; r < span.row + span.rowCount; r++)
322
+ for (let c = span.col; c < span.col + span.colCount; c++) {
323
+ const cell = byPosition.get(`${r},${c}`);
324
+ if (!cell)
325
+ continue;
326
+ for (const [key, atEdge] of [['borderLeft', c === span.col], ['borderRight', c === span.col + span.colCount - 1], ['borderTop', r === span.row], ['borderBottom', r === span.row + span.rowCount - 1]]) {
327
+ if (atEdge && !anchor.style[key] && cell.style[key])
328
+ anchor.style[key] = { ...cell.style[key] };
329
+ }
330
+ if (cell !== anchor) {
331
+ delete cell.value;
332
+ delete cell.formula;
333
+ }
334
+ }
335
+ }
336
+ sheets.push({ name, rowCount, columnCount, rows, columns, spans, cells });
337
+ }
338
+ const source = { schemaVersion: 'e10.layout-source/v1', sourceType: 'excel', sourceHash: byteHash(bytes), sourceFile: resolve(path), sheets, unsupported: [...new Set(unsupported)] };
339
+ validateSource(source);
340
+ return source;
341
+ }
342
+ //# sourceMappingURL=excel-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excel-extractor.js","sourceRoot":"","sources":["../../../src/services/form-layout-source/excel-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ImageBorderProjection, ImageBorderReport, ImageTableBorder, LayoutSource, ObservedBorder } from './types.js';
2
+ export declare function nativeBorderObservation(border: any): ObservedBorder | undefined;
3
+ /** 表格线粗细清单按原生渲染契约显示;控件输入框边框另列,不能混为表格线。 */
4
+ export declare function summarizeGridBorders(sheets: any[], tables?: ImageTableBorder[]): any[];
5
+ export declare function assertBorderObservation(source: LayoutSource, allowUnsupported?: boolean): void;
6
+ /** 只按明确声明的表格外框投影;不为整页、标题、编号或空白列推定边框。 */
7
+ export declare function projectImageBorders(source: LayoutSource, grid: any, sheet: string, removed?: Set<number>): ImageBorderProjection;
8
+ export declare function imageBorderReport(projection?: ImageBorderProjection, grid?: any): ImageBorderReport;
9
+ //# sourceMappingURL=image-border.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-border.d.ts","sourceRoot":"","sources":["../../../src/services/form-layout-source/image-border.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI3H,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,GAAG,GAAG,cAAc,GAAG,SAAS,CAG/E;AAED,0CAA0C;AAC1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,gBAAgB,EAAE,GAAG,GAAG,EAAE,CAWtF;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,EAAE,gBAAgB,UAAQ,GAAG,IAAI,CAI5F;AAED,wCAAwC;AACxC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,cAAoB,GAAG,qBAAqB,CA+DtI;AAED,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,qBAAqB,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,iBAAiB,CAOnG"}
@@ -0,0 +1,128 @@
1
+ import { assert, clone, stable } from './schema.js';
2
+ import { observedNative } from './image-style.js';
3
+ export function nativeBorderObservation(border) {
4
+ const modes = { 1: [1, 'solid'], 2: [2, 'solid'], 5: [3, 'solid'], 3: [1, 'dashed'], 8: [2, 'dashed'], 4: [2, 'dotted'], 6: [2, 'double'] };
5
+ const mode = modes[border?.style];
6
+ return mode ? { color: border.color, width: mode[0], line: mode[1] } : undefined;
7
+ }
8
+ /** 表格线粗细清单按原生渲染契约显示;控件输入框边框另列,不能混为表格线。 */
9
+ export function summarizeGridBorders(sheets, tables) {
10
+ const groups = new Map();
11
+ for (const sheet of sheets)
12
+ for (const cell of sheet.cells)
13
+ for (const side of ['borderTop', 'borderRight', 'borderBottom', 'borderLeft']) {
14
+ const border = cell.style?.[side];
15
+ if (!border)
16
+ continue;
17
+ const observed = nativeBorderObservation(border);
18
+ const scope = tables === undefined ? 'UNCLASSIFIED' : tables.some(t => t.sheet === sheet.name && Number(cell.row) >= t.row && Number(cell.row) < t.row + t.rowCount && Number(cell.col) >= t.col && Number(cell.col) < t.col + t.colCount) ? 'TABLE' : 'OUTSIDE_TABLE';
19
+ const appearance = { scope, direction: ['borderTop', 'borderBottom'].includes(side) ? 'HORIZONTAL' : 'VERTICAL', color: border.color, width: observed ? observed.width : null, line: observed?.line || 'unknown', nativeStyle: border.style };
20
+ const key = stable(appearance), group = groups.get(key) || { ...appearance, count: 0, examples: [] };
21
+ group.count++;
22
+ if (group.examples.length < 3)
23
+ group.examples.push({ sheet: sheet.name, row: Number(cell.row), col: Number(cell.col), side });
24
+ groups.set(key, group);
25
+ }
26
+ return [...groups.values()];
27
+ }
28
+ export function assertBorderObservation(source, allowUnsupported = false) {
29
+ if (source.sourceType !== 'image')
30
+ return;
31
+ assert(source.imageStyles?.tableBorders !== undefined, '[IMAGE_BORDER_OBSERVATION_REQUIRED] 请逐张记录表格正文范围及 top/right/bottom/left 四侧边框;明确没有表格时记录 tableBorders:[],4% 留白不能承接或代替外边框');
32
+ assert(allowUnsupported || !source.imageStyles.tableBorders.some(t => [t.top, t.right, t.bottom, t.left].includes('unknown')), '[IMAGE_BORDER_UNCERTAIN] 外边框尚有 unknown,需重新观察或取得用户明确接受后使用 allowUnsupported');
33
+ }
34
+ /** 只按明确声明的表格外框投影;不为整页、标题、编号或空白列推定边框。 */
35
+ export function projectImageBorders(source, grid, sheet, removed = new Set()) {
36
+ const declared = source.imageStyles?.tableBorders;
37
+ const projection = { observed: declared !== undefined, tables: [], issues: [], entries: [] };
38
+ const cells = new Map(grid.cells.map((c) => [`${Number(c.row)},${Number(c.col)}`, c]));
39
+ const get = (row, col) => {
40
+ const key = `${row},${col}`;
41
+ let cell = cells.get(key);
42
+ if (!cell) {
43
+ cell = { row: String(row), col: String(col), style: {} };
44
+ cells.set(key, cell);
45
+ grid.cells.push(cell);
46
+ }
47
+ cell.style ||= {};
48
+ return cell;
49
+ };
50
+ const expected = new Map(), lines = new Map();
51
+ const spans = new Map();
52
+ let covered = 0;
53
+ for (const span of grid.spans || []) {
54
+ assert((covered += span.rowCount * span.colCount) <= 100000, '合并边框总面积超限');
55
+ for (let r = span.row; r < span.row + span.rowCount; r++)
56
+ for (let c = span.col; c < span.col + span.colCount; c++)
57
+ spans.set(`${r},${c}`, span);
58
+ }
59
+ const write = (row, col, side, border) => {
60
+ if (row < 0 || row >= grid.rowCount || col < 0 || col >= grid.columnCount)
61
+ return;
62
+ const key = `${row},${col}:${side}`, previous = expected.get(key);
63
+ assert(!previous || stable(previous.expected) === stable(border), '相邻表格外边框声明冲突');
64
+ const cell = get(row, col);
65
+ if (border === null)
66
+ delete cell.style[side];
67
+ else
68
+ cell.style[side] = clone(border);
69
+ expected.set(key, { row, col, side, expected: border });
70
+ };
71
+ let work = 0;
72
+ for (const raw of declared || []) {
73
+ assert(raw.sheet === sheet, '外边框包含未选择的 Sheet,请分别编译');
74
+ assert(!Array.from(removed).some(r => r >= raw.row && r < raw.row + raw.rowCount), '表格外框跨越明细迁移行,请按主表/明细分别观察边框');
75
+ const table = { ...clone(raw), row: raw.row - [...removed].filter(r => r < raw.row).length };
76
+ projection.tables.push(table);
77
+ assert((work += 2 * (table.rowCount + table.colCount)) <= 100000, '表格外边框总长度超限');
78
+ for (const span of grid.spans || []) {
79
+ const overlap = span.row < table.row + table.rowCount && span.row + span.rowCount > table.row && span.col < table.col + table.colCount && span.col + span.colCount > table.col;
80
+ assert(!overlap || span.row >= table.row && span.col >= table.col && span.row + span.rowCount <= table.row + table.rowCount && span.col + span.colCount <= table.col + table.colCount, '表格外框切断了合并区域');
81
+ }
82
+ for (const side of ['top', 'right', 'bottom', 'left']) {
83
+ const value = table[side];
84
+ if (value === 'unknown') {
85
+ projection.issues.push(`${sheet}!${raw.row},${raw.col} ${side} 外边框未识别`);
86
+ continue;
87
+ }
88
+ const nativeSide = `border${side[0].toUpperCase()}${side.slice(1)}`;
89
+ const border = value === 'none' ? null : observedNative({ border: value }).borderTop;
90
+ const vertical = side === 'left' || side === 'right', length = vertical ? table.rowCount : table.colCount;
91
+ for (let i = 0; i < length; i++) {
92
+ const row = table.row + (vertical ? i : side === 'bottom' ? table.rowCount - 1 : 0);
93
+ const col = table.col + (vertical ? side === 'right' ? table.colCount - 1 : 0 : i);
94
+ const line = vertical ? `v:${col + Number(side === 'right')}:${row}` : `h:${row + Number(side === 'bottom')}:${col}`;
95
+ assert(!lines.has(line) || stable(lines.get(line)) === stable(border), '同一条可见边线有互相冲突的外框声明');
96
+ lines.set(line, border);
97
+ write(row, col, nativeSide, border);
98
+ const span = spans.get(`${row},${col}`);
99
+ if (span)
100
+ write(span.row, span.col, nativeSide, border);
101
+ // 明确无边框时,同时去掉相邻格对应边,防止共享边线仍被相邻格绘制。
102
+ if (border === null) {
103
+ const neighborRow = row + (side === 'top' ? -1 : side === 'bottom' ? 1 : 0), neighborCol = col + (side === 'left' ? -1 : side === 'right' ? 1 : 0);
104
+ const opposite = { top: 'borderBottom', right: 'borderLeft', bottom: 'borderTop', left: 'borderRight' }[side];
105
+ write(neighborRow, neighborCol, opposite, null);
106
+ const adjacent = spans.get(`${neighborRow},${neighborCol}`);
107
+ if (adjacent) {
108
+ assert(vertical ? adjacent.row >= table.row && adjacent.row + adjacent.rowCount <= table.row + table.rowCount : adjacent.col >= table.col && adjacent.col + adjacent.colCount <= table.col + table.colCount, '无边框声明会影响相邻跨区域合并格,请拆分观察范围');
109
+ write(adjacent.row, adjacent.col, opposite, null);
110
+ }
111
+ }
112
+ }
113
+ }
114
+ }
115
+ projection.entries = [...expected.values()];
116
+ return projection;
117
+ }
118
+ export function imageBorderReport(projection, grid) {
119
+ const base = { tableCount: projection?.tables.length || 0, expectedSegments: projection?.entries.length || 0, matchedSegments: 0, differences: [], issues: clone(projection?.issues || []) };
120
+ if (!projection?.observed)
121
+ return { ...base, status: 'NOT_OBSERVED' };
122
+ if (!grid)
123
+ return { ...base, status: projection.issues.length ? 'INCOMPLETE' : 'COMPILED' };
124
+ const cells = new Map((grid.cells || []).map((c) => [`${Number(c.row)},${Number(c.col)}`, c]));
125
+ const differences = projection.entries.filter(e => stable(cells.get(`${e.row},${e.col}`)?.style?.[e.side] ?? null) !== stable(e.expected));
126
+ return { ...base, matchedSegments: projection.entries.length - differences.length, differences: differences.slice(0, 100).map(e => ({ ...clone(e), actual: clone(cells.get(`${e.row},${e.col}`)?.style?.[e.side] ?? null) })), status: projection.issues.length ? 'INCOMPLETE' : differences.length ? 'MISMATCH' : 'VERIFIED' };
127
+ }
128
+ //# sourceMappingURL=image-border.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-border.js","sourceRoot":"","sources":["../../../src/services/form-layout-source/image-border.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { LayoutSource } from './types.js';
2
+ /** 读取头部像素尺寸,不依赖 OCR、网络或图像解码服务。 */
3
+ export declare function imageDimensions(path: string): {
4
+ imageWidth: number;
5
+ imageHeight: number;
6
+ };
7
+ export declare function verifyImageGeometryFile(path: string, source: LayoutSource): void;
8
+ /** 图片的语义来自 Agent 观察;这里只验证原图身份和结构,不调用 OCR 或模型服务。 */
9
+ export declare function imageIdentity(path: string): {
10
+ sourceFile: string;
11
+ sourceHash: string;
12
+ };
13
+ export declare function bindImageObservation(path: string, observation: LayoutSource): LayoutSource;
14
+ //# sourceMappingURL=image-observation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-observation.d.ts","sourceRoot":"","sources":["../../../src/services/form-layout-source/image-observation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CA2BzF;AACD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAIhF;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAOtF;AACD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,GAAG,YAAY,CAK1F"}