- PVSM.RU - https://www.pvsm.ru -
jQuery Drag and Drop WYSIWYG HTML билдер генерирует Bootstrap HTML и JS. Редактор выделяет необходимый JS код (около 0% — 15%) из своего исходника и предоставляет его в результирующем HTML для обеспечения инициализации сторонних JS библиотек во фронтенде.
Вдохновителем моего проекта был успешный продукт Visual Composer [1] — редактор для WordPress, который относится к современному тренду — Drag and Drop Page Builder. После анализа множества аналогичных билдеров я обнаружил:
Затем я пришел к выводу, что если пожертвовать возможностью управления динамическим содержимым из БД, то можно сделать билдер на чистом JavaScript. И после разработки моего проекта я сделал такие выводы:
При проектировании я оттолкнулся от такой формулировки задачи: нужно облегчить пользователю конвертацию его данных и дизайнерских идей в HTML. Почему пользователь не может (или не хочет) сам писать HTML:
Вдохновителем архитектуры проекта был механизм shortcodes в CMS WordPress. Само название шорткодов говорит о краткой записи какого-то куска HTML/JS с понятными и действительно важными для пользователями атрибутами. Шорткоды — это примерно тоже самое, что и XML: дерево тегов с атрибутами, просто вместо символов "<>" используются символы "[]". Идея в том, чтобы кратко описывать документ с помощью иерархии.
Первые версии моего проекта хранили результат редактирования в шорткодах, но в последствии я от них отказался, потому что он не могут нормально парсится поисковыми системами и мне хотелось убрать дублирующее описание одного и того же документа — я все уложил в HTML со специальными «data» атрибутами. Конечно, тут есть минус — нагромождение атрибутов, утяжеляющее страницу. В ответ на это можно сказать, что разработчики сайтов тоже довольно часто нагромождают HTML ненужными классами, особенно это часто бывает в CMS для какой-либо универсализации. Это, конечно, не снимает проблему но, хотя бы немного успокаивает.
Получается, если мы делаем WYSIWYG редактор шорткодов, нам нужно в процессе редактирования поддерживать постоянную связь между шорткодами и HTML узлами. По сути получается, что у нас есть 2 модели документа: DOM и шорткоды, которые постоянно синхронизируются между собой, причем шорткодную модель пользователю легче редактировать. Шорткоды в своем проекте я называю элементы, их атрибуты — параметры. Элемент может иметь дочерние элементы. У каждого элемента есть 2 точки связи с DOM — корневая (входная) и та, к которой присоединяются корневые узлы элементов детей (выходная).
Параметр должен быть удобным для редактирования. У параметра должно быть описание. Я объявил базовый класс параметра со следующими основными методами:
Элемент может иметь какой-либо список параметров. У элемента должно быть описание. Я объявил базовый класс элемента со следующими основными методами:
Для каждого элемента можно открыть форму редактирования его параметров. Форма просто по очереди рендерит параметры и вызывает событие активации. На основании описаний параметров пользователь может быстро разобраться как работает элемент в деталях. При сохранении отредактированных параметров алгоритм обновления элемента следующий (описанный в базовом классе элемента):
В режиме редактирования всегда при рендеринге элемента в его корневой DOM элемент добавляется HTML блок с кнопками и JS обработчиками — контролы элемента. Для контролов легко настроить CSS так, чтобы они появлялись, не сильно мешая содержимому документа.
Параметры элемента и его тип хранятся в составе атрибутов корневого DOM узла данного элемента. Выходной узел помечается специальным атрибутом для парсера. Перед сохранением из документа DOM удаляются контролы и всевозможные вспомогательные классы типа: resizable, draggable, sortable и т.д. В начало результирующего HTML добавляются включения необходимых CSS/JS файлов, которые затребовали использованные в документе сторонние JS библиотеки. Если сторонние JS библиотеки были использованы, в начало добавляется еще и загрузчик.
Загрузчик — это вырезка из JS-исходника самого редактора. В загрузчик добавляются:
Возможно ли придумать такую архитектуру подобного WYSIWYG редактора, чтобы минимизировать «data» атрибуты и JS загрузчик до уровня, к которому никто не смог бы предъявить претензии по объему.
Исходник проекта [2]
Автор: andy133
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/70295
Ссылки в тексте:
[1] Visual Composer: http://vc.wpbakery.com
[2] Исходник проекта: https://github.com/azexo/Azexo-Composer-WYSIWYG
[3] Источник: http://habrahabr.ru/post/238093/
Нажмите здесь для печати.