Начнём с компонента, который обеспечивает подсветку синтаксиса 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.
У этого компонента существует одни методы, позволяющие удобно загрузить и сохранить данные подсветки.
$arr = array (
‘Comment’ => array (‘background’ => clWhite, ‘foreground’ => clSilver),
…
); // пример массива, который принимает эта функция.
$synPHPSyn>loadFromArray ($arr);
$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