У такого подхода имеется ряд преимуществ:
- описания подсветок хранятся в отдельных XML-файлах, которые легко редактировать по вкусу (имеется и визуальный редактор);
- HTML-код исходника с раскраской синтаксиса генерируется один раз и на это не тратится время при обращении к странице;
- имеется более 300 готовых подсветок.
Недостаками предварительного создания HTML с подсветкой являются:
- использование устаревших тегов font;
- статичность созданного кода;
- необходимость дополнительной операции по генерированию исходника.
Использование плагина
Для динамической подсветки синтаксиса можно использовать плагин GeSHi syntax highlighter. Скачать плагин можно с сайта MODx.com.
Содержимое архива с плагином надо распаковать в каталог assets, сохраняя структуру каталогов из архива. В результате должны образоваться каталоги
assets/plugins/geshi/contrib/
assets/plugins/geshi/docs/
assets/plugins/geshi/geshi/
assets/plugins/geshi/geshi.php
assets/plugins/geshi/plugin.GeSHi.tpl
Далее в менеджере MODx нужно создать новый плагин и вставить в него текст из файла
assets/plugins/geshi/plugin.GeSHi.tpl
На вкладке Системные события нужно поставить галочку на событии OnLoadWebDocument и сохранить плагин.
Как выполнить подсветку
Это очень важно, так как визуальные редакторы заменят символы (например скобки) и код перестанет быть кодом. Такое может произойти даже при использовании FCKEditor в режиме редактирования исходника.
Подсветка синтаксиса срабатывает автоматически при обнаружении тегов
<pre> Сюда вставлять код исходника</pre>.
Для указания языка исходника нужно для тега pre указать атрибут языка, например:
<pre language="cadlisp"> Сюда вставлять код исходника </pre>
В этом примере показано выделение подсветки синтаксиса для языка Visual LISP системы AutoCAD.
Подсветки файлов описаны в PHP-файлах, находящихся в каталоге
assets/plugins/geshi/geshi/
Всего там находится 88 файлов. Вот некоторые из них:
- asm.php
- asp.php
- bash.php
- c.php
- c_mac.php
- caddcl.php
- cadlisp.php
- cpp-qt.php
- cpp.php
- csharp.php
- css.php
- delphi.php
- gml.php
- html4strict.php
- ini.php
- inno.php
- java.php
- java5.php
- javascript.php
- lisp.php
- perl.php
- php.php
- reg.php
- sql.php
- vb.php
- vbnet.php
- xml.php
Как отредактировать подсветку
Почти наверняка настройки подсветок потребуют изменения. Например, мы посчитали необходимым сделать подсветку LISP-исходников такую же, как и в редакторе Visual LISP.
Пока что мы не придумали ничего лучшего, чем прямое редактирование файлов подсветки языка. Возможно, что это совсем неправильный путь.
Пример файла посветки Visul LISP (фрагменты, ключевые слова сокращены)
<?php
$language_data = array (
'LANG_NAME' => 'CADLISP',
'COMMENT_SINGLE' => array(1 => ";"),
'COMMENT_MULTI' => array(";|" => "|;"),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array('"'),
'ESCAPE_CHAR' => '\\',
'KEYWORDS' => array(
1 => array(
'abs','acad_colordlg',
...
'vl-symbol-name','vl-symbolp',
'vl-symbol-value','vl-unload-vlx','vl-vbaload',
'vl-vbarun','vl-vlx-loaded-p'
)
),
'SYMBOLS' => array(
'(', ')', '{', '}', '[', ']', '!',
'%', '^', '&', '/','+','-','*','=','<','>'
),
'CASE_SENSITIVE' => array(
GESHI_COMMENTS => true,
1 => false
),
'STYLES' => array(
'KEYWORDS' => array(
1 => 'color: #0000FF;',
2 => 'color: #FF00FF;'
),
'COMMENTS' => array(
1 => 'color: #800080; background-color: #C0C0C0;',
'MULTI' => 'color: #800080; background-color: #C0C0C0;'
),
'ESCAPE_CHAR' => array(
0 => 'color: #000099; font-weight: bold;'
),
'BRACKETS' => array(
0 => 'color: #FF0000;'
),
'STRINGS' => array(
0 => 'color: #FF00FF;'
),
'NUMBERS' => array(
0 => 'color: #008000;'
),
'METHODS' => array(
),
'SYMBOLS' => array(
0 => 'color: #FF0000;'
),
'REGEXPS' => array(
0 => 'color: #FF00FF'
),
'SCRIPT' => array(
)
),
'URLS' => array(
),
'OOLANG' => false,
'OBJECT_SPLITTERS' => array(
),
'REGEXPS' => array(
0 => 'ru-/*'
),
'STRICT_MODE_APPLIES' => GESHI_NEVER,
'SCRIPT_DELIMITERS' => array(
),
'HIGHLIGHT_STRICT_BLOCK' => array(
)
);
?>
В файле подсветки мы изменили только атрибуты некоторых элементов (ключевые слова, комментарии и т.п.). Фактически на надо бы использовать регулярные выражения для подсветки многочисленных ключевых слов, имеющих регулярную структуру. Например, множество имен функций начинаются с префиксов vl-, vla-, ru-. Включать все их в массив ключевых слов слишком примитивно. Однако пока нам не удалось описать их в виде регулярных выражений - исключительно из-за недостатка опыта и времени.
Проблема со старыми исходниками
Сотни исходников уже опубликованы на сайте. Такие тексты обрамлены тегом pre без атрибутов. Но если такой исходник попадает в лапы плагина, его текст будет обрабатываться как "язык по умолчанию". В результате вместо раскрашенного LISP-исходника мы можем получить ненужный нам HTML, да еще подсвеченный как попало.
Для решения этой проблемы мы применили топорный прием - закомментировали в файле pluginGeSHi.tpl (загруженном в плагин MODx) строку обработки тега pre без атрибутов:
// $modx->documentObject['content']=preg_replace_callback("#<pre>(.*?)</pre>#s", "replaceCode", $modx->documentObject['content']);
Вот теперь и наши старые исходники будут отображаться правильно, и плагин будет работать, только ему непременно нужно указывать атрибут языка.
О подсветке синтаксиса сниппетов
Зачеркнута неверная установка. Обнаружен редактор EditArea, нареканий на который пока нет.
Вообще-то подсветка синтаксиса в панели управления - дело достаточно тормозное, да и редактировать сниппеты и шаблоны мы предпочитаем в номальном саостоятельном текстовом редакторе Notepad++. В редакторе панели управления - только косметическая правка.
Некоторые выводы
Проанализировав достоинства и недостатки плагина для подсветки синтаксиса мы, видимо, откажемся от его использования. Слишком уж много всяких "но". Одно только написание этой заметки отбило всякую охоту. Нам всего лишь один раз пришлось смешать обычный текст с единственным исходником, а пришлось пару раз полностью его заменять из-за смеси режимов визуального редактора и правки кода.
Завершать эту статью приходится в обычном текстовом редакторе, проставляя вручную теги HTML. Собственно, это лично нам и удобнее. Несмотря на то, что в статье мы пишем о том, что не надо использовать визуальный редактор для смеси обычного текста и исходников, мы умудрились раза три испортить готовый текст. А правильно вставить последний код, включающий в себя тег <pre> вообще не удалось. В конце концов, плюнули м на это дело и за 6 секунд сгенерировали подсветку кодов в своей программе.
Если бы мы не имели програмы ruSourceExplorer, то автоматическая подсветка пригодилась бы. Но пока (и только для нас) использование готовых предварительно сгенерированных кодов кажется более удобным. И первым действием после написания этой статьи станет уделение плагина подсветки синтаксиса.
Написать комментарий
Реплика №3: 14.08.2007, 23:17:17
Реплика №2: 14.08.2007, 23:10:21
Реплика №1: 14.08.2007, 22:57:24