导入要保留来源类型以选对渲染链
症状与根因
| 现象 | 根因 |
|---|---|
| 知识库里的剪藏内容格式和剪藏区不一样 | 订阅导入时把 HTML 正文直接塞进 content_md,于是走了 Markdown 渲染链 |
| 同一个剪藏,从「已有剪藏」导入是对的,从「订阅」导入是错的 | 两条导入路径给的正文格式不同(前者已是解析后的正文格式),但落库字段相同 |
格式与字段是两件事:content_html 和 content_md 不是可互换的容器。剪藏解析器会把网页转成适合 ClipReader 的正文格式;跳过这一步直接落库,等于把 HTML 当成 Markdown 读。
判断与做法
- 落库时要保留来源类型(如
kind: 'note' | 'clip' | 'html'),它决定打开时用哪个渲染器 —— 图标、阅读器、滚动行为都跟着这个类型走。 - 多来源入口必须收敛到同一个「归一化」步骤:不管从剪藏导入还是从订阅导入,都先转成该类型对应的正文格式,再落同一个字段。否则每加一条导入路径就会多一种格式事故。
- 症状「格式不对」先问:这条内容是从哪个入口进来的?它进来时是什么格式? 而不是先怀疑渲染器。
延伸:来源类型要落库,别在显示层临时推断
同一个问题在展示层的翻版:知识库里的剪藏卡片该显示「文章 / 媒体 / 视频」图标,而不是统一的剪藏图标。但数据模型里没有持久化的内容类型字段,只能靠 url / sourceName 做启发式判断(域名命中 YouTube/B 站 → 视频;命中少数派/36氪 等 → 媒体;其余 → 文档)。
- 启发式能用,是因为「先加剪藏再加知识库」引用的是同一条
clip记录,url/sourceName还在。 - 代价:规则散在显示层,每加一处展示就要重算一次,且判断标准不一致。
- 更稳的做法:创建剪藏时识别一次
contentType落库,之后全局复用。
判据同一条:「它是什么类型」是一次性可判定的信息,就应该在入库时算一次存下来,而不是留给每个消费者各自推断。
相关
- 文章元信息用发布日期而非创建日期 —— 同一条入库链路的元信息侧:要单独存的字段也要在抓取阶段一并提取
- 清洗合并会破坏源格式语义 —— 同为「格式语义在管道中静默丢失」,那条讲合并环节,这条讲导入环节
- 入库前先分层清洗 —— 归一化步骤就是清洗层该做的事
- 兼容fallback会让内容重复渲染 —— 另一类「渲染链选择错误」的后果
- 列表卡片元信息用内容作者而非平台名 —— 同一条入库链路的显示侧:卡片元信息该取哪个字段