我想_#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's
gram
_#
back
let's
#_
ahead
gram
_#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#_
。
在这里我找不到稳定的解决方案,在我的解决方案中它删除了所有以前的样式,并且样式再次仅适用于当前选定的文本。
但是我想保存之前选择的文本的状态并添加新的样式,如果有任何重叠,那么它将被覆盖。
另外,如果有图书馆可以做这件事,你可以建议我
我曾经尝试保存所有标记样式的索引,然后将其与当前选定文本的索引进行比较,但它也没有响应,代码在这里。