Наши заметки о MODx
В этом разделе мы будем собирать небольшую копилку секретов по работе с системой управления контентом сайта (CMS) MODx. Эти заметки ни в коем случае не претендуют на лавры документации. На нашем сайте тема MODx вообще занимает небольшой уголок, и эти материалы мы размещаем только потому, что по роду основной работы нам приходится оказывать техническую поддержку нескольким десяткам организаций, использующих наши прототипы сайтов. В то же время кое-что может пригодиться и другим людям.
Мы не претендуем на изложение "истины в последней инстанции". Наверняка в этих заметках гуру MODx найдут неточности и ошибки. Мы будем очень благодарны, если на это нам укажут в комментариях.
В заметках мы стараемся не просто сразу приводить готовое правильное решение, но и показываем, как мы набивали шишки в процессе поиска.

Как сделать подсветку синтаксиса исходных текстов


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

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

У такого подхода имеется ряд преимуществ:

  • описания подсветок хранятся в отдельных 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 и сохранить плагин.

 Как выполнить подсветку

Страницу с кодом нужно редактировать в обычном редакторе, позволяющем писать вручную теги HTML!

 

Это очень важно, так как визуальные редакторы заменят символы (например скобки) и код перестанет быть кодом. Такое может произойти даже при использовании 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']);

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

О подсветке синтаксиса сниппетов

Постоянно возникает вопрос о подветке синтаксиса сниппетов, шаблонов и чанков в редакторе панели управления. В Etomite 6.1.4 уже встроен специальный редактор сниппетов с подсветкой синтаксиса,
а в MODx такого пока нет.Однако имеется сторонний Manager Code Highlighter, который, по идее, может выполнять такие действия. Увы, попытка его подключить окончилась крахом. Видимо, исключительно из-за кривизны наших ручек.

 

Зачеркнута неверная установка. Обнаружен редактор EditArea, нареканий на который пока нет.

Вообще-то подсветка синтаксиса в панели управления - дело достаточно тормозное, да и редактировать сниппеты и шаблоны мы предпочитаем в номальном саостоятельном текстовом редакторе Notepad++. В редакторе панели управления - только косметическая правка.

 

Некоторые выводы

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

Завершать эту статью приходится в обычном текстовом редакторе, проставляя вручную теги HTML. Собственно, это лично нам и удобнее. Несмотря на то, что в статье мы пишем о том, что не надо использовать визуальный редактор для смеси обычного текста и исходников, мы умудрились раза три испортить готовый текст. А правильно вставить последний код, включающий в себя тег <pre> вообще не удалось. В конце концов, плюнули м на это дело и за 6 секунд сгенерировали подсветку кодов в своей программе.

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

  

13-08-2007 13:54:16



    Содержание раздела «Подсветка синтаксиса»:
Комментарии любых посетителей

Написать комментарий


 
ShaggyDoc
Комментарий
Re: Как сделать подсветку синтаксиса исходных текстов
Реплика №3: 14.08.2007, 23:17:17
Опять ты влезла!?
Инсталляцию можно найти в разделе Файлы. Там же имеется отдельно справка по программе. Она входит и в основную инсталляцию
Barbi
Комментарий
Re: Как сделать подсветку синтаксиса исходных текстов
Реплика №2: 14.08.2007, 23:10:21
Я знаю где! У меня можно взять!
Melkiades
Комментарий
А что это за ruSourceExplorer
Реплика №1: 14.08.2007, 22:57:24
В статье несколько раз упомянута эта программа. А где ее можно взять?