Демонстрационный форум kozhilya

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Демонстрационный форум kozhilya » MyBBCode » MyBBCode — обзор


MyBBCode — обзор

Сообщений 1 страница 12 из 12

1

MyBBCode

MyBBCode — гибкий инструмент для работы с BB-кодами на форумах, основанных на платформе mybb.ru.

Обзор / Документация

Разработано kozhilya, 2020 — 2021. Текущая версия — 1.2.

Поддерживаемые браузеры

Неподдерживаемые браузеры

  • firefox Firefox 43+

  • Chromium 49+

    • chrome Google Chrome

    • edge Microsoft Edge 13+

  • safari Safari 11+

  • opera Opera 36+

  • internet-explorer Internet Explorer (все версии)

  • opera Opera Presto (в т.ч. Opera Mini)


Подключение утилиты

Чтобы установить скрипт, нужно в начало HTML-верха ("Администрирование" / "Формы" на форумах mybb.ru) добавить следующий загрузчик:

Код:
<!-- Инструмент для добавления bb-кодов -->
<script src="https://mybb.kozhilya.ru/script/mybbcode.min.js?ver=1.2"></script>

Обратите внимание, что скрипт сам по себе ничего не делает. Для работы необходимо добавить дополнительный код (так же в HTML-верх), в котором необходимо задать, какие именно изменения предполагаются.

Обратите внимание, что этот инструмент не делает ничего самостоятельно, и для работы необходимо добавить дополнительный код. Все дополнительные объявления, использующие MyBBCode также должны быть добавлены в HTML-верх после загрузки утилиты (после кода, указанного выше).

Объявления обработчиков и других элементов MyBBCode в HTML-низ возможна, но крайне не рекомендуется, так как это не является ожидаемым поведением.
Я этой утилитой хочу разгрузить HTML-низ, зачем туда всё это пихать?! XD

2

F.A.Q.

Зачем нужна эта утилита?


Недавние изменения на MyBB, в частности, добавление пользовательских тегов и ajax в форме ответа, несколько изменили методы работу с пользовательскими тегами: первое изменение упростило, второе же усложнило. Это, впрочем, нормально, но, по меньшей мере, у меня случилась некоторая фрустрация оттого, как в некоторых местах приходиться работать с некоторыми тегами. Фрустрацию я преодолел, написав прослойку, которая позволяет при помощи относительно короткого и простого кода добавить методы для модификации.

Что утилита делает?


Если простыми словами, то данный скрипт не делает ничего сам по себе, но он помогает облегчить жизнь тем, кто использует различные скрипты для модификации сообщений на форумах, обеспечивая простой доступ к

  • обработке сообщений, в том числе загруженных через ajax, добавленных в предпросмотр и других местах,

  • добавлению кнопок в форме ответа, а так же изменению порядка их отображения.

И всё это с использованием последних новинок на сервисе MyBB, которые могут позволить минимизировать количество кода для реализации простых функций.

Где можно посмотреть, как работает утилита?


На данный момент, известно, что утилита установлена на следующие форумы:

Если вы начали использовать утилиту и так же хотите попасть в этот список, свяжитесь со мной (контакты можно найти на главной странице этого сайта).

На моём форуме и так всё хорошо работает, почему мне стоит начать использовать эту утилиту?


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

  • Они не гибкие. Как правило, они добавляются в HTML-низ, и срабатывают 1 раз, когда загрузится страница. И когда на MyBB появилась возможность сообщения при помощи ajax, то есть без полной перезагрузки страницы, оказалось, что новые сообщений не обрабатываются. И решение этой проблемы весьма нетривиальное, так что многие предпочли отключить эту функцию совсем.

  • Пользовательские bb-теги громоздки. Если у вас есть скрипт, который добавляет какой-либо bb-код, то он с вероятностью 99% имеет регулярное выражение типа /\[example=(.*?)\](.*?)\[\/example\]/gi — и это ещё безобидный пример.

  • Пользовательские bb-теги перестраивают DOM-дерево. Это происходит из-за того, что идёт переопределения значения .innerHTML (возможно через jQuery.html()). Подобная перестройка кажется крайне незначительной проблемой, но тут есть несколько "забавных" проблем. Во-первых, это относительно медленно, да, порядка 0.1 секунды, но браузеру потребуется время. Если же это делается несколько раз подряд, то и того дольше. Во-вторых, при таком подходе полностью убивается DOM-структура. Я думаю, некоторые встречались с проблемой, что после добавления bb-кода, в сообщении переставали работать всплывающие подсказки — так вот это именно из-за того, текст с подсказкой мог сохранить свои внешние атрибуты, но само сообщение подсказки теряется, так как оно было записано в JS-данные, которые перестали ассоциироваться с новым элементом.

