#协作 #变换 #编辑 #操作 #光标位置

operational-transform

操作变换库

7 个版本 (4 个重大更新)

0.6.1 2022年2月12日
0.6.0 2020年7月22日
0.5.0 2020年7月4日
0.3.0 2020年4月14日
0.1.1 2020年4月6日

#330并发

Download history 38/week @ 2024-03-13 31/week @ 2024-03-20 39/week @ 2024-03-27 84/week @ 2024-04-03 89/week @ 2024-04-10 48/week @ 2024-04-17 41/week @ 2024-04-24 49/week @ 2024-05-01 37/week @ 2024-05-08 66/week @ 2024-05-15 50/week @ 2024-05-22 35/week @ 2024-05-29 42/week @ 2024-06-05 41/week @ 2024-06-12 84/week @ 2024-06-19 78/week @ 2024-06-26

每月下载量 251 次

MIT 许可证

35KB
674

operational-transform

Crates.io docs.rs docs ci

操作变换库

操作变换(OT)是支持高级协作软件系统中一系列协作功能的技术。[1]

当在互联网上共同编辑同一份文档时,多个用户的并发操作可能会发生冲突。 操作变换 可以帮助以保持文档同步的方式解决这种冲突。

该库支持的基本操作包括

  • Retain(n): 将光标向前移动 n 个位置
  • Delete(n): 在当前位置删除 n 个字符
  • Insert(s): 在当前位置插入字符串 s

该库可用于...

... 组合操作序列

use operational_transform::OperationSeq;

let mut a = OperationSeq::default();
a.insert("abc");
let mut b = OperationSeq::default();
b.retain(3);
b.insert("def");
let after_a = a.apply("").unwrap();
let after_b = b.apply(&after_a).unwrap();
let c = a.compose(&b).unwrap();
let after_ab = a.compose(&b).unwrap().apply("").unwrap();
assert_eq!(after_ab, after_b);

... 变换操作序列

use operational_transform::OperationSeq;

let s = "abc";
let mut a = OperationSeq::default();
a.retain(3);
a.insert("def");
let mut b = OperationSeq::default();
b.retain(3);
b.insert("ghi");
let (a_prime, b_prime) = a.transform(&b).unwrap();
let ab_prime = a.compose(&b_prime).unwrap();
let ba_prime = b.compose(&a_prime).unwrap();
let after_ab_prime = ab_prime.apply(s).unwrap();
let after_ba_prime = ba_prime.apply(s).unwrap();
assert_eq!(ab_prime, ba_prime);
assert_eq!(after_ab_prime, after_ba_prime);

... 反转操作序列

use operational_transform::OperationSeq;

let s = "abc";
let mut o = OperationSeq::default();
o.retain(3);
o.insert("def");
let p = o.invert(s);
assert_eq!(p.apply(&o.apply(s).unwrap()).unwrap(), s);

特性

支持使用 serde 功能进行序列化。

  • Delete(n) 将序列化为 -n
  • Insert(s) 将序列化为 "{s}"
  • Retain(n) 将序列化为 n
use operational_transform::OperationSeq;
use serde_json;

let o: OperationSeq = serde_json::from_str("[1,-1,\"abc\"]").unwrap();
let mut o_exp = OperationSeq::default();
o_exp.retain(1);
o_exp.delete(1);
o_exp.insert("abc");
assert_eq!(o, o_exp);

致谢

目前代码是从 此处 转移过来的。未来可能会发生变化,因为还有许多优化和可用性的空间。

依赖项

~220KB