delta-elixir

delta-elixir

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

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

Delta文档格式协作编辑操作转换JSONGithub开源项目

Delta

构建状态 版本 下载 许可

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

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

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

请参阅文档

<br>

安装

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

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

用法

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"}}, # ]
<br>

操作

插入

插入操作具有已定义的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})
<br>

操作转换

操作转换(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
<br>

贡献

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

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

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

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多