Утилита MyBBCode решает все указанные выше проблемы:

  • Вместо перебора сообщений утилита использует следующие jQuery-события:

    • pun_main_ready — начальная загрузка страницы;

    • pun_preview — ajax-предпросмотр сообщения;

    • pun_post — ajax-отправка сообщения;

    • pun_edit — ajax-редактирование сообщения;

    • spoiler.firstOpen — открытие спойлера с загрузкой при открытии (медиа-спойлер).

    Это позволяет использовать все возможные сообщения, как загруженные классическим образом, так и для добавленные после отправки через ajax. При этом можно без проблем добавлять свои события, если требуется добавление сообщений каким-то другим способом.

  • Использование встроенной в движок системы пользовательских тегов позволяет избавиться от регулярных сообщений в JS, и в целом процесс добавления обработчиков тегов в MyBBCode занимает меньше места, таким образом предоставляя больше возможностей при меньшем объёме кода.

  • Так же система пользовательских тегов уже добавляет HTML-контейнеры для тегов, что позволяет изолировать область изменения DOM-древа, и даже вовсе избавиться от подобных манипуляций.

Разумеется, я не могу заставить вас использовать этот функционал. Однако, если аргументы выше вас не убедили, прежде чем отказываться от инструмента совсем, я прошу посмотреть примеры реализации тегов, и подумать, как это может помочь улучшить код, который уже имеется у вас на форуме.

Почему такая поддержка браузеров? Почему мой браузер не поддерживается?!


Да, в скрипте использованы "новые" технологии, которые на MyBB использую, похоже, только я. Вот их список:

  • ES6-класс — работает во всех актуальных браузерах с марта 2016 года (последними реализовали Mozilla Firefox);

  • let — работает во всех актуальных браузерах с марта 2016 года (последними реализовали Mozilla Firefox); в 2017 году Safari исправили баг, который касался случаев, не используемых в данной утилите.

  • стрелочные функции — работает во всех актуальных браузерах с сентября 2016 года (последними реализовали Safari);

  • строки-подстановки — работает во всех актуальных браузерах с марта 2016 года (последними реализовали Safari);

Да, это "синтаксический сахар", без которого можно обойтись... Но все эти вещи были предложены в ECMAScript 6, уже устаревшем стандарте, на котором основан JavaScript, в 2015 (!!!) году, и поддерживаются основными браузерами лишь слегка меньший срок. И я не хочу возвращаться во времени и писать устаревший код, используя прототипы и костыли вроде var self = this для сохранения доступа к текущему объекту в подчинённых функциях.

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

Что такое обработчики и адаптеры?


Двумя основными инструментами для обработки сообщений в MyBBCode являются обработчики тегов и адаптеры.

  • Обработчики тегов — это способ дополнительно обработать теги, добавленные через систему пользовательских тегов (/admin_forms.php — "Пользовательские bb-теги"). Для того, чтобы добавить адаптер, необходимо использовать метод addTag.

  • Адаптеры позволяют производить более общие манипуляции над сообщениями. Для того, что бы добавить адаптер, необходимо использовать метод addAdapter.

3

Обработчик тега (почти) без JS

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

Примером такого тега может служить тег красной строки indent, который часто используется на форумах с литературными произведениями и ролевых играх.

Пример реализации тега через JS без системы пользовательских тегов
Код:
<!--ТЕГ абзаца - [indent] -->
<style>#button-indent {background:url(http://s7.uploads.ru/t/mnkgq.png)no-repeat center 6px!important;}</style>
<script type="text/javascript">(function(){ var b = '[indent]';
$("#button-strike").after('<td id="button-indent" title="Отступы"><img src="/i/blank.gif"  onclick="smile(\''+b+'\')"></td>');
var indent = '<span style="display:inline-block;margin:1em 2.1em;"></span>'; /*удвоенные Отступы сверху и слево*/
$('.post-content p:contains("'+b+'")').each(function(){ $(this).html( $(this).html().replace(/\[indent\]/gm,indent));});}());
</script>

