@v1hz/md2docx 2.6.0 → 2.7.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 +128 -373
- package/dist/index.js +248 -98
- package/dist-electron/main.js +152506 -0
- package/package.json +24 -3
package/README.md
CHANGED
|
@@ -17,466 +17,221 @@
|
|
|
17
17
|
|
|
18
18
|
## 功能
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
| 去除分隔符 | 默认移除 `---`、`***`、`___` 等分隔符行,减少无用页面间距 |
|
|
32
|
-
| 集中缓存 | 中间文件统一存储到 `~/.md2docx/`,不会在当前目录创建 `tmp/` |
|
|
33
|
-
| Node 与可执行版本 | 支持 npm CLI,也支持构建不依赖 Node.js/Bun 的 Windows 可执行文件 |
|
|
20
|
+
- **文档标题** — 从 YAML frontmatter、H1 或文件名提取
|
|
21
|
+
- **标题归一化** — 最浅标题 → H1,修复层级跳跃
|
|
22
|
+
- **标题编号** — `1`、`1.1`、`1.1.1`,可剥离已有中英文编号
|
|
23
|
+
- **表格与图片题注** — "表 1"、"图 1:标题"
|
|
24
|
+
- **图片尺寸限制** — 等比缩小超限图片
|
|
25
|
+
- **Mermaid 渲染** — beautiful-mermaid + resvg-wasm → 高 DPI PNG
|
|
26
|
+
- **Word 样式** — 受控语义化配置 / 完整底层样式 / 从 DOCX 提取
|
|
27
|
+
- **预设系统** — 可切换、可继承默认值的配置与样式预设
|
|
28
|
+
- **Markdown 格式化** — 只运行预处理流水线
|
|
29
|
+
- **集中缓存** — `~/.md2docx/`,工作目录保持干净
|
|
30
|
+
- **双构建** — npm CLI + Windows 单文件 EXE
|
|
34
31
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
本仓库提供 [`SKILL.md`](SKILL.md),是供 AI 代码助手(如 Zed、Cursor、GitHub Copilot)使用的技能描述文件。在 AI 对话中引用此文件,AI 就能正确使用 `md2docx` CLI 完成转换、格式化、样式定制和导出等操作。
|
|
32
|
+
---
|
|
38
33
|
|
|
39
|
-
##
|
|
34
|
+
## 桌面应用
|
|
40
35
|
|
|
41
|
-
|
|
36
|
+
仓库包含基于 Electron + Vue 3 + Vite + Tailwind CSS 的桌面端(早期开发阶段)。应用图标以立体 Markdown 卡片、转换箭头和 Word 文档构成,在标题栏小尺寸与桌面大图标下保持一致识别。标题栏使用 `titleBarStyle: "hidden"` 自定义内容区域并在各平台保留原生窗口控制按钮。系统拖入的文件通过 preload 中的 `webUtils.getPathForFile()` 解析本地路径。桌面转换复用完整 CLI 流水线与预设,支持源文件目录、指定文件夹或每次询问三种输出位置,以及覆盖、自动重命名或每次询问三种同名文件策略。成功文件会从队列收入标题栏转换记录;点击记录按钮后,每个文件都可独立打开、定位或重新加入文件列表,之后按当前转换设置再次转换。设置以居中模态窗口展示,可检测 Pandoc,并通过可视化编辑器调整转换规则、图片与图表行为和语义化 Word 样式;打开时弹窗以短暂的淡入、上移动画进入,标题栏设置按钮同时显示蓝色激活状态,并遵守系统的“减少动态效果”偏好。内置 `default` 只读,自定义时保存为新的用户预设,用户预设可直接编辑。设置中的选择器使用应用内统一菜单,支持鼠标和完整键盘操作,不依赖平台原生网页下拉样式。Windows 安装版启动后会静默检查 GitHub Release 更新;发现版本时显示非阻塞通知条,下载期间可继续工作,完成后由用户选择重新启动。设置页也可手动检查;便携版不会尝试自动安装。复制、重命名和删除位于更多菜单,未保存的编辑在离开前会确认。偏好与记录仅保存在本机。旧版扁平桌面设置会继续生效,并在下次保存时迁移到共享格式。转换记录最多保留 30 条;`Ctrl/⌘ + Enter` 可直接开始转换。
|
|
42
37
|
|
|
43
|
-
|
|
38
|
+
主界面右侧始终提供转换设置侧边栏,即使文件列表为空也可提前调整。它与预设编辑器使用同一套字段和视觉样式;选择预设会重置侧边栏并同步默认预设,随后直接调整只影响桌面转换,不会改写预设。主界面右上角的固定侧边栏按钮或 `Ctrl+Alt+B` 可显示/隐藏它;按钮不会随侧边栏展开移动,设置与显示状态会自动保存在本机,并作为配置快照应用于下一批文件。开发模式为每次 `bun run dev` 使用独立的 Chromium 会话缓存,避免残留开发实例争用缓存目录。
|
|
44
39
|
|
|
45
|
-
|
|
46
|
-
- [Pandoc](https://pandoc.org/installing.html),并确保 `pandoc` 可通过 `PATH` 调用;图片尺寸限制需要 Pandoc 3.1.13+
|
|
40
|
+
主界面右上角另有纯图标编辑按钮,可在文件列表与 Markdown 文本编辑器之间切换。用户可直接粘贴文本、设置文档名称并使用当前侧边栏配置转换;文本由主进程安全物化为应用私有目录中的临时 Markdown 文件,再进入与文件转换相同的完整流水线。编辑按钮属于文件工作区,会在侧边栏展开时随工作区边缘左移,而侧边栏按钮保持固定。输出位置设置为“源文件目录”时,文本编辑器转换会弹出 DOCX 保存位置选择;从转换记录重新加入源文件时会自动返回文件列表。
|
|
47
41
|
|
|
48
42
|
```bash
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
bun run build:electron # 构建主进程与 preload
|
|
44
|
+
bun run electron # 构建 Electron 与前端并启动
|
|
45
|
+
bun run dev # 启动前端开发服务器与 Electron
|
|
46
|
+
bun run pack # 构建支持自动更新的 Windows 安装版
|
|
47
|
+
bun run pack:portable # 构建不自动安装更新的便携版
|
|
52
48
|
```
|
|
53
49
|
|
|
54
|
-
|
|
50
|
+
开发模式会自动显示一次更新通知预览;关闭后可在设置底部点“预览更新”再次查看。预览下载仅模拟进度,不访问更新服务器,也不会退出或安装。
|
|
51
|
+
|
|
52
|
+
## AI 辅助
|
|
53
|
+
|
|
54
|
+
[`SKILL.md`](SKILL.md) 供 AI 代码助手引用,使其正确使用 md2docx CLI。
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 安装
|
|
59
|
+
|
|
60
|
+
前置:Node.js 22.12+, [Pandoc](https://pandoc.org/installing.html)(需在 PATH 中;图片尺寸限制需 Pandoc 3.1.13+)
|
|
55
61
|
|
|
56
62
|
```bash
|
|
63
|
+
npm install -g @v1hz/md2docx
|
|
64
|
+
# 或
|
|
57
65
|
npx @v1hz/md2docx report.md
|
|
58
66
|
```
|
|
59
67
|
|
|
60
68
|
## 快速开始
|
|
61
69
|
|
|
62
70
|
```bash
|
|
63
|
-
#
|
|
64
|
-
md2docx report.md
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
md2docx --file report.md --output output/report.docx
|
|
68
|
-
|
|
69
|
-
# 使用自定义配置、底层样式和语义化样式配置
|
|
70
|
-
md2docx -f report.md -c config.json --style-raw style-raw.json --style-config style-config.json
|
|
71
|
-
|
|
72
|
-
# 保存并使用预设
|
|
73
|
-
md2docx preset save --name academic --config config.json --style-config style-config.json
|
|
71
|
+
md2docx report.md # 仅路径
|
|
72
|
+
md2docx -f report.md -o output.docx # 带选项(必须有 --file)
|
|
73
|
+
md2docx -f report.md -c config.json --style-raw raw.json --style-config style-config.json
|
|
74
|
+
md2docx preset save --name academic --config config.json
|
|
74
75
|
md2docx preset use academic
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
md2docx
|
|
78
|
-
|
|
79
|
-
# 导出内置默认配置、底层样式和语义化样式配置
|
|
80
|
-
md2docx export config
|
|
81
|
-
md2docx export style-raw
|
|
82
|
-
md2docx export style-config
|
|
83
|
-
|
|
84
|
-
# 从现有 DOCX 提取样式
|
|
85
|
-
md2docx export style-raw -f template.docx
|
|
86
|
-
|
|
87
|
-
# 删除 ~/.md2docx 中的中间文件和缓存
|
|
88
|
-
md2docx clean
|
|
76
|
+
md2docx format -f report.md # 只格式化
|
|
77
|
+
md2docx export config # 导出配置
|
|
78
|
+
md2docx export style-raw -f template.docx # 从 DOCX 提取样式
|
|
79
|
+
md2docx clean # 清除缓存
|
|
89
80
|
```
|
|
90
81
|
|
|
91
82
|
所有写文件命令默认覆盖已有输出。
|
|
92
83
|
|
|
84
|
+
---
|
|
85
|
+
|
|
93
86
|
## CLI 参考
|
|
94
87
|
|
|
95
|
-
```
|
|
88
|
+
```text
|
|
96
89
|
md2docx <markdown>
|
|
97
90
|
md2docx -f <markdown> [转换选项]
|
|
98
91
|
md2docx format -f <markdown> [选项]
|
|
99
|
-
md2docx export config [选项]
|
|
100
|
-
md2docx
|
|
101
|
-
md2docx export style-config [选项]
|
|
102
|
-
md2docx preset list
|
|
103
|
-
md2docx preset use <name>
|
|
104
|
-
md2docx preset save --name <name> [配置选项]
|
|
92
|
+
md2docx export config|style-raw|style-config [选项]
|
|
93
|
+
md2docx preset list|use <name>|save --name <name> [选项]
|
|
105
94
|
md2docx clean
|
|
106
95
|
```
|
|
107
96
|
|
|
108
|
-
###
|
|
97
|
+
### 转换选项
|
|
109
98
|
|
|
110
|
-
| 参数 | 说明
|
|
111
|
-
| ----------------------- |
|
|
112
|
-
| `<markdown>` |
|
|
113
|
-
| `-f, --file <path>` | Markdown
|
|
114
|
-
| `--preset <name>` |
|
|
115
|
-
| `-c, --config <path>` |
|
|
116
|
-
| `--style-raw <path>` |
|
|
117
|
-
| `--style-config <path>` |
|
|
118
|
-
| `-o, --output <path>` | DOCX
|
|
119
|
-
| `-h, --help` | 显示帮助 |
|
|
120
|
-
| `-v, --version` | 显示版本号 |
|
|
99
|
+
| 参数 | 说明 |
|
|
100
|
+
| ----------------------- | ---------------------------- |
|
|
101
|
+
| `<markdown>` | 位置参数,仅无其他选项时可用 |
|
|
102
|
+
| `-f, --file <path>` | Markdown 输入 |
|
|
103
|
+
| `--preset <name>` | 本次指定预设 |
|
|
104
|
+
| `-c, --config <path>` | 配置 JSON |
|
|
105
|
+
| `--style-raw <path>` | 底层 Word 样式 JSON |
|
|
106
|
+
| `--style-config <path>` | 语义化样式配置 JSON |
|
|
107
|
+
| `-o, --output <path>` | DOCX 输出 |
|
|
121
108
|
|
|
122
|
-
|
|
109
|
+
位置参数不能与 `--file` 或其他选项混用。`format --file` 必填,支持 `--preset`/`--config`/`--output`,不接受样式参数,不调用 Pandoc。
|
|
123
110
|
|
|
124
|
-
|
|
125
|
-
md2docx report.md # 正确
|
|
126
|
-
md2docx report.md -o report.docx # 错误
|
|
127
|
-
md2docx -f report.md -o report.docx # 正确
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### format
|
|
131
|
-
|
|
132
|
-
`format` 运行完整 Markdown 预处理,但不生成 DOCX,也不调用 Pandoc。
|
|
133
|
-
|
|
134
|
-
| 参数 | 说明 |
|
|
135
|
-
| --------------------- | ------------------------------------------- |
|
|
136
|
-
| `-f, --file <path>` | 必填,Markdown 输入文件 |
|
|
137
|
-
| `--preset <name>` | 使用预设中的 `config.json` |
|
|
138
|
-
| `-c, --config <path>` | 自定义配置 JSON |
|
|
139
|
-
| `-o, --output <path>` | 输出 Markdown,默认 `<文件名>_formatted.md` |
|
|
140
|
-
|
|
141
|
-
### export
|
|
142
|
-
|
|
143
|
-
```bash
|
|
144
|
-
md2docx export config [-o config.json]
|
|
145
|
-
md2docx export style-raw [-f template.docx] [-o style-raw.json]
|
|
146
|
-
md2docx export style-config [-o style-config.json]
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
`export config` 导出内置 Markdown 处理配置。`export style-raw` 不带 `--file` 时导出内置底层 Word 样式;指定 DOCX 时从该文档提取底层样式。`export style-config` 导出默认语义化样式配置。
|
|
150
|
-
|
|
151
|
-
### preset
|
|
152
|
-
|
|
153
|
-
```bash
|
|
154
|
-
md2docx preset list
|
|
155
|
-
md2docx preset use academic
|
|
156
|
-
md2docx preset use default
|
|
157
|
-
md2docx preset save --name academic \
|
|
158
|
-
--config config.json \
|
|
159
|
-
--style-raw style-raw.json \
|
|
160
|
-
--style-config style-config.json
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
用户预设位于 `~/.md2docx/presets/<name>/`,其中三个标准 JSON 文件都可省略;缺失项逐一继承系统内置 `default`。文件存在但内容无效时会报错。`preset save` 至少需要一个配置文件,同名保存会完整替换旧预设,未提供的类型改为继承默认值。`--preset` 只影响本次执行,`preset use` 会持久化默认选择。
|
|
164
|
-
|
|
165
|
-
### clean
|
|
166
|
-
|
|
167
|
-
```bash
|
|
168
|
-
md2docx clean
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
`clean` 只删除 `~/.md2docx/` 下可重建的预处理文件、物化资源和样式缓存,保留 `presets/` 与 `settings.json`。命令拒绝跟随符号链接,且可重复执行。
|
|
172
|
-
|
|
173
|
-
npm 卸载不会可靠地清理用户数据。卸载前如需清理,请显式运行:
|
|
174
|
-
|
|
175
|
-
```bash
|
|
176
|
-
md2docx clean
|
|
177
|
-
npm uninstall -g @v1hz/md2docx
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
## 默认输出
|
|
111
|
+
### 默认输出
|
|
181
112
|
|
|
182
113
|
```text
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
md2docx export style-config → ./style-config.json
|
|
114
|
+
report.md → ./report.docx
|
|
115
|
+
format -f report.md → ./report_formatted.md
|
|
116
|
+
export config → ./config.json
|
|
117
|
+
export style-raw → ./style-raw.json
|
|
118
|
+
export style-raw -f t.docx → ./t_style-raw.json
|
|
119
|
+
export style-config → ./style-config.json
|
|
190
120
|
```
|
|
191
121
|
|
|
192
|
-
|
|
122
|
+
---
|
|
193
123
|
|
|
194
|
-
|
|
124
|
+
## 中间文件
|
|
195
125
|
|
|
196
|
-
```
|
|
126
|
+
```
|
|
197
127
|
~/.md2docx/
|
|
198
|
-
├── settings.json
|
|
199
|
-
├──
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
│ ├── style-raw.json(可选)
|
|
203
|
-
│ └── style-config.json(可选)
|
|
204
|
-
├── preprocess/
|
|
205
|
-
│ └── <输入文件名>-<绝对路径哈希>/
|
|
206
|
-
│ ├── <输入文件名>_formatted.md
|
|
207
|
-
│ └── mermaid_*.png
|
|
208
|
-
├── resources/
|
|
209
|
-
│ ├── default/
|
|
210
|
-
│ │ ├── config.json
|
|
211
|
-
│ │ ├── style-config.json
|
|
212
|
-
│ │ └── style-raw.json
|
|
213
|
-
│ ├── add-inline-code.lua
|
|
214
|
-
│ └── limit-image-size.lua
|
|
215
|
-
└── style/
|
|
216
|
-
└── <样式内容哈希>.docx
|
|
128
|
+
├── settings.json + presets/ # 持久数据,clean 保留
|
|
129
|
+
├── preprocess/<basename>-<hash:12>/ # 预处理 Markdown + Mermaid PNG
|
|
130
|
+
├── resources/default/*.json + *.lua # 物化的内置资源
|
|
131
|
+
└── style/<hash:16>.docx # reference DOCX 缓存
|
|
217
132
|
```
|
|
218
133
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
输出 DOCX 和显式导出的配置、样式仍写到用户指定位置或当前工作目录,不会写入缓存目录。
|
|
134
|
+
预处理目录用输入绝对路径 SHA-256 前 12 位,不同目录的同名文件隔离。Pandoc 读取缓存 Markdown 时以原始 Markdown 目录为优先资源搜索路径。
|
|
222
135
|
|
|
223
|
-
|
|
136
|
+
---
|
|
224
137
|
|
|
225
138
|
## 配置
|
|
226
139
|
|
|
227
|
-
内置配置来自 `config/default/config.json
|
|
140
|
+
内置配置来自 `config/default/config.json`(`config/config.schema.json` 提供校验)。推荐先导出再编辑:
|
|
228
141
|
|
|
229
142
|
```bash
|
|
230
143
|
md2docx export config
|
|
231
144
|
md2docx -f report.md -c config.json
|
|
232
145
|
```
|
|
233
146
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
|
237
|
-
|
|
|
238
|
-
| `
|
|
239
|
-
| `
|
|
240
|
-
| `
|
|
241
|
-
| `
|
|
242
|
-
| `
|
|
243
|
-
| `
|
|
244
|
-
| `figureCaption.enabled` | 为独立图片添加题注 | `true` |
|
|
245
|
-
| `figureCaption.format` | 图片编号格式 | `"图 {n}"` |
|
|
246
|
-
| `figureCaption.separator` | 图片编号与标题之间的分隔符 | `":"` |
|
|
247
|
-
| `tableCaption.enabled` | 为表格添加题注 | `true` |
|
|
248
|
-
| `tableCaption.format` | 表格编号格式 | `"表 {n}"` |
|
|
249
|
-
| `tableCaption.separator` | 表格编号与标题之间的分隔符 | `" "` |
|
|
250
|
-
| `renderMermaid.enabled` | 将 Mermaid 渲染为 PNG | `true` |
|
|
251
|
-
| `renderMermaid.theme` | beautiful-mermaid 主题 | `"tokyo-night-light"` |
|
|
252
|
-
| `renderMermaid.density` | PNG 输出 DPI,最小值 72 | `200` |
|
|
253
|
-
| `imageSize.enabled` | 等比缩小超过尺寸限制的图片 | `true` |
|
|
254
|
-
| `imageSize.maxWidthCm` | DOCX 图片最大宽度(厘米) | `12` |
|
|
255
|
-
| `imageSize.maxHeightCm` | DOCX 图片最大高度(厘米) | `12` |
|
|
256
|
-
| `removeThematicBreaks.enabled` | 移除 `---`、`***`、`___` 等分隔符行 | `true` |
|
|
257
|
-
|
|
258
|
-
图片尺寸限制在 Pandoc 生成 DOCX 前通过 Lua filter 应用。程序读取图片像素尺寸和 DPI,仅缩小超限图片,不会放大小图;宽度和高度使用同一缩放比例。Markdown 中已经显式设置 `width` 或 `height` 的图片视为用户覆盖,不应用全局限制。单张图片无法读取尺寸时会输出警告并继续转换。
|
|
259
|
-
|
|
260
|
-
## 样式定制
|
|
261
|
-
|
|
262
|
-
普通用户推荐使用受控的语义化样式配置,只修改程序明确开放的高频选项。其余颜色、尺寸、对齐方式、间距和 Word 样式继承关系继续由内置预设管理。
|
|
263
|
-
|
|
264
|
-
仓库中的 `config/default/style-config.json` 是可直接复制和修改的默认配置,`config/style-config.schema.json` 用于编辑器提示和校验。完整底层 Word 样式位于 `config/default/style-raw.json`。
|
|
265
|
-
|
|
266
|
-
```json
|
|
267
|
-
{
|
|
268
|
-
"$schema": "https://raw.githubusercontent.com/WXY-V1hZ/md2docx/main/config/style-config.schema.json",
|
|
269
|
-
"schemaVersion": 1,
|
|
270
|
-
"options": {
|
|
271
|
-
"body": {
|
|
272
|
-
"firstLineIndent": false,
|
|
273
|
-
"lineSpacing": "onePointFive"
|
|
274
|
-
},
|
|
275
|
-
"headings": {
|
|
276
|
-
"1": {
|
|
277
|
-
"startOnNewPage": false,
|
|
278
|
-
"alignment": "left",
|
|
279
|
-
"bold": true
|
|
280
|
-
},
|
|
281
|
-
"2": {
|
|
282
|
-
"bold": true
|
|
283
|
-
},
|
|
284
|
-
"3": {
|
|
285
|
-
"bold": true
|
|
286
|
-
},
|
|
287
|
-
"4": {
|
|
288
|
-
"bold": true,
|
|
289
|
-
"italic": false
|
|
290
|
-
},
|
|
291
|
-
"5": {
|
|
292
|
-
"bold": true,
|
|
293
|
-
"italic": false
|
|
294
|
-
},
|
|
295
|
-
"6": {
|
|
296
|
-
"bold": true,
|
|
297
|
-
"italic": false
|
|
298
|
-
}
|
|
299
|
-
},
|
|
300
|
-
"inlineCode": {
|
|
301
|
-
"background": false
|
|
302
|
-
},
|
|
303
|
-
"codeBlock": {
|
|
304
|
-
"border": false
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
```
|
|
147
|
+
| 配置项 | 说明 | 默认值 |
|
|
148
|
+
| --------------------------------------------------------- | ----------------------------------------------- | -------------------------------------- |
|
|
149
|
+
| `detectTitle.enabled / strategy` | 自动设置标题 / first-h1/single-h1/filename/none | `true` / `"first-h1"` |
|
|
150
|
+
| `normalizeHeadings.enabled` | 修正标题层级 | `true` |
|
|
151
|
+
| `numberHeadings.{enabled,detectExisting,useBuiltinRules}` | 标题编号 / 剥离已有编号 | `true` / `true` / `true` |
|
|
152
|
+
| `figureCaption.{enabled,format,separator}` | 图片题注 / `"图 {n}"` / `":"` | `true` |
|
|
153
|
+
| `tableCaption.{enabled,format,separator}` | 表格题注 / `"表 {n}"` / `" "` | `true` |
|
|
154
|
+
| `renderMermaid.{enabled,theme,density}` | Mermaid 渲染 / 主题 / DPI(≥72) | `true` / `"tokyo-night-light"` / `200` |
|
|
155
|
+
| `imageSize.{enabled,maxWidthCm,maxHeightCm}` | 图片尺寸限制(厘米) | `true` / `12` / `12` |
|
|
156
|
+
| `removeThematicBreaks.enabled` | 移除分隔符行 | `true` |
|
|
309
157
|
|
|
310
|
-
|
|
158
|
+
图片尺寸通过 Lua filter 在 Pandoc 阶段等比缩小,不放大小图。Markdown 已显式设 width/height 时不应用。单图读取失败时警告并继续。
|
|
311
159
|
|
|
312
|
-
|
|
313
|
-
md2docx -f report.md --style-config style-config.json
|
|
314
|
-
```
|
|
160
|
+
---
|
|
315
161
|
|
|
316
|
-
|
|
162
|
+
## 样式定制
|
|
317
163
|
|
|
318
|
-
|
|
164
|
+
受控语义化配置(`config/default/style-config.json`)开放以下白名单选项:
|
|
319
165
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
166
|
+
- `body.firstLineIndent` — 正文首行缩进
|
|
167
|
+
- `body.lineSpacing` — 行距倍数(如 `1.5`)
|
|
168
|
+
- `headings["1"]` — `startOnNewPage`、`alignment`(left/center)、`bold`
|
|
169
|
+
- `headings["2".."6"]` — `bold`
|
|
170
|
+
- `headings["4".."6"]` — `italic`
|
|
171
|
+
- `inlineCode.background` — 行内代码背景
|
|
172
|
+
- `codeBlock.border` — 代码块外框
|
|
326
173
|
|
|
327
|
-
|
|
174
|
+
字段缺失继承底层样式;`true` 写入完整效果;`false` 写入 Word 关闭值。输入组合规则:
|
|
328
175
|
|
|
329
|
-
|
|
176
|
+
| 参数 | 行为 |
|
|
177
|
+
| ------------------- | ----------------------------- |
|
|
178
|
+
| 都不指定 | 当前预设 raw + config |
|
|
179
|
+
| 仅 `--style-raw` | 直接使用 raw,不读默认 config |
|
|
180
|
+
| 仅 `--style-config` | config 应用到当前预设 raw |
|
|
181
|
+
| 两者都指定 | config 应用到用户 raw |
|
|
330
182
|
|
|
331
183
|
```bash
|
|
184
|
+
md2docx export style-config
|
|
185
|
+
md2docx -f report.md --style-config style-config.json
|
|
186
|
+
# 从现有 DOCX 提取样式
|
|
332
187
|
md2docx export style-raw -f template.docx
|
|
333
188
|
md2docx -f report.md --style-raw template_style-raw.json
|
|
334
189
|
```
|
|
335
190
|
|
|
336
|
-
|
|
191
|
+
完整设计见 [`docs/style-config-design.md`](docs/style-config-design.md)。
|
|
337
192
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
- `default.document`:全局字体、字号与段落设置
|
|
341
|
-
- `default.heading1` 至 `default.heading6`:标题样式
|
|
342
|
-
- `default.title`:文档标题样式
|
|
343
|
-
- `paragraphStyles`:自定义段落样式
|
|
344
|
-
- `characterStyles`:自定义字符样式
|
|
345
|
-
- `tableStylesXml`:从 DOCX 提取并重新注入的表格样式 XML
|
|
346
|
-
|
|
347
|
-
基于 `a0`(Body Text)的样式会继承首行缩进。如果子样式不需要缩进,应在 `indent` 中显式清零。
|
|
348
|
-
|
|
349
|
-
## Mermaid 渲染
|
|
350
|
-
|
|
351
|
-
渲染流程如下:
|
|
352
|
-
|
|
353
|
-
```text
|
|
354
|
-
Mermaid
|
|
355
|
-
→ beautiful-mermaid
|
|
356
|
-
→ SVG
|
|
357
|
-
→ 内联 CSS var() / color-mix()
|
|
358
|
-
→ @resvg/resvg-wasm
|
|
359
|
-
→ 写入正确的 PNG DPI 元数据
|
|
360
|
-
→ PNG
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
resvg 不直接支持 beautiful-mermaid 输出中的所有 CSS 自定义属性,因此转换前会解析:
|
|
364
|
-
|
|
365
|
-
- `var(--name)`
|
|
366
|
-
- `var(--name, fallback)`
|
|
367
|
-
- 嵌套 fallback
|
|
368
|
-
- `color-mix(in srgb, ...)`
|
|
369
|
-
- 三位和六位十六进制颜色
|
|
370
|
-
|
|
371
|
-
Windows 会显式加载微软雅黑、Arial 和 Consolas;macOS 与 Linux 使用各自的候选系统字体。PNG 像素尺寸和 `pHYs` DPI 元数据都与 `renderMermaid.density` 保持一致。
|
|
372
|
-
|
|
373
|
-
运行时不依赖 Sharp。Sharp 只作为开发依赖,用于测试中比较 resvg 与旧渲染结果,不会打入 npm 运行时包或平台 EXE。
|
|
193
|
+
---
|
|
374
194
|
|
|
375
195
|
## 处理流水线
|
|
376
196
|
|
|
377
|
-
```
|
|
378
|
-
Markdown
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
↓
|
|
382
|
-
addTitle()
|
|
383
|
-
↓
|
|
384
|
-
removeThematicBreaks()
|
|
385
|
-
↓
|
|
386
|
-
normalizeHeadings()
|
|
387
|
-
↓
|
|
388
|
-
numberHeadings()
|
|
389
|
-
↓
|
|
390
|
-
numberTables()
|
|
391
|
-
↓
|
|
392
|
-
renderMermaid()
|
|
393
|
-
↓
|
|
394
|
-
numberPictures()
|
|
395
|
-
↓
|
|
396
|
-
序列化 Markdown
|
|
397
|
-
↓
|
|
398
|
-
生成或复用 reference DOCX
|
|
399
|
-
↓
|
|
400
|
-
Pandoc + 行内代码/图片尺寸 Lua filter
|
|
401
|
-
↓
|
|
402
|
-
DOCX
|
|
197
|
+
```
|
|
198
|
+
Markdown → AST → addTitle → removeThematicBreaks → normalizeHeadings
|
|
199
|
+
→ numberHeadings → numberTables → renderMermaid → numberPictures
|
|
200
|
+
→ 序列化 → reference DOCX → Pandoc + Lua filter → DOCX
|
|
403
201
|
```
|
|
404
202
|
|
|
405
|
-
`removeThematicBreaks
|
|
406
|
-
|
|
203
|
+
`removeThematicBreaks` 在标题处理之前;`numberTables` 在 Mermaid 渲染之前;`renderMermaid` 在 `numberPictures` 之前。
|
|
204
|
+
|
|
205
|
+
---
|
|
407
206
|
|
|
408
207
|
## 构建
|
|
409
208
|
|
|
410
|
-
|
|
209
|
+
需要 [Bun](https://bun.sh/)。
|
|
411
210
|
|
|
412
211
|
```bash
|
|
413
|
-
git clone https://github.com/WXY-V1hZ/md2docx.git
|
|
414
|
-
cd md2docx
|
|
212
|
+
git clone https://github.com/WXY-V1hZ/md2docx.git && cd md2docx
|
|
415
213
|
bun install
|
|
416
214
|
|
|
417
|
-
# 从源码运行
|
|
418
|
-
bun
|
|
419
|
-
|
|
420
|
-
# 测试和静态检查
|
|
421
|
-
bun test
|
|
422
|
-
bun check
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
### npm 构建
|
|
426
|
-
|
|
427
|
-
```bash
|
|
428
|
-
bun run build
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
输出:
|
|
432
|
-
|
|
433
|
-
```text
|
|
434
|
-
dist/
|
|
435
|
-
├── index.js
|
|
436
|
-
└── index_bg.wasm
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
依赖会打包进 `index.js`,resvg WASM 作为相邻资源输出。`prepack` 会自动执行此构建。
|
|
440
|
-
|
|
441
|
-
### Windows 可执行文件
|
|
215
|
+
bun run src/index.ts report.md # 从源码运行
|
|
216
|
+
bun test # 全部测试
|
|
217
|
+
bun check # tsc + oxlint + oxfmt
|
|
442
218
|
|
|
443
|
-
|
|
444
|
-
bun run build:exe
|
|
219
|
+
bun run build # npm 构建 → dist/index.js + WASM
|
|
220
|
+
bun run build:exe # Windows 单文件 → dist/md2docx.exe
|
|
445
221
|
```
|
|
446
222
|
|
|
447
|
-
|
|
223
|
+
两种构建互斥(先 `clean:dist`)。`prepack` 自动执行 `bun run build`。
|
|
448
224
|
|
|
449
|
-
|
|
225
|
+
---
|
|
450
226
|
|
|
451
227
|
## 常见问题
|
|
452
228
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
先检查:
|
|
456
|
-
|
|
457
|
-
```bash
|
|
458
|
-
pandoc --version
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
如果命令不存在,请从 [Pandoc 官方安装页](https://pandoc.org/installing.html) 安装,并重新打开终端使 `PATH` 生效。
|
|
229
|
+
**找不到 Pandoc** — 确认 `pandoc --version` 可用,从 [pandoc.org](https://pandoc.org/installing.html) 安装并重启终端。
|
|
462
230
|
|
|
463
|
-
|
|
231
|
+
**跨目录转换图片缺失** — 相对路径以原始 Markdown 文件为基准解析,顺序优先于调用目录。检查路径大小写、文件存在性和 URL 编码。
|
|
464
232
|
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
```text
|
|
468
|
-
docs/
|
|
469
|
-
├── example.md
|
|
470
|
-
└── pictures/
|
|
471
|
-
└── test.png
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
```markdown
|
|
475
|
-

|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
新版会把原始文档目录和命令运行目录传给 Pandoc 的 `--resource-path`,并优先搜索原始文档目录。如果仍然缺图,请检查路径大小写、文件是否存在,以及图片语法中是否包含错误的 URL 编码。
|
|
233
|
+
---
|
|
479
234
|
|
|
480
235
|
## 许可
|
|
481
236
|
|
|
482
|
-
|
|
237
|
+
[GNU GPL v3.0](LICENSE)
|