此篇文章写给一同在进行ot算法实践中的朋友们,希望抛砖引玉,有对ot算法感兴趣的小伙伴可以联系我一下,目前关于此算法的一些细节处理上我还有一点点的疑惑部分,希望能讨论解决
Purpose 目的
在目前的ot算法中,您并不知道两个字符串是如何将一个字符串转换为第二个字符串的,在使用操作转换(operational-transformations,OT)时,您必须知道文本块何时被插入、删除或替换。您只处理字符串中的连续更改(连续意味着所有更改都在一起)。从来没有超过一组的变化) 即可。
Here’s an example:
下面是一个例子:
contiguous changes (what OT handles)
string -> strings # insertion
strings -> string # deletion
string -> strong # replacement
non-contiguous changes (what OT can’t handle)
string -> things
This library exists to give you OT-friendly diffs between two strings.
这个方法的存在是为了在两个字符串之间提供对 ot 友好的区别
代码
```javascript
// 字符串转换 (后字符一定是前字符演变的)
function stringConversion(preCharacter,lastCharacter){
let textOperation1 = ot.TextOperation();
let jiao = compareStrings(preCharacter,lastCharacter);
jiao = jiao.join("");
// 有交集
if((jiao.length>0) && (preCharacter!=lastCharacter)){
// 有交集,前者获取到交集的下角标开始和结尾,将0和下角标开始删除,在新增后者交集的0到开始的字符串,跳过交集字符串length,在从前者结尾删除,
// 一直到结尾,在新增一个后者结尾到最后的参数即可
let preStartSubscript = preCharacter.indexOf(jiao);
let preEndSubscript = (preCharacter.indexOf(jiao)+jiao.length)-1;
let endStartSubscript = lastCharacter.indexOf(jiao);
let endEndSubscript = (lastCharacter.indexOf(jiao)+jiao.length)-1;
textOperation1.delete(preCharacter.substring(0,preStartSubscript));
textOperation1.insert(lastCharacter.substring(0,endStartSubscript));
textOperation1.retain(jiao.length);
textOperation1.delete(preCharacter.substring(preEndSubscript,preCharacter.length-1));
textOperation1.insert(lastCharacter.substring(endEndSubscript+1,lastCharacter.length));
return textOperation1;
}else if (preCharacter == lastCharacter){
return null;
}else {
textOperation1.delete(preCharacter).insert(lastCharacter);
return textOperation1;
}
}
```javascript
// 获取两者交集
const compareStrings = function (A, B) {
let a = A.split("");
let b = B.split("");
//求得a,b两个数组的交集
let jiao = "";
if(b.length == 0){
return b;
}
return a.map(function (val) {
jiao += val;
if(B.indexOf(jiao) != -1){
return val;
}
});
};
第一个是主方法
第二个是获取两个字符串交集的部分
这个算法应该还有可优化的部分,代码比较凌乱,各位海涵,最近在写共同协作的markdown文档的部分