我想_#current selected text#_在当前选择的文本周围移动标记。所以让我们看一个例子。
第 1 步:仍然没有选择文本,所以字符串是:
let stringVal = "Hello friends, let's program with javascript";
第 2 步:
Hello friends已选择,因此字符串为:stringVal = "_#Hello friends#_, let's program with javascript";
第 3 步:
Hello friends, let's已选择,因此字符串为:stringVal = "_#Hello friends, let's#_ program with javascript";如您所见,此处
let's添加到选择文本中,因此标记的末尾#_移动ahead到相同大小的, let's.
第 4 步:
with已选择,因此字符串为:stringVal = "_#Hello friends, let's#_ program _#with#_ javascript";可以看到,这里
with单独标记为_#with#_,因为它既不附在前文也不附在下文。
第 5 步:
gram with javascript已选择,因此字符串为:stringVal = "_#Hello friends, let's#_ pro_#gram with javascript#_";如您所见,这里
gram添加了之前with,所以起始标记_#移动back到相同大小gram,另一方面javascript添加之后with,所以结束标记#_移动ahead到相同大小javascript。
第 6 步:
let's program已选中,因此字符串为:stringVal = "_#Hello friends, #_ _#let's program#_ _#with javascript#_";这一步很复杂,如您所见,这里
let's又在 after和beforegram重新选择和pro添加,所以起始标记移动到前面,结束标记移动到后面。另外我们应该小心,因为它没有结束标记,所以我们必须添加,也没有,所以我们必须添加。let'sgram_#backlet's#_aheadgram_#Hello friends,_#Hello friends, #_with javascript#_starter mark_#with javascript#_
第 7 步:
let's program with javascript已选择,因此字符串为:stringVal = "_#Hello friends, let's program with javascript#_";这一步很简单,如您所见
all text,selected我们只需标记一次。
我做了什么:
let stringVal = "Hello friends, let's _#program#_ with _#javascript language#_";
stringVal = stringVal.trim().replace(/\s+/g, ' ');
const search = 'Hello friends'.trim().replace(/\s+/g, ' ');
console.log('before: ', stringVal);
let copyString = stringVal;
copyString = copyString.replace(/_#(\w+(?: \w+)*)#_/g, "$1");
copyString = copyString.replace(search, `_#${search}#_`);
console.log('aafter: ', copyString);
上面的代码结果是:_#Hello friends#_, let's program with javascript language.
正确的一个是:_#Hello friends#_, let_'s _#program#_ with _#javascript language#_。
在这里我找不到稳定的解决方案,在我的解决方案中它删除了所有以前的样式,并且样式再次仅适用于当前选定的文本。
但是我想保存之前选择的文本的状态并添加新的样式,如果有任何重叠,那么它将被覆盖。
另外,如果有图书馆可以做这件事,你可以建议我
我曾经尝试保存所有标记样式的索引,然后将其与当前选定文本的索引进行比较,但它也没有响应,代码在这里。