DocFlow 格式转换与周边链路
检查 Yjs/JSON、Markdown、Word、PDF、公众号、音视频及博客链路。
本页整理自 2026-10-04 的 DocFlow 静态调查材料。原材料没有提供仓库 URL、分支或提交哈希;正文中的路径、行号、计数与依赖版本均指向该未锚定快照。本轮整理读取了归档报告,未取得原工作副本、启动产品或验证外部后端。下文的“复核”指原材料记载的复核,前端路径存在与运行可用性分别判断。
导入导出链路
packages/transformer:Yjs ↔ JSON 转换(为后端准备)
transformer 不做 Markdown 转换(grep markdown/marked/remark/micromark/unified 整包零命中),只做 Yjs Doc ↔ ProseMirror/Tiptap JSON 双向转换,底层直接调 y-prosemirror 的 yDocToProsemirrorJSON / prosemirrorJSONToYDoc(Prosemirror.ts:2,26,54,61)。presets 只有两个:TiptapTransformerWithAlert(StarterKit + AlertSchema)与 TiptapTransformerWithBilibili(StarterKit + Bilibili)(presets/alert.ts:22、presets/bilibili.ts:22)。该包在前端 app 源码零引用(复核勘误:grep 'syncflow' 在 src 下有一处命中——src/styles/index.css:23 引入的是 @syncflow/bilibili 的 CSS,非 transformer),Dockerfile:42 注明 backend-only 排除出镜像。
packages/bilibili:粘贴 bilibili.com/b23.tv 链接按 nodePasteRule 匹配,BV/av 号转 player.bilibili.com iframe embed(Bilibili.ts:160-174、utils.ts:36-62);packages/alert:6 种 Alert 块,拆成 React 版(Alert)与无 React 的 Schema 版(AlertSchema)共享 alertBase.ts,供服务端转换用(Alert.ts:29-74、AlertSchema.ts:11-13、alertBase.ts:14-51)。两个包的扩展均未注册进前端编辑器。
Markdown:两套高度重复的手写实现(原材料复核)
原调查快照未声明官方 @tiptap/markdown 依赖;源码手写了两处几乎相同的 MDAST→ProseMirror 映射(diff 对比 MarkdownPaste.ts:164-390 与 markdown-to-tiptap.ts:71-338,仅注释与个别类型标注差异,几乎逐行相同):
utils/markdown-to-tiptap.ts:3-8,28-60:临时 Editor 实例 + mdast-util-from-markdown + GFM(micromark-extension-gfm),手写 MDAST→PM 映射(用于模板 JSON 化);extensions/MarkdownPaste/MarkdownPaste.ts(611 行):ProseMirror 粘贴插件(isMarkdownContent 共 14 个正则判定,:136-156;识别为 Markdown 的纯文本粘贴 preventDefault 后解析插入;特判在表格内粘贴表格时的落位,:33-103)+ 重写 clipboardTextSerializer 把选区序列化为 Markdown 供复制(:38-40,395-611)。
配套的 JsonPaste 监听剪贴板 text/json(本产品复制的 editor.getJSON)整体替换文档(JsonPaste.ts:12-34);copy 时写入 text/json 与 docflow-reference 自定义类型(page.tsx:168-204)。
Word 导出:fork 自维护(原材料复核)
utils/export-doc/* 是 tiptap-extension-export-docx 的源码 fork(export-doc/utils.ts:2 注释 "Shared utility functions for the export-docx package" 佐证;原依赖在 package.json:189 声明但源码从未 import 它):generator.ts 构建基于 docx@9.5.1(package.json:139)的 Document/Packer(:56-184),convertNode switch 派发 14 个 case(paragraph/heading/blockquote/codeBlock/image/table/bulletList/orderedList/taskList/listItem/taskItem/hardBreak/horizontalRule/details,:223-273),converters 目录 18 个文件(17 个转换器 + index)。document-export/docx.ts 先把 imageBlock 归一化为 image(:37-45),outputType 'nodebuffer' 后浏览器端 Blob + createObjectURL 下载(:50-73)。
PDF 与公众号复制(原材料复核)
PDF:@zumer/snapdom 把编辑器 DOM 转 canvas(filter 过滤 BUTTON 节点,:51-56)→ toDataURL('image/jpeg', 0.95)(:58)→ jsPDF('p','mm','a4') 按 heightLeft 循环 addPage 分页(:61-82)→ 60s 超时保护(:42,89)。复制到公众号:juice 内联 CSS 后以 ClipboardItem 写 'text/html' + 'text/plain'(document-actions.tsx:60-101)。所有导出入口集中在文档页"操作"菜单(:143,165-177)。
LiveKit / 博客 / dashboard 周边
LiveKit(/rooms,原材料复核 + 部分修正):前端经 /api/v1/livekit/quick-create、/join 拿 token(services/rooms/index.ts:16,32),连接信息 base64 后放 URL ?c= 跳转(rooms/page.tsx:25-27,52);房间页(PageClientImpl.tsx,384 行)实现 ExternalE2EEKeyProvider + E2EE(密码来自 location.hash,:201-259)、Room 配置(adaptiveStream/dynacast/singlePeerConnection/simulcast,:207-235)、自动开摄像头麦克风(:281-287)、头像 metadata + CustomParticipantTile(:289-304,362)、GridLayout(:361)、录制指示(:372)、低功耗优化(:319);屏幕共享在 CustomControlBar.tsx:44。后端 LiveKit 服务不在仓库(livekit-server-sdk 在 package.json:206 声明、源码零引用)。复核发现的死代码(与调研原文"已实现"表述不符,以复核为准):<Chat/> 被注释(:369,仅剩 ChatToggle 按钮);SettingsMenu(设备菜单)及其引用的 CameraSettings(BackgroundBlur)、MicrophoneSettings(useKrispNoiseFilter)未被任何页面渲染——krisp 降噪、背景虚化、设备菜单所查快照中未接线。另:PreJoinScreen.tsx 已写好但未被任何页面引用。
博客:ISR(revalidate=3600)+ generateStaticParams(前 50 篇)+ 完整 SEO metadata(OG/twitter/canonical);服务端 blogsServerApi 拉数据后 dangerouslySetInnerHTML 渲染(blog/page.tsx:14,30、blog/[id]/page.tsx:36-80,161);发布入口在文档操作菜单,use-blog-publish 用 zod 校验后提交 editor.getHTML()(use-blog-publish.ts:27-60)。
dashboard:contacts 列表渲染 MOCK_CONTACTS 假数据(ContactMemberList.tsx:8,28)但好友请求走真实 API(AddContactDialog.tsx:18、FriendRequestList.tsx:10);knowledge/podcast/workflow(ReactFlow)/organizations 各有页面;messages 为 ComingSoonPage 占位。
README 滞后项(反向:代码有、文档说没有):README "未来计划"中的 LiveKit 实际已落地(rooms 页面 + livekit-client 依赖栈 + /api/v1/livekit/quick-create)——README 该处滞后于代码;ofetch 的已记录使用处为导出拉 blob;主请求层采用 client.ts 与 server.ts。
最后更新于