@web-ppt/fonts 0.8.0 → 0.9.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,50 +1,58 @@
1
1
  # 更新日志
2
2
 
3
- 本文件记录对使用者可见的变化。版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
3
+ 本文件记录对使用者可见的变化。版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。发布过程的验证证据(npm 发布、安装验收、体积口径、真机验收状态)记录在 [docs/releases/](docs/releases/)。
4
4
 
5
- ## 0.8.0 - 2026-11-06
5
+ ## 未发布
6
6
 
7
- 0.8.0 稳定版:`0.8.0-beta.3` 的全部内容转正到 `latest`,包括 Agent 命令工具面、本机 MCP server 与 Agent Skill(`@web-ppt/agent-mcp` 首个稳定版)、模板填充 `@web-ppt/edit-core/fill`、编辑器 WebMCP 与 Agent 配对评测工具。相对 0.6.0 的逐项变化见下方 `0.8.0-beta.1` 至 `0.8.0-beta.3` 条目。本版另含:
7
+ - 包之间的 peer 依赖改为精确版本(例如 `@web-ppt/editor@0.8.1` 要求 `@web-ppt/core@0.8.1`):九个包必须同版本,混装时 npm 在安装阶段报告冲突,不再到运行时才出错。
8
+ - 修复发布声明文件的 3 处相对导入(`@web-ppt/core` 的 `pptx/geometry`、`@web-ppt/edit-core` 的 `templates` 与 `lint`)被 TypeScript 解析到无类型的 JS 产物:`CreateBlankPptxOptions`、`PresentationDescription` 等类型在宿主侧不再退化为 `any`,关闭 `skipLibCheck` 时也不再报 TS7016。
9
+ - 全部包声明 `engines.node >= 22`。Node 20 已于 2026-04-30 停止维护,CI 改为在 Node 22 与 24 上验证;浏览器端用法不受影响。
10
+ - 构建工具由 Vite 5.4 升级到 Vite 8.3:打包改用 Rolldown,转译与压缩改用 Oxc。公开 API、入口文件名和 `exports` 指向的路径均不变,发布产物的字节随之变化:
11
+ - 默认入口及其相对静态分块的 gzip 体积:core 138.01 → 135.69KB、edit-core 186.67 → 172.93KB、editor 59.56 → 57.35KB、collab 12.20 → 11.35KB、viewer-core 14.09 → 11.18KB、fonts 3.44 → 2.87KB、agent-mcp 3.10 → 3.05KB、vue 1.34 → 1.31KB、react 1.12 → 1.17KB。
12
+ - 按需入口大多减小;`@web-ppt/core/geometry/handles` 增加 4.4%(20.44 → 21.33KB),原因是保留空白的库产物中数组改为逐行排版。
13
+ - 共享分块重新拆分:`@web-ppt/core/geometry` 入口变为转发文件,实现在与默认入口共用的共享分块中;edit-core 共享分块的文件名随之改变。分块文件名不属于公开接口,请始终通过 `exports` 子路径导入。
14
+ - 产物格式:`@__PURE__` 标注与 JSDoc 注释保留,普通注释删除;缩进改为制表符,模块边界处增加源文件路径注释(如 `// src/geometry/guides.ts`)。
15
+ - 在仓库内开发需要 Node 22.12+(Vite 8 的要求);发布包的运行环境要求不变。
8
16
 
9
- - 新增导入安全上限:`parse()` 在解压前检查 EOCD、中央目录、条目名称、声明大小与压缩比,解压时再核对实际输出;默认上限为 4096 个条目、单条目 128 MiB、总量 512 MiB、压缩比 1000,可通过 `zip` 选项逐项覆盖,`parseInWorker` 使用同一配置。核心解析、Worker、保存原包、OLE 与内嵌工作簿共用这套边界;重复名称、路径穿越、伪造大小和超限输入抛出 `ZipSafetyError`(`reason` 为稳定的 `zip-*` 代码),ZIP64 以 `zip64-unsupported` 明确拒绝。
10
- - 修复保存产物的 OOXML 结构:图表数据编辑与图表设计把轴标题写到 `numFmt` 之后(schema 规定标题在数字格式之前);非折线 / 散点图系列残留 `c:smooth`;生成式文字的字符与段落属性(`ln`、填充、字体、项目符号尺寸等)按 schema 顺序写入。
11
- - 修复形状悬停超链接的保存:目标页删除后悬空引用未清理;给仅有悬停链接的形状新增点击链接时,`hlinkClick` 误写到 `hlinkHover` 之后(cNvPr 的 schema 顺序要求其在前)。
17
+ ## 0.9.0-beta.1 - 2026-11-12
12
18
 
13
- 破坏性变更核对:无 API 撤除;超出默认 ZIP 上限或结构异常的输入改为抛出 `ZipSafetyError`,需要更大文件时通过 `zip` 选项放宽。
19
+ 九包发布到 npm `next`,开启 0.9 线。本版交付导出字体子集化与替代字体内联([设计与实测](docs/design/export-font-subset.md)):
14
20
 
15
- 安装:无版本号安装即得 0.8.0,九包必须同版本;`@next` 标签留给 0.9 线。原计划随 0.8.0 交付的新建图表与图表细节渲染(桌面 002 / 003)顺延到 0.9.0。
21
+ - 新增导出字体选项 `fonts`(PNG / 独立 SVG / 打印 / 图片 ZIP):`subsetter` 按导出范围字符集精确子集化嵌入字体,导出范围没有用量的家族整脸剔除;子集失败按稳定 reason(`subset-failed` / `unused-family` / `subsetter-error`,经 `onFontFallback` 观察)回退整字体内联,回退结果不劣于旧行为。不传该选项时导出产物逐字节不变。打印整稿使用并集字符集,同一字体跨页共享一份 data URI。
22
+ - `EmbeddedFont` 增加可选 `unicodeRange` / `sizeAdjust`,导出 SVG 的 `@font-face` 按声明输出。
23
+ - `@web-ppt/fonts` 新增可选入口 `@web-ppt/fonts/subset`:`createHarfBuzzSubsetter(wasm)` 把宿主提供的 harfbuzzjs `harfbuzz-subset.wasm` 转成 core 的 `FontSubsetter`,包内不携带 wasm 与字体字节,输出确定性字节(同输入两次一致,变量字体钉默认轴);默认入口新增 `exportFontFaces(usages)`,把替代字体命中的 fontsource 切片转成 data URI 的 `EmbeddedFont[]`(含 `unicode-range` 与等线西文实测 `size-adjust`),独立 SVG 在未安装该字体的机器上不再回退系统字体。
24
+ - 官网与查看器的导出入口显式开启;引擎不可用时降级整字体内联,不阻断导出。
25
+ - 实测(12.2KB 中文固件字体):子集 2.5KB,单页导出 SVG 16.9KB → 3.9KB;子集开 / 关两次导出 PNG 光栅字节一致。
16
26
 
17
- `@web-ppt/collab` 发布入口为 12.20KB gzip;排除 peer 的完整测试薄包为 14,333B gzip,两种口径分别核对。
27
+ 破坏性变更核对:无 API 撤除;`fonts` 选项缺省行为不变。
18
28
 
19
- Windows PowerPoint 真机验收继续延后,未记为通过;0.8.0 先行转正,四项自动门禁、OOXML 合法性门禁(ECMA-376 XSD 与 Open XML SDK 双通道)与 LibreOffice 外部打开清单全部通过。
29
+ `@web-ppt/collab` 发布入口为 12.20KB gzip;排除 peer 的完整测试薄包为 14,333B gzip,两种口径分别核对。
20
30
 
21
- ## 0.8.0-beta.3 - 2026-11-04
31
+ Windows PowerPoint 真机验收继续延后,未记为通过。
22
32
 
23
- 九包已实际通过 GitHub OIDC 发布到 npm `next`。官方 registry 的匿名下载、实际 SRI、隔离安装、SDK / fill Schema 和 MCP `beta.3` 握手及十工具均通过,Node 20 / 24 均已复验。
33
+ ## 0.8.0 - 2026-11-06
24
34
 
25
- - MCP 初始化的 `serverInfo.version` 唯一读取自身公开包清单,源码、独立构建和隔离安装均报告实际软件版本。
26
- - MCP 源码与发布产物回归均验证真实 stdio 握手版本,避免后续发版遗漏手写常量。
35
+ 0.8.0 稳定版:`0.8.0-beta.3` 的全部内容转正到 `latest`,包括 Agent 命令工具面、本机 MCP server 与 Agent Skill(`@web-ppt/agent-mcp` 首个稳定版)、模板填充 `@web-ppt/edit-core/fill`、编辑器 WebMCP 与 Agent 配对评测工具。相对 0.6.0 的逐项变化见下方 `0.8.0-beta.1` 至 `0.8.0-beta.3` 条目。本版另含:
27
36
 
28
- `@web-ppt/collab` 发布入口为 12.20KB gzip;排除 peer 的完整测试薄包为 14,333B gzip。
37
+ - 新增导入安全上限:`parse()` 在解压前检查 EOCD、中央目录、条目名称、声明大小与压缩比,解压时再核对实际输出;默认上限为 4096 个条目、单条目 128 MiB、总量 512 MiB、压缩比 1000,可通过 `zip` 选项逐项覆盖,`parseInWorker` 使用同一配置。核心解析、Worker、保存原包、OLE 与内嵌工作簿共用这套边界;重复名称、路径穿越、伪造大小和超限输入抛出 `ZipSafetyError`(`reason` 为稳定的 `zip-*` 代码),ZIP64 以 `zip64-unsupported` 明确拒绝。
38
+ - 修复保存产物的 OOXML 结构:图表数据编辑与图表设计把轴标题写到 `numFmt` 之后(schema 规定标题在数字格式之前);非折线 / 散点图系列残留 `c:smooth`;生成式文字的字符与段落属性(`ln`、填充、字体、项目符号尺寸等)按 schema 顺序写入。
39
+ - 修复形状悬停超链接的保存:目标页删除后悬空引用未清理;给仅有悬停链接的形状新增点击链接时,`hlinkClick` 误写到 `hlinkHover` 之后(cNvPr 的 schema 顺序要求其在前)。
29
40
 
30
- Windows PowerPoint 真机验收继续延后,未记为通过。
41
+ 破坏性变更核对:无 API 撤除;超出默认 ZIP 上限或结构异常的输入改为抛出 `ZipSafetyError`,需要更大文件时通过 `zip` 选项放宽。
31
42
 
32
- ## 0.8.0-beta.2 - 2026-11-04
43
+ 安装:无版本号安装即得 0.8.0,九包必须同版本;`@next` 标签留给 0.9 线。原计划随 0.8.0 交付的新建图表与图表细节渲染(桌面 002 / 003)顺延到 0.9.0。发布验证见 [0.8.0 发布记录](docs/releases/0.8.0.md)。
33
44
 
34
- - 新增仓库 Agent 配对评测工具:复用生产 MCP 比较自动 lint 反馈,保存全部尝试和真实产物;`npm run eval:agent` 可离线重判已提交证据,真实模型调用使用独立显式命令。评测结果不作为发布门禁,不增加 SDK 运行时依赖。
35
- - 修复图元固件生成依赖本机 LibreOffice 缓存的问题:使用已登记哈希的原有 EMF / WMF 资产,生成字节保持原基线,并校验缓存污染与跨进程确定性。
36
- - 模板二进制边界改为审计 npm 实际发布文件清单,覆盖全部发布包;仓库私有评测文稿可保留,SDK 包夹带二进制模板仍会被拒绝。
37
- - 官网语言回归隔离后台字体完成回调,保留视图、页码、内容和下载断言;触屏回归使用实际设备能力仿真,并在场景结束恢复原输入状态与原生字体方法。
45
+ ## 0.8.0-beta.3 - 2026-11-04
38
46
 
39
- 九包已通过 GitHub OIDC 发布,MCP Trusted Publisher 已完成首次成功发布激活。隔离安装发现此版 MCP 握手仍报告 `beta.1`,修正在 `beta.3`;SDK 编辑行为与 `0.8.0-beta.1` 一致。
47
+ - 修复 `@web-ppt/agent-mcp` 初始化握手报告的 `serverInfo.version` 停在 `0.8.0-beta.1`:版本改为读取自身公开的包清单,与实际安装版本一致。
40
48
 
41
- `@web-ppt/collab` 发布入口为 12.20KB gzip;排除 peer 的完整测试薄包为 14,333B gzip。
49
+ ## 0.8.0-beta.2 - 2026-11-04
42
50
 
43
- Windows PowerPoint 真机验收继续延后,未记为通过。
51
+ `@web-ppt/agent-mcp` 在本版握手时仍报告 `0.8.0-beta.1`,已在 `0.8.0-beta.3` 修复;SDK 编辑行为与 `0.8.0-beta.1` 一致。本版其余改动只涉及仓库测试与评测工具,见 [0.8.0 发布记录](docs/releases/0.8.0.md)。
44
52
 
45
53
  ## 0.8.0-beta.1 - 2026-11-04
46
54
 
47
- 本版已发布到 npm `next`,九包需安装同一版本。`0.7.0` 的已实现能力一并纳入本次 beta;既有八包的 `latest` 保持 `0.6.0`,`agent-mcp` 首版为本次 beta。九包已通过官方 registry 全新安装、SDK 入口、填充 Schema 与真实 MCP 握手验证。
55
+ 九包需安装同一版本。`0.7.0` 的已实现能力一并纳入本次 beta;`@web-ppt/agent-mcp` 首版为本次 beta。
48
56
 
49
57
  - 新增 `@web-ppt/edit-core/fill`:按结构化大纲选择模板版式,生成标题、章节、正文、双栏、图片及八种原生图表;生成副本可修复出血、字体、对比度和文字适配,完整检查后保存并规范化重开。输入保持不变,大纲 Schema 公开,跨进程产物字节确定。
50
58
  - 修复备注增量保存缺少备注母版闭包导致独立读取器超时;仅作用显式改写或新建备注,保持未编辑来源字节、已有母版设计和完整撤销语义。
@@ -54,20 +62,12 @@ Windows PowerPoint 真机验收继续延后,未记为通过。
54
62
  - 新增 `@web-ppt/edit-core/agent` 命令工具面:全部公开命令由 TypeScript 生成 JSON Schema,支持单条 / 批量原子编辑、受影响页布局观察、单元素样式查询、撤销 / 重做、Node SVG / PNG 渲染及保存;独立按需入口不引入 MCP / 模型依赖。
55
63
  - 新增 `@web-ppt/agent-mcp` 本机 stdio MCP server 与 Agent Skill:打开、describe、单元素查询、lint、SVG/PNG 渲染、原子编辑、撤销/重做、保存和关闭;会话串行、关闭取消、原子落盘且无网络请求。真实 Claude Code 与 Codex 固定任务产物已通过 LibreOffice 与 Quick Look。
56
64
 
57
- `@web-ppt/collab` 发布入口为 12.20KB gzip;排除 peer 的完整测试薄包为 14,333B gzip。
58
-
59
- Windows PowerPoint 真机验收继续延后,未记为通过;稳定版仍需 beta 反馈与真机验收。
60
-
61
65
  ## 0.6.0 - 2026-11-02
62
66
 
63
67
  0.6.0 稳定版:`0.6.0-beta.1` 的全部内容转正到 `latest`,包括 Agent 结构化读出、布局检查与 Node 无 Office 渲染,矢量 PDF 正式入口,视频音轨与内嵌视频合成,以及 OLE DOCX / XLSX 深度编辑官网入口。相对 0.5.0 的逐项变化见下方 `0.6.0-beta.1` 条目。
64
68
 
65
69
  安装:无版本号安装即得 0.6.0,八包必须同版本;`@next` 标签留给 0.7 线。
66
70
 
67
- `@web-ppt/collab` 发布入口为 12.20KB gzip;排除 peer 的完整测试薄包为 14,333B gzip。
68
-
69
- Windows PowerPoint 真机验收经维护者决定延后,未记为通过;0.6.0 先行转正,四项自动门禁与 LibreOffice 外部打开清单全部通过。
70
-
71
71
  ## 0.6.0-beta.1 - 2026-10-31
72
72
 
73
73
  0.6.0 第一批与第二批全部七张票据收口:Agent Node 渲染、矢量 PDF 转正、视频音轨证据、内嵌视频合成、OLE 深度编辑官网入口。
@@ -77,7 +77,6 @@ Windows PowerPoint 真机验收经维护者决定延后,未记为通过;0.6.
77
77
  - 内嵌视频合成(`videoOverlay`,仍默认关闭)升级:组链经 `placeGroupChild` 折算、元素 rotate / flip / 裁剪 / 透明度 / CSS filter 与媒体间层叠在画布按 SVG 渲染一致重建;`playback.loop` 循环取模;跨页策略为元素随所属页呈现。可变帧率按时间戳取帧、60s 长视频内存有界(<60MB)、`video-overlay-frame-unavailable` 稳定复现样本(MSE 缺口媒体)均通过独立验收。
78
78
  - 视频音轨(`audio`,已随 0.5.0-beta.6 发布)补齐验收证据:FFmpeg 独立测量的脉冲与画面标记同轴(偏差 ≤130ms 声明边界)、`AbortSignal` 取消与资源释放、循环音频跨页持续。
79
79
  - OLE 嵌入文档官网面板补齐:嵌入 DOCX 的 run 级改字(保留相邻 run 格式)、嵌入 XLSX 的单元格样式(字体 / 填充 / 边框)与 sharedStrings 富文本入口,中英文文案与撤销语义齐全;`readEmbeddedPackage` 自 `@web-ppt/edit-core/ole` 公开导出供宿主提取嵌入文档;改写后的 DOCX / XLSX 经 LibreOffice 打开与重写往返验证(文字、颜色与 run 边界保留)。
80
- - `@web-ppt/collab` 发布入口为 12.20KB gzip;排除 peer 的完整测试薄包为 14,333B gzip,两种口径分别核对。
81
80
 
82
81
  ## 0.5.0 - 2026-10-29
83
82
 
@@ -87,10 +86,6 @@ Windows PowerPoint 真机验收经维护者决定延后,未记为通过;0.6.
87
86
 
88
87
  安装:无版本号安装即得 0.5.0,八包必须同版本;`@next` 标签留给 0.6 线。
89
88
 
90
- `@web-ppt/collab` 发布入口为 12.20KB gzip;排除 peer 的完整测试薄包为 14,333B gzip,两种口径分别核对。
91
-
92
- Windows PowerPoint 真机验收经维护者决定延后,0.5.0 先行转正;四项自动门禁(含 LibreOffice 外部打开清单)全部通过,后续问题以 0.5.x 补丁版修复。
93
-
94
89
  ## 0.5.0-beta.7 - 2026-10-26
95
90
 
96
91
  ### 新增
@@ -122,8 +117,6 @@ Windows PowerPoint 真机验收经维护者决定延后,0.5.0 先行转正;
122
117
  - 等线缺席时西文改用合成字族:`local()` 引用系统 Arial 度量族,粗体 `size-adjust: 95.4%`、下划线 `74.6%`,只在页面出现等线时声明;`@web-ppt/fonts` 的替换路径对 Arimo 套用同一组参数。取代窄体回退与连续空格半字宽的处理;依据是 #8 附带的 PowerPoint 导出图逐词拟合,断行与填空线长度与 PowerPoint 一致。
123
118
  - `Viewer` 执行动画时间线里的 `mediacall` 媒体调用(`playFrom` / `pause` / `stop` 等),`afterPrev` 等定时触发的音视频按时播放,切页或取消时暂停;`play()` 被浏览器拒绝时容器派发 `web-ppt-playback-error`。媒体调用步骤不再给图标留下强调动画的半透明终态(#7)。
124
119
 
125
- `@web-ppt/collab` 发布入口为 12.20KB gzip;排除 peer 的完整测试薄包为 14,333B gzip,两种口径分别核对。
126
-
127
120
  ## 0.5.0-beta.6 - 2026-10-10
128
121
 
129
122
  ### 新增
@@ -142,8 +135,6 @@ Windows PowerPoint 真机验收经维护者决定延后,0.5.0 先行转正;
142
135
  - 修复矢量 PDF 跨页复用渐变 Pattern 时未在当前页注册资源导致的整段取色错误(单页导出不触发)。
143
136
  - 修正 README 已知限制与能力矩阵的三处失真(EMF+ / OMML / 3D)及打开密码文件的能力描述。
144
137
 
145
- `@web-ppt/collab` 发布入口为 12.20KB gzip;排除 peer 的完整测试薄包为 14,333B gzip,两种口径分别核对。
146
-
147
138
  ## 0.5.0-beta.5 - 2026-09-10
148
139
 
149
140
  ### 新增
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  The fonts a deck asks for usually aren't installed on the machine viewing it. This package swaps in a **free substitute that downloads on demand**, so the text still lays out close to the original.
6
6
 
7
- There is **not one byte of font data in the package** (default entry: 2.8 KB gzip). Slices point at already-published [fontsource](https://fontsource.org/) versions served by jsDelivr; nothing downloads until it's actually rendered.
7
+ There is **not one byte of font data in the package** (default entry: 3.75 KB gzip, including the export face collector; the optional subsetting engine entry adds 0.86 KB). Slices point at already-published [fontsource](https://fontsource.org/) versions served by jsDelivr; nothing downloads until it's actually rendered.
8
8
 
9
9
  For explicit font bytes, positioned glyphs, outlines and UTF-16 source clusters, use the optional `@web-ppt/fonts/glyphs` entry. The `/glyphs/harfbuzz`, `/glyphs/worker` and `/glyphs/browser` adapters keep the shaper, Worker and browser font lifetime under the host's control. No font bytes, HarfBuzz or Cordis are bundled. See the [API and verification guide](https://github.com/unStone/web-ppt/blob/master/docs/api/font-glyphs.md).
10
10
 
@@ -90,7 +90,30 @@ await loadFontsFor(usages, { base: 'https://cdn.example.com/npm' });
90
90
 
91
91
  ## The other half: exports
92
92
 
93
- An SVG loaded through `<img>` is an isolated document and can't see fonts registered on the page. Exporting to PNG or standalone SVG means inlining the slices you hit — the character sets `collectFonts` returns exist for exactly this.
93
+ An SVG loaded through `<img>` is an isolated document and can't see fonts registered on the page. Two capabilities close this gap for PNG / standalone SVG / print exports:
94
+
95
+ **Inline the substitute slices you actually hit** (default entry): `exportFontFaces` keeps only the slices intersecting the character set `collectFonts` returns and hands them back as data-URI `EmbeddedFont[]` for core's export option `fonts.extraFontFaces`:
96
+
97
+ ```ts
98
+ import { collectFonts } from '@web-ppt/core';
99
+ import { exportFontFaces } from '@web-ppt/fonts';
100
+
101
+ const faces = await exportFontFaces(collectFonts([slide]));
102
+ const svg = await slideToSvgFile(pres, slide, undefined, { fonts: { extraFontFaces: faces } });
103
+ ```
104
+
105
+ **Subset embedded fonts to the exported text** (optional `@web-ppt/fonts/subset` entry): compress the deck's embedded fonts down to the glyphs actually rendered. The engine is a host-provided harfbuzzjs `harfbuzz-subset.wasm` (never bundled here); output bytes are deterministic:
106
+
107
+ ```ts
108
+ import { createHarfBuzzSubsetter } from '@web-ppt/fonts/subset';
109
+
110
+ const subsetter = await createHarfBuzzSubsetter(await fetch('/vendor/harfbuzz-subset.wasm').then(r => r.arrayBuffer()));
111
+ // Families unused in the export scope are dropped; a failed subset falls back to the full font
112
+ // with a stable reason (observable via onFontFallback)
113
+ const svg = await slideToSvgFile(pres, slide, undefined, { fonts: { subsetter } });
114
+ ```
115
+
116
+ Without the `fonts` option, exported bytes are identical to the previous behaviour. Measured on a 12.2 KB CJK fixture: subset 2.5 KB, single-slide SVG 16.9 KB → 3.9 KB, and PNG rasters are byte-identical with subsetting on or off.
94
117
 
95
118
  ## License
96
119
 
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 导出的「另一半」:把替代字体真正内联进导出产物。
3
+ *
4
+ * 页面预览靠注入 `<style>` + `unicode-range` 按需下载;但 `<img>` 加载的 SVG 是
5
+ * 隔离文档,拿不到页面字体——PNG / 独立 SVG / 打印导出必须把**命中的切片**以
6
+ * data URI 内联。`collectFonts` 返回的字符集正是为此准备的。
7
+ *
8
+ * 这里只挑与用量字符相交的切片,不做整字体下载;家族名写回**原字体名**,
9
+ * 与页面加载同一套替换表与就近字重规则。
10
+ */
11
+ import type { EmbeddedFont, FontUsage } from '@web-ppt/core';
12
+ import { type Substitution } from './substitute';
13
+ export interface ExportFaceOptions {
14
+ /** CDN 基址,默认 jsDelivr;与 loadFontsFor 共用同一约定 */
15
+ base?: string;
16
+ /** 覆盖 / 扩充内置替换表,键为小写后的原字体名 */
17
+ overrides?: Readonly<Record<string, Substitution>>;
18
+ /**
19
+ * 本机已装原字体时跳过,默认**关**(与 loadFontsFor 相反):预览看的是本机,
20
+ * 导出文件要在**收件人**的机器上打开,导出方装没装不构成跳过的理由。
21
+ */
22
+ skipInstalled?: boolean;
23
+ /** 与 loadFontsFor 的 cjk 同义:关掉后中文家族不内联 */
24
+ cjk?: boolean;
25
+ /** isInstalled 的探测目标,默认当前文档 */
26
+ document?: Document;
27
+ /** 内联不完整时的观察口;reason 稳定 */
28
+ onIssue?: (info: {
29
+ family: string;
30
+ reason: 'css-unavailable' | 'slice-unavailable';
31
+ }) => void;
32
+ }
33
+ /**
34
+ * 为导出准备替代字体的内联脸集:只含与用量字符相交的切片,data URI 直取直用。
35
+ *
36
+ * 返回顺序稳定(按 usages 顺序),导出产物字节确定。结果作为导出选项
37
+ * `fonts.extraFontFaces` 传给 core;core 的子集化引擎不会动这些切片
38
+ * (它们已经是按 unicode-range 切好的最小单元,且多为 woff2)。
39
+ */
40
+ export declare function exportFontFaces(usages: readonly FontUsage[], opts?: ExportFaceOptions): Promise<EmbeddedFont[]>;
@@ -0,0 +1,13 @@
1
+ // src/glyphs/fault.ts
2
+ var e = class extends Error {
3
+ constructor(e, t, n) {
4
+ super(e), this.reason = e, this.missing = t, this.range = n;
5
+ }
6
+ };
7
+ function t() {
8
+ throw new e("invalid-font");
9
+ }
10
+ function n() {
11
+ throw new e("resource-limit");
12
+ }
13
+ export { t as n, n as r, e as t };