# mdeditor
**Repository Path**: liudc0810/mdeditor
## Basic Information
- **Project Name**: mdeditor
- **Description**: 用go语言编写的markdown文件编辑器,参照了 https://github/lengyi/lengyi-markdown-editor的html版本,在此感谢。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-07-08
- **Last Updated**: 2026-07-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Markdown 编辑器
一款 Go 语言驱动的 Markdown 写作工具。单个二进制文件,浏览器即开即用。
## 目录
- [功能概览](#功能概览)
- [快速开始](#快速开始)
- [架构](#架构)
- [API 文档](#api-文档)
- [构建与发布](#构建与发布)
- [技术栈](#技术栈)
- [许可](#许可)
---
## 功能概览
### ✍️ Markdown 编辑器
- **实时预览** — 左侧编辑,右侧实时渲染,支持同步滚动
- **三种布局模式** — 编辑+预览 / 仅编辑 / 仅预览
- **可拖拽分隔栏** — 自由调整编辑器和预览区域大小
- **富文本工具栏** — 标题(H1–H6)、粗体、斜体、下划线、删除线、上/下标、引用、列表(有序/无序/任务列表)、代码(行内/代码块)、链接、图片、表格(可视化 8×8 网格选择器)
- **撤销/重做** — Ctrl+Z / Ctrl+Y,历史记录最多 100 步
- **查找替换** — Ctrl+F 打开查找面板,支持查找下一个、替换单个、全部替换
- **自动保存** — 输入后 500ms 自动保存到后端,同时保留 localStorage 兜底
- **文件导入** — 拖拽或点击导入 `.md` / `.markdown` / `.txt` 文件
- **图片插入** — URL 链接或本地文件上传(Base64 嵌入),拖拽图片自动插入
- **清除文档** — 一键清空当前内容,带确认对话框
### 🧮 数学公式
- **KaTeX 引擎** — 支持行内 `$...$` 和块级 `$$...$$` 数学公式
- **公式保护** — 后端渲染时自动提取数学公式,防止 goldmark 错误解析
### 📊 图表
- **Mermaid 图表** — 支持思维导图(Mindmap)和流程图(Flowchart)模板
- **深色/亮色主题同步** — Mermaid 渲染自动跟随编辑器主题
### 📤 多格式导出
| 格式 | 方式 | 说明 |
|------|------|------|
| **Markdown** (`.md`) | 后端 API | 直接返回原始 Markdown |
| **Word** (`.docx`) | 后端 API | **真正的 OOXML 格式**,纯 Go 标准库构建(`archive/zip`),零外部依赖 |
| **HTML** (`.html`) | 后端 API | 独立 HTML 页面,内联 KaTeX CSS + JS,数学公式正常显示 |
| **PDF** (`.pdf`) | 浏览器打印 | 调用 `window.print()`,用户选择"另存为 PDF" |
| **图片** (`.png`) | 浏览器端 | 5 种比例预设(9:16, 4:5, 3:4, 1:1, 16:9),支持长图模式 |
### 🌐 网页转 Markdown
- **URL 抓取** — 输入网页地址,自动下载并转换为 Markdown
- **SSRF 防护** — DNS 解析并阻止私有/内网 IP 访问(RFC 1918、回环、链路本地、运营商级 NAT 等)
- **反爬虫规避** — 随机 User-Agent 轮换 + 站点特定 Referer(知乎、微信公众号、简书)
- **自动重试** — 最多 3 次,指数退避
- **内容提取** — 自动识别 ``、``、正文容器类名,清理脚本、样式、导航、侧栏等无关元素
- **元数据提取** — 标题、作者、发布日期
- **手动输入备选** — 可粘贴 HTML 源码进行转换
### 📁 文档管理
- **侧边栏文档列表** — 查看所有文档,按更新时间倒序排列
- **新建文档** — 自动生成唯一 ID
- **切换文档** — 自动保存当前文档
- **删除文档** — 带确认对话框,自动切换到下一个可用文档
- **本地存储兜底** — 后端不可用时内容保存到 localStorage
### 🎨 主题 & 国际化
- **亮色/深色主题** — 一键切换,CSS 变量实现,偏好记忆在 localStorage
- **10 种语言** — 简体中文、繁体中文、英语、日语、韩语、西班牙语、法语、德语、俄语、葡萄牙语
- **自动检测** — 首次使用自动匹配浏览器语言
### 🛡️ 安全
- **X-Content-Type-Options: nosniff** — 防止 MIME 类型嗅探
- **X-Frame-Options: DENY** — 防止点击劫持
- **CORS** — 跨域支持
- **Panic 恢复** — 中间件捕获 panic,返回 500 JSON 错误
- **请求体大小限制** — 所有 POST/PUT 端点限制 10 MB
- **清理文件名** — 导出文件名去除不安全字符,限制 200 字符
- **公式 XSS 防护** — 数学公式内容经 HTML 转义后插入页面
---
## 快速开始
### 方法一:从源码构建
```bash
# 克隆仓库
git clone https://gitee.com/liudc0810/mdeditor.git
cd mdeditor
# 构建
go build -o mdeditor .
# 运行
./mdeditor --port 8090
```
### 方法二:使用 Makefile
```bash
make build # 构建
make run # 构建并运行(默认 :8090)
```
### 方法三:跨平台发布版
```bash
make release # 构建 linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64
```
### 命令行参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `--port` | `8090` | HTTP 服务器端口 |
| `--data-dir` | `./data` | 文档存储目录 |
启动后访问 `http://localhost:8090` 即可使用。
---
## 架构
### 分层结构
```
main.go # 入口:flag 解析 + go:embed + 优雅关闭
└── internal/server/server.go # HTTP 服务器 + 路由 + 中间件
└── internal/handler/ # API 处理器
├── document.go # 文档 CRUD
├── render.go # Markdown → HTML 渲染
├── export.go # 导出 .md / .docx / .html
└── web2md.go # 网页 → Markdown
├── internal/store/ # 文档存储
│ ├── store.go # Store 接口定义
│ └── filestore.go # 文件系统实现
├── internal/render/ # Markdown 渲染管线
│ ├── markdown.go # goldmark 渲染
│ └── math.go # 数学公式保护/恢复
├── internal/export/ # 导出生成器
│ ├── html.go # 独立 HTML 页面
│ └── docx.go # OOXML .docx 生成器
└── internal/web2md/ # 网页抓取与转换
├── fetcher.go # HTTP 抓取 + SSRF 防护
└── converter.go # HTML → Markdown 转换
web/ # 前端(go:embed → 嵌入二进制)
├── index.html # 单文件应用(含全部 CSS + JS)
├── i18n.js # 国际化字典(10 语言)
└── vendor/ # CDN 依赖本地化
├── katex/ # KaTeX 数学公式渲染
├── mermaid/ # Mermaid 图表渲染
└── dom-to-image-more/ # PNG 截图导出
```
### 数据存储
- 每篇文档存储为两个文件:
- `.meta.json` — 元数据(ID、文件名、更新时间、字数)
- `.md` — Markdown 正文
- ID 为 32 位十六进制字符串(密码学安全随机生成)
- 使用 `sync.RWMutex` 保障并发安全
### 前后端分工
| 层 | 职责 |
|----|------|
| **Go 后端** | Markdown 渲染(goldmark)、文档存储(文件系统)、文件导出(.md/.docx/.html)、网页抓取转换 |
| **前端** | 编辑交互、实时预览、KaTeX/Mermaid/PNG 截图渲染、主题/语言偏好(localStorage) |
---
## API 文档
| 方法 | 路径 | 说明 |
|------|------|------|
| `GET` | `/api/v1/health` | 健康检查 |
| `GET` | `/api/v1/documents` | 获取文档列表(不含内容) |
| `POST` | `/api/v1/documents` | 创建文档 |
| `GET` | `/api/v1/documents/{id}` | 获取单个文档(含内容) |
| `PUT` | `/api/v1/documents/{id}` | 更新文档(部分更新,content/filename 可选) |
| `DELETE` | `/api/v1/documents/{id}` | 删除文档 |
| `POST` | `/api/v1/render` | Markdown → HTML 渲染 |
| `POST` | `/api/v1/export/md` | 导出 Markdown 文件 |
| `POST` | `/api/v1/export/doc` | 导出 Word 文档(.docx) |
| `POST` | `/api/v1/export/html` | 导出独立 HTML 页面 |
| `POST` | `/api/v1/web2md` | 网页 URL → Markdown |
---
## 构建与发布
### 前提条件
- Go 1.24 或更高版本
- 无需其他运行时依赖
### Makefile 命令
| 命令 | 说明 |
|------|------|
| `make build` | 构建当前平台可执行文件 |
| `make run` | 构建并运行(端口 8090) |
| `make clean` | 删除可执行文件 |
| `make clean-data` | 删除数据目录 |
| `make test` | 运行 `go vet` + `go build` + `go test` |
| `make release` | 构建多平台发布版(5 个平台),打包为 `.tar.gz` |
---
## 技术栈
### Go 后端
| 依赖 | 用途 |
|------|------|
| `github.com/yuin/goldmark v1.8.2` | Markdown → HTML 渲染,GFM + 脚注扩展 |
| `golang.org/x/net v0.28.0` | HTML 解析(docx 导出 + web2md 转换) |
| Go 标准库 | HTTP 服务器、JSON 编码、文件 I/O、crypto/rand、archive/zip |
### 前端(嵌入二进制)
| 库 | 用途 |
|----|------|
| **KaTeX** | 数学公式渲染 |
| **Mermaid** | 图表渲染 |
| **dom-to-image-more** | 导出 PNG 截图 |
---
## 许可
本项目基于 MIT 许可证开源。