Пример выше — это довольно распространённый тип кода на MyBB: сжать посильнее, что бы сложно было что-то сломать. Ничего, в принципе, плохого, но тут всё равно используется JS. А можно и без них.

Определим новый тег indent:sio в поле "Формы" / "Пользовательские bb-теги", где:

  • indent — идентификатор тега;

  • Флаг s сообщает, что тег должен быть одиночным (то есть не должен иметь закрывающий тег);

  • Флаг i сообщает, что тег должен считаться строчным и не разбивать структуру абзацев;

  • Флаг o сообщает, что вокруг тега не должно быть горизонтальных пробельных символов, например, пробелов и табуляций.

Пример работы кода

Пример работы парсера пользовательского тега с такими настройками. Расширенный пример.

Код:
[indent] Nulla suscipit velit non nisl tempor, ut convallis orci semper.

Будет разобран как

Код:
<p><span class="custom_tag custom_tag_indent"></span>Nulla suscipit velit non nisl tempor, ut convallis orci semper.</p>

Теперь осталось лишь добавить отображение тега и его кнопку.

Пример реализации тега с использование MyBBCode и системы пользовательских тегов
Код:
<!--ТЕГ абзаца - [indent] -->
<style>#button-indent {background:url(http://s7.uploads.ru/t/mnkgq.png)no-repeat center 6px!important;}
.custom_tag_indent {margin:1em 2.1em;}</style>
<script>
    MyBBCode.addEditorButton('indent', {
        name: "Красная строка",
        onclick: () => smile('[indent]'),
    }, 'left');
</script>

Очевидно, что такой код гораздо проще воспринимать, особенно если перенести содержимое <style> в стили форума.

4

Обработчик простого тега

Разумеется, не все теги настолько простые, что могут обойтись вообще без дополнительной обработки, как indent из примера выше. Тем не менее, с использованием MyBBCode и системы пользовательских тегов, и такие теги можно описать гораздо проще, чем без них.

Возьмём, для примера, тег shadow, который добавляет тексту тень с параметрами. Хоть этот код и занимается только оформлением, совсем без JS обойтись, увы, не получится, так как передача параметра пользовательского тега как CSS-значения не реализована, и, скорее всего, никогда не будет реализована ввиду неадекватного количества усложнений, которое потребуется добавить в систему пользовательских тегов.

Пример реализации тега через JS без системы пользовательских тегов

Ссылка на оригинал

