MARKDOWN.HTML 是一个低依赖、一键部署的 Markdown 网页渲染解决方案。项目通过单一 HTML 文件实现完整的 Markdown 渲染功能,支持代码高亮、Mermaid 图表、多语言翻译、深色模式等特性。
项目采用客户端渲染架构,主要包含以下核心模块:
graph TB
A[HTML 入口文件] --> B[Markdown 渲染引擎]
A --> C[资源内联系统]
A --> D[构建处理系统]
B --> E[marked.js]
B --> F[highlight.js]
B --> G[mermaid.js]
C --> H[Rust 构建工具]
D --> I[GitHub Actions]
版本号存储在 index.html 的自定义标签中:
<markdown-html
version="1.20.2"
author="PJ568"
repo="https://github.com/PJ-568/markdown.html"
license="CC BY-SA 4.0 International"
></markdown-html>版本提取逻辑:
- 通过
getVersion()函数从 DOM 中提取版本信息 - 用于显示关于信息和版本检测
核心流程:
- 路径解析:通过
decodeMDPath()解析 URL 参数?p=指定的 Markdown 文件路径 - 文件检测:自动检测
index.md或README.md文件 - 内容获取:使用
fetch()API 获取 Markdown 文件内容 - 渲染处理:调用
getMarkdown()进行完整渲染
处理步骤:
- 原始渲染:使用
marked.parse()将 Markdown 转换为 HTML - 链接处理:自动转换相对路径为绝对路径
- 图片处理:设置懒加载属性,转换相对路径
- 目录生成:通过
generateOutline()自动生成文档目录 - 内容包装:添加文件路径信息和目录结构
加载动画系统:
loadingState对象管理加载状态- 进度条动画通过 CSS 动画和 JavaScript 定时器实现
- 支持多资源加载的并发计数
页面切换动画:
- 使用 CSS 动画实现页面切换效果
waitForAnimationsEnd()函数等待动画完成
初始化流程:initTranslate()
- 配置 translate.js 使用客户端翻译服务
- 设置自动语言检测
- 配置忽略翻译的 CSS 类
- 执行初始翻译
翻译提示系统:infoTranslate()
- 检测当前语言与原始语言的差异
- 动态生成翻译提示信息
- 提供切换回原始语言的按钮
自动检测:
- 通过 URL 参数控制语言切换
- 支持浏览器语言偏好设置
手动切换:
- 通过
translate.changeLanguage()函数实现语言切换
配置:initPJAX()
- 选择器配置:
head title,.markdown-body,.pjax-reload - 动画切换配置:侧滑动画效果
- 缓存策略:禁用缓存破坏
响应处理重写:initCustomPJAXResponse()
- 覆写 PJAX 的默认响应处理逻辑
- 针对 Markdown 页面进行特殊处理
- 保持标准 HTML 页面的正常处理
事件监听器:initCustomPJAXEventListener()
- 监听
.md链接的点击事件 - 实现自定义的无刷新页面切换
- 错误处理和回退机制
初始化:initDarkmode()
- 检测 Darkmode.js 库的可用性
- 创建深色模式实例
- 错误处理和兼容性保障
手动切换:
- 通过
darkmode.toggle()函数切换模式 - 支持跟随系统、浅色、深色三种模式
项目使用 Rust 编写的构建工具 src/main.rs 生成不同版本的 HTML 文件。
-
HTML 压缩:
minify_html()- 使用
minify-html库进行压缩 - 保留关键标签结构
- 压缩 CSS 和 JavaScript
- 使用
-
资源内联:
all_in_one()- 自动下载外部 CSS 和 JavaScript 资源
- 使用
scraper库解析 HTML DOM - 内联替换外部资源为嵌入式内容
cargo run --release -- index.html生成文件:
index.min.html- 压缩版本index.allinone.html- 资源内联版本index.allinone.min.html- 压缩的资源内联版本
- 从 HTML 文件中提取版本号
- 支持自定义文件路径
- 多语言错误提示
- 比较当前版本与 Git 标签
- 使用
sort -V进行版本号比较 - 输出新版本号或 "0"(无更新)
- 交互式版本发布工具
- 版本格式验证(X.X.X)
- 自动创建和推送 Git 标签
自动化发布流程:
- 版本检测:检查是否需要发布新版本
- 标签创建:自动创建 vX.X.X 格式标签
- 构建处理:编译 Rust 程序并生成 HTML 文件
- 发布打包:准备发布物文件结构
- 发布创建:创建 GitHub Release 并部署到 Pages
文件加载错误:handleError()
- 显示友好的错误信息页面
- 提供重新加载和返回功能
- 自动恢复页面状态
网络请求错误:
fetch()API 的错误处理- 超时和网络异常检测
- 友好的用户提示
Rust 错误处理:
- 自定义
HtmlProcessorError类型 Result<T, Box<dyn Error>>统一错误处理- 详细的错误日志输出
图片懒加载:
- 自动设置
loading="lazy"属性 - 减少初始页面加载时间
资源按需加载:
- 外部 CSS 动态加载
- 避免阻塞页面渲染
PJAX 缓存:
- 禁用缓存破坏机制
- 提高页面切换速度
浏览器缓存:
- 合理的缓存头设置
- 减少重复资源下载
内容安全策略:
- 安全的 HTML 解析和处理
- 避免脚本注入风险
外部资源验证:
- 只加载可信的 CDN 资源
- 资源完整性检查
翻译服务:
- 使用客户端翻译避免数据泄露
- 可选的翻译功能
| 组件 | 技术 | 用途 |
|---|---|---|
| 前端渲染 | marked.js, highlight.js, mermaid.js | Markdown 解析和渲染 |
| 用户体验 | translate.js, Darkmode.js, Pjax | 多语言、深色模式、无刷新导航 |
| 构建工具 | Rust, minify-html, scraper | HTML 压缩和资源内联 |
| 自动化 | GitHub Actions, Bash 脚本 | 版本管理和发布流程 |
| 部署 | GitHub Pages, CDN | 静态资源分发 |
- 低依赖:单一 HTML 文件包含所有必要功能
- 模块化:各功能组件独立且可替换
- 可扩展:易于添加新功能和集成
- 性能优先:优化加载速度和用户体验
- 兼容性:支持现代浏览器和移动设备