📄 synhighlightermulti.pas
字号:
var
cScheme: integer;
iHL: TSynCustomHighlighter;
begin
if idx < Schemes.Count then
Result := Schemes[ idx ].MarkerAttri
else begin
Dec( idx, Schemes.Count );
if DefaultHighlighter <> nil then
if idx < DefaultHighlighter.AttrCount then
begin
Result := DefaultHighlighter.Attribute[idx];
Exit;
end
else
Dec( idx, DefaultHighlighter.AttrCount );
for cScheme := 0 to Schemes.Count -1 do
begin
iHL := Schemes[cScheme].Highlighter;
if iHL <> nil then
if idx < iHL.AttrCount then
begin
Result := iHL.Attribute[idx];
Exit;
end
else
Dec( idx, iHL.AttrCount );
end;
Result := nil;
end;
end;
function TSynMultiSyn.GetDefaultAttribute(Index: integer): TSynHighlighterAttributes;
var
iHL: TSynCustomHighlighter;
begin
if (CurrScheme >= 0) and (Schemes[CurrScheme].Highlighter <> nil) then
iHL := Schemes[CurrScheme].Highlighter
else
iHL := DefaultHighlighter;
{ the typecast to TSynMultiSyn is only necessary because the
GetDefaultAttribute method is protected.
And don't worry: this really works }
if iHL <> nil then begin
Result := TSynMultiSyn(iHL).GetDefaultAttribute(Index)
end else
Result := nil;
end;
function TSynMultiSyn.GetEol: Boolean;
begin
if fMarker <> nil then
Result := False
else if fCurrScheme >= 0 then
Result := Schemes[CurrScheme].Highlighter.GetEol
else if DefaultHighlighter <> nil then
Result := DefaultHighlighter.GetEol
else
Result := fRun > Length(fLine) + 2;
end;
function TSynMultiSyn.GetIdentChars: TSynIdentChars;
begin
if CurrScheme >= 0 then
Result := Schemes[CurrScheme].Highlighter.IdentChars
else if DefaultHighlighter <> nil then
Result := DefaultHighlighter.IdentChars
else
Result := inherited GetIdentChars;
end;
class function TSynMultiSyn.GetLanguageName: string;
begin
Result := SYNS_LangGeneralMulti;
end;
function TSynMultiSyn.GetMarkers(aIndex: integer): TMarker;
begin
Result := TMarker( fMarkers[ aIndex ] );
end;
procedure TSynMultiSyn.OldRangeProc(Operation: TRangeOperation; var Range: cardinal);
const
MaxNestedMultiSyn = 6;
{ number of bits of the Range that will be used to store the SchemeIndex }
SchemeIndexSize = 4;
MaxSchemeCount = (1 shl SchemeIndexSize) -1;
{ number of bits of the Range that will be used to store the SchemeRange }
SchemeRangeSize = 8;
MaxSchemeRange = (1 shl SchemeRangeSize) -1;
var
iHL: TSynCustomHighlighter;
iSchemeIndex: cardinal;
iSchemeRange: cardinal;
begin
if Operation = roGet then
begin
if (fCurrScheme < 0) then
iHL := DefaultHighlighter
else
iHL := Schemes[fCurrScheme].Highlighter;
iSchemeIndex := fCurrScheme +2;
Assert( iSchemeIndex <= MaxSchemeCount );
if iHL <> nil then begin
iSchemeRange := cardinal( iHL.GetRange );
Assert( (iSchemeRange <= MaxSchemeRange) or (iHL is TSynMultiSyn) );
end else
iSchemeRange := 0;
{ checks the limit of nested MultiSyns }
Assert( iSchemeRange shr ((MaxNestedMultiSyn -1)*SchemeIndexSize + SchemeRangeSize) = 0 );
iSchemeRange := (iSchemeRange shl SchemeIndexSize) or iSchemeIndex;
Range := iSchemeRange;
end
else begin
if Range = 0 then
Exit;
iSchemeRange := cardinal(Range);
fCurrScheme := integer(iSchemeRange and MaxSchemeCount) -2;
iSchemeRange := iSchemeRange shr SchemeIndexSize;
if (CurrScheme < 0) then begin
if DefaultHighlighter <> nil then
DefaultHighlighter.SetRange( pointer(iSchemeRange) );
end else begin
Schemes[CurrScheme].Highlighter.SetRange( pointer(iSchemeRange) );
end;
end;
end;
function TSynMultiSyn.GetToken: string;
begin
if DefaultHighlighter = nil then
Result := fLine
else
Result := Copy( fLine, fTokenPos +1, fRun - fTokenPos -1)
end;
function TSynMultiSyn.GetTokenAttribute: TSynHighlighterAttributes;
begin
if fMarker <> nil then
Result := Schemes[fMarker.fScheme].MarkerAttri
else if CurrScheme >= 0 then
Result := Schemes[CurrScheme].Highlighter.GetTokenAttribute
else if DefaultHighlighter <> nil then
Result := DefaultHighlighter.GetTokenAttribute
else
Result := nil;
end;
function TSynMultiSyn.GetTokenKind: integer;
begin
if fMarker <> nil then
Result := 0
else if fCurrScheme >= 0 then
Result := Schemes[fCurrScheme].Highlighter.GetTokenKind
else if DefaultHighlighter <> nil then
Result := DefaultHighlighter.GetTokenKind
else
Result := 0;
end;
function TSynMultiSyn.GetTokenPos: Integer;
begin
Result := fTokenPos;
end;
procedure TSynMultiSyn.HookHighlighter(aHL: TSynCustomHighlighter);
begin
aHL.FreeNotification( Self );
aHL.HookAttrChangeEvent( DefHighlightChange );
end;
procedure TSynMultiSyn.Next;
var
iToken: String;
iHL: TSynCustomHighlighter;
begin
if DefaultHighlighter = nil then begin
if fRun > 1 then
Inc( fRun )
else
fRun := Length(fLine) + 2;
Exit;
end;
if (fNextMarker < fMarkers.Count) and (fRun >= Markers[fNextMarker].fStartPos) then begin
fMarker := Markers[ fNextMarker ];
if fMarker.fIsOpenMarker then
begin
fCurrScheme := fMarker.fScheme;
fTmpRange := DefaultHighlighter.GetRange;
Schemes[CurrScheme].Highlighter.ResetRange;
end;
Inc( fNextMarker );
fTokenPos := fRun -1;
Inc( fRun, fMarker.fMarkerLen );
Exit;
end;
if (fRun = 1) then begin
if fMarkers.Count = 0 then
fTmpLine := fLine
else
fTmpLine := Copy( fLine, 1, Markers[fNextMarker].fStartPos -1 );
if CurrScheme >= 0 then
iHL := Schemes[CurrScheme].Highlighter
else
iHL := DefaultHighlighter;
iHL.SetLine( fTmpLine, fLineNumber );
end else if fMarker <> nil then begin
if not fMarker.fIsOpenMarker then
begin
fCurrScheme := -1;
DefaultHighlighter.SetRange( fTmpRange );
end;
fMarker := nil;
{}
if fNextMarker < fMarkers.Count then
fTmpLine := Copy( fLine, fRun, Markers[fNextMarker].fStartPos - fRun )
else
fTmpLine := Copy( fLine, fRun, MaxInt );
if CurrScheme >= 0 then
iHL := Schemes[CurrScheme].Highlighter
else
iHL := DefaultHighlighter;
iHL.SetLine( fTmpLine, fLineNumber );
end else begin
if CurrScheme >= 0 then
iHL := Schemes[CurrScheme].Highlighter
else
iHL := DefaultHighlighter;
iHL.Next;
end;
fTokenPos := iHL.GetTokenPos;
iToken := iHL.GetToken;
if fNextMarker > 0 then begin
with Markers[ fNextMarker -1 ] do
Inc( fTokenPos, fStartPos + fMarkerLen -1 );
end;
Inc( fRun, (fTokenPos - fRun +1) + Length(iToken) );
end;
procedure TSynMultiSyn.Notification(aComp: TComponent; aOp: TOperation);
var
cScheme: integer;
begin
inherited;
// 'opRemove' doesn't mean the component is being destroyed. It means it's
// being removed from its Owner's list of Components.
if (aOp = opRemove) and (aComp is TSynCustomHighlighter) and
(csDestroying in aComp.ComponentState) then
begin
if DefaultHighlighter = aComp then
DefaultHighlighter := nil;
for cScheme := 0 to Schemes.Count -1 do
if Schemes[ cScheme ].Highlighter = aComp then
Schemes[ cScheme ].Highlighter := nil;
end;
end;
procedure TSynMultiSyn.ResetRange;
begin
fCurrScheme := -1;
if DefaultHighlighter <> nil then
begin
DefaultHighlighter.ResetRange;
fTmpRange := DefaultHighlighter.GetRange;
end;
end;
procedure TSynMultiSyn.SetDefaultHighlighter(
const Value: TSynCustomHighLighter);
const
sDefaultHlSetToSelf = 'A SynMultiSyn cannot be its own DefaultHighlighter.';
begin
if DefaultHighlighter <> Value then begin
if Value = Self then
raise Exception.Create( sDefaultHlSetToSelf );
if DefaultHighlighter <> nil then
UnhookHighlighter( DefaultHighlighter );
fDefaultHighlighter := Value;
if DefaultHighlighter <> nil then
HookHighlighter( DefaultHighlighter );
DefHighlightChange( Self );
end;
end;
//GBN 31/01/2002 - Start
procedure TSynMultiSyn.DoCheckMarker(Scheme:TScheme; StartPos, MarkerLen: Integer;
const MarkerText: String; Start: Boolean; Line: Integer);
var
aStartPos: Integer;
aMarkerLen: Integer;
aMarkerText: String;
begin
aStartPos:=StartPos;
aMarkerLen:=MarkerLen;
aMarkerText:=MarkerText;
if (Start) and Assigned(Scheme.OnCheckStartMarker) then
Scheme.OnCheckStartMarker(Self,aStartPos,aMarkerLen,aMarkerText,Line)
else if (not Start) and Assigned(Scheme.OnCheckEndMarker) then
Scheme.OnCheckEndMarker(Self,aStartPos,aMarkerLen,aMarkerText,Line);
if (aMarkerText<>'') and (aMarkerLen>0) then
begin
fMarkers.Add(TMarker.Create(Scheme.Index, aStartPos, aMarkerLen,Start,aMarkerText));
end;
end;
//GBN 31/01/2002 - End
procedure TSynMultiSyn.SetLine(NewValue: string; LineNumber: Integer);
var
iParser: TRegExpr;
iScheme: TScheme;
iExpr: String;
iLine: String;
iEaten: integer;
cScheme: integer;
begin
ClearMarkers;
iParser := TRegExpr.Create;
try
iEaten := 0;
iLine := NewValue;
if CurrScheme >= 0
then
iScheme := fSchemes[ CurrScheme ]
else
iScheme := nil;
while iLine <> '' do
if iScheme <> nil then begin
iParser.Expression := iScheme.EndExpr;
iParser.ModifierI := not iScheme.CaseSensitive;
if iParser.Exec( iLine ) then begin
iExpr := Copy( NewValue, iParser.MatchPos[0] + iEaten, iParser.MatchLen[0] );
//GBN 31/01/2002 - Start
DoCheckMarker(iScheme, iParser.MatchPos[0] + iEaten, iParser.MatchLen[0],iExpr,False, LineNumber);
//fMarkers.Add( TMarker.Create( iScheme.Index, iParser.MatchPos[0] + iEaten,
// iParser.MatchLen[0], False, iExpr ) );
//GBN 31/01/2002 - End
Delete( iLine, 1, iParser.MatchPos[0] -1 + iParser.MatchLen[0] );
Inc( iEaten, iParser.MatchPos[0] -1 + iParser.MatchLen[0] );
iScheme := nil;
end else
break;
end else begin
for cScheme := 0 to Schemes.Count -1 do begin
iScheme := Schemes[ cScheme ];
if (iScheme.StartExpr = '') or (iScheme.EndExpr = '') or
(iScheme.Highlighter = nil) or (not iScheme.Highlighter.Enabled) then
begin
continue;
end;
iParser.Expression := iScheme.StartExpr;
iParser.ModifierI := not iScheme.CaseSensitive;
if iParser.Exec( iLine ) then begin
iExpr := Copy( NewValue, iParser.MatchPos[0] + iEaten, iParser.MatchLen[0] );
//GBN 31/01/2002 - Start
DoCheckMarker(iScheme, iParser.MatchPos[0] + iEaten, iParser.MatchLen[0],iExpr,True, LineNumber);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -