Я хочу переместить отмеченный _#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
и gram
повторно выбраны и 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#_
.
Здесь я не смог найти стабильного решения, в моих решениях он удаляет все предыдущие стили и стили снова применяется только к текущему выделенному тексту.
Но я хочу сохранить статус предыдущего выделенного текста и добавить новый стиль, если было какое-либо перекрытие, оно будет отменено.
Также, если есть библиотека для этого, вы можете мне предложить
Моя последняя попытка :
Однажды я попытался сохранить индекс всех отмеченных style, затем сравните его с индексом текущего выделенного текста, но он тоже не ответил, код здесь.