Компьютерная помощь
Сайт комнаты "Компьютерная помощь"

Yii2 Использование syntaxhighlighter в tinyMCE

Программирование | 4 декабря 2016 г.

Для одного своего проекта на фреймворке Yii2 потребовалось использование визуального текстового редактора с одним обязательным условием, поддержка подсветки кода. После длительных поисков остановил свой выбор на редакторе tinyMCE с плагином syntaxhighlighter. Также нашел инструкцию по подключению подсветки кода на фронтенде здесь. Сделал все по инструкции, вроде работает. Самое главное, из среди десятка языков одновременно подключаются скрипты только тех языков, которые фактически используются на текущей странице сайта.
Но появилась другая проблема. У меня кроме текста статьи, подсветка кода может потребоваться также на комментариях. При подключении по инструкции, в исходном коде станицы появился такой код:

	SyntaxHighlighter.autoloader("bash");SyntaxHighlighter.all();
        SyntaxHighlighter.autoloader("php");SyntaxHighlighter.all();

Но в идеале должно быть так:

	SyntaxHighlighter.autoloader("bash php");SyntaxHighlighter.all();

Задание ключей не поможет, просто будет перезаписываться код последующими обращениями и загрузится только один Brash в последнем обращении.
Такое поведение связано с тем, что AssetBundle для каждого отдельного содержимого станицы или комментария создается отдельно и нет связи между их вызовами. Задание ключей для регистрируемого скрипта не поможет (имеется ввиду аргумент $key в функции View::registerJs($js, $position = self::POS_READY, $key = null)), просто будет перезаписываться код последующими обращениями и загрузится только один Brash в последнем обращении.
После недолгих размышлений, пришел к такому решению. Отказаться от автолоадера и необходимые Brashes подключать сразу.
Если также столкнулись с подобной проблемой, рекомендую следующее. Делаете все так, как написано по инструкции по приведенной выше ссылке. Но когда дойдете до пункта 4 при настройке фронтенд части, AssetBundle для Yii2 создаете из этой статьи:

<?php
/**
 * Asset для подключения стилей кода для подсветки
 * @autor shah
 * Date: 02.10.16
 * Time: 22:56
 */

namespace frontend\assets;

use yii\web\AssetBundle;

class AssetSH extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [
        '/css/sh/shCoreDefault.css',
    ];

    // Тут зависимости указаны с тем, что код должен
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];

    private static $_asset;

    private $brushes = [
        [['php'], '/js/sh/shBrushPhp.js'],
        [['css'], '/js/sh/shBrushCss.js'],
        [['js'], '/js/sh/shBrushJScript.js'],
        [['bash'], '/js/sh/shBrushBash.js'],
        [['sql'], '/js/sh/shBrushSql.js'],
        [['xml', 'html'], '/js/sh/shBrushXml.js'],
        [['as3'], '/js/sh/shBrushAS3.js'],
        [['cf'], '/js/sh/shBrushColdFusion.js'],
        [['cpp'], '/js/sh/shBrushCpp.js'],
        [['csharp'], '/js/sh/shBrushCSharp.js'],
        [['delphi'], '/js/sh/shBrushDelphi.js'],
        [['diff'], '/js/sh/shBrushDiff.js'],
        [['erl'], '/js/sh/shBrushErlang.js'],
        [['groovy'], '/js/sh/shBrushGroovy.js'],
        [['java'], '/js/sh/shBrushJava.js'],
        [['jfx'], '/js/sh/shBrushJavaFX.js'],
        [['perl'], '/js/sh/shBrushPerl.js'],
        [['ps'], '/js/sh/shBrushPowerShell.js'],
        [['py'], '/js/sh/shBrushPython.js'],
        [['ruby'], '/js/sh/shBrushRuby.js'],
        [['scala'], '/js/sh/shBrushScala.js'],
        [['text', 'plain'], '/js/sh/shBrushPlain.js'],
        [['vb'], '/js/sh/shBrushVb.js'],
    ];

    public static function register($view, $content = null)
    {
        if ($content) {
            if (self::$_asset == null) {
                self::$_asset = $assetSH = new AssetSH();
            } else {
                $assetSH = self::$_asset;
            }
            $brushes = [];
            foreach ($assetSH->brushes as $key => $brush) {
                foreach ($brush[0] as $b) {
                    if (preg_match('/<pre.*?class="brush:\s*' . $b . ';.*?"/i', $content)) {
                        $brushes[] = $brush[1];
                    }
                }
            }
            if (!empty($brushes)) {
                parent::register($view);
                $view->registerJsFile('/js/sh/shCore.js');
                $brushes = array_unique($brushes, SORT_REGULAR);
                foreach ($brushes as $brush) {
                    $view->registerJsFile($brush);
                }
                // Поскольку текст кода не меняется, исключается дублирование кода.
                $view->registerJs('SyntaxHighlighter.all();');
            }
        }
    }
}

Все остальное точно также, как в приведенной статьи. Если будут вопросы, обращайтесь, обсудим, решим.
Удачи!

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru yandex.ru

При цитировании, копировании, клонировании материалов с сайта целиком или частично, ссылка на страницу, откуда был скопирован материал, обязательна! При нарушении данных условий прошу незамедлительно удалить со своих ресурсов скопированный материал. Администрация сайта.



Комментариев: 0

    Оставьте комментарий!

    Используйте нормальные имена

    Вы можете войти под своим логином или зарегистрироваться на сайте.

    (обязательно)