📄 synhighlighterunixshellscript.pas
字号:
fTokenID := tkSymbol;
end;
procedure TSynUNIXShellScriptSyn.CRProc;
begin
fTokenID := tkSpace;
case FLine[Run + 1] of
#10: inc(Run, 2);
else inc(Run);
end;
end;
procedure TSynUNIXShellScriptSyn.IdentProc;
begin
while Identifiers[fLine[Run]] do inc(Run);
if IsKeyWord(GetToken) then begin
fTokenId := tkKey;
Exit;
end
else fTokenId := tkIdentifier;
if IsSecondKeyWord(GetToken)
then fTokenId := tkSecondKey
else fTokenId := tkIdentifier;
end;
procedure TSynUNIXShellScriptSyn.LFProc;
begin
fTokenID := tkSpace;
inc(Run);
end;
procedure TSynUNIXShellScriptSyn.LowerProc;
{$IFDEF SYN_HEREDOC}
const
// In UNIX Shell, Heredoc delimiter can be pretty much anything and the list
// of alpha-numeric characters is extended with a few common special characters
AlphaNumericChars = ['A'..'Z', 'a'..'z', '0'..'9', '_', '-', '+', '!', '#', '%'];
var
i, Len, SkipRun : Integer;
IndentedHeredoc : Boolean;
QuoteChar : Char;
{$ENDIF}
begin
{$IFDEF SYN_HEREDOC}
if FLine[Run + 1] = '<' then
begin
fTokenID := tkSymbol;
SkipRun := 0;
QuoteChar := #0;
if (FLine[Run + 2] = '-') and (FLine[Run + 3] in ['"', '''', '`', '\']) then
begin
SkipRun := 2;
if FLine[Run + 3] <> '\' then
QuoteChar := FLine[Run + 3];
end
else
if (FLine[Run + 2] in ['-', '"', '''', '`', '\']) then
begin
SkipRun := 1;
if not (FLine[Run + 2] in ['-', '\']) then
QuoteChar := FLine[Run + 2];
end;
IndentedHeredoc := (SkipRun > 0) and (FLine[Run + 2] = '-');
if (FLine[Run + SkipRun + 2] in AlphaNumericChars) then
begin
inc(Run, 2);
i := Run;
while FLine[SkipRun + i] in AlphaNumericChars do Inc(i);
Len := i - Run;
if Len > 255 then
begin
fTokenID := tkUnknown;
Exit;
end;
if (QuoteChar <> #0) and (FLine[Run + SkipRun + Len] <> QuoteChar) then
begin
fTokenID := tkUnknown;
Exit;
end;
if IndentedHeredoc then
fRange := rsIndentedHeredoc
else
fRange := rsHeredoc;
fHeredocLength := Len;
fHeredocChecksum := CalcFCS(FLine[Run + SkipRun], Len);
Inc(Run, SkipRun + Len);
fTokenID := tkString;
end
else
inc(Run, 2);
end
else
{$ENDIF}
begin
inc(Run);
fTokenID := tkSymbol;
end;
end;
procedure TSynUNIXShellScriptSyn.NullProc;
begin
fTokenID := tkNull;
end;
procedure TSynUNIXShellScriptSyn.NumberProc;
begin
inc(Run);
fTokenID := tkNumber;
while FLine[Run] in ['0'..'9', '.', 'e', 'E'] do
begin
case FLine[Run] of
'.':
if FLine[Run + 1] = '.' then break;
end;
inc(Run);
end;
end;
procedure TSynUNIXShellScriptSyn.RoundOpenProc;
begin
inc(Run);
fTokenId := tkSymbol;
end;
procedure TSynUNIXShellScriptSyn.SlashProc;
begin
if FLine[Run] = '#' then begin
// Perl Styled Comment
inc(Run);
fTokenID := tkComment;
while FLine[Run] <> #0 do
begin
case FLine[Run] of
#10, #13: break;
end;
inc(Run);
end;
end
else
begin
inc(Run);
fTokenID := tkSymbol;
end;
end;
procedure TSynUNIXShellScriptSyn.SpaceProc;
begin
inc(Run);
fTokenID := tkSpace;
while FLine[Run] in [#1..#9, #11, #12, #14..#32] do inc(Run);
end;
procedure TSynUNIXShellScriptSyn.StringProc;
var
QuoteChar: Char;
begin
// Single and Double Quotes.
fTokenID := tkString;
QuoteChar := FLine[Run]; // either " or '
if (FLine[Run + 1] = QuoteChar) and (FLine[Run + 2] = QuoteChar)
then inc(Run, 2);
repeat
case FLine[Run] of
#0, #10, #13: break;
end;
inc(Run);
until FLine[Run] = QuoteChar;
if FLine[Run] <> #0 then inc(Run);
end;
procedure TSynUNIXShellScriptSyn.UnknownProc;
begin
{$IFDEF SYN_MBCSSUPPORT}
if FLine[Run] in LeadBytes then
Inc(Run, 2)
else
{$ENDIF}
inc(Run);
fTokenID := tkUnknown;
end;
{$IFDEF SYN_HEREDOC}
procedure TSynUNIXShellScriptSyn.HeredocProc;
procedure SkipToEOL;
begin
case FLine[Run] of
#0 : NullProc;
#10 : LFProc;
#13 : CRProc;
else
repeat
inc(Run);
until FLine[Run] in [#0, #10, #13];
end;
end;
var
i : Integer;
begin
if (FLine[Run] in [#0, #10, #13]) and (fTokenPos = Run) then
begin
fProcTable[ FLine[Run] ];
Exit;
end;
fTokenID := tkString;
if fRange = rsIndentedHeredoc then
while FLine[Run] in [#9, #32] do Inc(Run);
if ((Run = 0) and (fRange = rsHeredoc)) or (fRange = rsIndentedHeredoc) then
begin
i := 0;
while not (FLine[Run + i] in [#0, #10, #13]) do
begin
if i > fHeredocLength then
begin
SkipToEOL;
Exit;
end;
Inc(i);
end;
if i <> fHeredocLength then
begin
SkipToEOL;
Exit;
end;
if (CalcFCS(FLine[Run], i) = fHeredocChecksum) then
begin
fRange := rsUnknown;
Run := Run + i;
Exit;
end;
end;
SkipToEOL;
end;
{$ENDIF}
procedure TSynUNIXShellScriptSyn.Next;
begin
fTokenPos := Run;
{$IFDEF SYN_HEREDOC}
if fRange in [rsHeredoc, rsIndentedHeredoc] then
HeredocProc
else
{$ENDIF}
fProcTable[fLine[Run]];
end;
function TSynUNIXShellScriptSyn.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;
else
Result := nil;
end;
end;
function TSynUNIXShellScriptSyn.GetEol: Boolean;
begin
Result := False;
if fTokenId = tkNull then Result := True;
end;
function TSynUNIXShellScriptSyn.GetRange: Pointer;
{$IFDEF SYN_HEREDOC}
var
RangePointer : TRangePointer;
{$ENDIF}
begin
{$IFDEF SYN_HEREDOC}
RangePointer.Range := Ord(fRange);
RangePointer.Length := 0;
RangePointer.Checksum := 0;
if fRange in [rsHeredoc, rsIndentedHeredoc] then
begin
RangePointer.Length := fHeredocLength;
RangePointer.Checksum := fHeredocChecksum;
end;
Result := RangePointer.Ptr;
{$ELSE}
Result := Pointer(fRange);
{$ENDIF}
end;
function TSynUNIXShellScriptSyn.GetToken: string;
var
Len: LongInt;
begin
Len := Run - fTokenPos;
SetString(Result, (FLine + fTokenPos), Len);
end;
function TSynUNIXShellScriptSyn.GetTokenID: TtkTokenKind;
begin
Result := fTokenId;
end;
function TSynUNIXShellScriptSyn.GetTokenAttribute: TSynHighlighterAttributes;
begin
case fTokenID of
tkComment: Result := fCommentAttri;
tkIdentifier: Result := fIdentifierAttri;
tkKey: Result := fKeyAttri;
tkSecondKey: Result := fSecondKeyAttri;
tkNumber: Result := fNumberAttri;
tkSpace: Result := fSpaceAttri;
tkString: Result := fStringAttri;
tkSymbol: Result := fSymbolAttri;
tkVariable: Result := fVarAttri;
tkUnknown: Result := fSymbolAttri;
else
Result := nil;
end;
end;
function TSynUNIXShellScriptSyn.GetTokenKind: integer;
begin
Result := Ord(fTokenId);
end;
function TSynUNIXShellScriptSyn.GetTokenPos: Integer;
begin
Result := fTokenPos;
end;
procedure TSynUNIXShellScriptSyn.ResetRange;
begin
fRange := rsUnknown;
{$IFDEF SYN_HEREDOC}
fHeredocLength := 0;
fHeredocChecksum := 0;
{$ENDIF}
end;
procedure TSynUNIXShellScriptSyn.SetRange(Value: Pointer);
{$IFDEF SYN_HEREDOC}
var
RangePointer : TRangePointer;
{$ENDIF}
begin
{$IFDEF SYN_HEREDOC}
RangePointer := TRangePointer(Value);
fRange := TRangeState(RangePointer.Range);
fHeredocLength := 0;
fHeredocChecksum := 0;
if fRange in [rsHeredoc, rsIndentedHeredoc] then
begin
fHeredocLength := RangePointer.Length;
fHeredocChecksum := RangePointer.Checksum;
end;
{$ELSE}
fRange := TRangeState(Value);
{$ENDIF}
end;
procedure TSynUNIXShellScriptSyn.SetSecondKeys(const Value: TStrings);
var
i: Integer;
begin
if Value <> nil then
begin
Value.BeginUpdate;
for i := 0 to Value.Count - 1 do
Value[i] := UpperCase(Value[i]);
Value.EndUpdate;
end;
fSecondKeys.Assign(Value);
DefHighLightChange(nil);
end;
function TSynUNIXShellScriptSyn.IsFilterStored: Boolean;
begin
Result := fDefaultFilter <> SYNS_FilterUNIXShellScript;
end;
class function TSynUNIXShellScriptSyn.GetLanguageName: string;
begin
Result := SYNS_LangNameUNIXShellScript;
end;
function TSynUNIXShellScriptSyn.GetSampleSource: string;
begin
Result := '######################################'#13#10 +
'# Here is a comment about some stuff #'#13#10 +
'######################################'#13#10 +
''#13#10 +
'case $BUILD_MODE in'#13#10 +
' full )'#13#10 +
' MyFirstFunction'#13#10 +
' ;;'#13#10 +
' rekit)'#13#10 +
' MySecondFunction'#13#10 +
' ;;'#13#10 +
' installer)'#13#10 +
' MyThirdFunction'#13#10 +
' ;;'#13#10 +
'esac';
end;
initialization
MakeIdentTable;
{$IFNDEF SYN_CPPB_1}
RegisterPlaceableHighlighter(TSynUNIXShellScriptSyn);
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -