Вы в основном там.Я подозреваю, что ваша проблема заключается в том, что вы фильтруете блочные элементы, что аналогично методу Quill getText
.Согласно документам:
Нестроковое содержимое опущено, поэтому длина возвращаемой строки может быть короче, чем у редактора, как возвращено getLength
.
Этопоскольку нетекстовые элементы обычно имеют длину 1, поэтому для каждого из них, которые вы пропускаете, ваш индекс будет дрейфовать на 1.
Простой обходной путь для этого состоит в замене любых нетекстовых элементов новой строкойсимвол, имеющий длину 1, и дополнительное преимущество в том, что поиск по нему завершается неудачно (если только вы не разрешите пользователям выполнять поиск с символами новой строки - возможно, тогда вы сможете выбрать другой специальный символ, такой как управляющий символ).
СледующееМетод должен возвращать текстовое представление вашего Quill в текстовом формате, длина которого соответствует quill.getLength
, и поэтому должен иметь возможность поиска с использованием любого метода текстового поиска JavaScript, который вы хотите (например, indexOf
для простого поиска).
function textContents() {
return quill.getContents().ops
.reduce((text, op) => {
if (typeof op.insert === 'string') {
// If the op is a string insertion, just concat
return text + op.insert;
} else {
// Otherwise it's a block. Represent this as a newline,
// which will preserve the length of 1, and also prevent
// searches matching across the block
return text + '\n';
}
}, '');
}
Вот пример: https://codepen.io/alecgibson/pen/GLVzPb