📄 synhighlighterxml.pas
字号:
fProcTable[fLine[Run]];
Exit;
end;
case fRange of
rsDocType:
begin
while not (fLine[Run] in [#0, #10, #13]) do
begin
case fLine[Run] of
'[': begin
while True do
begin
inc(Run);
case fLine[Run] of
']':
begin
Inc(Run);
Exit;
end;
#0, #10, #13:
begin
fRange:=rsDocTypeSquareBraces;
Exit;
end;
end;
end;
end;
'>': begin
fRange := rsAttribute;
Inc(Run);
Break;
end;
end;
inc(Run);
end;
end;
rsDocTypeSquareBraces:
begin
while not (fLine[Run] in [#0, #10, #13]) do
begin
if (fLine[Run]=']') then
begin
fRange := rsDocType;
Inc(Run);
Exit;
end;
inc(Run);
end;
end;
end;
end;
procedure TSynXMLSyn.CDATAProc;
begin
fTokenID := tkCDATA;
if (fLine[Run] In [#0, #10, #13]) then
begin
fProcTable[fLine[Run]];
Exit;
end;
while not (fLine[Run] in [#0, #10, #13]) do
begin
if (fLine[Run] = '>') and (fLine[Run - 1] = ']')
then begin
fRange := rsText;
Inc(Run);
break;
end;
Inc(Run);
end;
end;
procedure TSynXMLSyn.ElementProc;
begin
if fLine[Run] = '/' then Inc(Run);
{$IFDEF SYN_MBCSSUPPORT}
while (fLine[Run] in NameChars) or (StrByteType(fLine, Run) <> mbSingleByte) do
Inc(Run);
{$ELSE}
while (fLine[Run] in NameChars) do Inc(Run);
{$ENDIF}
fRange := rsAttribute;
fTokenID := tkElement;
end;
procedure TSynXMLSyn.AttributeProc;
begin
//Check if we are starting on a closing quote
if (fLine[Run] in [#34, #39]) then
begin
fTokenID := tkSymbol;
fRange := rsAttribute;
Inc(Run);
Exit;
end;
//Read the name
{$IFDEF SYN_MBCSSUPPORT}
while (fLine[Run] in NameChars) or (StrByteType(fLine, Run) <> mbSingleByte) do
Inc(Run);
{$ELSE}
while (fLine[Run] in NameChars) do Inc(Run);
{$ENDIF}
//Check if this is an xmlns: attribute
if (Pos('xmlns', GetToken) > 0) then begin
fTokenID := tknsAttribute;
fRange := rsnsEqual;
end else begin
fTokenID := tkAttribute;
fRange := rsEqual;
end;
end;
procedure TSynXMLSyn.EqualProc;
begin
if fRange = rsnsEqual then
fTokenID := tknsEqual
else
fTokenID := tkEqual;
while not (fLine[Run] in [#0, #10, #13]) do
begin
if (fLine[Run] = '/') then
begin
fTokenID := tkSymbol;
fRange := rsElement;
Inc(Run);
Exit;
end else if (fLine[Run] = #34) then
begin
if fRange = rsnsEqual then
fRange := rsnsQuoteAttrValue
else
fRange := rsQuoteAttrValue;
Inc(Run);
Exit;
end else if (fLine[Run] = #39) then
begin
if fRange = rsnsEqual then
fRange := rsnsAPosAttrValue
else
fRange := rsAPosAttrValue;
Inc(Run);
Exit;
end;
Inc(Run);
end;
end;
procedure TSynXMLSyn.QAttributeValueProc;
begin
if fRange = rsnsQuoteAttrValue then
fTokenID := tknsQuoteAttrValue
else
fTokenID := tkQuoteAttrValue;
while not (fLine[Run] in [#0, #10, #13, '&', #34]) do Inc(Run);
if fLine[Run] = '&' then
begin
if fRange = rsnsQuoteAttrValue then
fRange := rsnsQuoteEntityRef
else
fRange := rsQuoteEntityRef;
Exit;
end else if fLine[Run] <> #34 then
begin
Exit;
end;
fRange := rsAttribute;
end;
procedure TSynXMLSyn.AAttributeValueProc;
begin
if fRange = rsnsAPosAttrValue then
fTokenID := tknsAPosAttrValue
else
fTokenID := tkAPosAttrValue;
while not (fLine[Run] in [#0, #10, #13, '&', #39]) do Inc(Run);
if fLine[Run] = '&' then
begin
if fRange = rsnsAPosAttrValue then
fRange := rsnsAPosEntityRef
else
fRange := rsAPosEntityRef;
Exit;
end else if fLine[Run] <> #39 then
begin
Exit;
end;
fRange := rsAttribute;
end;
procedure TSynXMLSyn.TextProc;
const StopSet = [#0..#31, '<', '&'];
begin
if fLine[Run] in (StopSet - ['&']) then begin
fProcTable[fLine[Run]];
exit;
end;
fTokenID := tkText;
while not (fLine[Run] in StopSet) do Inc(Run);
if (fLine[Run] = '&') then begin
fRange := rsEntityRef;
Exit;
end;
end;
procedure TSynXMLSyn.EntityRefProc;
begin
fTokenID := tkEntityRef;
fRange := rsEntityRef;
while not (fLine[Run] in [#0..#32, ';']) do Inc(Run);
if (fLine[Run] = ';') then Inc(Run);
fRange := rsText;
end;
procedure TSynXMLSyn.QEntityRefProc;
begin
if fRange = rsnsQuoteEntityRef then
fTokenID := tknsQuoteEntityRef
else
fTokenID := tkQuoteEntityRef;
while not (fLine[Run] in [#0..#32, ';']) do Inc(Run);
if (fLine[Run] = ';') then Inc(Run);
if fRange = rsnsQuoteEntityRef then
fRange := rsnsQuoteAttrValue
else
fRange := rsQuoteAttrValue;
end;
procedure TSynXMLSyn.AEntityRefProc;
begin
if fRange = rsnsAPosEntityRef then
fTokenID := tknsAPosEntityRef
else
fTokenID := tkAPosEntityRef;
while not (fLine[Run] in [#0..#32, ';']) do Inc(Run);
if (fLine[Run] = ';') then Inc(Run);
if fRange = rsnsAPosEntityRef then
fRange := rsnsAPosAttrValue
else
fRange := rsAPosAttrValue;
end;
procedure TSynXMLSyn.IdentProc;
begin
case fRange of
rsElement:
begin
ElementProc;
end;
rsAttribute:
begin
AttributeProc;
end;
rsEqual, rsnsEqual:
begin
EqualProc;
end;
rsQuoteAttrValue, rsnsQuoteAttrValue:
begin
QAttributeValueProc;
end;
rsAposAttrValue, rsnsAPosAttrValue:
begin
AAttributeValueProc;
end;
rsQuoteEntityRef, rsnsQuoteEntityRef:
begin
QEntityRefProc;
end;
rsAposEntityRef, rsnsAPosEntityRef:
begin
AEntityRefProc;
end;
rsEntityRef:
begin
EntityRefProc;
end;
else ;
end;
end;
procedure TSynXMLSyn.Next;
begin
fTokenPos := Run;
case fRange of
rsText:
begin
TextProc;
end;
rsComment:
begin
CommentProc;
end;
rsProcessingInstruction:
begin
ProcessingInstructionProc;
end;
rsDocType, rsDocTypeSquareBraces:
begin
DocTypeProc;
end;
rsCDATA:
begin
CDATAProc;
end;
else
fProcTable[fLine[Run]];
end;
end;
function TSynXMLSyn.NextTokenIs(T : String) : Boolean;
var I, Len : Integer;
begin
Result:= True;
Len:= Length(T);
for I:= 1 to Len do
if (fLine[Run + I] <> T[I]) then
begin
Result:= False;
Break;
end;
end;
function TSynXMLSyn.GetDefaultAttribute(
Index: integer): TSynHighlighterAttributes;
begin
case Index of
SYN_ATTR_COMMENT: Result := fCommentAttri;
SYN_ATTR_IDENTIFIER: Result := fAttributeAttri;
SYN_ATTR_KEYWORD: Result := fElementAttri;
SYN_ATTR_WHITESPACE: Result := fSpaceAttri;
SYN_ATTR_SYMBOL: Result := fSymbolAttri;
else
Result := nil;
end;
end;
function TSynXMLSyn.GetEol: Boolean;
begin
Result := fTokenId = tkNull;
end;
function TSynXMLSyn.GetToken: string;
var
len: Longint;
begin
Len := (Run - fTokenPos);
SetString(Result, (FLine + fTokenPos), len);
end;
function TSynXMLSyn.GetTokenID: TtkTokenKind;
begin
Result := fTokenId;
end;
function TSynXMLSyn.GetTokenAttribute: TSynHighlighterAttributes;
begin
case fTokenID of
tkElement: Result:= fElementAttri;
tkAttribute: Result:= fAttributeAttri;
tknsAttribute: Result:= fnsAttributeAttri;
tkEqual: Result:= fSymbolAttri;
tknsEqual: Result:= fSymbolAttri;
tkQuoteAttrValue: Result:= fAttributeValueAttri;
tkAPosAttrValue: Result:= fAttributeValueAttri;
tknsQuoteAttrValue: Result:= fnsAttributeValueAttri;
tknsAPosAttrValue: Result:= fnsAttributeValueAttri;
tkText: Result:= fTextAttri;
tkCDATA: Result:= fCDATAAttri;
tkEntityRef: Result:= fEntityRefAttri;
tkQuoteEntityRef: Result:= fEntityRefAttri;
tkAposEntityRef: Result:= fEntityRefAttri;
tknsQuoteEntityRef: Result:= fEntityRefAttri;
tknsAposEntityRef: Result:= fEntityRefAttri;
tkProcessingInstruction: Result:= fProcessingInstructionAttri;
tkComment: Result:= fCommentAttri;
tkDocType: Result:= fDocTypeAttri;
tkSymbol: Result:= fSymbolAttri;
tkSpace: Result:= fSpaceAttri;
else
Result := nil;
end;
end;
function TSynXMLSyn.GetTokenKind: integer;
begin
Result := Ord(fTokenId);
end;
function TSynXMLSyn.GetTokenPos: Integer;
begin
Result := fTokenPos;
end;
function TSynXMLSyn.GetRange: Pointer;
begin
Result := Pointer(fRange);
end;
procedure TSynXMLSyn.SetRange(Value: Pointer);
begin
fRange := TRangeState(Value);
end;
procedure TSynXMLSyn.ResetRange;
begin
fRange:= rsText;
end;
function TSynXMLSyn.GetIdentChars: TSynIdentChars;
begin
Result := ['0'..'9', 'a'..'z', 'A'..'Z', '_', '.', '-'] + TSynSpecialChars;
end;
function TSynXMLSyn.IsFilterStored: Boolean;
begin
Result := fDefaultFilter <> SYNS_FilterXML;
end;
class function TSynXMLSyn.GetLanguageName: string;
begin
Result := SYNS_LangXML;
end;
function TSynXMLSyn.GetSampleSource: String;
begin
Result:= '<?xml version="1.0"?>'#13#10+
'<!DOCTYPE root ['#13#10+
' ]>'#13#10+
'<!-- Comment -->'#13#10+
'<root version="&test;">'#13#10+
' <![CDATA[ **CDATA section** ]]>'#13#10+
'</root>';
end;
{$IFNDEF SYN_CPPB_1}
initialization
RegisterPlaceableHighlighter(TSynXMLSyn);
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -