Moe Markdown Editor 是一款基于 React 和 Google Gemini AI 构建的现代化、轻量级 Markdown 编辑器。它采用了现代化的 左侧侧边栏布局,结合了专业的写作工具、差异对比功能与强大的 AI 辅助,旨在提供流畅、智能且极具设计感的写作体验。
- 极简侧边栏导航:全新的左侧导航栏设计,采用素雅的灰阶配色 (
slate-200),直观切换视图模式与设置,释放顶部空间。 - 专业编辑器视图:
- 行号显示 (Gutter):编辑器左侧显示行号,支持与文本区精准同步滚动。
- 字体大小调节:工具栏直接调整字号 (14px - 24px),适应不同视力需求。
- 同步滚动:编辑区与预览区、行号栏三方同步,长文档阅读体验极佳。
- 智能空行清理:提供两种模式清理文档中的多余空行:
- 保留段落:智能合并连续 3 个以上空行为标准 Markdown 分段(保留 1 个空行)。
- 清除所有:强力模式,将所有松散结构压缩为紧凑布局(慎用)。
- 一键排版:专为中文优化,支持段落首行自动缩进(空两格)。
- 高级查找与替换:支持全字匹配、区分大小写及正则表达式搜索,支持逐个或全部替换。
- 双屏编辑:支持左/右两个独立文档同时编辑,方便笔记对照或翻译工作。
- 差异对比模式 (Diff Mode):在双文档视图下,可开启“对比模式”。系统将自动高亮显示当前文档相对于另一份文档的新增或差异内容,视觉化呈现版本变动。
集成 Google Gemini 2.5 Flash 模型,提供深度集成的写作辅助:
- 智能指令栏 (Ctrl/Cmd + K):在光标处唤出悬浮指令栏,快速执行 AI 操作。
- 上下文理解:支持选中特定文本进行处理,或对全文进行操作。
- 自定义提示词 (System Prompts):在设置面板中,你可以完全自定义每个 AI 功能(如总结、润色)的系统提示词,打造专属你的 AI 助手。
- 多样的预设能力:
- 📖 语法纠错:修正错别字与语病。
- 📝 内容总结:快速提取文章核心摘要。
- ✨ 内容扩写:基于现有内容进行逻辑延伸与丰富。
- 🎭 降 AI 味:优化文本,使其更具“人味”,增加文学性与自然感。
- 🌐 中英翻译:专业级的双语互译。
- AI 结果面板:
- 字数统计:实时显示生成结果的词数与字符数。
- 历史记录:自动保存 AI 生成记录,随时回溯。
- 重新生成:对结果不满意?一键让 AI 重新思考。
本项目采用无构建工具(No-Build)的现代化 ES Module 架构,直接利用浏览器原生能力运行 React。
.
├── index.html # 入口文件,包含 Import Maps (React, diff, lucide等) 和 Tailwind 配置
├── index.tsx # React 应用挂载点
├── App.tsx # 主应用组件,包含侧边栏布局、双文档状态管理
├── metadata.json # 项目元数据配置
├── types.ts # TypeScript 类型定义(枚举、接口)
├── services/
│ └── geminiService.ts # Google Gemini API 调用封装
├── components/
│ ├── EditorPane.tsx # 核心编辑器:集成行号、Diff层、快捷键、AI交互逻辑
│ ├── Toolbar.tsx # 顶部工具栏:排版、空行清理、字体设置入口
│ ├── MarkdownPreview.tsx # 基于 React-Markdown 的渲染组件
│ ├── AIResultPanel.tsx # AI 结果展示、字数统计、历史记录与操作面板
│ ├── SearchPanel.tsx # 查找与替换悬浮面板
│ └── SettingsPanel.tsx # 设置面板:配置 API Key 与 自定义 Prompt
└── prompts.ts # AI 提示词(Prompt)默认配置与构建逻辑
- EditorPane.tsx:
- 实现了三层结构:底层 Diff Layer (用于显示差异高亮) -> 中层 Textarea (透明背景,用于输入) -> 左侧 Gutter (行号)。
- 利用
diff库的diffChars算法实时计算并渲染差异。
- App.tsx:
- 采用 Flex 布局实现侧边栏 (
<aside>) 与主内容区的自适应。 - 管理
doc1和doc2的状态提升,以便在双文档间共享数据进行 Diff 计算。
- 采用 Flex 布局实现侧边栏 (
你需要一个 Google Gemini API Key。请访问 Google AI Studio 获取。
由于本项目使用 ES Modules 和 CDN 依赖,不需要复杂的 npm install 构建过程,但需要一个静态文件服务器来避免跨域(CORS)问题。
步骤:
- 克隆或下载代码到本地文件夹。
- 配置 API Key:
- 打开
services/geminiService.ts。 - 找到
const apiKey = process.env.API_KEY;。 - 注意:在纯本地静态服务器环境下,
process.env不存在。你需要手动将其替换为你的真实 Key:const apiKey = "YOUR_ACTUAL_GEMINI_API_KEY";
- 或者直接在网页端的“设置”面板中输入 Key,Key 会保存在浏览器的 LocalStorage 中。
- 打开
- 启动服务:
- 如果你安装了 Node.js,可以在项目根目录运行:
npx serve . - 或者使用 VS Code 的 "Live Server" 插件右键
index.html打开。
- 如果你安装了 Node.js,可以在项目根目录运行:
- 访问:打开浏览器访问
http://localhost:3000(或对应端口)。
推荐使用 Vercel 或 Netlify 进行静态托管。
以 Vercel 为例:
- 将代码推送到 GitHub 仓库。
- 在 Vercel 中导入该仓库。
- 重要:由于本项目是纯静态站点,通常构建命令为空。
- 环境变量:在 Vercel 项目设置中,添加环境变量
API_KEY,填入你的 Google Gemini API Key。
| 快捷键 | 功能 | 说明 |
|---|---|---|
| Ctrl/Cmd + K | AI 指令栏 | 唤出悬浮输入框,使用预设或自定义 AI 指令 |
| Ctrl/Cmd + F | 查找 | 打开搜索面板 |
| Ctrl/Cmd + H | 替换 | 打开查找与替换面板 |
| Ctrl/Cmd + Z | 撤销 | 撤销上一步编辑 |
| Ctrl/Cmd + Y | 重做 | 恢复撤销的操作 |
| Esc | 关闭 | 关闭 AI 面板、搜索框或指令栏 |
- Framework: React 19
- Language: TypeScript
- Styling: Tailwind CSS (CDN Runtime)
- AI SDK: @google/genai
- Icons: Lucide React
- Markdown: React Markdown, Remark GFM
- Utilities: diff (用于文本对比)
Made with ❤️ by Moe Markdown Studio