📄 synhighlighterpython.pas
字号:
nsStart:
if not CheckStart then Exit;
nsDotFound:
if not CheckDotFound then Exit;
nsFloatNeeded:
if not CheckFloatNeeded then Exit;
nsHex:
if not CheckHex then Exit;
nsOct:
if not CheckOct then Exit;
nsExpFound:
if not CheckExpFound then Exit;
end; // case
Inc (Run);
end; // while
end;
procedure TSynPythonSyn.SpaceProc;
begin
inc(Run);
fTokenID := tkSpace;
while FLine[Run] in [#1..#9, #11, #12, #14..#32] do
inc(Run);
end;
procedure TSynPythonSyn.String2Proc;
var fBackslashCount:integer;
begin
fTokenID := tkString;
if (FLine[Run + 1] = '"') and (FLine[Run + 2] = '"') then begin
fTokenID := tkTrippleQuotedString;
inc(Run, 3);
fRange:=rsMultilineString2;
while fLine[Run] <> #0 do begin
case fLine[Run] of
'\':begin
{ If we're looking at a backslash, and the following character is an
end quote, and it's preceeded by an odd number of backslashes, then
it shouldn't mark the end of the string. If it's preceeded by an
even number, then it should. !!!THIS RULE DOESNT APPLY IN RAW STRINGS}
if FLine[Run + 1] = '"' then
begin
fBackslashCount := 1;
while ((Run > fBackslashCount) and (FLine[Run - fBackslashCount] = '\')) do
fBackslashCount := fBackslashCount + 1;
if (fBackslashCount mod 2 = 1) then inc(Run)
end;
inc(Run);
end;// '\':
'"':
if (fLine[Run + 1] = '"') and (fLine[Run + 2] = '"') then begin
fRange := rsUnKnown;
inc(Run, 3);
EXIT;
end else
inc(Run);
#10:EXIT;
#13:EXIT;
else
inc(Run);
end;
end;
end
else //if short string
repeat
case FLine[Run] of
#0, #10, #13 : begin
if FLine[Run-1] = '\' then begin
fStringStarter := '"';
fRange := rsMultilineString3;
end;
BREAK;
end;
{The same backslash stuff above...}
'\':begin
if FLine[Run + 1] = '"' then
begin
fBackslashCount := 1;
while ((Run > fBackslashCount) and (FLine[Run - fBackslashCount] = '\')) do
fBackslashCount := fBackslashCount + 1;
if (fBackslashCount mod 2 = 1) then inc(Run)
end;
inc(Run);
end;// '\':
else inc(Run);
end; //case
until (FLine[Run] = '"');
if FLine[Run] <> #0 then inc(Run);
end;
procedure TSynPythonSyn.PreStringProc;
var
temp: Char;
begin
// Handle python raw strings
// r""
temp := FLine[Run + 1];
if temp = '''' then begin
Inc (Run);
StringProc;
end else if temp = '"' then begin
Inc (Run);
String2Proc;
end else begin
// If not followed by quote char, must be ident
IdentProc;
end; // if
end;
procedure TSynPythonSyn.UnicodeStringProc;
begin
// Handle python raw and unicode strings
// Valid syntax: u"", or ur""
if (FLine[Run + 1] in ['r', 'R']) and (FLine[Run + 2] in ['''', '"']) then
// for ur, Remove the "u" and...
Inc (Run);
// delegate to raw strings
PreStringProc;
end;
procedure TSynPythonSyn.StringProc;
var fBackslashCount:integer;
begin
fTokenID := tkString;
if (FLine[Run + 1] = #39) and (FLine[Run + 2] = #39) then begin
fTokenID := tkTrippleQuotedString;
inc(Run, 3);
fRange:=rsMultilineString;
while fLine[Run] <> #0 do begin
case fLine[Run] of
'\': begin
{ If we're looking at a backslash, and the following character is an
end quote, and it's preceeded by an odd number of backslashes, then
it shouldn't mark the end of the string. If it's preceeded by an
even number, then it should. !!!THIS RULE DOESNT APPLY IN RAW STRINGS}
if FLine[Run + 1] = #39 then
begin
fBackslashCount := 1;
while ((Run > fBackslashCount) and (FLine[Run - fBackslashCount] = '\')) do
fBackslashCount := fBackslashCount + 1;
if (fBackslashCount mod 2 = 1) then inc(Run)
end;
inc(Run);
end;// '\':
#39:
if (fLine[Run + 1] = #39) and (fLine[Run + 2] = #39) then begin
fRange := rsUnKnown;
inc(Run, 3);
EXIT;
end else
inc(Run);
#10: EXIT;
#13: EXIT;
else
inc(Run);
end;
end;
end
else //if short string
repeat
case FLine[Run] of
#0, #10, #13 : begin
if FLine[Run-1] = '\' then begin
fStringStarter := #39;
fRange := rsMultilineString3;
end;
BREAK;
end;
{The same backslash stuff above...}
'\':begin
if FLine[Run + 1] = #39 then
begin
fBackslashCount := 1;
while ((Run > fBackslashCount) and (FLine[Run - fBackslashCount] = '\')) do
fBackslashCount := fBackslashCount + 1;
if (fBackslashCount mod 2 = 1) then inc(Run)
end;
inc(Run);
end;// '\':
else inc(Run);
end; //case
until (FLine[Run] = #39);
if FLine[Run] <> #0 then inc(Run);
end;
procedure TSynPythonSyn.StringEndProc(EndChar:char);
var fBackslashCount:integer;
begin
if fRange = rsMultilineString3 then
fTokenID := tkString
else
fTokenID := tkTrippleQuotedString;
case FLine[Run] of
#0:
begin
NullProc;
EXIT;
end;
#10:
begin
LFProc;
EXIT;
end;
#13:
begin
CRProc;
EXIT;
end;
end;
if fRange = rsMultilineString3 then begin
repeat
if FLine[Run]=fStringStarter then begin
inc(Run);
fRange:=rsUnknown;
EXIT;
end else if FLine[Run]='\' then ; {The same backslash stuff above...}
begin
if FLine[Run + 1] = fStringStarter then
begin
fBackslashCount := 1;
while ((Run > fBackslashCount) and (FLine[Run - fBackslashCount] = '\')) do
fBackslashCount := fBackslashCount + 1;
if (fBackslashCount mod 2 = 1) then inc(Run);
end;
end;// if FLine[Run]...
inc(Run);
until (FLine[Run] in [#0, #10, #13]);
if FLine[Run-1]<>'\' then begin
fRange:=rsUnknown;
EXIT;
end;
end else
repeat
if FLine[Run] = '\' then
begin
if FLine[Run + 1] = EndChar then
begin
fBackslashCount := 1;
while ((Run > fBackslashCount) and (FLine[Run - fBackslashCount] = '\')) do
fBackslashCount := fBackslashCount + 1;
if (fBackslashCount mod 2 = 1) then inc(Run, 2);
end;
end;// if FLine[Run]...
if (FLine[Run]=EndChar) and (FLine[Run+1]=EndChar) and (FLine[Run+2]=EndChar) then begin
inc(Run,3);
fRange:=rsUnknown;
EXIT;
end;
inc(Run);
until (FLine[Run] in [#0, #10, #13]);
end;
procedure TSynPythonSyn.UnknownProc;
begin
{$IFDEF SYN_MBCSSUPPORT}
if FLine[Run] in LeadBytes then
Inc(Run, 2)
else
{$ENDIF}
inc(Run);
fTokenID := tkUnknown;
end;
procedure TSynPythonSyn.Next;
begin
fTokenPos := Run;
case fRange of
rsMultilineString:
StringEndProc(#39);
rsMultilineString2:
StringEndProc('"');
rsMultilineString3:
StringEndProc(fStringStarter);
else
fProcTable[fLine[Run]];
end;
end;
function TSynPythonSyn.GetDefaultAttribute(Index: integer): TSynHighlighterAttributes;
begin
case Index of
SYN_ATTR_COMMENT: Result := fCommentAttri;
SYN_ATTR_KEYWORD: Result := fKeyAttri;
SYN_ATTR_WHITESPACE: Result := fSpaceAttri;
SYN_ATTR_SYMBOL: Result := fSymbolAttri;
else
Result := nil;
end;
end;
function TSynPythonSyn.GetEol: Boolean;
begin
Result := fTokenId = tkNull;
end;
function TSynPythonSyn.GetRange: Pointer;
begin
Result := Pointer(fRange);
end;
function TSynPythonSyn.GetToken: string;
var
Len: LongInt;
begin
Len := Run - fTokenPos;
SetString(Result, (FLine + fTokenPos), Len);
end;
function TSynPythonSyn.GetTokenID: TtkTokenKind;
begin
Result := fTokenId;
end;
function TSynPythonSyn.GetTokenAttribute: TSynHighlighterAttributes;
begin
case fTokenID of
tkComment: Result := fCommentAttri;
tkIdentifier: Result := fIdentifierAttri;
tkKey: Result := fKeyAttri;
tkNonKeyword: Result := fNonKeyAttri;
tkSystemDefined: Result := fSystemAttri;
tkNumber: Result := fNumberAttri;
tkHex: Result := fHexAttri;
tkOct: Result := fOctalAttri;
tkFloat: Result := fFloatAttri;
tkSpace: Result := fSpaceAttri;
tkString: Result := fStringAttri;
tkTrippleQuotedString: Result := fDocStringAttri;
tkSymbol: Result := fSymbolAttri;
tkUnknown: Result := fErrorAttri;
else
Result := nil;
end;
end;
function TSynPythonSyn.GetTokenKind: integer;
begin
Result := Ord(fTokenId);
end;
function TSynPythonSyn.GetTokenPos: Integer;
begin
Result := fTokenPos;
end;
procedure TSynPythonSyn.ResetRange;
begin
fRange := rsUnknown;
end;
procedure TSynPythonSyn.SetRange(Value: Pointer);
begin
fRange := TRangeState(Value);
end;
function TSynPythonSyn.GetIdentChars: TSynIdentChars;
begin
Result := TSynValidStringChars;
end;
function TSynPythonSyn.IsFilterStored: Boolean;
begin
Result := fDefaultFilter <> SYNS_FilterPython;
end;
class function TSynPythonSyn.GetLanguageName: string;
begin
Result := SYNS_LangPython;
end;
function TSynPythonSyn.GetSampleSource: string;
begin
Result :=
'#!/usr/local/bin/python'#13#10 +
'import string, sys'#13#10 +
'""" If no arguments were given, print a helpful message """'#13#10 +
'if len(sys.argv)==1:'#13#10 +
' print ''Usage: celsius temp1 temp2 ...'''#13#10 +
' sys.exit(0)';
end;
initialization
{$IFNDEF SYN_CPPB_1}
RegisterPlaceableHighlighter(TSynPythonSyn);
{$ENDIF}
finalization
GlobalKeywords.Free;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -