@web-ppt/edit-core 0.5.0-beta.2 → 0.5.0-beta.7

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 (337) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/README.md +164 -21
  3. package/dist/alt-text.d.ts +5 -0
  4. package/dist/appearance/index.d.ts +12 -0
  5. package/dist/appearance/materialize.d.ts +4 -0
  6. package/dist/appearance/types.d.ts +26 -0
  7. package/dist/appearance/values.d.ts +9 -0
  8. package/dist/appearance.js +301 -0
  9. package/dist/cfb/index.d.ts +5 -0
  10. package/dist/cfb/read.d.ts +16 -0
  11. package/dist/cfb/write.d.ts +3 -0
  12. package/dist/cfb.js +208 -0
  13. package/dist/change-classification.d.ts +3 -3
  14. package/dist/chart/category-binding.d.ts +4 -0
  15. package/dist/chart/category-commands.d.ts +23 -0
  16. package/dist/chart/category-levels.d.ts +14 -0
  17. package/dist/chart/category-matrix.d.ts +2 -0
  18. package/dist/chart/category-value.d.ts +2 -0
  19. package/dist/chart/category-workbook.d.ts +13 -0
  20. package/dist/chart/commands.d.ts +28 -0
  21. package/dist/chart/context.d.ts +12 -0
  22. package/dist/chart/dataset-merge.d.ts +5 -0
  23. package/dist/chart/formula.d.ts +13 -0
  24. package/dist/chart/identity-frames.d.ts +4 -0
  25. package/dist/chart/identity-scopes.d.ts +6 -0
  26. package/dist/chart/identity.d.ts +24 -0
  27. package/dist/chart/index.d.ts +8 -0
  28. package/dist/chart/limits.d.ts +6 -0
  29. package/dist/chart/locator.d.ts +4 -0
  30. package/dist/chart/materialize.d.ts +7 -0
  31. package/dist/chart/ordering.d.ts +9 -0
  32. package/dist/chart/part-graph.d.ts +5 -0
  33. package/dist/chart/patch-validation.d.ts +3 -0
  34. package/dist/chart/plot-kinds.d.ts +2 -0
  35. package/dist/chart/projection.d.ts +8 -0
  36. package/dist/chart/save.d.ts +4 -0
  37. package/dist/chart/shared-added-plan.d.ts +19 -0
  38. package/dist/chart/shared-added-records.d.ts +8 -0
  39. package/dist/chart/shared-address.d.ts +5 -0
  40. package/dist/chart/shared-allocate.d.ts +7 -0
  41. package/dist/chart/shared-cache-codec.d.ts +5 -0
  42. package/dist/chart/shared-cache-identities.d.ts +3 -0
  43. package/dist/chart/shared-cache-migration.d.ts +7 -0
  44. package/dist/chart/shared-cache-save.d.ts +3 -0
  45. package/dist/chart/shared-cache-scopes.d.ts +13 -0
  46. package/dist/chart/shared-cache.d.ts +11 -0
  47. package/dist/chart/shared-category.d.ts +4 -0
  48. package/dist/chart/shared-cell.d.ts +9 -0
  49. package/dist/chart/shared-family.d.ts +26 -0
  50. package/dist/chart/shared-fields.d.ts +18 -0
  51. package/dist/chart/shared-graph.d.ts +19 -0
  52. package/dist/chart/shared-growth-space.d.ts +5 -0
  53. package/dist/chart/shared-inserted-cells.d.ts +14 -0
  54. package/dist/chart/shared-inserted-command.d.ts +7 -0
  55. package/dist/chart/shared-inserted-layout.d.ts +16 -0
  56. package/dist/chart/shared-inserted-project.d.ts +14 -0
  57. package/dist/chart/shared-inserted-records.d.ts +16 -0
  58. package/dist/chart/shared-inserted-save.d.ts +6 -0
  59. package/dist/chart/shared-joint-command.d.ts +9 -0
  60. package/dist/chart/shared-joint-records.d.ts +9 -0
  61. package/dist/chart/shared-record-axis.d.ts +25 -0
  62. package/dist/chart/shared-record-remove.d.ts +13 -0
  63. package/dist/chart/shared-record-stage.d.ts +2 -0
  64. package/dist/chart/shared-records.d.ts +2 -0
  65. package/dist/chart/shared-rows.d.ts +17 -0
  66. package/dist/chart/shared-runtime.d.ts +19 -0
  67. package/dist/chart/shared-save-plan.d.ts +4 -0
  68. package/dist/chart/shared-save.d.ts +3 -0
  69. package/dist/chart/shared-series.d.ts +6 -0
  70. package/dist/chart/shared-source-cache.d.ts +4 -0
  71. package/dist/chart/shared-topology.d.ts +9 -0
  72. package/dist/chart/shared-unresolved.d.ts +3 -0
  73. package/dist/chart/shared-validation.d.ts +6 -0
  74. package/dist/chart/shared-workbook-source.d.ts +6 -0
  75. package/dist/chart/shared-xy-command.d.ts +7 -0
  76. package/dist/chart/shared-xy-family.d.ts +16 -0
  77. package/dist/chart/shared-xy-project.d.ts +6 -0
  78. package/dist/chart/shared-xy-records.d.ts +23 -0
  79. package/dist/chart/shared-xy-save.d.ts +5 -0
  80. package/dist/chart/shared-xy-source.d.ts +39 -0
  81. package/dist/chart/shared.d.ts +13 -0
  82. package/dist/chart/source.d.ts +11 -0
  83. package/dist/chart/types.d.ts +86 -0
  84. package/dist/chart/validation.d.ts +24 -0
  85. package/dist/chart/workbook-range.d.ts +16 -0
  86. package/dist/chart/workbook-read.d.ts +7 -0
  87. package/dist/chart/workbook-write.d.ts +9 -0
  88. package/dist/chart/workbook.d.ts +25 -0
  89. package/dist/chart/xml-data.d.ts +14 -0
  90. package/dist/chart/xml-namespaces.d.ts +16 -0
  91. package/dist/chart-design/index.d.ts +10 -0
  92. package/dist/chart-design/types.d.ts +11 -0
  93. package/dist/chart-design/xml.d.ts +2 -0
  94. package/dist/chart-design.js +361 -0
  95. package/dist/chart-ex/index.d.ts +15 -0
  96. package/dist/chart-ex/workbook.d.ts +6 -0
  97. package/dist/chart-ex/xml.d.ts +14 -0
  98. package/dist/chart-ex.js +457 -0
  99. package/dist/chart-shared/index.d.ts +12 -0
  100. package/dist/chart-shared.js +1 -0
  101. package/dist/chart.js +1 -0
  102. package/dist/clipboard-links-GuPtqr1z.js +778 -0
  103. package/dist/clipboard-package.d.ts +4 -0
  104. package/dist/clipboard-source.d.ts +6 -2
  105. package/dist/clipboard-trees.d.ts +9 -0
  106. package/dist/commands/add-slide-identity.d.ts +2 -0
  107. package/dist/commands/bullet-image-resource.d.ts +11 -0
  108. package/dist/commands/clear-format.d.ts +4 -0
  109. package/dist/commands/common-object-slide-patch.d.ts +4 -0
  110. package/dist/commands/common-object-slide-types.d.ts +68 -0
  111. package/dist/commands/direct-format-patches.d.ts +11 -5
  112. package/dist/commands/distribute-elements.d.ts +4 -0
  113. package/dist/commands/edit-table-grid.d.ts +10 -0
  114. package/dist/commands/element-alt-text.d.ts +8 -0
  115. package/dist/commands/element-arrangement.d.ts +17 -0
  116. package/dist/commands/element-effects.d.ts +1 -1
  117. package/dist/commands/element-fill.d.ts +1 -1
  118. package/dist/commands/element-geometry.d.ts +5 -2
  119. package/dist/commands/element-image-content.d.ts +2 -2
  120. package/dist/commands/element-link.d.ts +1 -1
  121. package/dist/commands/element-name.d.ts +1 -1
  122. package/dist/commands/element-stroke.d.ts +1 -1
  123. package/dist/commands/element-text.d.ts +1 -1
  124. package/dist/commands/element-transform.d.ts +2 -2
  125. package/dist/commands/geometry-types.d.ts +23 -1
  126. package/dist/commands/hierarchy-record.d.ts +5 -0
  127. package/dist/commands/image-resource.d.ts +8 -1
  128. package/dist/commands/insertion-host.d.ts +14 -1
  129. package/dist/commands/layout-property.d.ts +7 -0
  130. package/dist/commands/master-property.d.ts +5 -0
  131. package/dist/commands/master-text-style-types.d.ts +27 -0
  132. package/dist/commands/master-text-style.d.ts +7 -0
  133. package/dist/commands/paste-resources.d.ts +9 -5
  134. package/dist/commands/patch-apply.d.ts +3 -0
  135. package/dist/commands/patch-count.d.ts +1 -0
  136. package/dist/commands/patch-invalidation.d.ts +1 -1
  137. package/dist/commands/patch-stage.d.ts +4 -0
  138. package/dist/commands/record-override.d.ts +5 -0
  139. package/dist/commands/replace-image.d.ts +6 -1
  140. package/dist/commands/sections.d.ts +10 -0
  141. package/dist/commands/set-preset.d.ts +5 -0
  142. package/dist/commands/slide-property-types.d.ts +55 -5
  143. package/dist/commands/slide-size.d.ts +7 -0
  144. package/dist/commands/spid.d.ts +1 -1
  145. package/dist/commands/table-grid-patch.d.ts +12 -0
  146. package/dist/commands/text-target.d.ts +2 -2
  147. package/dist/commands/theme-types.d.ts +47 -0
  148. package/dist/commands/theme.d.ts +9 -0
  149. package/dist/commands/types.d.ts +194 -17
  150. package/dist/commands/ungroup-source.d.ts +3 -0
  151. package/dist/comments/index.d.ts +35 -0
  152. package/dist/comments/save.d.ts +3 -0
  153. package/dist/comments/state.d.ts +10 -0
  154. package/dist/comments/xml.d.ts +12 -0
  155. package/dist/comments.js +782 -0
  156. package/dist/common-object-slide-types.d.ts +34 -0
  157. package/dist/data-validation.d.ts +1 -1
  158. package/dist/describe/budget.d.ts +3 -0
  159. package/dist/describe/index.d.ts +5 -0
  160. package/dist/describe/read.d.ts +4 -0
  161. package/dist/describe/types.d.ts +103 -0
  162. package/dist/describe.js +192 -0
  163. package/dist/design-dependencies.d.ts +8 -0
  164. package/dist/design-projection-package.d.ts +10 -0
  165. package/dist/design-target.d.ts +10 -0
  166. package/dist/design.d.ts +3 -0
  167. package/dist/document-extensions.d.ts +9 -0
  168. package/dist/document.d.ts +1 -1
  169. package/dist/dynamic-projection.d.ts +6 -0
  170. package/dist/edit-core.js +5420 -4111
  171. package/dist/editor.d.ts +15 -3
  172. package/dist/element-source.d.ts +11 -0
  173. package/dist/element-spids.d.ts +4 -0
  174. package/dist/extension-address-journal.d.ts +9 -0
  175. package/dist/extension-address-remap.d.ts +14 -0
  176. package/dist/extension-addresses.d.ts +20 -0
  177. package/dist/extension-copy-history.d.ts +7 -0
  178. package/dist/extension-copy.d.ts +16 -0
  179. package/dist/extension-migration-receipt.d.ts +34 -0
  180. package/dist/extension-recovery-context.d.ts +5 -0
  181. package/dist/extension-runtime.d.ts +64 -0
  182. package/dist/generate/comments.d.ts +3 -0
  183. package/dist/generate/compatibility-parts.d.ts +14 -0
  184. package/dist/generate/compatibility-references.d.ts +3 -0
  185. package/dist/generate/compatibility.d.ts +4 -0
  186. package/dist/generate/index.d.ts +1 -0
  187. package/dist/generate/master-defaults.d.ts +4 -0
  188. package/dist/generate/materialize.d.ts +2 -2
  189. package/dist/generate/math.d.ts +3 -0
  190. package/dist/generate/portable-clipboard.d.ts +4 -0
  191. package/dist/generate/projection-tree.d.ts +8 -0
  192. package/dist/generate/template.d.ts +68 -1
  193. package/dist/generate/text-body.d.ts +2 -0
  194. package/dist/generate/text-effects.d.ts +5 -0
  195. package/dist/generate/text-override.d.ts +8 -0
  196. package/dist/generate/validation.d.ts +3 -0
  197. package/dist/generate/warp.d.ts +2 -0
  198. package/dist/generate.js +1232 -512
  199. package/dist/history.d.ts +11 -1
  200. package/dist/identities.d.ts +4 -0
  201. package/dist/image-content.d.ts +5 -2
  202. package/dist/image-resource-history.d.ts +2 -0
  203. package/dist/index-C2r7c6G6.js +714 -0
  204. package/dist/index-CYDvbiwF.js +1 -0
  205. package/dist/index.d.ts +35 -7
  206. package/dist/ink/index.d.ts +27 -0
  207. package/dist/ink/model.d.ts +4 -0
  208. package/dist/ink/save.d.ts +3 -0
  209. package/dist/ink/source.d.ts +7 -0
  210. package/dist/ink.js +324 -0
  211. package/dist/layout-assets.d.ts +3 -1
  212. package/dist/layout-projection.d.ts +17 -5
  213. package/dist/layout-state.d.ts +2 -0
  214. package/dist/layout-types.d.ts +42 -0
  215. package/dist/layout.d.ts +5 -0
  216. package/dist/lint/color.d.ts +5 -0
  217. package/dist/lint/index.d.ts +7 -0
  218. package/dist/lint/prompts.d.ts +3 -0
  219. package/dist/lint/report.d.ts +21 -0
  220. package/dist/lint/sampler-batch.d.ts +4 -0
  221. package/dist/lint/sampler-images.d.ts +2 -0
  222. package/dist/lint/sampler.d.ts +9 -0
  223. package/dist/lint/snapshot.d.ts +34 -0
  224. package/dist/lint/types.d.ts +67 -0
  225. package/dist/lint-sampler.js +187 -0
  226. package/dist/lint.js +659 -0
  227. package/dist/master-state.d.ts +3 -0
  228. package/dist/master-text-style-state.d.ts +3 -0
  229. package/dist/master-types.d.ts +55 -0
  230. package/dist/master.d.ts +5 -0
  231. package/dist/media/audio-icon.d.ts +2 -0
  232. package/dist/media/commands.d.ts +3 -0
  233. package/dist/media/index.d.ts +10 -0
  234. package/dist/media/markup.d.ts +10 -0
  235. package/dist/media/mp4-boxes.d.ts +12 -0
  236. package/dist/media/mp4-fragments.d.ts +8 -0
  237. package/dist/media/mp4-samples.d.ts +4 -0
  238. package/dist/media/mp4.d.ts +2 -0
  239. package/dist/media/poster.d.ts +2 -0
  240. package/dist/media/replace-poster.d.ts +3 -0
  241. package/dist/media/resource.d.ts +4 -0
  242. package/dist/media/source.d.ts +14 -0
  243. package/dist/media/types.d.ts +33 -0
  244. package/dist/media-properties.d.ts +4 -0
  245. package/dist/media.js +1630 -0
  246. package/dist/model-invariants-BM19JVxy.js +8980 -0
  247. package/dist/object-source.d.ts +11 -0
  248. package/dist/ole/container.d.ts +14 -0
  249. package/dist/ole/content.d.ts +94 -0
  250. package/dist/ole/index.d.ts +20 -0
  251. package/dist/ole/preview.d.ts +3 -0
  252. package/dist/ole/save.d.ts +2 -0
  253. package/dist/ole/state.d.ts +16 -0
  254. package/dist/ole.js +870 -0
  255. package/dist/opc.js +1 -1
  256. package/dist/paragraph-level.d.ts +2 -2
  257. package/dist/paragraph-property-schema.d.ts +4 -1
  258. package/dist/{patch-D7lZelRa.js → patch-BwhfBbYE.js} +10 -10
  259. package/dist/patch-events.d.ts +5 -1
  260. package/dist/ppt/appearance.d.ts +11 -0
  261. package/dist/ppt/binary.d.ts +20 -0
  262. package/dist/ppt/drawing.d.ts +18 -0
  263. package/dist/ppt/geometry.d.ts +4 -0
  264. package/dist/ppt/index.d.ts +12 -0
  265. package/dist/ppt/pictures.d.ts +11 -0
  266. package/dist/ppt/text.d.ts +9 -0
  267. package/dist/ppt.js +774 -0
  268. package/dist/preset-geometry.d.ts +6 -0
  269. package/dist/projection.d.ts +2 -0
  270. package/dist/query-BHLjWjnu.js +903 -0
  271. package/dist/recovery-identity.d.ts +1 -0
  272. package/dist/recovery-migrations.d.ts +3 -0
  273. package/dist/recovery.d.ts +3 -0
  274. package/dist/resize/index.d.ts +6 -0
  275. package/dist/resize/text.d.ts +4 -0
  276. package/dist/resize.js +5090 -0
  277. package/dist/retained-element-origins.d.ts +6 -0
  278. package/dist/run-property-fields.d.ts +12 -0
  279. package/dist/run-property-schema.d.ts +3 -1
  280. package/dist/run-style.d.ts +15 -0
  281. package/dist/save/alt-text.d.ts +4 -0
  282. package/dist/save/comments.d.ts +3 -0
  283. package/dist/save/effects.d.ts +2 -1
  284. package/dist/save/extension-availability.d.ts +3 -0
  285. package/dist/save/extension-elements.d.ts +26 -0
  286. package/dist/save/index.d.ts +6 -1
  287. package/dist/save/insertion.d.ts +6 -5
  288. package/dist/save/layout-properties.d.ts +4 -0
  289. package/dist/save/master-properties.d.ts +5 -0
  290. package/dist/save/paragraph-overrides.d.ts +3 -0
  291. package/dist/save/slide-parts.d.ts +1 -0
  292. package/dist/save/table.d.ts +2 -0
  293. package/dist/save/xfrm.d.ts +8 -2
  294. package/dist/save.js +493 -498
  295. package/dist/sections.d.ts +8 -0
  296. package/dist/session-assets.d.ts +4 -0
  297. package/dist/slide-parts-D0o_DDhi.js +1331 -0
  298. package/dist/slide-size.d.ts +6 -0
  299. package/dist/smartart/drawing.d.ts +3 -0
  300. package/dist/smartart/index.d.ts +16 -0
  301. package/dist/smartart/model.d.ts +18 -0
  302. package/dist/smartart/save.d.ts +3 -0
  303. package/dist/smartart.js +604 -0
  304. package/dist/source-retention.d.ts +7 -0
  305. package/dist/space.d.ts +37 -0
  306. package/dist/table-cell.d.ts +7 -1
  307. package/dist/table-grid-projection.d.ts +6 -0
  308. package/dist/table-grid.d.ts +45 -0
  309. package/dist/table-invariants.d.ts +4 -0
  310. package/dist/table-rows.d.ts +2 -1
  311. package/dist/table-scale.d.ts +4 -0
  312. package/dist/table-style.d.ts +5 -4
  313. package/dist/templates/index.d.ts +4 -0
  314. package/dist/templates/recipes.d.ts +5 -0
  315. package/dist/templates/types.d.ts +17 -0
  316. package/dist/templates.js +543 -0
  317. package/dist/text-flatten.d.ts +6 -0
  318. package/dist/text-fragment.d.ts +5 -0
  319. package/dist/text-model.d.ts +8 -8
  320. package/dist/text-override-validation.d.ts +6 -2
  321. package/dist/text-selection.d.ts +4 -0
  322. package/dist/theme-projection.d.ts +8 -0
  323. package/dist/theme-xml.d.ts +3 -0
  324. package/dist/theme.d.ts +14 -0
  325. package/dist/types.d.ts +174 -8
  326. package/dist/xml/index.d.ts +1 -1
  327. package/dist/xml/nodes.d.ts +2 -2
  328. package/dist/xml/shape-ids.d.ts +3 -0
  329. package/dist/xml.js +19 -16
  330. package/package.json +73 -5
  331. package/schemas/describe.schema.json +479 -0
  332. package/schemas/lint.schema.json +145 -0
  333. package/dist/document-B1jjN-QB.js +0 -274
  334. package/dist/image-resource-DbgJS9n-.js +0 -24
  335. package/dist/index-D2JizcOQ.js +0 -706
  336. package/dist/insertion-CGpb504L.js +0 -6152
  337. package/dist/table-style-part-DBtpxmuo.js +0 -1042
