Всем привет. Давно уже на 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).
Комментариев нет:
Отправить комментарий