md2ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,230 @@
1
+ # md2ui
2
+
3
+ 一个基于 Vue 3 的文档渲染系统,将本地 Markdown 文档转换为美观的 HTML 页面。
4
+
5
+ ## 功能特性
6
+
7
+ - 📚 **文档管理** - 自动扫描并构建文档目录树
8
+ - 🎨 **美观界面** - 三栏布局(导航栏、内容区、目录)
9
+ - 📝 **Markdown 渲染** - 支持 GFM 语法和代码高亮
10
+ - 📊 **Mermaid 图表** - 支持流程图、时序图等
11
+ - 🔍 **目录导航** - 自动提取文档大纲
12
+ - 📱 **响应式设计** - 适配不同屏幕尺寸
13
+ - ⚡ **快速加载** - 基于 Vite 构建
14
+
15
+ ## 技术栈
16
+
17
+ - Vue 3 - 渐进式 JavaScript 框架
18
+ - Vite - 下一代前端构建工具
19
+ - Marked - Markdown 解析器
20
+ - Mermaid - 图表渲染库
21
+ - Lucide Vue - 图标库
22
+
23
+ ## 项目结构
24
+
25
+ ```
26
+ md2ui/
27
+ ├── public/ # 静态资源
28
+ │ ├── README.md # 首页内容
29
+ │ └── docs/ # 文档目录
30
+ │ ├── 00-项目概览.md
31
+ │ ├── 代码结构/
32
+ │ └── 架构设计/
33
+ ├── src/
34
+ │ ├── api/ # API 接口
35
+ │ │ └── docs.js # 文档列表获取
36
+ │ ├── components/ # 组件
37
+ │ │ ├── TreeNode.vue # 树形节点
38
+ │ │ └── TableOfContents.vue # 目录组件
39
+ │ ├── composables/ # 组合式函数
40
+ │ │ ├── useMarkdown.js # Markdown 渲染
41
+ │ │ ├── useScroll.js # 滚动处理
42
+ │ │ └── useResize.js # 拖拽调整
43
+ │ ├── App.vue # 主组件
44
+ │ ├── main.js # 入口文件
45
+ │ └── style.css # 全局样式
46
+ ├── index.html # HTML 模板
47
+ ├── vite.config.js # Vite 配置
48
+ └── package.json # 项目配置
49
+ ```
50
+
51
+ ## 快速开始
52
+
53
+ ### 安装依赖
54
+
55
+ ```bash
56
+ pnpm install
57
+ ```
58
+
59
+ ### 开发模式
60
+
61
+ ```bash
62
+ pnpm dev
63
+ ```
64
+
65
+ 访问 http://localhost:3000
66
+
67
+ ### 构建生产版本
68
+
69
+ ```bash
70
+ pnpm build
71
+ ```
72
+
73
+ ### 预览生产版本
74
+
75
+ ```bash
76
+ pnpm preview
77
+ ```
78
+
79
+ ## 文档组织
80
+
81
+ ### 目录结构
82
+
83
+ 文档放在 `public/docs/` 目录下,支持多级嵌套:
84
+
85
+ ```
86
+ public/docs/
87
+ ├── 00-项目概览.md
88
+ ├── 代码结构/
89
+ │ ├── 业务层/
90
+ │ │ └── service包说明.md
91
+ │ └── 基础设施/
92
+ │ └── config包说明.md
93
+ └── 架构设计/
94
+ └── 01-核心业务流程.md
95
+ ```
96
+
97
+ ### 文件命名规范
98
+
99
+ - 使用 `序号-名称.md` 格式,如 `00-项目概览.md`
100
+ - 序号用于控制排序,数字越小越靠前
101
+ - 文件夹也可以使用序号前缀
102
+
103
+ ### 首页内容
104
+
105
+ 首页内容来自 `public/README.md` 文件,可以自定义项目介绍、快速开始等内容。
106
+
107
+ ## 功能说明
108
+
109
+ ### 左侧导航栏
110
+
111
+ - 显示文档目录树
112
+ - 支持文件夹展开/折叠
113
+ - 支持全部展开/收起
114
+ - 可拖拽调整宽度
115
+ - 可收起/展开
116
+
117
+ ### 中间内容区
118
+
119
+ - 渲染 Markdown 文档
120
+ - 支持代码高亮
121
+ - 支持 Mermaid 图表
122
+ - 显示阅读进度
123
+ - 返回顶部按钮
124
+
125
+ ### 右侧目录
126
+
127
+ - 自动提取文档标题
128
+ - 支持多级标题
129
+ - 点击跳转到对应位置
130
+ - 高亮当前阅读位置
131
+ - 可拖拽调整宽度
132
+ - 可收起/展开
133
+
134
+ ## 自定义配置
135
+
136
+ ### 修改端口
137
+
138
+ 编辑 `vite.config.js`:
139
+
140
+ ```javascript
141
+ export default defineConfig({
142
+ server: {
143
+ port: 3000 // 修改为你想要的端口
144
+ }
145
+ })
146
+ ```
147
+
148
+ ### 修改标题
149
+
150
+ 编辑 `index.html`:
151
+
152
+ ```html
153
+ <title>你的项目名称</title>
154
+ ```
155
+
156
+ 编辑 `src/App.vue` 中的 logo 部分:
157
+
158
+ ```vue
159
+ <div class="logo">
160
+ <h2>📚 你的项目名称</h2>
161
+ </div>
162
+ ```
163
+
164
+ 或修改 `src/components/Logo.vue` 中的 logo-text。
165
+
166
+ ### 自定义样式
167
+
168
+ 编辑 `src/style.css` 文件,可以修改颜色、字体、间距等样式。
169
+
170
+ ## 部署
171
+
172
+ ### 静态部署
173
+
174
+ 构建后将 `dist` 目录部署到任何静态服务器:
175
+
176
+ ```bash
177
+ pnpm build
178
+ ```
179
+
180
+ ### Nginx 配置示例
181
+
182
+ ```nginx
183
+ server {
184
+ listen 80;
185
+ server_name your-domain.com;
186
+ root /path/to/dist;
187
+ index index.html;
188
+
189
+ location / {
190
+ try_files $uri $uri/ /index.html;
191
+ }
192
+ }
193
+ ```
194
+
195
+ ## 开发指南
196
+
197
+ ### 添加新功能
198
+
199
+ 1. 在 `src/composables/` 创建组合式函数
200
+ 2. 在 `src/components/` 创建 Vue 组件
201
+ 3. 在 `src/App.vue` 中引入使用
202
+
203
+ ### 代码规范
204
+
205
+ - 使用 Vue 3 Composition API
206
+ - 组件使用 `<script setup>` 语法
207
+ - 提取可复用逻辑到 composables
208
+ - 保持组件职责单一
209
+
210
+ ## 常见问题
211
+
212
+ ### 文档不显示?
213
+
214
+ 检查文档路径是否正确,确保文件在 `public/docs/` 目录下。
215
+
216
+ ### Mermaid 图表不渲染?
217
+
218
+ 确保代码块使用 ` ```mermaid ` 标记,并检查图表语法是否正确。
219
+
220
+ ### 样式显示异常?
221
+
222
+ 清除浏览器缓存,或使用无痕模式测试。
223
+
224
+ ## 许可证
225
+
226
+ MIT License
227
+
228
+ ## 贡献
229
+
230
+ 欢迎提交 Issue 和 Pull Request!
package/bin/md2ui.js ADDED
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { createServer } from 'vite'
4
+ import { fileURLToPath } from 'url'
5
+ import { dirname, resolve } from 'path'
6
+ import fs from 'fs'
7
+
8
+ // 获取 CLI 工具所在目录(即 md2ui 包的安装目录)
9
+ const __filename = fileURLToPath(import.meta.url)
10
+ const __dirname = dirname(__filename)
11
+ const pkgRoot = resolve(__dirname, '..')
12
+
13
+ // 用户执行命令的目录
14
+ const userDir = process.cwd()
15
+
16
+ // 解析命令行参数
17
+ const args = process.argv.slice(2)
18
+ let port = 5000
19
+
20
+ for (let i = 0; i < args.length; i++) {
21
+ if (args[i] === '-p' || args[i] === '--port') {
22
+ port = parseInt(args[i + 1]) || 5000
23
+ }
24
+ }
25
+
26
+ // 虚拟模块插件:动态提供用户目录的文档列表
27
+ function docsPlugin() {
28
+ const virtualModuleId = 'virtual:user-docs'
29
+ const resolvedVirtualModuleId = '\0' + virtualModuleId
30
+
31
+ return {
32
+ name: 'user-docs-plugin',
33
+ resolveId(id) {
34
+ if (id === virtualModuleId) {
35
+ return resolvedVirtualModuleId
36
+ }
37
+ },
38
+ load(id) {
39
+ if (id === resolvedVirtualModuleId) {
40
+ // 扫描用户目录下的 md 文件
41
+ const docs = scanDocs(userDir)
42
+ return `export default ${JSON.stringify(docs)}`
43
+ }
44
+ }
45
+ }
46
+ }
47
+
48
+ // 扫描目录下的 md 文件
49
+ function scanDocs(dir, basePath = '', level = 0) {
50
+ const items = []
51
+
52
+ if (!fs.existsSync(dir)) return items
53
+
54
+ const entries = fs.readdirSync(dir, { withFileTypes: true })
55
+ .filter(e => !e.name.startsWith('.') && e.name !== 'node_modules')
56
+ .sort((a, b) => a.name.localeCompare(b.name, 'zh-CN'))
57
+
58
+ for (const entry of entries) {
59
+ const fullPath = resolve(dir, entry.name)
60
+ const relativePath = basePath ? `${basePath}/${entry.name}` : entry.name
61
+
62
+ if (entry.isDirectory()) {
63
+ const children = scanDocs(fullPath, relativePath, level + 1)
64
+ // 只有包含 md 文件的文件夹才加入目录
65
+ if (children.length > 0) {
66
+ const match = entry.name.match(/^(\d+)-(.+)$/)
67
+ items.push({
68
+ key: relativePath,
69
+ label: match ? match[2] : entry.name,
70
+ order: match ? parseInt(match[1]) : 999,
71
+ type: 'folder',
72
+ level,
73
+ expanded: true,
74
+ children
75
+ })
76
+ }
77
+ } else if (entry.name.endsWith('.md')) {
78
+ const match = entry.name.match(/^(\d+)-(.+)\.md$/)
79
+ const label = match ? match[2] : entry.name.replace(/\.md$/, '')
80
+ items.push({
81
+ key: relativePath.replace(/\.md$/, ''),
82
+ label,
83
+ order: match ? parseInt(match[1]) : 999,
84
+ type: 'file',
85
+ level,
86
+ path: `/@user-docs/${relativePath}`
87
+ })
88
+ }
89
+ }
90
+
91
+ // 按 order 排序
92
+ items.sort((a, b) => a.order - b.order)
93
+ return items
94
+ }
95
+
96
+ // 提供用户目录 md 文件的中间件
97
+ function serveUserDocs() {
98
+ return {
99
+ name: 'serve-user-docs',
100
+ configureServer(server) {
101
+ server.middlewares.use((req, res, next) => {
102
+ // 提供文档列表 API
103
+ if (req.url === '/@user-docs-list') {
104
+ const docs = scanDocs(userDir)
105
+ res.setHeader('Content-Type', 'application/json; charset=utf-8')
106
+ res.end(JSON.stringify(docs))
107
+ return
108
+ }
109
+ // 提供文档内容
110
+ if (req.url?.startsWith('/@user-docs/')) {
111
+ const filePath = resolve(userDir, decodeURIComponent(req.url.replace('/@user-docs/', '')))
112
+ if (fs.existsSync(filePath)) {
113
+ res.setHeader('Content-Type', 'text/plain; charset=utf-8')
114
+ res.end(fs.readFileSync(filePath, 'utf-8'))
115
+ return
116
+ }
117
+ }
118
+ next()
119
+ })
120
+ }
121
+ }
122
+ }
123
+
124
+ // 检查目录下是否有 md 文件
125
+ function hasMdFiles(dir) {
126
+ if (!fs.existsSync(dir)) return false
127
+
128
+ const entries = fs.readdirSync(dir, { withFileTypes: true })
129
+ .filter(e => !e.name.startsWith('.') && e.name !== 'node_modules')
130
+
131
+ for (const entry of entries) {
132
+ if (entry.isFile() && entry.name.endsWith('.md')) {
133
+ return true
134
+ }
135
+ if (entry.isDirectory()) {
136
+ if (hasMdFiles(resolve(dir, entry.name))) {
137
+ return true
138
+ }
139
+ }
140
+ }
141
+ return false
142
+ }
143
+
144
+ async function start() {
145
+ console.log(`\n md2ui - Markdown 文档预览工具\n`)
146
+ console.log(` 扫描目录: ${userDir}\n`)
147
+
148
+ // 检查是否有 md 文件
149
+ if (!hasMdFiles(userDir)) {
150
+ console.log(' 当前目录下没有找到 Markdown 文件 (.md)\n')
151
+ console.log(' 请在包含 .md 文件的目录中运行此命令\n')
152
+ process.exit(1)
153
+ }
154
+
155
+ const server = await createServer({
156
+ root: pkgRoot,
157
+ configFile: resolve(pkgRoot, 'vite.config.js'),
158
+ plugins: [docsPlugin(), serveUserDocs()],
159
+ server: {
160
+ port
161
+ }
162
+ })
163
+
164
+ await server.listen()
165
+ server.printUrls()
166
+ }
167
+
168
+ start().catch(console.error)
package/index.html ADDED
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <link rel="icon" type="image/svg+xml" href="/logo.svg">
7
+ <title>md2ui - Markdown 文档渲染系统</title>
8
+ <meta name="description" content="将本地 Markdown 文档转换为美观的 HTML 页面">
9
+ </head>
10
+ <body>
11
+ <div id="app"></div>
12
+ <script type="module" src="/src/main.js"></script>
13
+ </body>
14
+ </html>
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "md2ui",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "将本地 Markdown 文档转换为美观的 HTML 页面",
6
+ "author": "",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/your-username/md2ui"
11
+ },
12
+ "keywords": [
13
+ "markdown",
14
+ "documentation",
15
+ "viewer",
16
+ "mermaid",
17
+ "vue"
18
+ ],
19
+ "bin": {
20
+ "md2ui": "./bin/md2ui.js"
21
+ },
22
+ "scripts": {
23
+ "dev": "vite",
24
+ "build": "vite build",
25
+ "preview": "vite preview"
26
+ },
27
+ "files": [
28
+ "bin",
29
+ "src",
30
+ "public",
31
+ "index.html",
32
+ "vite.config.js"
33
+ ],
34
+ "dependencies": {
35
+ "@vitejs/plugin-vue": "^5.0.0",
36
+ "crypto-js": "^4.2.0",
37
+ "lucide-vue-next": "^0.556.0",
38
+ "marked": "^11.1.1",
39
+ "mermaid": "^10.6.1",
40
+ "vite": "^5.0.0",
41
+ "vue": "^3.4.0"
42
+ },
43
+ "devDependencies": {
44
+ "@types/crypto-js": "^4.2.2"
45
+ }
46
+ }
@@ -0,0 +1,106 @@
1
+ # md2ui
2
+
3
+ 一个轻量级的文档渲染系统,将本地 Markdown 文档转换为美观的 HTML 页面。
4
+
5
+ ## 项目简介
6
+
7
+ md2ui 是一个基于 Vue 3 开发的前端文档展示工具,专注于将 Markdown 文档以清晰、易读的方式呈现。它会自动扫描文档目录,构建导航树,并提供流畅的阅读体验。
8
+
9
+ ## 核心特性
10
+
11
+ - **自动化目录** - 扫描文档文件夹,自动生成多级导航树
12
+ - **三栏布局** - 左侧导航、中间内容、右侧大纲,布局清晰
13
+ - **Markdown 增强** - 支持 GFM 语法、代码高亮、Mermaid 图表
14
+ - **交互优化** - 可拖拽调整宽度、折叠侧边栏、阅读进度显示
15
+ - **响应式设计** - 适配不同屏幕尺寸
16
+
17
+ ## 技术栈
18
+
19
+ - Vue 3 + Vite
20
+ - Marked (Markdown 解析)
21
+ - Mermaid (图表渲染)
22
+ - Lucide Vue (图标库)
23
+
24
+ ## 快速开始
25
+
26
+ ```bash
27
+ # 安装依赖
28
+ pnpm install
29
+
30
+ # 启动开发服务器
31
+ pnpm dev
32
+
33
+ # 构建生产版本
34
+ pnpm build
35
+ ```
36
+
37
+ ## 使用说明
38
+
39
+ ### 文档组织
40
+
41
+ 将你的 Markdown 文档放在 `public/docs/` 目录下:
42
+
43
+ ```
44
+ public/docs/
45
+ ├── 00-项目概览.md
46
+ ├── 代码结构/
47
+ │ ├── 业务层/
48
+ │ └── 基础设施/
49
+ └── 架构设计/
50
+ └── 01-核心流程.md
51
+ ```
52
+
53
+ ### 文件命名
54
+
55
+ 使用 `序号-名称.md` 格式控制排序,例如:
56
+ - `00-项目概览.md`
57
+ - `01-快速开始.md`
58
+ - `02-架构设计.md`
59
+
60
+ 序号越小,在导航中的位置越靠前。
61
+
62
+ ### 首页内容
63
+
64
+ 编辑 `public/README.md` 文件即可自定义首页内容。
65
+
66
+ ## 功能说明
67
+
68
+ ### 左侧导航
69
+ - 展示文档目录树结构
70
+ - 支持文件夹展开/折叠
71
+ - 可拖拽调整宽度
72
+ - 一键全部展开/收起
73
+
74
+ ### 中间内容区
75
+ - 渲染 Markdown 文档
76
+ - 支持代码语法高亮
77
+ - 支持 Mermaid 流程图、时序图等
78
+ - 显示阅读进度和返回顶部按钮
79
+
80
+ ### 右侧大纲
81
+ - 自动提取文档标题生成目录
82
+ - 点击跳转到对应章节
83
+ - 高亮当前阅读位置
84
+ - 可拖拽调整宽度
85
+
86
+ ## 部署
87
+
88
+ 构建后将 `dist` 目录部署到任何静态服务器:
89
+
90
+ ```bash
91
+ pnpm build
92
+ ```
93
+
94
+ 支持部署到 Nginx、Apache、GitHub Pages、Vercel 等平台。
95
+
96
+ ## 适用场景
97
+
98
+ - 项目技术文档站点
99
+ - API 接口文档
100
+ - 开发规范手册
101
+ - 架构设计文档
102
+ - 团队知识库
103
+
104
+ ## 许可证
105
+
106
+ MIT License
@@ -0,0 +1,51 @@
1
+ # 快速开始
2
+
3
+ 欢迎使用 md2ui,本指南将帮助你在几分钟内启动项目。
4
+
5
+ ## 环境要求
6
+
7
+ - Node.js 18+
8
+ - pnpm 8+
9
+
10
+ ## 安装步骤
11
+
12
+ ```bash
13
+ # 克隆项目
14
+ git clone https://github.com/your-username/md2ui.git
15
+ cd md2ui
16
+
17
+ # 安装依赖
18
+ pnpm install
19
+
20
+ # 启动开发服务器
21
+ pnpm dev
22
+ ```
23
+
24
+ 启动后访问 http://localhost:5173 即可看到文档界面。
25
+
26
+ ## 添加你的文档
27
+
28
+ 将 Markdown 文件放入 `public/docs/` 目录:
29
+
30
+ ```
31
+ public/docs/
32
+ ├── 00-快速开始.md
33
+ ├── 01-使用指南.md
34
+ └── 02-进阶配置/
35
+ ├── 01-主题定制.md
36
+ └── 02-部署方案.md
37
+ ```
38
+
39
+ 文件名前的数字用于控制排序,数字越小越靠前。
40
+
41
+ ## 构建部署
42
+
43
+ ```bash
44
+ # 构建生产版本
45
+ pnpm build
46
+
47
+ # 本地预览
48
+ pnpm preview
49
+ ```
50
+
51
+ 构建产物在 `dist/` 目录,可部署到任意静态服务器。
@@ -0,0 +1,57 @@
1
+ # 功能特性
2
+
3
+ md2ui 提供了丰富的功能,让文档阅读体验更加流畅。
4
+
5
+ ## 三栏布局
6
+
7
+ 界面采用经典的三栏布局设计:
8
+
9
+ - 左侧:文档导航树,支持多级目录
10
+ - 中间:文档内容区,渲染 Markdown
11
+ - 右侧:文档大纲,快速跳转章节
12
+
13
+ 所有栏目都支持拖拽调整宽度,也可以折叠隐藏。
14
+
15
+ ## Markdown 增强
16
+
17
+ 支持 GitHub Flavored Markdown (GFM) 语法:
18
+
19
+ ### 代码高亮
20
+
21
+ ```javascript
22
+ // 支持多种语言的语法高亮
23
+ function greet(name) {
24
+ return `Hello, ${name}!`
25
+ }
26
+ ```
27
+
28
+ ```python
29
+ # Python 代码示例
30
+ def fibonacci(n):
31
+ if n <= 1:
32
+ return n
33
+ return fibonacci(n-1) + fibonacci(n-2)
34
+ ```
35
+
36
+ ### 表格
37
+
38
+ | 功能 | 描述 | 状态 |
39
+ |------|------|------|
40
+ | 代码高亮 | 支持多种编程语言 | 已完成 |
41
+ | Mermaid 图表 | 流程图、时序图等 | 已完成 |
42
+ | 数学公式 | LaTeX 语法支持 | 计划中 |
43
+
44
+ ### 任务列表
45
+
46
+ - [x] 基础 Markdown 渲染
47
+ - [x] 代码语法高亮
48
+ - [x] Mermaid 图表支持
49
+ - [ ] 全文搜索
50
+ - [ ] 多主题切换
51
+
52
+ ## 交互体验
53
+
54
+ - 阅读进度显示
55
+ - 返回顶部按钮
56
+ - 图片点击放大
57
+ - URL 路由支持(可分享链接)