Вообще, у OctoberCMS есть плагин Wysiwig Editors. С этим плагином можно из коробки получить для блог-постов поддержку TinyMCE, CKEditor и даже Froala. Но я все это попробовал и пришел к выводу, что мне встроенный Markdown-редактор как-то ближе — то ли ввиду чистоты HTML на выходе, то ли еще почему. Решил пока на нем остановиться.
Но есть у этого редактора недостаток: чтобы понять, как его расширить, надо покопаться в коде. Код чистенький, понятный, но покопаться надо. В общем, я покопался, теперь рассказываю, как добавить в Markdown-редактор новую кнопку на примере своего старого js-типографа.
TL;DR: рассматриваемый далее код можно опробовать в действии в составе плагина BlogArchive.
Чтобы внедрить скрипт, добавляющий кнопку редактор, воспользуемся документированным способом расширения форм через события в методе boot() плагина. Заодно и скрипт типографа сразу добавим:
public function boot() {
Event::listen('backend.form.extendFields', function (Form $widget) {
// добавляем скрипты только если у формы контроллер Posts
if (!($widget->getController() instanceof \RainLab\Blog\Controllers\Posts)) {
return ;
}
$widget->addJs('/plugins/graker/blogarchive/assets/js/typofilter.js');
$widget->addJs('/plugins/graker/blogarchive/assets/js/typofilter-markdown-extend.js');
});
}
Теперь сам скрипт добавления кнопки:
+function ($) {
$(document).ready(function () {
// ищем на странице редактор
var editor = $('[data-control="markdowneditor"]').data('oc.markdownEditor');
// создаем кнопку
var button = {
// Название кнопки:
label: 'Typofilter',
// иконка
icon: 'magic',
// после какой кнопки вставить
insertAfter: 'formatting',
// какой метод редактора выполнить по нажатию
action: 'runTypofilter',
// темплейт для замены
template: '$1'
};
// определяем метод, который будет вызван по нажатию на кнопку
editor.runTypofilter = function (template) {
var editor = this.editor,
pos = this.editor.getCursorPosition(),
text = editor.session.getTextRange(editor.selection.getRange()).trim();
if (!text.length) {
// если выделение пустое, выделим весь текст
editor.selection.selectAll();
text = editor.session.getTextRange(editor.selection.getRange()).trim();
}
text = Typographus.process(text);
// вставляем обработанный текст в редактор
editor.insert(template.replace('$1', text));
editor.moveCursorToPosition(pos);
if (template.indexOf('$1') != -1) {
editor.navigateRight(template.indexOf('$1'))
}
editor.focus();
};
// добавляем кнопку в редактор
editor.addToolbarButton('typofilter', button);
});
}(window.jQuery);
Тут нужно заметить, что если не использовать insertAfter (или insertBefore) в описании структуры кнопки, кнопка не добавится на основной тулбар. Это, видимо, баг, но пока вот так. Про работу с selection и range можно почитать здесь, а про набор иконок для кнопок — вот тут.
Вот и всё, кнопка типографа добавлена. Кстати, сам типограф, слегка подправленный, теперь живет на Гитхабе.

