Project Icon

delta-elixir

灵活的文档内容描述与变更格式

Delta-elixir是一种用于描述文档内容和变更的格式。作为JSON的子集,它易读易解析,能够描述富文本文档的文本和格式。Delta格式支持操作转换(OT),适用于实时协作文档编辑。该项目实现了插入、删除、保留等基本操作,以及组合、转换、反转等OT核心功能。

Delta

构建状态 版本 下载 许可

简单而富有表现力的格式来描述文档的内容和变更 🗃

Delta是一种简单而富有表现力的格式,可用于描述内容和变更。 该格式是JSON的严格子集,易于人类阅读,并且机器可以轻松解析。 Delta可以描述任何富文本文档,包括所有文本和格式信息,而不会出现HTML中的模糊性和复杂性。

Delta格式适用于操作转换,并可用于实时协作文档编辑器(例如Slab、Google文档)。关于Delta设计动机和思路的详细介绍,请参阅Designing the Delta Format

请参阅文档


安装

mix.exs中将delta添加到项目依赖项中:

def deps do
  [{:delta, "~> 0.4.0"}]
end

用法

Delta由一系列操作组成,这些操作描述了对文档的更改。这些操作可以是insertdeleteretain。这些操作不需要索引,而是描述当前索引处的更改。保留操作用于"保留"文档的一部分。

快速示例

alias Delta.Op

# 文档内容为"Gandalf the Grey",其中"Gandalf"加粗,"Grey"为灰色
delta = [
  Op.insert("Gandalf", %{"bold" => true}),
  Op.insert(" the "),
  Op.insert("Grey", %{"color" => "#ccc"}),
]

# 定义要应用于上述内容的更改:
# 保留前12个字符,删除接下来的4个字符,
# 并插入一个白色的"White"
death = [
  Op.retain(12),
  Op.delete(4),
  Op.insert("White", %{"color" => "#fff"}),
]


# 应用更改:
Delta.compose(delta, death)
# => [
#   %{"insert" => "Gandalf", "attributes" => %{"bold" => true}},
#   %{"insert" => " the "},
#   %{"insert" => "White", "attributes" => %{"color" => "#fff"}},
# ]

操作

插入

插入操作具有已定义的insert键。字符串值表示插入文本。任何其他类型都表示插入嵌入(但仅执行一级对象比较以进行相等性判断)。

对于文本和嵌入,都可以定义可选的attributes键,该键是一个map,用于描述附加的格式信息。保留操作可以更改格式。

# 插入文本
Op.insert("一些文本")

# 插入加粗文本
Op.insert("加粗文本", %{"bold" => true})

# 插入链接
Op.insert("谷歌", %{"link" => "https://www.google.com"})

# 插入嵌入
Op.insert(%{"image" => "https://app.com/logo.png"}, %{"alt" => "应用程序logo"})

# 插入另一个嵌入
Op.insert(%{"video" => "https://www.youtube.com/watch?v=dQw4w9WgXcQ"}, %{"width" => 420, "height" => 315})

删除

删除操作具有定义的正整数delete键,表示要删除的字符数。所有嵌入的长度都为1。

# 删除接下来的10个字符
Op.delete(10)

保留

保留操作具有定义的正整数retain键,表示要保留的字符数(其他库可能使用保留或跳过)。可以定义可选的attributes键,该键是一个map,用于描述字符范围内的格式更改。属性映射中的值为nil表示删除该键。

注意:没有必要保留文档的最后几个字符,因为这是隐含的。

# 保留接下来的5个字符
Op.retain(5)

# 保留并加粗接下来的5个字符
Op.retain(5, %{"bold" => true})

# 保留并取消加粗接下来的5个字符
Op.retain(5, %{"bold" => nil})

操作转换

操作转换(OT)是一种构建协作体验的技术,在应用程序共享和构建支持多用户协作的实时文档编辑器(例如Google文档、Slab)中非常有用。

Delta开箱即用地支持OT,在Elixir中使用操作转换技术非常有用。它支持以下属性:

组合

返回一个新的Delta,它等价于先应用一个Delta的操作,然后再应用另一个Delta的操作:

a = [Op.insert("abc")]
b = [Op.retain(1), Op.delete(1)]

Delta.compose(a, b)
# => [%{"insert" => "ac"}]

转换

将给定的Delta转换为针对另一个Delta的操作。这接受一个可选的priority参数(默认值:false),用于打破平局。如果true,第一个Delta优先于其他Delta,即它的操作被认为首先发生。

a = [Op.insert("a")]
b = [Op.insert("b"), Op.retain(5), Op.insert("c")]

Delta.transform(a, b, true)
# => [
#  %{"retain" => 1},
#  %{"insert" => "b"},
#  %{"retain" => 5},
#  %{"insert" => "c"},
# ]

Delta.transform(a, b)
# => [
#  %{"insert" => "b"},
#  %{"retain" => 6},
#  %{"insert" => "c"},
# ]

请注意,即使delete操作支持属性,使用transform时也只能安全地使用不带属性的删除操作。

反转

返回一个反转的Delta,其效果与针对基础文档Delta的效果相反。 也就是说base |> Delta.compose(change) |> Delta.compose(inverted) == base

base = [Op.insert("Hello\nWorld")]

change = [
  Op.retain(6, %{"bold" => true}),
  Op.delete(5),
  Op.insert("!"),
]

inverted = Delta.invert(change, base)
# => [
#   %{"retain" => 6, "attributes" => %{"bold" => nil}},
#   %{"insert" => "World"},
#   %{"delete" => 1},
# ]

base |> Delta.compose(change) |> Delta.compose(inverted) == base
# => true

贡献

  • Fork、增强并发送PR
  • 提交任何bug或功能请求的issue
  • 实现路线图中的内容
  • 传播这个消息 :heart:

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号