|
Статья опубликована в новостной рассылке проекта Aml Pages.
Переработанную и актуальную версию статьи можно найти в русской справке или посмотреть в онлайн в 4-ой части Маленьких хистростей.
• Изменения для версии Aml Pages 9.07.
Некоторое время назад в Aml Pages был реализован новый алгоритм синтаксической подсветки языков программирования. Основными преимуществами нового алгоритма стали существенное расширение списка поддерживаемых языков и хранение данных синтаксической подсветки во внешних файлах. Вы легко можете найти файлы подстветки в папке программы - это файлы с расширением *.ash. При анонсе новой синтаксической подсветки говорилось о том, что со временем будет документирован формат файлов. И т.к. некоторые пользователи, как, например, Сергей Пуховский, присылают мне готовые файлы подсветки - т.е. явно разбираются в формате сами, то думаю, что самое время все-таки описать формат файлов. А заодно хочу поблагодарить Сергея за проделанную работу, присутствием подсветки Delphi в дистрибутиве Aml Pages я и пользователи обязаны именнно ему. Заметьте, в формате файлов Сергей разобрался полностью самостоятельно, думаю это подтверждает тезис, что формат файлов подсветки не сверхсложен и секретен.
Итак, файлы подсветки это файлы с расширением *.ash в папке Aml Pages. Каждый файл содержит в себе информацию об одной из синтаксической подсветке. В файле содержится такая информация, как слова для подсветки, цвета, параметры поиска и некоторые другие характеристики. По внутреннему формату эти файлы являются обычными ini-файлами Windows, в которых в качестве названий ключей (keys) и секций (sections) используются предопределенные строки. По названию строки несложно догадаться о семантике данных, но все же документация не помешает.
Ash-файлы содержат несколько секций, и каждая секция отвечает за собственные данные:
Секция General
- Ключ Description содержит описание файла, причем в квадратных скобках можно указать краткое наименование, которое Aml Pages будет использовать в меню синтаксической подсветки Если не указано наименование в квадратных скобках, то используется для названия меню вся строка.
Пример: Description=C\C++ Language [C\C++]
-
Copyright - содержит данные об авторе и авторских правах, программой этот ключ не используется, и нужен "для порядку".
Пример: Copyright=(C), 2005, by Mazov Gosha
-
Ключ DateLastModified - содержит время последнего изменения файла, этот ключ также не используется программой.
Пример: DateLastModified=7:01 21.03.05
-
Ключ Address - содержит координаты для связи с автором файла, и также не используется алгоритмом подсветки.
Пример: Address=carc@rambler.ru, www.carc.hotmail.ru
-
Ключ MatchCase - содержит значение, указывающее регистрозависимы ли содержащиеся данные в файле или нет. Думаю не секрет, что для языка C конструкции for и FOR являются разными, а для языка HTML конструкции и являются идентичными. Этот ключ и описывает эту семантику, соответственно этот ключ должен содержать не ноль для регистрозависимых языков, и ноль для регистронезависимых.
Пример: MatchCase=1
-
Ключ GroupsCount - содержит количество групп ключевых слов. Каждая группа слов может характеризоваться своим цветом подсветки и прочими параметрами. О чем будет написано ниже.
Пример: GroupsCount=1
-
Ключ PairsGroupCount описывает количество групп пар строк. Каждая группа пар строк может характеризоваться своим цветом подсветки и прочими параметрами. О чем будет написано ниже.
Пример: PairsGroupCount=1
Секция Comments
Секция Comments описывает параметры подсветки комментариев в тексте.
-
Ключ Color описывает цвет в нотации RGB.
Пример: Color=32768
-
Ключ Count описывает количество комментариев в группе. Многие языки поддерживает несколько видов комментариев, например // и /**/ для С++, или ' и REM для Visual Basic. Каждый ключ должен описывать одну конструкцию комментария называться CommentsX, где Х номер конструкции.
Пример: Count=3
-
Ключ CommentsX содержит строку вида [А_пробел_B], где строка [А] начало
комментария, затем пробел, затем строка [B] означает конец комментария.
Пример: Comments0=/* / - соответственно [/*] начало комментария, а [*/] конец комментария
Если CommentsX не содержит строки [B] после пробела, то концом комментария считается конец строки в подсвечиваемом тексте.
Пример: Comments1=//- соответственно строка [//] это начало комментария, и конец строки в тексте это конец комментария
-
Для каждого ключа можно указать поле WholeWordX, которое будет указывать, как должны искаться в тексте конструкции комментария: как отдельные слова (значение не ноль), или просто как символ (значение ноль). Простой пример: конструкция комментария REM в VB должна искаться как отдельное слово, а конструкция ['] (апостроф) может искаться в тексте и как простой символ.
Секция Strings
Секция Strings описывает конструкции литералов, внутри которых подсветка синтаксиса не должна выполняться.
Пример для языка C:
for (;;;) { //здесь for должна подсвечиваться
sprintf("for %s", "for") - // а здесь for не должна подсвечиваться
}
- Ключ Count указывает на количество конструкций описывающих строки. А каждая конструкция содержится в ключе вида StringsX, где X номер конструкции.
Пример: Count=2
- Ключ StringsX содержит строку, заключенные в одинарные кавычки, внутри которых содержится через пробел символ (или подстрока), означающий начало литерала, и через пробел символ, означающий конец литерала.
Пример: Strings0='" "' - здесь соответственно ["] начало литерала, и через пробел ["] конец литерала.
Пример: Strings1='' '' - здесь соответственно ['] начало литерала, и через пробел ['] конец литерала.
Т.е. в общем виде строка должна быть такая:
[открыващая_кавычка,символ_начала_литерала,пробел,символ_конца_литерала,закрывающая_кавычка]
В качестве символа начала и конца литерала могут выступать и целые строки, а не обязательно одиночные символы. Одинарные охватывающие кавычки необходимы в случае, если символами начала и конца литерала являются другие кавычки. В противном случае выражение [" "] программа считает неверно, а выражение ['" "'] будет читаться корректно. В общем, применяется стиль Assembler для использования в литералах тех или иных кавычек.
Секция Group
Секция Group описывает ключевые слова подсвечиваемого языка. Соответственно, таких групп может быть от нуля до 32765, и каждая может характеризоваться своим собственным цветом слов. Название секции должно выглядеть как GroupX, где X число в диапазоне от нуля до значения GroupsCount-1 из секции General. Т.е. если в секции General написано GroupsCount=2, то соответственно секция должно быть две Group0 и Group1.
-
Ключ Color - описывает цвет в нотации RGB, которым следует подсвечивать слова из этой группы.
Пример: Color=16711680
-
Ключ Keywords содержит ключевые слова группы, записанные через пробел. Именно эти слова в тексте будет искать и подсвечивать в тексте алгоритм подсветки. Цвет будет использоваться из ключа Color этой же группы. Регистрозависимость поиска зависит от ключа MatchCase из секции General.
-
Ключ WholeWord определяет как будут искать указанные слова: как отдельные слова (к примеру, ключевые слова языка программирования) или как символы в составе других слов. Если указано ненулевое значение выполняется поиск отдельных строк, иначе как символов.
Пример: WholeWord=0 ;т.е. искать как символы, а не отдельные слова.
Обратите внимание: ключ WholeWord необязательный. Поэтому, если он не указан, всегда выполняется поиск как отдельных слов. Т.к. поиск как символов случай крайне редкий. Ключ WholeWord поддерживается начиная с версии Aml Pages 9.07 и старше.
Пример: Keywords=for static void while do #include #define #else #ifndef #endif #pragma.... и т.д.
Секция Pairs
Секции PairsX, где Х номер группы описывают пары строк.
-
Ключ Count описывает количество пар в группе.
Пример: Count=13
-
Ключ AutoColor описывает нужно ли подсвечивать найденные строки цветом текста по умолчанию (значение не ноль), или специально указанным цветом в ключе Color (значение ноль).
Пример: AutoColor=0
-
Ключ Color описывает цвет в нотации RGB, который используется для подсветки слов если в ключе AutoColor содержится значение ноль.
Пример: Color=12632256 ;(серый)
-
Ключ PairsX, где X номер пары строк, содержит строку, в которой содержится записанные через пробел начало пары строк и конец, заключенные в одинарные кавычки.
Пример: Pairs0='ON_WM_CONTEXTMENU( )' - [ON_WM_CONTEXTMENU(] соответственно начало строки и через пробел [)] конец строки.
Я думаю, в примере строкой выше программисты имеющие опыт общения с MFC (ATL, WTL) увидели знакомую конструкцию макроса. Теперь, думаю, стало понятно, зачем нужна группа пар строк. В некоторых средах иногда используется подсветка каких-либо специфических конструкций вида [что-то в начале... некий текст... что-то в конце]. Примерно так в указанных библиотеках подсвечиваются служебные макросы. Именно для подсветки таких "штук" и нужна эта секция.
Если у кого-то возникнет желание, то присылайте файлы подсветки в почту и я с благодарностями и Вашими копирайтами включу Ваш файл подсветки в основной дистрибутив программы. Хочу обратить Ваше внимание, что гордое название синтаксической подсветки языков программирования не обязательно должно относиться именно к языкам программирования. В общем случае алгоритму "все равно" что подсвечивать, примером тому является подсветка текста в стиле писем электронной почты (т.е. подсветка цветом цитат из предыдущего письма), и следовательно пользователи могут реализовывать подсветки чего угодно на свой собственный вкус, хоть "шла маша по шоссе".
Ну и под конец, напишу о требованиях алгоритма и установке файла синтаксической подсветки. Для работы алгоритма синтаксической подсветки необходима библиотека riched20.dll версии 2.0 или выше. Номер Вашей библиотеки Вы можете посмотреть в окне "? - О программе" рядом с версий файла Aml Pages. Обратите внимание, если там прописан номер версии старше (2.1, 3.0, 3.1 или выше) ничего не нужно устанавливать, установленной версии библиотеки более чем достаточно. Как правило у 99% пользователей установлены новые версии библиотек, в особенности это касается пользователей работающих под управлением более свежих версий Windows (2000, XP или старше). Если же Вам необходимо обновление для старых библиотек, Вы всегда его можете скачать на сайте Aml Pages в разделе "Дополнительные модули".
Все что требуется для установки, это поместить файл с расширенем в директорию Aml Pages, и если Aml Pages уже работает выбрать команду "Обновить список" выпадающего меню в панели инструментов. Если Aml Pages в момент записи файла не запущена, то при первом же запуске Aml Pages автоматически найдет файл подсветки. Поиск файлов производится динамически при работе программы, и не требует каких бы то ни было регистраций файла, записей в реестре и тому подобных действий.
Собственно, как видите, формат файлов синтаксической подсветки прост до безобразия, и разобраться в нем отнюдь не сложно. Полный пример файла подсветки я здесь приводить не буду Вы можете посмотреть на любой файл *.ash в папке Aml Pages сами. Если у Вас возникнут какие-либо вопросы пишите или задавайте свои вопросы в форуме. Опять же хочу напомнить, что как я писал, ввиду моей неумеренной лени (не буду же я все эти файлы ручками "рисовать":) код не только считывающий ash-файлы (оно и понятно, AP как-то ведь их читает!?!), но и записывающий уже давно написан. Но для написания полноценного редактора ash-файлов просто не хватает времени. Если у кого возникнет желание посодействовать в этом вопросе, то милости прошу. Благо, по сути, ядро написано, нужно только дописать пользовательский интерфейс.
|
|