Описание синтаксиса Hrc-скриптов библиотеки Colorer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Итак, формат hrc. Развивался он долго и упорно, преодолевая все трудности и неурядицы. В итоге сейчас это развитый Html-подобный скриптовый формат, описывающий синтаксические правила выделения одного или нескольких типов файлов, связывающий их воедино и управляющий их поведением. Тэги будут называться линейными, если они не содержат закрывающей части - иначе они будут называться блочными. Многие описания тэгов требуют указания имен структур. Как правило, такой параметр называется Name, и должен быть уникальным в своем контексте. Это значит, что к примеру может существовать только одна схема с именем myname, но ничто не мешает вам определить символьное имя цвета с названием myname. Перед тем, как все описывать прикинем общую систему скриптов. в главный файл включаются файлы (можно конечто объявлять все в одном, но это будет слишком большой файлик :)) с определениями схем. схема - это как бы один тип расцветки. К примеру схема С, или там схема Pascal. В ней определяется весь синтаксис языка. Для того, чтобы схема заработала в редакторе, надо ее связать с конктреным типом файла. Это делается блоком в главном файле - он небольшой. В нем задаются разные вспомогательные параметры - такие как нужное расширение файла, схема, использующаяся для этого файла и дополнительные параметры указывающие какие файлы надо подгружать чтобы этот тип файла заработал. Ну это кратко - а теперь читайте подробно, и главное глядите примеры, там довольно ясно все. 0. Содержимое файла. (в поставке плагина - ColorSet.Hrc). Оно заключено в главный блок - . Все остальные структуры находятся в нем. Этот тэг имеет параметр 'ver' - надеюсь понятно. 1. Линейный тэг описывает символьные альтернативы значениям цветов. Их может быть сколько угодно. В самом тэге Define могут использоваться другие, уже определенные константы. Его параметр Name определяет уникальное в данном контексте символьное имя. Параметр Value определяет значение цвета, соответствующее этому значению. Цвет задается четырьмя байтами, младшее слово - цвет текста, старшее - цвет фона. таким образом #00040001 определит синее на красном. Цвета 0xFFFF и 0xFFFF0000 имеют специальное значение - это цвета текста и фона по умолчанию. Вы можете комбинировать цвета следующим путем: value="Blue/bkRed" это эквивалентно операции (text&0xFFFF)+(back&0xFFFF0000) так же возможно использовать следующую форму: value="Blue+bkRed". Здесь у нас работает просто (text)+(back) 2. Линейный Тэг подключает к определениям внешний файл. Путь должен быть указан относительно каталога с первичным файлом описаний не зависимо от того, в каком файле он определен. 3. Блочный тэг . Каждый такой блок - описание одной уникальной схемы раскраски. Параметр Name - системное имя схемы (уникально в своем контексте). В блоке Scheme перечисляются виды выделения и их атрибуты. 3.1. определяет однострочное выделения произвольного типа, 3.2. определяет многострочное выделение. Эти 2 вида выделений основаны на регулярных выражениях - regexps (см. RegExpsR.txt). Их параметры: Start - начальная комбинация End - конечная, если нужна (может отсутствовать у RegExp). Prior - может быть Low или High. По дефолту High. Этот параметр значит очень сложную весчь, которую долго объяснять. Указание его в RegExp со значением Low заставляет колорер увеличить приоритет окаймляющей схемы. Пока действителен только у линейных регэкспов - у блочников игнорируется. Scheme - только для тэга Block. Указывает применяемую схему. ColorX - Полный атрибут Цвета. Если цвет фона указан 0 (fe: #0C), то он подменяется на цвет фона в CONNECT/2 по умол- чанию - синий к примеру, то есть Цвет Color="Red", кото- рый определен как Color="#04" определяет не "красное на черном", а ... "золото на голубом":) - точнее красное на дефолтовом цвете. Если вам надо черный цвет, укажите вместо нуля текущий цвет фона по дефолту. Здесь так же могут использоваться подстановки. Последняя цифра в имени тэга задает номер уровня раскраски - то есть номер скобки, которой присвоится этот цвет. 3.3. включает все определения и регэкспы из схемы sname в текущую. Всего возможно до 64-х уровней вложенности или числа тэгов Include. 3.4. Блочный тэг. Включает в себя определения ключевых слов. Его параметры: MatchCase - Учет регистра символов. Color - Цвет ключевых слов. Распространяется на все его вложенные блоки. Вложенные в KeyWords тэги: 3.4.1. Определяет раскраску слова. Параметры: Name - имя слова - не больше 64 символов. Color - Его цвет. Если отсутствует - берется из KeyWords 3.4.2. Отличается от Word только тем, что выделяется и при смежных буквенно-цифровых символах. Блоков KeyWords может быть несколько в блоке Scheme. Порядок определения ключевых слов не важен. 4. Блочный тэг определяет непосредственные типы файлов, попадаемых под расцветку. descr - описание этого типа файлов. name - системное имя. используется в тэге . exts - расширение файла. 4.1. Загружает указанный файл и схемы из него. 4.2. определяет соотвествие схемы этому типу файлов. 4.3. Используется для переключения типа файлов по первой строке. match - регэксп для совпадения. tname - имя типа на который следует переключить. Замедьте, что это имя типа - а не его описание. 4.4. Все остальные параметры опциональны и не поддерживаются непосредственно библиотекой (они могут распознаваться приложениями). 5. Все остальные блоки, параметры и линейный текст в файлах описания Hrc игнорируются. Возможно использование комментариев в Html-стиле: 6. Ну, теперь поподробнее. Из любого файла видно, что лучше придерживаться устоявшегося формата - для крупных определений использовать локальные переопределения цветов, все цвета записывать только через определенные базовые - это обеспечит лучшую совместимость и интегрируемость Hrc-файла со всей базой. Сейчас во многих файлах используются включения макросов - фактически, это наиболее часто используемые, маленькие схемы с необходимыми определениями. Вообще, логическое разбиение формата расцветки на схемы позволяет практически всегда резко ускорить производительность. Ну, конкретные примеры. 6.1. Верьте не верьте, но это обычное шестнадцатеричное число, выделяемое базовым цветом dNumbers. А это комментарий вида //.... Чего делают скобки () в описании регулярного выражения, спросите вы? Все просто. Каждая пара скобок задает свой цвет выделения. Так как чаще всего присутствует только одна пара скобок, играет роль только тэг Color0. Однако, ваше право написать чего нибудь эдакое: При этом один ваш регэксп породит аж пять цветов! В теге RegExp вы так же можете указать и конечное выражение параметром End. Если оно есть, то выделение происходит с выражения Start до выражения End. При этом возможно использование оператора регэкспов \yN. Ладно - с этим разобрались. 6.2. Тэг Block. У него так же есть параметр End. К чему бы это? Ну, не буду терзать вас - этот тэг описывает окончание блочного выделения. Между тэгами Start и End так же как и у RegExp может устанавливаться связь с помощью одной из возможностей регэкспов. Вы можете в тэге End сослаться на уже просканированный тэг Start через конструкцию \yX, где x - число от 1 до 9, которое означает номер скобки, сохраненной в первом тэге. Эта фича напоминает аналогичную в перле. С ее помощью можно записать к примеру такую конструкцию: Она позволит выделять любые строки по перловым правилам: q!....! q#.....# q@.......@ При этом тэг Color0 означает цвет выделения всего куска текста - а последующие тэги - цвета соответствующих пар скобок. Собственно, тэг Block ничем от тэга RegExp и не отличается, кроме того, что работает для многострочного выделения. Теперь на счет скорости. Сейчас все быстро. Но за.рать можно все что угодно. поэтому старайтесь не махаться - лучше пару минут подумать как описать нужный вам блок пооптимальнее... 6.3. Еще одно правило. Порядок разбора. Все регэкспы разбираются в том порядке, в котором они описаны. После их разбора начинается проверка на ключевые слова. Соответственно, на взаимное расположение регэкспов и ключевых слов колореру сильно плевать. С другой стороны на работу очень сильно будет сказываться взаимный порядок самих регэкспов. Старайтесь вставлять их по мере убывания частоты появления в тексте - все по той же причине. Как ни странно, колорер работает быстрее там, где много регэкспов - в идеале весь текст представляется ими (хороший пример - некоторые Html-ы, да или тот же самый Hrc). Эти файлы работают быстрее всего. Соответственно, теоретически, больше всего тормозят текстовые файлы, и подобные им(Це, паскаль). 6.4. Теперь об умном выделении. Понятие схемы позволяет вам осуществить любой разумный тип выделения. Базовым для понимания является то, что схемы могут быть вложены более двух раз и то, что схема может быть вложена сама в себя (рекурсия). Комбинация этих вещей и позволяет добиться любой расцветки, причем достоинством данной структуры колорера является интуитивность понятия схемы в отличии от различных форм смены контекста раскраски. Более того, понятие схемы без ущерба переносится на реальное включение одной схемы в другую: в случае включения крупной схемы это будет наследованием, в случае же включения небольшой схемы такое включение играет роль макроса. Прекрасным примером сложной структуры схем в колорере является структура раскраски ASP-кодов, и части, касаемой интернета вообще. Если вы разберетесь в структуре и взаимосвязях схем ASP можете считать, что архитектуру hrc вы поняли лучше меня. 7. Общая структура. Ну, на последок окиньте взглядом всю структуру Hrc: Когда ты был мал, ты знал все что знал, И собаки не брали твой след... Теперь ты открыт, ты отбросил свой щит, Ты не помнишь кто прав а кто слеп...