Remove CEF: the web content crate, ElyMark's page, their packaging, licences and tests (C14.5)

PRD and agents.md name the native route; ElyMail's body will not use
CEF or Electron. ElyMark's package carries the KaTeX fonts' OFL.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
ZacharyZhang-NYandClaude Opus 5.5 committed 2026-10-12 03:15:30 -04:00
1 parent 2e8379b0b1
commit 8a942e6d80
77 files changed
+105 -10718

No files matched your search

+3 -3
View File
@@ -8,7 +8,7 @@
| --- | --- | --- |
| 键盘完成打开、编辑、保存、搜索与主要工具 | 共用命令(`ely_ui::commands`:新建、打开、保存、另存为、导出、打印、关闭标签 Cmd+W、命令面板、设置),各应用的查找(Cmd+F)与模式键;`shell.sh`、`doc-shell.sh`、`mark-tools.sh` 以按键驱动 | 拖动类操作(图片手柄、透视表字段、PDF 区域标记)没有键盘替代 |
| 焦点框不依赖悬停 | 组件库可按元素都是 Tab 停靠点并带 `focus_ring`(7fab072 起 git 行带透明边框使焦点框可见) | — |
| 内容区与界面间焦点可预测 | Tab 顺序导航→内容→属性→状态(C05.4,`shell.sh`);浮层关闭后焦点回到打开前之处(组件库 8658999);文档(LOK 视图)与网页(ElyMark)把 Tab 留给自己(制表符、跳单元格、缩进),F6 与 Shift+F6 照 Tab 的次序移出与移回(组件库 029632b;原先没有键盘出口) | CEF 页面内的焦点顺序由页面决定 |
| 内容区与界面间焦点可预测 | Tab 顺序导航→内容→属性→状态(C05.4,`shell.sh`);浮层关闭后焦点回到打开前之处(组件库 8658999);文档(LOK 视图)把 Tab 留给自己(制表符、跳单元格、缩进),F6 与 Shift+F6 照 Tab 的次序移出与移回(组件库 029632b;原先没有键盘出口) | ElyMark 原生组件的焦点次序待 C14.16 核对 |
| 对比度 4.5:1 | 主题与 Omarchy 色板按组件库 `A11yChecker` 规则收口(正文、状态色 4.5:1,焦点与图表色 3:1),核对不过的主题整套不用(C05.1) | 文档内容的颜色取自文件,照原样显示 |
## 辅助技术
@@ -16,7 +16,7 @@
| 要求 | 依据 | 缺口 |
| --- | --- | --- |
| 控件有角色与名称 | 组件库核心控件、对话框、列表、树、提交与差异行、设置行(组与说明)、提示(Toast 有角色与名称);真窗口测试都经 AX 树操作(`ax-values`、`ax-press`) | `lists::Outline` 与 `feedback::Alert` 无角色(上游待办);gpui 无 aria-disabled,以说明文字表达 |
| 文档内容可达 | LOK 视图把当前段落(Calc 为当前单元格与输入行)以 `MultilineTextInput` 交给 AX(`lokview.sh` 读到键入后的段落) | gpui 没有文本选区与插入点的 AX:选区、插入点、整篇文档到不了辅助技术;ElyMark 与内容宿主的页面不进 AX 树(CEF 离屏);PDF 页面文字未接 AX |
| 文档内容可达 | LOK 视图把当前段落(Calc 为当前单元格与输入行)以 `MultilineTextInput` 交给 AX(`lokview.sh` 读到键入后的段落) | gpui 没有文本选区与插入点的 AX:选区、插入点、整篇文档到不了辅助技术;ElyMark 原生组件的 AX 待 C14.16 核对;PDF 页面文字未接 AX |
| 编辑状态可达 | 保存状态、风险、引擎停止以提示条与状态栏文字表达 | 状态栏文字是否进 AX 树未逐项核对 |
## 国际化
@@ -24,7 +24,7 @@
| 要求 | 依据 | 缺口 |
| --- | --- | --- |
| 简中与英文界面 | `ely_ui::i18n` 缺键即失败;组件库面板族、对话框、批注栏等内建中英目录;设置可切语言(下次启动生效) | 组件库 `SortBuilder`、`FilterBuilder`、欢迎页等文案仍为英文(上游待办);ElyTable 选区统计以外的内核文字为英文 |
| 中英文输入、组合输入、标点 | LOK 视图与 CEF 页面都经输入法回调处理组字(`lokview.sh`、`webview.sh` 组“你好”);往返用例含中文(`independent.rs`) | 系统拼音输入法实机只做过人工检查,测试以输入法回调模拟 |
| 中英文输入、组合输入、标点 | LOK 视图与 ElyMark 的编辑器都经输入法回调处理组字(`lokview.sh` 组“你好”;组件库的文档测试);往返用例含中文(`independent.rs`) | 系统拼音输入法实机只做过人工检查,测试以输入法回调模拟 |
| 混合字体 | 内核按字体回退排版;缺失字体在 ElyDoc 页面上方列出 | 字体缺失环境的分页对照未做(见 `docs/compatibility.md`) |
| 非 ASCII 路径 | `paths_keep_spaces_cjk_and_case`(保存);启动参数按当前目录取绝对路径(C20.1 修) | — |
| 日期、数字、纸张用显式区域 | 内核载入选项固定 `Language=en-US`(`ely-lok/src/worker.rs` 的 `LOAD_OPTIONS`),公式为 Excel A1 语法;纸张取自文档本身并原样打印(C19.2) | — |
+4 -4
View File
@@ -3,7 +3,7 @@
随发行说明发布,每个版本一份。支持某格式不等于支持它的全部功能;下表只写已验证的内容、已知限制与保存行为。
版本:Ely Office 0.1.3(首版六个应用:ElyDoc、ElyTable、ElyShow、ElyPDF、ElyTree、ElyMark)。日期 2026-10-11。
内核:LibreOffice 26.2.6.3(8221e31,加 `patches/libreoffice` 0001–0041);MuPDF 1.28.5(8ad45e9,加 `patches/mupdf` 0001–0005);Git 2.56.0(a018953)与 git-lfs 3.8.0;CEF 154.0.32。
内核:LibreOffice 26.2.6.3(8221e31,加 `patches/libreoffice` 0001–0041);MuPDF 1.28.5(8ad45e9,加 `patches/mupdf` 0001–0005);Git 2.56.0(a018953)与 git-lfs 3.8.0。
验证机:macOS 27.0 arm64。Windows 与 Linux 未验证。本机没有 Microsoft Office:与 Office 的交叉检查未做(待做)。
## 往返验证
@@ -66,9 +66,9 @@
| | 格式 |
| --- | --- |
| 编辑与保存 | MD、Markdown(UTF-8,带不带 BOM;保留换行风格;未改动的块逐字节照原文写回) |
| 导入或受限 | UTF-16 与非 UTF-8 拒绝打开并指出字节位置;Milkdown 不支持的语法以原文块保留;超过 2 MiB 只以源码打开 |
| 输出 | HTML(单文件或带资源文件夹)、PDF、纯文本、打印(macOS) |
| 编辑与保存 | MD、Markdown(UTF-8,带不带 BOM;保留换行风格;文本即原文,只写回所改的字) |
| 导入或受限 | UTF-16 与非 UTF-8 拒绝打开并指出字节位置;markdown-rs 不认的语法照原文显示;超过 2 MiB 只以源码打开 |
| 输出 | 原生重做中(C14.14),此版没有 |
## 第二批
+1 -1
View File
@@ -19,7 +19,7 @@
- 有未保存改动时,每 10 秒在本机数据目录写一个恢复点(加密的文档其恢复点也加密),只留在本机,不上传。
- 应用崩溃后再启动,未保存的内容以未命名副本打开,原文件不动;只恢复内容,光标与撤销历史不恢复。
- 文档引擎单独停止时,窗口上方写明原因与最近一次恢复点的时间,“重新打开文档”起新引擎并逐个重开:有改动的从恢复点、无改动的从文件。
- 设置“存储”里可看日志、网页缓存、恢复副本的大小,选每个文档保留几个恢复点与多少空间,并清除它们(先问)。
- 设置“存储”里可看日志、恢复副本的大小,选每个文档保留几个恢复点与多少空间,并清除它们(先问)。
## 离线边界
+2 -3
View File
@@ -10,7 +10,7 @@ Ely Office 的自有代码以 AGPL-3.0-or-later 发布,全文在仓库根的 `
| 文件 | 内容 | 生成 |
| --- | --- | --- |
| `ElyOffice-<版本>-source.tar.gz` | 自有源码、`Cargo.lock`、`rust-toolchain.toml`、ElyMark 网页的 `package-lock.json`、上游补丁(`patches/libreoffice`、`patches/mupdf`)、构建与取上游的脚本(各上游钉在提交,脚本里写明地址与散列)、测试、文档 | `packaging/macos/release.sh` |
| `ElyOffice-<版本>-source.tar.gz` | 自有源码、`Cargo.lock`、`rust-toolchain.toml`、上游补丁(`patches/libreoffice`、`patches/mupdf`)、构建与取上游的脚本(各上游钉在提交,脚本里写明地址与散列)、测试、文档 | `packaging/macos/release.sh` |
| `ElyOffice-<版本>-upstream-source.tar.gz` | 实际编译的 MuPDF 源码(钉住的提交加我们的补丁,AGPL)与随包 Git 的源码(v2.56.0,GPLv2) | 同上;`tests/scripts/release-macos.sh` 核对其中是打过补丁的 MuPDF |
| 各应用包 `Resources/Licenses/` | Ely 的 AGPL 全文;`rust-crates.txt`(链进该应用各二进制的全部 crate 与其许可文件,无许可文件的取标准文本并写明作者);所带引擎的许可与通知(见下) | `packaging/licenses.sh`,缺任何一份即打包失败 |
@@ -26,8 +26,7 @@ Ely Office 的自有代码以 AGPL-3.0-or-later 发布,全文在仓库根的 `
| Great Vibes 字体 | OFL-1.1 | OFL | PDF |
| Git 2.56.0 | GPL-2.0(部分 LGPL-2.1) | COPYING、LGPL-2.1;源码在上游源码包 | Tree(Mark 使用同级 Tree 包内的 Git) |
| git-lfs 3.8.0 | MIT | LICENSE.md(按标签与散列取得) | Tree |
| CEF 154 / Chromium | BSD 及其依赖各自许可 | CEF LICENSE、Chromium CREDITS | Mark |
| Milkdown、CodeMirror、KaTeX、Mermaid 等网页依赖 | 各自许可(多为 MIT) | `THIRD-PARTY-NOTICES.txt`,按打进包的每个包取其许可文件 | Mark |
| KaTeX 字体(随 RaTeX 嵌入) | OFL-1.1 | OFL、FONT_NOTICE | Mark |
| 媒体播放 | 系统框架(AVFoundation),不随包 | — | Show |
## 未尽之处
+1 -1
View File
@@ -12,6 +12,6 @@
| repo | 10 万个提交 | PERF-06 |
| notes.md | 1 MB | PERF-07 |
计时从启动进程起,到日志里出现标记为止(脚本每 10 毫秒读一次日志):PERF-01 到首帧(`ELY_SMOKE=1` 打印 `ready`),首次运行(新的用户目录)与日常启动分记,每次等上一次的进程(含仍在启动的内核)退出后再测;Doc、Table、Show 另记空白文档就绪(`opened Untitled`),它要等内核启动;PERF-03、04 到第一块图块真正画到窗口上(`lok: first tile drawn`,在 `paint_image` 成功之后记;其间内核画图块失败或窗口画图块失败即整次作废),PERF-03 之前先核对样本经内核排版恰为 100 页(`lok: 100 pages`);PERF-05 到第一页的第一块画到窗口上(`pdf: first tile drawn, page 0`;画失败即整次作废);PERF-06 的历史首屏从按下“历史”到显示(`history shows`),查询从按下回车到结果(`searched true`),性能要求的指标是后者;PERF-07 到可视编辑器显示(`mark: shown as visual`)。PERF-02 为 ElyDoc 每次按键到显示该编辑的图块(`lok: edit to tile`,每键须各有一条,缺即失败),并以 `ELY_STALLS=1` 记下主线程连续忙于 100 毫秒以上的次数(`main thread was busy`)。内存为应用及其全部子进程(内核 worker、CEF 辅助进程)的 RSS 之和。PERF-08 为 ElyDoc 新建再关闭文档 40 次:循环前记下基线(总内存、全部句柄的类型与名称、内核中的文档数 `lok-worker: N documents open`),每次关闭后等内核回到基线文档数(等不到或没有这条日志即失败),再按身份比对句柄:比基线多出的只许是 `/System/Library/` 下的只读系统资源(第一次打开模板对话框时一次性载入两个系统字体与 AppKit 的两个本地化表),且此后每次都相同;多出任何别的句柄即失败。记录写基线与每次的内存、句柄数、文档数。
计时从启动进程起,到日志里出现标记为止(脚本每 10 毫秒读一次日志):PERF-01 到首帧(`ELY_SMOKE=1` 打印 `ready`),首次运行(新的用户目录)与日常启动分记,每次等上一次的进程(含仍在启动的内核)退出后再测;Doc、Table、Show 另记空白文档就绪(`opened Untitled`),它要等内核启动;PERF-03、04 到第一块图块真正画到窗口上(`lok: first tile drawn`,在 `paint_image` 成功之后记;其间内核画图块失败或窗口画图块失败即整次作废),PERF-03 之前先核对样本经内核排版恰为 100 页(`lok: 100 pages`);PERF-05 到第一页的第一块画到窗口上(`pdf: first tile drawn, page 0`;画失败即整次作废);PERF-06 的历史首屏从按下“历史”到显示(`history shows`),查询从按下回车到结果(`searched true`),性能要求的指标是后者;PERF-07 到可视编辑器显示(`mark: shown as visual`)。PERF-02 为 ElyDoc 每次按键到显示该编辑的图块(`lok: edit to tile`,每键须各有一条,缺即失败),并以 `ELY_STALLS=1` 记下主线程连续忙于 100 毫秒以上的次数(`main thread was busy`)。内存为应用及其全部子进程(内核 worker)的 RSS 之和。PERF-08 为 ElyDoc 新建再关闭文档 40 次:循环前记下基线(总内存、全部句柄的类型与名称、内核中的文档数 `lok-worker: N documents open`),每次关闭后等内核回到基线文档数(等不到或没有这条日志即失败),再按身份比对句柄:比基线多出的只许是 `/System/Library/` 下的只读系统资源(第一次打开模板对话框时一次性载入两个系统字体与 AppKit 的两个本地化表),且此后每次都相同;多出任何别的句柄即失败。记录写基线与每次的内存、句柄数、文档数。
记录开头的 JSON 写机型、CPU、核数、内存、GPU、系统、系统字体文件数、各应用发行二进制的散列与样本散列。冷启动未清系统文件缓存(需要管理员权限),“日常启动”即文件缓存已热时的启动。