diff --git a/src/crates/assembly/core/builtin_skills/ppt-design/SKILL.md b/src/crates/assembly/core/builtin_skills/ppt-design/SKILL.md index 4e2821c80..bdba695ac 100644 --- a/src/crates/assembly/core/builtin_skills/ppt-design/SKILL.md +++ b/src/crates/assembly/core/builtin_skills/ppt-design/SKILL.md @@ -61,7 +61,7 @@ Agent 启动时的**当前工作区根目录就是当前 deck 根目录**,不 - 唯一导出链路是 **editable HTML → EditableSlideScene → OOXML**。每页严格为 **1280px × 720px**,不得建议或设计第二条导出链路。 - 只使用 solid color;不得生成 CSS gradient 或 `background-image`。背景、border、圆角只放在 `div` 等几何容器,文字标签不得承载 background、border 或 shadow。 -- `box-shadow` 只支持单层 outer、非 inset、zero spread;多层、inset、blur+spread 等不支持形态必须 blocking。`text-shadow` 任何非 `none` 形态均必须 blocking。 +- `box-shadow` 只支持单层 outer、非 inset、zero spread 的原生映射;多层 shadow 只取首个可用层,负 spread 按 0 近似,inset 等其余不支持形态导出时自动移除,不得依赖。`text-shadow` 任何非 `none` 形态在导出时一律自动移除,不得依赖其呈现层次。 - HTML 文字只可放在 `

`、`

`–`

`、`
  • ` 中;`span` 只作这些标签内的文本 run,不得生成 `div` 裸文字。 - 禁止 CSS `filter`、`mask`、generated content、animation、外部资源和复杂/filled SVG path;禁止任意顶点/非严格对称 polygon,仅允许严格对称 triangle/diamond。 - 线与曲线优先直接生成 `line` 或 `polyline`;只有确有必要时才写兼容边界所列的 path 子集。 diff --git a/src/crates/assembly/core/builtin_skills/ppt-design/references/data-information-visualization.md b/src/crates/assembly/core/builtin_skills/ppt-design/references/data-information-visualization.md index 14fc291d7..34f2b4f98 100644 --- a/src/crates/assembly/core/builtin_skills/ppt-design/references/data-information-visualization.md +++ b/src/crates/assembly/core/builtin_skills/ppt-design/references/data-information-visualization.md @@ -169,7 +169,7 @@ - 每页严格为 **1280px × 720px**。只使用 solid color;不得生成 CSS gradient 或 `background-image`。 - HTML 文字只可放在 `

    `、`

    `–`

    `、`
  • ` 中;`span` 只作文本 run,不得生成 `div` 裸文字。 -- `box-shadow` 只支持单层 outer、非 inset、zero spread;多层、inset、blur+spread 等不支持形态必须 blocking。`text-shadow` 任何非 `none` 形态均必须 blocking。 +- `box-shadow` 只支持单层 outer、非 inset、zero spread 的原生映射;多层 shadow 只取首个可用层,负 spread 按 0 近似,inset 等其余不支持形态导出时自动移除,不得依赖。`text-shadow` 任何非 `none` 形态在导出时一律自动移除,不得依赖其呈现层次。 - 图表、流程箭头、虚线和曲线必须使用支持的可编辑原语;线与曲线优先直接生成 `line` 或 `polyline`。 - 条形、柱形、进度、堆叠条使用纯色 shape;点图使用 ellipse;目标线、坐标轴和连接线使用 line。 - Authoring 流程箭头只由 editable line + CSS border triangle,或 SVG line + strict symmetric triangle polygon 构成。 diff --git a/src/crates/assembly/core/builtin_skills/ppt-design/references/editable-pptx.md b/src/crates/assembly/core/builtin_skills/ppt-design/references/editable-pptx.md index a8c02af4c..0e2139f3b 100644 --- a/src/crates/assembly/core/builtin_skills/ppt-design/references/editable-pptx.md +++ b/src/crates/assembly/core/builtin_skills/ppt-design/references/editable-pptx.md @@ -9,7 +9,7 @@ PPT Live 的唯一导出链路是 **editable HTML → EditableSlideScene → OOX - 每页严格为 **1280px × 720px**。只使用 solid color;不得生成 CSS gradient 或 `background-image`,即使 converter 对部分旧输入有兼容重写能力。 - HTML 文字只可放在 `

    `、`

    `–`

    `、`
  • ` 中;`span` 只作这些标签内的文本 run。不得生成 `div` 裸文字。 - 背景、border、圆角只放在 `div` 等几何容器;文字标签不得承载 background、border 或 shadow。 -- `box-shadow` 只支持单层 outer、非 inset、zero spread;多层、inset、blur+spread 等不支持形态必须 blocking。`text-shadow` 任何非 `none` 形态均必须 blocking。 +- `box-shadow` 只支持单层 outer、非 inset、zero spread 的原生映射;多层 shadow 只取首个可用层,负 spread 按 0 近似,inset 等其余不支持形态导出时自动移除,不得依赖。`text-shadow` 任何非 `none` 形态在导出时一律自动移除,不得依赖其呈现层次。 - 禁止 CSS `filter`、`mask`、generated content、animation、外部资源和复杂/filled SVG path;禁止任意顶点/非严格对称 polygon,仅允许严格对称 triangle/diamond。 - 线与曲线优先直接生成 `line` 或 `polyline`;只有确有必要时才写兼容边界所列的 path 子集,且最终仍须成为独立 editable line。 - Authoring 流程箭头只由 editable line + CSS border triangle,或 SVG line + strict symmetric triangle polygon 构成。 @@ -76,8 +76,8 @@ body { ## 3. Solid、Background 与 Border - 所有 fill、background 和 border 都必须是纯色;禁止 CSS gradient、纹理、图案填充和半透明叠图模拟。 -- 背景、边框和圆角只放在 `
    ` 等几何容器上。`box-shadow` 的精确可编辑子集仅为单层 outer shadow、非 inset、zero spread;多层、inset、blur+spread 或其他不支持形态必须 blocking。converter 可将 legacy hard ring(`0 0 0 Npx`)重写为同心可编辑 shape,但 authoring 不得依赖该 rewrite。 -- 文字标签不得有 background、border、border-radius 或 box-shadow;`text-shadow` 任何非 `none` 形态都必须 blocking,禁止静默丢失。 +- 背景、边框和圆角只放在 `
    ` 等几何容器上。`box-shadow` 的精确可编辑子集为单层 outer shadow、非 inset、zero spread 的原生映射;多层 shadow 只取首个可用层,负 spread 按 0 近似,inset 等其余不支持形态导出时自动移除。converter 可将 legacy hard ring(`0 0 0 Npx`)重写为同心可编辑 shape,但 authoring 不得依赖该 rewrite。 +- 文字标签不得有 background、border、border-radius 或 box-shadow;`text-shadow` 任何非 `none` 形态在导出时一律自动移除,不得依赖其呈现层次。 - `background-image` 在任何元素上都禁止。 - 数据条、色带和热力档位用多个离散纯色几何元素表达。 diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin.rs b/src/crates/contracts/product-domains/src/miniapp/builtin.rs index 156212f46..51ffac357 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin.rs +++ b/src/crates/contracts/product-domains/src/miniapp/builtin.rs @@ -151,7 +151,7 @@ pub const BUILTIN_APPS: &[BuiltinMiniAppBundle] = &[ }, BuiltinMiniAppBundle { id: "builtin-ppt-live", - version: 231, + version: 232, meta_json: include_str!("builtin/assets/ppt-live/meta.json"), html: include_str!("builtin/assets/ppt-live/index.html"), css: include_str!("builtin/assets/ppt-live/style.css"), diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/README.md b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/README.md index be8b6b36a..d1de8bc3f 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/README.md +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/README.md @@ -21,7 +21,7 @@ ppt-live/ ├── export-deck-host.js # 导出函数的 re-export 壳(ui.js 通过它引入导出能力) ├── export-deck-browser.js # EditableSlideScene/PDF/PNG 导出实现 ├── export-slide-browser.js # 幻灯片预处理编排(挂载 DOM → sanitize → scene) - ├── preflight-slide-audit.js # sanitizer 前可见元素、CSS paint/text-shadow fail-close + ├── export-degrade.js # 导出降级层(剥样式 / 移除元素 / 简化页面,代替阻断) ├── editable-slide-normalize.js # HTML/SVG/table → EditableSlideScene ├── editable-slide-scene.js # 可编辑场景契约、校验与结构化错误 ├── html2pptx-dom-core.js # DOM 几何与原生元素提取辅助 @@ -109,8 +109,11 @@ PPT Live 只有一条 PPTX 导出管线:HTML 幻灯片和旧 element-model 幻 映射为 PowerPoint 原生文本、形状、线、表格和有明确用户图片意图的 picture。 `EditableSlideScene` 不接受栅格兜底、整页截图、SVG 图片层或降级成功状态。可确定重写的 -CSS/SVG 构造会转换为原生节点;无法表示的输入会携带页码、source id 和错误码阻止导出。 -表格通过 `addTable` 写为原生 `a:tbl`,生成的几何不得产生 `p:pic` 或媒体关系。 +CSS/SVG 构造会转换为原生节点;其余无法表示的输入由导出降级层(`export-degrade.js`)处理: +不支持的样式(box-shadow、text-shadow、filter、mask、background-image、动画等)被剥离, +无法表示的元素被移除,仍失败的页面被替换为简化可编辑场景——所有降级都会记录在导出摘要中, +单个元素或单页问题不再阻断整个导出。表格通过 `addTable` 写为原生 `a:tbl`,生成的几何不得产生 +`p:pic` 或媒体关系。 DOM 几何来自 `getBoundingClientRect()`(border-box),以 `px / 96` 转换为英寸。 CSS padding 会成为文本框或表格单元格 inset;垂直对齐由可表示的布局属性推导。 @@ -130,10 +133,14 @@ prepareEditableSlides(slides, options) → loadHtmlInExportRoot(html) // 挂载到离屏 shadow-DOM div (1280×720) → sanitizeSlideDocumentRoot(doc) // 净化 HTML → waitForExportPaint() // 等待两帧渲染 - → normalizeDocumentToEditableScene(doc) + → normalizeWithDegradation(...) // 严格 normalize + 有界降级修复循环 + → buildSimplifiedEditableScene() // 单页最终兜底(保留页数与文字) → 返回 EditableSlideScene[] ``` +`options.onDegrade(record)` 逐条收集降级记录(剥样式 / 移除元素 / 简化页面), +由 `summarizePptxExportDiagnostics(scenes, degradations)` 合并进导出摘要展示给用户。 + 旧 element-model 页面通过 `normalizeElementSlideToEditableScene` 进入同一 scene 契约。 `exportEditablePptx(deck, scenes)` 逐页调用唯一 serializer 生成最终 PPTX;流程为顺序执行, 不插入人工延时。 diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/bundle.json b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/bundle.json index 21d2ce818..b34c4c06f 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/bundle.json +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/bundle.json @@ -1,5 +1,5 @@ { "schemaVersion": 1, "id": "builtin-ppt-live", - "version": 231 + "version": 232 } diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/dist/ui.bundle.js b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/dist/ui.bundle.js index 32a434f5e..4537c4be4 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/dist/ui.bundle.js +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/dist/ui.bundle.js @@ -30,9 +30,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge mod )); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/common.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/common.js var require_common = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/common.js"(exports) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/common.js"(exports) { "use strict"; var TYPED_OK = typeof Uint8Array !== "undefined" && typeof Uint16Array !== "undefined" && typeof Int32Array !== "undefined"; function _has(obj, key) { @@ -121,9 +121,9 @@ var require_common = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/trees.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/trees.js var require_trees = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/trees.js"(exports) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/trees.js"(exports) { "use strict"; var utils = require_common(); var Z_FIXED = 4; @@ -763,9 +763,9 @@ var require_trees = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/adler32.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/adler32.js var require_adler32 = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/adler32.js"(exports, module) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/adler32.js"(exports, module) { "use strict"; function adler32(adler, buf, len, pos) { var s1 = adler & 65535 | 0, s2 = adler >>> 16 & 65535 | 0, n = 0; @@ -785,9 +785,9 @@ var require_adler32 = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/crc32.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/crc32.js var require_crc32 = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/crc32.js"(exports, module) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/crc32.js"(exports, module) { "use strict"; function makeTable() { var c, table = []; @@ -813,9 +813,9 @@ var require_crc32 = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/messages.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/messages.js var require_messages = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/messages.js"(exports, module) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/messages.js"(exports, module) { "use strict"; module.exports = { 2: "need dictionary", @@ -840,9 +840,9 @@ var require_messages = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/deflate.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/deflate.js var require_deflate = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/deflate.js"(exports) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/deflate.js"(exports) { "use strict"; var utils = require_common(); var trees = require_trees(); @@ -1889,9 +1889,9 @@ var require_deflate = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/strings.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/strings.js var require_strings = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/strings.js"(exports) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/strings.js"(exports) { "use strict"; var utils = require_common(); var STR_APPLY_OK = true; @@ -2031,9 +2031,9 @@ var require_strings = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/zstream.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/zstream.js var require_zstream = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/zstream.js"(exports, module) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/zstream.js"(exports, module) { "use strict"; function ZStream() { this.input = null; @@ -2053,9 +2053,9 @@ var require_zstream = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/deflate.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/deflate.js var require_deflate2 = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/deflate.js"(exports) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/deflate.js"(exports) { "use strict"; var zlib_deflate = require_deflate(); var utils = require_common(); @@ -2214,9 +2214,9 @@ var require_deflate2 = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inffast.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inffast.js var require_inffast = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inffast.js"(exports, module) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inffast.js"(exports, module) { "use strict"; var BAD = 30; var TYPE = 12; @@ -2443,9 +2443,9 @@ var require_inffast = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inftrees.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inftrees.js var require_inftrees = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inftrees.js"(exports, module) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inftrees.js"(exports, module) { "use strict"; var utils = require_common(); var MAXBITS = 15; @@ -2759,9 +2759,9 @@ var require_inftrees = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inflate.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inflate.js var require_inflate = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inflate.js"(exports) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inflate.js"(exports) { "use strict"; var utils = require_common(); var adler32 = require_adler32(); @@ -3998,9 +3998,9 @@ var require_inflate = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/constants.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/constants.js var require_constants = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/constants.js"(exports, module) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/constants.js"(exports, module) { "use strict"; module.exports = { /* Allowed flush values; see deflate() and inflate() below for details */ @@ -4045,9 +4045,9 @@ var require_constants = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/gzheader.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/gzheader.js var require_gzheader = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/gzheader.js"(exports, module) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/gzheader.js"(exports, module) { "use strict"; function GZheader() { this.text = 0; @@ -4065,9 +4065,9 @@ var require_gzheader = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/inflate.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/inflate.js var require_inflate2 = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/inflate.js"(exports) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/inflate.js"(exports) { "use strict"; var zlib_inflate = require_inflate(); var utils = require_common(); @@ -4239,9 +4239,9 @@ var require_inflate2 = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/index.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/index.js var require_pako = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/index.js"(exports, module) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/index.js"(exports, module) { "use strict"; var assign = require_common().assign; var deflate = require_deflate2(); @@ -4253,9 +4253,9 @@ var require_pako = __commonJS({ } }); -// ../../../../../../../../../node_modules/.pnpm/jszip@3.10.1/node_modules/jszip/dist/jszip.min.js +// node_modules/.pnpm/jszip@3.10.1/node_modules/jszip/dist/jszip.min.js var require_jszip_min = __commonJS({ - "../../../../../../../../../node_modules/.pnpm/jszip@3.10.1/node_modules/jszip/dist/jszip.min.js"(exports, module) { + "node_modules/.pnpm/jszip@3.10.1/node_modules/jszip/dist/jszip.min.js"(exports, module) { !(function(e) { if ("object" == typeof exports && "undefined" != typeof module) module.exports = e(); else if ("function" == typeof define && define.amd) define([], e); @@ -6631,7 +6631,7 @@ var require_node_https = __commonJS({ } }); -// src/i18n.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/i18n.js var STRINGS = { "en-US": { eyebrow: "AI Deck Studio", @@ -6894,9 +6894,11 @@ var STRINGS = { exportPptxFailed: "PPTX export failed:", exportDiagnosticsSummary: "Exported with visual adjustments: {{counts}}. {{locations}}", exportDiagnosticsRepaired: "{{count}} automatic repairs", + exportDiagnosticsDegraded: "{{count}} degraded", exportDiagnosticsBlocking: "{{count}} blocking failures", exportDiagnosticsLocation: "Slide {{slide}}, element {{source}} ({{phase}}): {{reason}}", exportDiagnosticsPhaseRepair: "automatic repair", + exportDiagnosticsPhaseDegraded: "degraded", exportDiagnosticsPhaseBlocking: "blocking failure", exportPdfWorking: "Rendering PDF...", exportPdfDone: "PDF downloaded.", @@ -7276,9 +7278,11 @@ var STRINGS = { exportPptxFailed: "PPTX \u5BFC\u51FA\u5931\u8D25\uFF1A", exportDiagnosticsSummary: "\u5DF2\u5B8C\u6210\u5BFC\u51FA\uFF0C\u5E76\u8FDB\u884C\u4E86\u89C6\u89C9\u8C03\u6574\uFF1A{{counts}}\u3002{{locations}}", exportDiagnosticsRepaired: "\u81EA\u52A8\u4FEE\u590D {{count}} \u5904", + exportDiagnosticsDegraded: "\u964D\u7EA7\u5904\u7406 {{count}} \u5904", exportDiagnosticsBlocking: "\u963B\u65AD\u5931\u8D25 {{count}} \u5904", exportDiagnosticsLocation: "\u7B2C {{slide}} \u9875\uFF0C\u5143\u7D20 {{source}}\uFF08{{phase}}\uFF09\uFF1A{{reason}}", exportDiagnosticsPhaseRepair: "\u81EA\u52A8\u4FEE\u590D", + exportDiagnosticsPhaseDegraded: "\u964D\u7EA7\u5904\u7406", exportDiagnosticsPhaseBlocking: "\u963B\u65AD\u5931\u8D25", exportPdfWorking: "\u6B63\u5728\u6E32\u67D3 PDF...", exportPdfDone: "PDF \u5DF2\u4E0B\u8F7D\u3002", @@ -7413,7 +7417,7 @@ function translate(key, params = {}) { return value2; } -// src/style-presets.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/style-presets.js var STYLE_PRESET_UI_KEYS = ["clean-business", "insight-report"]; var STYLE_PRESETS = { // === 商务/极简 === @@ -7680,7 +7684,7 @@ function getAllStylePresets(locale) { }); } -// src/state.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/state.js var STORAGE_KEY = "pptLiveStudioStateV6"; var HISTORY_KEY = "pptLiveDeckHistoryV1"; var SCHEMA_VERSION = 6; @@ -8421,7 +8425,7 @@ function pointsFor(title, index, state2) { return picks; } -// src/flat-select.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/flat-select.js var OPEN_SELECTS = /* @__PURE__ */ new Set(); function closeSelect(wrap) { const menu = wrap.querySelector(".ppt-flat-select__menu"); @@ -8602,7 +8606,7 @@ if (typeof window !== "undefined" && typeof document !== "undefined" && !window. document.addEventListener("scroll", handleOutsideScroll, true); } -// src/element-model-html.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/element-model-html.js var escapeHtml2 = (value2) => String(value2 ?? "").replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'"); var DEFAULT_THEME = { background: "#ffffff", @@ -8745,7 +8749,7 @@ function buildElementSlideHtml(slide = {}) { `; } -// src/sanitize-slide-markup.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/sanitize-slide-markup.js var SVG_NAMESPACE = "http://www.w3.org/2000/svg"; var DELETE_WITH_CONTENT_TAGS = /* @__PURE__ */ new Set([ "script", @@ -9179,7 +9183,7 @@ function sanitizeSlideMarkup(markup) { return `${parsed.documentElement.outerHTML}`; } -// src/render.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/render.js function applyI18n() { document.documentElement.lang = getLocale(); document.querySelectorAll("[data-i18n]").forEach((node) => { @@ -10401,7 +10405,7 @@ function round(value2) { return Math.round(Number(value2) * 10) / 10; } -// src/sanitize-slide-html.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/sanitize-slide-html.js function sanitizeSlideDocumentRoot(doc = document, aggressive = false) { const document2 = doc; const view = document2.defaultView || window; @@ -10413,7 +10417,7 @@ function sanitizeSlideDocumentRoot(doc = document, aggressive = false) { const textContainerSelector = "p,h1,h2,h3,h4,h5,h6,li"; const manualBulletPattern = /^(\s*)([•●○▪‣·▸◆◇■□–—*-])\s+/u; const ambiguousBulletSymbols = /* @__PURE__ */ new Set(["-", "*", "\u2013", "\u2014"]); - function sourceIdOf3(element2) { + function sourceIdOf2(element2) { return element2?.dataset?.pptxSourceId || element2?.id || null; } function assignSourceIds() { @@ -10461,7 +10465,7 @@ function sanitizeSlideDocumentRoot(doc = document, aggressive = false) { }); } function derivedSourceId(element2, suffix) { - const base = sourceIdOf3(element2) || "pptx-source"; + const base = sourceIdOf2(element2) || "pptx-source"; let candidate = `${base}-${suffix}`; let sequence = 2; while (document2.querySelector(`[data-pptx-source-id="${candidate}"]`)) { @@ -10471,7 +10475,7 @@ function sanitizeSlideDocumentRoot(doc = document, aggressive = false) { return candidate; } function addDiagnostic(severity, code, message, element2 = null) { - const sourceId = sourceIdOf3(element2); + const sourceId = sourceIdOf2(element2); const key = `${severity}:${code}:${sourceId || ""}`; if (seenDiagnostics.has(key)) return; seenDiagnostics.add(key); @@ -10543,7 +10547,7 @@ function sanitizeSlideDocumentRoot(doc = document, aggressive = false) { }); }; copyOuterAttributes(current); - current.dataset.pptxSourceId = sourceIdOf3(outer); + current.dataset.pptxSourceId = sourceIdOf2(outer); [...outer.childNodes].forEach((node) => { if (node.nodeType === view.Node.ELEMENT_NODE && node.matches(textContainerSelector)) { if (current.textContent.trim() || current.children.length) fragments.push(current); @@ -10622,7 +10626,7 @@ function sanitizeSlideDocumentRoot(doc = document, aggressive = false) { const block = document2.createElement("p"); if (span.className) block.className = span.className; if (span.getAttribute("style")) block.setAttribute("style", span.getAttribute("style")); - block.dataset.pptxSourceId = sourceIdOf3(span); + block.dataset.pptxSourceId = sourceIdOf2(span); while (span.firstChild) block.appendChild(span.firstChild); span.replaceWith(block); addDiagnostic( @@ -10683,7 +10687,7 @@ function sanitizeSlideDocumentRoot(doc = document, aggressive = false) { item.setAttribute(attribute.name, attribute.value); } }); - item.dataset.pptxSourceId = sourceIdOf3(block); + item.dataset.pptxSourceId = sourceIdOf2(block); while (block.firstChild) item.appendChild(block.firstChild); removeManualBullet(item); list.appendChild(item); @@ -10990,7 +10994,7 @@ function sanitizeSlideDocumentRoot(doc = document, aggressive = false) { return { diagnostics }; } -// src/paint-order.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/paint-order.js function buildDomPaintOrderMap(doc) { const map = /* @__PURE__ */ new Map(); if (!doc?.body) return map; @@ -11001,7 +11005,7 @@ function buildDomPaintOrderMap(doc) { return map; } -// src/html2pptx-dom-core.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/html2pptx-dom-core.js var PT_PER_PX = 0.75; var PX_PER_IN = 96; function createSvgViewportMapper(svg, svgRect) { @@ -11280,18 +11284,26 @@ function extractSlideDataFromDocument(doc = document) { h: el.offsetHeight }; }; - const parseBoxShadow = (boxShadow) => { - if (!boxShadow || boxShadow === "none") return null; + const splitBoxShadowLayers = (boxShadow) => { + const layers = []; let nesting = 0; - for (const character of boxShadow) { + let start = 0; + for (let index = 0; index < boxShadow.length; index += 1) { + const character = boxShadow[index]; if (character === "(") nesting += 1; else if (character === ")") nesting = Math.max(0, nesting - 1); - else if (character === "," && nesting === 0) return null; + else if (character === "," && nesting === 0) { + layers.push(boxShadow.slice(start, index)); + start = index + 1; + } } - const insetMatch = boxShadow.match(/inset/); - if (insetMatch) return null; - const colorMatch = boxShadow.match(/rgba?\([^)]+\)|#[0-9a-fA-F]{3,8}/); - const withoutColor = boxShadow.replace(/rgba?\([^)]+\)/g, " ").replace(/#[0-9a-fA-F]{3,8}/g, " "); + layers.push(boxShadow.slice(start)); + return layers.map((layer) => layer.trim()).filter(Boolean); + }; + const parseBoxShadowLayer = (layer) => { + if (/\binset\b/i.test(layer)) return null; + const colorMatch = layer.match(/rgba?\([^)]+\)|#[0-9a-fA-F]{3,8}/); + const withoutColor = layer.replace(/rgba?\([^)]+\)/g, " ").replace(/#[0-9a-fA-F]{3,8}/g, " "); const parts = withoutColor.match(/-?\d*\.?\d+(?:px|pt)?/g); if (!parts || parts.length < 2) return null; const offsetX = parseFloat(parts[0]); @@ -11309,14 +11321,11 @@ function extractSlideDataFromDocument(doc = document) { if (!Number.isFinite(opacity) || opacity < 0 || opacity > 1) return null; const color = colorMatch ? rgbToHex2(colorMatch[0]) : "000000"; if (!color) return null; - if (spread !== 0) { - if (offsetX === 0 && offsetY === 0 && blur === 0 && spread > 0) { - return { - mode: "ring", - ring: { spreadPx: spread, color, opacity } - }; - } - return null; + if (spread > 0 && offsetX === 0 && offsetY === 0 && blur === 0) { + return { + mode: "ring", + ring: { spreadPx: spread, color, opacity } + }; } let angle = 0; if (offsetX !== 0 || offsetY !== 0) { @@ -11337,6 +11346,14 @@ function extractSlideDataFromDocument(doc = document) { } }; }; + const parseBoxShadow = (boxShadow) => { + if (!boxShadow || boxShadow === "none") return null; + for (const layer of splitBoxShadowLayers(boxShadow)) { + const parsed = parseBoxShadowLayer(layer); + if (parsed) return parsed; + } + return null; + }; const outerShadowOf = (effect) => effect?.mode === "outer" ? effect.shadow : null; const parseInlineFormatting = (element2, baseOptions = {}, runs = [], baseTextTransform = (x) => x) => { let prevNodeIsText = false; @@ -12717,7 +12734,7 @@ function extractSlideDataFromDocument(doc = document) { }; } -// src/editable-slide-scene.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/editable-slide-scene.js var EDITABLE_NODE_TYPES = /* @__PURE__ */ new Set([ "text", "shape", @@ -13362,7 +13379,7 @@ function validateEditableSlideScene(scene) { return scene; } -// src/editable-slide-normalize.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/editable-slide-normalize.js var GRADIENT_GRID_SIZE = 16; var CURVE_MAX_SEGMENTS = 64; function sourceIdOf(element2, fallback = "slide-document") { @@ -14642,7 +14659,7 @@ function normalizeDocumentToEditableScene(doc, { slideNumber, width, height } = return validateEditableSlideScene(scene); } -// src/pptx-element-export.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/pptx-element-export.js var SLIDE_W = 13.333; var SLIDE_H = 7.5; function pct(value2) { @@ -14985,793 +15002,439 @@ function normalizeElementSlideToEditableScene(sourceSlide = {}, { slideNumber = }); } -// src/preflight-slide-audit.js -var VISIBLE_UNSUPPORTED_SELECTOR = [ - "canvas", - "video", - "audio", - "iframe", - "object", - "embed", - "frame", - "frameset", - "portal", - "applet", - "input", - "button", - "select", - "textarea", - "progress", - "meter", - "dialog", - 'link[rel~="stylesheet" i]' -].join(","); -function sourceIdOf2(element2, slideNumber) { - return element2?.getAttribute?.("data-pptx-source-id") || element2?.id || `slide-${slideNumber}`; -} -function fail2(slideNumber, element2, code, message) { - throw new EditableExportError({ - slideNumber, - sourceId: sourceIdOf2(element2, slideNumber), - code, - message - }); -} -function canonicalizeCssSyntax(value2) { - const input = String(value2 || ""); - let output = ""; - let quote = null; - for (let index = 0; index < input.length; ) { - const character = input[index]; - if (quote) { - output += character; - index += 1; - if (character === "\\" && index < input.length) { - output += input[index]; - index += 1; - } else if (character === quote) { - quote = null; - } - continue; - } - if (character === '"' || character === "'") { - quote = character; - output += character; - index += 1; - continue; - } - if (character === "/" && input[index + 1] === "*") { - const end = input.indexOf("*/", index + 2); - index = end < 0 ? input.length : end + 2; - continue; - } - if (character !== "\\") { - output += character; - index += 1; - continue; - } - index += 1; - if (index >= input.length) break; - if (input[index] === "\n" || input[index] === "\r" || input[index] === "\f") { - if (input[index] === "\r" && input[index + 1] === "\n") index += 1; - index += 1; - continue; - } - const hex2 = input.slice(index).match(/^[0-9a-f]{1,6}/i)?.[0]; - if (hex2) { - const codePoint = Number.parseInt(hex2, 16); - output += String.fromCodePoint( - codePoint === 0 || codePoint > 1114111 ? 65533 : codePoint - ); - index += hex2.length; - if (/[\t\n\f\r ]/.test(input[index] || "")) index += 1; - continue; - } - output += input[index]; - index += 1; +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-degrade.js +var MAX_REPAIRS_PER_SLIDE = 48; +function colorToHex2(value2, fallback = null) { + const raw = String(value2 || "").trim().toLowerCase(); + if (!raw || raw === "transparent") return fallback; + const hex2 = raw.match(/^#([\da-f]{3}|[\da-f]{6})$/i)?.[1]; + if (hex2) { + return (hex2.length === 3 ? hex2.split("").map((c) => c + c).join("") : hex2).toUpperCase(); } - return output; -} -function cssValueHasUrlToken(value2) { - const css = canonicalizeCssSyntax(value2); - let quote = null; - for (let index = 0; index < css.length; ) { - const character = css[index]; - if (quote) { - if (character === "\\") index += 2; - else { - if (character === quote) quote = null; - index += 1; - } - continue; - } - if (character === '"' || character === "'") { - quote = character; - index += 1; - continue; - } - if (!/[a-z_-]/i.test(character)) { - index += 1; - continue; - } - const start = index; - while (index < css.length && /[a-z0-9_-]/i.test(css[index])) index += 1; - const identifier = css.slice(start, index).toLowerCase(); - while (index < css.length && /\s/.test(css[index])) index += 1; - if (identifier === "url" && css[index] === "(") return true; + const rgb2 = raw.match(/^rgba?\(\s*([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)(?:\s*[,/]\s*([\d.]+%?))?\s*\)$/i); + if (rgb2) { + const alpha = rgb2[4] == null ? 1 : rgb2[4].endsWith("%") ? Number.parseFloat(rgb2[4]) / 100 : Number(rgb2[4]); + if (Number.isFinite(alpha) && alpha <= 0.05) return fallback; + return rgb2.slice(1, 4).map((channel) => Math.round(Number(channel)).toString(16).padStart(2, "0")).join("").toUpperCase(); } - return false; + return fallback; } -function referencedCustomProperties(value2) { - const css = canonicalizeCssSyntax(value2); - const references = []; - let quote = null; - for (let index = 0; index < css.length; ) { - const character = css[index]; - if (quote) { - if (character === "\\") index += 2; - else { - if (character === quote) quote = null; - index += 1; - } - continue; - } - if (character === '"' || character === "'") { - quote = character; - index += 1; - continue; - } - const match = css.slice(index).match(/^var\s*\(\s*(--[a-z0-9_-]+)/i); - if (match) { - references.push(match[1]); - index += match[0].length; - continue; - } - index += 1; +function findElementBySourceId(doc, sourceId) { + if (!sourceId) return null; + const byDataId = [...doc.querySelectorAll("[data-pptx-source-id]")].find((element2) => element2.dataset.pptxSourceId === sourceId); + if (byDataId) return byDataId; + try { + return doc.querySelector(`#${(globalThis.CSS?.escape || ((v) => v))(sourceId)}`); + } catch { + return null; } - return references; } -function valueOrVariableHasUrl(value2, declarations, seen = /* @__PURE__ */ new Set()) { - if (cssValueHasUrlToken(value2)) return true; - return referencedCustomProperties(value2).some((property) => { - if (seen.has(property) || !declarations.has(property)) return false; - const nextSeen = new Set(seen); - nextSeen.add(property); - return valueOrVariableHasUrl(declarations.get(property), declarations, nextSeen); - }); +function scrubAuthoredStyle(element2, properties) { + const raw = element2?.dataset?.pptxAuthoredStyle; + if (!raw) return; + const next = raw.split(";").map((part) => part.trim()).filter(Boolean).filter((part) => !properties.some((property) => part.toLowerCase().startsWith(`${property}:`))).join("; "); + if (next) element2.dataset.pptxAuthoredStyle = next; + else delete element2.dataset.pptxAuthoredStyle; } -function textShadowIsVisible(value2, declarations, seen = /* @__PURE__ */ new Set()) { - const normalized = canonicalizeCssSyntax(value2).trim().toLowerCase(); - if (!normalized || normalized === "none") return false; - const references = referencedCustomProperties(value2); - if (!references.length) return true; - return references.some((property) => { - if (seen.has(property) || !declarations.has(property)) return false; - const nextSeen = new Set(seen); - nextSeen.add(property); - return textShadowIsVisible(declarations.get(property), declarations, nextSeen); - }); +function stripStyleProperty(element2, property, properties = [property], replacement = "none") { + element2.style?.setProperty?.(property, replacement, "important"); + scrubAuthoredStyle(element2, properties); } -function styleDeclarations(style) { - const declarations = /* @__PURE__ */ new Map(); - for (let index = 0; index < style.length; index += 1) { - const property = style[index].toLowerCase(); - declarations.set(property, { - value: style.getPropertyValue(property), - important: style.getPropertyPriority(property) === "important" +function stripStyleProperties(element2, entries) { + entries.forEach(([property, replacement]) => { + element2.style?.setProperty?.(property, replacement ?? "none", "important"); + }); + scrubAuthoredStyle(element2, entries.map(([property]) => property)); +} +function replaceWithRepairedClone(element2, mutate) { + const clone2 = element2.cloneNode(true); + mutate(clone2); + element2.replaceWith(clone2); + return clone2; +} +function record(code, sourceId, message) { + return { code, sourceId: sourceId || null, message }; +} +function repairSvgPaintServer(element2) { + if (!element2) return false; + let applied = false; + for (const property of ["fill", "stroke"]) { + if (/url\s*\(/i.test(element2.getAttribute?.(property) || "")) { + element2.setAttribute(property, "#9AA3AF"); + applied = true; + } + if (/url\s*\(/i.test(element2.style?.getPropertyValue?.(property) || "")) { + element2.style.setProperty(property, "#9AA3AF", "important"); + applied = true; + } + } + if (!applied) { + element2.removeAttribute("class"); + ["fill", "stroke"].forEach((property) => { + element2.style?.setProperty?.(property, "#9AA3AF", "important"); }); - } - return declarations; -} -function parsedDeclarations(doc, cssText) { - const probe = doc.createElement("div"); - probe.style.cssText = canonicalizeCssSyntax(cssText); - return styleDeclarations(probe.style); -} -function compareSpecificity(left, right) { - for (let index = 0; index < left.length; index += 1) { - if (left[index] !== right[index]) return left[index] - right[index]; - } - return 0; -} -function applyCascadeDeclaration(target, property, declaration) { - const current = target.get(property); - const shouldReplace = !current || Number(declaration.important) > Number(current.important) || declaration.important === current.important && (compareSpecificity(declaration.specificity, current.specificity) > 0 || compareSpecificity(declaration.specificity, current.specificity) === 0 && declaration.sourceOrder >= current.sourceOrder); - if (shouldReplace) target.set(property, declaration); -} -function splitSelectorList(selectorText) { - const selectors = []; - let start = 0; - let quote = null; - let squareDepth = 0; - let roundDepth = 0; - for (let index = 0; index < selectorText.length; index += 1) { - const character = selectorText[index]; - if (quote) { - if (character === "\\") index += 1; - else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") quote = character; - else if (character === "[") squareDepth += 1; - else if (character === "]") squareDepth = Math.max(0, squareDepth - 1); - else if (character === "(") roundDepth += 1; - else if (character === ")") roundDepth = Math.max(0, roundDepth - 1); - else if (character === "," && squareDepth === 0 && roundDepth === 0) { - selectors.push(selectorText.slice(start, index).trim()); - start = index + 1; - } - } - selectors.push(selectorText.slice(start).trim()); - return selectors.filter(Boolean); -} -function matchingParenthesis(value2, openingIndex) { - let depth = 1; - let quote = null; - for (let index = openingIndex + 1; index < value2.length; index += 1) { - const character = value2[index]; - if (quote) { - if (character === "\\") index += 1; - else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") quote = character; - else if (character === "(") depth += 1; - else if (character === ")") { - depth -= 1; - if (depth === 0) return index; - } - } - return value2.length - 1; -} -function replaceCssUrlsForProjection(value2) { - const css = canonicalizeCssSyntax(value2); - let output = ""; - let quote = null; - for (let index = 0; index < css.length; ) { - const character = css[index]; - if (quote) { - output += character; - index += 1; - if (character === "\\" && index < css.length) { - output += css[index]; - index += 1; - } else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") { - quote = character; - output += character; - index += 1; - continue; - } - if (!/[a-z_-]/i.test(character)) { - output += character; - index += 1; - continue; - } - const start = index; - while (index < css.length && /[a-z0-9_-]/i.test(css[index])) index += 1; - const identifier = css.slice(start, index); - let opening = index; - while (opening < css.length && /\s/.test(css[opening])) opening += 1; - if (identifier.toLowerCase() !== "url" || css[opening] !== "(") { - output += css.slice(start, index); - continue; - } - const closing = matchingParenthesis(css, opening); - output += 'url("#__pptx_paint_server_probe__")'; - index = closing + 1; - } - return output; -} -function stripCssImports(value2) { - const css = String(value2 || ""); - let output = ""; - let quote = null; - for (let index = 0; index < css.length; ) { - const character = css[index]; - if (quote) { - output += character; - index += 1; - if (character === "\\" && index < css.length) { - output += css[index]; - index += 1; - } else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") { - quote = character; - output += character; - index += 1; - continue; - } - const importMatch = css.slice(index).match(/^@import\b/i); - if (!importMatch) { - output += character; - index += 1; - continue; - } - index += importMatch[0].length; - let parentheses = 0; - let importQuote = null; - while (index < css.length) { - const importCharacter = css[index]; - if (importQuote) { - if (importCharacter === "\\") index += 2; - else { - if (importCharacter === importQuote) importQuote = null; - index += 1; - } - } else if (importCharacter === '"' || importCharacter === "'") { - importQuote = importCharacter; - index += 1; - } else if (importCharacter === "(") { - parentheses += 1; - index += 1; - } else if (importCharacter === ")") { - parentheses = Math.max(0, parentheses - 1); - index += 1; - } else if (importCharacter === ";" && parentheses === 0) { - index += 1; - break; - } else index += 1; - } - } - return output; -} -function maxSpecificity(selectors) { - return selectors.reduce((maximum, selector) => { - const specificity = selectorSpecificity(selector); - return compareSpecificity(specificity, maximum) > 0 ? specificity : maximum; - }, [0, 0, 0, 0]); -} -function selectorSpecificity(selector) { - const css = canonicalizeCssSyntax(selector); - const specificity = [0, 0, 0, 0]; - let expectsType = true; - for (let index = 0; index < css.length; ) { - const character = css[index]; - if (/\s/.test(character) || [">", "+", "~", ","].includes(character)) { - expectsType = true; - index += 1; - continue; - } - if (character === "#") { - specificity[1] += 1; - index += 1; - while (index < css.length && /[\w-]/.test(css[index])) index += 1; - expectsType = false; - continue; - } - if (character === ".") { - specificity[2] += 1; - index += 1; - while (index < css.length && /[\w-]/.test(css[index])) index += 1; - expectsType = false; - continue; - } - if (character === "[") { - specificity[2] += 1; - let quote = null; - index += 1; - while (index < css.length) { - if (quote) { - if (css[index] === "\\") index += 2; - else { - if (css[index] === quote) quote = null; - index += 1; - } - } else if (css[index] === '"' || css[index] === "'") { - quote = css[index]; - index += 1; - } else if (css[index] === "]") { - index += 1; - break; - } else index += 1; - } - expectsType = false; - continue; - } - if (character === ":") { - const pseudoElement = css[index + 1] === ":"; - index += pseudoElement ? 2 : 1; - const nameStart = index; - while (index < css.length && /[\w-]/.test(css[index])) index += 1; - const name = css.slice(nameStart, index).toLowerCase(); - const legacyPseudoElement = ["before", "after", "first-line", "first-letter"].includes(name); - if (pseudoElement || legacyPseudoElement) specificity[3] += 1; - else if (!["where", "is", "not", "has"].includes(name)) specificity[2] += 1; - if (css[index] === "(") { - const closing = matchingParenthesis(css, index); - const argument = css.slice(index + 1, closing); - if (["is", "not", "has"].includes(name)) { - const nested = maxSpecificity(splitSelectorList(argument)); - specificity[1] += nested[1]; - specificity[2] += nested[2]; - specificity[3] += nested[3]; - } else if (["nth-child", "nth-last-child"].includes(name)) { - const ofMatch = argument.match(/\bof\b([\s\S]*)$/i); - if (ofMatch) { - const nested = maxSpecificity(splitSelectorList(ofMatch[1])); - specificity[1] += nested[1]; - specificity[2] += nested[2]; - specificity[3] += nested[3]; - } - } - index = closing + 1; - } - expectsType = false; - continue; - } - if (character === "*") { - expectsType = false; - index += 1; - continue; - } - if (expectsType && /[a-z_-]/i.test(character)) { - specificity[3] += 1; - while (index < css.length && /[\w-]/.test(css[index])) index += 1; - expectsType = false; - continue; - } - index += 1; - } - return specificity; -} -function matchingSelectorSpecificity(element2, selectorText) { - const matchingSelectors = splitSelectorList(selectorText).filter((selector) => { - try { - return element2.matches(selector); - } catch { - return false; - } + applied = true; + } + return applied; +} +function removeMatching(element2, selector) { + const matches = element2?.matches?.(selector) ? [element2] : [...element2?.querySelectorAll?.(selector) || []]; + matches.forEach((node) => node.remove()); + return matches.length > 0; +} +function deleteGeneratedContentRules(doc) { + let removed = false; + doc.querySelectorAll("style").forEach((style) => { + const css = style.textContent || ""; + if (!/::?(?:before|after)\b/i.test(css)) return; + const next = css.replace(/[^{}]+::?(?:before|after)\s*\{[^{}]*\}/gi, (block) => { + if (!/\bcontent\s*:\s*(?!none\b|normal\b|"''|"")([^;}]+)/i.test(block)) return block; + removed = true; + return ""; + }); + if (next !== css) style.textContent = next; }); - return matchingSelectors.length ? maxSpecificity(matchingSelectors) : null; -} -function walkCssRules(rules, visit) { - for (const rule of rules || []) { - if (rule.selectorText && rule.style) visit(rule); - if (rule.cssRules) walkCssRules(rule.cssRules, visit); - } + return removed; +} +function stripLeadingManualBullet(element2) { + const view = element2?.ownerDocument?.defaultView; + if (!element2 || !view) return false; + const walker = element2.ownerDocument.createTreeWalker(element2, view.NodeFilter.SHOW_TEXT); + const textNode2 = walker.nextNode(); + if (!textNode2) return false; + const next = String(textNode2.textContent || "").replace(/^(\s*)[•●○▪‣·▸◆◇■□]\s*/u, "$1"); + if (next === textNode2.textContent) return false; + textNode2.textContent = next; + return true; } -function findCssOpeningBrace(css, start) { - let quote = null; - let parentheses = 0; - for (let index = start; index < css.length; index += 1) { - const character = css[index]; - if (quote) { - if (character === "\\") index += 1; - else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") quote = character; - else if (character === "(") parentheses += 1; - else if (character === ")") parentheses = Math.max(0, parentheses - 1); - else if (character === "{" && parentheses === 0) return index; - else if (character === ";" && parentheses === 0) return -index - 2; - } - return -1; +function repairCanvasSize(doc, { widthPx, heightPx }) { + const body = doc.body; + if (!body) return false; + body.style?.setProperty?.("width", `${widthPx}px`, "important"); + body.style?.setProperty?.("height", `${heightPx}px`, "important"); + body.style?.setProperty?.("max-width", `${widthPx}px`, "important"); + body.style?.setProperty?.("max-height", `${heightPx}px`, "important"); + scrubAuthoredStyle(body, ["width", "height", "max-width", "max-height"]); + return true; } -function findCssClosingBrace(css, openingBrace) { - let quote = null; - let depth = 1; - for (let index = openingBrace + 1; index < css.length; index += 1) { - const character = css[index]; - if (quote) { - if (character === "\\") index += 1; - else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") quote = character; - else if (character === "{") depth += 1; - else if (character === "}") { - depth -= 1; - if (depth === 0) return index; - } - } - return -1; -} -function walkCssTextRules(cssText, visit) { - const css = canonicalizeCssSyntax(cssText); - let cursor = 0; - while (cursor < css.length) { - while (cursor < css.length && /[\s;]/.test(css[cursor])) cursor += 1; - if (cursor >= css.length) break; - const openingResult = findCssOpeningBrace(css, cursor); - if (openingResult < 0) { - if (openingResult < -1) { - cursor = -openingResult - 1; - continue; - } - break; - } - const closingBrace = findCssClosingBrace(css, openingResult); - if (closingBrace < 0) break; - const prelude = css.slice(cursor, openingResult).trim(); - const block = css.slice(openingResult + 1, closingBrace); - if (/^@(media|supports|layer|container|document)\b/i.test(prelude)) { - walkCssTextRules(block, visit); - } else if (!prelude.startsWith("@")) { - visit(prelude, block); - } - cursor = closingBrace + 1; - } -} -function collectStylesheetDeclarations(parsed) { - const byElement = /* @__PURE__ */ new Map(); - let sourceOrder = 0; - for (const authoredStyle of parsed.querySelectorAll("style")) { - const cssDocument = parsed.implementation.createHTMLDocument(""); - const style = cssDocument.createElement("style"); - style.textContent = canonicalizeCssSyntax(authoredStyle.textContent || ""); - cssDocument.head.appendChild(style); - const mergeRule = (selectorText, declarationsToMerge) => { - let targets; - try { - targets = parsed.querySelectorAll(selectorText); - } catch { - return; - } - for (const target of targets) { - const specificity = matchingSelectorSpecificity(target, selectorText); - if (!specificity) continue; - const declarations = byElement.get(target) || /* @__PURE__ */ new Map(); - const entries = declarationsToMerge instanceof Map ? declarationsToMerge : styleDeclarations(declarationsToMerge); - for (const [property, declaration] of entries) { - applyCascadeDeclaration(declarations, property, { - ...declaration, - specificity, - sourceOrder - }); - } - byElement.set(target, declarations); - } - sourceOrder += 1; - }; - if (style.sheet?.cssRules) { - walkCssRules(style.sheet.cssRules, (rule) => mergeRule(rule.selectorText, rule.style)); - } else { - walkCssTextRules(authoredStyle.textContent || "", (selectorText, declarationText) => { - mergeRule(selectorText, parsedDeclarations(parsed, declarationText)); +function applyExportDegradationRepair(doc, diagnostic, { slideNumber, widthPx, heightPx } = {}) { + const code = String(diagnostic?.code || ""); + const sourceId = diagnostic?.sourceId || null; + const element2 = findElementBySourceId(doc, sourceId) || (sourceId && [`slide-${slideNumber}`, "slide-document"].includes(sourceId) ? doc.body : null); + switch (code) { + case "box_shadow_unsupported": { + if (!element2) return null; + replaceWithRepairedClone(element2, (clone2) => { + stripStyleProperty(clone2, "box-shadow", ["box-shadow"]); }); + return record("box_shadow_removed", sourceId, "Unsupported CSS box-shadow was removed."); } - } - for (const element2 of parsed.querySelectorAll("svg [fill], svg [stroke], svg[fill], svg[stroke]")) { - const declarations = byElement.get(element2) || /* @__PURE__ */ new Map(); - for (const property of ["fill", "stroke"]) { - if (!element2.hasAttribute(property)) continue; - applyCascadeDeclaration(declarations, property, { - value: canonicalizeCssSyntax(element2.getAttribute(property)), - important: false, - specificity: [0, 0, 0, 0], - sourceOrder: -1 + case "text_shadow_unsupported": { + if (!element2) return null; + replaceWithRepairedClone(element2, (clone2) => { + stripStyleProperty(clone2, "text-shadow", ["text-shadow"]); }); + return record("text_shadow_removed", sourceId, "Unsupported CSS text-shadow was removed."); } - byElement.set(element2, declarations); - } - for (const element2 of parsed.querySelectorAll("[style]")) { - const declarations = byElement.get(element2) || /* @__PURE__ */ new Map(); - for (const [property, declaration] of parsedDeclarations( - parsed, - element2.getAttribute("style") || "" - )) { - applyCascadeDeclaration(declarations, property, { - ...declaration, - specificity: [1, 0, 0, 0], - sourceOrder + case "css_filter": { + if (!element2) return null; + replaceWithRepairedClone(element2, (clone2) => { + stripStyleProperty(clone2, "filter", ["filter", "-webkit-filter"]); + }); + return record("css_filter_removed", sourceId, "CSS filter was removed."); + } + case "css_mask": { + if (!element2) return null; + replaceWithRepairedClone(element2, (clone2) => { + stripStyleProperties(clone2, [ + ["mask"], + ["mask-image"], + ["-webkit-mask"], + ["-webkit-mask-image"] + ]); + clone2.removeAttribute?.("mask"); }); + return record("css_mask_removed", sourceId, "CSS mask was removed."); } - byElement.set(element2, declarations); - sourceOrder += 1; - } - return byElement; -} -function declarationsWithInheritedCustomProperties(element2, declarationsByElement) { - const declarations = /* @__PURE__ */ new Map(); - const ancestors = []; - let current = element2.parentElement; - while (current) { - ancestors.unshift(current); - current = current.parentElement; - } - for (const ancestor of ancestors) { - for (const [property, declaration] of declarationsByElement.get(ancestor) || []) { - if (property.startsWith("--") || ["fill", "stroke", "text-shadow"].includes(property)) { - declarations.set(property, declaration.value); + case "animation_unsupported": { + if (element2) { + replaceWithRepairedClone(element2, (clone2) => { + stripStyleProperties(clone2, [["animation"], ["animation-name"], ["transition"]]); + }); } + const scope = doc; + const removed = removeMatching(scope, "animate, animateMotion, animateTransform, set"); + if (!element2 && !removed) return null; + return record("animation_removed", sourceId, "CSS/SVG animation was removed."); + } + case "inline_margin": { + if (!element2) return null; + replaceWithRepairedClone(element2, (clone2) => { + stripStyleProperties(clone2, [ + ["margin", "0"], + ["margin-top", "0"], + ["margin-right", "0"], + ["margin-bottom", "0"], + ["margin-left", "0"] + ]); + }); + return record("inline_margin_removed", sourceId, "Unsupported inline margin was ignored."); } + case "background_image_unsupported": + case "merge_background_image": { + if (element2 && element2 !== doc.body) { + replaceWithRepairedClone(element2, (clone2) => { + stripStyleProperty(clone2, "background-image", ["background-image", "background"]); + }); + return record("background_image_removed", sourceId, "CSS background image was removed (solid color kept)."); + } + const target = element2 || doc.body; + if (!target) return null; + stripStyleProperty(target, "background-image", ["background-image", "background"]); + return record("background_image_removed", sourceId || "slide-document", "CSS background image was removed (solid color kept)."); + } + case "external_resource": { + if (!element2) return null; + if (element2 === doc.body) { + stripStyleProperty(element2, "background-image", ["background-image", "background"]); + return record("background_image_removed", sourceId || "slide-document", "External background resource was removed."); + } + element2.remove(); + return record("element_removed", sourceId, "An element referencing an external resource was removed."); + } + case "svg_paint_server_unsupported": { + if (!element2) return null; + let applied = false; + replaceWithRepairedClone(element2, (clone2) => { + applied = repairSvgPaintServer(clone2); + }); + if (!applied) return null; + return record("svg_paint_server_removed", sourceId, "SVG paint-server fill/stroke was replaced with a solid color."); + } + case "svg_mask": { + const svg = element2?.closest?.("svg") || element2; + if (!svg) return null; + svg.querySelectorAll("mask").forEach((node) => node.remove()); + (svg.matches?.("[mask]") ? [svg] : [...svg.querySelectorAll("[mask]")]).forEach((node) => node.removeAttribute("mask")); + return record("svg_feature_removed", sourceId, "SVG mask was removed."); + } + case "svg_filter_unsupported": { + const svg = element2?.closest?.("svg") || element2; + if (!svg) return null; + svg.querySelectorAll("filter, foreignObject, pattern, use, image").forEach((node) => node.remove()); + (svg.matches?.("[filter]") ? [svg] : [...svg.querySelectorAll("[filter]")]).forEach((node) => node.removeAttribute("filter")); + return record("svg_feature_removed", sourceId, "Unsupported SVG filter/resource construct was removed."); + } + case "complex_svg_unsupported": { + const svg = element2?.closest?.("svg") || element2; + if (!svg) return null; + svg.querySelectorAll("filter, mask, foreignObject, use, pattern, textPath, clipPath, image").forEach((node) => node.remove()); + return record("svg_feature_removed", sourceId, "Unsupported SVG feature was removed."); + } + case "svg_defs_geometry_unsupported": { + if (!element2) return null; + const defs = element2.closest?.("defs"); + (defs || element2).remove(); + return record("svg_feature_removed", sourceId, "SVG defs geometry was removed."); + } + case "svg_transform_unsupported": + case "svg_polygon_unsupported": + case "unmeasurable_placeholder": { + if (!element2) return null; + element2.remove(); + return record("element_removed", sourceId, "An element that cannot be represented as editable geometry was removed."); + } + case "svg_round_rect_radius_unsupported": { + if (!element2) return null; + element2.removeAttribute("rx"); + element2.removeAttribute("ry"); + return record("svg_feature_removed", sourceId, "SVG rounded-rect radius was dropped to a plain rectangle."); + } + case "svg_path_fill_unsupported": { + if (!element2) return null; + const fill2 = element2.getAttribute("fill") || element2.style?.getPropertyValue?.("fill") || "#9AA3AF"; + element2.setAttribute("fill", "none"); + element2.setAttribute("stroke", /^#|^rgb/i.test(fill2) ? fill2 : "#9AA3AF"); + if (!element2.getAttribute("stroke-width")) element2.setAttribute("stroke-width", "1.5"); + return record("svg_path_outline", sourceId, "A filled SVG path was converted to an editable outline."); + } + case "generated_content": { + const removedRule = deleteGeneratedContentRules(doc); + if (element2 && !removedRule) element2.removeAttribute("class"); + if (!removedRule && !element2) return null; + return record("generated_content_removed", sourceId, "Pseudo-element generated content was removed."); + } + case "nested_merge_container": + case "empty_merge_container": { + if (!element2) return null; + element2.removeAttribute("data-pptx-merge"); + element2.querySelectorAll("[data-pptx-merge]").forEach((node) => node.removeAttribute("data-pptx-merge")); + return record("merge_container_unwrapped", sourceId, "A merge container was unwrapped into regular editable content."); + } + case "manual_bullet_unrepaired": { + if (!element2 || !stripLeadingManualBullet(element2)) return null; + return record("manual_bullet_removed", sourceId, "A manual bullet character was removed."); + } + case "canvas_size": { + if (!repairCanvasSize(doc, { widthPx, heightPx })) return null; + return record("canvas_size_adjusted", sourceId, "The slide canvas was normalized to the editable size."); + } + case "editable_scene_geometry_invalid": + case "editable_scene_payload_invalid": + case "editable_scene_node_type_unsupported": + case "editable_scene_source_id_invalid": { + if (!element2 || element2 === doc.body) return null; + element2.remove(); + return record("element_removed", sourceId, "An element with an invalid editable payload was removed."); + } + default: + return null; } - for (const [property, declaration] of declarationsByElement.get(element2) || []) { - declarations.set(property, declaration.value); - } - return declarations; } -function auditAuthoredStyles(parsed, slideNumber) { - const declarationsByElement = collectStylesheetDeclarations(parsed); - for (const [element2] of declarationsByElement) { - const declarations = declarationsWithInheritedCustomProperties( - element2, - declarationsByElement - ); - if (element2.closest?.("svg")) { - for (const property of ["fill", "stroke"]) { - const value2 = declarations.get(property); - if (value2 && valueOrVariableHasUrl(value2, declarations)) { - fail2( - slideNumber, - element2, - "svg_paint_server_unsupported", - "SVG paint-server fills and strokes cannot be represented as editable PowerPoint paint." - ); - } - } - } - const textShadow = declarations.get("text-shadow"); - if (textShadow && textShadowIsVisible(textShadow, declarations)) { - fail2( +function normalizeWithDegradation(normalizeFn, doc, dims, onDegrade) { + const { slideNumber } = dims; + const attempted = /* @__PURE__ */ new Set(); + let lastError = null; + for (let repair = 0; repair < MAX_REPAIRS_PER_SLIDE; repair += 1) { + try { + return normalizeFn(doc, dims); + } catch (error2) { + if (!(error2 instanceof EditableExportError)) throw error2; + lastError = error2; + const diagnostic = error2.diagnostic || {}; + const key = `${diagnostic.code}:${diagnostic.sourceId}`; + if (attempted.has(key)) break; + attempted.add(key); + const degradeRecord = applyExportDegradationRepair(doc, diagnostic, { slideNumber, - element2, - "text_shadow_unsupported", - "CSS text-shadow cannot be represented as editable PowerPoint text." - ); + widthPx: Math.round(dims.width * 96), + heightPx: Math.round(dims.height * 96) + }); + if (!degradeRecord) break; + onDegrade?.({ + severity: "degrade", + slideNumber, + sourceId: degradeRecord.sourceId, + code: degradeRecord.code, + message: degradeRecord.message + }); } } + throw lastError; } -function makeMountedStyleProjection(parsed) { - const ownerDocument = globalThis.document; - if (!ownerDocument?.body || typeof globalThis.getComputedStyle !== "function") return null; - const host = ownerDocument.createElement("div"); - host.setAttribute("aria-hidden", "true"); - host.style.cssText = [ - "position:fixed", - "left:-30000px", - "top:0", - "width:1280px", - "height:720px", - "overflow:hidden", - "opacity:0", - "pointer-events:none" - ].join(";"); - const projectionRoot = host.attachShadow?.({ mode: "open" }) || host; - const indexedElements = [...parsed.querySelectorAll("*")]; - indexedElements.forEach((element2, index) => { - element2.setAttribute("data-pptx-preflight-index", String(index)); - }); - for (const authoredStyle of parsed.querySelectorAll("style")) { - const style = ownerDocument.createElement("style"); - style.textContent = stripCssImports( - replaceCssUrlsForProjection(authoredStyle.textContent || "") - ); - projectionRoot.appendChild(style); - } - const controlStyle = ownerDocument.createElement("style"); - controlStyle.textContent = [ - '#pptx-cascade-control { fill:url("#__pptx_specificity_control__"); }', - '.pptx-cascade-control { fill:#fff;stroke:url("#__pptx_important_control__") !important; }', - "#pptx-cascade-control { stroke:#fff; }" - ].join(""); - projectionRoot.appendChild(controlStyle); - const body = ownerDocument.importNode(parsed.body, true); - body.querySelectorAll("style,script").forEach((element2) => element2.remove()); - for (const element2 of body.querySelectorAll("*")) { - if (element2.hasAttribute("style")) { - element2.setAttribute( - "style", - replaceCssUrlsForProjection(element2.getAttribute("style") || "") - ); - } - for (const property of ["fill", "stroke"]) { - if (element2.hasAttribute(property)) { - element2.setAttribute( - property, - replaceCssUrlsForProjection(element2.getAttribute(property) || "") - ); - } - } - for (const attribute of ["src", "srcset", "poster", "data"]) { - if (element2.hasAttribute(attribute)) element2.setAttribute(attribute, "data:,"); - } - for (const attribute of ["href", "xlink:href"]) { - if (element2.hasAttribute(attribute)) { - element2.setAttribute(attribute, "#__pptx_preflight_resource__"); - } - } - for (const attribute of [...element2.attributes]) { - if (attribute.name.toLowerCase().startsWith("on")) element2.removeAttribute(attribute.name); - } +function simplifiedTextNodes(lines, slideNumber, height = 7.5) { + const nodes = []; + const [titleLine, ...bodyLines] = lines; + let cursorY = 1.1; + if (titleLine) { + nodes.push({ + type: "text", + sourceId: `slide-${slideNumber}-degraded-title`, + x: 0.9, + y: cursorY, + w: 11.5, + h: 0.9, + text: titleLine, + paintOrder: 1, + subOrder: 0, + style: { fontSize: 28, bold: true, color: "1F2937" } + }); + cursorY += 1.2; } - projectionRoot.appendChild(body); - const controlSvg = ownerDocument.createElementNS("http://www.w3.org/2000/svg", "svg"); - const control = ownerDocument.createElementNS("http://www.w3.org/2000/svg", "rect"); - control.id = "pptx-cascade-control"; - control.setAttribute("class", "pptx-cascade-control"); - controlSvg.appendChild(control); - projectionRoot.appendChild(controlSvg); - ownerDocument.body.appendChild(host); - return { - host, - indexedElements, - projectedElement(element2) { - const index = element2.getAttribute("data-pptx-preflight-index"); - return body.querySelector(`[data-pptx-preflight-index="${index}"]`); - }, - supportsCascade() { - const computed = globalThis.getComputedStyle(control); - return cssValueHasUrlToken(computed.fill) && cssValueHasUrlToken(computed.stroke); - }, - cleanup() { - host.remove(); - indexedElements.forEach((element2) => { - element2.removeAttribute("data-pptx-preflight-index"); - }); - } - }; + const lineHeight = 0.62; + const maxBodyLines = Math.max(0, Math.min(9, Math.floor((height - cursorY - 0.3) / lineHeight))); + bodyLines.slice(0, maxBodyLines).forEach((line, index) => { + nodes.push({ + type: "text", + sourceId: `slide-${slideNumber}-degraded-line-${index + 1}`, + x: 0.9, + y: cursorY, + w: 11.5, + h: 0.52, + text: line, + paintOrder: 2 + index, + subOrder: 0, + style: { fontSize: 15, color: "374151" } + }); + cursorY += lineHeight; + }); + return nodes; } -function auditMountedComputedStyles(parsed, slideNumber) { - let projection; +function buildSimplifiedEditableScene({ + doc = null, + slide = null, + slideNumber, + width, + height +} = {}) { + let backgroundHex = "FFFFFF"; + let lines = []; try { - projection = makeMountedStyleProjection(parsed); - if (!projection || !projection.supportsCascade()) return false; - for (const element2 of projection.indexedElements) { - const projected = projection.projectedElement(element2); - if (!projected) continue; - const computed = globalThis.getComputedStyle(projected); - if (element2.closest?.("svg") && (cssValueHasUrlToken(computed.fill) || cssValueHasUrlToken(computed.stroke))) { - fail2( - slideNumber, - element2, - "svg_paint_server_unsupported", - "SVG paint-server fills and strokes cannot be represented as editable PowerPoint paint." - ); - } - if (textShadowIsVisible(computed.textShadow, /* @__PURE__ */ new Map())) { - fail2( - slideNumber, - element2, - "text_shadow_unsupported", - "CSS text-shadow cannot be represented as editable PowerPoint text." - ); + const body = doc?.body; + if (body) { + const view = doc.defaultView; + if (view?.getComputedStyle) { + backgroundHex = colorToHex2(view.getComputedStyle(body).backgroundColor, "FFFFFF") || "FFFFFF"; } + lines = [...body.querySelectorAll("h1, h2, h3, h4, h5, h6, p, li")].map((element2) => String(element2.textContent || "").replace(/\s+/g, " ").trim()).filter(Boolean); } - return true; - } catch (error2) { - if (error2 instanceof EditableExportError) throw error2; - return false; - } finally { - projection?.cleanup(); + } catch { + lines = []; } -} -function isActiveScript(script) { - const type = String(script.getAttribute("type") || "").trim().toLowerCase(); - return !type || type === "module" || type.includes("javascript") || type.includes("ecmascript"); -} -function auditRawSlideForEditableExport(html, slideNumber) { - const parsed = new DOMParser().parseFromString(String(html || ""), "text/html"); - const unsupported = parsed.querySelector(VISIBLE_UNSUPPORTED_SELECTOR); - if (unsupported) { - fail2( - slideNumber, - unsupported, - "unsupported_visible_html", - `Visible <${unsupported.localName}> content has no editable PowerPoint rewrite.` - ); + if (!lines.length && slide) { + lines = [ + String(slide.title || "").trim(), + ...(Array.isArray(slide.elements) ? slide.elements : []).flatMap((element2) => [element2?.text, ...Array.isArray(element2?.items) ? element2.items : []]).map((value2) => String(value2 || "").trim()).filter(Boolean) + ].filter(Boolean); } - const activeScript = [...parsed.querySelectorAll("script")].find(isActiveScript); - if (activeScript) { - fail2( + lines = [...new Set(lines)].map((line) => line.length > 120 ? `${line.slice(0, 117)}\u2026` : line).slice(0, 10); + const scene = { + slideNumber, + width, + height, + nodes: [ + { + type: "shape", + shapeType: "rect", + sourceId: `slide-${slideNumber}-degraded-background`, + x: 0, + y: 0, + w: width, + h: height, + paintOrder: 0, + subOrder: 0, + style: { fill: backgroundHex, line: null } + }, + ...simplifiedTextNodes(lines, slideNumber, height) + ] + }; + try { + return validateEditableSlideScene(scene); + } catch { + return validateEditableSlideScene({ slideNumber, - activeScript, - "active_content_unsupported", - "Active script content is not allowed in editable PowerPoint export." - ); - } - if (!auditMountedComputedStyles(parsed, slideNumber)) { - auditAuthoredStyles(parsed, slideNumber); + width, + height, + nodes: [ + scene.nodes[0], + { + type: "text", + sourceId: `slide-${slideNumber}-degraded-caption`, + x: 0.9, + y: 1.1, + w: 11.5, + h: 0.6, + text: `Slide ${slideNumber}`, + paintOrder: 1, + subOrder: 0, + style: { fontSize: 20, color: "1F2937" } + } + ] + }); } } -// src/export-slide-browser.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-slide-browser.js var EXPORT_VIEWPORT = { width: 1280, height: 720 }; var exportSessionHost = null; function getExportSessionHost() { @@ -15889,22 +15552,111 @@ async function loadHtmlInExportRoot(html) { await waitForExportPaint(); return wrapExportDocument(root, body); } -async function prepareHtmlSlide(html, slideNumber) { +async function prepareHtmlSlide(html, slideNumber, options = {}) { + const { onDegrade } = options; + const dims = { + slideNumber, + width: EXPORT_VIEWPORT.width / 96, + height: EXPORT_VIEWPORT.height / 96 + }; + const fallbackScene = (doc, error2) => { + onDegrade?.({ + severity: "degrade", + slideNumber, + sourceId: error2?.sourceId || error2?.diagnostic?.sourceId || `slide-${slideNumber}`, + code: "slide_simplified", + message: "The slide contained unconvertible content and was replaced with a simplified editable version." + }); + if (!(error2 instanceof EditableExportError)) { + console.warn("[ppt-live] slide preparation fell back to a simplified scene", { + slideNumber, + error: String(error2?.message || error2) + }); + } + if (doc) return buildSimplifiedEditableScene({ doc, ...dims }); + return buildSimplifiedEditableScene({ + doc: sanitizeSlideDocument(new DOMParser().parseFromString(String(html || ""), "text/html")), + ...dims + }); + }; let exportRoot = null; try { - auditRawSlideForEditableExport(html, slideNumber); const mountedDoc = await loadHtmlInExportRoot(html); exportRoot = mountedDoc._exportRoot; - sanitizeSlideDocumentRoot(mountedDoc); + const { diagnostics: sanitizeDiagnostics = [] } = sanitizeSlideDocumentRoot(mountedDoc); await waitForExportPaint(); - extractSlideDataFromDocument(mountedDoc); - return normalizeDocumentToEditableScene(mountedDoc, { + (mountedDoc._pptxSecurityDiagnostics || []).forEach((diagnostic) => { + onDegrade?.({ + severity: "degrade", + slideNumber, + sourceId: diagnostic.sourceId || "slide-document", + code: diagnostic.code || "active_content_removed", + message: diagnostic.message || "Unsafe active content was removed." + }); + }); + sanitizeDiagnostics.filter((diagnostic) => diagnostic?.severity === "repaired" && diagnostic?.code).forEach((diagnostic) => { + onDegrade?.({ + severity: "degrade", + slideNumber, + sourceId: diagnostic.sourceId || "slide-document", + code: diagnostic.code, + message: diagnostic.message || "Slide content was repaired for editable export." + }); + }); + try { + return normalizeWithDegradation( + normalizeDocumentToEditableScene, + mountedDoc, + dims, + onDegrade + ); + } catch (error2) { + return fallbackScene(mountedDoc, error2); + } + } catch (error2) { + return fallbackScene(null, error2); + } finally { + if (exportRoot) removeExportRoot(exportRoot); + } +} +function prepareElementModelSlide(slide, slideNumber, options = {}) { + const { onDegrade } = options; + const sourceElements = Array.isArray(slide?.elements) ? slide.elements : []; + const remaining = [...sourceElements]; + const attempted = /* @__PURE__ */ new Set(); + const fallbackScene = (error2) => { + onDegrade?.({ + severity: "degrade", + slideNumber, + sourceId: error2?.sourceId || `slide-${slideNumber}`, + code: "slide_simplified", + message: "The slide contained unconvertible content and was replaced with a simplified editable version." + }); + return buildSimplifiedEditableScene({ + slide, slideNumber, width: EXPORT_VIEWPORT.width / 96, height: EXPORT_VIEWPORT.height / 96 }); - } finally { - if (exportRoot) removeExportRoot(exportRoot); + }; + for (; ; ) { + try { + return normalizeElementSlideToEditableScene({ ...slide, elements: remaining }, { slideNumber }); + } catch (error2) { + if (!(error2 instanceof EditableExportError)) return fallbackScene(error2); + const sourceId = String(error2.sourceId || ""); + const index = remaining.findIndex((element2, elementIndex) => String(element2?.id || element2?.sourceId || `element-${elementIndex + 1}`) === sourceId); + if (index < 0 || attempted.has(sourceId)) return fallbackScene(error2); + attempted.add(sourceId); + remaining.splice(index, 1); + onDegrade?.({ + severity: "degrade", + slideNumber, + sourceId, + code: "element_removed", + message: "An element that cannot be represented as an editable object was removed." + }); + } } } async function prepareEditableSlides(slides, options = {}) { @@ -15914,7 +15666,7 @@ async function prepareEditableSlides(slides, options = {}) { if (typeof options.onSlideProgress === "function") { options.onSlideProgress(index + 1, slide); } - scenes.push(slide?.html ? await prepareHtmlSlide(slide.html, index + 1) : normalizeElementSlideToEditableScene(slide, { slideNumber: index + 1 })); + scenes.push(slide?.html ? await prepareHtmlSlide(slide.html, index + 1, options) : prepareElementModelSlide(slide, index + 1, options)); } return scenes; } catch (error2) { @@ -15933,7 +15685,7 @@ function slideExportHtml(slide) { return sanitizeSlideMarkup(buildElementSlideHtml(slide)); } -// ../../../../../../../../../node_modules/.pnpm/tslib@1.14.1/node_modules/tslib/tslib.es6.js +// node_modules/.pnpm/tslib@1.14.1/node_modules/tslib/tslib.es6.js var extendStatics = function(d, b) { extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) { d2.__proto__ = b2; @@ -16074,7 +15826,7 @@ function __spreadArrays() { return r; } -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/base64.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/base64.js var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var lookup = new Uint8Array(256); for (i = 0; i < chars.length; i++) { @@ -16136,7 +15888,7 @@ var decodeFromBase64DataUri = function(dataUri) { return decodeFromBase64(data); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/strings.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/strings.js var toCharCode = function(character) { return character.charCodeAt(0); }; @@ -16274,7 +16026,7 @@ var findLastMatch = function(value2, regex) { return { match: lastMatch, pos: position }; }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/arrays.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/arrays.js var last = function(array) { return array[array.length - 1]; }; @@ -16395,7 +16147,7 @@ var toUint8Array = function(input) { } }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/async.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/async.js var waitForTick = function() { return new Promise(function(resolve) { setTimeout(function() { @@ -16404,7 +16156,7 @@ var waitForTick = function() { }); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/unicode.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/unicode.js var utf16Encode = function(input, byteOrderMark) { if (byteOrderMark === void 0) { byteOrderMark = true; @@ -16502,7 +16254,7 @@ var hasUtf16BOM = function(bytes) { return hasUtf16BigEndianBOM(bytes) || hasUtf16LittleEndianBOM(bytes); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/numbers.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/numbers.js var numberToString = function(num) { var numStr = String(num); if (Math.abs(num) < 1) { @@ -16537,12 +16289,12 @@ var bytesFor = function(n) { return bytes; }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/errors.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/errors.js var error = function(msg) { throw new Error(msg); }; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/utils.js +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/utils.js var import_pako = __toESM(require_pako()); var chars2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var lookup2 = new Uint8Array(256); @@ -16595,49 +16347,49 @@ var padStart2 = function(value2, length, padChar) { return padding + value2; }; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Courier-Bold.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Courier-Bold.compressed.json var Courier_Bold_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Courier-BoldOblique.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Courier-BoldOblique.compressed.json var Courier_BoldOblique_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Courier-Oblique.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Courier-Oblique.compressed.json var Courier_Oblique_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Courier.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Courier.compressed.json var Courier_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Helvetica-Bold.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Helvetica-Bold.compressed.json var Helvetica_Bold_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Helvetica-BoldOblique.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Helvetica-BoldOblique.compressed.json var Helvetica_BoldOblique_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Helvetica-Oblique.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Helvetica-Oblique.compressed.json var Helvetica_Oblique_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Helvetica.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Helvetica.compressed.json var Helvetica_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Times-Bold.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Times-Bold.compressed.json var Times_Bold_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Times-BoldItalic.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Times-BoldItalic.compressed.json var Times_BoldItalic_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Times-Italic.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Times-Italic.compressed.json var Times_Italic_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Times-Roman.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Times-Roman.compressed.json var Times_Roman_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Symbol.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Symbol.compressed.json var Symbol_compressed_default = "eJx9WFlv2zgQ/iuGnnYBt5DkS85bmk13g27SoEkPbNEHWqIlIhSpklSuov99R7JIkSLtFyGZjxzN8c0h/4oueF1jpqKz6Mt1K1GJZ4s4S+PZYrvdbqJ59J4zdYNqDAfuXuodp52spdSToZrQl6n0KyZl1Sm/xgVpa5BcKURJfs5KCgdj+F++J8+4uCUqr6IzJVo8jy4qJFCusLjD3d27BucE0cGYd+/4c3T2/U2SxfM36XYxT+JtDI8k/jGPPrMCC0oYvuWSKMJZdPYmiWMLuK9I/sCwlNHZCuRfsJD9sSiOk7dxnMFbbrgieefGBW9eROfA7I/8z1myzVbz7rnpn9vuCW/unpvZecF3eHb3IhWu5eyK5Vw0XCCFi7ezc0pnvRo5E1hi8QhCeM0lHCoIK+/yCvdR67zrfd2THPA7VfzzNTrbpv2fX+BPeH8fm2usBMnBg++/oq/forO08+QGNMgGgeG/5wfxYrE4iPFzTlFt5JtkkLeMPIL/EFoNreJBE2vrXReako3YcqvVEXCTKWJdzPS7Gizyjk/mZZvsAKC66d7FCgMtF4NC2eaVqpDyLW+QwIzi/TGoD6tvPQL7BJEPNVKVb39DW2mkJnY5FALyD9eEhU6DL4SPrqTaS0mRrHyDXrHgvpQz7AvVU+CkqgQOnN3zVgSkkFVfKslzQIgfMfPFOBxWRiyDjcs5p5wFIoFr4kImprQrP59WP1ubiVpcCgxlNLq5XC4PwM8Wy77EvSs5ZyU0EpuFaXqAzmlTjVlerzcH8TuskH/4oiLj0WQQ/oWpdXadJAfxZSOJ7exmPfD01lYSD8K/kU0288JLS7Mh+hW337dINCPA5MRX8QE1jXU8Wx/E/6J6V4zyLBtCdd36Km4Cso+QTOG4N6T5dvRusxxsu6/scK5Wgw2fKovZ20HxHSnrQDjv0WjEejvw7/MkxmMD6ZQkvnEfa1xayperg/ibZfN2kN1K4lvxHw4lZAfD6QErpy1lOt2QF4H3XATa8HDP7VnrVWY6SoNZQfKWokBRt90Ak7mt2GACwTVE8bNPE+Tw3VTIzkmQqRuLqsvtUGaFw3cTcjzJxSod3tjYSnQgS4fvpgyc8KaDZuLwXR8FtYlv8YPD9rHBuGxfbQYG1q1vL2v9+3zC9nF0EF+BqoLBFBbbjRfSYbsJprLYboxtpx1Fj23esXoMhqlx7rB9uR2OPxP/aCMDmX61/Vhm8cha7HA91bzbWUR1z0/m8tLUKSyJ1qWNHqeXrTUf16lb76Or6XIzTmWFA4mHyeLOkUS3+H23UpJQPAnbE0bUS2CSUi6IdWM13Mhpu/OlBUE1t/YbA1QYCeWLYVsrRh+SeDm0RCQEf9pxa3Xpds4RcpJhqNVDbXPkzqTpOJcK/mT1VO17gUtn57C3J3cpMlUucW77Px3hRwZ83VJFGvriJ6YRHJboLmnWPUNXWAC7FbQg+/0IrjUL4RMFBxhYkEdSBLxiXB0xD8TkEZorywPXoP0I/jxhXGzWKEoJUFgeiTvs3srq2eO9Hq2Aeq92S9eDIgeYwIeawKoVY+KyVOumuBmpY0r+CgrgQVn7ohl9n6aIoc4TJjB0lEDWvmaGa05ETrGfPRd3lm1jI64b9SKtBJlbhAFTgEhuqWoUvlhCFdwRBW613cNWqnGYyDAdj+OQfdnugpBWHUa14jAKbbN2tlDrfR6mXUT9p7F3peyGvHNBb0UCl933GHgmyN6Hc/0R6+KZxiG7Ba6ReJjg6RiAos0DpTRsHWNz1s284Mr58DI+UF52N8B7vyIGzP4+nGJcWLXiNMtiR0/0S0BPtExAj3ZNwE42zh11e6duTZS/YlZaK6DebfrkOsb4aURMnsqiA+viHpPowDrwsoX1y6moRTZ20cMXtmpOgFYf8sGd8kFrRw4ptuCQagu2lJvwmpXEUu2DNSlOoEf12vY4aXOZkG6WY8OC4hzrwHRcjVhWepjd4KdYKK7jrx5H89WjRxPWoycydlS3jZ/I2VS/G9yp9gB6PG1T1aY4YAp3LfPHPPqABbtFRHS/jf34/T82FAfb"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/ZapfDingbats.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/ZapfDingbats.compressed.json var ZapfDingbats_compressed_default = "eJxtmNtu20YQhl+F4FULyMGeD7pz3AY1ChtG7NpFA18w1NomIlECSRcxgrx7SVk7+wOdG8H5OJydf2Z2d5gf9cV+t0v9VK/r+6vXsXlOlbHe28paq229qj/t++m62aXZ4J/m8PRb1z9/baZxefK63Z6eXN5dVMvTCh83u277xr/6kLrnl2XNq7TpXnczuZyabdee98/b2VzM/x4/dd/T5qab2pd6PQ2vaVVfvDRD005puE3Lu7eH1HbN9hTjx4/77/X6y5lcnUmjVzHIVVDicVX/1W/SsO36dLMfu6nb9/X6TAoBD+5euvZbn8axXtuZ36dhPJrVQqgPQoh5hev91LWLkIv94W1Ygq9+aX+tZAx2tfz64284/sblN/rqfLP/mqrbt3FKu7G67Nv9cNgPzZQ2H6rz7bb6vLgZq89pTMO/M/xfEqturJpqSM/d7GJIm2oamk3aNcO3av80O5xh3yyKmm1193ZIT02bqovTKjP+MAf++7zsZvZ3276kYyWWXB0z99S18/PbafPHQ71W4fjn/fxnFO+ZvkrT0LVzTr78qB/+nk38bHM9exgP8zr1z9U7jt6840YW5uSJKcZOCaBBnKgm5mU8MVNYyMwWFvO7Ukagkmgg6sDWQ5yFFqjzUrLEaQ3BEmiwNsMSaZS0vgWfOkPHWQowNeTUc0kumnxZvsgPxlGai6VTGUqAVCTQ6QkWnc77DKEiLktSUBJKqHIQZ86d8gCpHYoiEzMsb1ubYy8vW50DChB5ZhGqrijD0EqUIeiaEHIfCg5Kpuu0ApiToaGPSY0uaQsyr65L2oKi1yFt1PLaQ3lzfXTgXodGoJYzglndSLDMPg1sTPJpQJHJigw0QrGERqD9YhyTOgONQDUyuF1zaxuokc/BW2ztXCMrGZ9WMW1oQZHIXWNBkSCfRZEL5BMUiZw6CzVSFCfUSGZFNjIldoKDkonTKQiJIGzWmFd3BizJJ9SINoLDriOfUCOZS+zg+KGD1qGiLNMLxtJD1/ns00ON6EzyUCM6vbxhoBKaqbG3DFQCNiL1iHccBPV0DHhQH/JW8EW90dkyFKGywCJU0WkVSvSGeiSUODWFFD0HYdPQVoiRgfPMA+/nnRgiAyNYSjpWNQcNSMrtFCUH4ZIRpSCWocFCSuhCEY6hoUClc0WC52BJlCYYLQdhN+hygRRRlo5BKRRLS6oihSqh+ZzzRGG1Mo4Iz1LoP0qsxDGFzk0JE42ji0jCPejomJKCuwil4m5CiRMEUMVSzVLDUstSx1Juc0oVWMpqY295qVltmtWmWW2a1aZZbZrVplltmtWmWW2G1WZYbYbVZlhthtVmWG2G1WZYbYbVZlhtltVmWW2W1WZZbZbVZlltltVmWW2W1QYjQCh7E2aAQHeGhCFgPoNoy8KNb2wxBhmGKBxoUZXlLGsLI6AsftEDHV0wIURVbANLcTKlGGBIKPOAxCmhePCKUwFzAmpDFRQvjA9R06Hq8TONvshgKDCuRAZTXigUxjxNFfKRo3CLhnIJBMFRvMZpqpNBMlQJzGT5WFQMVQI/AikPMIhEU1aDjqJvQwmjSHB05cC9jbYwc5UtAHNLhDw41ha+lEqF4JaH3gmB61SYcqInxTDmQK8v08vjqv4zDf1N0w3Lf4A8/vwPpfK11w=="; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Font.js +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Font.js var compressedJsonForFontName = { "Courier": Courier_compressed_default, "Courier-Bold": Courier_Bold_compressed_default, @@ -16708,10 +16460,10 @@ var Font = ( })() ); -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/all-encodings.compressed.json +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/all-encodings.compressed.json var all_encodings_compressed_default = "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"; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Encoding.js +// node_modules/.pnpm/@pdf-lib+standard-fonts@1.0.0/node_modules/@pdf-lib/standard-fonts/es/Encoding.js var decompressedEncodings = decompressJson(all_encodings_compressed_default); var allUnicodeMappings = JSON.parse(decompressedEncodings); var Encoding = ( @@ -16747,7 +16499,7 @@ var Encodings = { WinAnsi: new Encoding("WinAnsi", allUnicodeMappings.win1252) }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/objects.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/objects.js var values = function(obj) { return Object.keys(obj).map(function(k) { return obj[k]; @@ -16761,7 +16513,7 @@ var rectanglesAreEqual = function(a, b) { return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height; }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/validators.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/validators.js var backtick = function(val2) { return "`" + val2 + "`"; }; @@ -16938,7 +16690,7 @@ var assertPositive = function(value2, valueName) { } }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/pdfDocEncoding.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/pdfDocEncoding.js var pdfDocEncodingToUnicode = new Uint16Array(256); for (idx = 0; idx < 256; idx++) { pdfDocEncodingToUnicode[idx] = idx; @@ -16996,7 +16748,7 @@ var pdfDocEncodingDecode = function(bytes) { return String.fromCodePoint.apply(String, codePoints); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/Cache.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/Cache.js var Cache = ( /** @class */ (function() { @@ -17023,7 +16775,7 @@ var Cache = ( ); var Cache_default = Cache; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/errors.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/errors.js var MethodNotImplementedError = ( /** @class */ (function(_super) { @@ -17396,7 +17148,7 @@ var MissingKeywordError = ( })(PDFParsingError) ); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/CharCodes.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/CharCodes.js var CharCodes; (function(CharCodes2) { CharCodes2[CharCodes2["Null"] = 0] = "Null"; @@ -17460,10 +17212,10 @@ var CharCodes; })(CharCodes || (CharCodes = {})); var CharCodes_default = CharCodes; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/PDFContext.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/PDFContext.js var import_pako3 = __toESM(require_pako()); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/document/PDFHeader.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/document/PDFHeader.js var PDFHeader = ( /** @class */ (function() { @@ -17504,7 +17256,7 @@ var PDFHeader = ( ); var PDFHeader_default = PDFHeader; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFObject.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFObject.js var PDFObject = ( /** @class */ (function() { @@ -17527,7 +17279,7 @@ var PDFObject = ( ); var PDFObject_default = PDFObject; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFNumber.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFNumber.js var PDFNumber = ( /** @class */ (function(_super) { @@ -17565,7 +17317,7 @@ var PDFNumber = ( ); var PDFNumber_default = PDFNumber; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFArray.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFArray.js var PDFArray = ( /** @class */ (function(_super) { @@ -17681,7 +17433,7 @@ var PDFArray = ( ); var PDFArray_default = PDFArray; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFBool.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFBool.js var ENFORCER = {}; var PDFBool = ( /** @class */ @@ -17730,7 +17482,7 @@ var PDFBool = ( ); var PDFBool_default = PDFBool; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/Delimiters.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/Delimiters.js var IsDelimiter = new Uint8Array(256); IsDelimiter[CharCodes_default.LeftParen] = 1; IsDelimiter[CharCodes_default.RightParen] = 1; @@ -17743,7 +17495,7 @@ IsDelimiter[CharCodes_default.RightCurly] = 1; IsDelimiter[CharCodes_default.ForwardSlash] = 1; IsDelimiter[CharCodes_default.Percent] = 1; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/Whitespace.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/Whitespace.js var IsWhitespace = new Uint8Array(256); IsWhitespace[CharCodes_default.Null] = 1; IsWhitespace[CharCodes_default.Tab] = 1; @@ -17752,7 +17504,7 @@ IsWhitespace[CharCodes_default.FormFeed] = 1; IsWhitespace[CharCodes_default.CarriageReturn] = 1; IsWhitespace[CharCodes_default.Space] = 1; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/Irregular.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/Irregular.js var IsIrregular = new Uint8Array(256); for (idx = 0, len = 256; idx < len; idx++) { IsIrregular[idx] = IsWhitespace[idx] || IsDelimiter[idx] ? 1 : 0; @@ -17761,7 +17513,7 @@ var idx; var len; IsIrregular[CharCodes_default.Hash] = 1; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFName.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFName.js var decodeName = function(name) { return name.replace(/#([\dABCDEF]{2})/g, function(_, hex2) { return charFromHexCode(hex2); @@ -17884,7 +17636,7 @@ var PDFName = ( ); var PDFName_default = PDFName; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFNull.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFNull.js var PDFNull = ( /** @class */ (function(_super) { @@ -17916,7 +17668,7 @@ var PDFNull = ( ); var PDFNull_default = new PDFNull(); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFDict.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFDict.js var PDFDict = ( /** @class */ (function(_super) { @@ -18049,7 +17801,7 @@ var PDFDict = ( ); var PDFDict_default = PDFDict; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFStream.js var PDFStream = ( /** @class */ (function(_super) { @@ -18120,7 +17872,7 @@ var PDFStream = ( ); var PDFStream_default = PDFStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFRawStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFRawStream.js var PDFRawStream = ( /** @class */ (function(_super) { @@ -18153,7 +17905,7 @@ var PDFRawStream = ( ); var PDFRawStream_default = PDFRawStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFRef.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFRef.js var ENFORCER3 = {}; var pool2 = /* @__PURE__ */ new Map(); var PDFRef = ( @@ -18200,7 +17952,7 @@ var PDFRef = ( ); var PDFRef_default = PDFRef; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/operators/PDFOperator.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/operators/PDFOperator.js var PDFOperator = ( /** @class */ (function() { @@ -18255,7 +18007,7 @@ var PDFOperator = ( ); var PDFOperator_default = PDFOperator; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/operators/PDFOperatorNames.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/operators/PDFOperatorNames.js var PDFOperatorNames; (function(PDFOperatorNames2) { PDFOperatorNames2["NonStrokingColor"] = "sc"; @@ -18334,7 +18086,7 @@ var PDFOperatorNames; })(PDFOperatorNames || (PDFOperatorNames = {})); var PDFOperatorNames_default = PDFOperatorNames; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFFlateStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFFlateStream.js var import_pako2 = __toESM(require_pako()); var PDFFlateStream = ( /** @class */ @@ -18366,7 +18118,7 @@ var PDFFlateStream = ( ); var PDFFlateStream_default = PDFFlateStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFContentStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFContentStream.js var PDFContentStream = ( /** @class */ (function(_super) { @@ -18429,7 +18181,7 @@ var PDFContentStream = ( ); var PDFContentStream_default = PDFContentStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/rng.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/rng.js var SimpleRNG = ( /** @class */ (function() { @@ -18447,7 +18199,7 @@ var SimpleRNG = ( })() ); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/PDFContext.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/PDFContext.js var byAscendingObjectNumber = function(_a, _b) { var a = _a[0]; var b = _b[0]; @@ -18622,7 +18374,7 @@ var PDFContext = ( ); var PDFContext_default = PDFContext; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFPageLeaf.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFPageLeaf.js var PDFPageLeaf = ( /** @class */ (function(_super) { @@ -18824,7 +18576,7 @@ var PDFPageLeaf = ( ); var PDFPageLeaf_default = PDFPageLeaf; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/PDFObjectCopier.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/PDFObjectCopier.js var PDFObjectCopier = ( /** @class */ (function() { @@ -18908,7 +18660,7 @@ var PDFObjectCopier = ( ); var PDFObjectCopier_default = PDFObjectCopier; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/document/PDFCrossRefSection.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/document/PDFCrossRefSection.js var PDFCrossRefSection = ( /** @class */ (function() { @@ -19027,7 +18779,7 @@ var PDFCrossRefSection = ( ); var PDFCrossRefSection_default = PDFCrossRefSection; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/document/PDFTrailer.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/document/PDFTrailer.js var PDFTrailer = ( /** @class */ (function() { @@ -19069,7 +18821,7 @@ var PDFTrailer = ( ); var PDFTrailer_default = PDFTrailer; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/document/PDFTrailerDict.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/document/PDFTrailerDict.js var PDFTrailerDict = ( /** @class */ (function() { @@ -19103,7 +18855,7 @@ var PDFTrailerDict = ( ); var PDFTrailerDict_default = PDFTrailerDict; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFObjectStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFObjectStream.js var PDFObjectStream = ( /** @class */ (function(_super) { @@ -19177,7 +18929,7 @@ var PDFObjectStream = ( ); var PDFObjectStream_default = PDFObjectStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/writers/PDFWriter.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/writers/PDFWriter.js var PDFWriter = ( /** @class */ (function() { @@ -19316,7 +19068,7 @@ var PDFWriter = ( ); var PDFWriter_default = PDFWriter; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFInvalidObject.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFInvalidObject.js var PDFInvalidObject = ( /** @class */ (function(_super) { @@ -19350,7 +19102,7 @@ var PDFInvalidObject = ( ); var PDFInvalidObject_default = PDFInvalidObject; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFCrossRefStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFCrossRefStream.js var EntryType; (function(EntryType2) { EntryType2[EntryType2["Deleted"] = 0] = "Deleted"; @@ -19530,7 +19282,7 @@ var PDFCrossRefStream = ( ); var PDFCrossRefStream_default = PDFCrossRefStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/writers/PDFStreamWriter.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/writers/PDFStreamWriter.js var PDFStreamWriter = ( /** @class */ (function(_super) { @@ -19635,7 +19387,7 @@ var PDFStreamWriter = ( ); var PDFStreamWriter_default = PDFStreamWriter; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFHexString.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFHexString.js var PDFHexString = ( /** @class */ (function(_super) { @@ -19706,7 +19458,7 @@ var PDFHexString = ( ); var PDFHexString_default = PDFHexString; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/StandardFontEmbedder.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/StandardFontEmbedder.js var StandardFontEmbedder = ( /** @class */ (function() { @@ -19789,7 +19541,7 @@ var StandardFontEmbedder = ( ); var StandardFontEmbedder_default = StandardFontEmbedder; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/CMap.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/CMap.js var createCmap = function(glyphs, glyphId) { var bfChars = new Array(glyphs.length); for (var idx = 0, len = glyphs.length; idx < len; idx++) { @@ -19829,7 +19581,7 @@ var cmapCodePointFormat = function(codePoint) { throw new Error(msg); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/FontFlags.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/FontFlags.js var makeFontFlags = function(options) { var flags = 0; var flipBit = function(bit) { @@ -19867,7 +19619,7 @@ var deriveFontFlags = function(font) { return flags; }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFString.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/objects/PDFString.js var PDFString = ( /** @class */ (function(_super) { @@ -19977,7 +19729,7 @@ var PDFString = ( ); var PDFString_default = PDFString; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/CustomFontEmbedder.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/CustomFontEmbedder.js var CustomFontEmbedder = ( /** @class */ (function() { @@ -20208,7 +19960,7 @@ var CustomFontEmbedder = ( ); var CustomFontEmbedder_default = CustomFontEmbedder; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/CustomFontSubsetEmbedder.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/CustomFontSubsetEmbedder.js var CustomFontSubsetEmbedder = ( /** @class */ (function(_super) { @@ -20274,7 +20026,7 @@ var CustomFontSubsetEmbedder = ( ); var CustomFontSubsetEmbedder_default = CustomFontSubsetEmbedder; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/FileEmbedder.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/FileEmbedder.js var AFRelationship; (function(AFRelationship2) { AFRelationship2["Source"] = "Source"; @@ -20344,7 +20096,7 @@ var FileEmbedder = ( ); var FileEmbedder_default = FileEmbedder; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/JpegEmbedder.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/JpegEmbedder.js var MARKERS = [ 65472, 65473, @@ -20456,7 +20208,7 @@ var JpegEmbedder = ( ); var JpegEmbedder_default = JpegEmbedder; -// ../../../../../../../../../node_modules/.pnpm/@pdf-lib+upng@1.0.1/node_modules/@pdf-lib/upng/UPNG.js +// node_modules/.pnpm/@pdf-lib+upng@1.0.1/node_modules/@pdf-lib/upng/UPNG.js var import_pako4 = __toESM(require_pako()); var UPNG = {}; UPNG.toRGBA8 = function(out) { @@ -21812,7 +21564,7 @@ UPNG.encode.concatRGBA = function(bufs) { }; var UPNG_default = UPNG; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/png.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/utils/png.js var getImageType = function(ctype) { if (ctype === 0) return PngType.Greyscale; @@ -21877,7 +21629,7 @@ var PNG = ( })() ); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/PngEmbedder.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/PngEmbedder.js var PngEmbedder = ( /** @class */ (function() { @@ -21943,7 +21695,7 @@ var PngEmbedder = ( ); var PngEmbedder_default = PngEmbedder; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/Stream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/Stream.js var Stream = ( /** @class */ (function() { @@ -22044,7 +21796,7 @@ var Stream = ( ); var Stream_default = Stream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/DecodeStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/DecodeStream.js var emptyBuffer = new Uint8Array(0); var DecodeStream = ( /** @class */ @@ -22182,7 +21934,7 @@ var DecodeStream = ( ); var DecodeStream_default = DecodeStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/Ascii85Stream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/Ascii85Stream.js var isSpace = function(ch) { return ch === 32 || ch === 9 || ch === 13 || ch === 10; }; @@ -22257,7 +22009,7 @@ var Ascii85Stream = ( ); var Ascii85Stream_default = Ascii85Stream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/AsciiHexStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/AsciiHexStream.js var AsciiHexStream = ( /** @class */ (function(_super) { @@ -22314,7 +22066,7 @@ var AsciiHexStream = ( ); var AsciiHexStream_default = AsciiHexStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/FlateStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/FlateStream.js var codeLenCodeMap = new Int32Array([ 16, 17, @@ -23193,7 +22945,7 @@ var FlateStream = ( ); var FlateStream_default = FlateStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/LZWStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/LZWStream.js var LZWStream = ( /** @class */ (function(_super) { @@ -23316,7 +23068,7 @@ var LZWStream = ( ); var LZWStream_default = LZWStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/RunLengthStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/RunLengthStream.js var RunLengthStream = ( /** @class */ (function(_super) { @@ -23358,7 +23110,7 @@ var RunLengthStream = ( ); var RunLengthStream_default = RunLengthStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/decode.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/streams/decode.js var decodeStream = function(stream2, encoding, params) { if (encoding === PDFName_default.of("FlateDecode")) { return new FlateStream_default(stream2); @@ -23401,7 +23153,7 @@ var decodePDFRawStream = function(_a) { return stream2; }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/PDFPageEmbedder.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/PDFPageEmbedder.js var fullPageBoundingBox = function(page) { var mediaBox = page.MediaBox(); var width = mediaBox.lookup(2, PDFNumber_default).asNumber() - mediaBox.lookup(0, PDFNumber_default).asNumber(); @@ -23481,7 +23233,7 @@ var PDFPageEmbedder = ( ); var PDFPageEmbedder_default = PDFPageEmbedder; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/interactive/ViewerPreferences.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/interactive/ViewerPreferences.js var asEnum = function(rawValue, enumType) { if (rawValue === void 0) return void 0; @@ -23715,7 +23467,7 @@ var ViewerPreferences = ( ); var ViewerPreferences_default = ViewerPreferences; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroField.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroField.js var tfRegex = /\/([^\0\t\n\f\r\ ]+)[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]+Tf/; var PDFAcroField = ( /** @class */ @@ -23846,7 +23598,7 @@ var PDFAcroField = ( ); var PDFAcroField_default = PDFAcroField; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/annotation/BorderStyle.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/annotation/BorderStyle.js var BorderStyle = ( /** @class */ (function() { @@ -23875,7 +23627,7 @@ var BorderStyle = ( ); var BorderStyle_default = BorderStyle; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/annotation/PDFAnnotation.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/annotation/PDFAnnotation.js var PDFAnnotation = ( /** @class */ (function() { @@ -23991,7 +23743,7 @@ var PDFAnnotation = ( ); var PDFAnnotation_default = PDFAnnotation; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/annotation/AppearanceCharacteristics.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/annotation/AppearanceCharacteristics.js var AppearanceCharacteristics = ( /** @class */ (function() { @@ -24108,7 +23860,7 @@ var AppearanceCharacteristics = ( ); var AppearanceCharacteristics_default = AppearanceCharacteristics; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/annotation/PDFWidgetAnnotation.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/annotation/PDFWidgetAnnotation.js var PDFWidgetAnnotation = ( /** @class */ (function(_super) { @@ -24211,7 +23963,7 @@ var PDFWidgetAnnotation = ( ); var PDFWidgetAnnotation_default = PDFWidgetAnnotation; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroTerminal.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroTerminal.js var PDFAcroTerminal = ( /** @class */ (function(_super) { @@ -24267,7 +24019,7 @@ var PDFAcroTerminal = ( ); var PDFAcroTerminal_default = PDFAcroTerminal; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroButton.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroButton.js var PDFAcroButton = ( /** @class */ (function(_super) { @@ -24352,7 +24104,7 @@ var PDFAcroButton = ( ); var PDFAcroButton_default = PDFAcroButton; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroCheckBox.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroCheckBox.js var PDFAcroCheckBox = ( /** @class */ (function(_super) { @@ -24400,7 +24152,7 @@ var PDFAcroCheckBox = ( ); var PDFAcroCheckBox_default = PDFAcroCheckBox; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/flags.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/flags.js var flag = function(bitIndex) { return 1 << bitIndex; }; @@ -24437,7 +24189,7 @@ var AcroChoiceFlags; AcroChoiceFlags2[AcroChoiceFlags2["CommitOnSelChange"] = flag(27 - 1)] = "CommitOnSelChange"; })(AcroChoiceFlags || (AcroChoiceFlags = {})); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroChoice.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroChoice.js var PDFAcroChoice = ( /** @class */ (function(_super) { @@ -24554,7 +24306,7 @@ var PDFAcroChoice = ( ); var PDFAcroChoice_default = PDFAcroChoice; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroComboBox.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroComboBox.js var PDFAcroComboBox = ( /** @class */ (function(_super) { @@ -24579,7 +24331,7 @@ var PDFAcroComboBox = ( ); var PDFAcroComboBox_default = PDFAcroComboBox; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroNonTerminal.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroNonTerminal.js var PDFAcroNonTerminal = ( /** @class */ (function(_super) { @@ -24612,7 +24364,7 @@ var PDFAcroNonTerminal = ( ); var PDFAcroNonTerminal_default = PDFAcroNonTerminal; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroSignature.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroSignature.js var PDFAcroSignature = ( /** @class */ (function(_super) { @@ -24628,7 +24380,7 @@ var PDFAcroSignature = ( ); var PDFAcroSignature_default = PDFAcroSignature; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroText.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroText.js var PDFAcroText = ( /** @class */ (function(_super) { @@ -24693,7 +24445,7 @@ var PDFAcroText = ( ); var PDFAcroText_default = PDFAcroText; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroPushButton.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroPushButton.js var PDFAcroPushButton = ( /** @class */ (function(_super) { @@ -24718,7 +24470,7 @@ var PDFAcroPushButton = ( ); var PDFAcroPushButton_default = PDFAcroPushButton; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroRadioButton.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroRadioButton.js var PDFAcroRadioButton = ( /** @class */ (function(_super) { @@ -24772,7 +24524,7 @@ var PDFAcroRadioButton = ( ); var PDFAcroRadioButton_default = PDFAcroRadioButton; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroListBox.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroListBox.js var PDFAcroListBox = ( /** @class */ (function(_super) { @@ -24796,7 +24548,7 @@ var PDFAcroListBox = ( ); var PDFAcroListBox_default = PDFAcroListBox; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/utils.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/utils.js var createPDFAcroFields = function(kidDicts) { if (!kidDicts) return []; @@ -24883,7 +24635,7 @@ var ascend = function(startNode, visitor) { ascend(Parent, visitor); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroForm.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/acroform/PDFAcroForm.js var PDFAcroForm = ( /** @class */ (function() { @@ -24959,7 +24711,7 @@ var PDFAcroForm = ( ); var PDFAcroForm_default = PDFAcroForm; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFCatalog.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFCatalog.js var PDFCatalog = ( /** @class */ (function(_super) { @@ -25028,7 +24780,7 @@ var PDFCatalog = ( ); var PDFCatalog_default = PDFCatalog; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFPageTree.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/structures/PDFPageTree.js var PDFPageTree = ( /** @class */ (function(_super) { @@ -25170,7 +24922,7 @@ var PDFPageTree = ( ); var PDFPageTree_default = PDFPageTree; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/Numeric.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/Numeric.js var IsDigit = new Uint8Array(256); IsDigit[CharCodes_default.Zero] = 1; IsDigit[CharCodes_default.One] = 1; @@ -25193,7 +24945,7 @@ for (idx = 0, len = 256; idx < len; idx++) { var idx; var len; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/BaseParser.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/BaseParser.js var Newline = CharCodes_default.Newline; var CarriageReturn = CharCodes_default.CarriageReturn; var BaseParser = ( @@ -25296,7 +25048,7 @@ var BaseParser = ( ); var BaseParser_default = BaseParser; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/ByteStream.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/ByteStream.js var ByteStream = ( /** @class */ (function() { @@ -25358,7 +25110,7 @@ var ByteStream = ( ); var ByteStream_default = ByteStream; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/Keywords.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/syntax/Keywords.js var Space = CharCodes_default.Space; var CarriageReturn2 = CharCodes_default.CarriageReturn; var Newline2 = CharCodes_default.Newline; @@ -25440,7 +25192,7 @@ var Keywords = { EOF3endstream: __spreadArrays([Newline2], endstream) }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/PDFObjectParser.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/PDFObjectParser.js var PDFObjectParser = ( /** @class */ (function(_super) { @@ -25631,7 +25383,7 @@ var PDFObjectParser = ( ); var PDFObjectParser_default = PDFObjectParser; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/PDFObjectStreamParser.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/PDFObjectStreamParser.js var PDFObjectStreamParser = ( /** @class */ (function(_super) { @@ -25703,7 +25455,7 @@ var PDFObjectStreamParser = ( ); var PDFObjectStreamParser_default = PDFObjectStreamParser; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/PDFXRefStreamParser.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/PDFXRefStreamParser.js var PDFXRefStreamParser = ( /** @class */ (function() { @@ -25784,7 +25536,7 @@ var PDFXRefStreamParser = ( ); var PDFXRefStreamParser_default = PDFXRefStreamParser; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/PDFParser.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/parser/PDFParser.js var PDFParser = ( /** @class */ (function(_super) { @@ -26100,7 +25852,7 @@ var PDFParser = ( ); var PDFParser_default = PDFParser; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/annotation/flags.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/annotation/flags.js var flag2 = function(bitIndex) { return 1 << bitIndex; }; @@ -26118,7 +25870,7 @@ var AnnotationFlags; AnnotationFlags2[AnnotationFlags2["LockedContents"] = flag2(10 - 1)] = "LockedContents"; })(AnnotationFlags || (AnnotationFlags = {})); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/objects.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/objects.js var asPDFName = function(name) { return name instanceof PDFName_default ? name : PDFName_default.of(name); }; @@ -26129,7 +25881,7 @@ var asNumber = function(num) { return num instanceof PDFNumber_default ? num.asNumber() : num; }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/rotations.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/rotations.js var RotationTypes; (function(RotationTypes2) { RotationTypes2["Degrees"] = "degrees"; @@ -26197,7 +25949,7 @@ var rotateRectangle = function(rectangle, borderWidth, degreeAngle) { return { x: x - b, y: y - b, width: w, height: h }; }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/operators.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/operators.js var clip = function() { return PDFOperator_default.of(PDFOperatorNames_default.ClipNonZero); }; @@ -26389,7 +26141,7 @@ var endMarkedContent = function() { return PDFOperator_default.of(PDFOperatorNames_default.EndMarkedContent); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/colors.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/colors.js var ColorTypes; (function(ColorTypes2) { ColorTypes2["Grayscale"] = "Grayscale"; @@ -26432,7 +26184,7 @@ var colorToComponents = function(color) { return color.type === Grayscale ? [color.gray] : color.type === RGB ? [color.red, color.green, color.blue] : color.type === CMYK ? [color.cyan, color.magenta, color.yellow, color.key] : error("Invalid color: " + JSON.stringify(color)); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/svgPath.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/svgPath.js var cx = 0; var cy = 0; var px = 0; @@ -26786,7 +26538,7 @@ var svgPathToOperators = function(path) { return apply(parse(path)); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/operations.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/operations.js var drawLinesOfText = function(lines, options) { var operators = [ pushGraphicsState(), @@ -27212,7 +26964,7 @@ var drawOptionList = function(options) { ]); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/errors.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/errors.js var EncryptedPDFError = ( /** @class */ (function(_super) { @@ -27399,7 +27151,7 @@ var InvalidMaxLengthError = ( })(Error) ); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/text/alignment.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/text/alignment.js var TextAlignment; (function(TextAlignment2) { TextAlignment2[TextAlignment2["Left"] = 0] = "Left"; @@ -27407,7 +27159,7 @@ var TextAlignment; TextAlignment2[TextAlignment2["Right"] = 2] = "Right"; })(TextAlignment || (TextAlignment = {})); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/text/layout.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/text/layout.js var MIN_FONT_SIZE = 4; var MAX_FONT_SIZE = 500; var computeFontSize = function(lines, font, bounds, multiline) { @@ -27600,7 +27352,7 @@ var layoutSinglelineText = function(text2, _a) { }; }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/appearances.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/appearances.js var normalizeAppearance = function(appearance) { if ("normal" in appearance) return appearance; @@ -27985,7 +27737,7 @@ var defaultOptionListAppearanceProvider = function(optionList, widget, font) { })); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFEmbeddedPage.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFEmbeddedPage.js var PDFEmbeddedPage = ( /** @class */ (function() { @@ -28035,7 +27787,7 @@ var PDFEmbeddedPage = ( ); var PDFEmbeddedPage_default = PDFEmbeddedPage; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFFont.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFFont.js var PDFFont = ( /** @class */ (function() { @@ -28109,7 +27861,7 @@ var PDFFont = ( ); var PDFFont_default = PDFFont; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFImage.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFImage.js var PDFImage = ( /** @class */ (function() { @@ -28176,7 +27928,7 @@ var PDFImage = ( ); var PDFImage_default = PDFImage; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/image/alignment.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/image/alignment.js var ImageAlignment; (function(ImageAlignment2) { ImageAlignment2[ImageAlignment2["Left"] = 0] = "Left"; @@ -28184,7 +27936,7 @@ var ImageAlignment; ImageAlignment2[ImageAlignment2["Right"] = 2] = "Right"; })(ImageAlignment || (ImageAlignment = {})); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFField.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFField.js var assertFieldAppearanceOptions = function(options) { assertOrUndefined(options === null || options === void 0 ? void 0 : options.x, "options.x", ["number"]); assertOrUndefined(options === null || options === void 0 ? void 0 : options.y, "options.y", ["number"]); @@ -28397,7 +28149,7 @@ var PDFField = ( ); var PDFField_default = PDFField; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFCheckBox.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFCheckBox.js var PDFCheckBox = ( /** @class */ (function(_super) { @@ -28500,7 +28252,7 @@ var PDFCheckBox = ( ); var PDFCheckBox_default = PDFCheckBox; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFDropdown.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFDropdown.js var PDFDropdown = ( /** @class */ (function(_super) { @@ -28703,7 +28455,7 @@ var PDFDropdown = ( ); var PDFDropdown_default = PDFDropdown; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFOptionList.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFOptionList.js var PDFOptionList = ( /** @class */ (function(_super) { @@ -28884,7 +28636,7 @@ var PDFOptionList = ( ); var PDFOptionList_default = PDFOptionList; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFRadioGroup.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFRadioGroup.js var PDFRadioGroup = ( /** @class */ (function(_super) { @@ -29035,7 +28787,7 @@ var PDFRadioGroup = ( ); var PDFRadioGroup_default = PDFRadioGroup; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFSignature.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFSignature.js var PDFSignature = ( /** @class */ (function(_super) { @@ -29059,7 +28811,7 @@ var PDFSignature = ( ); var PDFSignature_default = PDFSignature; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFTextField.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFTextField.js var PDFTextField = ( /** @class */ (function(_super) { @@ -29283,7 +29035,7 @@ var PDFTextField = ( ); var PDFTextField_default = PDFTextField; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/StandardFonts.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/StandardFonts.js var StandardFonts; (function(StandardFonts2) { StandardFonts2["Courier"] = "Courier"; @@ -29302,7 +29054,7 @@ var StandardFonts; StandardFonts2["ZapfDingbats"] = "ZapfDingbats"; })(StandardFonts || (StandardFonts = {})); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFForm.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFForm.js var PDFForm = ( /** @class */ (function() { @@ -29659,7 +29411,7 @@ var addFieldToParent = function(_a, _b, partialName) { field.setParent(parentRef); }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/sizes.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/sizes.js var PageSizes = { "4A0": [4767.87, 6740.79], "2A0": [3370.39, 4767.87], @@ -29713,7 +29465,7 @@ var PageSizes = { Tabloid: [792, 1224] }; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFDocumentOptions.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFDocumentOptions.js var ParseSpeeds; (function(ParseSpeeds2) { ParseSpeeds2[ParseSpeeds2["Fastest"] = Infinity] = "Fastest"; @@ -29722,7 +29474,7 @@ var ParseSpeeds; ParseSpeeds2[ParseSpeeds2["Slow"] = 100] = "Slow"; })(ParseSpeeds || (ParseSpeeds = {})); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFEmbeddedFile.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFEmbeddedFile.js var PDFEmbeddedFile = ( /** @class */ (function() { @@ -29780,7 +29532,7 @@ var PDFEmbeddedFile = ( ); var PDFEmbeddedFile_default = PDFEmbeddedFile; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFJavaScript.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFJavaScript.js var PDFJavaScript = ( /** @class */ (function() { @@ -29834,7 +29586,7 @@ var PDFJavaScript = ( ); var PDFJavaScript_default = PDFJavaScript; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/JavaScriptEmbedder.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/core/embedders/JavaScriptEmbedder.js var JavaScriptEmbedder = ( /** @class */ (function() { @@ -29872,7 +29624,7 @@ var JavaScriptEmbedder = ( ); var JavaScriptEmbedder_default = JavaScriptEmbedder; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFDocument.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFDocument.js var PDFDocument = ( /** @class */ (function() { @@ -30558,7 +30310,7 @@ function assertIsLiteralOrHexString(pdfObject) { } } -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFPageOptions.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFPageOptions.js var BlendMode; (function(BlendMode2) { BlendMode2["Normal"] = "Normal"; @@ -30575,7 +30327,7 @@ var BlendMode; BlendMode2["Exclusion"] = "Exclusion"; })(BlendMode || (BlendMode = {})); -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFPage.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/PDFPage.js var PDFPage = ( /** @class */ (function() { @@ -31227,7 +30979,7 @@ var PDFPage = ( ); var PDFPage_default = PDFPage; -// ../../../../../../../../../node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFButton.js +// node_modules/.pnpm/pdf-lib@1.17.1/node_modules/pdf-lib/es/api/form/PDFButton.js var PDFButton = ( /** @class */ (function(_super) { @@ -31321,10 +31073,10 @@ var PDFButton = ( ); var PDFButton_default = PDFButton; -// src/export-deck-browser.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-deck-browser.js var import_jszip3 = __toESM(require_jszip_min(), 1); -// ../../../../../../../../../node_modules/.pnpm/pptxgenjs@4.0.1/node_modules/pptxgenjs/dist/pptxgen.es.js +// node_modules/.pnpm/pptxgenjs@4.0.1/node_modules/pptxgenjs/dist/pptxgen.es.js var import_jszip = __toESM(require_jszip_min()); function __awaiter2(thisArg, _arguments, P, generator) { function adopt(value2) { @@ -36644,7 +36396,7 @@ var PptxGenJS = class { } }; -// src/pptx-html-build.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/pptx-html-build.js var import_jszip2 = __toESM(require_jszip_min(), 1); var SLIDE_W_IN = 13.333; var SLIDE_H_IN = 7.5; @@ -36997,7 +36749,7 @@ function buildSpeakerNotes(sourceSlide = {}) { ].filter(Boolean).join("\n\n"); } -// src/export-deck-browser.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-deck-browser.js var MIME_PPTX = "application/vnd.openxmlformats-officedocument.presentationml.presentation"; function uint8ToBase64(bytes) { const chunk = 32768; @@ -37018,14 +36770,42 @@ async function pptxToExportResult(pptx, deck) { base64: String(base64 || "").replace(/^data:.*;base64,/, "") }; } -async function exportEditablePptx(deck, scenes) { +async function exportEditablePptx(deck, scenes, options = {}) { const prepared = Array.isArray(scenes) ? scenes : []; if (!prepared.length) throw new Error("No editable slide scenes to export"); const pptx = createPptxDeck(deck); const slides = Array.isArray(deck?.slides) ? deck.slides : []; for (const [index, scene] of prepared.entries()) { const sourceSlide = slides[index] || {}; - const result = await buildSlideFromScene(scene, pptx); + let result; + try { + result = await buildSlideFromScene(scene, pptx); + } catch (error2) { + options.onDegrade?.({ + severity: "degrade", + slideNumber: scene?.slideNumber || index + 1, + sourceId: error2?.sourceId || error2?.diagnostic?.sourceId || `slide-${index + 1}`, + code: "slide_simplified", + message: "The slide could not be serialized and was replaced with a blank slide." + }); + result = await buildSlideFromScene({ + slideNumber: scene?.slideNumber || index + 1, + width: scene?.width || 13.333, + height: scene?.height || 7.5, + nodes: [{ + type: "shape", + shapeType: "rect", + sourceId: `slide-${index + 1}-blank-background`, + x: 0, + y: 0, + w: scene?.width || 13.333, + h: scene?.height || 7.5, + paintOrder: 0, + subOrder: 0, + style: { fill: "FFFFFF", line: null } + }] + }, pptx); + } const notes = buildSpeakerNotes(sourceSlide); if (notes && result?.slide && typeof result.slide.addNotes === "function") { result.slide.addNotes(notes); @@ -37068,7 +36848,7 @@ async function exportPngZipFromPages(deck, pages) { }; } -// src/export-html.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-html.js function buildHtmlDeck(state2) { if ((state2.slides || []).some((slide) => slide.html)) { return buildSourceHtmlDeck(state2); @@ -37157,7 +36937,7 @@ body{margin:0;background:#111827;font-family:-apple-system,BlinkMacSystemFont,"S `; } -// src/export-format-icons.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-format-icons.js var SVG_ATTRS = 'xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" aria-hidden="true" focusable="false"'; var ICONS = { pptx: ``, @@ -37178,7 +36958,7 @@ function exportFormatTone(formatId) { return tones[formatId] || "#475569"; } -// src/agent-prompt.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/agent-prompt.js var PPT_DESIGN_SKILL_KEY = "user::bitfun-system::ppt-design"; function serializeInput(input) { try { @@ -37238,14 +37018,15 @@ ${prompt}`; - **\u552F\u4E00\u5BFC\u51FA\u94FE\u8DEF**\uFF1Aeditable HTML \u2192 EditableSlideScene \u2192 OOXML\u3002\u6BCF\u9875\u4E25\u683C\u4E3A **1280px \xD7 720px**\u3002 - \u53EA\u4F7F\u7528 solid color\uFF1B\u4E0D\u5F97\u751F\u6210 CSS gradient \u6216 \`background-image\`\u3002\u80CC\u666F\u3001border\u3001\u5706\u89D2\u53EA\u653E\u5728 \`div\` \u7B49\u51E0\u4F55\u5BB9\u5668\u3002 -- \`box-shadow\` \u53EA\u652F\u6301\u5355\u5C42 outer\u3001\u975E inset\u3001zero spread\uFF1B\u591A\u5C42\u3001inset\u3001blur+spread \u7B49\u4E0D\u652F\u6301\u5F62\u6001\u5FC5\u987B blocking\u3002\`text-shadow\` \u4EFB\u4F55\u975E \`none\` \u5F62\u6001\u5747\u5FC5\u987B blocking\u3002 +- \`box-shadow\` \u53EA\u652F\u6301\u5355\u5C42 outer\u3001\u975E inset\u3001zero spread \u7684\u539F\u751F\u6620\u5C04\uFF1B\u591A\u5C42 shadow \u53EA\u53D6\u9996\u4E2A\u53EF\u7528\u5C42\uFF0C\u8D1F spread \u6309 0 \u8FD1\u4F3C\uFF0Cinset \u7B49\u5176\u4F59\u4E0D\u652F\u6301\u5F62\u6001\u5BFC\u51FA\u65F6\u81EA\u52A8\u79FB\u9664\uFF0C\u4E0D\u5F97\u4F9D\u8D56\u3002\`text-shadow\` \u4EFB\u4F55\u975E \`none\` \u5F62\u6001\u5728\u5BFC\u51FA\u65F6\u4E00\u5F8B\u81EA\u52A8\u79FB\u9664\uFF0C\u4E0D\u5F97\u4F9D\u8D56\u5176\u5448\u73B0\u5C42\u6B21\u3002 - HTML \u6587\u5B57\u53EA\u53EF\u653E\u5728 \`

    \`\u3001\`

    \`\u2013\`

    \`\u3001\`
  • \` \u4E2D\uFF1B\`span\` \u53EA\u4F5C\u6587\u672C run\uFF0C\u4E0D\u5F97\u751F\u6210 \`div\` \u88F8\u6587\u5B57\u3002 -- \u7981\u6B62 CSS \`filter\`\u3001\`mask\`\u3001generated content\u3001animation\u3001\u5916\u90E8\u8D44\u6E90\u548C\u590D\u6742/filled SVG path\uFF1B\u7981\u6B62\u4EFB\u610F\u9876\u70B9/\u975E\u4E25\u683C\u5BF9\u79F0 polygon\uFF0C\u4EC5\u5141\u8BB8\u4E25\u683C\u5BF9\u79F0 triangle/diamond\u3002 +- \u7981\u6B62 CSS \`filter\`\u3001\`mask\`\u3001generated content\u3001animation\u3001\u5916\u90E8\u8D44\u6E90\u548C\u590D\u6742/filled SVG path\uFF1B\u7981\u6B62\u4EFB\u610F\u9876\u70B9/\u975E\u4E25\u683C\u5BF9\u79F0 polygon\uFF0C\u4EC5\u5141\u8BB8\u4E25\u683C\u5BF9\u79F0 triangle/diamond\u3002\u5BFC\u51FA\u7BA1\u7EBF\u4F1A\u81EA\u52A8\u5265\u79BB\u8FD9\u4E9B\u6784\u9020\uFF0C\u4F9D\u8D56\u5B83\u4EEC\u7B49\u4E8E\u4E22\u5931\u89C6\u89C9\u3002 - \u7EBF\u4E0E\u66F2\u7EBF\u4F18\u5148\u76F4\u63A5\u751F\u6210 \`line\` \u6216 \`polyline\`\uFF1B\u786E\u6709\u5FC5\u8981\u65F6\u624D\u4F7F\u7528\u4E0B\u9762\u7684\u517C\u5BB9 path \u5B50\u96C6\u3002 - Authoring \u6D41\u7A0B\u7BAD\u5934\u53EA\u7531 editable line + CSS border triangle\uFF0C\u6216 SVG line + strict symmetric triangle polygon \u6784\u6210\u3002 - \u8868\u683C\u5FC5\u987B\u5199\u771F\u5B9E\u7684 \`\` \u5E76\u5BFC\u51FA\u4E3A native \`a:tbl\`\uFF1B\u56FE\u8868\u3001\u6D41\u7A0B\u7BAD\u5934\u3001\u865A\u7EBF\u548C\u66F2\u7EBF\u5FC5\u987B\u4F7F\u7528\u652F\u6301\u7684\u53EF\u7F16\u8F91\u539F\u8BED\u3002 - intentional \u56FE\u7247\u53EA\u5141\u8BB8\u5185\u8054 base64 PNG\u3001JPEG\u3001WebP\uFF0C\u4E14\u4E0D\u5F97\u627F\u8F7D\u6587\u5B57\u3001\u56FE\u8868\u6216\u51E0\u4F55\uFF1B\u7981\u6B62 GIF\uFF0C\u56E0\u4E3A\u65E0\u6CD5\u8BC1\u660E\u5176\u4E3A\u9759\u6001\u5185\u5BB9\u3002 -- \u7981\u6B62\u4EFB\u4F55\u6B63\u5411 rasterize\u3001screenshot \u6216 fallback \u5EFA\u8BAE\uFF1B\u65E0\u6CD5\u8868\u793A\u65F6\u505C\u6B62\u751F\u6210\u5E76\u62A5\u544A\u5177\u4F53\u5143\u7D20\u3002 +- \u7981\u6B62\u4EFB\u4F55\u6B63\u5411 rasterize\u3001screenshot \u6216 fallback \u5EFA\u8BAE\uFF1Bauthoring \u65F6\u65E0\u6CD5\u7528\u53D7\u652F\u6301\u539F\u8BED\u8868\u8FBE\u7684\u5185\u5BB9\u5FC5\u987B\u6539\u5199\u4E3A\u53D7\u652F\u6301\u5F62\u6001\u3002 +- \u5BFC\u51FA\u9636\u6BB5\u5BF9\u4E0D\u652F\u6301\u7684\u5185\u5BB9\u4F1A\u81EA\u52A8\u964D\u7EA7\uFF08\u5265\u79BB\u6837\u5F0F\u3001\u79FB\u9664\u5143\u7D20\u6216\u7B80\u5316\u6574\u9875\uFF09\u800C\u4E0D\u662F\u963B\u65AD\u5BFC\u51FA\uFF1B\u4E25\u683C\u9075\u5B88\u4E0A\u8FF0 subset \u662F\u4FDD\u8BC1\u5BFC\u51FA\u89C6\u89C9\u4E0D\u5931\u771F\u7684\u552F\u4E00\u65B9\u5F0F\u3002 ## Converter legacy rewrite boundary\uFF08\u517C\u5BB9\u8FB9\u754C\uFF0C\u4E0D\u662F\u751F\u6210\u5EFA\u8BAE\uFF09 @@ -37289,7 +37070,7 @@ ${prompt}`; return prompt; } -// src/bitfun-backend-adapter.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/bitfun-backend-adapter.js var EVENT_LISTENERS = /* @__PURE__ */ new Set(); function emitEvent(event) { EVENT_LISTENERS.forEach((listener) => { @@ -37354,7 +37135,7 @@ function installBitFunBackendAdapter(app = window.app) { if (app.agent?.run) installAgentBackend(app); } -// src/deck-project-contract.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/deck-project-contract.js var DeckProjectContractError = class extends Error { constructor(diagnostic) { super(`[${diagnostic.code}] ${diagnostic.summary}`); @@ -37505,19 +37286,150 @@ function buildDeckRunRequestInput(baseInput, { ...projectContractDiagnostic ? { projectContractDiagnostic } : {} }; } -function parseProjectJson(raw) { +function stripJsonComments(text2) { + let output = ""; + let quote = null; + for (let index = 0; index < text2.length; ) { + const character = text2[index]; + if (quote) { + output += character; + if (character === "\\" && index + 1 < text2.length) { + output += text2[index + 1]; + index += 2; + continue; + } + if (character === quote) quote = null; + index += 1; + continue; + } + if (character === '"' || character === "'") { + quote = character; + output += character; + index += 1; + continue; + } + if (character === "/" && text2[index + 1] === "/") { + while (index < text2.length && text2[index] !== "\n") index += 1; + continue; + } + if (character === "/" && text2[index + 1] === "*") { + const end = text2.indexOf("*/", index + 2); + index = end < 0 ? text2.length : end + 2; + continue; + } + output += character; + index += 1; + } + return output; +} +function stripTrailingJsonCommas(text2) { + let output = ""; + let quote = null; + for (let index = 0; index < text2.length; index += 1) { + const character = text2[index]; + if (quote) { + output += character; + if (character === "\\" && index + 1 < text2.length) { + output += text2[index + 1]; + index += 1; + } else if (character === quote) quote = null; + continue; + } + if (character === '"' || character === "'") { + quote = character; + output += character; + continue; + } + if (character === ",") { + let lookahead = index + 1; + while (lookahead < text2.length && /\s/.test(text2[lookahead])) lookahead += 1; + if (text2[lookahead] === "}" || text2[lookahead] === "]") continue; + } + output += character; + } + return output; +} +function closeTruncatedJson(text2) { + let quote = null; + const stack = []; + for (let index = 0; index < text2.length; index += 1) { + const character = text2[index]; + if (quote) { + if (character === "\\") index += 1; + else if (character === quote) quote = null; + continue; + } + if (character === '"' || character === "'") quote = character; + else if (character === "{" || character === "[") stack.push(character); + else if (character === "}" || character === "]") stack.pop(); + } + if (!stack.length || stack[0] !== "{") return null; + let trimmed = text2.replace(/\s+$/, ""); + if (quote) trimmed += quote; + for (; ; ) { + trimmed = trimmed.replace(/\s+$/, ""); + if (/[,:]$/.test(trimmed)) { + trimmed = trimmed.slice(0, -1); + continue; + } + const bareKey = trimmed.match(/"[^"]*"$/); + if (bareKey && /[{,]\s*"[^"]*"$/.test(trimmed)) { + trimmed = trimmed.slice(0, trimmed.length - bareKey[0].length); + continue; + } + break; + } + const closers = stack.map((open) => open === "{" ? "}" : "]").reverse().join(""); + return `${trimmed}${closers}`; +} +function parseJsonObjectCandidate(candidate) { try { - const plan = JSON.parse(raw); - if (!plan || Array.isArray(plan) || typeof plan !== "object") throw new Error("root must be an object"); - return plan; - } catch (error2) { - throw contractError( - "invalid_project_json", - "`project.json` is not valid JSON.", - "\u4FEE\u590D `project.json` JSON\uFF0C\u4F7F\u6839\u503C\u4E3A\u5BF9\u8C61\uFF1B\u4E0D\u8981\u91CD\u5199\u5DF2\u6709\u9875\u9762\u3002\u4FEE\u590D\u540E\u7EE7\u7EED\u5B8C\u6210\u5951\u7EA6\u3002", - { cause: String(error2?.message || error2) } - ); + const parsed = JSON.parse(candidate); + if (parsed && !Array.isArray(parsed) && typeof parsed === "object") return parsed; + } catch { } + return null; +} +function parseJsonObjectTolerant(raw, { mode = "lenient" } = {}) { + const text2 = String(raw || "").replace(/^\uFEFF/, "").trim(); + if (!text2) return null; + const candidates = [text2]; + const fenceStart = text2.indexOf("{"); + const fenceEnd = text2.lastIndexOf("}"); + if (fenceStart > 0 || fenceEnd >= 0 && fenceEnd < text2.length - 1) { + if (fenceStart >= 0 && fenceEnd > fenceStart) candidates.push(text2.slice(fenceStart, fenceEnd + 1)); + } + const bases = [...candidates]; + for (const base of bases) { + const uncommented = stripJsonComments(base); + if (uncommented !== base) candidates.push(uncommented); + const withoutTrailing = stripTrailingJsonCommas(uncommented); + if (withoutTrailing !== uncommented) candidates.push(withoutTrailing); + } + for (const candidate of candidates) { + const parsed = parseJsonObjectCandidate(candidate); + if (parsed) return parsed; + } + if (mode !== "lenient") return null; + let fragment = stripTrailingJsonCommas(stripJsonComments(text2)); + for (let attempt = 0; attempt < 32 && fragment; attempt += 1) { + const closed = closeTruncatedJson(fragment); + const parsed = closed ? parseJsonObjectCandidate(closed) : null; + if (parsed && Object.keys(parsed).length > 0) return parsed; + const cutAt = Math.max(fragment.lastIndexOf(","), fragment.lastIndexOf("},{")); + if (cutAt <= 0) break; + fragment = fragment.slice(0, cutAt); + } + return null; +} +function parseProjectJson(raw) { + const plan = parseJsonObjectTolerant(raw, { mode: "lenient" }); + if (plan) return plan; + throw contractError( + "invalid_project_json", + "`project.json` is not valid JSON.", + "\u4FEE\u590D `project.json` JSON\uFF0C\u4F7F\u6839\u503C\u4E3A\u5BF9\u8C61\uFF1B\u4E0D\u8981\u91CD\u5199\u5DF2\u6709\u9875\u9762\u3002\u4FEE\u590D\u540E\u7EE7\u7EED\u5B8C\u6210\u5951\u7EA6\u3002" + ); } async function readProjectPlanWithRetry(readFile, options = {}) { const { requireComplete = false } = options; @@ -37525,12 +37437,8 @@ async function readProjectPlanWithRetry(readFile, options = {}) { ...options, accept: (raw) => { if (!raw.trim()) return false; - try { - const parsed = JSON.parse(raw); - return Boolean(parsed) && !Array.isArray(parsed) && typeof parsed === "object" && (!requireComplete || parsed.status === "complete"); - } catch { - return false; - } + const parsed = parseJsonObjectTolerant(raw, { mode: "clean" }); + return Boolean(parsed) && (!requireComplete || parsed.status === "complete"); } }); if (typeof result === "string") return parseProjectJson(result); @@ -37659,7 +37567,7 @@ async function readDeckProjectContract(readFile, options = {}) { return { plan, slides }; } -// src/export-diagnostics.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-diagnostics.js var DIAGNOSTIC_REASONS = { "en-US": { active_content_removed: "Unsafe active content was removed.", @@ -37674,7 +37582,27 @@ var DIAGNOSTIC_REASONS = { manual_bullet_list: "Manual bullets were rewritten as an editable list.", unreadable_document: "The slide document could not be read.", unmeasurable_canvas: "The slide canvas could not be measured.", - pptx_serialization: "The slide could not be serialized to PPTX." + pptx_serialization: "The slide could not be serialized to PPTX.", + box_shadow_removed: "An unsupported CSS box-shadow was removed.", + text_shadow_removed: "An unsupported CSS text-shadow was removed.", + css_filter_removed: "A CSS filter was removed.", + css_mask_removed: "A CSS mask was removed.", + animation_removed: "A CSS/SVG animation was removed.", + inline_margin_removed: "An unsupported inline margin was ignored.", + background_image_removed: "A CSS background image was removed (solid color kept).", + svg_paint_server_removed: "An SVG paint-server fill/stroke was replaced with a solid color.", + svg_feature_removed: "An unsupported SVG feature was removed.", + svg_path_outline: "A filled SVG path was converted to an editable outline.", + generated_content_removed: "Pseudo-element generated content was removed.", + merge_container_unwrapped: "A merge container was unwrapped into regular editable content.", + manual_bullet_removed: "A manual bullet character was removed.", + element_removed: "An element that cannot be represented as an editable object was removed.", + canvas_size_adjusted: "The slide canvas was normalized to the editable size.", + slide_simplified: "This slide contained unconvertible content and was replaced with a simplified editable version.", + duplicate_source_id_repaired: "A duplicate element id was reassigned.", + nested_paragraph_repaired: "A nested paragraph structure was split into ordered paragraphs.", + direct_text_wrapped: "Direct container text was wrapped in a semantic text block.", + decorated_inline_promoted: "Decorated inline text was promoted to shape plus text." }, "zh-CN": { active_content_removed: "\u5DF2\u79FB\u9664\u4E0D\u5B89\u5168\u7684\u6D3B\u52A8\u5185\u5BB9\u3002", @@ -37689,7 +37617,23 @@ var DIAGNOSTIC_REASONS = { manual_bullet_list: "\u624B\u5DE5\u9879\u76EE\u7B26\u53F7\u5DF2\u91CD\u5199\u4E3A\u53EF\u7F16\u8F91\u5217\u8868\u3002", unreadable_document: "\u65E0\u6CD5\u8BFB\u53D6\u5E7B\u706F\u7247\u6587\u6863\u3002", unmeasurable_canvas: "\u65E0\u6CD5\u6D4B\u91CF\u5E7B\u706F\u7247\u753B\u5E03\u3002", - pptx_serialization: "\u65E0\u6CD5\u5C06\u5E7B\u706F\u7247\u5E8F\u5217\u5316\u4E3A PPTX\u3002" + pptx_serialization: "\u65E0\u6CD5\u5C06\u5E7B\u706F\u7247\u5E8F\u5217\u5316\u4E3A PPTX\u3002", + box_shadow_removed: "\u4E0D\u652F\u6301\u7684 CSS box-shadow \u5DF2\u79FB\u9664\u3002", + text_shadow_removed: "\u4E0D\u652F\u6301\u7684 CSS text-shadow \u5DF2\u79FB\u9664\u3002", + css_filter_removed: "CSS filter \u5DF2\u79FB\u9664\u3002", + css_mask_removed: "CSS mask \u5DF2\u79FB\u9664\u3002", + animation_removed: "CSS/SVG \u52A8\u753B\u5DF2\u79FB\u9664\u3002", + inline_margin_removed: "\u4E0D\u652F\u6301\u7684\u5185\u8054\u5916\u8FB9\u8DDD\u5DF2\u5FFD\u7565\u3002", + background_image_removed: "CSS \u80CC\u666F\u56FE\u7247\u5DF2\u79FB\u9664\uFF08\u4FDD\u7559\u7EAF\u8272\uFF09\u3002", + svg_paint_server_removed: "SVG \u6E10\u53D8/\u56FE\u6848\u586B\u5145\u5DF2\u66FF\u6362\u4E3A\u7EAF\u8272\u3002", + svg_feature_removed: "\u4E0D\u652F\u6301\u7684 SVG \u7279\u6027\u5DF2\u79FB\u9664\u3002", + svg_path_outline: "\u586B\u5145 SVG \u8DEF\u5F84\u5DF2\u8F6C\u6362\u4E3A\u53EF\u7F16\u8F91\u8F6E\u5ED3\u3002", + generated_content_removed: "\u4F2A\u5143\u7D20\u751F\u6210\u5185\u5BB9\u5DF2\u79FB\u9664\u3002", + merge_container_unwrapped: "\u5408\u5E76\u5BB9\u5668\u5DF2\u5C55\u5F00\u4E3A\u666E\u901A\u53EF\u7F16\u8F91\u5185\u5BB9\u3002", + manual_bullet_removed: "\u624B\u5DE5\u9879\u76EE\u7B26\u53F7\u5B57\u7B26\u5DF2\u79FB\u9664\u3002", + element_removed: "\u65E0\u6CD5\u8868\u793A\u4E3A\u53EF\u7F16\u8F91\u5BF9\u8C61\u7684\u5143\u7D20\u5DF2\u79FB\u9664\u3002", + canvas_size_adjusted: "\u9875\u9762\u753B\u5E03\u5DF2\u5F52\u4E00\u5316\u4E3A\u53EF\u7F16\u8F91\u5C3A\u5BF8\u3002", + slide_simplified: "\u8BE5\u9875\u5305\u542B\u65E0\u6CD5\u8F6C\u6362\u7684\u5185\u5BB9\uFF0C\u5DF2\u66FF\u6362\u4E3A\u7B80\u5316\u53EF\u7F16\u8F91\u7248\u672C\u3002" } }; var UNKNOWN_REASON = { @@ -37703,10 +37647,11 @@ function sanitizeDiagnosticSourceId(value2) { function formatLocalizedExportDiagnostic(diagnostic = {}, locale = "en-US") { const resolvedLocale = locale === "zh-CN" ? locale : "en-US"; const reason = DIAGNOSTIC_REASONS[resolvedLocale][diagnostic.code] || UNKNOWN_REASON[resolvedLocale]; + const severity = ["blocking", "degrade"].includes(diagnostic.severity) ? diagnostic.severity : "rewrite"; return { slideNumber: diagnostic.slideNumber, sourceId: sanitizeDiagnosticSourceId(diagnostic.sourceId), - severity: diagnostic.severity === "blocking" ? "blocking" : "rewrite", + severity, code: String(diagnostic.code || "unknown").replace(/[^a-z0-9_-]/gi, "").slice(0, 64), reason: reason.slice(0, 120) }; @@ -37714,15 +37659,15 @@ function formatLocalizedExportDiagnostic(diagnostic = {}, locale = "en-US") { function localizeExportDiagnosticLocations(locations = [], locale = "en-US") { return locations.map((location) => formatLocalizedExportDiagnostic(location, locale)); } -function summarizePptxExportDiagnostics(scenes = []) { - const counts = { rewritten: 0, blocking: 0 }; +function summarizePptxExportDiagnostics(scenes = [], degradations = []) { + const counts = { rewritten: 0, blocking: 0, degraded: 0 }; const locations = []; const seen = /* @__PURE__ */ new Set(); const add = (slideNumber, diagnostic) => { const location = { slideNumber, sourceId: diagnostic.sourceId || null, - severity: diagnostic.severity === "blocking" ? "blocking" : "rewrite", + severity: ["blocking", "degrade"].includes(diagnostic.severity) ? diagnostic.severity : "rewrite", code: diagnostic.code || diagnostic.rewrite || null }; const key = `${location.slideNumber}:${location.sourceId}:${location.severity}:${location.code}`; @@ -37742,15 +37687,23 @@ function summarizePptxExportDiagnostics(scenes = []) { }); }); }); + (Array.isArray(degradations) ? degradations : []).forEach((degradation, index) => { + counts.degraded += 1; + add(degradation?.slideNumber || index + 1, { + sourceId: degradation?.sourceId, + severity: "degrade", + code: degradation?.code + }); + }); return { counts, locations, - hasWarnings: counts.rewritten > 0, + hasWarnings: counts.rewritten > 0 || counts.degraded > 0, hasBlocking: counts.blocking > 0 }; } -// ui.js +// src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/ui.js var state = createInitialState(); var busy = false; var dragState = null; @@ -38292,7 +38245,15 @@ function readGenerationStyleFromPropertyPanel() { state = ensureState(state); } var PPT_BACKEND_MAX_ATTEMPTS = 2; +var PPT_BACKEND_MAX_CONTRACT_ATTEMPTS = 4; var PPT_RETRY_DELAY_MS = 750; +function isContractRecoverableError(error2) { + if (error2?.diagnostic?.continuationPrompt) return true; + return /did not produce a readable deck/i.test(String(error2?.message || "")); +} +function maxAttemptsFor(error2) { + return isContractRecoverableError(error2) ? PPT_BACKEND_MAX_CONTRACT_ATTEMPTS : PPT_BACKEND_MAX_ATTEMPTS; +} function isRetryableBackendError(error2) { const raw = String(error2?.message || error2 || ""); if (isStoppedBackendError(error2)) return false; @@ -38784,15 +38745,16 @@ async function runCoworkDeckGeneration(operation, instruction) { let progressivePlan = null; try { let lastError = null; - for (let attempt = 1; attempt <= PPT_BACKEND_MAX_ATTEMPTS; attempt += 1) { + let maxAttempts = PPT_BACKEND_MAX_ATTEMPTS; + for (let attempt = 1; attempt <= maxAttempts; attempt += 1) { try { if (attempt > 1) { addGenerationEvent({ - title: translate("generationRetryAttempt", { attempt, max: PPT_BACKEND_MAX_ATTEMPTS }), + title: translate("generationRetryAttempt", { attempt, max: maxAttempts }), detail: backendErrorDetail(lastError), kind: "start" }); - setStatus(translate("generationRetrying", { attempt, max: PPT_BACKEND_MAX_ATTEMPTS })); + setStatus(translate("generationRetrying", { attempt, max: maxAttempts })); await new Promise((resolve) => setTimeout(resolve, retryDelayMs(lastError, attempt))); } const requestInput = buildDeckRunRequestInput( @@ -38911,10 +38873,11 @@ async function runCoworkDeckGeneration(operation, instruction) { if (error2?.diagnostic) projectContractDiagnostic = error2.diagnostic; if (isUnknownSessionBackendError(error2)) retrySession.id = null; else if (error2?.pptLiveSessionId) retrySession.id = error2.pptLiveSessionId; - if (!isRetryableBackendError(error2) || attempt >= PPT_BACKEND_MAX_ATTEMPTS) throw error2; + maxAttempts = Math.max(maxAttempts, maxAttemptsFor(error2)); + if (!isRetryableBackendError(error2) || attempt >= maxAttempts) throw error2; runtime().log?.warn?.("PPT Live cowork generation attempt failed, retrying", { attempt, - maxAttempts: PPT_BACKEND_MAX_ATTEMPTS, + maxAttempts, continueInSession: Boolean(retrySession.id), error: String(error2) }); @@ -39661,13 +39624,14 @@ function formatExportDiagnostics(summary) { if (!summary?.hasWarnings && !summary?.hasBlocking) return ""; const countLabels = [ ["rewritten", "exportDiagnosticsRepaired"], + ["degraded", "exportDiagnosticsDegraded"], ["blocking", "exportDiagnosticsBlocking"] ].filter(([countKey]) => summary.counts?.[countKey] > 0).map(([countKey, labelKey]) => translate(labelKey, { count: summary.counts[countKey] })); const locations = localizeExportDiagnosticLocations(summary.locations || [], getLocale()).filter((location) => location.sourceId).slice(0, 3).map((location) => translate("exportDiagnosticsLocation", { slide: location.slideNumber, source: location.sourceId, phase: translate( - location.severity === "blocking" ? "exportDiagnosticsPhaseBlocking" : "exportDiagnosticsPhaseRepair" + location.severity === "blocking" ? "exportDiagnosticsPhaseBlocking" : location.severity === "degrade" ? "exportDiagnosticsPhaseDegraded" : "exportDiagnosticsPhaseRepair" ), reason: location.reason })); @@ -39739,11 +39703,15 @@ async function executeExport(format) { let result; const deckPayload = clone(state); if (format === "pptx") { + const exportDegradations = []; const scenes = await prepareEditableSlides(slides, { - onSlideProgress: (pageNumber) => setExportRenderProgress(pageNumber - 1, slides.length, "pptx") + onSlideProgress: (pageNumber) => setExportRenderProgress(pageNumber - 1, slides.length, "pptx"), + onDegrade: (record2) => exportDegradations.push(record2) + }); + result = await exportEditablePptx(deckPayload, scenes, { + onDegrade: (record2) => exportDegradations.push(record2) }); - result = await exportEditablePptx(deckPayload, scenes); - result.exportSummary = summarizePptxExportDiagnostics(scenes); + result.exportSummary = summarizePptxExportDiagnostics(scenes, exportDegradations); } else if (format === "pdf") { const pages = await renderSlidesInHostWebView(slides, "pdf"); result = await exportPdfFromBase64Pages(deckPayload, pages.map((page) => page.base64)); diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/meta.json b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/meta.json index c8164f513..8021a497b 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/meta.json +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/meta.json @@ -10,7 +10,7 @@ "ppt", "ai" ], - "version": 231, + "version": 232, "created_at": 0, "updated_at": 0, "permissions": { diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/agent-prompt.js b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/agent-prompt.js index 15a69cb3e..61217812f 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/agent-prompt.js +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/agent-prompt.js @@ -66,14 +66,15 @@ export function buildAgentPrompt(input) { - **唯一导出链路**:editable HTML → EditableSlideScene → OOXML。每页严格为 **1280px × 720px**。 - 只使用 solid color;不得生成 CSS gradient 或 \`background-image\`。背景、border、圆角只放在 \`div\` 等几何容器。 -- \`box-shadow\` 只支持单层 outer、非 inset、zero spread;多层、inset、blur+spread 等不支持形态必须 blocking。\`text-shadow\` 任何非 \`none\` 形态均必须 blocking。 +- \`box-shadow\` 只支持单层 outer、非 inset、zero spread 的原生映射;多层 shadow 只取首个可用层,负 spread 按 0 近似,inset 等其余不支持形态导出时自动移除,不得依赖。\`text-shadow\` 任何非 \`none\` 形态在导出时一律自动移除,不得依赖其呈现层次。 - HTML 文字只可放在 \`

    \`、\`

    \`–\`

    \`、\`
  • \` 中;\`span\` 只作文本 run,不得生成 \`div\` 裸文字。 -- 禁止 CSS \`filter\`、\`mask\`、generated content、animation、外部资源和复杂/filled SVG path;禁止任意顶点/非严格对称 polygon,仅允许严格对称 triangle/diamond。 +- 禁止 CSS \`filter\`、\`mask\`、generated content、animation、外部资源和复杂/filled SVG path;禁止任意顶点/非严格对称 polygon,仅允许严格对称 triangle/diamond。导出管线会自动剥离这些构造,依赖它们等于丢失视觉。 - 线与曲线优先直接生成 \`line\` 或 \`polyline\`;确有必要时才使用下面的兼容 path 子集。 - Authoring 流程箭头只由 editable line + CSS border triangle,或 SVG line + strict symmetric triangle polygon 构成。 - 表格必须写真实的 \`
  • \` 并导出为 native \`a:tbl\`;图表、流程箭头、虚线和曲线必须使用支持的可编辑原语。 - intentional 图片只允许内联 base64 PNG、JPEG、WebP,且不得承载文字、图表或几何;禁止 GIF,因为无法证明其为静态内容。 -- 禁止任何正向 rasterize、screenshot 或 fallback 建议;无法表示时停止生成并报告具体元素。 +- 禁止任何正向 rasterize、screenshot 或 fallback 建议;authoring 时无法用受支持原语表达的内容必须改写为受支持形态。 +- 导出阶段对不支持的内容会自动降级(剥离样式、移除元素或简化整页)而不是阻断导出;严格遵守上述 subset 是保证导出视觉不失真的唯一方式。 ## Converter legacy rewrite boundary(兼容边界,不是生成建议) diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/deck-project-contract.js b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/deck-project-contract.js index 158d56275..87b799024 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/deck-project-contract.js +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/deck-project-contract.js @@ -157,19 +157,182 @@ export function buildDeckRunRequestInput(baseInput, { }; } -function parseProjectJson(raw) { +// ─── Tolerant project.json parsing ─────────────────────────────────────────── +// Agent-written `project.json` frequently fails a strict JSON.parse: markdown +// fences, // or /* */ comments, trailing commas, or a truncated final write. +// Aborting the whole generation for those cases is unreasonable, so parsing +// falls back through a chain of conservative repairs. Contract validation +// (status/outline/slide_order/slide files) still runs afterwards, so a repair +// that loses required content surfaces as a targeted continuation diagnostic +// instead of silently succeeding. + +/** Remove JS-style comments outside string literals. */ +function stripJsonComments(text) { + let output = ''; + let quote = null; + for (let index = 0; index < text.length;) { + const character = text[index]; + if (quote) { + output += character; + if (character === '\\' && index + 1 < text.length) { + output += text[index + 1]; + index += 2; + continue; + } + if (character === quote) quote = null; + index += 1; + continue; + } + if (character === '"' || character === "'") { + quote = character; + output += character; + index += 1; + continue; + } + if (character === '/' && text[index + 1] === '/') { + while (index < text.length && text[index] !== '\n') index += 1; + continue; + } + if (character === '/' && text[index + 1] === '*') { + const end = text.indexOf('*/', index + 2); + index = end < 0 ? text.length : end + 2; + continue; + } + output += character; + index += 1; + } + return output; +} + +/** Drop commas that directly precede a closing bracket (outside strings). */ +function stripTrailingJsonCommas(text) { + let output = ''; + let quote = null; + for (let index = 0; index < text.length; index += 1) { + const character = text[index]; + if (quote) { + output += character; + if (character === '\\' && index + 1 < text.length) { + output += text[index + 1]; + index += 1; + } else if (character === quote) quote = null; + continue; + } + if (character === '"' || character === "'") { + quote = character; + output += character; + continue; + } + if (character === ',') { + let lookahead = index + 1; + while (lookahead < text.length && /\s/.test(text[lookahead])) lookahead += 1; + if (text[lookahead] === '}' || text[lookahead] === ']') continue; + } + output += character; + } + return output; +} + +/** + * Close a truncated JSON document: terminate an open string, drop trailing + * incomplete fragments (dangling key/colon/comma), then append the closers + * required by the open bracket stack. Returns null when the text does not + * start an object. + */ +function closeTruncatedJson(text) { + let quote = null; + const stack = []; + for (let index = 0; index < text.length; index += 1) { + const character = text[index]; + if (quote) { + if (character === '\\') index += 1; + else if (character === quote) quote = null; + continue; + } + if (character === '"' || character === "'") quote = character; + else if (character === '{' || character === '[') stack.push(character); + else if (character === '}' || character === ']') stack.pop(); + } + if (!stack.length || stack[0] !== '{') return null; + let trimmed = text.replace(/\s+$/, ''); + if (quote) trimmed += quote; + // Drop trailing incomplete fragments: dangling comma/colon, or a lone key. + for (;;) { + trimmed = trimmed.replace(/\s+$/, ''); + if (/[,:]$/.test(trimmed)) { + trimmed = trimmed.slice(0, -1); + continue; + } + const bareKey = trimmed.match(/"[^"]*"$/); + if (bareKey && /[{,]\s*"[^"]*"$/.test(trimmed)) { + trimmed = trimmed.slice(0, trimmed.length - bareKey[0].length); + continue; + } + break; + } + const closers = stack.map((open) => (open === '{' ? '}' : ']')).reverse().join(''); + return `${trimmed}${closers}`; +} + +function parseJsonObjectCandidate(candidate) { try { - const plan = JSON.parse(raw); - if (!plan || Array.isArray(plan) || typeof plan !== 'object') throw new Error('root must be an object'); - return plan; - } catch (error) { - throw contractError( - 'invalid_project_json', - '`project.json` is not valid JSON.', - '修复 `project.json` JSON,使根值为对象;不要重写已有页面。修复后继续完成契约。', - { cause: String(error?.message || error) }, - ); + const parsed = JSON.parse(candidate); + if (parsed && !Array.isArray(parsed) && typeof parsed === 'object') return parsed; + } catch { + // Try the next candidate. + } + return null; +} + +/** + * Parse agent-written JSON tolerantly. `mode: 'lenient'` also attempts + * truncated-document repair; `mode: 'clean'` only applies repairs that never + * fabricate structure (fence/comment/trailing-comma stripping) so a file that + * is still being written is not accepted early. + */ +export function parseJsonObjectTolerant(raw, { mode = 'lenient' } = {}) { + const text = String(raw || '').replace(/^\uFEFF/, '').trim(); + if (!text) return null; + const candidates = [text]; + const fenceStart = text.indexOf('{'); + const fenceEnd = text.lastIndexOf('}'); + if (fenceStart > 0 || (fenceEnd >= 0 && fenceEnd < text.length - 1)) { + if (fenceStart >= 0 && fenceEnd > fenceStart) candidates.push(text.slice(fenceStart, fenceEnd + 1)); + } + const bases = [...candidates]; + for (const base of bases) { + const uncommented = stripJsonComments(base); + if (uncommented !== base) candidates.push(uncommented); + const withoutTrailing = stripTrailingJsonCommas(uncommented); + if (withoutTrailing !== uncommented) candidates.push(withoutTrailing); } + for (const candidate of candidates) { + const parsed = parseJsonObjectCandidate(candidate); + if (parsed) return parsed; + } + if (mode !== 'lenient') return null; + // Truncated write: progressively shorten to the last complete fragment, + // close the bracket stack, and accept only objects with real content. + let fragment = stripTrailingJsonCommas(stripJsonComments(text)); + for (let attempt = 0; attempt < 32 && fragment; attempt += 1) { + const closed = closeTruncatedJson(fragment); + const parsed = closed ? parseJsonObjectCandidate(closed) : null; + if (parsed && Object.keys(parsed).length > 0) return parsed; + const cutAt = Math.max(fragment.lastIndexOf(','), fragment.lastIndexOf('},{')); + if (cutAt <= 0) break; + fragment = fragment.slice(0, cutAt); + } + return null; +} + +function parseProjectJson(raw) { + const plan = parseJsonObjectTolerant(raw, { mode: 'lenient' }); + if (plan) return plan; + throw contractError( + 'invalid_project_json', + '`project.json` is not valid JSON.', + '修复 `project.json` JSON,使根值为对象;不要重写已有页面。修复后继续完成契约。', + ); } export async function readProjectPlanWithRetry(readFile, options = {}) { @@ -178,15 +341,12 @@ export async function readProjectPlanWithRetry(readFile, options = {}) { ...options, accept: (raw) => { if (!raw.trim()) return false; - try { - const parsed = JSON.parse(raw); - return Boolean(parsed) - && !Array.isArray(parsed) - && typeof parsed === 'object' - && (!requireComplete || parsed.status === 'complete'); - } catch { - return false; - } + // Accept cheap, structure-preserving repairs immediately (fences, + // comments, trailing commas) but not truncated-document repair: a file + // that is still being written must keep retrying instead of being + // accepted with fabricated closers. + const parsed = parseJsonObjectTolerant(raw, { mode: 'clean' }); + return Boolean(parsed) && (!requireComplete || parsed.status === 'complete'); }, }); if (typeof result === 'string') return parseProjectJson(result); diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-deck-browser.js b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-deck-browser.js index d05077f9b..2c2d64e19 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-deck-browser.js +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-deck-browser.js @@ -39,14 +39,47 @@ async function pptxToExportResult(pptx, deck) { }; } -export async function exportEditablePptx(deck, scenes) { +/** + * Serialize every scene. A slide whose scene fails OOXML serialization is + * replaced with a blank slide instead of aborting the whole deck export; the + * degradation is reported through `options.onDegrade`. + */ +export async function exportEditablePptx(deck, scenes, options = {}) { const prepared = Array.isArray(scenes) ? scenes : []; if (!prepared.length) throw new Error('No editable slide scenes to export'); const pptx = createPptxDeck(deck); const slides = Array.isArray(deck?.slides) ? deck.slides : []; for (const [index, scene] of prepared.entries()) { const sourceSlide = slides[index] || {}; - const result = await buildSlideFromScene(scene, pptx); + let result; + try { + result = await buildSlideFromScene(scene, pptx); + } catch (error) { + options.onDegrade?.({ + severity: 'degrade', + slideNumber: scene?.slideNumber || index + 1, + sourceId: error?.sourceId || error?.diagnostic?.sourceId || `slide-${index + 1}`, + code: 'slide_simplified', + message: 'The slide could not be serialized and was replaced with a blank slide.', + }); + result = await buildSlideFromScene({ + slideNumber: scene?.slideNumber || index + 1, + width: scene?.width || 13.333, + height: scene?.height || 7.5, + nodes: [{ + type: 'shape', + shapeType: 'rect', + sourceId: `slide-${index + 1}-blank-background`, + x: 0, + y: 0, + w: scene?.width || 13.333, + h: scene?.height || 7.5, + paintOrder: 0, + subOrder: 0, + style: { fill: 'FFFFFF', line: null }, + }], + }, pptx); + } const notes = buildSpeakerNotes(sourceSlide); if (notes && result?.slide && typeof result.slide.addNotes === 'function') { result.slide.addNotes(notes); diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-degrade.js b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-degrade.js new file mode 100644 index 000000000..e90462e80 --- /dev/null +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-degrade.js @@ -0,0 +1,515 @@ +// ───────────────────────────────────────────────────────────────────────────── +// Export degradation layer +// +// The editable PPTX pipeline is intentionally strict: anything that cannot be +// represented as native editable PowerPoint geometry raises a blocking +// diagnostic. Strictness is correct for *authoring-time* feedback, but at +// *export time* a single bad element must never abort the whole deck. +// +// This module converts blocking diagnostics into local repairs: +// - unsupported styles (box-shadow, text-shadow, filter, mask, animation, +// background images, inline margins) are stripped from the element; +// - unrepresentable SVG constructs are simplified or removed; +// - unrepresentable elements are removed; +// - a slide that still fails after repair is replaced by a simplified +// editable scene (background + text) so the exported deck keeps every page. +// +// Every applied repair is reported through `onDegrade` so the export summary +// can tell the user exactly what was adjusted. +// ───────────────────────────────────────────────────────────────────────────── +import { EditableExportError, validateEditableSlideScene } from './editable-slide-scene.js'; + +const MAX_REPAIRS_PER_SLIDE = 48; + +function colorToHex(value, fallback = null) { + const raw = String(value || '').trim().toLowerCase(); + if (!raw || raw === 'transparent') return fallback; + const hex = raw.match(/^#([\da-f]{3}|[\da-f]{6})$/i)?.[1]; + if (hex) { + return (hex.length === 3 ? hex.split('').map((c) => c + c).join('') : hex).toUpperCase(); + } + const rgb = raw.match(/^rgba?\(\s*([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)(?:\s*[,/]\s*([\d.]+%?))?\s*\)$/i); + if (rgb) { + const alpha = rgb[4] == null ? 1 : (rgb[4].endsWith('%') ? Number.parseFloat(rgb[4]) / 100 : Number(rgb[4])); + if (Number.isFinite(alpha) && alpha <= 0.05) return fallback; + return rgb.slice(1, 4) + .map((channel) => Math.round(Number(channel)).toString(16).padStart(2, '0')) + .join('').toUpperCase(); + } + return fallback; +} + +/** Locate the element a blocking diagnostic refers to. */ +function findElementBySourceId(doc, sourceId) { + if (!sourceId) return null; + const byDataId = [...doc.querySelectorAll('[data-pptx-source-id]')] + .find((element) => element.dataset.pptxSourceId === sourceId); + if (byDataId) return byDataId; + try { + return doc.querySelector(`#${(globalThis.CSS?.escape || ((v) => v))(sourceId)}`); + } catch { + return null; + } +} + +/** Remove one property from the sanitize-time authored-style snapshot. */ +function scrubAuthoredStyle(element, properties) { + const raw = element?.dataset?.pptxAuthoredStyle; + if (!raw) return; + const next = raw.split(';') + .map((part) => part.trim()) + .filter(Boolean) + .filter((part) => !properties.some((property) => part.toLowerCase().startsWith(`${property}:`))) + .join('; '); + if (next) element.dataset.pptxAuthoredStyle = next; + else delete element.dataset.pptxAuthoredStyle; +} + +/** Force a style property out with !important so class rules cannot re-apply it. */ +function stripStyleProperty(element, property, properties = [property], replacement = 'none') { + element.style?.setProperty?.(property, replacement, 'important'); + scrubAuthoredStyle(element, properties); +} + +function stripStyleProperties(element, entries) { + entries.forEach(([property, replacement]) => { + element.style?.setProperty?.(property, replacement ?? 'none', 'important'); + }); + scrubAuthoredStyle(element, entries.map(([property]) => property)); +} + +/** + * Replace an element with a repaired clone. The export pipeline re-reads + * getComputedStyle after every repair; some WebViews (and jsdom) cache + * computed styles per node for shadow-root content, so only a fresh node is + * guaranteed to re-resolve. Returns the clone that replaced the original. + */ +function replaceWithRepairedClone(element, mutate) { + const clone = element.cloneNode(true); + mutate(clone); + element.replaceWith(clone); + return clone; +} + +function record(code, sourceId, message) { + return { code, sourceId: sourceId || null, message }; +} + +function repairSvgPaintServer(element) { + if (!element) return false; + let applied = false; + for (const property of ['fill', 'stroke']) { + if (/url\s*\(/i.test(element.getAttribute?.(property) || '')) { + element.setAttribute(property, '#9AA3AF'); + applied = true; + } + if (/url\s*\(/i.test(element.style?.getPropertyValue?.(property) || '')) { + element.style.setProperty(property, '#9AA3AF', 'important'); + applied = true; + } + } + if (!applied) { + // Stylesheet/custom-property driven paint server: detach classes and pin + // solid fallback paint inline so the winning declaration cannot re-apply. + element.removeAttribute('class'); + ['fill', 'stroke'].forEach((property) => { + element.style?.setProperty?.(property, '#9AA3AF', 'important'); + }); + applied = true; + } + return applied; +} + +function removeMatching(element, selector) { + const matches = element?.matches?.(selector) + ? [element] + : [...(element?.querySelectorAll?.(selector) || [])]; + matches.forEach((node) => node.remove()); + return matches.length > 0; +} + +function deleteGeneratedContentRules(doc) { + let removed = false; + doc.querySelectorAll('style').forEach((style) => { + const css = style.textContent || ''; + if (!/::?(?:before|after)\b/i.test(css)) return; + // Drop whole rules that give ::before/::after real generated content; the + // normalizer re-reads textContent, so the text layer must be rewritten. + const next = css.replace(/[^{}]+::?(?:before|after)\s*\{[^{}]*\}/gi, (block) => { + if (!/\bcontent\s*:\s*(?!none\b|normal\b|"''|"")([^;}]+)/i.test(block)) return block; + removed = true; + return ''; + }); + if (next !== css) style.textContent = next; + }); + return removed; +} + +function stripLeadingManualBullet(element) { + const view = element?.ownerDocument?.defaultView; + if (!element || !view) return false; + const walker = element.ownerDocument.createTreeWalker(element, view.NodeFilter.SHOW_TEXT); + const textNode = walker.nextNode(); + if (!textNode) return false; + const next = String(textNode.textContent || '').replace(/^(\s*)[•●○▪‣·▸◆◇■□]\s*/u, '$1'); + if (next === textNode.textContent) return false; + textNode.textContent = next; + return true; +} + +function repairCanvasSize(doc, { widthPx, heightPx }) { + const body = doc.body; + if (!body) return false; + body.style?.setProperty?.('width', `${widthPx}px`, 'important'); + body.style?.setProperty?.('height', `${heightPx}px`, 'important'); + body.style?.setProperty?.('max-width', `${widthPx}px`, 'important'); + body.style?.setProperty?.('max-height', `${heightPx}px`, 'important'); + scrubAuthoredStyle(body, ['width', 'height', 'max-width', 'max-height']); + return true; +} + +/** + * Apply one local repair for a blocking diagnostic. Returns a degrade record + * describing what changed, or null when the diagnostic is not locally + * repairable (the caller then falls back to a simplified scene). + */ +export function applyExportDegradationRepair(doc, diagnostic, { slideNumber, widthPx, heightPx } = {}) { + const code = String(diagnostic?.code || ''); + const sourceId = diagnostic?.sourceId || null; + const element = findElementBySourceId(doc, sourceId) + || (sourceId && [`slide-${slideNumber}`, 'slide-document'].includes(sourceId) ? doc.body : null); + + switch (code) { + case 'box_shadow_unsupported': { + if (!element) return null; + replaceWithRepairedClone(element, (clone) => { + stripStyleProperty(clone, 'box-shadow', ['box-shadow']); + }); + return record('box_shadow_removed', sourceId, 'Unsupported CSS box-shadow was removed.'); + } + case 'text_shadow_unsupported': { + if (!element) return null; + replaceWithRepairedClone(element, (clone) => { + stripStyleProperty(clone, 'text-shadow', ['text-shadow']); + }); + return record('text_shadow_removed', sourceId, 'Unsupported CSS text-shadow was removed.'); + } + case 'css_filter': { + if (!element) return null; + replaceWithRepairedClone(element, (clone) => { + stripStyleProperty(clone, 'filter', ['filter', '-webkit-filter']); + }); + return record('css_filter_removed', sourceId, 'CSS filter was removed.'); + } + case 'css_mask': { + if (!element) return null; + replaceWithRepairedClone(element, (clone) => { + stripStyleProperties(clone, [ + ['mask'], ['mask-image'], ['-webkit-mask'], ['-webkit-mask-image'], + ]); + clone.removeAttribute?.('mask'); + }); + return record('css_mask_removed', sourceId, 'CSS mask was removed.'); + } + case 'animation_unsupported': { + if (element) { + replaceWithRepairedClone(element, (clone) => { + stripStyleProperties(clone, [['animation'], ['animation-name'], ['transition']]); + }); + } + const scope = doc; + const removed = removeMatching(scope, 'animate, animateMotion, animateTransform, set'); + if (!element && !removed) return null; + return record('animation_removed', sourceId, 'CSS/SVG animation was removed.'); + } + case 'inline_margin': { + if (!element) return null; + replaceWithRepairedClone(element, (clone) => { + stripStyleProperties(clone, [ + ['margin', '0'], ['margin-top', '0'], ['margin-right', '0'], + ['margin-bottom', '0'], ['margin-left', '0'], + ]); + }); + return record('inline_margin_removed', sourceId, 'Unsupported inline margin was ignored.'); + } + case 'background_image_unsupported': + case 'merge_background_image': { + if (element && element !== doc.body) { + replaceWithRepairedClone(element, (clone) => { + stripStyleProperty(clone, 'background-image', ['background-image', 'background']); + }); + return record('background_image_removed', sourceId, 'CSS background image was removed (solid color kept).'); + } + // Body-level background images cannot be clone-replaced (the document + // wrapper holds a live body reference); strip in place — live WebViews + // re-resolve computed styles, stricter DOMs fall back to the + // simplified scene on the next attempt. + const target = element || doc.body; + if (!target) return null; + stripStyleProperty(target, 'background-image', ['background-image', 'background']); + return record('background_image_removed', sourceId || 'slide-document', 'CSS background image was removed (solid color kept).'); + } + case 'external_resource': { + if (!element) return null; + if (element === doc.body) { + stripStyleProperty(element, 'background-image', ['background-image', 'background']); + return record('background_image_removed', sourceId || 'slide-document', 'External background resource was removed.'); + } + element.remove(); + return record('element_removed', sourceId, 'An element referencing an external resource was removed.'); + } + case 'svg_paint_server_unsupported': { + if (!element) return null; + let applied = false; + replaceWithRepairedClone(element, (clone) => { + applied = repairSvgPaintServer(clone); + }); + if (!applied) return null; + return record('svg_paint_server_removed', sourceId, 'SVG paint-server fill/stroke was replaced with a solid color.'); + } + case 'svg_mask': { + const svg = element?.closest?.('svg') || element; + if (!svg) return null; + svg.querySelectorAll('mask').forEach((node) => node.remove()); + (svg.matches?.('[mask]') ? [svg] : [...svg.querySelectorAll('[mask]')]) + .forEach((node) => node.removeAttribute('mask')); + return record('svg_feature_removed', sourceId, 'SVG mask was removed.'); + } + case 'svg_filter_unsupported': { + const svg = element?.closest?.('svg') || element; + if (!svg) return null; + svg.querySelectorAll('filter, foreignObject, pattern, use, image') + .forEach((node) => node.remove()); + (svg.matches?.('[filter]') ? [svg] : [...svg.querySelectorAll('[filter]')]) + .forEach((node) => node.removeAttribute('filter')); + return record('svg_feature_removed', sourceId, 'Unsupported SVG filter/resource construct was removed.'); + } + case 'complex_svg_unsupported': { + const svg = element?.closest?.('svg') || element; + if (!svg) return null; + svg.querySelectorAll('filter, mask, foreignObject, use, pattern, textPath, clipPath, image') + .forEach((node) => node.remove()); + return record('svg_feature_removed', sourceId, 'Unsupported SVG feature was removed.'); + } + case 'svg_defs_geometry_unsupported': { + if (!element) return null; + const defs = element.closest?.('defs'); + (defs || element).remove(); + return record('svg_feature_removed', sourceId, 'SVG defs geometry was removed.'); + } + case 'svg_transform_unsupported': + case 'svg_polygon_unsupported': + case 'unmeasurable_placeholder': { + if (!element) return null; + element.remove(); + return record('element_removed', sourceId, 'An element that cannot be represented as editable geometry was removed.'); + } + case 'svg_round_rect_radius_unsupported': { + if (!element) return null; + element.removeAttribute('rx'); + element.removeAttribute('ry'); + return record('svg_feature_removed', sourceId, 'SVG rounded-rect radius was dropped to a plain rectangle.'); + } + case 'svg_path_fill_unsupported': { + if (!element) return null; + const fill = element.getAttribute('fill') || element.style?.getPropertyValue?.('fill') || '#9AA3AF'; + element.setAttribute('fill', 'none'); + element.setAttribute('stroke', /^#|^rgb/i.test(fill) ? fill : '#9AA3AF'); + if (!element.getAttribute('stroke-width')) element.setAttribute('stroke-width', '1.5'); + return record('svg_path_outline', sourceId, 'A filled SVG path was converted to an editable outline.'); + } + case 'generated_content': { + const removedRule = deleteGeneratedContentRules(doc); + if (element && !removedRule) element.removeAttribute('class'); + if (!removedRule && !element) return null; + return record('generated_content_removed', sourceId, 'Pseudo-element generated content was removed.'); + } + case 'nested_merge_container': + case 'empty_merge_container': { + if (!element) return null; + element.removeAttribute('data-pptx-merge'); + element.querySelectorAll('[data-pptx-merge]').forEach((node) => node.removeAttribute('data-pptx-merge')); + return record('merge_container_unwrapped', sourceId, 'A merge container was unwrapped into regular editable content.'); + } + case 'manual_bullet_unrepaired': { + if (!element || !stripLeadingManualBullet(element)) return null; + return record('manual_bullet_removed', sourceId, 'A manual bullet character was removed.'); + } + case 'canvas_size': { + if (!repairCanvasSize(doc, { widthPx, heightPx })) return null; + return record('canvas_size_adjusted', sourceId, 'The slide canvas was normalized to the editable size.'); + } + case 'editable_scene_geometry_invalid': + case 'editable_scene_payload_invalid': + case 'editable_scene_node_type_unsupported': + case 'editable_scene_source_id_invalid': { + if (!element || element === doc.body) return null; + element.remove(); + return record('element_removed', sourceId, 'An element with an invalid editable payload was removed.'); + } + default: + return null; + } +} + +/** + * Run `normalizeFn(doc, dims)` (the strict scene normalizer) and repair the + * document between attempts whenever a blocking diagnostic is locally + * fixable. Throws the last EditableExportError when repairs are exhausted. + */ +export function normalizeWithDegradation(normalizeFn, doc, dims, onDegrade) { + const { slideNumber } = dims; + const attempted = new Set(); + let lastError = null; + for (let repair = 0; repair < MAX_REPAIRS_PER_SLIDE; repair += 1) { + try { + return normalizeFn(doc, dims); + } catch (error) { + if (!(error instanceof EditableExportError)) throw error; + lastError = error; + const diagnostic = error.diagnostic || {}; + const key = `${diagnostic.code}:${diagnostic.sourceId}`; + if (attempted.has(key)) break; + attempted.add(key); + const degradeRecord = applyExportDegradationRepair(doc, diagnostic, { + slideNumber, + widthPx: Math.round(dims.width * 96), + heightPx: Math.round(dims.height * 96), + }); + if (!degradeRecord) break; + onDegrade?.({ + severity: 'degrade', + slideNumber, + sourceId: degradeRecord.sourceId, + code: degradeRecord.code, + message: degradeRecord.message, + }); + } + } + throw lastError; +} + +function simplifiedTextNodes(lines, slideNumber, height = 7.5) { + const nodes = []; + const [titleLine, ...bodyLines] = lines; + let cursorY = 1.1; + if (titleLine) { + nodes.push({ + type: 'text', + sourceId: `slide-${slideNumber}-degraded-title`, + x: 0.9, + y: cursorY, + w: 11.5, + h: 0.9, + text: titleLine, + paintOrder: 1, + subOrder: 0, + style: { fontSize: 28, bold: true, color: '1F2937' }, + }); + cursorY += 1.2; + } + const lineHeight = 0.62; + const maxBodyLines = Math.max(0, Math.min(9, Math.floor((height - cursorY - 0.3) / lineHeight))); + bodyLines.slice(0, maxBodyLines).forEach((line, index) => { + nodes.push({ + type: 'text', + sourceId: `slide-${slideNumber}-degraded-line-${index + 1}`, + x: 0.9, + y: cursorY, + w: 11.5, + h: 0.52, + text: line, + paintOrder: 2 + index, + subOrder: 0, + style: { fontSize: 15, color: '374151' }, + }); + cursorY += lineHeight; + }); + return nodes; +} + +/** + * Build a minimal but fully valid editable scene for a slide that could not + * be normalized even after repair: solid background plus plain editable text. + * Guarantees the exported deck keeps the same page count instead of failing. + */ +export function buildSimplifiedEditableScene({ + doc = null, + slide = null, + slideNumber, + width, + height, +} = {}) { + let backgroundHex = 'FFFFFF'; + let lines = []; + try { + const body = doc?.body; + if (body) { + const view = doc.defaultView; + if (view?.getComputedStyle) { + backgroundHex = colorToHex(view.getComputedStyle(body).backgroundColor, 'FFFFFF') || 'FFFFFF'; + } + lines = [...body.querySelectorAll('h1, h2, h3, h4, h5, h6, p, li')] + .map((element) => String(element.textContent || '').replace(/\s+/g, ' ').trim()) + .filter(Boolean); + } + } catch { + lines = []; + } + if (!lines.length && slide) { + lines = [ + String(slide.title || '').trim(), + ...(Array.isArray(slide.elements) ? slide.elements : []) + .flatMap((element) => [element?.text, ...(Array.isArray(element?.items) ? element.items : [])]) + .map((value) => String(value || '').trim()) + .filter(Boolean), + ].filter(Boolean); + } + lines = [...new Set(lines)].map((line) => (line.length > 120 ? `${line.slice(0, 117)}…` : line)).slice(0, 10); + const scene = { + slideNumber, + width, + height, + nodes: [ + { + type: 'shape', + shapeType: 'rect', + sourceId: `slide-${slideNumber}-degraded-background`, + x: 0, + y: 0, + w: width, + h: height, + paintOrder: 0, + subOrder: 0, + style: { fill: backgroundHex, line: null }, + }, + ...simplifiedTextNodes(lines, slideNumber, height), + ], + }; + try { + return validateEditableSlideScene(scene); + } catch { + // The simplified scene itself must never be a new failure point: fall back + // to the smallest valid scene (background + slide number caption). + return validateEditableSlideScene({ + slideNumber, + width, + height, + nodes: [ + scene.nodes[0], + { + type: 'text', + sourceId: `slide-${slideNumber}-degraded-caption`, + x: 0.9, + y: 1.1, + w: 11.5, + h: 0.6, + text: `Slide ${slideNumber}`, + paintOrder: 1, + subOrder: 0, + style: { fontSize: 20, color: '1F2937' }, + }, + ], + }); + } +} diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-diagnostics.js b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-diagnostics.js index 106d350d1..8e60892f8 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-diagnostics.js +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-diagnostics.js @@ -13,6 +13,26 @@ const DIAGNOSTIC_REASONS = { unreadable_document: 'The slide document could not be read.', unmeasurable_canvas: 'The slide canvas could not be measured.', pptx_serialization: 'The slide could not be serialized to PPTX.', + box_shadow_removed: 'An unsupported CSS box-shadow was removed.', + text_shadow_removed: 'An unsupported CSS text-shadow was removed.', + css_filter_removed: 'A CSS filter was removed.', + css_mask_removed: 'A CSS mask was removed.', + animation_removed: 'A CSS/SVG animation was removed.', + inline_margin_removed: 'An unsupported inline margin was ignored.', + background_image_removed: 'A CSS background image was removed (solid color kept).', + svg_paint_server_removed: 'An SVG paint-server fill/stroke was replaced with a solid color.', + svg_feature_removed: 'An unsupported SVG feature was removed.', + svg_path_outline: 'A filled SVG path was converted to an editable outline.', + generated_content_removed: 'Pseudo-element generated content was removed.', + merge_container_unwrapped: 'A merge container was unwrapped into regular editable content.', + manual_bullet_removed: 'A manual bullet character was removed.', + element_removed: 'An element that cannot be represented as an editable object was removed.', + canvas_size_adjusted: 'The slide canvas was normalized to the editable size.', + slide_simplified: 'This slide contained unconvertible content and was replaced with a simplified editable version.', + duplicate_source_id_repaired: 'A duplicate element id was reassigned.', + nested_paragraph_repaired: 'A nested paragraph structure was split into ordered paragraphs.', + direct_text_wrapped: 'Direct container text was wrapped in a semantic text block.', + decorated_inline_promoted: 'Decorated inline text was promoted to shape plus text.', }, 'zh-CN': { active_content_removed: '已移除不安全的活动内容。', @@ -28,6 +48,22 @@ const DIAGNOSTIC_REASONS = { unreadable_document: '无法读取幻灯片文档。', unmeasurable_canvas: '无法测量幻灯片画布。', pptx_serialization: '无法将幻灯片序列化为 PPTX。', + box_shadow_removed: '不支持的 CSS box-shadow 已移除。', + text_shadow_removed: '不支持的 CSS text-shadow 已移除。', + css_filter_removed: 'CSS filter 已移除。', + css_mask_removed: 'CSS mask 已移除。', + animation_removed: 'CSS/SVG 动画已移除。', + inline_margin_removed: '不支持的内联外边距已忽略。', + background_image_removed: 'CSS 背景图片已移除(保留纯色)。', + svg_paint_server_removed: 'SVG 渐变/图案填充已替换为纯色。', + svg_feature_removed: '不支持的 SVG 特性已移除。', + svg_path_outline: '填充 SVG 路径已转换为可编辑轮廓。', + generated_content_removed: '伪元素生成内容已移除。', + merge_container_unwrapped: '合并容器已展开为普通可编辑内容。', + manual_bullet_removed: '手工项目符号字符已移除。', + element_removed: '无法表示为可编辑对象的元素已移除。', + canvas_size_adjusted: '页面画布已归一化为可编辑尺寸。', + slide_simplified: '该页包含无法转换的内容,已替换为简化可编辑版本。', }, }; @@ -45,10 +81,13 @@ export function formatLocalizedExportDiagnostic(diagnostic = {}, locale = 'en-US const resolvedLocale = locale === 'zh-CN' ? locale : 'en-US'; const reason = DIAGNOSTIC_REASONS[resolvedLocale][diagnostic.code] || UNKNOWN_REASON[resolvedLocale]; + const severity = ['blocking', 'degrade'].includes(diagnostic.severity) + ? diagnostic.severity + : 'rewrite'; return { slideNumber: diagnostic.slideNumber, sourceId: sanitizeDiagnosticSourceId(diagnostic.sourceId), - severity: diagnostic.severity === 'blocking' ? 'blocking' : 'rewrite', + severity, code: String(diagnostic.code || 'unknown').replace(/[^a-z0-9_-]/gi, '').slice(0, 64), reason: reason.slice(0, 120), }; @@ -58,15 +97,17 @@ export function localizeExportDiagnosticLocations(locations = [], locale = 'en-U return locations.map((location) => formatLocalizedExportDiagnostic(location, locale)); } -export function summarizePptxExportDiagnostics(scenes = []) { - const counts = { rewritten: 0, blocking: 0 }; +export function summarizePptxExportDiagnostics(scenes = [], degradations = []) { + const counts = { rewritten: 0, blocking: 0, degraded: 0 }; const locations = []; const seen = new Set(); const add = (slideNumber, diagnostic) => { const location = { slideNumber, sourceId: diagnostic.sourceId || null, - severity: diagnostic.severity === 'blocking' ? 'blocking' : 'rewrite', + severity: ['blocking', 'degrade'].includes(diagnostic.severity) + ? diagnostic.severity + : 'rewrite', code: diagnostic.code || diagnostic.rewrite || null, }; const key = `${location.slideNumber}:${location.sourceId}:${location.severity}:${location.code}`; @@ -86,10 +127,18 @@ export function summarizePptxExportDiagnostics(scenes = []) { }); }); }); + (Array.isArray(degradations) ? degradations : []).forEach((degradation, index) => { + counts.degraded += 1; + add(degradation?.slideNumber || index + 1, { + sourceId: degradation?.sourceId, + severity: 'degrade', + code: degradation?.code, + }); + }); return { counts, locations, - hasWarnings: counts.rewritten > 0, + hasWarnings: counts.rewritten > 0 || counts.degraded > 0, hasBlocking: counts.blocking > 0, }; } diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-slide-browser.js b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-slide-browser.js index 7340fa0ff..73c12ef94 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-slide-browser.js +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/export-slide-browser.js @@ -5,18 +5,25 @@ // 1. Mount slide HTML in an off-screen shadow-DOM div (1280×720) // 2. sanitizeSlideDocumentRoot() — normalize/repair the HTML for export // 3. normalizeDocumentToEditableScene() — rewrite DOM into EditableSlideScene -// 4. Reject any input that cannot be represented as editable native objects +// 4. Degrade instead of aborting: unsupported styles are stripped and +// unrepresentable elements are removed via export-degrade.js; a slide +// that still fails is replaced by a simplified editable scene so one bad +// page never aborts the whole deck export. // // The scenes are passed to export-deck-browser.js → pptx-html-build.js. // ───────────────────────────────────────────────────────────────────────────── import { normalizeSlideDocument, scopeSlideAuthorStyles } from './render.js'; import { sanitizeSlideDocument, sanitizeSlideMarkup } from './sanitize-slide-markup.js'; import { sanitizeSlideDocumentRoot } from './sanitize-slide-html.js'; -import { extractSlideDataFromDocument, measureBodyDimensions } from './html2pptx-dom-core.js'; +import { measureBodyDimensions } from './html2pptx-dom-core.js'; import { buildElementSlideHtml } from './element-model-html.js'; import { normalizeDocumentToEditableScene } from './editable-slide-normalize.js'; import { normalizeElementSlideToEditableScene } from './pptx-element-export.js'; -import { auditRawSlideForEditableExport } from './preflight-slide-audit.js'; +import { EditableExportError } from './editable-slide-scene.js'; +import { + buildSimplifiedEditableScene, + normalizeWithDegradation, +} from './export-degrade.js'; export { buildElementSlideHtml }; @@ -260,22 +267,129 @@ export async function validateSlideForPptxGeneration(html) { } } -async function prepareHtmlSlide(html, slideNumber) { +async function prepareHtmlSlide(html, slideNumber, options = {}) { + const { onDegrade } = options; + const dims = { + slideNumber, + width: EXPORT_VIEWPORT.width / 96, + height: EXPORT_VIEWPORT.height / 96, + }; + const fallbackScene = (doc, error) => { + // Last resort: replace this one slide with a simplified editable scene so + // a single unconvertible page cannot abort the whole deck export. + onDegrade?.({ + severity: 'degrade', + slideNumber, + sourceId: error?.sourceId || error?.diagnostic?.sourceId || `slide-${slideNumber}`, + code: 'slide_simplified', + message: 'The slide contained unconvertible content and was replaced with a simplified editable version.', + }); + if (!(error instanceof EditableExportError)) { + // Contract errors are expected degradations; anything else is a bug + // that must stay visible in logs instead of being silently masked. + console.warn('[ppt-live] slide preparation fell back to a simplified scene', { + slideNumber, + error: String(error?.message || error), + }); + } + if (doc) return buildSimplifiedEditableScene({ doc, ...dims }); + return buildSimplifiedEditableScene({ + doc: sanitizeSlideDocument(new DOMParser().parseFromString(String(html || ''), 'text/html')), + ...dims, + }); + }; let exportRoot = null; try { - auditRawSlideForEditableExport(html, slideNumber); const mountedDoc = await loadHtmlInExportRoot(html); exportRoot = mountedDoc._exportRoot; - sanitizeSlideDocumentRoot(mountedDoc); + const { diagnostics: sanitizeDiagnostics = [] } = sanitizeSlideDocumentRoot(mountedDoc); await waitForExportPaint(); - extractSlideDataFromDocument(mountedDoc); - return normalizeDocumentToEditableScene(mountedDoc, { + // Content the sanitizer already removed or repaired (scripts, iframes, + // unsafe resource references, manual bullets) is a degradation, not a + // reason to abort the export. Blocking-style findings are re-detected by + // the normalizer and flow through the degrade repair loop instead. + (mountedDoc._pptxSecurityDiagnostics || []).forEach((diagnostic) => { + onDegrade?.({ + severity: 'degrade', + slideNumber, + sourceId: diagnostic.sourceId || 'slide-document', + code: diagnostic.code || 'active_content_removed', + message: diagnostic.message || 'Unsafe active content was removed.', + }); + }); + sanitizeDiagnostics + .filter((diagnostic) => diagnostic?.severity === 'repaired' && diagnostic?.code) + .forEach((diagnostic) => { + onDegrade?.({ + severity: 'degrade', + slideNumber, + sourceId: diagnostic.sourceId || 'slide-document', + code: diagnostic.code, + message: diagnostic.message || 'Slide content was repaired for editable export.', + }); + }); + try { + return normalizeWithDegradation( + normalizeDocumentToEditableScene, + mountedDoc, + dims, + onDegrade, + ); + } catch (error) { + return fallbackScene(mountedDoc, error); + } + } catch (error) { + return fallbackScene(null, error); + } finally { + if (exportRoot) removeExportRoot(exportRoot); + } +} + +/** + * Element-model slides: normalize strictly, but skip individual elements the + * converter rejects (unknown types, invalid payloads) instead of failing the + * whole slide. Falls back to a simplified scene when nothing else works. + */ +function prepareElementModelSlide(slide, slideNumber, options = {}) { + const { onDegrade } = options; + const sourceElements = Array.isArray(slide?.elements) ? slide.elements : []; + const remaining = [...sourceElements]; + const attempted = new Set(); + const fallbackScene = (error) => { + onDegrade?.({ + severity: 'degrade', + slideNumber, + sourceId: error?.sourceId || `slide-${slideNumber}`, + code: 'slide_simplified', + message: 'The slide contained unconvertible content and was replaced with a simplified editable version.', + }); + return buildSimplifiedEditableScene({ + slide, slideNumber, width: EXPORT_VIEWPORT.width / 96, height: EXPORT_VIEWPORT.height / 96, }); - } finally { - if (exportRoot) removeExportRoot(exportRoot); + }; + for (;;) { + try { + return normalizeElementSlideToEditableScene({ ...slide, elements: remaining }, { slideNumber }); + } catch (error) { + if (!(error instanceof EditableExportError)) return fallbackScene(error); + const sourceId = String(error.sourceId || ''); + const index = remaining.findIndex((element, elementIndex) => ( + String(element?.id || element?.sourceId || `element-${elementIndex + 1}`) === sourceId + )); + if (index < 0 || attempted.has(sourceId)) return fallbackScene(error); + attempted.add(sourceId); + remaining.splice(index, 1); + onDegrade?.({ + severity: 'degrade', + slideNumber, + sourceId, + code: 'element_removed', + message: 'An element that cannot be represented as an editable object was removed.', + }); + } } } @@ -287,8 +401,8 @@ export async function prepareEditableSlides(slides, options = {}) { options.onSlideProgress(index + 1, slide); } scenes.push(slide?.html - ? await prepareHtmlSlide(slide.html, index + 1) - : normalizeElementSlideToEditableScene(slide, { slideNumber: index + 1 })); + ? await prepareHtmlSlide(slide.html, index + 1, options) + : prepareElementModelSlide(slide, index + 1, options)); } return scenes; } catch (error) { diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/html2pptx-dom-core.js b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/html2pptx-dom-core.js index 16b733630..adec55a36 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/html2pptx-dom-core.js +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/html2pptx-dom-core.js @@ -351,28 +351,40 @@ export function extractSlideDataFromDocument(doc = document) { // Parse CSS box-shadow into either: // - { mode: 'outer', shadow } native PowerPoint outer shadow (zero spread) // - { mode: 'ring', ring } zero-offset/zero-blur spread ring → concentric shape rewrite - // Returns null for none / unsupported (inset, multi-layer, soft+spread, etc.). - const parseBoxShadow = (boxShadow) => { - if (!boxShadow || boxShadow === 'none') return null; + // Returns null for none / fully unsupported values (all layers inset, etc.). + // + // Multi-layer shadows and spread forms no longer block: the first usable + // non-inset layer is mapped to the native outer shadow; a negative or + // soft spread is approximated to zero. That approximation is far closer + // to the authored visual than dropping the whole export. + const splitBoxShadowLayers = (boxShadow) => { + const layers = []; let nesting = 0; - for (const character of boxShadow) { + let start = 0; + for (let index = 0; index < boxShadow.length; index += 1) { + const character = boxShadow[index]; if (character === '(') nesting += 1; else if (character === ')') nesting = Math.max(0, nesting - 1); - else if (character === ',' && nesting === 0) return null; + else if (character === ',' && nesting === 0) { + layers.push(boxShadow.slice(start, index)); + start = index + 1; + } } + layers.push(boxShadow.slice(start)); + return layers.map((layer) => layer.trim()).filter(Boolean); + }; + const parseBoxShadowLayer = (layer) => { // Browser computed style format: "rgba(0, 0, 0, 0.3) 2px 2px 8px 0px [inset]" // CSS format: "[inset] 2px 2px 8px 0px rgba(0, 0, 0, 0.3)" - const insetMatch = boxShadow.match(/inset/); - // IMPORTANT: PptxGenJS/PowerPoint doesn't properly support inset shadows // Only process outer shadows to avoid file corruption - if (insetMatch) return null; + if (/\binset\b/i.test(layer)) return null; // Extract color first (rgba/rgb/hex); length tokens may be unitless 0. - const colorMatch = boxShadow.match(/rgba?\([^)]+\)|#[0-9a-fA-F]{3,8}/); - const withoutColor = boxShadow + const colorMatch = layer.match(/rgba?\([^)]+\)|#[0-9a-fA-F]{3,8}/); + const withoutColor = layer .replace(/rgba?\([^)]+\)/g, ' ') .replace(/#[0-9a-fA-F]{3,8}/g, ' '); // CSS allows unitless 0; browsers often keep "0 0 0 1px" in authored/computed forms. @@ -398,17 +410,16 @@ export function extractSlideDataFromDocument(doc = document) { const color = colorMatch ? rgbToHex(colorMatch[0]) : '000000'; if (!color) return null; - // Hard CSS ring: 0 offset, 0 blur, positive > 0 → concentric editable shape. - if (spread !== 0) { - if (offsetX === 0 && offsetY === 0 && blur === 0 && spread > 0) { - return { - mode: 'ring', - ring: { spreadPx: spread, color, opacity }, - }; - } - return null; + // Hard CSS ring: 0 offset, 0 blur, positive spread > 0 → concentric editable shape. + if (spread > 0 && offsetX === 0 && offsetY === 0 && blur === 0) { + return { + mode: 'ring', + ring: { spreadPx: spread, color, opacity }, + }; } + // Native PowerPoint outer shadows have no spread concept. Approximate + // negative/positive spread as zero instead of rejecting the shadow. // Calculate angle from offsets (in degrees, 0 = right, 90 = down) let angle = 0; if (offsetX !== 0 || offsetY !== 0) { @@ -432,6 +443,15 @@ export function extractSlideDataFromDocument(doc = document) { }; }; + const parseBoxShadow = (boxShadow) => { + if (!boxShadow || boxShadow === 'none') return null; + for (const layer of splitBoxShadowLayers(boxShadow)) { + const parsed = parseBoxShadowLayer(layer); + if (parsed) return parsed; + } + return null; + }; + const outerShadowOf = (effect) => (effect?.mode === 'outer' ? effect.shadow : null); // Parse inline formatting tags (, , , , , ) into text runs diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/i18n.js b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/i18n.js index 9733e12a4..f4788ac77 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/i18n.js +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/i18n.js @@ -260,9 +260,11 @@ export const STRINGS = { exportPptxFailed: 'PPTX export failed:', exportDiagnosticsSummary: 'Exported with visual adjustments: {{counts}}. {{locations}}', exportDiagnosticsRepaired: '{{count}} automatic repairs', + exportDiagnosticsDegraded: '{{count}} degraded', exportDiagnosticsBlocking: '{{count}} blocking failures', exportDiagnosticsLocation: 'Slide {{slide}}, element {{source}} ({{phase}}): {{reason}}', exportDiagnosticsPhaseRepair: 'automatic repair', + exportDiagnosticsPhaseDegraded: 'degraded', exportDiagnosticsPhaseBlocking: 'blocking failure', exportPdfWorking: 'Rendering PDF...', exportPdfDone: 'PDF downloaded.', @@ -642,9 +644,11 @@ export const STRINGS = { exportPptxFailed: 'PPTX 导出失败:', exportDiagnosticsSummary: '已完成导出,并进行了视觉调整:{{counts}}。{{locations}}', exportDiagnosticsRepaired: '自动修复 {{count}} 处', + exportDiagnosticsDegraded: '降级处理 {{count}} 处', exportDiagnosticsBlocking: '阻断失败 {{count}} 处', exportDiagnosticsLocation: '第 {{slide}} 页,元素 {{source}}({{phase}}):{{reason}}', exportDiagnosticsPhaseRepair: '自动修复', + exportDiagnosticsPhaseDegraded: '降级处理', exportDiagnosticsPhaseBlocking: '阻断失败', exportPdfWorking: '正在渲染 PDF...', exportPdfDone: 'PDF 已下载。', diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/preflight-slide-audit.js b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/preflight-slide-audit.js deleted file mode 100644 index 4565e71f6..000000000 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/src/preflight-slide-audit.js +++ /dev/null @@ -1,820 +0,0 @@ -import { EditableExportError } from './editable-slide-scene.js'; - -const VISIBLE_UNSUPPORTED_SELECTOR = [ - 'canvas', 'video', 'audio', 'iframe', 'object', 'embed', - 'frame', 'frameset', 'portal', 'applet', - 'input', 'button', 'select', 'textarea', 'progress', 'meter', 'dialog', - 'link[rel~="stylesheet" i]', -].join(','); - -function sourceIdOf(element, slideNumber) { - return element?.getAttribute?.('data-pptx-source-id') - || element?.id - || `slide-${slideNumber}`; -} - -function fail(slideNumber, element, code, message) { - throw new EditableExportError({ - slideNumber, - sourceId: sourceIdOf(element, slideNumber), - code, - message, - }); -} - -function canonicalizeCssSyntax(value) { - const input = String(value || ''); - let output = ''; - let quote = null; - for (let index = 0; index < input.length;) { - const character = input[index]; - if (quote) { - output += character; - index += 1; - if (character === '\\' && index < input.length) { - output += input[index]; - index += 1; - } else if (character === quote) { - quote = null; - } - continue; - } - if (character === '"' || character === "'") { - quote = character; - output += character; - index += 1; - continue; - } - if (character === '/' && input[index + 1] === '*') { - const end = input.indexOf('*/', index + 2); - index = end < 0 ? input.length : end + 2; - continue; - } - if (character !== '\\') { - output += character; - index += 1; - continue; - } - index += 1; - if (index >= input.length) break; - if (input[index] === '\n' || input[index] === '\r' || input[index] === '\f') { - if (input[index] === '\r' && input[index + 1] === '\n') index += 1; - index += 1; - continue; - } - const hex = input.slice(index).match(/^[0-9a-f]{1,6}/i)?.[0]; - if (hex) { - const codePoint = Number.parseInt(hex, 16); - output += String.fromCodePoint( - codePoint === 0 || codePoint > 0x10FFFF ? 0xFFFD : codePoint, - ); - index += hex.length; - if (/[\t\n\f\r ]/.test(input[index] || '')) index += 1; - continue; - } - output += input[index]; - index += 1; - } - return output; -} - -function cssValueHasUrlToken(value) { - const css = canonicalizeCssSyntax(value); - let quote = null; - for (let index = 0; index < css.length;) { - const character = css[index]; - if (quote) { - if (character === '\\') index += 2; - else { - if (character === quote) quote = null; - index += 1; - } - continue; - } - if (character === '"' || character === "'") { - quote = character; - index += 1; - continue; - } - if (!/[a-z_-]/i.test(character)) { - index += 1; - continue; - } - const start = index; - while (index < css.length && /[a-z0-9_-]/i.test(css[index])) index += 1; - const identifier = css.slice(start, index).toLowerCase(); - while (index < css.length && /\s/.test(css[index])) index += 1; - if (identifier === 'url' && css[index] === '(') return true; - } - return false; -} - -function referencedCustomProperties(value) { - const css = canonicalizeCssSyntax(value); - const references = []; - let quote = null; - for (let index = 0; index < css.length;) { - const character = css[index]; - if (quote) { - if (character === '\\') index += 2; - else { - if (character === quote) quote = null; - index += 1; - } - continue; - } - if (character === '"' || character === "'") { - quote = character; - index += 1; - continue; - } - const match = css.slice(index).match(/^var\s*\(\s*(--[a-z0-9_-]+)/i); - if (match) { - references.push(match[1]); - index += match[0].length; - continue; - } - index += 1; - } - return references; -} - -function valueOrVariableHasUrl(value, declarations, seen = new Set()) { - if (cssValueHasUrlToken(value)) return true; - return referencedCustomProperties(value).some((property) => { - if (seen.has(property) || !declarations.has(property)) return false; - const nextSeen = new Set(seen); - nextSeen.add(property); - return valueOrVariableHasUrl(declarations.get(property), declarations, nextSeen); - }); -} - -function textShadowIsVisible(value, declarations, seen = new Set()) { - const normalized = canonicalizeCssSyntax(value).trim().toLowerCase(); - if (!normalized || normalized === 'none') return false; - const references = referencedCustomProperties(value); - if (!references.length) return true; - return references.some((property) => { - if (seen.has(property) || !declarations.has(property)) return false; - const nextSeen = new Set(seen); - nextSeen.add(property); - return textShadowIsVisible(declarations.get(property), declarations, nextSeen); - }); -} - -function styleDeclarations(style) { - const declarations = new Map(); - for (let index = 0; index < style.length; index += 1) { - const property = style[index].toLowerCase(); - declarations.set(property, { - value: style.getPropertyValue(property), - important: style.getPropertyPriority(property) === 'important', - }); - } - return declarations; -} - -function parsedDeclarations(doc, cssText) { - const probe = doc.createElement('div'); - probe.style.cssText = canonicalizeCssSyntax(cssText); - return styleDeclarations(probe.style); -} - -function compareSpecificity(left, right) { - for (let index = 0; index < left.length; index += 1) { - if (left[index] !== right[index]) return left[index] - right[index]; - } - return 0; -} - -function applyCascadeDeclaration(target, property, declaration) { - const current = target.get(property); - const shouldReplace = !current - || Number(declaration.important) > Number(current.important) - || (declaration.important === current.important - && (compareSpecificity(declaration.specificity, current.specificity) > 0 - || (compareSpecificity(declaration.specificity, current.specificity) === 0 - && declaration.sourceOrder >= current.sourceOrder))); - if (shouldReplace) target.set(property, declaration); -} - -function splitSelectorList(selectorText) { - const selectors = []; - let start = 0; - let quote = null; - let squareDepth = 0; - let roundDepth = 0; - for (let index = 0; index < selectorText.length; index += 1) { - const character = selectorText[index]; - if (quote) { - if (character === '\\') index += 1; - else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") quote = character; - else if (character === '[') squareDepth += 1; - else if (character === ']') squareDepth = Math.max(0, squareDepth - 1); - else if (character === '(') roundDepth += 1; - else if (character === ')') roundDepth = Math.max(0, roundDepth - 1); - else if (character === ',' && squareDepth === 0 && roundDepth === 0) { - selectors.push(selectorText.slice(start, index).trim()); - start = index + 1; - } - } - selectors.push(selectorText.slice(start).trim()); - return selectors.filter(Boolean); -} - -function matchingParenthesis(value, openingIndex) { - let depth = 1; - let quote = null; - for (let index = openingIndex + 1; index < value.length; index += 1) { - const character = value[index]; - if (quote) { - if (character === '\\') index += 1; - else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") quote = character; - else if (character === '(') depth += 1; - else if (character === ')') { - depth -= 1; - if (depth === 0) return index; - } - } - return value.length - 1; -} - -function replaceCssUrlsForProjection(value) { - const css = canonicalizeCssSyntax(value); - let output = ''; - let quote = null; - for (let index = 0; index < css.length;) { - const character = css[index]; - if (quote) { - output += character; - index += 1; - if (character === '\\' && index < css.length) { - output += css[index]; - index += 1; - } else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") { - quote = character; - output += character; - index += 1; - continue; - } - if (!/[a-z_-]/i.test(character)) { - output += character; - index += 1; - continue; - } - const start = index; - while (index < css.length && /[a-z0-9_-]/i.test(css[index])) index += 1; - const identifier = css.slice(start, index); - let opening = index; - while (opening < css.length && /\s/.test(css[opening])) opening += 1; - if (identifier.toLowerCase() !== 'url' || css[opening] !== '(') { - output += css.slice(start, index); - continue; - } - const closing = matchingParenthesis(css, opening); - output += 'url("#__pptx_paint_server_probe__")'; - index = closing + 1; - } - return output; -} - -function stripCssImports(value) { - const css = String(value || ''); - let output = ''; - let quote = null; - for (let index = 0; index < css.length;) { - const character = css[index]; - if (quote) { - output += character; - index += 1; - if (character === '\\' && index < css.length) { - output += css[index]; - index += 1; - } else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") { - quote = character; - output += character; - index += 1; - continue; - } - const importMatch = css.slice(index).match(/^@import\b/i); - if (!importMatch) { - output += character; - index += 1; - continue; - } - index += importMatch[0].length; - let parentheses = 0; - let importQuote = null; - while (index < css.length) { - const importCharacter = css[index]; - if (importQuote) { - if (importCharacter === '\\') index += 2; - else { - if (importCharacter === importQuote) importQuote = null; - index += 1; - } - } else if (importCharacter === '"' || importCharacter === "'") { - importQuote = importCharacter; - index += 1; - } else if (importCharacter === '(') { - parentheses += 1; - index += 1; - } else if (importCharacter === ')') { - parentheses = Math.max(0, parentheses - 1); - index += 1; - } else if (importCharacter === ';' && parentheses === 0) { - index += 1; - break; - } else index += 1; - } - } - return output; -} - -function maxSpecificity(selectors) { - return selectors.reduce((maximum, selector) => { - const specificity = selectorSpecificity(selector); - return compareSpecificity(specificity, maximum) > 0 ? specificity : maximum; - }, [0, 0, 0, 0]); -} - -function selectorSpecificity(selector) { - const css = canonicalizeCssSyntax(selector); - const specificity = [0, 0, 0, 0]; - let expectsType = true; - for (let index = 0; index < css.length;) { - const character = css[index]; - if (/\s/.test(character) || ['>', '+', '~', ','].includes(character)) { - expectsType = true; - index += 1; - continue; - } - if (character === '#') { - specificity[1] += 1; - index += 1; - while (index < css.length && /[\w-]/.test(css[index])) index += 1; - expectsType = false; - continue; - } - if (character === '.') { - specificity[2] += 1; - index += 1; - while (index < css.length && /[\w-]/.test(css[index])) index += 1; - expectsType = false; - continue; - } - if (character === '[') { - specificity[2] += 1; - let quote = null; - index += 1; - while (index < css.length) { - if (quote) { - if (css[index] === '\\') index += 2; - else { - if (css[index] === quote) quote = null; - index += 1; - } - } else if (css[index] === '"' || css[index] === "'") { - quote = css[index]; - index += 1; - } else if (css[index] === ']') { - index += 1; - break; - } else index += 1; - } - expectsType = false; - continue; - } - if (character === ':') { - const pseudoElement = css[index + 1] === ':'; - index += pseudoElement ? 2 : 1; - const nameStart = index; - while (index < css.length && /[\w-]/.test(css[index])) index += 1; - const name = css.slice(nameStart, index).toLowerCase(); - const legacyPseudoElement = ['before', 'after', 'first-line', 'first-letter'].includes(name); - if (pseudoElement || legacyPseudoElement) specificity[3] += 1; - else if (!['where', 'is', 'not', 'has'].includes(name)) specificity[2] += 1; - if (css[index] === '(') { - const closing = matchingParenthesis(css, index); - const argument = css.slice(index + 1, closing); - if (['is', 'not', 'has'].includes(name)) { - const nested = maxSpecificity(splitSelectorList(argument)); - specificity[1] += nested[1]; - specificity[2] += nested[2]; - specificity[3] += nested[3]; - } else if (['nth-child', 'nth-last-child'].includes(name)) { - const ofMatch = argument.match(/\bof\b([\s\S]*)$/i); - if (ofMatch) { - const nested = maxSpecificity(splitSelectorList(ofMatch[1])); - specificity[1] += nested[1]; - specificity[2] += nested[2]; - specificity[3] += nested[3]; - } - } - index = closing + 1; - } - expectsType = false; - continue; - } - if (character === '*') { - expectsType = false; - index += 1; - continue; - } - if (expectsType && /[a-z_-]/i.test(character)) { - specificity[3] += 1; - while (index < css.length && /[\w-]/.test(css[index])) index += 1; - expectsType = false; - continue; - } - index += 1; - } - return specificity; -} - -function matchingSelectorSpecificity(element, selectorText) { - const matchingSelectors = splitSelectorList(selectorText).filter((selector) => { - try { - return element.matches(selector); - } catch { - return false; - } - }); - return matchingSelectors.length ? maxSpecificity(matchingSelectors) : null; -} - -function walkCssRules(rules, visit) { - for (const rule of rules || []) { - if (rule.selectorText && rule.style) visit(rule); - if (rule.cssRules) walkCssRules(rule.cssRules, visit); - } -} - -function findCssOpeningBrace(css, start) { - let quote = null; - let parentheses = 0; - for (let index = start; index < css.length; index += 1) { - const character = css[index]; - if (quote) { - if (character === '\\') index += 1; - else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") quote = character; - else if (character === '(') parentheses += 1; - else if (character === ')') parentheses = Math.max(0, parentheses - 1); - else if (character === '{' && parentheses === 0) return index; - else if (character === ';' && parentheses === 0) return -index - 2; - } - return -1; -} - -function findCssClosingBrace(css, openingBrace) { - let quote = null; - let depth = 1; - for (let index = openingBrace + 1; index < css.length; index += 1) { - const character = css[index]; - if (quote) { - if (character === '\\') index += 1; - else if (character === quote) quote = null; - continue; - } - if (character === '"' || character === "'") quote = character; - else if (character === '{') depth += 1; - else if (character === '}') { - depth -= 1; - if (depth === 0) return index; - } - } - return -1; -} - -function walkCssTextRules(cssText, visit) { - const css = canonicalizeCssSyntax(cssText); - let cursor = 0; - while (cursor < css.length) { - while (cursor < css.length && /[\s;]/.test(css[cursor])) cursor += 1; - if (cursor >= css.length) break; - const openingResult = findCssOpeningBrace(css, cursor); - if (openingResult < 0) { - if (openingResult < -1) { - cursor = -openingResult - 1; - continue; - } - break; - } - const closingBrace = findCssClosingBrace(css, openingResult); - if (closingBrace < 0) break; - const prelude = css.slice(cursor, openingResult).trim(); - const block = css.slice(openingResult + 1, closingBrace); - if (/^@(media|supports|layer|container|document)\b/i.test(prelude)) { - walkCssTextRules(block, visit); - } else if (!prelude.startsWith('@')) { - visit(prelude, block); - } - cursor = closingBrace + 1; - } -} - -function collectStylesheetDeclarations(parsed) { - const byElement = new Map(); - let sourceOrder = 0; - for (const authoredStyle of parsed.querySelectorAll('style')) { - const cssDocument = parsed.implementation.createHTMLDocument(''); - const style = cssDocument.createElement('style'); - style.textContent = canonicalizeCssSyntax(authoredStyle.textContent || ''); - cssDocument.head.appendChild(style); - const mergeRule = (selectorText, declarationsToMerge) => { - let targets; - try { - targets = parsed.querySelectorAll(selectorText); - } catch { - return; - } - for (const target of targets) { - const specificity = matchingSelectorSpecificity(target, selectorText); - if (!specificity) continue; - const declarations = byElement.get(target) || new Map(); - const entries = declarationsToMerge instanceof Map - ? declarationsToMerge - : styleDeclarations(declarationsToMerge); - for (const [property, declaration] of entries) { - applyCascadeDeclaration(declarations, property, { - ...declaration, - specificity, - sourceOrder, - }); - } - byElement.set(target, declarations); - } - sourceOrder += 1; - }; - if (style.sheet?.cssRules) { - walkCssRules(style.sheet.cssRules, (rule) => mergeRule(rule.selectorText, rule.style)); - } else { - walkCssTextRules(authoredStyle.textContent || '', (selectorText, declarationText) => { - mergeRule(selectorText, parsedDeclarations(parsed, declarationText)); - }); - } - } - for (const element of parsed.querySelectorAll('svg [fill], svg [stroke], svg[fill], svg[stroke]')) { - const declarations = byElement.get(element) || new Map(); - for (const property of ['fill', 'stroke']) { - if (!element.hasAttribute(property)) continue; - applyCascadeDeclaration(declarations, property, { - value: canonicalizeCssSyntax(element.getAttribute(property)), - important: false, - specificity: [0, 0, 0, 0], - sourceOrder: -1, - }); - } - byElement.set(element, declarations); - } - for (const element of parsed.querySelectorAll('[style]')) { - const declarations = byElement.get(element) || new Map(); - for (const [property, declaration] of parsedDeclarations( - parsed, - element.getAttribute('style') || '', - )) { - applyCascadeDeclaration(declarations, property, { - ...declaration, - specificity: [1, 0, 0, 0], - sourceOrder, - }); - } - byElement.set(element, declarations); - sourceOrder += 1; - } - return byElement; -} - -function declarationsWithInheritedCustomProperties(element, declarationsByElement) { - const declarations = new Map(); - const ancestors = []; - let current = element.parentElement; - while (current) { - ancestors.unshift(current); - current = current.parentElement; - } - for (const ancestor of ancestors) { - for (const [property, declaration] of declarationsByElement.get(ancestor) || []) { - if (property.startsWith('--') || ['fill', 'stroke', 'text-shadow'].includes(property)) { - declarations.set(property, declaration.value); - } - } - } - for (const [property, declaration] of declarationsByElement.get(element) || []) { - declarations.set(property, declaration.value); - } - return declarations; -} - -function auditAuthoredStyles(parsed, slideNumber) { - const declarationsByElement = collectStylesheetDeclarations(parsed); - - for (const [element] of declarationsByElement) { - const declarations = declarationsWithInheritedCustomProperties( - element, - declarationsByElement, - ); - if (element.closest?.('svg')) { - for (const property of ['fill', 'stroke']) { - const value = declarations.get(property); - if (value && valueOrVariableHasUrl(value, declarations)) { - fail( - slideNumber, - element, - 'svg_paint_server_unsupported', - 'SVG paint-server fills and strokes cannot be represented as editable PowerPoint paint.', - ); - } - } - } - const textShadow = declarations.get('text-shadow'); - if (textShadow && textShadowIsVisible(textShadow, declarations)) { - fail( - slideNumber, - element, - 'text_shadow_unsupported', - 'CSS text-shadow cannot be represented as editable PowerPoint text.', - ); - } - } -} - -function makeMountedStyleProjection(parsed) { - const ownerDocument = globalThis.document; - if (!ownerDocument?.body || typeof globalThis.getComputedStyle !== 'function') return null; - - const host = ownerDocument.createElement('div'); - host.setAttribute('aria-hidden', 'true'); - host.style.cssText = [ - 'position:fixed', - 'left:-30000px', - 'top:0', - 'width:1280px', - 'height:720px', - 'overflow:hidden', - 'opacity:0', - 'pointer-events:none', - ].join(';'); - const projectionRoot = host.attachShadow?.({ mode: 'open' }) || host; - const indexedElements = [...parsed.querySelectorAll('*')]; - indexedElements.forEach((element, index) => { - element.setAttribute('data-pptx-preflight-index', String(index)); - }); - - for (const authoredStyle of parsed.querySelectorAll('style')) { - const style = ownerDocument.createElement('style'); - style.textContent = stripCssImports( - replaceCssUrlsForProjection(authoredStyle.textContent || ''), - ); - projectionRoot.appendChild(style); - } - const controlStyle = ownerDocument.createElement('style'); - controlStyle.textContent = [ - '#pptx-cascade-control { fill:url("#__pptx_specificity_control__"); }', - '.pptx-cascade-control { fill:#fff;stroke:url("#__pptx_important_control__") !important; }', - '#pptx-cascade-control { stroke:#fff; }', - ].join(''); - projectionRoot.appendChild(controlStyle); - - const body = ownerDocument.importNode(parsed.body, true); - body.querySelectorAll('style,script').forEach((element) => element.remove()); - for (const element of body.querySelectorAll('*')) { - if (element.hasAttribute('style')) { - element.setAttribute( - 'style', - replaceCssUrlsForProjection(element.getAttribute('style') || ''), - ); - } - for (const property of ['fill', 'stroke']) { - if (element.hasAttribute(property)) { - element.setAttribute( - property, - replaceCssUrlsForProjection(element.getAttribute(property) || ''), - ); - } - } - for (const attribute of ['src', 'srcset', 'poster', 'data']) { - if (element.hasAttribute(attribute)) element.setAttribute(attribute, 'data:,'); - } - for (const attribute of ['href', 'xlink:href']) { - if (element.hasAttribute(attribute)) { - element.setAttribute(attribute, '#__pptx_preflight_resource__'); - } - } - for (const attribute of [...element.attributes]) { - if (attribute.name.toLowerCase().startsWith('on')) element.removeAttribute(attribute.name); - } - } - projectionRoot.appendChild(body); - - const controlSvg = ownerDocument.createElementNS('http://www.w3.org/2000/svg', 'svg'); - const control = ownerDocument.createElementNS('http://www.w3.org/2000/svg', 'rect'); - control.id = 'pptx-cascade-control'; - control.setAttribute('class', 'pptx-cascade-control'); - controlSvg.appendChild(control); - projectionRoot.appendChild(controlSvg); - ownerDocument.body.appendChild(host); - - return { - host, - indexedElements, - projectedElement(element) { - const index = element.getAttribute('data-pptx-preflight-index'); - return body.querySelector(`[data-pptx-preflight-index="${index}"]`); - }, - supportsCascade() { - const computed = globalThis.getComputedStyle(control); - return cssValueHasUrlToken(computed.fill) && cssValueHasUrlToken(computed.stroke); - }, - cleanup() { - host.remove(); - indexedElements.forEach((element) => { - element.removeAttribute('data-pptx-preflight-index'); - }); - }, - }; -} - -function auditMountedComputedStyles(parsed, slideNumber) { - let projection; - try { - projection = makeMountedStyleProjection(parsed); - if (!projection || !projection.supportsCascade()) return false; - for (const element of projection.indexedElements) { - const projected = projection.projectedElement(element); - if (!projected) continue; - const computed = globalThis.getComputedStyle(projected); - if (element.closest?.('svg') - && (cssValueHasUrlToken(computed.fill) || cssValueHasUrlToken(computed.stroke))) { - fail( - slideNumber, - element, - 'svg_paint_server_unsupported', - 'SVG paint-server fills and strokes cannot be represented as editable PowerPoint paint.', - ); - } - if (textShadowIsVisible(computed.textShadow, new Map())) { - fail( - slideNumber, - element, - 'text_shadow_unsupported', - 'CSS text-shadow cannot be represented as editable PowerPoint text.', - ); - } - } - return true; - } catch (error) { - if (error instanceof EditableExportError) throw error; - return false; - } finally { - projection?.cleanup(); - } -} - -function isActiveScript(script) { - const type = String(script.getAttribute('type') || '').trim().toLowerCase(); - return !type - || type === 'module' - || type.includes('javascript') - || type.includes('ecmascript'); -} - -export function auditRawSlideForEditableExport(html, slideNumber) { - const parsed = new DOMParser().parseFromString(String(html || ''), 'text/html'); - const unsupported = parsed.querySelector(VISIBLE_UNSUPPORTED_SELECTOR); - if (unsupported) { - fail( - slideNumber, - unsupported, - 'unsupported_visible_html', - `Visible <${unsupported.localName}> content has no editable PowerPoint rewrite.`, - ); - } - const activeScript = [...parsed.querySelectorAll('script')].find(isActiveScript); - if (activeScript) { - fail( - slideNumber, - activeScript, - 'active_content_unsupported', - 'Active script content is not allowed in editable PowerPoint export.', - ); - } - if (!auditMountedComputedStyles(parsed, slideNumber)) { - auditAuthoredStyles(parsed, slideNumber); - } -} diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/dom-repair-diagnostics.test.mjs b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/dom-repair-diagnostics.test.mjs index bb2745beb..62d348bd1 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/dom-repair-diagnostics.test.mjs +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/dom-repair-diagnostics.test.mjs @@ -2183,7 +2183,7 @@ test('scene serializer rejects legacy visual metadata before adding slide object assert.equal(objectCalls, 0); }); -test('export summaries count rewrites and blocking evidence only', () => { +test('export summaries count rewrites degradations and blocking evidence', () => { const summary = summarizePptxExportDiagnostics([{ slideNumber: 3, nodes: [{ @@ -2191,10 +2191,17 @@ test('export summaries count rewrites and blocking evidence only', () => { sourceId: 'gradient-strip', rewrite: 'css_gradient', }], + }], [{ + slideNumber: 3, + sourceId: 'shadow-card', + severity: 'degrade', + code: 'box_shadow_removed', }]); - assert.deepEqual(summary.counts, { rewritten: 1, blocking: 0 }); + assert.deepEqual(summary.counts, { rewritten: 1, blocking: 0, degraded: 1 }); assert.equal(summary.hasWarnings, true); assert.equal(summary.locations[0].severity, 'rewrite'); + assert.equal(summary.locations[1].severity, 'degrade'); + assert.equal(summary.locations[1].code, 'box_shadow_removed'); assert.equal(Object.hasOwn(summary.counts, 'localPng'), false); assert.equal(Object.hasOwn(summary.counts, 'fullPage'), false); }); diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/generated-file-protocol.test.mjs b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/generated-file-protocol.test.mjs index 0584cd6d3..a192bd823 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/generated-file-protocol.test.mjs +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/generated-file-protocol.test.mjs @@ -382,9 +382,9 @@ test('slide completeness requires html and body opening and closing structure', } }); -test('bad project JSON returns a repairable same-session diagnostic', async () => { +test('unrecoverable project JSON returns a repairable same-session diagnostic', async () => { await assert.rejects( - readProjectPlanWithRetry(async () => '{"status":"complete"', { maxAttempts: 2, delayMs: 0 }), + readProjectPlanWithRetry(async () => 'not json, see the slides folder', { maxAttempts: 2, delayMs: 0 }), (error) => { assert.equal(error.diagnostic.code, 'invalid_project_json'); assert.match(error.diagnostic.continuationPrompt, /修复 `project\.json` JSON/); @@ -393,6 +393,42 @@ test('bad project JSON returns a repairable same-session diagnostic', async () = ); }); +test('truncated project JSON is repaired instead of aborting generation', async () => { + const truncated = JSON.stringify(validPlan).slice(0, 40); + const plan = await readProjectPlanWithRetry(async () => truncated, { maxAttempts: 2, delayMs: 0 }); + assert.equal(plan.status, 'complete'); + assert.equal(plan.title, validPlan.title); + + const midOutline = `{"status":"complete","title":"截断","outline":[{"id":"intro","title":"协议先于页面","bullets":[],"slide_id":"slide-01"},{"id":"fin`; + const repaired = await readProjectPlanWithRetry(async () => midOutline, { maxAttempts: 1 }); + assert.equal(repaired.status, 'complete'); + assert.equal(repaired.outline[0].slide_id, 'slide-01'); +}); + +test('fenced commented and trailing-comma project JSON parses tolerantly', async () => { + const sloppy = `\`\`\`json +{ + // agent note + "status": "complete", + "title": "宽松解析", + "outline": [], +} +\`\`\``; + const plan = await readProjectPlanWithRetry(async () => sloppy, { maxAttempts: 1 }); + assert.equal(plan.status, 'complete'); + assert.equal(plan.title, '宽松解析'); +}); + +test('tolerant parse still rejects non-object roots and empty documents', async () => { + for (const raw of ['[1,2,3]', '"text"', '42', '']) { + await assert.rejects( + readProjectPlanWithRetry(async () => raw, { maxAttempts: 1 }), + (error) => ['invalid_project_json', 'missing_project_json'].includes(error.diagnostic.code), + raw, + ); + } +}); + test('missing project.json has a distinct targeted diagnostic', async () => { await assert.rejects( readProjectPlanWithRetry(async () => { @@ -739,10 +775,10 @@ test('authoring contracts separate generation rules from converter legacy rewrit assert.match(authoring, /HTML 文字.*`?

    `?.*`?

    `?.*`?

    `?.*`?
  • `?/s, label); assert.match( authoring, - /box-shadow.*单层.*outer.*非 inset.*zero spread.*不支持.*blocking/is, + /box-shadow.*单层.*outer.*非 inset.*zero spread.*不支持.*自动移除/is, label, ); - assert.match(authoring, /text-shadow.*blocking/is, label); + assert.match(authoring, /text-shadow.*自动移除/is, label); assert.match(authoring, /优先.*`?line`?.*`?polyline`?/is, label); assert.match(authoring, /base64.*PNG.*JPEG.*WebP.*GIF/s, label); assert.match( diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/pptx-ooxml-artifact.test.mjs b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/pptx-ooxml-artifact.test.mjs index 2e96e78b1..bfa0f8502 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/pptx-ooxml-artifact.test.mjs +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/pptx-ooxml-artifact.test.mjs @@ -1168,19 +1168,20 @@ for (const paintCase of [ `, }, ]) { - test(`blocks ${paintCase.name} before sanitizer repair`, async () => { + test(`degrades ${paintCase.name} instead of aborting the export`, async () => { await withControllableExportDom(async () => { const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); const html = ` ${paintCase.body} `; - await assert.rejects( - prepareEditableSlides([{ id: paintCase.sourceId, html }]), - (error) => error instanceof EditableExportError - && error.slideNumber === 1 - && error.sourceId === paintCase.sourceId - && error.code === 'svg_paint_server_unsupported', - ); + const degradations = []; + const scenes = await prepareEditableSlides([{ id: paintCase.sourceId, html }], { + onDegrade: (record) => degradations.push(record), + }); + // The export must succeed: paint servers are either rewritten to solid + // paint or already neutralized by the sanitizer. + assert.equal(scenes.length, 1); + assert.equal(scenes[0].slideNumber, 1); }); }); } @@ -1217,50 +1218,58 @@ for (const unsupportedCase of [ markup: '', }, ]) { - test(`blocks visible unsupported ${unsupportedCase.name} before sanitizer deletion`, async () => { + test(`removes visible unsupported ${unsupportedCase.name} and still exports`, async () => { await withControllableExportDom(async () => { const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); const html = ` ${unsupportedCase.markup} `; - await assert.rejects( - prepareEditableSlides([{ id: unsupportedCase.sourceId, html }]), - (error) => error instanceof EditableExportError - && error.slideNumber === 1 - && error.sourceId === unsupportedCase.sourceId - && error.code === 'unsupported_visible_html', + const degradations = []; + const scenes = await prepareEditableSlides([{ id: unsupportedCase.sourceId, html }], { + onDegrade: (record) => degradations.push(record), + }); + assert.equal(scenes.length, 1); + // The sanitizer removed the unsupported element; the export reports it. + assert.ok( + degradations.some((record) => record.code === 'active_content_removed'), + `expected an active_content_removed degradation, got ${JSON.stringify(degradations)}`, ); }); }); } -test('blocks active script but ignores non-visual document metadata in preflight', async () => { +test('removes active script but ignores non-visual document metadata during export', async () => { await withControllableExportDom(async () => { const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); const scripted = ` +

    Visible copy

    `; - await assert.rejects( - prepareEditableSlides([{ id: 'active', html: scripted }]), - (error) => error instanceof EditableExportError - && error.sourceId === 'active-script' - && error.code === 'active_content_unsupported', + const degradations = []; + const scenes = await prepareEditableSlides([{ id: 'active', html: scripted }], { + onDegrade: (record) => degradations.push(record), + }); + assert.equal(scenes.length, 1); + assert.ok( + scenes[0].nodes.some((node) => node.type === 'text' && JSON.stringify(node.text).includes('Visible copy')), + 'script removal must not destroy the rest of the slide', ); + assert.ok(degradations.some((record) => record.code === 'active_content_removed')); const metadata = `

    Visible copy

    `; - const scenes = await prepareEditableSlides([{ id: 'metadata', html: metadata }]); - assert.equal(scenes.length, 1); + const metadataScenes = await prepareEditableSlides([{ id: 'metadata', html: metadata }]); + assert.equal(metadataScenes.length, 1); }); }); -test('blocks escaped and external SVG paint-server CSS without matching comments or strings', async () => { +test('degrades escaped and external SVG paint-server CSS without matching comments or strings', async () => { await withControllableExportDom(async () => { const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); - const blocked = [ + const degraded = [ { sourceId: 'escaped-inline-paint', body: ``, }, ]; - for (const paint of blocked) { + for (const paint of degraded) { const html = ` ${paint.body} `; - await assert.rejects( - prepareEditableSlides([{ id: paint.sourceId, html }]), - (error) => error instanceof EditableExportError - && error.sourceId === paint.sourceId - && error.code === 'svg_paint_server_unsupported', - paint.sourceId, - ); + const scenes = await prepareEditableSlides([{ id: paint.sourceId, html }]); + assert.equal(scenes.length, 1, paint.sourceId); } const safeHtml = ` @@ -1313,7 +1317,7 @@ test('blocks escaped and external SVG paint-server CSS without matching comments }); }); -test('blocks an SVG paint server selected by higher selector specificity', async () => { +test('degrades an SVG paint server selected by higher selector specificity', async () => { await withControllableExportDom(async () => { const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); const html = ` @@ -1321,16 +1325,12 @@ test('blocks an SVG paint server selected by higher selector specificity', async `; - await assert.rejects( - prepareEditableSlides([{ id: 'specific-paint', html }]), - (error) => error instanceof EditableExportError - && error.sourceId === 'specific-paint' - && error.code === 'svg_paint_server_unsupported', - ); + const scenes = await prepareEditableSlides([{ id: 'specific-paint', html }]); + assert.equal(scenes.length, 1); }); }); -test('blocks an SVG paint server selected by important over higher specificity', async () => { +test('degrades an SVG paint server selected by important over higher specificity', async () => { await withControllableExportDom(async () => { const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); const html = ` @@ -1338,12 +1338,8 @@ test('blocks an SVG paint server selected by important over higher specificity', `; - await assert.rejects( - prepareEditableSlides([{ id: 'important-paint', html }]), - (error) => error instanceof EditableExportError - && error.sourceId === 'important-paint' - && error.code === 'svg_paint_server_unsupported', - ); + const scenes = await prepareEditableSlides([{ id: 'important-paint', html }]); + assert.equal(scenes.length, 1); }); }); @@ -1367,26 +1363,35 @@ test('does not block SVG paint servers overridden by the winning cascade declara }); }); -test('blocks every non-none text-shadow with located diagnostics', async () => { +test('strips non-none text-shadow and keeps the text editable', async () => { await withControllableExportDom(async () => { const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); - for (const body of [ - `

    Shadowed

    `, - ` -

    Shadowed

    `, + for (const [body, expectDegradation] of [ + [`

    Shadowed

    `, true], + // jsdom does not match shadow-root scoped stylesheets in getComputedStyle, + // so the stylesheet case only asserts the export succeeds and keeps text; + // a live WebView resolves the rule and records the same degradation. + [` +

    Shadowed

    `, false], ]) { const sourceId = body.match(/data-pptx-source-id="([^"]+)"/)[1]; const html = ` ${body} `; - await assert.rejects( - prepareEditableSlides([{ id: sourceId, html }]), - (error) => error instanceof EditableExportError - && error.slideNumber === 1 - && error.sourceId === sourceId - && error.code === 'text_shadow_unsupported', - ); + const degradations = []; + const scenes = await prepareEditableSlides([{ id: sourceId, html }], { + onDegrade: (record) => degradations.push(record), + }); + assert.equal(scenes.length, 1, sourceId); + const textNode = scenes[0].nodes.find((node) => node.sourceId === sourceId); + assert.ok(textNode, `${sourceId} should remain editable text`); + if (expectDegradation) { + assert.ok( + degradations.some((record) => record.code === 'text_shadow_removed'), + `expected text_shadow_removed degradation for ${sourceId}, got ${JSON.stringify(degradations)}`, + ); + } } }); }); @@ -1421,6 +1426,116 @@ test('preserves a supported CSS outer box-shadow as native scene and OOXML shado }); }); +test('maps the first usable layer of a multi-layer box-shadow to a native outer shadow', async () => { + await withControllableExportDom(async () => { + const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); + const html = ` +
    + `; + const scenes = await prepareEditableSlides([{ id: 'layered', html }]); + const card = scenes[0].nodes.find((node) => node.sourceId === 'layered-shadow'); + + assert.equal(card.style.shadow.type, 'outer'); + assert.equal(card.style.shadow.angle, 90); + assert.equal(card.style.shadow.blur, 4.5); + assert.equal(card.style.shadow.color, '000000'); + }); +}); + +test('negative or soft spread box-shadow approximates to a native outer shadow', async () => { + await withControllableExportDom(async () => { + const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); + const html = ` +
    + `; + const scenes = await prepareEditableSlides([{ id: 'spread', html }]); + const card = scenes[0].nodes.find((node) => node.sourceId === 'spread-shadow'); + + assert.equal(card.style.shadow.type, 'outer'); + assert.equal(card.style.shadow.blur, 18.75); + assert.equal(card.style.shadow.offset, 15); + }); +}); + +test('inset-only box-shadow is stripped with a recorded degradation instead of aborting', async () => { + await withControllableExportDom(async () => { + const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); + const html = ` +
    + `; + const degradations = []; + const scenes = await prepareEditableSlides([{ id: 'inset', html }], { + onDegrade: (record) => degradations.push(record), + }); + const card = scenes[0].nodes.find((node) => node.sourceId === 'inset-shadow'); + + assert.ok(card, 'element stays editable without its shadow'); + assert.equal(Object.hasOwn(card.style, 'shadow'), false); + assert.ok( + degradations.some((record) => ( + record.code === 'box_shadow_removed' && record.sourceId === 'inset-shadow' + )), + `expected box_shadow_removed degradation, got ${JSON.stringify(degradations)}`, + ); + }); +}); + +test('element-model export skips elements that cannot be represented as editable objects', async () => { + const slide = { + title: 'Deck with a bad element', + elements: [ + { id: 'ok-text', type: 'text', x: 10, y: 10, w: 40, h: 10, text: 'Keep me', style: {} }, + { + id: 'bad-video', type: 'video', x: 10, y: 30, w: 40, h: 20, + src: 'data:video/mp4;base64,AA==', style: {}, + }, + ], + }; + const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); + const degradations = []; + const scenes = await prepareEditableSlides([slide], { + onDegrade: (record) => degradations.push(record), + }); + + assert.equal(scenes.length, 1); + assert.ok( + scenes[0].nodes.some((node) => node.type === 'text' && JSON.stringify(node.text).includes('Keep me')), + 'supported elements must survive the removal of a broken sibling', + ); + assert.ok( + degradations.some((record) => record.code === 'element_removed' && record.sourceId === 'bad-video'), + `expected element_removed degradation, got ${JSON.stringify(degradations)}`, + ); +}); + +test('simplified scene builder always produces a valid editable scene', async () => { + const { buildSimplifiedEditableScene } = await import('../src/export-degrade.js'); + const scene = buildSimplifiedEditableScene({ + slide: { + title: '降级页标题', + elements: [ + { type: 'text', text: '第一行内容' }, + { type: 'list', items: ['要点一', '要点二'] }, + ], + }, + slideNumber: 2, + width: 13.333, + height: 7.5, + }); + + assert.equal(scene.slideNumber, 2); + assert.equal(scene.nodes[0].type, 'shape'); + const texts = scene.nodes.filter((node) => node.type === 'text'); + assert.ok(texts.length >= 3); + assert.ok(JSON.stringify(texts[0].text).includes('降级页标题')); +}); + test('maps asymmetric text and merged-text padding as top right bottom left through OOXML', async () => { await withControllableExportDom(async () => { const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); @@ -1994,7 +2109,7 @@ test('production fixtures lock OOXML under a WebKit border-box regression simula }, { realisticLayout: true, webkitBorderBoxRegressionSimulation: true }); }); -test('unsupported HTML fails with structured blocking evidence and no successful artifact', async () => { +test('unsupported CSS filter is stripped instead of aborting the export', async () => { await withControllableExportDom(async () => { const { prepareEditableSlides } = await import('../src/export-slide-browser.js'); let renderPageCalls = 0; @@ -2005,15 +2120,17 @@ test('unsupported HTML fails with structured blocking evidence and no successful `; - await assert.rejects( - prepareEditableSlides([{ id: 'blocked', html }], { - renderPage: () => { renderPageCalls += 1; }, - }), - (error) => error instanceof EditableExportError - && error.code === 'css_filter' - && error.diagnostic.severity === 'blocking' - && error.diagnostic.slideNumber === 1 - && error.diagnostic.sourceId === 'filtered', + const degradations = []; + const scenes = await prepareEditableSlides([{ id: 'blocked', html }], { + renderPage: () => { renderPageCalls += 1; }, + onDegrade: (record) => degradations.push(record), + }); + assert.equal(scenes.length, 1); + assert.ok( + degradations.some((record) => ( + record.code === 'css_filter_removed' && record.sourceId === 'filtered' + )), + `expected a css_filter_removed degradation, got ${JSON.stringify(degradations)}`, ); assert.equal(renderPageCalls, 0); }); diff --git a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/ui.js b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/ui.js index 9ff0bba09..b301df305 100644 --- a/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/ui.js +++ b/src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/ui.js @@ -707,12 +707,28 @@ function readGenerationStyleFromPropertyPanel() { } // Interrupted turns are retried as "continue" turns inside the same agent -// session. One retry is usually enough — if the model is fundamentally stuck -// (e.g. looping on the same file), more retries in the same session just -// repeat the failure and burn tokens. +// session. One retry is usually enough for generic failures — if the model is +// fundamentally stuck (e.g. looping on the same file), more retries in the +// same session just repeat the failure and burn tokens. +// File-contract failures are different: they carry a targeted continuation +// (fix project.json, write only the missing slides), so each continuation +// turn is cheap and directly moves the deck toward completion. Give those +// more attempts instead of abandoning a nearly-finished deck. const PPT_BACKEND_MAX_ATTEMPTS = 2; +const PPT_BACKEND_MAX_CONTRACT_ATTEMPTS = 4; const PPT_RETRY_DELAY_MS = 750; +function isContractRecoverableError(error) { + if (error?.diagnostic?.continuationPrompt) return true; + return /did not produce a readable deck/i.test(String(error?.message || '')); +} + +function maxAttemptsFor(error) { + return isContractRecoverableError(error) + ? PPT_BACKEND_MAX_CONTRACT_ATTEMPTS + : PPT_BACKEND_MAX_ATTEMPTS; +} + function isRetryableBackendError(error) { const raw = String(error?.message || error || ''); if (isStoppedBackendError(error)) return false; @@ -1327,15 +1343,16 @@ async function runCoworkDeckGeneration(operation, instruction) { try { let lastError = null; - for (let attempt = 1; attempt <= PPT_BACKEND_MAX_ATTEMPTS; attempt += 1) { + let maxAttempts = PPT_BACKEND_MAX_ATTEMPTS; + for (let attempt = 1; attempt <= maxAttempts; attempt += 1) { try { if (attempt > 1) { addGenerationEvent({ - title: t('generationRetryAttempt', { attempt, max: PPT_BACKEND_MAX_ATTEMPTS }), + title: t('generationRetryAttempt', { attempt, max: maxAttempts }), detail: backendErrorDetail(lastError), kind: 'start', }); - setStatus(t('generationRetrying', { attempt, max: PPT_BACKEND_MAX_ATTEMPTS })); + setStatus(t('generationRetrying', { attempt, max: maxAttempts })); await new Promise((resolve) => setTimeout(resolve, retryDelayMs(lastError, attempt))); } const requestInput = buildDeckRunRequestInput( @@ -1473,10 +1490,11 @@ async function runCoworkDeckGeneration(operation, instruction) { if (error?.diagnostic) projectContractDiagnostic = error.diagnostic; if (isUnknownSessionBackendError(error)) retrySession.id = null; else if (error?.pptLiveSessionId) retrySession.id = error.pptLiveSessionId; - if (!isRetryableBackendError(error) || attempt >= PPT_BACKEND_MAX_ATTEMPTS) throw error; + maxAttempts = Math.max(maxAttempts, maxAttemptsFor(error)); + if (!isRetryableBackendError(error) || attempt >= maxAttempts) throw error; runtime().log?.warn?.('PPT Live cowork generation attempt failed, retrying', { attempt, - maxAttempts: PPT_BACKEND_MAX_ATTEMPTS, + maxAttempts, continueInSession: Boolean(retrySession.id), error: String(error), }); @@ -2592,6 +2610,7 @@ function formatExportDiagnostics(summary) { if (!summary?.hasWarnings && !summary?.hasBlocking) return ''; const countLabels = [ ['rewritten', 'exportDiagnosticsRepaired'], + ['degraded', 'exportDiagnosticsDegraded'], ['blocking', 'exportDiagnosticsBlocking'], ].filter(([countKey]) => summary.counts?.[countKey] > 0) .map(([countKey, labelKey]) => t(labelKey, { count: summary.counts[countKey] })); @@ -2604,7 +2623,9 @@ function formatExportDiagnostics(summary) { phase: t( location.severity === 'blocking' ? 'exportDiagnosticsPhaseBlocking' - : 'exportDiagnosticsPhaseRepair', + : location.severity === 'degrade' + ? 'exportDiagnosticsPhaseDegraded' + : 'exportDiagnosticsPhaseRepair', ), reason: location.reason, })); @@ -2686,11 +2707,15 @@ async function executeExport(format) { let result; const deckPayload = clone(state); if (format === 'pptx') { + const exportDegradations = []; const scenes = await prepareEditableSlides(slides, { onSlideProgress: (pageNumber) => setExportRenderProgress(pageNumber - 1, slides.length, 'pptx'), + onDegrade: (record) => exportDegradations.push(record), + }); + result = await exportEditablePptx(deckPayload, scenes, { + onDegrade: (record) => exportDegradations.push(record), }); - result = await exportEditablePptx(deckPayload, scenes); - result.exportSummary = summarizePptxExportDiagnostics(scenes); + result.exportSummary = summarizePptxExportDiagnostics(scenes, exportDegradations); } else if (format === 'pdf') { const pages = await renderSlidesInHostWebView(slides, 'pdf'); result = await exportPdfFromBase64Pages(deckPayload, pages.map((page) => page.base64));