highlighter, special keywords have their own style

in options: SpeckAttrib
This commit is contained in:
Basile Burg 2015-09-21 07:57:34 +02:00
parent f897fdf802
commit 1cb1615a12
1 changed files with 32 additions and 11 deletions

View File

@ -11,7 +11,7 @@ uses
const const
D2Kw: array[0..111] of string = D2Kw: array[0..106] of string =
( 'abstract', 'alias', 'align', 'asm', 'assert', 'auto', ( 'abstract', 'alias', 'align', 'asm', 'assert', 'auto',
'body', 'bool', 'break', 'byte', 'body', 'bool', 'break', 'byte',
'case', 'cast', 'catch', 'cdouble', 'cent', 'cfloat', 'char', 'class', 'case', 'cast', 'catch', 'cdouble', 'cent', 'cfloat', 'char', 'class',
@ -34,8 +34,13 @@ const
'template', 'this', 'throw', 'true', 'try', 'typedef', 'typeid', 'typeof', 'template', 'this', 'throw', 'true', 'try', 'typedef', 'typeid', 'typeof',
'ubyte', 'ucent', 'uint', 'ulong', 'union', 'unittest', 'ushort', 'ubyte', 'ucent', 'uint', 'ulong', 'union', 'unittest', 'ushort',
'version', 'void', 'volatile', 'version', 'void', 'volatile',
'wchar', 'while', 'with', 'wstring', 'wchar', 'while', 'with', 'wstring'
'__FILE__', '__MODULE__', '__LINE__', '__FUNCTION__', '__PRETTY_FUNCTION__' );
D2SpecKw: array[0..10] of string =
(
'__FILE__', '__MODULE__', '__LINE__', '__FUNCTION__', '__PRETTY_FUNCTION__',
'__DATE__', '__EOF__', '__TIME__', '__TIMESTAMP__', '__VENDOR__', '__VERSION__'
); );
type type
@ -52,11 +57,11 @@ type
function toHash(const aValue: string): Byte; {$IFNDEF DEBUG}inline;{$ENDIF} function toHash(const aValue: string): Byte; {$IFNDEF DEBUG}inline;{$ENDIF}
procedure addEntry(const aValue: string); procedure addEntry(const aValue: string);
public public
constructor create; constructor create(from: array of string);
function find(const aValue: string): boolean; {$IFNDEF DEBUG}inline;{$ENDIF} function find(const aValue: string): boolean; {$IFNDEF DEBUG}inline;{$ENDIF}
end; end;
TTokenKind = (tkCommt, tkIdent, tkKeywd, tkStrng, tkBlank, tkSymbl, tkNumbr, tkCurrI, tkDDocs); TTokenKind = (tkCommt, tkIdent, tkKeywd, tkStrng, tkBlank, tkSymbl, tkNumbr, tkCurrI, tkDDocs, tkSpecK);
TRangeKind = (rkString1, rkString2, rkTokString, rkBlockCom1, rkBlockCom2, rkBlockDoc1, rkBlockDoc2, rkAsm); TRangeKind = (rkString1, rkString2, rkTokString, rkBlockCom1, rkBlockCom2, rkBlockDoc1, rkBlockDoc2, rkAsm);
@ -104,7 +109,9 @@ type
fCurrIAttrib: TSynHighlighterAttributes; fCurrIAttrib: TSynHighlighterAttributes;
fDDocsAttrib: TSynHighlighterAttributes; fDDocsAttrib: TSynHighlighterAttributes;
fAsblrAttrib: TSynHighlighterAttributes; fAsblrAttrib: TSynHighlighterAttributes;
fSpeckAttrib: TSynHighlighterAttributes;
fKeyWords: TD2Dictionary; fKeyWords: TD2Dictionary;
fSpecKw: TD2Dictionary;
fCurrIdent: string; fCurrIdent: string;
fLineBuf: string; fLineBuf: string;
fTokStart, fTokStop: Integer; fTokStart, fTokStop: Integer;
@ -123,6 +130,7 @@ type
procedure setCurrIAttrib(aValue: TSynHighlighterAttributes); procedure setCurrIAttrib(aValue: TSynHighlighterAttributes);
procedure setDDocsAttrib(aValue: TSynHighlighterAttributes); procedure setDDocsAttrib(aValue: TSynHighlighterAttributes);
procedure setAsblrAttrib(aValue: TSynHighlighterAttributes); procedure setAsblrAttrib(aValue: TSynHighlighterAttributes);
procedure setSpeckAttrib(aValue: TSynHighlighterAttributes);
procedure doAttribChange(sender: TObject); procedure doAttribChange(sender: TObject);
procedure setCurrIdent(const aValue: string); procedure setCurrIdent(const aValue: string);
procedure doChanged; procedure doChanged;
@ -140,6 +148,7 @@ type
property CurrIAttrib: TSynHighlighterAttributes read fCurrIAttrib write setCurrIAttrib; property CurrIAttrib: TSynHighlighterAttributes read fCurrIAttrib write setCurrIAttrib;
property DDocsAttrib: TSynHighlighterAttributes read fDDocsAttrib write setDDocsAttrib; property DDocsAttrib: TSynHighlighterAttributes read fDDocsAttrib write setDDocsAttrib;
property AsblrAttrib: TSynHighlighterAttributes read fAsblrAttrib write setAsblrAttrib; property AsblrAttrib: TSynHighlighterAttributes read fAsblrAttrib write setAsblrAttrib;
property SpeckAttrib: TSynHighlighterAttributes read fSpeckAttrib write setSpeckAttrib;
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
@ -161,11 +170,11 @@ type
implementation implementation
constructor TD2Dictionary.create; constructor TD2Dictionary.create(from: array of string);
var var
value: string; value: string;
begin begin
for value in D2Kw do for value in from do
addEntry(value); addEntry(value);
end; end;
@ -278,7 +287,8 @@ begin
DefaultFilter:= 'D source|*.d|D interface|*.di'; DefaultFilter:= 'D source|*.d|D interface|*.di';
fKeyWords.create; fKeyWords.create(D2Kw);
fSpecKw.create(D2SpecKw);
fFoldKinds := [fkBrackets]; fFoldKinds := [fkBrackets];
@ -294,6 +304,7 @@ begin
fCurrIAttrib := TSynHighlighterAttributes.Create('CurrentIdentifier','CurrentIdentifier'); fCurrIAttrib := TSynHighlighterAttributes.Create('CurrentIdentifier','CurrentIdentifier');
fDDocsAttrib := TSynHighlighterAttributes.Create('DDoc','DDoc'); fDDocsAttrib := TSynHighlighterAttributes.Create('DDoc','DDoc');
fAsblrAttrib := TSynHighlighterAttributes.Create('Asm','Asm'); fAsblrAttrib := TSynHighlighterAttributes.Create('Asm','Asm');
fSpeckAttrib := TSynHighlighterAttributes.Create('SpecialKeywords','SpecialKeywords');
fNumbrAttrib.Foreground := $000079F2; fNumbrAttrib.Foreground := $000079F2;
fSymblAttrib.Foreground := clMaroon; fSymblAttrib.Foreground := clMaroon;
@ -302,6 +313,7 @@ begin
fStrngAttrib.Foreground := clBlue; fStrngAttrib.Foreground := clBlue;
fKeywdAttrib.Foreground := clNavy; fKeywdAttrib.Foreground := clNavy;
fAsblrAttrib.Foreground := clGray; fAsblrAttrib.Foreground := clGray;
fSpeckAttrib.Foreground := clNavy;
fCurrIAttrib.Foreground := clBlack; fCurrIAttrib.Foreground := clBlack;
fCurrIAttrib.FrameEdges := sfeAround; fCurrIAttrib.FrameEdges := sfeAround;
@ -313,6 +325,7 @@ begin
fCommtAttrib.Style := [fsItalic]; fCommtAttrib.Style := [fsItalic];
fKeywdAttrib.Style := [fsBold]; fKeywdAttrib.Style := [fsBold];
fAsblrAttrib.Style := [fsBold]; fAsblrAttrib.Style := [fsBold];
fSpeckAttrib.Style := [fsBold];
AddAttribute(fWhiteAttrib); AddAttribute(fWhiteAttrib);
AddAttribute(fNumbrAttrib); AddAttribute(fNumbrAttrib);
@ -324,6 +337,7 @@ begin
AddAttribute(fCurrIAttrib); AddAttribute(fCurrIAttrib);
AddAttribute(fDDocsAttrib); AddAttribute(fDDocsAttrib);
AddAttribute(fAsblrAttrib); AddAttribute(fAsblrAttrib);
AddAttribute(fSpeckAttrib);
fAttribLut[TTokenKind.tkident] := fIdentAttrib; fAttribLut[TTokenKind.tkident] := fIdentAttrib;
fAttribLut[TTokenKind.tkBlank] := fWhiteAttrib; fAttribLut[TTokenKind.tkBlank] := fWhiteAttrib;
@ -334,6 +348,7 @@ begin
fAttribLut[TTokenKind.tksymbl] := fSymblAttrib; fAttribLut[TTokenKind.tksymbl] := fSymblAttrib;
fAttribLut[TTokenKind.tkCurrI] := fCurrIAttrib; fAttribLut[TTokenKind.tkCurrI] := fCurrIAttrib;
fAttribLut[TTokenKind.tkDDocs] := fDDocsAttrib; fAttribLut[TTokenKind.tkDDocs] := fDDocsAttrib;
fAttribLut[TTokenKind.tkSpecK] := fSpeckAttrib;
SetAttributesOnChange(@doAttribChange); SetAttributesOnChange(@doAttribChange);
fTokStop := 1; fTokStop := 1;
@ -434,6 +449,11 @@ begin
fAsblrAttrib.Assign(aValue); fAsblrAttrib.Assign(aValue);
end; end;
procedure TSynD2Syn.setSpeckAttrib(aValue: TSynHighlighterAttributes);
begin
fSpeckAttrib.Assign(aValue);
end;
procedure TSynD2Syn.setCurrIdent(const aValue: string); procedure TSynD2Syn.setCurrIdent(const aValue: string);
begin begin
if fCurrIdent = aValue then Exit; if fCurrIdent = aValue then Exit;
@ -821,8 +841,9 @@ begin
end; end;
if fKeyWords.find(fLineBuf[FTokStart..fTokStop-1]) then if fKeyWords.find(fLineBuf[FTokStart..fTokStop-1]) then
fTokKind := tkKeywd fTokKind := tkKeywd
else else if fSpecKw.find(fLineBuf[FTokStart..fTokStop-1]) then
if fLineBuf[FTokStart..fTokStop-1] = fCurrIdent then fTokKind := tkSpecK
else if fLineBuf[FTokStart..fTokStop-1] = fCurrIdent then
fTokKind := tkCurrI; fTokKind := tkCurrI;
//check asm range //check asm range
if fTokKind = tkKeywd then if fTokKind = tkKeywd then