飞书文档创建前的兼容性检查规范。覆盖 Mermaid/PlantUML 语法限制(8 种图表类型的飞书安全写法)、 表格自动拆分规则(9×9 限制)、Callout/公式/图片处理、API 限制与容错机制。 被 feishu-cli-write、feishu-cli-import 等技能引用,在生成将要导入飞书的...
本技能是 其他飞书文档技能的参考规范,不可直接调用。整合了以下来源的验证经验:
feishu-cli 项目代码实现( converter/、 client/board.go、 cmd/import_markdown.go)feishu-cli-write、 feishu-cli-import、 feishu-cli-plantuml 技能的实测数据适用场景:生成将要导入飞书的 Markdown 文档时,参考本规范确保兼容性。
生成飞书 Markdown 前,快速过一遍这 10 条核心规则:
#规则严重度1❌ Mermaid flowchart 标签禁止 {}(会被解析为菱形节点)必须遵守2❌ Mermaid 禁止 par...and...end(飞书完全不支持)必须遵守3❌ Mermaid 节点标签换行禁止 \n(会原样显示),用 <br/>必须遵守4⚠️ Mermaid sequenceDiagram:participant ≤ 8,alt 嵌套 ≤ 1 层强烈建议5✅ 方括号标签含冒号时加双引号: ["类型: string"]必须遵守6❌ PlantUML 禁止行首缩进、 skinparam、可见性标记( + - # ~)必须遵守7⚠️ 表格超过 9 行或 9 列会自动拆分,无需手动处理了解即可8✅ Callout 仅 6 种:NOTE / WARNING / TIP / CAUTION / IMPORTANT / SUCCESS必须遵守9⚠️ 块级公式 $$...$$ 会降级为行内 Equation(API 限制)了解即可10✅ 图片默认自动上传,失败时降级为占位块了解即可
这是最重要的章节。Mermaid 图表导入飞书有严格的语法限制,不遵守会导致渲染失败。
类型声明飞书 diagram_type说明流程图flowchart TD / flowchart LR6 (flowchart)支持 subgraph时序图sequenceDiagram2 (sequence)复杂度限制最严格类图classDiagram4 (class)状态图stateDiagram-v27 (state)必须用 v2ER 图erDiagram5 (er)甘特图gantt0 (auto)饼图pie0 (auto)思维导图mindmap1 (mindmap)
{}花括号会被 Mermaid 解析器识别为菱形(decision)节点,导致语法错误。此规则针对 flowchart 节点标签,erDiagram/classDiagram 语法结构中的 {} 不受此限制。
markdown
❌ 错误
flowchart TD
A["{name: value}"]
✅ 正确
flowchart TD
A["name: value"]
替代方案:移除花括号,或用圆括号/方括号替代。
par...and...end 并行语法飞书画板完全不支持 par 语法(错误码 2891001)。
markdown
❌ 错误
sequenceDiagram
par
A->>B: 请求1
and
A->>C: 请求2
end
✅ 正确:用 Note 替代
sequenceDiagram
Note over A,C: 并行处理
A->>B: 请求1
A->>C: 请求2
方括号 [text:xxx] 中的冒号可能导致解析歧义。
markdown
❌ 可能出错
flowchart TD
A[类型:string]
✅ 正确
flowchart TD
A["类型: string"]
修复方法:给含冒号的标签加双引号。
Note over 最多跨 2 个相邻 participant。
markdown
❌ 错误:跨太多参与者
sequenceDiagram
Note over A,D: 说明
✅ 正确
sequenceDiagram
Note over A,B: 说明
维度安全阈值超限风险participant 数量≤ 8超过 10 + 其他因素 → 失败alt/opt 嵌套≤ 1 层超过 2 层 → 失败风险增大消息标签长度简短(≤ 30 字符)长标签 + 多参与者 → 失败总消息数≤ 30需结合其他因素评估
超限组合(实测必定失败):10+ participant + 2+ alt + 30+ 长消息标签
建议:超过安全阈值时,拆分为多个小图。
\n,必须用 <br> 或 <br/>飞书画板不支持 Mermaid 节点标签中的 \n 转义符,会原样显示为 \n 文本。需要使用 <br> 或 <br/> 实现换行,也可以在源码中写真实换行(需用双引号包裹标签)。
markdown
❌ 错误:\n 会原样显示为文本
flowchart TD
A["normalizePort\n(detect-port)"]
✅ 正确:使用 <br>
flowchart TD
A["normalizePort<br>(detect-port)"]
✅ 正确:使用 <br/>
flowchart TD
A["normalizePort<br/>(detect-port)"]
✅ 正确:源码中直接换行(标签必须用双引号)
flowchart TD
A["normalizePort
(detect-port)"]
多层 subgraph 嵌套、大量条件分支等复杂结构会增加渲染失败概率。保持图表简洁。
在生成 Mermaid 代码块前,逐项检查:
{}?→ 移除或替换par...and...end?→ 改用 Note over\n?→ 改用 <br> 或 <br/>详细的 8 种图表模板和更多正反示例见
references/mermaid-spec.md。
@startuml / @enduml 包裹(思维导图用 @startmindmap / @endmindmap)skinparam、 !define、颜色、字体、对齐控制等样式指令left to right direction 等在部分场景不可靠)图类型安全语法禁忌活动图start/stop、 :动作;、 if/then/else/endif、 repeat、 fork❌ 避免过深嵌套时序图participant、 ->/ -->、 activate/deactivate、 note、 alt/opt/loop❌ 避免样式指令类图class、 interface、 package、关系箭头❌ **避免可见性标记(+ - # ~)**用例图actor、 (用例)、 <<include>>/ <<extend>>❌ 避免复杂布局组件图[Component]、 package/node/cloud/database❌ 避免 ArchiMate spriteER 图entity、关系箭头⚠️ 与 Mermaid ER 语法不同思维导图@startmindmap、 * / + 层级标记✅ 必须用专用包裹标记
场景推荐原因流程图Mermaid飞书原生支持更好,成功率高时序图(简单)Mermaid语法简洁时序图(复杂)PlantUMLMermaid 复杂度限制严格类图Mermaid两者都可,Mermaid 更简洁ER 图Mermaid语法更直观状态图MermaidstateDiagram-v2 支持好甘特图MermaidPlantUML 甘特图飞书支持差饼图Mermaid简洁思维导图两者均可PlantUML 层级标记更灵活用例图PlantUMLMermaid 不支持组件图PlantUMLMermaid 不支持活动图(复杂分支)PlantUML支持更丰富的分支语法
默认推荐 Mermaid,仅在 Mermaid 不支持的图类型或复杂场景下使用 PlantUML。
Markdown 语法Block Type飞书块名称说明# 标题 ~ ###### 标题3-8Heading1-6最多 6 级(7-9 级导出降级为粗体段落)普通段落2Text纯文本- 无序列表12Bullet支持无限深度嵌套1. 有序列表13Ordered支持无限深度嵌套- [x] / - [ ]17Todo任务列表 ```lang14Code代码块(支持语言标识)> 引用34QuoteContainer引用容器(导入使用 QuoteContainer)> [!NOTE]19Callout高亮块(6 种类型,见第 6 节)---22Divider分割线Markdown 表格31Table超过 9 行或 9 列自动拆分(见第 7 节)27Image默认自动上传(见第 8 节) ```mermaid21→43Diagram→Board自动转飞书画板(见第 3 节) ```plantuml / ```puml21→43Diagram→Board自动转飞书画板(见第 4 节)$$公式$$16Equation块级公式(降级为行内 Equation)$公式$—InlineEquation行内公式
以下块类型在导出时有对应的处理:
Block Type名称导出结果说明44Agenda展开子块议程块45AgendaItem展开子块议程条目46AgendaItemTitle粗体文本议程标题47AgendaItemContent展开子块议程内容48LinkPreview链接链接预览块49SyncSource展开子块同步源块50SyncReference展开子块同步引用块51WikiCatalogV2[知识库目录 V2]知识库目录 V252AITemplateHTML 注释AI 模板块
Markdown效果说明**粗体**粗体Bold TextStyle*斜体*_斜体_Italic TextStyle`` 行内代码 ```代码InlineCode TextStyle删除线删除线Strikethrough TextStyle下划线下划线Underline TextStyle文字链接Link TextElement==高亮==`高亮Highlight(需启用选项)
markdown
- 一级无序
- 二级无序
- 三级无序
1. 四级有序
2. 四级有序
- 三级无序
- 二级无序
无序/有序列表支持 无限深度嵌套 和 混合嵌套,导入时自动保留缩进层级。
类型bgColor颜色Markdown 语法适用场景NOTE6蓝色> [!NOTE]补充说明、提示信息WARNING2红色> [!WARNING]警告、危险提醒TIP4黄色> [!TIP]技巧、建议CAUTION3橙色> [!CAUTION]注意事项IMPORTANT7紫色> [!IMPORTANT]重要信息SUCCESS5绿色> [!SUCCESS]成功、通过
⚠️
INFO与NOTE等效(都映射为 bgColor=6 蓝色),统一使用NOTE。
markdown
> [!NOTE]
> 这是一条补充说明信息。
> [!WARNING]
> 此操作不可逆,请谨慎执行。
> [!TIP]
> 使用 `--verbose` 参数可以查看详细进度。
> [!CAUTION]
> 注意:API 有频率限制。
> [!IMPORTANT]
> 必须在执行前配置环境变量。
> [!SUCCESS]
> 所有测试用例已通过。
EmojiId,仅通过 BackgroundColor 区分类型NOTE 而非 INFO(两者等效, NOTE 是 Markdown 标准写法)飞书 API 限制单个表格最多 9 行(包括表头)× 9 列。超出时 feishu-cli 自动拆分为多个表格。
拆分逻辑( converter/markdown_to_block.go):
维度处理方式≤ 9 行 且 ≤ 9 列✅ 直接创建单个表格> 9 行按行拆分为多个表格,每个最多 8 行数据 + 1 行表头> 9 列按列拆分为多个表格,保留首列作为标识列> 9 行 且 > 9 列先列拆分,再行拆分(复合拆分)
列拆分策略:首列通常是标识/名称列,在所有列组中保留,避免拆分后数据行无法识别。每个列组最多 9 列(1 列标识 + 8 列数据)。
列宽根据单元格内容自动计算( converter/markdown_to_block.go:25-103):
参数值说明中文字符宽度14px非 ASCII 字符英文字符宽度8pxASCII 字符列内边距16px每列额外边距最小列宽80px不能更窄最大列宽400px不能更宽文档默认宽度700px总宽度不足时按比例扩展
表格单元格内可以包含多种块类型:
⚠️ 注意:飞书 API 创建表格时会自动在每个单元格内创建空的 Text 块。填充内容时应 更新现有块 而非创建新块。
markdown
| 列1 | 列2 | 列3 |
|-----|-----|-----|
| 数据 | 数据 | 数据 |
feishu-cli 默认通过 --upload-images 自动上传图片:
 时,自动下载网络图片或读取本地图片--no-upload-images 可关闭(创建占位块)--image-workers 控制(默认 2,API 限制 5 QPS)使用单美元符号包裹: $E = mc^2$
支持一个段落内包含多个行内公式:
markdown
已知 $a^2 + b^2 = c^2$,当 $a = 3, b = 4$ 时,$c = 5$。
使用双美元符号包裹:
markdown
$$
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
$$
feishu-cli doc import 采用三阶段管道架构( cmd/import_markdown.go):
阶段方式处理内容阶段一顺序按文档顺序创建所有块,为图表创建空画板占位块,收集表格任务阶段二并发图表 worker 池(默认 5 并发)+ 表格 worker 池(默认 3 并发)同时处理阶段三逆序处理失败的图表:删除空画板块,在原位置插入代码块(逆序避免索引偏移)
限制值处理方式单次创建块数最多 50 个自动分批( batchSize = 50)单个表格行数最多 9 行自动拆分并复制表头单个表格列数最多 9 列自动拆分并保留首列文件夹子节点不超过 1500超出报错 1062507文档块总数有上限超出报错 1770004文件大小最大 100MB超出直接报错API 频率429 Too Many Requests自动重试 + 线性退避
错误类型判断条件处理方式语法错误Parse error、 Invalid request parameter❌ 不重试,直接降级为代码块服务端错误500/502/503、 internal error✅ 重试(最多 10 次,1s 间隔)频率限制429、 rate limit、 frequency limit✅ 重试(归为可重试错误)重试耗尽超过最大重试次数⚠️ 降级为代码块
降级处理流程:
参数默认值说明--diagram-workers5图表(Mermaid/PlantUML)并发导入数--table-workers3表格并发填充数--diagram-retries10图表最大重试次数--verbosefalse显示详细进度
/open-apis/board/v1/whiteboards/{id}/nodes/plantumlsyntax_type:1 = PlantUML,2 = Mermaiddiagram_type 映射:0=auto, 1=mindmap, 2=sequence, 3=activity, 4=class, 5=er, 6=flowchart, 7=state, 8=component创建将导入飞书的 Markdown 文档前,完成以下检查:
{}par...and...end\n,已改用 <br> 或 <br/>@startuml/ @enduml)skinparam 等样式指令+ - # ~)$...$ 行内 / $$...$$ 块级)--diagram-workers--table-workers--verbose 观察进度