Что такое редактор форматированного текста?

Цель редактора форматированного текста - уменьшить усилия пользователей, пытающихся выразить свое форматирование как допустимую разметку HTML. Редактор форматированного текста дает пользователям возможность форматировать свой текст.

В какой-то момент каждый пользовался редактором форматированного текста. Так почему бы не построить такой? Вот некоторые из наиболее часто используемых редакторов форматированного текста.

  • Комментарии Reddit, YouTube и Hacker News.

  • Онлайн-редакторы для создания контента - написания блогов, руководств, новостей и т. Д.

  • Твиты, упоминания, хэштеги, опросы, списки и т. Д. В Twitter.

  • Редактирование документов и листов Excel, таких как Google Docs, Microsoft Word, Dropbox Paper.

Draft.js

В 2016 году Facebook представила свой новый фреймворк для редактора форматированного текста под названием Draft.js.

Вот вводная речь о Draft.js. Стоит посмотреть 25-минутное видео, чтобы понять, с какими проблемами столкнулась команда Facebook и как они их решили.

Slate.js

Ian Storm Taylor создал Slate.js вскоре после того, как Facebook открыл исходный код Draft.js.

Вот обсуждение Slate.js в Hacker News thread.

Аргументы в пользу создания Slate веские. Давайте проверим это, создав редактор форматированного текста.

Начиная

Для этого проекта нам понадобится следующее:

  • Текстовый редактор, подойдет любой, не стесняйтесь выбирать.
  • Node.js устанавливается вместе с npm / Yarn.
  • Базовые знания JavaScript. Если вы изучаете основы - этот список для изучения JavaScript может быть вам полезен.

Пойдем!

Запустите свой терминал и создайте новый проект React с помощью create-react-app.

npx create-react-app slate-react-rich-text-editor
cd slate-react-rich-text-editor
npm start

Slate предоставляет набор модулей, которые вы будете использовать для создания своего редактора. Самый важный из них - это Editor компонент. Компонент Editor - это фундаментальный уровень, на котором все будет построено. Думайте об этом как о корневом компоненте для всего редактора.

Для начала создадим папку components. Внутри каталога components мы создадим два файла с именами index.js и TextEditor.js.

Если мы откроем браузер, то увидим вот что.

Без проблем! Компонент Editor ожидает начальный value - как вы можете видеть в исходном коде.

Добавим в редактор наше начальное значение. Мы рассмотрим точную модель данных позже, когда разберемся с принципами работы Slate.

У нас должно получиться My first paragraph!, отображаемое в нашем приложении.

Сначала текст выглядит как простой <p> абзац. Но если мы исследуем элемент, от нас отвлечется океан сложности.

Попробуйте нажать на текст. Что ты видишь?

Текст доступен для редактирования! Если у вас нет инструментов разработчика React, вот ссылка на магазин приложений Chrome.

Помните, что мы добавили onChange прослушиватель событий в наш Editor компонент.

  1. Приемник событий onChange прослушивает события клавиатуры.
  2. После ловли нажатия клавиши.
  3. Мы обновляем текущее состояние новым нажатием клавиши.
  4. Отправьте новое состояние.
  5. Отрисовываем новое состояние на экране.

Однако редактор нам пока не очень полезен. Нам не хватает ключевых функций, таких как форматирование, сохранение текста и многие другие.

Добавление пользовательского форматирования

Обычно текст имеет большой заголовок, подзаголовок, курсив, полужирный, code и т. Д.

Давайте подумаем о следующих шагах по форматированию текста.

Обычная практика - начать с нажатия командной клавиши, например ctrl или cmd. Нажатие командной клавиши сообщает редактору, что мы редактируем, а не печатаем.

Например, мы могли бы сделать следующее: cmd ⌘+ b или alt + b - для добавления полужирного к нашему выделенному тексту.

Наш поток будет выглядеть так:

  1. Слушайте события / нажатия клавиш.

2. Различайте нажатые клавиши: alt, cmd или b и в каком порядке? А что произойдет, если эти клавиши действительно будут нажаты?

3. Активируйте фактическое изменение текста с желаемым форматированием.

Начните с добавления события onKeyDown для Editor и передайте обратный вызов.

Мы знаем, какую клавишу нажал пользователь. Давайте сделаем что-нибудь, в зависимости от того, какая клавиша нажата.

Хорошо, теперь у нас есть вся логика. Если пользователь нажал alt + b, измените текст на полужирный. Как вы думаете, нам следует подходить к стилизации?

Один из способов - создать новый многократно используемый компонент под названием BoldMark.js, который мы можем повторно использовать каждый раз, когда нам понадобится полужирный текст.

Компонент Editor имеет свойство renderMark, которое принимает обратный вызов. Внутри renderMark мы можем решить, как стилизовать текст.

Давай, попробуй! Выделите текст и нажмите alt + b:

Оно работает! Обратите внимание, что компонент BoldMark визуализируется внутри VDOM.

Еще один вопрос. Что произойдет, если мы передумаем? Мы хотим отменить выделение жирным шрифтом.

Slate позаботился о вас. Вместо добавления addMark(‘bold’ ) мы можем использовать toggleMark(‘bold’):

В довершение всего, можете ли вы добавить те же функции, но для курсива?

Курсив

Теперь давайте включим эти функции в наш Editor.

И включая компонент в наш renderMark метод.

Попробуйте!

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

Увидимся во второй части!



Исходный код на Github:



Примечание. Если вы хотите вывести свою игру на React на новый уровень, начните с этой книги.

Спасибо за прочтение!