Word 样式
Word 文档使用一种样式系统,其中每个段落和文本运行都引用一个命名样式。转换流水线会将已知的段落样式名称解析为它们对应的 Tiptap 样式,并对其他所有内容回退为普通段落。basedOn 继承链仅用于解析运行级格式。
导入时的样式解析通过 编辑器扩展 和 REST API 的行为完全一致。导出时,这两条路径都支持 styleOverrides 以自定义文档级样式定义。扩展还额外支持 元素覆盖,可对单个元素进行控制,而 REST API 不接受这种方式。
可识别的段落样式
导入服务会识别这些段落样式名称(不区分大小写)。当某个段落的规范样式名称与其中之一匹配时,它会被转换为相应的 Tiptap 节点:
| Word 样式名 | Tiptap 节点 | 备注 |
|---|---|---|
heading 1 到 heading 9(正则 /^heading\s*\d+$/i) | heading(1 到 9 级) | 参见 标题 |
quote(不区分大小写的精确匹配) | blockquote | 参见 块级元素 |
| 其他所有内容 | paragraph | 参见 段落 |
样式继承
Word 样式可以像类继承一样继承自其他样式。自定义样式“Company Heading”可能基于“Heading 2”,而“Heading 2”又基于“Normal”。这会形成一个父样式链。
导入时,转换器会沿着这条链收集每个祖先的文本格式(字体、字号、粗体、斜体、颜色)。不过,这条链不会用于决定段落最终变成什么类型的节点。节点类型只基于段落自身的样式名称是否匹配已知模式(标题正则或“Quote”)。
这意味着,一个样式为“Company Heading”的段落会变成普通段落节点,即使它从“Heading 2”继承了标题格式。要让转换器生成标题,样式名称本身必须匹配标题模式(例如“Heading 2”)。
字符样式
Word 也支持应用于单个文本运行的字符样式。导入时不会保留字符样式名称。取而代之的是,解析时已解析出的格式(粗体、斜体、颜色、字号等)已经体现在运行的 CSS 属性中,并会映射为 Tiptap 标记。
这意味着,一个样式为“Strong”且解析为粗体的运行,会生成 bold 标记,因为其格式包含 font-weight: bold。样式名“Strong”本身会被丢弃。
具有非标准格式(小型大写、字母间距、文本效果)的自定义字符样式,如果渲染器不支持这些格式,将会丢失这些格式。
编辑器
Tiptap 中没有样式扩展。编辑器没有 Word 段落样式或字符样式的概念。每种内容类型都有各自的扩展(Heading、Blockquote、CodeBlock、Paragraph),格式则通过标记来处理。
若要将文档中命名样式的排版(如 Heading 1、Normal、Quote 等的视觉定义)以级联 CSS 的形式带入编辑器,而不是作为逐节点属性,请使用实验性的 CSS 注入 功能。它会提取样式目录,并将其作为作用域限定的 <style> 标签注入,或交由你以 cssStyles 对象的形式处理。该页面记录了它覆盖的 16 个选择器和 11 个属性(仅排版;不包含按边设置的边框,也不包含字母间距)。
导出
每种 Tiptap 节点类型都映射到固定的 Word 样式:
| Tiptap 节点 | 导出的 Word 样式 |
|---|---|
paragraph | Normal |
heading(1 到 6 级) | Heading 1 到 Heading 6 |
blockquote 的子元素 | Quote |
| 列表项 | List Paragraph |
原始文档中的自定义样式不会被双向无损保留。从“Legal Disclaimer”样式导入的段落,导出时会变成“Normal”。
默认导出样式定义
| 样式 | 字体 | 大小 | 其他 |
|---|---|---|---|
| Normal | Aptos | 11pt | 之后间距 10pt,行高 1.15 |
| Heading 1 | Aptos Light | 16pt | 粗体,颜色 #2E74B5 |
| Heading 2 | Aptos Light | 14pt | 粗体,颜色 #2E74B5 |
| Heading 3 | Aptos | 13pt | 粗体,颜色 #2E74B5 |
| Heading 4 | Aptos | 12pt | 粗体,颜色 #2E74B5 |
| Heading 5 | Aptos | 11pt | 粗体,颜色 #2E74B5 |
| Title | Aptos Light | 22pt | 粗体,黑色,居中 |
| Subtitle | Aptos Light | 16pt | 斜体,灰色,居中 |
| Quote | Aptos | (继承) | 斜体,居中 |
| Hyperlink | (继承) | (继承) | 颜色 #0563C1,下划线 |
自定义导出样式
可使用 styleOverrides 覆盖任意默认样式或添加新样式。你的覆盖项会与默认值进行深度合并:匹配的 id 值会递归合并,新的 id 值会追加。
ExportDocx.configure({
styleOverrides: {
paragraphStyles: [
{
id: 'Normal',
name: 'Normal',
run: {
font: 'Calibri',
size: 24, // 半磅(24 = 12pt)
},
paragraph: {
spacing: {
after: 200, // twips(200 = 10pt)
line: 276, // 一行的 240 分之一(276 = 1.15)
},
},
},
],
},
})样式定义中的单位
字体大小以半磅为单位(24 = 12pt)。间距值以 twips 为单位(20 twips = 1pt)。行距使用一行的 240 分之一来表示(240 = 单倍行距,276 = 1.15)。这些单位来自 docx 库,并与 OOXML 规范一致。