Главная » FAQ » Подсветка кода в DLE

Подсветка кода в DLE

28-02-2011, 14:40 n0wheremany Комментарии (29) Просмотры (11574)
Подсветка кода в DLE Многие задают вопросы - как подсветить код на странице. Раньше я использовал Geshi - подсветку средствами PHP, но это увеличивало нагрузку на сервер, и размер БД. Сегодня я расскажу о том, как сделать подсветку кода в тэгах code на сайте DLE через Java через SyntaxHighlighter.

Чтобы из
print('Я ГеНиЙ');


получилось
print('Я ГеНиЙ');


Итак начинаем:
На момент написания статьи вышла SyntaxHighlighter версии 3.0.83. Её и будем использовать.

  • Нам понадобится исходные файлы ява скрипта:

    SyntaxHighlighter + Инструкция 32,26 Kb (cкачиваний: 237)

    parse.class.php для 9.3 10,95 Kb (cкачиваний: 120)

  • Начинаем установку.
    Для начала зальём все это дело в engine\classes\sh\

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


    Теперь правим файлы
    • engine\classes\sparse.class.php

      Ищем:
              if( $this->allow_code )
                  $source = preg_replace( "#\[code\](.+?)\[/code\]#ies", "\$this->code_tag( '\\1' )", $source );

      меняем на
              if( $this->allow_code ) {
                  $source = preg_replace( "#\[code\](.+?)\[/code\]#ies", "\$this->code_tag( '\\1' )", $source );
                  $source = preg_replace( "#\[code=(.+?)\](.+?)\[/code\]#ies", "\$this->code_tag( '\\2' , '\\1' )", $source );
              }


      Ищем
              $source = preg_replace( "#\[code\](.+?)\[/code\]#is", "<!--code1--><div class=\"scriptcode\"><!--ecode1-->\\1<!--code2--></div><!--ecode2-->", $source );


      Ниже вставляем
              $source = preg_replace( "#\[code=(.+?)\](.+?)\[/code\]#is", '<pre class="brush:\\1">\\2</pre>', $source );


      Ищем
              $txt = preg_replace( "#<!--code2-->(.+?)<!--ecode2-->#", '[/codе]', $txt );


      Ниже вставляем
              $txt = preg_replace( "#<pre class=\"brush:(.+?)\">(.+?)</pre>#", '[code=\\1]\\2[/codе]', $txt );


      Ищем
              if( $wysiwig != "yes" ) $txt = preg_replace( "#\[code\](.+?)\[/code\]#ies", "\$this->decode_code('\\1', '{$use_html}')", $txt );


      Меняем на
              if( $wysiwig != "yes" ) {
                  $txt = preg_replace( "#\[code\](.+?)\[/code\]#ies", "\$this->decode_code('\\1', '{$use_html}')", $txt );
                  $txt = preg_replace( "#\[code=(.+?)\](.+?)\[/code\]#ies", "\$this->decode_code('\\2', '{$use_html}', '\\1')", $txt );
              }


      Ищем
          function code_tag($txt = "") {


      Меняем на
          function code_tag($txt = "", $type = "") {


      Ищем
              $p = "[code]{2}


      Меняем на
              if ($type=="") {
                  $p = "[code]{3}


      Ищем:
          function decode_code($txt = "", $use_html) { 


      Меняем на
          function decode_code($txt = "", $use_html, $type = "") { 


      Ищем:
              return "[code]{4}


      Меняем на:
              if ($type=="")
                  return "[code]{5}


    • templates\ВАШ ШАБЛОН\main.tpl

      В блок HEAD
      Вставляем
      <link type="text/css" rel="stylesheet" href="/engine/classes/sh/SyntaxHighlighter.css"/>
      <script type="text/javascript" src="/engine/classes/sh/shCore.js"></script>
      <script type="text/javascript" src="/engine/classes/sh/shAutoloader.js"></script>


      Ищем
      </body>
      </html>


      выше вставляем

      <script language='javascript'>
      function path() {
          var args = arguments,
              result = [];
          for(var i = 0; i < args.length; i++)
              result.push(args[i].replace('@', '/engine/classes/sh/'));
          return result
      };

      SyntaxHighlighter.autoloader.apply(null, path(
          'applescript            @shBrushAppleScript.js',
          'actionscript3 as3        @shBrushAS3.js',
          'bash shell                @shBrushBash.js',
          'coldfusion cf            @shBrushColdFusion.js',
          'cpp c                    @shBrushCpp.js',
          'c# c-sharp csharp        @shBrushCSharp.js',
          'css                    @shBrushCss.js',
          'delphi pascal            @shBrushDelphi.js',
          'diff patch pas            @shBrushDiff.js',
          'erl erlang                @shBrushErlang.js',
          'groovy                    @shBrushGroovy.js',
          'java                    @shBrushJava.js',
          'jfx javafx                @shBrushJavaFX.js',
          'js jscript javascript    @shBrushJScript.js',
          'perl pl                @shBrushPerl.js',
          'php                    @shBrushPhp.js',
          'text plain                @shBrushPlain.js',
          'py python                @shBrushPython.js',
          'powershell ps posh        @shBrushPowerShell.js',
          'ruby rails ror rb        @shBrushRuby.js',
          'sass scss                @shBrushSass.js',
          'scala                    @shBrushScala.js',
          'sql                    @shBrushSql.js',
          'vb vbnet                @shBrushVb.js',
          'xml xhtml xslt html    @shBrushXml.js'
      ));
      SyntaxHighlighter.config.bloggerMode = true;
      SyntaxHighlighter.config.stripBrs = false;
      SyntaxHighlighter.config.toolbar = false;
      SyntaxHighlighter.all();
      </script>




  • теперь нам можно использовать
    как [codе] тут код [/codе],
    так и [codе=php] тут код [/codе]


Все протестировано на DLE 9.2

Другие новости по теме

Уважаемый посетитель

Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария


Коментарии

#9 12 апреля 2011 23:07 Паша

Я сделал так. Вообщем то всё как в инструкции только вместо

$source = preg_replace( "#\[code\](.+?)\[/code\]#is", "<!--code1--><div class=\"scriptcode\"><!--ecode1-->\\1<!--code2-->
;
</div><!--ecode2-->", $source );


поставил

$source = preg_replace( "#\[code\](.+?)\[/code\]#is", "<pre class='brush: js'>\\1</pre>", $source );


ПС. а вот тут в коментах реально не хватает этой кнопки..чтобы нажал и сразу код. Потому пишу просто так и не факт что дле не изменит что нить.
Публикаций: 0 Комментариев: 0 [ цитировать ]

#8 12 апреля 2011 18:03 Дмитрий

Здраствуйте, я не гуру в php, пожалуйста, подскажите как указать стандартную подсветку для [ code ][ code/ ] например c++, или как сделать чтоб при нажатии на bb-code кнопку, он сразу вставлял [ code=cpp ][ /code ] ??? Буду благодарен
Публикаций: 0 Комментариев: 0 [ цитировать ]

#7 8 апреля 2011 18:45 Паша

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


При добавлении ведь страница не обновляется..просто появляется комант и человек думает вроде всё сделал правильно но почему то код не подсвечен..и лезет редактировать комент.

Всё нашёл куда запихнуть скрипт чтобы сразу обновлялось. Если вдруг кому тоже нужно будет..

/engine/ajax/addcomments.php
там после
[code=php]<script language='javascript' type="text/javascript">
var timeval = new Date().getTime();

var form = document.getElementById('dle-comments-form');

{$clear_value}
</script>[code]
нужно вставить тот же код что и в главном шаблоне.
Публикаций: 0 Комментариев: 0 [ цитировать ]

#6 8 апреля 2011 18:22 n0wheremany

Изначально даже кнопки нет (code) при добавление комента. Тут её тоже кстати нет.

По идее её и не делал ни в новости, ни в коменте.

Когда добавляешь комментарий то подсвечиваться начинает только после того как обновишь страницу.. не знаю как это исправить.

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


--------------------
Публикаций: 69 Комментариев: 755 [ цитировать ]

#5 8 апреля 2011 18:12 Паша

У меня возникли следующии проблемы может я конечно что то сделал не так. Изначально даже кнопки нет (code) при добавление комента. Тут её тоже кстати нет. Вообщем я добавил кнопку. Потом встала проблема что код подсвечивается только в том случае если [code=php] но в коментах он это не воспринимает..сделал чтобы работали при просто [code]. Всё работает но осталась последняя загвоздка. Когда добавляешь комментарий то подсвечиваться начинает только после того как обновишь страницу.. не знаю как это исправить.
Публикаций: 0 Комментариев: 0 [ цитировать ]

#4 8 апреля 2011 11:43 n0wheremany

Оно разве не работает?


--------------------
Публикаций: 69 Комментариев: 755 [ цитировать ]

#3 7 апреля 2011 21:34 Паша

А сложно сделать чтобы тоже самое работало в комментариях?
Публикаций: 0 Комментариев: 0 [ цитировать ]

#2 11 марта 2011 00:56 s23

Отлично! Спасибо.
Публикаций: 0 Комментариев: 0 [ цитировать ]

#1 1 марта 2011 19:43 ПафНутиЙ

Спасибо за способ, отличное решение, да и использование pre гораздо правильнее ДЛЕшного метода
Публикаций: 0 Комментариев: 0 [ цитировать ]