【开源推广】飞书文档转 Markdown 支持画板

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社...
【开源推广】飞书文档转 Markdown 支持画板
【开源推广】飞书文档转 Markdown 支持画板
本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容:
  • 我的帖子已经打上 开源推广 标签:
  • 我的开源项目完整开源,无未开源部分:
  • 我的开源项目已链接认可 LINUX DO 社区:
  • 我帖子内的项目介绍,AI生成、润色内容部分已截图发出:
  • 以上选择我承诺是永久有效的,接受社区和佬友监督:

以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出


项目地址:https://github.com/Byte-n/larkDocx2md

在将飞书文档转换为 Markdown 的场景中,文本、表格、图片等常规块类型的处理在之前以及完成。但在日常接触的业务需求中,有一部分产品的业务流程图是放在飞书的需求文档的画板中,在此之前都依赖截图或人工转述的方式投喂给 Agent 。

lark-docx2md@0.2.0 版本的核心目标:

  • Markdown 转换架构调整,更好扩展、维护。
  • 支持文档中内嵌的画板块的识别和转换。

架构重构

之前的代码中采用的是单文件的解析器直接输出 Markdown 字符串,后续的块转换也都是字符串在操作。这种方式在新增块类型或处理异步资源(如图片下载、画板接口请求)时,耦合严重、难以扩展。每次新增一种块类型,都需要修改核心解析逻辑,且同步和异步处理混在一起,代码可维护性较差。

 飞书 API ───▶   Parser    ───▶ Transformer ───▶  Serializer 
  原始数据       (AST 构建)        (异步处理)        (Markdown)  
                同步、纯函数        网络请求          字符串输出  

Parser 阶段: 仅将飞书的响应数据转换为 AST 的结构。

**Transformer **:AST + 外部资源集合调用各块的转换器,执行 AST → 字符串的转换

Serializer 阶段: 整个 AST 序列化为最终的 Markdown 字符串

如果后续需要支持新的块,只需要增加对应块类型的转换器即可!

画板的支持

lark-docx2md 支持识别并转换飞书文档中的画板内容:

  • 流程图

  • 脑图

  • 涂鸦

  • 表情

  • 表格

  • 泳道

  • Any … 几乎大部分 99% 的内容

矢量绘制,无限缩放不失真,项目中已有 lark-docx2md Skill 的可以直接尝试,不需要做任何更改。

Agent 调用此 Skill,画板数据会以 yaml 格式输出(AI 友好,人类不友好)
人类友好形式:npx lark-docx2md@latest download --wb-format “svg” --wb-bg “#fff” xxx
然后你可以在输出日志中找到对应的图片,类似:

{时间} [INFO] [converter] Downloaded markdown file to larkDocx2mdOutput/xx.md

画板支持输出格式:

  • base64 在 Markdown 中通过图片语法引用(data URI )

npx lark-docx2md@latest download --wb-format “base64” --wb-bg “#fff” xxx

  • inline-svg:SVG 标签内嵌,大部分 Markdown 渲染器都支持直接渲染内嵌的 HTML 标签。

npx lark-docx2md@latest download --wb-format “inline-svg” --wb-bg “#fff” xxx
这里会将笔触、表情等视觉内容(非逻辑部分)移除,因为此部分一般不会影响 Agent 理解此画板的内容,但此部分一般都是由大量坐标、svg 代码构成,十分浪费 tokens。

  • svg:输出到磁盘 .svg 文件中,在 Markdown 中通过图片语法引用

npx lark-docx2md@latest download --wb-format “svg” --wb-bg “#fff” xxx
这里包含全量的信息,不会移除任何内容。相比 base64,这里是矢量图片,无限缩放不失真。

  • yaml:AI 友好结构化数据。

此部分输出的格式,人类极度不友好,Agent 专用友好格式(比 svg 遥遥领先)。
npx lark-docx2md@latest download --wb-format “yaml” --wb-bg “#fff” xxx
这里会将笔触、表情等视觉内容(非逻辑部分)移除,因为此部分一般不会影响 Agent 理解此画板的内容,但此部分一般都是由大量坐标、svg 代码构成,十分浪费 tokens。

Agent 模式

--agent 标志,开启时将转换后的文档输出到标准流中,并且会强制:

  • image-mode=online(避免本地文件依赖)
  • wb-image-mode=online(避免本地文件依赖)
  • wb-format=yaml(输出 AI 友好的结构化数据)

作为库调用

import { convert } from 'lark-docx2md';

const result = await convert({
  url: 'https://your-domain.feishu.cn/wiki/xxx',
  appId: 'your_app_id',
  appSecret: 'your_app_secret',
  output: './output',
  wbFormat: 'yaml',
  agent: true,
});

console.log(result.markdown);  // Markdown内容
console.log(result.docToken);  // 文档Token

1 个帖子 - 1 位参与者

阅读完整话题

来源: linux.do查看原文