Flutter:从Zefyr迁移至Fleather,旧文档兼容问题求解
Zefyr 文档迁移至 Fleather 的格式转换解决方案
问题描述
此前使用Zefyr包,现按作者建议迁移至Fleather包,但Fleather无法读取Zefyr创建的旧文档,不想使用耗时的replaceAll函数,寻求替代解决方案。
两者格式差异主要体现在两方面:
基础格式键差异
- Zefyr的
"bold"对应Fleather的"b" - Zefyr的
"italic"对应Fleather的"i" - Zefyr的
"underline"对应Fleather的"u"
嵌入内容格式差异
Fleather 图片/视频格式示例:
{ "insert": { "source": "https://...", "_type": "image", "_inline": false } }, { "insert": { "source": "https://www.youtube.com/...", "_type": "video", "_inline": false } }
Zefyr 对应嵌入格式示例:
{ "insert": "", "attributes": { "embed": { "type": "image", "source": "https://..." } } }, { "insert": "", "attributes": { "embed": { "type": "video", "source": "https://www.youtube.com/..." } } }
解决方案
- 结构化解析转换:放弃字符串替换,将JSON文档解析为可操作的对象(比如Dart中的
Map或自定义实体类),遍历每个节点做针对性转换:- 处理文本格式:遍历节点的
attributes属性,将bold、italic、underline等旧格式键替换为Fleather对应的b、i、u,清理旧键保留新键。 - 处理嵌入内容:识别带有
embed属性的节点,根据embed.type生成Fleather格式的insert对象,设置_type(对应Zefyr的embed.type)、source(直接复用原链接)、_inline(默认设为false),然后移除原节点的空字符串insert和attributes.embed结构。
- 处理文本格式:遍历节点的
- 通用转换工具类:封装上述逻辑为通用函数或工具类,批量处理所有文档节点,这种方式比
replaceAll更可靠,能避免复杂文档中的误匹配问题,转换效率和准确性更高。
目前我正在编写Zefyr文档转Fleather的转换代码,即将发布。
内容的提问来源于stack exchange,提问作者Mohamed elShazly
相关产品推荐
相关产品推荐

