一款基于 Python + Flask + 浏览器 的本地 Markdown 编辑器,支持渲染态直接编辑(WYSIWYG)、本地版本管理(类 Git)、暗黑/亮色主题切换、多标签页和 Agent 内容辅助(开发中)。
- WYSIWYG 渲染态编辑:基于 TUI Editor,在渲染后的界面中直接点击、输入、编辑
- 源码/WYSIWYG 双模式切换:通过顶部工具栏一键切换,右下角原生切换条已移除
- 本地版本管理:SQLite 存储历史快照,支持手动创建带标题/描述的版本、自动定时快照、Diff 对比、一键回滚、流程线时间线展示
- 动漫风暗黑/亮色主题:以天蓝/aqua为基调的亮色模式,深蓝黑霓虹风格的暗黑模式,支持自动检测系统主题偏好
- 字体配置:英文 Times New Roman,中文宋体(SimSun),全局统一
- 文件管理:通过浏览器 File System Access API 打开文件/文件夹、保存/另存为、导出 HTML、多标签页编辑
- 可拖拽标签页:标签栏支持拖拽排序,带有流畅的 CSS 过渡动画
- 多标签页状态保留:每个标签页独立保存滚动位置和未保存内容,切换时无缝恢复
- 可拖拽文件树:左侧项目文件树支持拖拽调整宽度,支持折叠/展开
- 软件设置:支持修改自动快照间隔等配置,持久化保存
- Agent 内容辅助(开发中):续写、润色、扩写、翻译、智能插入
Flask 本地服务
├── 静态文件 (web/index.html, editor.js, style.css)
├── REST API (快照 / 设置 / 文件通知)
└── 版本管理引擎 (SQLite + diff-match-patch)
↓
浏览器 (Chrome / Edge)
└── TUI Editor (WYSIWYG) + 顶部内嵌工具栏 + 版本历史侧边栏
↓
File System Access API 读写本地文件
| 设计点 | 方案 | 原因 |
|---|---|---|
| 桌面容器 | 系统浏览器 | 避免 Qt WebEngine 的渲染性能瓶颈,直接利用现代浏览器高性能渲染引擎 |
| 文件访问 | File System Access API | 浏览器原生支持本地文件读写,无需中转后端,体验更流畅 |
| 编辑器 | TUI Editor (CDN) | 成熟稳定的 WYSIWYG Markdown 编辑器,无需 Node 构建 |
| 后端语言 | Python | 版本/设置管理逻辑全部用 Python 实现 |
| 通信方式 | REST API (fetch) | 前端直接调用 Flask API,无需 action queue 中转 |
| 版本存储 | SQLite | 结构化查询、事务安全,存储在 ~/.markdown_editor/versions.db |
| Diff 计算 | diff-match-patch | Google 开源库,实时语义化 Diff,无需预存增量 |
| 主题方案 | body.dark CSS 类 |
覆盖 TUI Editor 全部 UI 元素 + 自定义组件,两套完整样式 |
- Python 3.10+
- Chrome / Edge 浏览器(需要支持 File System Access API)
- Windows / macOS / Linux
pip install -r requirements.txt依赖列表:
flask>=3.0.0— 本地 HTTP 服务diff-match-patch>=20200713— Diff 计算
python main.py启动后会自动打开系统默认浏览器,访问本地 Flask 服务。
| 功能 | 操作 |
|---|---|
| 打开文件 | 点击 Open 选择单个 .md 文件 |
| 打开文件夹 | 点击 Open Folder 加载项目文件树 |
| 保存 | 点击 Save(Ctrl+S) |
| 另存为 | 点击 Save As |
| 创建版本 | 点击 Save Version,输入标题与描述 |
| 查看版本历史 | 点击 Version History |
| 软件设置 | 点击 Settings 修改自动快照间隔 |
| 切换编辑模式 | 点击右上角 </> 图标 |
| 切换主题 | 点击右上角 ☀/☾ 图标 |
| 导出 HTML | 点击 Export HTML |
- 点击 Save Version 手动创建版本快照,需输入版本标题和更新描述
- 点击 Version History 打开右侧边栏,以流程线时间线查看所有版本
- 点击任意版本节点查看与当前内容的 Diff 对比(绿色新增 / 红色删除)
- 点击 Rollback 回滚到该版本,当前内容会自动保存为新快照(不丢失历史)
- 编辑器会按照 Settings 中设置的间隔(默认 5 分钟)自动保存当前编辑状态
- 仅在内容发生变化时才会创建新的自动快照,避免重复记录
- 自动快照以灰色节点展示在时间线中,可与手动版本一起查看或回滚
- 自动快照数量上限为 100 个,超出后按 LRU 自动清理旧记录
- 从文件树点击文件或打开新文件时,会自动在标签栏创建新标签
- 标签栏显示未保存状态(橙点提示)
- 切换标签时保留每个文件的编辑状态(包括未保存修改和滚动位置),无需确认即可自由切换
- 支持拖拽标签进行排序,带有流畅的推出动画过渡效果
- 支持关闭当前标签后自动切换到相邻标签
- WYSIWYG 模式:直接渲染态编辑,所见即所得
- Source 模式:纯 Markdown 源码编辑,适合高级用户精细调整
markdown-editor/
├── main.py # 应用入口(启动 Flask 并打开浏览器)
├── requirements.txt # Python 依赖
├── README.md # 本文件
├── editor/ # Python 核心模块
│ ├── __init__.py
│ ├── server.py # Flask 本地服务(API + 静态文件)
│ └── version_manager.py # 版本管理引擎(SQLite + Diff)
└── web/ # 前端资源
├── index.html # 页面框架
├── editor.js # TUI Editor 初始化 + 主题/模式/版本/标签管理逻辑
└── style.css # 亮色/暗色两套完整主题样式 + 动画过渡
- 版本数据库:
~/.markdown_editor/versions.db(SQLite) - 软件设置:
~/.markdown_editor/settings.json,支持配置自动快照间隔等 - 主题偏好:保存在浏览器
localStorage中 - 自动快照上限:默认保留最近 100 个自动快照,手动标记版本无上限
- 移除 PySide6/Qt 依赖:将渲染层从
QWebEngineView迁移至系统浏览器,消除 Qt Web 内核的性能瓶颈 - 采用 File System Access API:文件打开、保存、文件夹选择全部由浏览器原生处理,无需后端中转文件 I/O
- 简化后端 API:移除 action queue、
/api/file/switch、/api/file/save_disk等遗留接口,后端仅负责版本管理与设置存储 - 前端文件树遍历:由后端扫描改为浏览器端递归遍历
FileSystemDirectoryHandle
- 滚动位置缓存:缓存编辑器滚动容器引用,避免每次读写时重复
querySelector - 滚动恢复去风暴化:将切换标签后的滚动恢复从 13 次重试降至最多 3 次,并加入提前退出(到位即停)
- 标签栏增量渲染:
renderTabs改为增量更新,仅创建/更新/删除变更的标签,避免全量innerHTML重建 - 拖拽节流:标签拖拽的
dragover事件加入 40ms 节流,降低 DOM 插入与数组重排频率 - 文件树高亮轻量更新:标签切换时不再全量重建文件树 DOM,仅更新
.active高亮类 - 版本列表懒加载:版本侧边栏折叠时,跳过版本列表的网络请求与 DOM 重建
- Python 文件扫描优化:
_scan_md_files改用os.scandir,减少冗余stat系统调用 - 保存去阻塞化:保存后的快照请求移至后台线程,避免阻塞 Qt 主线程
- 关闭事件递归修复:
closeEvent中通过QTimer.singleShot延迟二次关闭,消除递归调用栈
- 工具栏内嵌化:移除 Qt 原生工具栏,所有操作按钮(Open / Save / Versions / Theme / Mode 等)全部集成到网页顶部工具栏
- 模式切换位置调整:Markdown/WYSIWYG 切换从右下角移至右上角工具栏,并隐藏 TUI Editor 原生底部切换条
- 窗口主题同步:Qt 窗口背景色随网页主题切换同步变化(亮色
#f0f9ff,暗色#0f172a)
- WYSIWYG 渲染态编辑
- 文件打开/保存/导出(File System Access API)
- 本地版本管理(手动版本 / 自动快照 / Diff / 回滚 / 流程线时间线 / 侧边栏折叠展开 / 拖拽调整宽度)
- 暗黑/亮色主题切换
- 源码/WYSIWYG 模式切换
- 文件树侧边栏(可拖拽 / 折叠恢复)
- 多标签页编辑(未保存提示 / 切换无确认 / 状态缓存 / 拖拽排序)
- 软件设置(自动快照间隔)
- 动漫风格 UI 全面改版(天蓝/aqua/橙/红/绿霓虹配色 / 渐变按钮 / 发光时间线)
- 性能优化(滚动恢复 / 增量渲染 / 拖拽节流 / 去阻塞化)
- 架构重构为纯浏览器模式(移除 PySide6,采用 File System Access API)
- Agent 内容辅助(续写 / 润色 / 扩写 / 翻译)
- Agent 修改 Diff 预览与确认
- 斜杠命令菜单(
/快速插入块) - 打包发布(PyInstaller / 单文件可执行程序)
MIT