Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

SynEdit создание собственной подсветки

Всем привет. Давно уже на Delphi ничего не писал, и решил немного размяться ... И самое первое, что пришло в голову - написать текстовый редактор. Но я решил немного усложнить себе цель, добавить подсветку родного паскаля в этот редактор. На помощь пришли SynEdit (SynMemo) и SynPasSyn. Ну и чтобы получше разобраться с SynEdit решил покапаться в демках, а именно HighlighterDemo.
В этом демо представлен компонент (TSynCustomHighlighter) с собственной подсветкой слов hello, synEdit и world
TSynSampleSyn = class(TSynCustomHighlighter) private fRange: TRangeState; fTokenID: TtkTokenKind; fIdentFuncTable: array[0..3] of TIdentFuncTableFunc;
...
KeyWords: array[0..3] of UnicodeString = ( 'hello', 'synedit', 'world', 'highlighter' );
KeyIndices: array[0..3] of Integer = ( 0, 2, 1, 3 );
procedure TSynSampleSyn.InitIdent; var i: Integer; begin for i := Low(fIdentFuncTable) to High(fIdentFuncTable) do if KeyIndices[i] = -1 then fIdentFuncTable[i] := AltFunc;
fIdentFuncTable[0] := FuncHello; fIdentFuncTable[2] := FuncWorld; fIdentFuncTable[1] := FuncSynedit; fIdentFuncTable[3] := FuncHightLight;
...
function TSynSampleSyn.FuncHightLight(Index: Integer): TtkTokenKind; begin if IsCurrentToken(KeyWords[Index]) then Result := tkKey else Result := tkIdentifier; end;
Но вот заставить, чтобы подсвечивалось ещё и highlighter, никак не выходит ...
UPDATE Обновил индексы, но всё равно highlighter не подсвечивается


Ответ

Если внимательно почитать комментарии в SynHighlighterSample.pas, то можно увидеть вот такие строки:
Code template generated with SynGen. The original code is: D:\Quellen\Komponenten\SynEdit\Demos\HighlighterDemo\SynHighlighterSample.pas, released 2008-10-25. Description: The initial author of this file is Maël Hörz. Copyright (c) 2008, all rights reserved.
Из чего можно сделать вывод, что для создания подсветок в SynEdit используется кодогенерация, а утилита для генерирования кода называется SynGen. Утилита эта поставляется вместе с SynEdit и имеет свою справку (SynGen\Highlighters-HowTo.html).
Если в двух словах, то вам надо написать/отредактировать шаблон для вашей подсветки (файл с расширением .msg), открыть этот шаблон в SynGen и сгенерировать исходник. В демке есть шаблон SynHighlighterSample.msg и чтобы заставить хайлайтер подсвечивать слово highlighter, достаточно вписать его в секцию KEYS
KEYS Hello World Highlighter |><|
Изменить же вручную сорцы готового хайлайтера (в плане добавления новых ключевых слов) не получится из-за функции TSynSampleSyn.HashKey. Эта функция считает хэш слов, который используется затем для вызова соответствующей функции из fIdentFuncTable.
В общем виде, функция HashKey выглядит так:
{$Q-} function TSynSampleSyn.HashKey(Str: PWideChar): Cardinal; begin Result := 0; while IsIdentChar(Str^) do begin Result := Result * c + Ord(Str^) * d; inc(Str); end; Result := Result mod m; fStringLen := Str - fToIdent; end; {$Q+}
И задача кодогенератора вычислить коэффициенты c, d и m, в зависимости от ключевых слов (алгоритм генератора можно посмотреть в SynGen\HashTableGen.pas).

Комментариев нет:

Отправить комментарий