Код:
<!--шрифт с тенью © Romych-->
<script language="javascript">
function tag_shad()
{var FoundErrors = '';
var enterTITLE = prompt('Введите цвет тени', 'red');
if (FoundErrors)
{alert("Ошибка!" + FoundErrors);
return;}
bbcode('[shadow='+enterTITLE+']','[/shadow]');}
$(function(){
$('td#button-link').before('<td style=\'background-image:url("http://www.iconsearch.ru/uploads/icons/gnomeicontheme/16x16/stock_text-shadow.png")\' onclick="tag_shad()"><img src="/i/blank.gif" title="Шрифт с тенью"></td>');
$("div.post-content").map(function () {
text = $(this).html();
if(text.indexOf("[/shadow]") != -1) {
shadowes = /\[shadow=(.*?)\]([^`]*?)\[\/shadow\]/gi
$(this).html(text.replace(shadowes, "<font style='width=80%; text-shadow:$1 1px 1px 2px; filter:shadow(color=$1)'>$2</font>")); }
}); });
</script>

Как обычно, начнём с определения нового тега shadow:i в поле "Формы" / "Пользовательские bb-теги", где:

  • shadow — идентификатор тега;

  • Флаг i сообщает, что тег должен считаться строчным и не разбивать структуру абзацев;

Пример работы кода

Пример работы парсера пользовательского тега с такими настройками. Расширенный пример.

Код:
[shadow] Nulla suscipit velit non nisl tempor, ut convallis orci semper. [/shadow]

Будет разобран как

Код:
<p><span class="custom_tag custom_tag_shadow"> Nulla suscipit velit non nisl tempor, ut convallis orci semper. </span></p>

Добавим теперь обработчик

Пример реализации тега с использование MyBBCode и системы пользовательских тегов
Код:
<style>
#button-shadow {background-image:url("http://www.iconsearch.ru/uploads/icons/gnomeicontheme/16x16/stock_text-shadow.png");}
</style>
<script>
MyBBCode.addTag('shadow', (elem, selector, set_html) => {
    elem.css('text-shadow', elem.attr('alt') + ' 1px 1px 2px');
});

MyBBCode.addEditorButton('shadow', {
    name: "Шрифт с тенью",
    onclick: () => {
        const value = prompt('Введите цвет тени', 'red');
        if (!value) return;
        bbcode(`[shadow="${value}"]`, '[/shadow]');
    },
}, 'link');
</script>

5

Обработчик тега: пример работы с ajax

Для того, чтобы добавить обработчик тега, необходимо использовать метод addTag.
У данного метода 2 аргумента: идентификатор тега и непосредственно функция-обработчик. Подробнее о них написано в документации к методу.

Для корректной работы обработчика рекомендуется (но не необходимо) указать для пользовательского тега флаг u (unique).

Определим тег, который будет загружать некоторые данные через API. Для этого добавим в поле "Формы" / "Пользовательские bb-теги" новый тег dumpapi:au, где:

  • dumpapi — идентификатор тега;

  • Флаг a (attribute) сообщает, что у тега есть параметр после знака "=" в открывающем теге;

  • Флаг u (unique) сообщает, что тегу будет добавлен уникальный атрибут-идентификатор id.

Пример обработки кода

Пример работы парсера пользовательского тега с такими настройками. Расширенный пример.

Код:
[dumpapi=board.get]{"fields":"title,active_users"}[/dumpapi]

То есть параметр тега (в примере, board.get) указывает, какой метод необходимо вызвать, а содержимое ({"fields":"title,active_users"}) — дополнительные API-параметры в формате JSON.

Такой код будет обработан парсером MyBB следующим образом:

Код:
<div class="custom_tag custom_tag_dumpapi" alt="board.get" id="dumpapi-1"><p>{"fields":"title,active_users"}</p></div>
Пример реализации такого тега без MyBBCode и без пользовательских тегов MyBB.
Код:
<script>
$('.post p:contains(dumpapi)').each(function() {
    $(this).html($(this).html()
        .replace(/\[dumpapi=(.*?)\](.*?)\[\/dumpapi\]/g,
        function(str, param, inner) { 
            // Восстанавливаем все символы из html-кода
            inner = $('<span></span>').html(inner).text();
        
            // Устанавливаем данные для загрузки
            var data = Object.assign({ method: param }, JSON.parse(inner));

            // Генерируем уникальный идентификатор
            var id = 'dumpapi-' + Math.ceil(Math.random() * 100000);
            
            // Загружаем данные
            $.ajax({
                method: 'get',
                url: '/api.php',
                data: data
            }).done((ajaxdata) => {
                // Имитация долгой загрузки данных
                setTimeout(() => {
                    $('#' + id).html('<pre>' + JSON.stringify(ajaxdata.response, null, 4) + '</pre>');
                }, 5000);
            });
            
            // Возвращаем временное значение
            return '<div id="' + id + '">Данные загружаются...</div>';
        }
    );
});
</script>

30 строк кода (можно меньше, но тогда всё станет ещё менее понятным.

Пример реализации с использованием MyBBCode
Код:
<!-- Демонстрация работы инструмента для добавления bb-кодов -->
<script>
    MyBBCode.addTag('dumpapi', (elem, selector, set_html) => {
        let data = Object.assign({ method: elem.attr('alt') }, JSON.parse(elem.text()));
        
        // Устанавливаем стандартный текст-заглушку
        set_html(false);
        
        $.ajax({
            method: 'get',
            url: '/api.php',
            data: data
        }).done((ajaxdata) => {
            // Имитация долгой загрузки данных
            setTimeout(() => {
                set_html('<pre>' + JSON.stringify(ajaxdata.response, null, 4) + '</pre>');
            }, 5000);
        });
    });
</script>

17 строк кода, при этом значительно меньше кода требуется на то, что бы указать, что разбирается именно этот код. При этом этот код будет корректно работать, если он был загружен через AJAX, например, после редактирования сообщения.

Результат:

{"fields":"title,active_users"}

6

* Зарезервировано за дополнительным примером *

7

Адаптер сообщений

Не всегда перед нами стоит задача добавления новых bb-кодов, иногда нам нужно изменить старые. Одним из самых заметных вариантов такого изменения является кнопка "Выделить код", которая, кажется, уже давно должна стать стандартной функцией MyBB, но да не об этом мы сейчас.

Пример реализации такого тега без MyBBCode и без пользовательских тегов MyBB.

Ссылка на оригинальный скрипт

Код:
<script>
/* Выделение кода в блоках code, новая версия, 29.04.2017 © Alex_63 / updated 08.08.2020 © */

function select_text(c) {
  var d = window.getSelection || document.getSelection;
  if (d) {
    var a = d();
    if (a.selectAllChildren) {
      a.selectAllChildren(c);
    } else if (a.setBaseAndExtent) {
      a.setBaseAndExtent(c, 0, c, c.innerText.length - 1)
    } else {
      var b = document.createRange();
      b.selectNodeContents(c);
      a.removeAllRanges();
      a.addRange(b)
    }
  } else if (document.selection) {
    var b = document.body.createTextRange();
    b.moveToElementText(c);
    b.select()
  }
}
select_text.linkText = 'Выделить код';
$().pun_mainReady(function() {
  var text = select_text.linkText ? select_text.linkText : 'Выделить код';
  var codeLegend = '<a href="javascript://" onclick="select_text($(this).parent().next().find(\'pre\').get(0));return!1">' + text + '</a>';
  $('.code-box .legend').html(codeLegend);
  $('.punbb').on('click', '.spoiler-box > div', function() {
    $(this).next('blockquote').find('.code-box .legend').html(codeLegend);
  })
});
</script>
Пример реализации с использованием MyBBCode
Код:
<script>
    window.selectCode = (target) => {
        const rng = document.createRange();
        rng.selectNode(target);
        const sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(rng);
    }
    
    MyBBCode.addAdapter((container) => {
        $('.code-box .legend', container).empty().append('<a href="javascript://" onclick="selectCode($(this).parent().next().find(\'pre\').get(0));return!1">Выделить код</a> (<a href="javascript://" onclick="selectCode($(this).parent().next().find(\'pre\').get(0));document.execCommand('copy');return!1">скопировать сразу</a>)');
    });
</script>

Более короткий код для selectBox связан с тем, что другие ветки требуются для работы скрипта в старых браузерах, где не работает Selection API.

Альтернативная версия реализации
Код:
<template id="select-code-cite">
    <a href="javascript://" onclick="selectCodeBlock(this,false);return!1">Выделить код</a>
    (<a href="javascript://" onclick="selectCodeBlock(this,true);return!1">скопировать сразу</a>)
</template>
<script>
    window.selectCodeBlock = (a, copy) => {
        const target = $(a).parent().next().find('pre')[0];
        const rng = document.createRange();
        rng.selectNode(target);
        const sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(rng);
        if (copy) {
            document.execCommand('copy');
        }
    }
    
    MyBBCode.addAdapter((container) => {
        $('.code-box .legend', container).html($('template#select-code-cite').html());
    });
</script>

8

Обработчик столбца автора

Очень часто стоит задача изменить или обработать данные, которые находятся в столбце автора. Но когда сообщение добавлено через AJAX, классические способы обработки столбца автора перестают работать. И для решения этой проблемы добавлен метод addAuthorEditor.

Пример без использования MyBBCode

Ссылка на оригинальную версию

Код:
<!-- Аватар по умолчанию / Deff, Alex_63 -->
<script type="text/javascript">
var DefAvtr = 'http://savepic.org/1864006.png'; //Ссылка на аватар по умолчанию

$('#pun-viewtopic,#pun-messages').find('.pa-title').each(function(){
var L='<li class="pa-avatar item2"><img class="defavtr" src="'+DefAvtr+'" alt="Аватар"/></li>';
if($(this).parent().find('.pa-avatar').html()==null)$(this).after(L);});
$('#profile-left strong:contains("Нет аватара")').parent().html('<div><img src="'+DefAvtr+'"/></div>');
</script>
Пример реализации с использованием MyBBCode
Код:
<script>
    window.DefaultAvatar = "https://placehold.co/100x150/png";
    MyBBCode.addAuthorEditor((ul) => {
        if ($('> li.pa-avatar', ul).length === 0) {
            const name = $('> li.pa-author a', ul).html();
            $('> li.pa-title', ul).after(
                `<li class="pa-avatar"><img src="${window.DefaultAvatar}" alt="${name}" title="${name}" /></li>`);
        }
    });
    $('#profile-left li#pa-avatar').html(`<div><img src="${window.DefaultAvatar}" /></div>`);
</script>

9

Дополнительные события и добавление сообщений

Если вы, по какой-то причине, хотите добавить ещё какое-либо событие, то вы можете сделать, используя метод registerEvent(name, resolver).

Это полезно, когда вы загружаете содержимое сообщений через /api.php?method=post.get. Тогда вы можете написать такой код:

Код:
// Регистрация события process_post
MyBBCode.registerEvent('process_post', (e) => $(e.sender));

// Загрузка сообщения
$.getJSON('/api.php?method=post.get&...', (jsondata) => {
    // Устанавливаем код сообщения
    $('#target').empty().append(jsondata.response.message);    
    
    // Вызываем событие для обработчика
    $(document).trigger($.event('process_post', { sender: $('#target') }));
});

Заметка: вы можете вместо добавления события использовать вызов метода processPostContents($('#target')), однако я рекомендую использовать вариант выше, так как, в идеале, этот метод в принципе не должен быть публичным. Однако скрыть его я, пока что, не могу, так как на данный момент приватные методы лишь на стадии предложения к стандарту, и, увы, не имеют широкой браузерной поддержки.


Примером ситуации, когда этот метод может быть полезен, является вариант с добавлением, например, ленты последних новостей из темы в объявлении. Для этого добавим в администрировании форума в "Формы" / "Объявление" код:

Код:
<template id="news-feed-item">
    <li class="post news-feed-item">
        <h4><a href="${link}">${time}</a></h4>
        <div class="post-content">${data.message}</div>
    </li>
</template>
<div class="news-feed"></div>
<script>
// Регистрация события process_post
MyBBCode.registerEvent('process_post', (e) => $('.post-content', e.sender));

window.NewsFeedTopicId = 2;
window.NewsFeedLimit = 10;

// Загрузка сообщений
$.getJSON(`/api.php?method=post.get&sort_dir=desc&fields=id,username,message,posted&topic_id=${window.NewsFeedTopicId}&limit=${window.NewsFeedLimit}`, (jsondata) => {
    const root = $('.news-feed');
    const template = $('template#news-feed-item').html();
    
    for (let i = 0; i < jsondata.response.length; i++) {
        // Получаем данные об элементе
        const data = jsondata.response[1];
        
        // Генерируем ссылку и время отправки сообщения
        const link = `/viewtopic.php?pid=${data.id}#p${data.id}`;
        const time = (new Date(parseInt(data.posted) * 1000)).toDateString();
        
        // Генерируем элемент
        const item = $(eval('`' + template + '`'));
        
        // Добавляем элемент
        root.append(item);
        
        // Вызываем событие для обработки сообщения
        $(document).trigger($.event('process_post', { sender: item }));
    }
});
</script>

10

Добавление кнопки формы ответа

Помимо добавления обработчиков тегов, MyBBCode также позволяет добавить кнопки формы ответа. Например, если мы хотим добавить кнопку для добавления красного абзаца с тегом indent:

Код:
<style>#button-indent {background:url(http://s7.uploads.ru/t/mnkgq.png)no-repeat center 6px!important;}</style>
<script>
    MyBBCode.addEditorButton('indent', {
        name: "Красная строка",
        onclick: () => smile('[indent]'),
    }, 'left');
</script>

Второй параметр функции addEditorButton — объект, к которому в последствии можно будет обратиться как FORUM.editor.indent (разумеется, заменив идентификатор indent на необходимый.

Обратите также внимание, что третий параметр функции addEditorButton указывает перед какой имеющейся кнопкой нужно установить новую. Так что, что бы поставить кнопку в начало строки кнопок, можно сюда установить значение 0. Что бы установить кнопку в конец формы ответа, либо опустите значение полностью, либо используйте значение false.

11

Изменение набора кнопок формы ответа

Помимо этого, набор кнопок в форме ответа можно полностью переопределить, манипулируя массивом MyBBCode.editor.buttons.
Например, можно сделать упрощённое наполнение формы ответа, установив следующее значение:

Код:
<script>
    MyBBCode.editor.buttons = [ 'bold', 'italic', 'underline', '|', 'left', 'center', 'right', '~', 'quote' ];
</script>

Как можно заметить, помимо обычных кнопок, в MyBBCode есть специальные кнопки.

  • '|'<td class="form-buttons-splitter"> </td> — некликабельный разделитель, который можно использовать для визуального разделения кнопок.

  • '~'<td class="form-buttons-filler"> </td> — заполнитель между кнопками.

  • '\n' — разделитель строк.

Обратите внимание, что для работы '|' и '~' необходимо установить дополнительные стили.
Набор и значения всех этих кнопок можно изменить в MyBBCode.editor.specials.

Специальные кнопки можно также добавлять при помощи метода MyBBCode.addEditorButton:

Код:
MyBBCode.addEditorButton('|', null, 'left');

12

Изменение метода генерации кнопок формы ответа

Если вы хотите изменить метод генерации кнопок формы ответа, например, использовать иконки из набора Font Awesome, можно изменить метод генерации при помощи MyBBCode. Для примера сделаем форму ответа, генерируемую не в таблицу, а в div с элементами, расположенных при помощи Flexbox.

Код:
// Устанавливаем обёртку списка кнопок
MyBBCode.editor.wrapper = [ '<div class="flex-form-buttons">', '</div>' ];

// Переопределяем специальные кнопки (не обязательно)
MyBBCode.editor.specials['\n'] = '</div><div class="flex-form-buttons">';
MyBBCode.editor.specials['|'] = '<div class="flex-form-buttons-splitter"><i class="fas fa-grip-lines-vertical"></i></div>';
MyBBCode.editor.specials['~'] = '<div class="flex-form-buttons-filler"> </div>';

// Наконец, изменяем список кнопок.
MyBBCode.editor.generator = function(key, value) {
    let icon;
    
    switch(key) {
        case 'size':     icon = 'text-height'; break;
        case 'strike':   icon = 'strikethrough'; break;
        case 'spoiler':  icon = 'book'; break;
        case 'hide':     icon = 'lock'; break;
        case 'quote':    icon = 'quote-left'; break;
        case 'color':    icon = 'palette'; break;
        case 'addition': icon = 'tools'; break;
        
        case 'left': 
        case 'center': 
        case 'right': 
        case 'justify': 
            icon = 'align-' + key; break;
        
        default: icon = key;
    }   
    
    return `<div class="flex-form-buttons-button" id="button-${key}" title="${value.name}"`
        + ` onclick="FORUM.get('editor.${key}.onclick()')"><i class="fas fa-${icon}"></i></div>`
};

Дополним это такими стилями:

Код:
.flex-form-buttons {
    display: flex;
    flex-flow: row nowrap;
    justify-content: center;
    align-items: center;
}
.flex-form-buttons .flex-form-buttons-button {
    font-size: 1.2em;
    flex: 0 1 auto;
    padding: 0.5em;
    text-align: center;
    cursor: pointer;
}

.flex-form-buttons .flex-form-buttons-splitter {
    font-size: 1.8em;
    padding: 0.1em;
}

.flex-form-buttons .flex-form-buttons-filler {
    flex-grow: 1;
}

И, примера ради, добавим разделитель и заполнитель:

Код:
MyBBCode.addEditorButton('|', null, 'bold');
MyBBCode.addEditorButton('~', null, 'addition');
Скриншот результата работы кода выше

https://i.imgur.com/iRE9zsT.png


Вы здесь » Демонстрационный форум kozhilya » MyBBCode » MyBBCode — обзор