Есть ли способ добавить объект в draftjs, который нельзя взломать?

#entity #draftjs

#объект #draftjs

Вопрос:

Я использую редактор draftjs. У меня есть декоратор, который обнаруживает некоторые фрагменты текста с помощью регулярных выражений и генерирует самодельный компонент. Этот вызывает API и возвращает результат, заменяя начальный фрагмент текста результатом API.

И я хотел бы получить этот результат как неразрывную, не редактируемую сущность, и я не знаю, как это сделать.

Вот функция, которую я использую для замены значения

 /**
   * Replace text in editor
   *
   * @param {Object} editorState  - State of the editor
   * @param {string} search       - Search value
   * @param {string} replaceValue - replacement value
   *
   * @returns {Object} Returns the new editorState with link removed
   */
  static replace(editorState, search, replaceValue) {

    if (typeof search === 'undefined' || search === null) {
      return editorState;
    }

    const regex = new RegExp(escapeStringRegexp(search), 'g');
    const blockMap = editorState.getCurrentContent().getBlockMap();
    const selectionsToReplace = [];
    blockMap.forEach((contentBlock) => (
      findWithRegex(regex, contentBlock, (start, end) => {
        const blockKey = contentBlock.getKey();
        const blockSelection = SelectionState
          .createEmpty(blockKey)
          .merge({
            anchorOffset: start,
            focusOffset: end,
          });

        selectionsToReplace.push(blockSelection)
      })
    ));

    let contentState = editorState.getCurrentContent();

    selectionsToReplace.forEach(selectionState => {
      contentState = Modifier.replaceText(contentState, selectionState, replaceValue)
    });

    return draftEditorState.push(editorState, contentState);
  }
 

Чего бы я хотел, так это того, что результат может быть перемещен или удален как глобальная часть и не может быть изменен.

Спасибо за вашу помощь.

Ответ №1:

Я думаю, что вы ищете Draftjs ‘ entities . Скажем, если вы примените объект с IMMUTABLE , он будет рассматриваться как недоступный для редактирования, и если вы попытаетесь удалить часть слова, все это будет удалено.

Вот официальный пример draftjs, использующий сущности, но использующий предварительно отмеченные сегменты. Я думаю, что в вашем случае это было бы так же просто, как сделать что-то подобное внутри findWithRegex (я не тестировал это, так что это может быть далеко — просто пытаюсь донести идею):

 let newContentState = editorState.getCurrentContent();

findWithRegex(regex, contentBlock, (start, end) => {
  const blockKey = contentBlock.getKey();
  const blockSelection = SelectionState
    .createEmpty(blockKey)
    .set("anchorOffset", start)
    .set("focusOffset", end);

  const searchEntity = content.createEntity(
    "SEARCH", // type
    "MUTABLE", // mutability <--
  );
  const entityKey = content.getLastCreatedEntityKey();

  newContentState = Modifier.applyEntity(searchEntity, blockSelection, entityKey);
})

return EditorState.push(editorState, newContentState, "apply-search-styling");