Подсветка синтаксиса SynEdit

20.1.2019 - 4066 просмотров ;)

Начнём с компонента, который обеспечивает подсветку синтаксиса PHP кода — TSynPHPSyn (подобно для подсветки CSS существует TSynCSSSyn, для HTML — TSynHTMLSyn, для XML — TSynXMLSyn и т.д.), который является наследником TSynCustomHighlighter от которого перенимает метод getAttri, возвращающий по названию атрибута (Comment, Variable и т.п.) объект атрибута. Например:


pre ($synPHPSyn>getAttri(‘Comment’)>background);

Выведет цвет заднего фона, когда мы пишем комментарий в PHP коде через //, # или /* */. Стоит помнить что у разных языков программирования разные атрибуты. У CSS, например, атрибуты следующие: Color, Comment, Key, Number, Property, Space, String, Symbol, Text, UndefProperty, Value и ImportantProperty.

В этой статье мы будет рассматривать именно объект TSynPHPSyn, у которого существуют такие названия атрибутов: Comment, Variable, Identifier, Number, Key, Symbol и Space.

У этого компонента существует одни методы, позволяющие удобно загрузить и сохранить данные подсветки.

lloadFromArray

$arr = array (

‘Comment’ => array (‘background’ => clWhite, ‘foreground’ => clSilver),

); // пример массива, который принимает эта функция.

$synPHPSyn>loadFromArray ($arr);

ssaveToArray

$synPHPSyn>saveToArray ($arr); // теперь в переменной $arr содержится массив с атрибутами и их значениями свойств (background и foreground), как тот, который принимает метод loadFromArray.

Зная это, теперь мы можем легко задать подсветку компоненту TSynEdit. Если бы не Dim-S, который не позволяет задавать подсветку через свойство, как в Delphi. То есть, так (в оригинальной DS) у вас ничего не выйдет:

$synEdit>highlighter = $synPHPSyn;

И даже так:

$synEdit>highlighter = $synPHPSyn>self;

Это свойство возращает Self (уникальный идентификатор компонента) объекта TSynPHPSyn, а должно возвращать сам экземпляр класса (ссылку на TSynPHPSyn). Исправить это несложно (что я и сделал в DS XL), нужно зайти в %DSPath%\core\design\synedit.php и добавить некоторые методы классу TSynEdit.

Однако, если вы не хотите делать этого, вы можете использовать для установки SynEdit подсветки следующий код (естественно изменив в нём synEdit1 на имя вашего SynEdit, а Form1 — на имя вашей формы):

gui_readStr ($synEdit>self, ‘object synEdit1: TSynEdit

Highlighter = Form1.SynPHPSyn

end’);

Что ж, теперь составим сам код, который будет присваивать подсветку TSynEdit, читая цвета из INI файла. (Подсветки, использующиеся в DevelStudio вы можете найти здесь: %DSPath%\system\myprofile\highlight).

$file = ‘syntax.ini’; // имя файла, содержащего данные подсветки

$synEdit = c(‘synEdit1’); // ваш SynEdit

$ini = new TIniFileEx($file); // создаём объект TINIFileEx для работы с файлами INI

$colors = $ini>arr; // читаем INI файл и заносим в $colors содержимое как массив

unset($ini); // удаляем созданный класс

$hi = new TSynPHPSyn (_c($synEdit>owner)); // создаём компонент подсветки

$hi->name = ‘SynPHPSyn’; // задаём ему имя

/* В INI-файлах DevelStudio есть также секция main, в которой содержится цвет SynEdit’a */

if ($colors[‘main’]) {

unset($colors[‘main’]);

$synEdit->color = $colors[‘main’];

}

$hi->loadFromArray ($colors); // загружаем в компонент цвета

gui_readStr ($synEdit>self, ‘object ‘.$synEdit>name.’: TSynEdit

Highlighter = ‘._c($hi>owner)>name.’.SynPHPSyn

end’); // костылём устанавливаем подсветку

// Для тех, кто использует DevelStudio XL не ниже Beta 2.1 можно просто написать: $synEdit>highligher = $hi;

Я рекомендую вам использовать для хранения цветов подсветки формат JSON, поскольку он гораздо быстрее.

И ещё, не обязательно создавать для каждого SynEdit‘a свой компонент TSynPHPSyn, поскольку одну подсветку можно присвоить множеству SynEdit’ам (через тот же gui_readStr).

В следующий раз разберём свойства компонента TSynEdit.

Оригинал: https://vk.com/@evsoft-podsvetka-sintaksisa-synedit

Статьи из раздела, Видеочат рулетка