新增能力:Web 与 Desktop 支持新建和保存 Markdown;桌面端注册 .md/.markdown 打开程序,支持单实例文件转交、自定义主题目录以及窗口位置、尺寸和最大化状态的延迟原子持久化与屏幕越界修正。 界面与兼容性:保留打开 Markdown 为独立主操作,将新建、保存和主题目录收纳到更多菜单;Web 移除本地素材目录入口并明确默认不支持本地素材;新文档默认使用一级标题或首行合法化生成文件名,可不保存直接导出 PDF。 渲染修复:图片、Mermaid 和 ECharts 按文档顺序串行执行媒体分页回填,每个媒体元素至多重排一次;图片以限宽后的高度作为缩放基准,只缩放媒体主体并保持标题尺寸;ECharts 冻结为 SVG 图片后参与统一分页。 示例与文档:默认示例仅保留一张网络图片,增加有效 Base64 横图、竖图、边界图片及多尺寸 Mermaid/ECharts;更新根 README、Desktop README、部署文档、四个 packages README、PROGRESS 和 AGENTS 发布规范;登记 v0.4.6 超链接导航问题。 部署与验证:构建并运行 yixiong/md-to-pdf:v0.4.5 正式镜像,Compose 健康且 PDF 冒烟无 Mermaid/ECharts 错误;生成 NSIS 安装包和免安装 ZIP,本机已升级到 NSIS v0.4.5 并清理旧 Squirrel 安装;202 项测试、类型检查、生产构建和 git diff --check 全部通过。 发布产物:Setup.exe SHA-256 9CBD6362E15AA745185805E753D5A7749434E0E142E6CE0F66463E6A19468F1D;ZIP SHA-256 97B2D44E72F626A3396E5AB5B330FFB7F9BECAF945A1707808C876940A82E850;当前 Windows 产物未配置代码签名。
74 lines
3.3 KiB
Markdown
74 lines
3.3 KiB
Markdown
# Desktop 桌面端
|
||
|
||
`apps/desktop` 是 Electron 桌面应用。当前已经完成 Electron 壳、受限
|
||
preload、进程内应用服务、原生 Markdown 打开与保存、同目录图片解析、
|
||
本地主题目录、隐藏分页窗口、Electron Chromium PDF 输出和 Windows
|
||
安装包。
|
||
|
||
桌面端会记住上次窗口的位置、尺寸和最大化状态;窗口变化后延迟写入,
|
||
异常退出后也能恢复。恢复时会按当前显示器工作区修正位置与尺寸,避免窗口
|
||
落在屏幕外。Windows 安装包会注册 `.md` 和 `.markdown` 文件关联,
|
||
双击文件或使用“打开方式”会复用已有应用窗口并加载文档。
|
||
|
||
“打开 Markdown”是顶部独立主操作;新建文档、保存 Markdown 和打开
|
||
自定义主题目录收纳在“更多”菜单中。新建文档未保存时显示“未命名文档”,
|
||
首次保存默认使用一级标题作为文件名;没有一级标题时使用首行文本,并会
|
||
自动清理 Windows 非法文件名字符。新文档无需先保存即可直接导出 PDF。
|
||
|
||
## 开发
|
||
|
||
从仓库根目录运行:
|
||
|
||
```powershell
|
||
npm run desktop:dev
|
||
```
|
||
|
||
桌面端不启动 Fastify,也不占用本地 HTTP 端口。React 界面通过受限 IPC
|
||
调用 `packages/application` 中的 Markdown 渲染和主题服务,PDF 由
|
||
Electron 自带 Chromium 生成。Web 与 Docker 继续通过 Fastify HTTP
|
||
适配器使用同一套应用服务。
|
||
|
||
## 构建与打包
|
||
|
||
```powershell
|
||
npm run build -w @md-to-pdf/desktop
|
||
npm run desktop:package
|
||
npm run make -w @md-to-pdf/desktop
|
||
```
|
||
|
||
版本化目录包、NSIS `Setup.exe` 和 ZIP 输出到
|
||
`apps/desktop/out/v0.4.5/`。该目录被 Git 忽略。公司内部分发以
|
||
`md-to-pdf-0.4.5-x86_64-Setup.exe` 为正式安装包,ZIP 作为免安装
|
||
辅助包;当前未配置代码签名,Windows 首次运行可能显示“未知发布者”
|
||
提示。
|
||
|
||
NSIS 使用标准辅助安装模式,支持选择当前用户/所有用户安装和自定义安装
|
||
目录,并创建桌面及开始菜单快捷方式。正式安装包作为 Gitea Release 附件
|
||
发布,不提交进 Git 历史。
|
||
|
||
桌面和开始菜单快捷方式由 `build/installer.nsh` 显式创建,安装完成后的
|
||
“运行”操作直接启动 `md-to-pdf.exe`,不依赖快捷方式文件。
|
||
|
||
产品名称、窗口标题、安装包名称和开始菜单名称保持为
|
||
“Markdown PDF 导出器”,实际 Windows 主程序与进程文件固定为
|
||
`md-to-pdf.exe`。
|
||
|
||
当前目录包只包含一套 Electron Chromium,不携带 Playwright Chromium。
|
||
Web 静态资源作为只读资源放在 Electron `resources/dist` 下,生产环境通过
|
||
`mdpdf://bundle/` 自定义协议加载。
|
||
|
||
发行包只保留 Electron 的简体中文和英文语言包,其他 Chromium 运行时
|
||
组件保持完整,以兼顾安装体积和不同 Windows 图形环境下的运行可靠性。
|
||
|
||
## 安全边界
|
||
|
||
- 应用窗口和 PDF 窗口均关闭 Node Integration;
|
||
- 启用 Context Isolation 和 Chromium Sandbox;
|
||
- preload 只暴露打开 Markdown、渲染、主题、生成 PDF 和保存 PDF 所需
|
||
的窄接口;
|
||
- 本地图片只能从当前 Markdown 所在目录内读取,并拒绝路径穿越和符号
|
||
链接越界;
|
||
- 主进程校验 IPC 发送者和分页载荷;
|
||
- PDF 窗口使用独立内存 Session,并阻止外部网络资源;
|
||
- 应用页面使用自定义协议,不使用 `file://`。
|