Как переместить отмеченный символ на основе выделения текста в javascript - PullRequest
1 голос
/ 05 мая 2020

Я хочу переместить отмеченный _#current selected text#_ точно вокруг текущего выделенного текста. Итак, давайте посмотрим на примере.

  1. Шаг 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, затем сравните его с индексом текущего выделенного текста, но он тоже не ответил, код здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...