package/dist/lint.js ADDED
@@ -0,0 +1,659 @@
1
+ import { findPlaceholderByIdentity as ze, placeGroupChild as Ue, collectFonts as Ge, readImageMetadata as Je, layoutText as Oe } from "@web-ppt/core";
2
+ import { toSlide as Xe, sectionOfSlide as Ke, querySelectionPane as Qe, effectiveElement as Ve, elementWorldBounds as Ze, queryElementAltText as et, renderedElement as tt, sourcePartBytes as it, sourceAsset as _e } from "@web-ppt/edit-core";
3
+ import { L as k, p as nt, f as rt, a as st, b as at, x as de, c as V, d as me, e as ge, g as ot, w as Se } from "./query-BHLjWjnu.js";
4
+ function je(n, e, t = 0, i = n.length - 1, s = lt) {
5
+ for (; i > t; ) {
6
+ if (i - t > 600) {
7
+ const l = i - t + 1, h = e - t + 1, f = Math.log(l), w = 0.5 * Math.exp(2 * f / 3), y = 0.5 * Math.sqrt(f * w * (l - w) / l) * (h - l / 2 < 0 ? -1 : 1), X = Math.max(t, Math.floor(e - h * w / l + y)), E = Math.min(i, Math.floor(e + (l - h) * w / l + y));
8
+ je(n, e, X, E, s);
9
+ }
10
+ const r = n[e];
11
+ let a = t, o = i;
12
+ for (le(n, t, e), s(n[i], r) > 0 && le(n, t, i); a < o; ) {
13
+ for (le(n, a, o), a++, o--; s(n[a], r) < 0; ) a++;
14
+ for (; s(n[o], r) > 0; ) o--;
15
+ }
16
+ s(n[t], r) === 0 ? le(n, t, o) : (o++, le(n, o, i)), o <= e && (t = o + 1), e <= o && (i = o - 1);
17
+ }
18
+ }
19
+ function le(n, e, t) {
20
+ const i = n[e];
21
+ n[e] = n[t], n[t] = i;
22
+ }
23
+ function lt(n, e) {
24
+ return n < e ? -1 : n > e ? 1 : 0;
25
+ }
26
+ class Pe {
27
+ constructor(e = 9) {
28
+ this._maxEntries = Math.max(4, e), this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4)), this.clear();
29
+ }
30
+ all() {
31
+ return this._all(this.data, []);
32
+ }
33
+ search(e) {
34
+ let t = this.data;
35
+ const i = [];
36
+ if (!ue(e, t)) return i;
37
+ const s = this.toBBox, r = [];
38
+ for (; t; ) {
39
+ for (let a = 0; a < t.children.length; a++) {
40
+ const o = t.children[a], l = t.leaf ? s(o) : o;
41
+ ue(e, l) && (t.leaf ? i.push(o) : Me(e, l) ? this._all(o, i) : r.push(o));
42
+ }
43
+ t = r.pop();
44
+ }
45
+ return i;
46
+ }
47
+ collides(e) {
48
+ let t = this.data;
49
+ if (!ue(e, t)) return !1;
50
+ const i = [];
51
+ for (; t; ) {
52
+ for (let s = 0; s < t.children.length; s++) {
53
+ const r = t.children[s], a = t.leaf ? this.toBBox(r) : r;
54
+ if (ue(e, a)) {
55
+ if (t.leaf || Me(e, a)) return !0;
56
+ i.push(r);
57
+ }
58
+ }
59
+ t = i.pop();
60
+ }
61
+ return !1;
62
+ }
63
+ load(e) {
64
+ if (!(e && e.length)) return this;
65
+ if (e.length < this._minEntries) {
66
+ for (let i = 0; i < e.length; i++)
67
+ this.insert(e[i]);
68
+ return this;
69
+ }
70
+ let t = this._build(e.slice(), 0, e.length - 1, 0);
71
+ if (!this.data.children.length)
72
+ this.data = t;
73
+ else if (this.data.height === t.height)
74
+ this._splitRoot(this.data, t);
75
+ else {
76
+ if (this.data.height < t.height) {
77
+ const i = this.data;
78
+ this.data = t, t = i;
79
+ }
80
+ this._insert(t, this.data.height - t.height - 1, !0);
81
+ }
82
+ return this;
83
+ }
84
+ insert(e) {
85
+ return e && this._insert(e, this.data.height - 1), this;
86
+ }
87
+ clear() {
88
+ return this.data = Z([]), this;
89
+ }
90
+ remove(e, t) {
91
+ if (!e) return this;
92
+ let i = this.data;
93
+ const s = this.toBBox(e), r = [], a = [];
94
+ let o, l, h;
95
+ for (; i || r.length; ) {
96
+ if (i || (i = r.pop(), l = r[r.length - 1], o = a.pop(), h = !0), i.leaf) {
97
+ const f = ht(e, i.children, t);
98
+ if (f !== -1)
99
+ return i.children.splice(f, 1), r.push(i), this._condense(r), this;
100
+ }
101
+ !h && !i.leaf && Me(i, s) ? (r.push(i), a.push(o), o = 0, l = i, i = i.children[0]) : l ? (o++, i = l.children[o], h = !1) : i = null;
102
+ }
103
+ return this;
104
+ }
105
+ toBBox(e) {
106
+ return e;
107
+ }
108
+ compareMinX(e, t) {
109
+ return e.minX - t.minX;
110
+ }
111
+ compareMinY(e, t) {
112
+ return e.minY - t.minY;
113
+ }
114
+ toJSON() {
115
+ return this.data;
116
+ }
117
+ fromJSON(e) {
118
+ return this.data = e, this;
119
+ }
120
+ _all(e, t) {
121
+ const i = [];
122
+ for (; e; )
123
+ e.leaf ? t.push(...e.children) : i.push(...e.children), e = i.pop();
124
+ return t;
125
+ }
126
+ _build(e, t, i, s) {
127
+ const r = i - t + 1;
128
+ let a = this._maxEntries, o;
129
+ if (r <= a)
130
+ return o = Z(e.slice(t, i + 1)), Q(o, this.toBBox), o;
131
+ s || (s = Math.ceil(Math.log(r) / Math.log(a)), a = Math.ceil(r / Math.pow(a, s - 1))), o = Z([]), o.leaf = !1, o.height = s;
132
+ const l = Math.ceil(r / a), h = l * Math.ceil(Math.sqrt(a));
133
+ $e(e, t, i, h, this.compareMinX);
134
+ for (let f = t; f <= i; f += h) {
135
+ const w = Math.min(f + h - 1, i);
136
+ $e(e, f, w, l, this.compareMinY);
137
+ for (let y = f; y <= w; y += l) {
138
+ const X = Math.min(y + l - 1, w);
139
+ o.children.push(this._build(e, y, X, s - 1));
140
+ }
141
+ }
142
+ return Q(o, this.toBBox), o;
143
+ }
144
+ _chooseSubtree(e, t, i, s) {
145
+ for (; s.push(t), !(t.leaf || s.length - 1 === i); ) {
146
+ let r = 1 / 0, a = 1 / 0, o;
147
+ for (let l = 0; l < t.children.length; l++) {
148
+ const h = t.children[l], f = ve(h), w = mt(e, h) - f;
149
+ w < a ? (a = w, r = f < r ? f : r, o = h) : w === a && f < r && (r = f, o = h);
150
+ }
151
+ t = o || t.children[0];
152
+ }
153
+ return t;
154
+ }
155
+ _insert(e, t, i) {
156
+ const s = i ? e : this.toBBox(e), r = [], a = this._chooseSubtree(s, this.data, t, r);
157
+ for (a.children.push(e), ce(a, s); t >= 0 && r[t].children.length > this._maxEntries; )
158
+ this._split(r, t), t--;
159
+ this._adjustParentBBoxes(s, r, t);
160
+ }
161
+ // split overflowed node into two
162
+ _split(e, t) {
163
+ const i = e[t], s = i.children.length, r = this._minEntries;
164
+ this._chooseSplitAxis(i, r, s);
165
+ const a = this._chooseSplitIndex(i, r, s), o = Z(i.children.splice(a, i.children.length - a));
166
+ o.height = i.height, o.leaf = i.leaf, Q(i, this.toBBox), Q(o, this.toBBox), t ? e[t - 1].children.push(o) : this._splitRoot(i, o);
167
+ }
168
+ _splitRoot(e, t) {
169
+ this.data = Z([e, t]), this.data.height = e.height + 1, this.data.leaf = !1, Q(this.data, this.toBBox);
170
+ }
171
+ _chooseSplitIndex(e, t, i) {
172
+ let s, r = 1 / 0, a = 1 / 0;
173
+ for (let o = t; o <= i - t; o++) {
174
+ const l = he(e, 0, o, this.toBBox), h = he(e, o, i, this.toBBox), f = ft(l, h), w = ve(l) + ve(h);
175
+ f < r ? (r = f, s = o, a = w < a ? w : a) : f === r && w < a && (a = w, s = o);
176
+ }
177
+ return s || i - t;
178
+ }
179
+ // sorts node children by the best axis for split
180
+ _chooseSplitAxis(e, t, i) {
181
+ const s = e.leaf ? this.compareMinX : ct, r = e.leaf ? this.compareMinY : dt, a = this._allDistMargin(e, t, i, s), o = this._allDistMargin(e, t, i, r);
182
+ a < o && e.children.sort(s);
183
+ }
184
+ // total margin of all possible split distributions where each node is at least m full
185
+ _allDistMargin(e, t, i, s) {
186
+ e.children.sort(s);
187
+ const r = this.toBBox, a = he(e, 0, t, r), o = he(e, i - t, i, r);
188
+ let l = fe(a) + fe(o);
189
+ for (let h = t; h < i - t; h++) {
190
+ const f = e.children[h];
191
+ ce(a, e.leaf ? r(f) : f), l += fe(a);
192
+ }
193
+ for (let h = i - t - 1; h >= t; h--) {
194
+ const f = e.children[h];
195
+ ce(o, e.leaf ? r(f) : f), l += fe(o);
196
+ }
197
+ return l;
198
+ }
199
+ _adjustParentBBoxes(e, t, i) {
200
+ for (let s = i; s >= 0; s--)
201
+ ce(t[s], e);
202
+ }
203
+ _condense(e) {
204
+ for (let t = e.length - 1, i; t >= 0; t--)
205
+ e[t].children.length === 0 ? t > 0 ? (i = e[t - 1].children, i.splice(i.indexOf(e[t]), 1)) : this.clear() : Q(e[t], this.toBBox);
206
+ }
207
+ }
208
+ function ht(n, e, t) {
209
+ if (!t) return e.indexOf(n);
210
+ for (let i = 0; i < e.length; i++)
211
+ if (t(n, e[i])) return i;
212
+ return -1;
213
+ }
214
+ function Q(n, e) {
215
+ he(n, 0, n.children.length, e, n);
216
+ }
217
+ function he(n, e, t, i, s) {
218
+ s || (s = Z(null)), s.minX = 1 / 0, s.minY = 1 / 0, s.maxX = -1 / 0, s.maxY = -1 / 0;
219
+ for (let r = e; r < t; r++) {
220
+ const a = n.children[r];
221
+ ce(s, n.leaf ? i(a) : a);
222
+ }
223
+ return s;
224
+ }
225
+ function ce(n, e) {
226
+ return n.minX = Math.min(n.minX, e.minX), n.minY = Math.min(n.minY, e.minY), n.maxX = Math.max(n.maxX, e.maxX), n.maxY = Math.max(n.maxY, e.maxY), n;
227
+ }
228
+ function ct(n, e) {
229
+ return n.minX - e.minX;
230
+ }
231
+ function dt(n, e) {
232
+ return n.minY - e.minY;
233
+ }
234
+ function ve(n) {
235
+ return (n.maxX - n.minX) * (n.maxY - n.minY);
236
+ }
237
+ function fe(n) {
238
+ return n.maxX - n.minX + (n.maxY - n.minY);
239
+ }
240
+ function mt(n, e) {
241
+ return (Math.max(e.maxX, n.maxX) - Math.min(e.minX, n.minX)) * (Math.max(e.maxY, n.maxY) - Math.min(e.minY, n.minY));
242
+ }
243
+ function ft(n, e) {
244
+ const t = Math.max(n.minX, e.minX), i = Math.max(n.minY, e.minY), s = Math.min(n.maxX, e.maxX), r = Math.min(n.maxY, e.maxY);
245
+ return Math.max(0, s - t) * Math.max(0, r - i);
246
+ }
247
+ function Me(n, e) {
248
+ return n.minX <= e.minX && n.minY <= e.minY && e.maxX <= n.maxX && e.maxY <= n.maxY;
249
+ }
250
+ function ue(n, e) {
251
+ return e.minX <= n.maxX && e.minY <= n.maxY && e.maxX >= n.minX && e.maxY >= n.minY;
252
+ }
253
+ function Z(n) {
254
+ return {
255
+ children: n,
256
+ height: 1,
257
+ leaf: !0,
258
+ minX: 1 / 0,
259
+ minY: 1 / 0,
260
+ maxX: -1 / 0,
261
+ maxY: -1 / 0
262
+ };
263
+ }
264
+ function $e(n, e, t, i, s) {
265
+ const r = [e, t];
266
+ for (; r.length; ) {
267
+ if (t = r.pop(), e = r.pop(), t - e <= i) continue;
268
+ const a = e + Math.ceil((t - e) / i / 2) * i;
269
+ je(n, a, e, t, s), r.push(e, a, a, t);
270
+ }
271
+ }
272
+ function ut(n, e) {
273
+ let t = n.elements[e];
274
+ const i = /* @__PURE__ */ new Set();
275
+ for (; t; ) {
276
+ if (i.has(t.id)) throw new Error(`元素父链成环:${t.id}`);
277
+ if (i.add(t.id), n.slides[t.parent]) return { kind: "slide", id: t.parent };
278
+ if (n.layouts[t.parent]) return { kind: "layout", id: t.parent };
279
+ if (n.masters[t.parent]) return { kind: "master", id: t.parent };
280
+ t = n.elements[t.parent];
281
+ }
282
+ throw new Error(`元素 ${e} 的父链没有画布根`);
283
+ }
284
+ class z extends Error {
285
+ constructor(e, t, i = null, s = null) {
286
+ super(t), this.reason = e, this.slideNumber = i, this.elementId = s, this.name = "DescribeError";
287
+ }
288
+ }
289
+ function Ce(n, e = !1) {
290
+ const t = (i, s) => ((i == null ? void 0 : i.paragraphs) ?? []).map((r) => {
291
+ var o;
292
+ const a = (o = r.editInfo) == null ? void 0 : o.autoNumbering;
293
+ return {
294
+ text: r.runs.map((l) => l.text).join(""),
295
+ level: r.lvl,
296
+ cell: s,
297
+ bullet: {
298
+ kind: r.bulletImage ? "image" : r.bullet !== null ? "text" : "none",
299
+ text: r.bullet,
300
+ numbering: a ? { type: a.scheme, startAt: a.startAt } : null
301
+ }
302
+ };
303
+ });
304
+ return n.kind === "shape" ? t(n.text, null) : n.kind === "group" && e ? n.children.flatMap((i) => Ce(i, !0)) : n.kind !== "table" ? [] : n.rows.flatMap((i, s) => i.cells.flatMap((r, a) => r.merged ? [] : t(r.text, { row: s, column: a })));
305
+ }
306
+ function pt(n, e, t) {
307
+ const i = n.elements[t].meta.ph;
308
+ if (!i) return null;
309
+ const s = n.layouts[n.slides[e].layoutId ?? ""], r = s ? n.masters[s.origin.masterPart] : void 0, a = (f, w) => ze(
310
+ f,
311
+ (y) => n.elements[y].meta.ph,
312
+ w
313
+ ), o = s ? a(s.children, i) : void 0, l = o ? n.elements[o].meta.ph : i, h = r ? a(r.children, l) : void 0;
314
+ return {
315
+ type: i.type,
316
+ index: i.idx ?? null,
317
+ layout: o ? { id: s.id, elementId: o } : null,
318
+ master: h ? { id: r.id, elementId: h } : null
319
+ };
320
+ }
321
+ function gt(n, e, t, i) {
322
+ const s = Xe(n, e), r = n.slides[e], a = n.layouts[r.layoutId ?? ""], o = a ? n.masters[a.origin.masterPart] : void 0, l = Ke(n, e), h = l ? n.sections.records[l] : null, f = Qe(n, e), w = f.filter((b) => b.parentId === null).reverse().map((b) => b.id), y = new Map(f.map((b) => [b.id, b])), X = [...(o == null ? void 0 : o.children) ?? [], ...(a == null ? void 0 : a.children) ?? []], E = [], S = (b, v, _, R, W) => {
323
+ var re;
324
+ const $ = n.elements[v];
325
+ if (!$ || _.includes(v))
326
+ throw new z("unaddressable-element", `页面 ${t} 元素 ${v} 缺少有效的无环编辑身份`, t, v);
327
+ const j = Ze(n, v);
328
+ if (!Object.values(j).every(Number.isFinite))
329
+ throw new z("invalid-geometry", `页面 ${t} 元素 ${v} 的包围盒必须为有限数值`, t, v);
330
+ const D = et(n, v), T = y.get(v), ee = [..._, v], te = R || (T == null ? void 0 : T.hidden) === !0 || $.meta.hiddenByUser === !0, ie = W || (T == null ? void 0 : T.locked) === !0 || $.meta.locked === !0 || $.meta.moveLocked === !0, ne = b.kind === "group" && ($.meta.editable === "frame" || ((re = b.editInfo) == null ? void 0 : re.editable) === "frame");
331
+ if (i == null || i(t, v, b), E.push({
332
+ id: v,
333
+ kind: b.kind,
334
+ name: (T == null ? void 0 : T.name) ?? b.name ?? "",
335
+ altText: { title: D.title, description: D.descr },
336
+ path: ee,
337
+ canvas: ut(n, v),
338
+ bounds: { x: j.left, y: j.top, width: j.right - j.left, height: j.bottom - j.top },
339
+ editable: $.meta.editable,
340
+ hidden: te,
341
+ locked: ie,
342
+ placeholder: pt(n, e, v),
343
+ paragraphs: Ce(b, ne)
344
+ }), b.kind === "group" && !ne) {
345
+ const se = $.children ?? [];
346
+ if (se.length !== b.children.length)
347
+ throw new z("unaddressable-element", `页面 ${t} 组合 ${v} 的投影后代与编辑记录数量不符`, t, v);
348
+ b.children.forEach((d, p) => S(d, se[p], ee, te, ie));
349
+ }
350
+ }, C = s.elements.length - w.length;
351
+ if (C < 0) throw new z("invalid-document", `页面 ${t} 的投影根数量小于编辑根数量`, t);
352
+ return s.elements.forEach((b, v) => {
353
+ var R;
354
+ let _ = w[v - C];
355
+ if (v < C) {
356
+ const W = (R = b.editInfo) == null ? void 0 : R.origin, $ = X.filter((j) => {
357
+ if (Ve(n, j) === b) return !0;
358
+ const D = n.elements[j].meta.origin;
359
+ return !!W && (D == null ? void 0 : D.part) === W.part && D.spid === W.spid;
360
+ });
361
+ if ($.length !== 1)
362
+ throw new z("unaddressable-element", `页面 ${t} 设计投影 ${b.name ?? v} 必须对应唯一编辑记录,实际 ${$.length} 个`, t);
363
+ _ = $[0];
364
+ }
365
+ S(b, _, [], !1, !1);
366
+ }), {
367
+ id: e,
368
+ number: t,
369
+ hidden: s.hidden === !0,
370
+ layout: a ? { id: a.id, name: a.name } : s.layoutName ? { id: "", name: s.layoutName } : null,
371
+ master: o ? { id: o.id, name: o.name } : null,
372
+ section: h ? { id: h.id, name: h.name } : null,
373
+ notes: s.notes ?? "",
374
+ elements: E
375
+ };
376
+ }
377
+ function xt(n, e) {
378
+ if (!n || !n.meta || !Number.isFinite(n.meta.width) || !Number.isFinite(n.meta.height) || n.meta.width <= 0 || n.meta.height <= 0 || !["pptx", "ppt"].includes(n.meta.source))
379
+ throw new z("invalid-document", "describe 要求尺寸为正有限数值、来源为 pptx/ppt 的 EditDoc");
380
+ const t = n.slideOrder.map((i, s) => {
381
+ try {
382
+ return gt(n, i, s + 1, e);
383
+ } catch (r) {
384
+ throw r instanceof z ? r : new z("invalid-document", `页面 ${s + 1}(${i})读取失败:${r instanceof Error ? r.message : String(r)}`, s + 1);
385
+ }
386
+ });
387
+ return {
388
+ version: 1,
389
+ source: n.meta.source,
390
+ width: n.meta.width,
391
+ height: n.meta.height,
392
+ totalSlides: t.length,
393
+ totalElements: t.reduce((i, s) => i + s.elements.length, 0),
394
+ slides: t,
395
+ truncation: { reason: null, omittedSlides: 0, omittedElements: 0, next: null }
396
+ };
397
+ }
398
+ const pe = ["text-overflow", "element-overlap", "off-canvas", "low-contrast", "missing-font", "placeholder-prompt-left", "image-distorted"];
399
+ function Te(n) {
400
+ return n.kind === "shape" ? n.text ? [{ body: n.text, width: n.w, height: n.h, fill: n.fill, cell: null }] : [] : n.kind === "group" ? n.children.flatMap((e) => Te(Ue(n, e))) : n.kind !== "table" ? [] : n.rows.flatMap((e, t) => e.cells.flatMap((i, s) => i.merged || !i.text ? [] : [{
401
+ body: { ...i.text, insets: i.margins ?? i.text.insets, anchor: i.vAlign ?? i.text.anchor, vert: i.vert ?? i.text.vert },
402
+ width: n.colWidths.slice(s, s + i.colSpan).reduce((r, a) => r + a, 0),
403
+ height: n.rows.slice(t, t + i.rowSpan).reduce((r, a) => r + a.height, 0),
404
+ fill: i.fill ?? null,
405
+ cell: { row: t, column: s }
406
+ }]));
407
+ }
408
+ function Fe(n) {
409
+ const e = /* @__PURE__ */ new Map(), t = xt(n, (r, a, o) => e.set(`${r}:${a}`, o)), i = /* @__PURE__ */ new Map(), s = n.slideOrder.map((r, a) => {
410
+ const o = new Set(t.slides[a].elements.filter((h) => h.hidden).map((h) => e.get(`${a + 1}:${h.id}`))), l = (h) => {
411
+ if (o.has(h)) return [];
412
+ const f = h.kind === "group" ? { ...h, children: h.children.flatMap(l) } : h;
413
+ return i.set(h, f), [f];
414
+ };
415
+ return { ...Xe(n, r), elements: Xe(n, r).elements.flatMap(l) };
416
+ });
417
+ return {
418
+ description: t,
419
+ slides: s,
420
+ elements: t.slides.map((r) => r.elements.map((a) => {
421
+ var w;
422
+ const o = e.get(`${r.number}:${a.id}`);
423
+ let l = tt(n, a.id);
424
+ const h = (y, X) => {
425
+ if (!X || y.kind !== X.kind) throw new k("invalid-document", "设计对象与页面投影不一致", r.number, a.id);
426
+ return y.kind === "shape" && X.kind === "shape" ? { ...y, text: X.text } : y.kind === "group" && X.kind === "group" ? { ...y, children: y.children.map((E, S) => h(E, X.children[S])) } : y.kind === "table" && X.kind === "table" ? { ...y, rows: y.rows.map((E, S) => ({
427
+ ...E,
428
+ cells: E.cells.map((C, b) => {
429
+ var _;
430
+ const v = (_ = X.rows[S]) == null ? void 0 : _.cells[b];
431
+ if (!v) throw new k("invalid-document", "表格投影单元格不一致", r.number, a.id);
432
+ return { ...C, text: v.text };
433
+ })
434
+ })) } : y;
435
+ };
436
+ a.canvas.kind !== "slide" && (l = h(l, o));
437
+ const f = l.kind !== "group" || a.editable === "frame" || ((w = l.editInfo) == null ? void 0 : w.editable) === "frame";
438
+ return { item: a, raw: o, visible: i.get(o) ?? o, rendered: l, units: f ? Te(l) : [] };
439
+ }))
440
+ };
441
+ }
442
+ function wt(n) {
443
+ const e = /* @__PURE__ */ new Map();
444
+ return (t) => {
445
+ var w;
446
+ const i = t.placeholder;
447
+ if (!i || ["dt", "sldNum", "ftr", "hdr"].includes(i.type)) return [];
448
+ const s = i.layout ?? i.master;
449
+ if (!s) return [];
450
+ const r = (w = n.elements[s.elementId]) == null ? void 0 : w.meta.origin, a = r && it(n, r.part);
451
+ if (!r || !a) throw new k("placeholder-source-unavailable", `占位符 ${t.id} 缺少版式提示来源`, null, t.id);
452
+ let o = e.get(r.part);
453
+ o || (o = nt(a), e.set(r.part, o));
454
+ const l = (y) => y.children.map((X) => X.type === "text" || X.type === "cdata" ? X.value : X.type === "element" ? l(X) : "").join(""), h = (y) => {
455
+ var X;
456
+ if (["sp", "pic", "graphicFrame"].includes(y.localName)) {
457
+ const E = rt(y, { localName: "cNvPr" });
458
+ if (E && Number((X = st(E, { localName: "id" })) == null ? void 0 : X.value) === r.spid) {
459
+ const S = at(y, { localName: "txBody" });
460
+ return S ? de(S, { localName: "p" }).map((C) => de(C).map((b) => b.localName === "br" ? `
461
+ ` : ["r", "fld"].includes(b.localName) ? de(b, { localName: "t" }).map(l).join("") : "").join("")).filter((C) => C.trim()) : [];
462
+ }
463
+ }
464
+ for (const E of de(y)) {
465
+ const S = h(E);
466
+ if (S) return S;
467
+ }
468
+ return null;
469
+ }, f = h(o.root);
470
+ if (!f) throw new k("placeholder-source-unavailable", `占位符 ${t.id} 的来源形状 ${r.part}#${r.spid} 不存在`, null, t.id);
471
+ return f;
472
+ };
473
+ }
474
+ const Ae = { overlapRatio: 0.25, imageDeviation: 0.05, tolerancePx: 0.01, maxIssues: 1e4 }, Be = (n) => n.trim().toLowerCase();
475
+ function De(n, e) {
476
+ if (typeof n != "function") throw new k("measurement-required", "文字检查必须提供真实 measureText;Node 不使用估算字宽");
477
+ return (t, i, s) => {
478
+ V(e);
479
+ const r = n(t, i, s);
480
+ if (!Number.isFinite(r) || r < 0) throw new k("invalid-measurement", `文字测量返回 ${r},预期非负有限 px`);
481
+ return r;
482
+ };
483
+ }
484
+ function Bt(n, e) {
485
+ const t = De(e);
486
+ for (const i of Fe(n).elements) for (const s of i) for (const r of s.item.hidden ? [] : s.units)
487
+ Oe(r.body, r.width, r.height, { measureText: t, includeCarets: !1, anchor: "top" });
488
+ }
489
+ async function Xt(n, e = {}) {
490
+ var W, $, j, D, T, ee, te, ie, ne, re, se;
491
+ if (!e || typeof e != "object" || Array.isArray(e) || e.checks !== void 0 && !Array.isArray(e.checks)) throw new k("invalid-options", "布局检查选项必须是对象,checks 必须是数组");
492
+ e = { ...e }, V(e.signal);
493
+ const t = pe.filter((d) => !e.checks || e.checks.includes(d));
494
+ if (!t.length || (W = e.checks) != null && W.some((d) => !pe.includes(d))) throw new k("invalid-options", "checks 必须是非空的已知检查项列表");
495
+ const i = { ...Ae, ...Object.fromEntries(Object.keys(Ae).filter((d) => e[d] !== void 0).map((d) => [d, e[d]])) };
496
+ if (!Number.isFinite(i.overlapRatio) || i.overlapRatio < 0 || i.overlapRatio > 1 || !Number.isFinite(i.imageDeviation) || i.imageDeviation < 0 || !Number.isFinite(i.tolerancePx) || i.tolerancePx < 0 || !Number.isSafeInteger(i.maxIssues) || i.maxIssues < 1) throw new k("invalid-options", "阈值必须有限且非负,重叠比例不超过 1,maxIssues 必须为正安全整数");
497
+ const s = Fe(n), r = (d) => t.includes(d), a = s.elements.some((d) => d.some((p) => !p.item.hidden && p.units.length)), o = a && (r("text-overflow") || r("low-contrast")) ? De(e.measureText, e.signal) : void 0;
498
+ if (a && r("missing-font") && (!e.fonts || !Array.isArray(e.fonts.available) || !Array.isArray(e.fonts.embedded))) throw new k("font-inventory-required", "缺字体检查必须提供 available/embedded 字体库存");
499
+ const l = [...(($ = e.fonts) == null ? void 0 : $.available) ?? [], ...((j = e.fonts) == null ? void 0 : j.embedded) ?? []];
500
+ if (l.some((d) => typeof d != "string" || !d.trim())) throw new k("invalid-options", "字体库存必须包含非空字体名");
501
+ const h = new Set(l.map(Be)), f = me(e.canvasColor ?? "#ffffff");
502
+ if (f[3] !== 1) throw new k("invalid-options", "canvasColor 必须是不透明颜色");
503
+ const w = /* @__PURE__ */ new Map(), y = wt(n), X = /* @__PURE__ */ new Map(), E = new Map(Object.entries(((D = n.package) == null ? void 0 : D.assets) ?? {})), S = /* @__PURE__ */ new Set(), C = (d) => {
504
+ if (typeof d == "string" && (d.startsWith("blob:") || d.startsWith("asset:"))) {
505
+ const p = _e(n, d);
506
+ p && E.set(d, p);
507
+ } else if (d && typeof d == "object" && !S.has(d)) {
508
+ S.add(d);
509
+ for (const p of Object.values(d)) C(p);
510
+ }
511
+ };
512
+ C(s.slides);
513
+ const b = /* @__PURE__ */ new Map();
514
+ for (const d of s.elements) for (const p of d)
515
+ if (!p.item.hidden) {
516
+ if (r("placeholder-prompt-left"))
517
+ try {
518
+ w.set(p.item.id, y(p.item));
519
+ } catch (P) {
520
+ if (!e.resolvePlaceholderPrompts) throw P;
521
+ w.set(p.item.id, P);
522
+ }
523
+ if (p.raw.kind === "image") {
524
+ const P = (T = _e(n, p.raw.src)) == null ? void 0 : T.bytes;
525
+ P && X.set(p.raw.src, P);
526
+ }
527
+ }
528
+ const v = [], _ = (d, p, P, M, xe = null) => {
529
+ if (Object.values(M).some((ae) => typeof ae == "number" && !Number.isFinite(ae))) throw new k("invalid-measurement", "检查结果必须为有限数值", p, P.item.id);
530
+ if (v.length >= i.maxIssues) throw new k("resource-limit", `问题数量超过 maxIssues=${i.maxIssues}`, p, P.item.id);
531
+ v.push({ reason: d, slideNumber: p, elementId: P.item.id, bounds: { ...P.item.bounds }, cell: xe, measurements: M });
532
+ }, R = async (d, p, P) => {
533
+ try {
534
+ V(e.signal);
535
+ const M = await Se(P(), e.signal);
536
+ return V(e.signal), M;
537
+ } catch (M) {
538
+ throw M instanceof k ? M : new k(d, `${p.elementId}:${M instanceof Error ? M.message : String(M)}`, p.slideNumber, p.elementId);
539
+ }
540
+ };
541
+ for (let d = 0; d < s.elements.length; d++) {
542
+ V(e.signal);
543
+ const p = s.elements[d], P = s.slides[d], M = d + 1, xe = p.filter((B) => !B.item.hidden).map((B) => ({ elementId: B.item.id, element: B.visible })), ae = new Pe(), we = new Pe();
544
+ we.load(p.flatMap((B, m) => B.item.hidden ? [] : [{
545
+ minX: B.item.bounds.x,
546
+ minY: B.item.bounds.y,
547
+ maxX: B.item.bounds.x + B.item.bounds.width,
548
+ maxY: B.item.bounds.y + B.item.bounds.height,
549
+ order: m
550
+ }]));
551
+ const Re = p.some((B) => !B.item.hidden && Object.values(B.rendered.effects ?? {}).some(Boolean));
552
+ for (let B = 0; B < p.length; B++) {
553
+ const m = p[B], u = m.item.bounds;
554
+ if (m.item.hidden) continue;
555
+ const U = {
556
+ slideNumber: M,
557
+ elementId: m.item.id,
558
+ element: m.rendered,
559
+ slide: P,
560
+ signal: e.signal,
561
+ canvas: { width: s.description.width, height: s.description.height, color: e.canvasColor ?? "#ffffff" },
562
+ resource: (x) => E.get(x),
563
+ bindings: xe
564
+ };
565
+ if (r("off-canvas")) {
566
+ const x = Math.max(-u.x, -u.y, u.x + u.width - s.description.width, u.y + u.height - s.description.height);
567
+ x > i.tolerancePx && _("off-canvas", M, m, { outsidePx: x, tolerancePx: i.tolerancePx });
568
+ }
569
+ const ye = m.rendered.kind !== "group" || m.item.editable === "frame" || ((ee = m.rendered.editInfo) == null ? void 0 : ee.editable) === "frame", Le = m.rendered.kind === "image" || m.rendered.kind === "table" || m.units.some((x) => x.body.paragraphs.some((c) => c.runs.some((g) => g.text.trim()))), We = m.rendered.kind === "image" && !m.rendered.media && m.item.editable !== "frame" && u.width >= s.description.width * 0.95 && u.height >= s.description.height * 0.95;
570
+ if (r("element-overlap") && Le && !We && u.width > 0 && u.height > 0 && ye) {
571
+ const x = { minX: u.x, minY: u.y, maxX: u.x + u.width, maxY: u.y + u.height, order: B };
572
+ for (const c of ae.search(x).sort((g, A) => g.order - A.order)) {
573
+ const g = p[c.order];
574
+ if (g.item.path[0] === m.item.path[0]) continue;
575
+ const A = Math.min(x.maxX, c.maxX) - Math.max(x.minX, c.minX), L = Math.min(x.maxY, c.maxY) - Math.max(x.minY, c.minY), q = A * L / Math.min(u.width * u.height, g.item.bounds.width * g.item.bounds.height);
576
+ A > 0 && L > 0 && q > i.overlapRatio && _("element-overlap", M, m, { relatedElementId: g.item.id, ratio: q, threshold: i.overlapRatio });
577
+ }
578
+ ae.insert(x);
579
+ }
580
+ if (r("missing-font") && ye) {
581
+ const x = Ge([{ background: null, elements: [m.rendered] }]).map((c) => c.family).filter((c) => !h.has(Be(c)) && !["serif", "sans-serif", "monospace", "system-ui"].includes(Be(c))).sort();
582
+ x.length && ye && _("missing-font", M, m, { families: x, missingCount: x.length, threshold: 0 });
583
+ }
584
+ if (r("placeholder-prompt-left") && m.item.placeholder && !["dt", "sldNum", "ftr", "hdr"].includes(m.item.placeholder.type)) {
585
+ const c = (e.resolvePlaceholderPrompts ? await R("prompt-resolver-failed", U, () => e.resolvePlaceholderPrompts(U)) : void 0) ?? w.get(m.item.id) ?? [];
586
+ if (c instanceof Error) throw c;
587
+ const g = m.item.paragraphs.map((A) => A.text.trim()).filter((A) => A && c.some((L) => L.trim() === A));
588
+ g.length && _("placeholder-prompt-left", M, m, { text: g.join(`
589
+ `), matchedCount: g.length, threshold: 0 });
590
+ }
591
+ if (r("image-distorted") && m.rendered.kind === "image" && !m.rendered.media && m.item.editable !== "frame") {
592
+ const x = m.rendered;
593
+ let c = (e.resolveImageMetadata ? await R("image-resolver-failed", U, () => e.resolveImageMetadata(U)) : void 0) ?? b.get(x.src);
594
+ if (!c) {
595
+ let G = X.get(x.src);
596
+ !G && x.src.startsWith("data:") && (G = new Uint8Array(await R("image-resource-failed", U, async () => (await fetch(x.src, { signal: e.signal })).arrayBuffer()))), c = G ? Je(G) ?? void 0 : void 0;
597
+ }
598
+ if (!c || !Number.isFinite(c.width) || !Number.isFinite(c.height) || c.width <= 0 || c.height <= 0) throw new k("image-metadata-unavailable", "图片缺少可用的原图尺寸,请提供 resolveImageMetadata", M, m.item.id);
599
+ b.set(x.src, c);
600
+ const g = x.crop, A = c.width * (1 - ((g == null ? void 0 : g.l) ?? 0) - ((g == null ? void 0 : g.r) ?? 0)), L = c.height * (1 - ((g == null ? void 0 : g.t) ?? 0) - ((g == null ? void 0 : g.b) ?? 0));
601
+ if (A <= 0 || L <= 0 || x.w <= 0 || x.h <= 0) throw new k("invalid-image-geometry", "图片裁剪后的尺寸和显示尺寸必须为正", M, m.item.id);
602
+ const q = x.w / x.h / (A / L), oe = Math.max(q, 1 / q) - 1;
603
+ oe > i.imageDeviation && _("image-distorted", M, m, { deviation: oe, threshold: i.imageDeviation, sourceWidth: c.width, sourceHeight: c.height });
604
+ }
605
+ for (let x = 0; x < m.units.length; x++) {
606
+ const c = m.units[x];
607
+ if (!r("text-overflow") && !r("low-contrast")) continue;
608
+ let g;
609
+ try {
610
+ g = Oe(c.body, c.width, c.height, { measureText: o, includeCarets: !1, anchor: "top" });
611
+ } catch (Y) {
612
+ throw new k(Y instanceof k ? Y.reason : "measurement-failed", String(Y), M, m.item.id);
613
+ }
614
+ const [A, L, q, oe] = c.body.insets, G = Math.max(A, ...g.lines.map((Y) => Y.y + Y.height)), ke = Math.max(1, (g.layoutWidth - oe - L - (g.columns - 1) * (c.body.columnGap ?? 0)) / g.columns), Ie = Math.max(0, ...g.lines.map((Y) => {
615
+ const J = oe + Y.columnIndex * (ke + (c.body.columnGap ?? 0));
616
+ return Math.max(J - Y.x, Y.x + Y.width - J - ke);
617
+ }));
618
+ if (r("text-overflow") && (g.autoFit !== "shape" && G > g.layoutHeight - q + i.tolerancePx || Ie > i.tolerancePx) && _("text-overflow", M, m, { contentBottom: G, availableBottom: g.layoutHeight - q, widthOverflow: Ie, tolerancePx: i.tolerancePx, fontScale: g.scale }, c.cell), !!r("low-contrast"))
619
+ for (let Y = 0; Y < c.body.paragraphs.length; Y++) for (let J = 0; J < c.body.paragraphs[Y].runs.length; J++) {
620
+ const I = c.body.paragraphs[Y].runs[J];
621
+ if (!I.text.trim() || me(I.color)[3] === 0 && !I.gradient && !I.gradientFill && !I.outline && !I.shadow && !I.shadowEffect) continue;
622
+ let F = ge(P.background, f);
623
+ for (const K of we.search({ minX: u.x, minY: u.y, maxX: u.x + u.width, maxY: u.y + u.height }).filter((N) => N.order < B).sort((N, O) => N.order - O.order)) {
624
+ const N = p[K.order], O = N.item.bounds;
625
+ N.item.hidden || N.rendered.kind === "group" || O.x >= u.x + u.width || O.y >= u.y + u.height || O.x + O.width <= u.x || O.y + O.height <= u.y || (N.rendered.kind === "shape" && O.x <= u.x && O.y <= u.y && O.x + O.width >= u.x + u.width && O.y + O.height >= u.y + u.height && (!N.rendered.fill || N.rendered.fill.type === "none" || ((ie = (te = N.rendered.editInfo) == null ? void 0 : te.geom) == null ? void 0 : ie.preset) === "rect") ? F = F && ge(N.rendered.fill, F) : (N.rendered.kind !== "shape" || N.rendered.fill && N.rendered.fill.type !== "none") && (F = null));
626
+ }
627
+ F = F && ge(c.fill, F), I.highlight && (F = F && yt(I.highlight, F));
628
+ const qe = we.search({ minX: u.x, minY: u.y, maxX: u.x + u.width, maxY: u.y + u.height }).some((K) => K.order > B && p[K.order].rendered.kind !== "group"), Ye = !F || Re || qe || m.rendered.kind === "group" || !!I.gradient || !!I.gradientFill || !!I.outline || !!I.shadow || !!I.shadowEffect || !!m.rendered.scene3d || !!c.fill && c.fill.type !== "none" && m.rendered.kind === "shape" && ((re = (ne = m.rendered.editInfo) == null ? void 0 : ne.geom) == null ? void 0 : re.preset) !== "rect", H = Ye ? e.resolveContrast ? await R("contrast-resolver-failed", U, () => e.resolveContrast({ ...U, body: c.body, paragraph: c.body.paragraphs[Y], run: I, textIndex: x, paragraphIndex: Y, runIndex: J })) : null : [{ foreground: I.color, background: "" }];
629
+ if (!H) throw new k("contrast-sampler-required", "复杂填充或文字效果需要 resolveContrast 提供实际前景/背景配对", M, m.item.id);
630
+ if (!Array.isArray(H) && "visible" in H && H.visible === !1) continue;
631
+ if (!Array.isArray(H)) throw new k("invalid-contrast-samples", "对比度采样必须为配对数组或 visible:false", M, m.item.id);
632
+ if (!H.length) throw new k("invalid-contrast-samples", "对比度采样不能为空", M, m.item.id);
633
+ const He = H.map((K) => {
634
+ const N = Ye ? me(K.background) : F;
635
+ if (N[3] !== 1) throw new k("invalid-contrast-samples", "采样背景必须已合成为不透明颜色", M, m.item.id);
636
+ return ot(me(K.foreground), N);
637
+ }), Ne = Math.min(...He), be = I.size * g.scale * (I.baseline ? 0.65 : 1), Ee = be >= 24 || I.b && be >= 14 * (96 / 72) ? 3 : 4.5;
638
+ Ne < Ee && _("low-contrast", M, m, { ratio: Ne, threshold: Ee, fontSize: be, sampleCount: H.length }, c.cell);
639
+ }
640
+ }
641
+ }
642
+ try {
643
+ await Se((se = e.onProgress) == null ? void 0 : se.call(e, { completed: M, total: s.slides.length }), e.signal);
644
+ } catch (B) {
645
+ throw B instanceof k ? B : new k("progress-callback-failed", String(B), M);
646
+ }
647
+ (e.signal || e.onProgress) && await new Promise((B) => setTimeout(B, 0));
648
+ }
649
+ return V(e.signal), v.sort((d, p) => d.slideNumber - p.slideNumber || (d.elementId < p.elementId ? -1 : d.elementId > p.elementId ? 1 : 0) || pe.indexOf(d.reason) - pe.indexOf(p.reason)), { version: 1, checks: t, totalSlides: s.slides.length, totalElements: s.description.totalElements, issues: v };
650
+ }
651
+ function yt(n, e) {
652
+ return ge({ type: "solid", color: n }, e);
653
+ }
654
+ export {
655
+ pe as LAYOUT_CHECKS,
656
+ k as LayoutLintError,
657
+ Xt as lintPresentation,
658
+ Bt as prepareLintText
659
+ };
@@ -0,0 +1,3 @@
1
+ import type { EditDoc } from './types';
2
+ export declare function masterHasEdits(doc: EditDoc, id: string): boolean;
3
+ export declare function masterHasElementEdits(doc: EditDoc, id: string): boolean;
@@ -0,0 +1,3 @@
1
+ import type { MasterTextCategory, SlideMasterTemplate } from '@web-ppt/core';
2
+ import type { EditDoc, MasterTextLevelState } from './types';
3
+ export declare function masterTextStyleStates(doc: EditDoc, masterId: string, resolved?: SlideMasterTemplate | null): Readonly<Record<MasterTextCategory, readonly MasterTextLevelState[]>>;