📄 synhighlighterdot.pas
字号:
if KeyComp('parallelogram') then Result := tkShape else Result := tkIdentifier;
end;
function TSynDOTSyn.Func133: TtkTokenKind;
begin
if KeyComp('constraint') then Result := tkAttribute else
if KeyComp('remincross') then Result := tkAttribute else Result := tkIdentifier;
end;
function TSynDOTSyn.Func134: TtkTokenKind;
begin
if KeyComp('arrowsize') then Result := tkAttribute else
if KeyComp('doubleoctagon') then Result := tkShape else Result := tkIdentifier;
end;
function TSynDOTSyn.Func140: TtkTokenKind;
begin
if KeyComp('orientation') then Result := tkAttribute else Result := tkIdentifier;
end;
function TSynDOTSyn.Func142: TtkTokenKind;
begin
if KeyComp('clusterrank') then Result := tkAttribute else Result := tkIdentifier;
end;
function TSynDOTSyn.Func143: TtkTokenKind;
begin
if KeyComp('distortion') then Result := tkAttribute else Result := tkIdentifier;
end;
function TSynDOTSyn.Func146: TtkTokenKind;
begin
if KeyComp('labelfontsize') then Result := tkAttribute else Result := tkIdentifier;
end;
function TSynDOTSyn.Func150: TtkTokenKind;
begin
if KeyComp('labelfontcolor') then Result := tkAttribute else Result := tkIdentifier;
end;
function TSynDOTSyn.Func155: TtkTokenKind;
begin
if KeyComp('tripleoctagon') then Result := tkShape else Result := tkIdentifier;
end;
function TSynDOTSyn.Func159: TtkTokenKind;
begin
if KeyComp('samplepoints') then Result := tkAttribute else Result := tkIdentifier;
end;
function TSynDOTSyn.Func174: TtkTokenKind;
begin
if KeyComp('invtrapezium') then Result := tkShape else Result := tkIdentifier;
end;
function TSynDOTSyn.AltFunc: TtkTokenKind;
begin
Result := tkIdentifier;
end;
function TSynDOTSyn.IdentKind(MayBe: PChar): TtkTokenKind;
var
HashKey: Integer;
begin
fToIdent := MayBe;
HashKey := KeyHash(MayBe);
if HashKey <= MaxKey then
Result := fIdentFuncTable[HashKey]
else
Result := tkIdentifier;
end;
procedure TSynDOTSyn.MakeMethodTables;
var
I: Char;
begin
for I := #0 to #255 do
case I of
#0: fProcTable[I] := NullProc;
#10: fProcTable[I] := LFProc;
#13: fProcTable[I] := CRProc;
'/': fProcTable[I] := CStyleCommentOpenProc;
'-': fProcTable[I] := DirectionsProc;
'''': fProcTable[I] := StringOpenProc;
#1..#9,
#11,
#12,
#14..#32 : fProcTable[I] := SpaceProc;
'A'..'Z', 'a'..'z', '_': fProcTable[I] := IdentProc;
'~', '{', '}', ',', '(', ')', '[', ']', '<', '>', ':', '?', ';', '!', '=': fProcTable[I] := SymbolProc;
else
fProcTable[I] := UnknownProc;
end;
end;
procedure TSynDOTSyn.SpaceProc;
begin
fTokenID := tkSpace;
repeat
inc(Run);
until not (fLine[Run] in [#1..#32]);
end;
procedure TSynDOTSyn.NullProc;
begin
fTokenID := tkNull;
end;
procedure TSynDOTSyn.CRProc;
begin
fTokenID := tkSpace;
inc(Run);
if fLine[Run] = #10 then
inc(Run);
end;
procedure TSynDOTSyn.LFProc;
begin
fTokenID := tkSpace;
inc(Run);
end;
procedure TSynDOTSyn.DirectionsProc;
begin
Inc(Run);
if (fLine[Run] = '>') or (fLine[Run] = '-') then
begin
fTokenID := tkDirections;
inc(Run);
end
else
fTokenID := tkSymbol;
end;
procedure TSynDOTSyn.CStyleCommentOpenProc;
begin
Inc(Run);
if (fLine[Run] = '/') then
begin
fTokenID := tkComment;
inc(Run, 2);
while not (fLine[Run] in [#0, #10, #13]) do Inc(Run);
Exit;
end;
if (fLine[Run] = '*') then
begin
fRange := rsCStyleComment;
CStyleCommentProc;
fTokenID := tkComment;
end
else
fTokenID := tkIdentifier;
end;
procedure TSynDOTSyn.CStyleCommentProc;
begin
case fLine[Run] of
#0: NullProc;
#10: LFProc;
#13: CRProc;
else
begin
fTokenID := tkComment;
repeat
if (fLine[Run] = '*') and
(fLine[Run + 1] = '/') then
begin
Inc(Run, 2);
fRange := rsUnKnown;
Break;
end;
if not (fLine[Run] in [#0, #10, #13]) then
Inc(Run);
until fLine[Run] in [#0, #10, #13];
end;
end;
end;
procedure TSynDOTSyn.StringOpenProc;
begin
Inc(Run);
fRange := rsString;
StringProc;
fTokenID := tkString;
end;
procedure TSynDOTSyn.StringProc;
begin
fTokenID := tkString;
repeat
if (fLine[Run] = '''') then
begin
Inc(Run, 1);
fRange := rsUnKnown;
Break;
end;
if not (fLine[Run] in [#0, #10, #13]) then
Inc(Run);
until fLine[Run] in [#0, #10, #13];
end;
constructor TSynDOTSyn.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fArrowHeadAttri := TSynHighLighterAttributes.Create(SYNS_AttrArrowHead);
//fArrowHeadAttri.Style := [fsItalic];
fArrowHeadAttri.Foreground := clRed;
AddAttribute(fArrowHeadAttri);
fAttributeAttri := TSynHighLighterAttributes.Create(SYNS_AttrAttribute);
AddAttribute(fAttributeAttri);
fCommentAttri := TSynHighLighterAttributes.Create(SYNS_AttrComment);
fCommentAttri.Style := [fsItalic];
fCommentAttri.Foreground := clNavy;
AddAttribute(fCommentAttri);
fDirectionsAttri := TSynHighLighterAttributes.Create(SYNS_AttrDirections);
fDirectionsAttri.Style := [fsBold];
fDirectionsAttri.Foreground := clYellow;
AddAttribute(fDirectionsAttri);
fIdentifierAttri := TSynHighLighterAttributes.Create(SYNS_AttrIdentifier);
AddAttribute(fIdentifierAttri);
fKeyAttri := TSynHighLighterAttributes.Create(SYNS_AttrReservedWord);
fKeyAttri.Style := [fsBold];
AddAttribute(fKeyAttri);
fShapeAttri := TSynHighLighterAttributes.Create(SYNS_AttrShape);
fShapeAttri.Style := [fsBold];
fShapeAttri.Foreground := clRed;
AddAttribute(fShapeAttri);
fSpaceAttri := TSynHighLighterAttributes.Create(SYNS_AttrSpace);
AddAttribute(fSpaceAttri);
fStringAttri := TSynHighLighterAttributes.Create(SYNS_AttrString);
AddAttribute(fStringAttri);
fValueAttri := TSynHighLighterAttributes.Create(SYNS_AttrValue);
fValueAttri.Style := [fsItalic];
fValueAttri.Foreground := clRed;
AddAttribute(fValueAttri);
fSymbolAttri := TSynHighlighterAttributes.Create(SYNS_AttrSymbol);
fSymbolAttri.Style := [fsBold];
fSymbolAttri.Foreground := clGreen;
AddAttribute(fSymbolAttri);
SetAttributesOnChange(DefHighlightChange);
InitIdent;
MakeMethodTables;
fDefaultFilter := SYNS_FilterDOTGraphDrawingDescriptionlanguage;
fRange := rsUnknown;
end;
procedure TSynDOTSyn.SetLine(NewValue: String; LineNumber: Integer);
begin
fLine := PChar(NewValue);
Run := 0;
fLineNumber := LineNumber;
Next;
end;
procedure TSynDOTSyn.IdentProc;
begin
fTokenID := IdentKind((fLine + Run));
inc(Run, fStringLen);
while Identifiers[fLine[Run]] do
Inc(Run);
end;
procedure TSynDOTSyn.UnknownProc;
begin
{$IFDEF SYN_MBCSSUPPORT}
if FLine[Run] in LeadBytes then
Inc(Run,2)
else
{$ENDIF}
inc(Run);
fTokenID := tkUnknown;
end;
procedure TSynDOTSyn.SymbolProc;
begin
inc(Run);
fTokenId := tkSymbol;
end;
procedure TSynDOTSyn.Next;
begin
fTokenPos := Run;
case fRange of
rsCStyleComment: CStyleCommentProc;
else
begin
fRange := rsUnknown;
fProcTable[fLine[Run]];
end;
end;
end;
function TSynDOTSyn.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 TSynDOTSyn.GetEol: Boolean;
begin
Result := fTokenID = tkNull;
end;
function TSynDOTSyn.GetKeyWords: string;
begin
Result :=
'--,->,all,appendix,arrowhead,arrowsize,arrowtail,auto,back,bgcolor,bo' +
'ld,both,bottomlabel,box,center,circle,clusterrank,color,comment,compou' +
'nd,concentrate,constraint,decorate,diamond,digraph,dir,distortion,dot,' +
'dotted,doublecircle,doubleoctagon,e,edge,egg,ellipse,false,fill,fillco' +
'lor,filled,fixedsize,fontcolor,fontname,fontpath,fontsize,forward,glob' +
'al,graph,group,headlabel,headport,headURL,height,hexagon,house,id,inv,' +
'invdot,invhouse,invodot,invtrapezium,invtriangle,label,labelangle,labe' +
'ldistance,labelfloat,labelfontcolor,labelfontname,labelfontsize,labelj' +
'ust,labelloc,layer,layers,lhead,ltail,margin,max,mcircle,mclimit,mdiam' +
'ond,merged,min,minimum,minlen,mrecord,msquare,multiples,n,ne,node,node' +
'sep,none,normal,nslimit,nw,octagon,odot,onto,ordering,orientation,page' +
',pagedir,parallelogram,peripheries,plaintext,point,polygon,quantum,ran' +
'k,rankdir,ranksep,ratio,record,regular,remincross,rotate,s,same,samehe' +
'ad,sametail,samplepoints,se,searchsize,section,shape,shapefile,sides,s' +
'ink,size,skew,source,strict,style,subgraph,sw,taillabel,tailport,tailU' +
'RL,toplabel,trapezium,triangle,tripleoctagon,true,url,w,weight,when,wi' +
'dth,z';
end;
function TSynDOTSyn.GetToken: String;
var
Len: LongInt;
begin
Len := Run - fTokenPos;
SetString(Result, (FLine + fTokenPos), Len);
end;
function TSynDOTSyn.GetTokenID: TtkTokenKind;
begin
Result := fTokenId;
end;
function TSynDOTSyn.GetTokenAttribute: TSynHighLighterAttributes;
begin
case GetTokenID of
tkArrowHead: Result := fArrowHeadAttri;
tkAttribute: Result := fAttributeAttri;
tkComment: Result := fCommentAttri;
tkDirections: Result := fDirectionsAttri;
tkIdentifier: Result := fIdentifierAttri;
tkKey: Result := fKeyAttri;
tkShape: Result := fShapeAttri;
tkSpace: Result := fSpaceAttri;
tkString: Result := fStringAttri;
tkValue: Result := fValueAttri;
tkUnknown: Result := fIdentifierAttri;
tkSymbol: Result := fSymbolAttri;
else
Result := nil;
end;
end;
function TSynDOTSyn.GetTokenKind: integer;
begin
Result := Ord(fTokenId);
end;
function TSynDOTSyn.GetTokenPos: Integer;
begin
Result := fTokenPos;
end;
function TSynDOTSyn.GetIdentChars: TSynIdentChars;
begin
Result := ['_', 'a'..'z', 'A'..'Z'];
end;
function TSynDOTSyn.GetSampleSource: string;
begin
Result :=
'// ATT DOT Graphic description language'#13#10 +
'digraph asde91 {'#13#10 +
' ranksep=.75; size = "7.5,7.5";'#13#10 +
' {'#13#10 +
' node [shape=plaintext, fontsize=16];'#13#10 +
' /* the time-line graph */'#13#10 +
' past -> 1978 -> 1980 -> 1982 -> 1983 -> 1985 -> 1986 ->'#13#10 +
' 1987 -> 1988 -> 1989 -> 1990 -> "future";'#13#10 +
' /* ancestor programs */'#13#10 +
' "Bourne sh"; "make"; "SCCS"; "yacc"; "cron"; "Reiser cpp";'#13#10 +
' "Cshell"; "emacs"; "build"; "vi"; "<curses>"; "RCS"; "C*";'#13#10 +
' }'#13#10 +
' { rank = same;'#13#10 +
' "Software IS"; "Configuration Mgt"; "Architecture & Libraries";'#13#10 +
' "Process";'#13#10 +
' };'#13#10 +
' node [shape=box];'#13#10 +
' { rank = same; "past"; "SCCS"; "make"; "Bourne sh"; "yacc"; "cron"; }'#13#10 +
' { rank = same; 1978; "Reiser cpp"; "Cshell"; }'#13#10 +
' { rank = same; 1980; "build"; "emacs"; "vi"; }'#13#10 +
' { rank = same; 1982; "RCS"; "<curses>"; "IMX"; "SYNED"; }'#13#10 +
' { rank = same; 1983; "ksh"; "IFS"; "TTU"; }'#13#10 +
' { rank = same; 1985; "nmake"; "Peggy"; }'#13#10 +
' { rank = same; 1986; "C*"; "ncpp"; "ksh-i"; "<curses-i>"; "PG2"; }'#13#10 +
' { rank = same; 1987; "Ansi cpp"; "nmake 2.0"; "3D File System"; "fdelta";'#13#10 +
' "DAG"; "CSAS";}'#13#10 +
' { rank = same; 1988; "CIA"; "SBCS"; "ksh-88"; "PEGASUS/PML"; "PAX";'#13#10 +
' "backtalk"; }'#13#10 +
' { rank = same; 1989; "CIA++"; "APP"; "SHIP"; "DataShare"; "ryacc";'#13#10 +
' "Mosaic"; }'#13#10 +
' { rank = same; 1990; "libft"; "CoShell"; "DIA"; "IFS-i"; "kyacc"; "sfio";'#13#10 +
' "yeast"; "ML-X"; "DOT"; }'#13#10 +
' { rank = same; "future"; "Adv. Software Technology"; }'#13#10 +
' "PEGASUS/PML" -> "ML-X";'#13#10 +
' "SCCS" -> "nmake";'#13#10 +
' "SCCS" -> "3D File System";'#13#10 +
' "SCCS" -> "RCS";'#13#10 +
' "make" -> "nmake";'#13#10 +
' "make" -> "build";'#13#10 +
'}';
end;
function TSynDOTSyn.IsFilterStored: Boolean;
begin
Result := fDefaultFilter <> SYNS_FilterDOTGraphDrawingDescriptionlanguage;
end;
class function TSynDOTSyn.GetLanguageName: string;
begin
Result := SYNS_LangDOTGraphDrawingDescriptionlanguage;
end;
procedure TSynDOTSyn.ResetRange;
begin
fRange := rsUnknown;
end;
procedure TSynDOTSyn.SetRange(Value: Pointer);
begin
fRange := TRangeState(Value);
end;
function TSynDOTSyn.GetRange: Pointer;
begin
Result := Pointer(fRange);
end;
initialization
MakeIdentTable;
{$IFNDEF SYN_CPPB_1}
RegisterPlaceableHighlighter(TSynDOTSyn);
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -