@web-ppt/fonts 0.4.4 → 0.4.5

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
@@ -2,6 +2,21 @@
2
2
 
3
3
  本文件记录对使用者可见的变化。版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
4
4
 
5
+ ## 0.4.5
6
+
7
+ ### 修复
8
+
9
+ - **`@web-ppt/viewer-core` 与 `@web-ppt/fonts` 的 npm 页面在 0.4.4 里仍是中文**。
10
+ 包内容是对的(tarball 里躺着英文版),错的是 npm 用来渲染页面的那份元数据。
11
+
12
+ 原因是 npm 认哪个文件当 README 并不看「是不是叫 README.md」:
13
+ `@npmcli/package-json` 用 `{README,README.*}` 去 glob 再取第一个像 markdown
14
+ 的命中,而 0.4.4 引入的 `README.zh-CN.md` 同样匹配 `README.*`,实测还排在
15
+ `README.md` 前面。`files` 只挡住了 tarball,挡不住元数据。
16
+
17
+ 本地化 README 改用连字符(`README-zh-CN.md`),并在 `sync-package-docs.mjs`
18
+ 里加了守卫:包目录里出现 `README.*` 旁支就直接让发布失败。
19
+
5
20
  ## 0.4.4
6
21
 
7
22
  本版没有代码改动,只动文档——但 npm 上看到的东西全变了,所以值得单独发一版。
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @web-ppt/fonts
2
2
 
3
- **English** · [简体中文](https://github.com/unStone/web-ppt/blob/master/packages/fonts/README.zh-CN.md)
3
+ **English** · [简体中文](https://github.com/unStone/web-ppt/blob/master/packages/fonts/README-zh-CN.md)
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@web-ppt/fonts",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "Font substitution and on-demand web-font loading for PowerPoint decks: metric-compatible free substitutes plus a unicode-range slice loader. Zero font bytes in the package.",
5
5
  "keywords": [
6
6
  "pptx",
package/README.zh-CN.md DELETED
@@ -1,95 +0,0 @@
1
- # @web-ppt/fonts
2
-
3
- [English](README.md) · **简体中文**
4
-
5
- PPT 里指定的字体,本机往往没有。这个包负责换一份**免费的、能自动按需下载的**替代字体,让文本仍然按接近原样的方式排版。
6
-
7
- 包里**一个字节的字体都没有**(gzip 2.8KB)。切片指向 [fontsource](https://fontsource.org/) 已发布的版本,由 jsDelivr 分发,用不到就不下载。
8
-
9
- ```bash
10
- npm i @web-ppt/fonts
11
- ```
12
-
13
- ## 用法
14
-
15
- ```ts
16
- import { collectFonts } from '@web-ppt/core';
17
- import { loadFontsFor } from '@web-ppt/fonts';
18
-
19
- // 只统计当前页:翻到了再补,已下过的切片是免费的
20
- const usages = collectFonts([pres.slides[viewer.index]]);
21
- await loadFontsFor(usages);
22
- viewer.refresh(); // 排版是同步的、加载是异步的,首帧一定按回退字体断的行
23
- ```
24
-
25
- `loadFontsFor` 做三件事,缺一不可:
26
-
27
- | 步骤 | 为什么 |
28
- |---|---|
29
- | 本机装了原字体就跳过 | 零下载永远优于任何加载策略 |
30
- | 取替代字体的 `@font-face`,**把家族名改写成原字体名** | 幻灯片里写的是「Calibri」,CSS 没有别名机制,只有让 `@font-face` 顶着这个名字,那段文字才会用上它 |
31
- | `src` 开头补一条 `local()` | 同名 `@font-face` 会**盖掉**系统里的同名字体,不补这条,装了原字体的人反而被拖去下载替代品 |
32
-
33
- 按需下载完全交给 `unicode-range`——fontsource 的 CSS 自带切片划分,浏览器只取真正渲染到的那几片。
34
-
35
- ## 替换表
36
-
37
- **拉丁一栏全是度量兼容字体**:每个字符的前进宽度与原字体逐一相等,断行位置因此与 PowerPoint 逐字对齐。LibreOffice 用的就是这一套。
38
-
39
- | PPT 里的字体 | 替代 | 度量兼容 |
40
- |---|---|---|
41
- | Calibri | Carlito | ✓ |
42
- | Cambria | Caladea | ✓ |
43
- | Arial / Helvetica | Arimo | ✓ |
44
- | Times New Roman | Tinos | ✓ |
45
- | Courier New | Cousine | ✓ |
46
- | Segoe UI / Tahoma / Verdana | Open Sans | ✗ 仅形近 |
47
-
48
- 中文:微软雅黑 / 苹方 / 黑体 / 等线 → Noto Sans SC,宋体系 → Noto Serif SC,楷体 → 霞鹜文楷。
49
-
50
- 只收**可再分发、可子集化**的字体(OFL / Apache)。MiSans、HarmonyOS Sans、阿里普惠这些「免费商用」的许可各自限制再分发与改字,不进内置表——要用就自己往 `overrides` 里加:
51
-
52
- ```ts
53
- await loadFontsFor(usages, {
54
- overrides: { 思源黑体: { family: 'Noto Sans SC', metricCompatible: false, cjk: true } },
55
- });
56
- ```
57
-
58
- ## 中文的代价要心里有数
59
-
60
- 中文默认也换——传进来的用量本来就该全部处理。但两边的账完全不同:
61
-
62
- | | 拉丁 | 中文 |
63
- |---|---|---|
64
- | 一页的代价 | ~30KB(一个切片) | **553KB**(22 个不同汉字跨 18 个切片) |
65
- | 换来什么 | 度量兼容,断行对齐 PowerPoint | 换个字形——汉字全角等宽,断行本来就不会变 |
66
- | 不换的后果 | 字宽不同,行尾全错 | 系统自带中文字体接住,看着没问题 |
67
-
68
- 切片一片约 30KB、装约 160 个码位,用掉一两个也得整片下,整份中文文件收敛下来在 1MB 上下。**边际成本按切片算,不按字算**——「只用了 22 个汉字」反而是最亏的情形。
69
-
70
- 流量敏感的场景可以关掉,或者做成用户可选(官网就是这么做的):
71
-
72
- ```ts
73
- await loadFontsFor(usages, { cjk: false });
74
-
75
- // 用户中途关掉时把已注入的声明撤回,然后重渲当前页。
76
- // 只撤声明,已下载的字节留在 HTTP 缓存里,再打开是免费的
77
- unloadFonts({ cjkOnly: true });
78
- viewer.refresh();
79
- ```
80
-
81
- ## 自托管
82
-
83
- 不想依赖 jsDelivr 就换基址,目录结构与 fontsource 的 npm 包一致:
84
-
85
- ```ts
86
- await loadFontsFor(usages, { base: 'https://cdn.example.com/npm' });
87
- ```
88
-
89
- ## 导出的另一半
90
-
91
- `<img>` 加载的 SVG 是隔离文档,拿不到页面注册的字体。导出 PNG / 独立 SVG 时必须把命中的切片内联进去——`collectFonts` 给出的字符集就是为这个准备的。
92
-
93
- ## 许可
94
-
95
- MIT。替代字体本身各自遵循其原始许可(OFL-1.1 / Apache-2.0),本包不分发字体文件。