alexishida/Moji

GitHub: alexishida/Moji

一个基于 Electron 和 React 构建的轻量级跨平台桌面应用,用于打开、阅读、编辑和导出 Markdown 文件。

Stars: 95 | Forks: 9

Moji

Moji

一个轻量、简洁的桌面应用,用于打开、阅读、编辑和导出 Markdown 文件。

基于 Electron、React、TypeScript 和 electron-vite 构建。

当前版本:v0.1.4

reposytory-open-graph

下载: Windows · macOS (DMG) · Linux (AppImage) · Linux (DEB)

## 名称 **Moji (文字)** 在日语中的字面意思是“字母”、“字符”或“文字”。简短且易于记忆,让人联想到字符与书写。这个名字非常契合它的用途:顺畅地打开、编辑、预览和导出 Markdown——毫无干扰。 ## 功能 - **打开 Markdown 文件**:通过文件对话框、拖放、CLI/文件关联入口以及单实例转发,支持 `.md` 和 `.markdown` 文件。 - **多文档工作区**:水平标签页、修改标记、关闭按钮、重复文件检测以及带有清晰操作图标的未保存更改确认。 - **标签页管理**:通过文档标签页菜单关闭其他标签页、右侧标签页、已保存标签页或所有标签页。 - **预览模式**:经过净化的 Markdown 渲染,支持标题锚点、大纲导航、表格、任务列表、脚注、定义列表、下标/上标、高亮/插入标记、emoji 短代码、通过 KaTeX 实现的 LaTeX 数学公式 (`$…$` 和 `$$…$$`)、链接化 (linkify)、排版工具 (typographer)、语法高亮代码以及代码块复制按钮。 - **图形和 Mermaid 图表**:由内置 Mermaid 支持的每一个有效围栏 `mermaid` 块都会渲染为响应式图表,包括流程图、时序图、甘特图、类图、ER 图、状态图和旅程图。点击任何渲染出的 SVG 或 Markdown 图像,可在模态框中检查它,支持缩放、拖动导航、小地图以及单独导出为 PNG;格式错误的 Mermaid 块仍作为可读代码块保留。 - **大纲导航**:在预览和编辑器模式下均可使用可折叠的标题树。预览模式使用滚动侦测;点击任意标题可滚动预览页面,或将编辑器光标移至其 Markdown 源码处。 - **查找和替换**:顶部栏搜索会高亮预览/编辑器中的匹配项,显示出现次数,跳转到下一个匹配项,并替换当前文档中的一个或所有匹配项。 - **编辑器模式**:基于 CodeMirror 6 的 Markdown 编辑器,支持行号、历史记录、自动换行、本地化的未命名文档名称、Markdown 格式快捷方式以及保存/另存为流程。 - **导出模式**:将当前文档导出为 HTML、PDF 或 PNG。PDF 支持 A4、Letter、Legal 尺寸以及纵向和横向;过长的代码行会在 PDF 和 PNG 导出中自动换行。 - **图表导出**:渲染后的 Mermaid 图表会作为独立的 SVG 嵌入到 HTML、PDF 和 PNG 导出文件中。 - **设置视图**:工作区内的居中面板,用于设置语言、预览排版以及本地化的快捷键参考。 - **关于视图**:工作区内的面板,显示应用名称、版本(来自 `package.json`)、作者、仓库链接以及名称背后的故事。 - **Markdown 指南**:内置的本地化参考文档 (`samples/markdown-guide..md`),可从状态栏打开。 - **最近文件**:欢迎屏幕显示最近打开的 Markdown 文件,并允许您重新打开或移除条目。 - **记忆应用状态**:窗口大小/位置、最近文件、上次使用的文件夹、语言、预览排版和 Markdown 预览主题会保存在用户设置中。 - **自动更新**:已安装的 Windows NSIS 和 Linux AppImage 构建版本会检查 GitHub Releases,显示下载进度,并且只在保护未保存的文档后才会重启。 - **Markdown 主题**:支持渲染后的 Markdown 暗色/亮色切换。应用界面始终保持暗色;导出文件始终使用亮色主题。 - **国际化**:支持英语、葡萄牙语(巴西)、西班牙语、日语、中文和俄语。初始语言会尽可能遵循操作系统设置,用户的选择会被保存。 - **安全性**:沙盒渲染器、上下文隔离、`nodeIntegration: false`、DOMPurify 净化,以及外部链接在操作系统浏览器中打开。 - **键盘快捷键**:常用的文件、搜索、替换、标签页、预览、导出、全屏和字体大小操作;设置中列出了所有可用的快捷键。 ## 截图

Welcome Preview

Editor Export

Mermaid diagrams Mermaid diagram viewer

## 安装 Windows 和 Linux 可以通过上方的下载链接直接安装,无需额外步骤。 ### macOS macOS 在首次打开 Moji 时会拒绝运行,提示它已损坏或 Apple 无法检查其是否包含恶意软件。**应用本身没有任何问题。** 对应用进行签名需要付费的 Apple Developer 账户,而 Moji 目前还没有,因此 macOS 会将其视为来自未知开发者的应用。 1. 将 **Moji** 从 DMG 拖入您的 **Applications**(应用程序)文件夹。 2. 双击它。macOS 会阻止它。关闭对话框。 3. 打开 **System Settings > Privacy & Security**(系统设置 > 隐私与安全性),滚动到 **Security**(安全性)部分,然后在关于 Moji 的消息旁边点击 **Open Anyway**(仍要打开)。 4. 确认。macOS 会记住此选择,因此每个版本只需执行一次此操作。 如果您更喜欢使用终端,清除隔离标志可以完全跳过这些提示: ``` xattr -dr com.apple.quarantine /Applications/Moji.app ``` 缺少签名也是 macOS 上自动更新功能保持关闭的原因:请通过下载新的 DMG 来升级。一旦应用经过签名和公证,这两个限制就会消失。 ## 环境要求 - Node.js `^20.19.0 || >=22.12.0`(Vite 7 和 electron-vite 5 所需;打包还需要 `require()` ES 模块,自 Node 22.12 起已无需标志即可使用) - npm ## 开发 ``` npm install npm run dev npm run typecheck npm test npm run build ``` 实用脚本: - `npm run dev`:启动带有热重载的 Electron。 - `npm run typecheck`:运行 TypeScript 检查而不输出文件。 - `npm test`:运行一次 Vitest 测试套件(使用 `npm run test:watch` 进入监听模式)。 - `npm run build`:将主进程、预加载脚本和渲染进程构建到 `out/` 目录。 - `npm run preview`:运行构建后的应用预览。 ## 打包 ``` npm run dist npm run dist:win npm run dist:linux npm run dist:mac ``` 生成物将写入 `release/`。 当前的打包目标: - Windows:NSIS 安装程序,x64,支持自动更新。 - Linux:支持自动更新的 AppImage,以及用于手动安装的 deb。 - macOS:通用(Apple Silicon + Intel)DMG 和 ZIP,不支持自动更新。 `.md` 和 `.markdown` 的文件关联在 `electron-builder.yml` 中声明。 ### macOS 构建 macOS 发行版**未进行代码签名或公证**,因为这需要付费的 Apple Developer 账户。由此带来的影响: - 当从网络下载 DMG 时,Gatekeeper 会阻止该应用。用户可以通过 **System Settings > Privacy & Security > Open Anyway**(系统设置 > 隐私与安全性 > 仍要打开)打开它,或者使用 `xattr -dr com.apple.quarantine /Applications/Moji.app` 清除隔离标志。在 macOS 15 (Sequoia) 中,按住 Control 点击应用并选择 *打开* 的方法已失效,因为 [Apple 移除了该覆盖选项](https://developer.apple.com/news/?id=saqachfa)。面向用户的具体步骤详见[安装](#macos)。 - macOS 上的自动更新保持禁用状态。Squirrel.Mac 拒绝替换未签名的包,因此 `updater.ts` 在该平台会报告 `unsupported`,用户需要通过下载新的 DMG 来更新。 要在本地签名,请在钥匙串中安装 Apple Developer ID 证书,并移除 `CSC_IDENTITY_AUTO_DISCOVERY=false` 覆盖设置;`build/entitlements.mac.plist` 和 `hardenedRuntime` 已经为公证配置完毕。 ### 发布新版本 1. 更新 `package.json` 和 `package-lock.json` 中的 `version`。 2. 提交更改,然后创建并推送匹配的标签,例如 `v0.2.0`。 3. `.github/workflows/release.yml` 会验证标签,然后按顺序构建 Windows、Linux 和 macOS 版本,并将每个平台的生成物上传到草稿状态的 Release 中。无需手动附加任何二进制文件。 4. 一旦 Windows 和 Linux 构建成功,工作流就会将 GitHub Release 设为公开:包括 NSIS、AppImage、DEB 以及 `latest.yml` / `latest-linux.yml` 更新元数据。 如果 Windows 或 Linux 构建失败,Release 将保持草稿状态。如果 macOS 失败则不会影响发布:发布步骤会等待 macOS 作业完成,因此 DMG 仍在上传时,Release 绝不会被设为公开,但发布过程也不要求 macOS 必须成功。macOS 是未签名的且处于次要地位,损坏的 DMG 不应阻碍优秀的 Windows 和 Linux 版本发布。不过,macOS 作业的失败仍会在工作流中清晰地显示出来。 `electron-updater` 仅在打包后的 Windows NSIS 构建和 Linux AppImages 中运行。开发和 deb 构建版本不会自动更新。AppImage 必须位于用户可写的目录中才能成功替换。Windows 生产环境发行版应通过 electron-builder 的签名环境变量使用 Authenticode 证书;切勿将证书凭据存储在代码仓库中。 ## 项目结构 ``` electron/ main.ts Window lifecycle, persisted bounds, file opening, single-instance flow, close guard, macOS application menu, IPC registration preload.ts Safe renderer API exposed through contextBridge shared.ts Shared IPC names, settings, export types, languages, recent-file limits, supported extensions updater.ts GitHub release checks, update download state, and NSIS/AppImage installation settings.ts User settings persistence, window bounds, recent files, preview theme, and last dialog directory export.ts HTML/PDF/PNG export implementation with remembered output directory png.ts Streaming PNG encoder used to keep tall-document exports within memory src/ App.tsx Renderer state, document actions, close guard wiring, mode switching components/ Top bar, tabs, sidebar, outline tree, preview, Mermaid viewer, editor, export/settings/about dialogs, confirm dialog, welcome view lib/ Markdown rendering, Mermaid rendering, outline extraction, preview scroll-spy, export HTML, hooks locales/ en, pt-BR, es, ja, zh, ru translation files styles/ Theme tokens, app shell CSS, Markdown preview CSS samples/ Bundled Markdown documents (full Markdown guide) ``` ## 文档 - `.ai-framework/RULES.md`:AI 辅助修改的项目规则。 - `.ai-framework/DESIGN.md`:视觉系统、设计令牌、布局和组件规则。 - `openspec/specs/`:当前行为规范。 ## 许可证 MIT © Alex Ishida
标签:Electron, Markdown, Markdown编辑器, React, Syscalls, TypeScript, 安全插件, 桌面应用, 自动化攻击