📄 synhighlighterphp.pas
字号:
end;
procedure TSynPHPSyn.PoundProc;
begin
repeat
inc(Run);
until FLine[Run] in [#0, #10, #13];
fTokenID := tkComment;
end;
procedure TSynPHPSyn.QuestionProc;
begin
fTokenID := tkSymbol; {question mark - conditional}
inc(Run);
end;
procedure TSynPHPSyn.RemainderSymbolProc;
begin
case FLine[Run + 1] of
'=': {remainder assign}
begin
inc(Run, 2);
fTokenID := tkSymbol;
end;
else {remainder}
begin
inc(Run);
fTokenID := tkSymbol;
end;
end;
end;
procedure TSynPHPSyn.RoundCloseProc;
begin
inc(Run);
fTokenID := tkSymbol;
end;
procedure TSynPHPSyn.RoundOpenProc;
begin
inc(Run);
FTokenID := tkSymbol;
end;
procedure TSynPHPSyn.SemiColonProc;
begin
inc(Run); {semicolon}
fTokenID := tkSymbol;
end;
procedure TSynPHPSyn.SlashProc;
begin
case FLine[Run + 1] of
'/': {c++ style comments}
begin
inc(Run, 2);
fTokenID := tkComment;
while FLine[Run] <> #0 do
begin
case FLine[Run] of
#10, #13: break;
end;
inc(Run);
end;
end;
'*':
begin
fRange := rsComment;
inc(Run);
fTokenID := tkComment; {c style comment}
inc(Run);
while fLine[Run] <> #0 do
case fLine[Run] of
'*':
if fLine[Run + 1] = '/' then
begin
fRange := rsUnKnown;
inc(Run, 2);
break;
end else inc(Run);
#10: break;
#13: break;
else inc(Run);
end;
end;
'=': {division assign}
begin
inc(Run, 2);
fTokenID := tkSymbol;
end;
else {division}
begin
inc(Run);
fTokenID := tkSymbol;
end;
end;
end;
procedure TSynPHPSyn.SpaceProc;
begin
inc(Run);
fTokenID := tkSpace;
while FLine[Run] in [#1..#9, #11, #12, #14..#32] do inc(Run);
end;
procedure TSynPHPSyn.SquareCloseProc;
begin
inc(Run);
fTokenID := tkSymbol;
end;
procedure TSynPHPSyn.SquareOpenProc;
begin
inc(Run);
fTokenID := tkSymbol;
end;
procedure TSynPHPSyn.StringProc;
function IsEscaped: boolean;
var
iFirstSlashPos: integer;
begin
iFirstSlashPos := Run -1;
while (iFirstSlashPos > 0) and (FLine[iFirstSlashPos] = '\') do
Dec( iFirstSlashPos );
Result := (Run - iFirstSlashPos +1) mod 2 <> 0;
end;
var
iCloseChar: char;
begin
if (FLine[Run] in [#0, #10, #13]) and (fTokenPos = Run) then
begin
fProcTable[ FLine[Run] ];
Exit;
end;
fTokenID := tkString;
if fRange = rsString39 then
iCloseChar := #39
else
iCloseChar := #34;
while not( FLine[Run] in [#0, #10, #13] ) do
begin
if (FLine[Run] = iCloseChar) and (not IsEscaped) then
break;
if (FLine[Run] = '$') and (iCloseChar = '"') and
( (FLine[Run +1] = '{') or Identifiers[ FLine[Run +1] ] ) then
begin
if (Run > 1) and (FLine[Run -1] = '{') then { complex syntax }
Dec( Run );
if not IsEscaped then
begin
{ break the token to process the variable }
fRange := rsVarExpansion;
Exit;
end
else if FLine[Run] = '{' then
Inc( Run ); { restore Run if we previously deincremented it }
end;
Inc(Run);
end;
if (FLine[Run] = iCloseChar) then
fRange := rsUnKnown;
if FLine[Run] <> #0 then inc(Run);
end;
procedure TSynPHPSyn.VarExpansionProc;
type
TExpansionSyntax = (esNormal, esComplex, esBrace);
var
iSyntax: TExpansionSyntax;
iOpenBraces: integer;
iOpenBrackets: integer;
iTempRun: integer;
begin
fRange := rsString34; { var expansion only occurs in double quoted strings }
FTokenID := tkVariable;
if FLine[Run] = '{' then
begin
iSyntax := esComplex;
Inc( Run, 2 ); { skips '{$' }
end
else begin
Inc( Run );
if FLine[Run] = '{' then
begin
iSyntax := esBrace;
Inc( Run );
end
else
iSyntax := esNormal;
end;
if iSyntax in [esBrace, esComplex] then
begin
iOpenBraces := 1;
while FLine[Run] <> #0 do
begin
if FLine[Run] = '}' then
begin
Dec( iOpenBraces );
if iOpenBraces = 0 then
begin
Inc( Run );
break;
end;
end;
if FLine[Run] = '{' then
Inc( iOpenBraces );
Inc( Run );
end;
end
else begin
while Identifiers[ FLine[Run] ] do
Inc( Run );
iOpenBrackets := 0;
iTempRun := Run;
{ process arrays and objects }
while FLine[iTempRun] <> #0 do
begin
if FLine[iTempRun] = '[' then
begin
Inc( iTempRun );
if FLine[iTempRun] = #39 then
begin
Inc( iTempRun );
while (FLine[iTempRun] <> #39) and (FLine[iTempRun] <> #0) do
Inc( iTempRun );
if (FLine[iTempRun] = #39) and (fLine[iTempRun +1] = ']') then
begin
Inc( iTempRun, 2 );
Run := iTempRun;
continue;
end
else
break;
end
else
Inc( iOpenBrackets );
end
else if (FLine[iTempRun] = '-') and (FLine[iTempRun +1] = '>') then
Inc( iTempRun, 2 )
else
break;
if not Identifiers[ FLine[iTempRun] ] then
break
else
repeat
Inc( iTempRun );
until not Identifiers[ FLine[iTempRun] ];
while FLine[iTempRun] = ']' do
begin
if iOpenBrackets = 0 then
break;
Dec( iOpenBrackets );
Inc( iTempRun );
end;
if iOpenBrackets = 0 then
Run := iTempRun;
end;
end;
end;
procedure TSynPHPSyn.TildeProc;
begin
inc(Run); {bitwise complement}
fTokenId := tkSymbol;
end;
procedure TSynPHPSyn.VariableProc;
begin
fTokenID := tkVariable;
inc(Run);
while Identifiers[fLine[Run]] do inc(Run);
end;
procedure TSynPHPSyn.XOrSymbolProc;
begin
Case FLine[Run + 1] of
'=': {xor assign}
begin
inc(Run, 2);
fTokenID := tkSymbol;
end;
else {xor}
begin
inc(Run);
fTokenID := tkSymbol;
end;
end;
end;
procedure TSynPHPSyn.UnknownProc;
begin
inc(Run);
fTokenID := tkUnknown;
end;
procedure TSynPHPSyn.AnsiCProc;
begin
fTokenID := tkComment;
case FLine[Run] of
#0:
begin
NullProc;
exit;
end;
#10:
begin
LFProc;
exit;
end;
#13:
begin
CRProc;
exit;
end;
end;
while FLine[Run] <> #0 do
case FLine[Run] of
'*':
if fLine[Run + 1] = '/' then
begin
inc(Run, 2);
fRange := rsUnKnown;
break;
end
else inc(Run);
#10: break;
#13: break;
else inc(Run);
end;
end;
procedure TSynPHPSyn.String39Proc;
begin
fRange := rsString39;
Inc( Run );
StringProc;
end;
procedure TSynPHPSyn.String34Proc;
begin
fRange := rsString34;
Inc( Run );
StringProc;
end;
procedure TSynPHPSyn.Next;
begin
fTokenPos := Run;
case fRange of
rsComment: AnsiCProc;
rsString39, rsString34: StringProc;
rsVarExpansion: VarExpansionProc;
else begin
fRange := rsUnknown;
fProcTable[fLine[Run]];
end;
end;
end;
function TSynPHPSyn.GetDefaultAttribute(Index: integer): TSynHighlighterAttributes;
begin
case Index of
SYN_ATTR_COMMENT: Result := fCommentAttri;
SYN_ATTR_IDENTIFIER: Result := fIdentifierAttri;
SYN_ATTR_KEYWORD: Result := fKeyAttri;
SYN_ATTR_STRING: Result := fStringAttri;
SYN_ATTR_WHITESPACE: Result := fSpaceAttri;
SYN_ATTR_SYMBOL: Result := fSymbolAttri;
else
Result := nil;
end;
end;
function TSynPHPSyn.GetEol: Boolean;
begin
Result := fTokenID = tkNull;
end;
function TSynPHPSyn.GetRange: Pointer;
begin
Result := Pointer(fRange);
end;
function TSynPHPSyn.GetToken: String;
var
Len: LongInt;
begin
Len := Run - fTokenPos;
SetString(Result, (FLine + fTokenPos), Len);
end;
function TSynPHPSyn.GetTokenID: TtkTokenKind;
begin
Result := fTokenId;
end;
function TSynPHPSyn.GetTokenAttribute: TSynHighlighterAttributes;
begin
case GetTokenID of
tkComment: Result := fCommentAttri;
tkIdentifier: Result := fIdentifierAttri;
tkKey: Result := fKeyAttri;
tkNumber: Result := fNumberAttri;
tkSpace: Result := fSpaceAttri;
tkString: Result := fStringAttri;
tkSymbol: Result := fSymbolAttri;
tkVariable: Result := fVariableAttri;
tkUnknown: Result := fIdentifierAttri;
else Result := nil;
end;
end;
function TSynPHPSyn.GetTokenKind: integer;
begin
Result := Ord(fTokenId);
end;
function TSynPHPSyn.GetTokenPos: Integer;
begin
Result := fTokenPos;
end;
procedure TSynPHPSyn.ResetRange;
begin
fRange := rsUnknown;
end;
procedure TSynPHPSyn.SetRange(Value: Pointer);
begin
fRange := TRangeState(Value);
end;
function TSynPHPSyn.GetIdentChars: TSynIdentChars;
begin
Result := TSynValidStringChars;
end;
class function TSynPHPSyn.GetLanguageName: string;
begin
Result := SYNS_LangPHP;
end;
function TSynPHPSyn.GetSampleSource: string;
begin
Result := '// Syntax highlighting'#13#10+
'function printNumber()'#13#10+
'{'#13#10+
' $number = 1234;'#13#10+
' print "The number is $number";'#13#10+
' for ($i = 0; $i <= $number; $i++)'#13#10+
' {'#13#10+
' $x++;'#13#10+
' $x--;'#13#10+
' $x += 1.0;'#13#10+
' }'#13#10+
'}';
end;
initialization
MakeIdentTable;
{$IFNDEF SYN_CPPB_1} //mh 2000-07-14
RegisterPlaceableHighlighter(TSynPHPSyn);
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -