forked from liujianjun/tslediter
parent
a89d92ad42
commit
1abe441ca6
|
|
@ -1231,606 +1231,40 @@ type TINISynHigLighter = class(TSynHighLighter)
|
||||||
return r;
|
return r;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
type TJsonSynHighLighter = class(TSynHighLighter)
|
type TJsonSynHighLighter = class(tcustomsynhighlighter)
|
||||||
function Create(AOwner);
|
function create(AOwner);
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
Clean();
|
ExecuteCommand("string",array(('"',"\\")));
|
||||||
FChangeDeal := true;
|
ExecuteCommand("keywords",array("null","true","false"));
|
||||||
end
|
ExecuteCommand("rowannotes",array());
|
||||||
function Clean();override;
|
ExecuteCommand("blockannotes",array());
|
||||||
begin
|
ExecuteCommand("syms",array("{","}","[","]","<",">",":",",","="));
|
||||||
// { "
|
ExecuteCommand("pairs",array(("{","}"),("[","]")));
|
||||||
FTokens := array();
|
|
||||||
FSates := array(0); //状态
|
|
||||||
FBBStates := array(new TBBState(")"));
|
|
||||||
FBEStates := array(new TBBState("}"));
|
|
||||||
FMBStates := array(new TBBState("]"));
|
|
||||||
FSatesCount := 1; //改变的行
|
|
||||||
|
|
||||||
end
|
|
||||||
function Recycling();override;
|
|
||||||
begin
|
|
||||||
|
|
||||||
inherited;
|
|
||||||
Clean();
|
|
||||||
end
|
|
||||||
function SetInValidateIndex(idx); override; //当前改变的行
|
|
||||||
begin
|
|
||||||
idx := max(1,idx);
|
|
||||||
if not(FChangeDeal) and idx>FSatesCount then return ;
|
|
||||||
fdolastline := idx-2;
|
|
||||||
if length(FSates)>=idx then
|
|
||||||
FSatesCount := idx;
|
|
||||||
else FSatesCount := length(FSates)-1;
|
|
||||||
if FSatesCount = 1 then Clean();
|
|
||||||
FChangeDeal := false;
|
|
||||||
end
|
|
||||||
function ParserTokenLines(s,b,e,cst,tokens);
|
|
||||||
begin
|
|
||||||
label L_XCDG;
|
|
||||||
if cst=0 then
|
|
||||||
begin
|
|
||||||
idx := b;
|
|
||||||
ttk := "";
|
|
||||||
while idx<=e do
|
|
||||||
begin
|
|
||||||
vi := s[idx];
|
|
||||||
case vi of
|
|
||||||
" ","\t":
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
end
|
|
||||||
"(",")":
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
SetTToken(tokens,vi,idx,")");
|
|
||||||
end
|
|
||||||
"{","}":
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
SetTToken(tokens,vi,idx,"}");
|
|
||||||
end
|
|
||||||
"[","]":
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
SetTToken(tokens,vi,idx,"]");
|
|
||||||
end
|
|
||||||
":",",":
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
SetTToken(tokens,vi,idx,vi);
|
|
||||||
end
|
|
||||||
'"':
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
SetTToken(tokens,vi,idx,'"');
|
|
||||||
return ParserTokenLines(s,idx+1,e,'"',tokens);
|
|
||||||
end else
|
|
||||||
begin
|
|
||||||
ttk+=vi;
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end ;
|
|
||||||
idx++;
|
|
||||||
end
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
end else //查找
|
|
||||||
begin
|
|
||||||
if b>e then return cst;
|
|
||||||
r := FindRightChar(cst,s,b,e,"\\");
|
|
||||||
if r=0 then //没找到
|
|
||||||
begin
|
|
||||||
Setttoken(tokens,s[b:],e,cst);
|
|
||||||
return cst;
|
|
||||||
end else //找到
|
|
||||||
if r<=e then
|
|
||||||
begin
|
|
||||||
if b<r then
|
|
||||||
begin
|
|
||||||
Setttoken(tokens,s[b:r-1],r-1,cst);
|
|
||||||
end
|
|
||||||
Setttoken(tokens,s[r:r],r,cst);
|
|
||||||
if r<e then
|
|
||||||
begin
|
|
||||||
//消除递归
|
|
||||||
b := r+1;
|
|
||||||
cst := 0;
|
|
||||||
goto L_XCDG;
|
|
||||||
//return ParserTokenLines(s,r+1,e,0,tokens); //递归方式
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function InsureTokenParserd(LastLine);override; //解析
|
|
||||||
begin
|
|
||||||
ls := Lines;
|
|
||||||
FChangeDeal := true;
|
|
||||||
if fdolastline>=LastLine then return ;
|
|
||||||
fdolastline := LastLine;
|
|
||||||
for i:= FSatesCount-1 to LastLine do
|
|
||||||
begin
|
|
||||||
if i<0 then continue;
|
|
||||||
s := ls.GetStringByIndex(i);
|
|
||||||
cst := FSates[i];
|
|
||||||
tks := array();
|
|
||||||
FCBBState := FBBStates[i].Clone;
|
|
||||||
FCBEState := FBEStates[i].Clone;
|
|
||||||
FCMBState := FMBStates[i].Clone;
|
|
||||||
FSates[i+1] := ParserTokenLines(s,1,length(s),cst,tks);
|
|
||||||
FBBStates[i+1] :=FCBBState;//.Clone;
|
|
||||||
FBEStates[i+1] := FCBEState;//.Clone;
|
|
||||||
FMBStates[i+1] := FCMBState;
|
|
||||||
FSatesCount := i+1;
|
|
||||||
FTokens[i] := tks;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function GetLineTokens(idx);override;
|
|
||||||
begin
|
|
||||||
if idx<FSatesCount then
|
|
||||||
return FTokens[idx];
|
|
||||||
end
|
|
||||||
protected
|
|
||||||
function SetTToken(tokens,ttk,idx,ext);virtual; //设置token
|
|
||||||
begin
|
|
||||||
d := inherited;
|
|
||||||
if not d then return ;
|
|
||||||
tk := d.FValue;
|
|
||||||
if ext in array(")","]","}") then d.FFColor := 0xFF0000;
|
|
||||||
if ext="}" and tk="{" then
|
|
||||||
begin
|
|
||||||
FCBEState.GetLeft();
|
|
||||||
d.FMATe := FCBEState.GetSate();
|
|
||||||
end else
|
|
||||||
if ext="}" and tk="}" then
|
|
||||||
begin
|
|
||||||
FCBEState.GetRight();
|
|
||||||
d.FMATe := FCBEState.GetSate();
|
|
||||||
end else
|
|
||||||
if ext="]" and tk="[" then
|
|
||||||
begin
|
|
||||||
FCMBState.GetLeft();
|
|
||||||
d.FMATe := FCMBState.GetSate();
|
|
||||||
|
|
||||||
end else
|
|
||||||
if ext="]" and tk="]" then
|
|
||||||
begin
|
|
||||||
FCMBState.GetRight();
|
|
||||||
d.FMATe := FCMBState.GetSate();
|
|
||||||
end else
|
|
||||||
if ext=")" and tk="(" then
|
|
||||||
begin
|
|
||||||
FCBBState.GetLeft();
|
|
||||||
d.FMATe := FCBBState.GetSate();
|
|
||||||
|
|
||||||
end else
|
|
||||||
if ext=")" and tk=")" then
|
|
||||||
begin
|
|
||||||
FCBBState.GetRight();
|
|
||||||
d.FMATe := FCBBState.GetSate();
|
|
||||||
end else
|
|
||||||
if ext='"' then
|
|
||||||
begin
|
|
||||||
D.FFColor := 0x8B008B;
|
|
||||||
end else
|
|
||||||
if tk in array("true","false","null") then
|
|
||||||
begin
|
|
||||||
d.FFColor := 0x0000FF;
|
|
||||||
end else
|
|
||||||
if tk in array(":",",") then
|
|
||||||
begin
|
|
||||||
d.FFColor := 0x0000FF;
|
|
||||||
end else
|
|
||||||
if StrIsANumber(tk) then d.FFColor := 0x666666;
|
|
||||||
return d;
|
|
||||||
|
|
||||||
end
|
|
||||||
private
|
|
||||||
function StrIsANumber(s);
|
|
||||||
begin
|
|
||||||
if not s then return 0;
|
|
||||||
r := (1=ParseRegExpr("^[+-]?[\\d]+",s,"",result,MPos,Mlen)) ;
|
|
||||||
return r;
|
|
||||||
end
|
|
||||||
function FindRightChar(c,s,b,e,zy); //查找封闭的字符
|
|
||||||
begin
|
|
||||||
i := b;
|
|
||||||
while i<=e do
|
|
||||||
begin
|
|
||||||
si := s[i];
|
|
||||||
if si=zy then
|
|
||||||
begin
|
|
||||||
i+=2;
|
|
||||||
if i>e then return 0;
|
|
||||||
continue;
|
|
||||||
end
|
|
||||||
if s[i]=c then //找到了
|
|
||||||
begin
|
|
||||||
return i;
|
|
||||||
end
|
|
||||||
i++;
|
|
||||||
end
|
|
||||||
return 0; //没找到
|
|
||||||
for i := b to e do
|
|
||||||
begin
|
|
||||||
if s[i]=c then //找到了
|
|
||||||
begin
|
|
||||||
return i;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
fdolastline;
|
|
||||||
FTokens;
|
|
||||||
FSates;
|
|
||||||
FSatesCount;
|
|
||||||
|
|
||||||
FCBBState;
|
|
||||||
FCBEState;
|
|
||||||
FCMBState;
|
|
||||||
FBBStates;
|
|
||||||
FBEStates;
|
|
||||||
FMBStates ;
|
|
||||||
end
|
end
|
||||||
type ttfmhighlighter = class(TSynHighLighter)
|
|
||||||
function Create(AOwner);
|
type ttfmhighlighter = class(tcustomsynhighlighter)
|
||||||
|
function create(AOwner);
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
Clean();
|
ExecuteCommand("string",array(('"',"\\")));
|
||||||
FChangeDeal := true;
|
ExecuteCommand("keywords",array("object","end"));
|
||||||
end
|
ExecuteCommand("rowannotes",array());
|
||||||
function Clean();override;
|
ExecuteCommand("blockannotes",array());
|
||||||
begin
|
ExecuteCommand("syms",array("{","}","[","]","<",">",":",",","="));
|
||||||
// { "
|
ExecuteCommand("pairs",array(("{","}"),("[","]"),("<",">"),("object","end")));
|
||||||
FTokens := array();
|
|
||||||
FSates := array(0); //状态
|
|
||||||
FBBStates := array(new TBBState(")"));
|
|
||||||
FBEStates := array(new TBBState("}"));
|
|
||||||
FMBStates := array(new TBBState("]"));
|
|
||||||
FbgedStates := array(new TBBState("end"));
|
|
||||||
FjkhStates := array(new TBBState(">"));
|
|
||||||
FSatesCount := 1; //改变的行
|
|
||||||
end
|
|
||||||
function Recycling();override;
|
|
||||||
begin
|
|
||||||
|
|
||||||
inherited;
|
|
||||||
Clean();
|
|
||||||
end
|
|
||||||
function SetInValidateIndex(idx); override; //当前改变的行
|
|
||||||
begin
|
|
||||||
idx := max(1,idx);
|
|
||||||
if not(FChangeDeal) and idx>FSatesCount then return ;
|
|
||||||
fdolastline := idx-2;
|
|
||||||
if length(FSates)>=idx then
|
|
||||||
FSatesCount := idx;
|
|
||||||
else FSatesCount := length(FSates)-1;
|
|
||||||
if FSatesCount = 1 then Clean();
|
|
||||||
FChangeDeal := false;
|
|
||||||
end
|
|
||||||
function ParserTokenLines(s,b,e,cst,tokens);
|
|
||||||
begin
|
|
||||||
label L_XCDG;
|
|
||||||
if cst=0 then
|
|
||||||
begin
|
|
||||||
idx := b;
|
|
||||||
ttk := "";
|
|
||||||
while idx<=e do
|
|
||||||
begin
|
|
||||||
vi := s[idx];
|
|
||||||
case vi of
|
|
||||||
" ","\t":
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
end
|
|
||||||
"(",")":
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
SetTToken(tokens,vi,idx,")");
|
|
||||||
end
|
|
||||||
"{","}":
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
SetTToken(tokens,vi,idx,"}");
|
|
||||||
end
|
|
||||||
"[","]":
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
SetTToken(tokens,vi,idx,"]");
|
|
||||||
end
|
|
||||||
"<",">":
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
SetTToken(tokens,vi,idx,">");
|
|
||||||
end
|
|
||||||
":",",":
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
SetTToken(tokens,vi,idx,vi);
|
|
||||||
end
|
|
||||||
'"':
|
|
||||||
begin
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
SetTToken(tokens,vi,idx,'"');
|
|
||||||
return ParserTokenLines(s,idx+1,e,'"',tokens);
|
|
||||||
end else
|
|
||||||
begin
|
|
||||||
ttk+=vi;
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end ;
|
|
||||||
idx++;
|
|
||||||
end
|
|
||||||
SetTToken(tokens,ttk,idx-1);
|
|
||||||
end else //查找
|
|
||||||
begin
|
|
||||||
if b>e then return cst;
|
|
||||||
r := FindRightChar(cst,s,b,e,"\\");
|
|
||||||
if r=0 then //没找到
|
|
||||||
begin
|
|
||||||
Setttoken(tokens,s[b:],e,cst);
|
|
||||||
return cst;
|
|
||||||
end else //找到
|
|
||||||
if r<=e then
|
|
||||||
begin
|
|
||||||
if b<r then
|
|
||||||
begin
|
|
||||||
Setttoken(tokens,s[b:r-1],r-1,cst);
|
|
||||||
end
|
|
||||||
Setttoken(tokens,s[r:r],r,cst);
|
|
||||||
if r<e then
|
|
||||||
begin
|
|
||||||
//消除递归
|
|
||||||
b := r+1;
|
|
||||||
cst := 0;
|
|
||||||
goto L_XCDG;
|
|
||||||
//return ParserTokenLines(s,r+1,e,0,tokens); //递归方式
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function InsureTokenParserd(LastLine);override; //解析
|
|
||||||
begin
|
|
||||||
ls := Lines;
|
|
||||||
FChangeDeal := true;
|
|
||||||
if fdolastline>=LastLine then return ;
|
|
||||||
fdolastline := LastLine;
|
|
||||||
for i:= FSatesCount-1 to LastLine do
|
|
||||||
begin
|
|
||||||
if i<0 then continue;
|
|
||||||
s := ls.GetStringByIndex(i);
|
|
||||||
cst := FSates[i];
|
|
||||||
tks := array();
|
|
||||||
FCBBState := FBBStates[i].Clone;
|
|
||||||
FCBEState := FBEStates[i].Clone;
|
|
||||||
FCMBState := FMBStates[i].Clone;
|
|
||||||
fcbgesate := FbgedStates[i].Clone;
|
|
||||||
fcjkhState := FjkhStates[i].Clone;
|
|
||||||
FSates[i+1] := ParserTokenLines(s,1,length(s),cst,tks);
|
|
||||||
FBBStates[i+1] :=FCBBState;//.Clone;
|
|
||||||
FBEStates[i+1] := FCBEState;//.Clone;
|
|
||||||
FMBStates[i+1] := FCMBState;
|
|
||||||
FbgedStates[i+1] := fcbgesate;
|
|
||||||
FjkhStates[i+1] := fcjkhState;
|
|
||||||
FSatesCount := i+1;
|
|
||||||
FTokens[i] := tks;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function GetLineTokens(idx);override;
|
|
||||||
begin
|
|
||||||
if idx<FSatesCount then
|
|
||||||
return FTokens[idx];
|
|
||||||
end
|
|
||||||
protected
|
|
||||||
function SetTToken(tokens,ttk,idx,ext);virtual; //设置token
|
|
||||||
begin
|
|
||||||
d := inherited;
|
|
||||||
if not d then return ;
|
|
||||||
tk := d.FValue;
|
|
||||||
if ext in array(")","]","}",">") then d.FFColor := 0xFF0000;
|
|
||||||
if ext=">" and tk="<" then
|
|
||||||
begin
|
|
||||||
fcjkhState.GetLeft();
|
|
||||||
d.FMATe := fcjkhState.GetSate();
|
|
||||||
end else
|
|
||||||
if ext=">" and tk=">" then
|
|
||||||
begin
|
|
||||||
fcjkhState.GetRight();
|
|
||||||
d.FMATe := fcjkhState.GetSate();
|
|
||||||
end else
|
|
||||||
if ext="}" and tk="{" then
|
|
||||||
begin
|
|
||||||
FCBEState.GetLeft();
|
|
||||||
d.FMATe := FCBEState.GetSate();
|
|
||||||
end else
|
|
||||||
if ext="}" and tk="}" then
|
|
||||||
begin
|
|
||||||
FCBEState.GetRight();
|
|
||||||
d.FMATe := FCBEState.GetSate();
|
|
||||||
end else
|
|
||||||
if ext="]" and tk="[" then
|
|
||||||
begin
|
|
||||||
FCMBState.GetLeft();
|
|
||||||
d.FMATe := FCMBState.GetSate();
|
|
||||||
|
|
||||||
end else
|
|
||||||
if ext="]" and tk="]" then
|
|
||||||
begin
|
|
||||||
FCMBState.GetRight();
|
|
||||||
d.FMATe := FCMBState.GetSate();
|
|
||||||
end else
|
|
||||||
if ext=")" and tk="(" then
|
|
||||||
begin
|
|
||||||
FCBBState.GetLeft();
|
|
||||||
d.FMATe := FCBBState.GetSate();
|
|
||||||
|
|
||||||
end else
|
|
||||||
if ext=")" and tk=")" then
|
|
||||||
begin
|
|
||||||
FCBBState.GetRight();
|
|
||||||
d.FMATe := FCBBState.GetSate();
|
|
||||||
end else
|
|
||||||
if ext='"' then
|
|
||||||
begin
|
|
||||||
D.FFColor := 0x8B008B;
|
|
||||||
end else
|
|
||||||
if tk in array("true","false","null") then
|
|
||||||
begin
|
|
||||||
d.FFColor := 0x0000FF;
|
|
||||||
end else
|
|
||||||
if tk ="object" then
|
|
||||||
begin
|
|
||||||
d.FFColor := 0x0000FF;
|
|
||||||
fcbgesate.GetLeft();
|
|
||||||
d.FMATe := fcbgesate.GetSate();
|
|
||||||
end else
|
|
||||||
if tk="end" then
|
|
||||||
begin
|
|
||||||
d.FFColor := 0x0000FF;
|
|
||||||
fcbgesate.GetRight();
|
|
||||||
d.FMATe := fcbgesate.GetSate();
|
|
||||||
end else
|
|
||||||
if tk in array(":",",") then
|
|
||||||
begin
|
|
||||||
d.FFColor := 0x0000FF;
|
|
||||||
end else
|
|
||||||
if StrIsANumber(tk) then d.FFColor := 0x666666;
|
|
||||||
return d;
|
|
||||||
|
|
||||||
end
|
|
||||||
private
|
|
||||||
function StrIsANumber(s);
|
|
||||||
begin
|
|
||||||
if not s then return 0;
|
|
||||||
r := (1=ParseRegExpr("^[+-]?[\\d]+",s,"",result,MPos,Mlen)) ;
|
|
||||||
return r;
|
|
||||||
end
|
|
||||||
function FindRightChar(c,s,b,e,zy); //查找封闭的字符
|
|
||||||
begin
|
|
||||||
i := b;
|
|
||||||
while i<=e do
|
|
||||||
begin
|
|
||||||
si := s[i];
|
|
||||||
if si=zy then
|
|
||||||
begin
|
|
||||||
i+=2;
|
|
||||||
if i>e then return 0;
|
|
||||||
continue;
|
|
||||||
end
|
|
||||||
if s[i]=c then //找到了
|
|
||||||
begin
|
|
||||||
return i;
|
|
||||||
end
|
|
||||||
i++;
|
|
||||||
end
|
|
||||||
return 0; //没找到
|
|
||||||
for i := b to e do
|
|
||||||
begin
|
|
||||||
if s[i]=c then //找到了
|
|
||||||
begin
|
|
||||||
return i;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
fdolastline;
|
|
||||||
FTokens;
|
|
||||||
FSates;
|
|
||||||
FSatesCount;
|
|
||||||
|
|
||||||
FCBBState;
|
|
||||||
FCBEState;
|
|
||||||
FCMBState;
|
|
||||||
FBBStates;
|
|
||||||
FBEStates;
|
|
||||||
FMBStates ;
|
|
||||||
FbgedStates;
|
|
||||||
FjkhStates;
|
|
||||||
fcbgesate;
|
|
||||||
fcjkhState;
|
|
||||||
end
|
end
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
type TBBState =class //括号状态
|
type TBBState =class(tpairstate) //À¨ºÅ״̬
|
||||||
function Create(t);
|
function Create(t);
|
||||||
begin
|
begin
|
||||||
FType := ifstring(t)?t:"";
|
inherited;
|
||||||
FCJ := 0;
|
|
||||||
FState := 0;
|
|
||||||
FIndexs := array(0);
|
|
||||||
FIndex := 0;
|
|
||||||
FCstate := false;
|
|
||||||
end
|
end
|
||||||
function GetLeft();
|
|
||||||
begin
|
|
||||||
FCstate := true;
|
|
||||||
if FState then // 上一个是左括号
|
|
||||||
begin
|
|
||||||
FCJ++;
|
|
||||||
FIndex++;
|
|
||||||
FIndexs[FIndex]:=0;
|
|
||||||
end else //上一个非左括号
|
|
||||||
begin
|
|
||||||
|
|
||||||
FIndexs[FIndex]++;
|
|
||||||
end
|
|
||||||
FState := true;
|
|
||||||
end
|
|
||||||
function GetRight();
|
|
||||||
begin
|
|
||||||
FCstate := true;
|
|
||||||
//if FCJ=0 then return ;
|
|
||||||
if FState then // 上一个是左括号
|
|
||||||
begin
|
|
||||||
|
|
||||||
//FIndexs[FIndex]++;
|
|
||||||
end else //上一个非左括号
|
|
||||||
begin
|
|
||||||
if FCJ>0 then
|
|
||||||
begin
|
|
||||||
FCJ--;
|
|
||||||
DeleteIndex(FIndexs,FIndex);
|
|
||||||
FIndex--;
|
|
||||||
end else
|
|
||||||
begin
|
|
||||||
FCstate := false;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
FState := false;
|
|
||||||
end
|
|
||||||
function GetSate();
|
|
||||||
begin
|
|
||||||
if FCstate then
|
|
||||||
begin
|
|
||||||
//return inttostr(FIndexs[FCJ])+FType;
|
|
||||||
return tostn(FIndexs)+FType;// inttostr(FCJ)+"+"+inttostr(FIndexs[FIndex])+FType; length(FIndexs)+FType ;//
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function Show();
|
|
||||||
begin
|
|
||||||
echo "层级:",FCJ," 序号:",FIndexs[FIndex],"状态:", FCstate;
|
|
||||||
end
|
|
||||||
function Clone();
|
|
||||||
begin
|
|
||||||
r := new TBBState(FType);
|
|
||||||
r.FCstate := FCstate;
|
|
||||||
r.FState := FState;
|
|
||||||
r.FCJ := FCJ;
|
|
||||||
r.FIndexs := FIndexs;
|
|
||||||
r.FIndex := FIndex;
|
|
||||||
return r;
|
|
||||||
end
|
|
||||||
protected
|
|
||||||
FCstate;
|
|
||||||
FState;
|
|
||||||
FCJ;
|
|
||||||
FIndexs;
|
|
||||||
FIndex;
|
|
||||||
FType;
|
|
||||||
|
|
||||||
end
|
end
|
||||||
type TTsfFileParser = class //文件解析
|
type TTsfFileParser = class //文件解析
|
||||||
private
|
private
|
||||||
|
|
|
||||||
|
|
@ -3014,6 +3014,450 @@ type TSynHighLighter = class(TComponent) //
|
||||||
Flines;
|
Flines;
|
||||||
FMemo;
|
FMemo;
|
||||||
|
|
||||||
|
end
|
||||||
|
type tcustomsynhighlighter = class(TSynHighLighter)
|
||||||
|
{**
|
||||||
|
@explan(说明) 通用的语法高亮类
|
||||||
|
支持单行注释,块注释,配对,字符串定义,关键字,符号%%
|
||||||
|
@data(20220915)
|
||||||
|
**}
|
||||||
|
function create(AOwner);
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
fsymcolor := 0xa000a0;
|
||||||
|
fkeywordcolor := 0x0000ff;
|
||||||
|
fstringcolor := 0xff00ff;
|
||||||
|
fannotationcolor := 0xff0000;
|
||||||
|
fignorecase := false;//忽略大小写
|
||||||
|
FChangeDeal := true;
|
||||||
|
FTokens := array();
|
||||||
|
setkeyword(array("null","true","false"));
|
||||||
|
setblockannote(array(
|
||||||
|
("/*","*/"),
|
||||||
|
));
|
||||||
|
setrowannote(array("//"));
|
||||||
|
setsyms(array("+","-","*","/",";","(",")","{","}",":"));
|
||||||
|
setstring(array(
|
||||||
|
("'","\\"),
|
||||||
|
('"',"\\"),
|
||||||
|
));
|
||||||
|
setpairs(array(
|
||||||
|
("(",")"),
|
||||||
|
("{","}"),
|
||||||
|
));
|
||||||
|
clean();
|
||||||
|
end
|
||||||
|
function ExecuteCommand(cmd,pm);override;
|
||||||
|
begin
|
||||||
|
{**
|
||||||
|
@explan(说明) 对外接口 %%
|
||||||
|
@param(cmd)(string) 命令%%
|
||||||
|
@param(pm)(array) 参数 %%
|
||||||
|
**}
|
||||||
|
case cmd of
|
||||||
|
"strings":
|
||||||
|
begin
|
||||||
|
return setstring(pm);
|
||||||
|
end
|
||||||
|
"rowannotes":
|
||||||
|
begin
|
||||||
|
return setrowannote(pm);
|
||||||
|
end
|
||||||
|
"blockannotes":
|
||||||
|
begin
|
||||||
|
return setblockannote(pm);
|
||||||
|
end
|
||||||
|
"keywords":
|
||||||
|
begin
|
||||||
|
return setkeyword(pm);
|
||||||
|
end
|
||||||
|
"syms":
|
||||||
|
begin
|
||||||
|
return setsyms(pm);
|
||||||
|
end
|
||||||
|
"pairs":
|
||||||
|
begin
|
||||||
|
return setpairs(pm);
|
||||||
|
end
|
||||||
|
end ;
|
||||||
|
return inherited;
|
||||||
|
end
|
||||||
|
function SetInValidateIndex(idx);override; //当前改变的行
|
||||||
|
begin
|
||||||
|
idx := max(1,idx);
|
||||||
|
fdolastline := idx-2;
|
||||||
|
if not(FChangeDeal)and idx>FSatesCount then return;
|
||||||
|
if length(FSates)>= idx then FSatesCount := idx;
|
||||||
|
else FSatesCount := length(FSates)-1;
|
||||||
|
if FSatesCount=1 then clean();
|
||||||
|
FChangeDeal := false;
|
||||||
|
end
|
||||||
|
|
||||||
|
function InsureTokenParserd(LastLine);override; //解析
|
||||||
|
begin
|
||||||
|
ls := Lines;
|
||||||
|
FChangeDeal := true;
|
||||||
|
if fdolastline>=LastLine then return ;
|
||||||
|
fdolastline := LastLine;
|
||||||
|
for i := FSatesCount-1 to LastLine do
|
||||||
|
begin
|
||||||
|
if i<0 then continue;
|
||||||
|
s := ls.GetStringByIndex(i);
|
||||||
|
cst := FSates[i];
|
||||||
|
tks := array();
|
||||||
|
fcbgestate := array();
|
||||||
|
for jj,j in mrows(Fbgedstates,1) do
|
||||||
|
begin
|
||||||
|
v := Fbgedstates[j][i];
|
||||||
|
vj := v.Clone;
|
||||||
|
fcbgestate[j]:= vj;
|
||||||
|
Fbgedstates[j][i+1]:= vj;
|
||||||
|
end
|
||||||
|
FSates[i+1]:= ParserTokenLines(s,1,length(s),cst,tks);
|
||||||
|
FSatesCount := i+1;
|
||||||
|
FTokens[i]:= tks;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function GetLineTokens(idx);override;
|
||||||
|
begin
|
||||||
|
if idx<FSatesCount then return FTokens[idx];
|
||||||
|
end
|
||||||
|
function SetTToken(tokens,ttk,idx,ext);override; //设置token
|
||||||
|
begin
|
||||||
|
bttk := ttk;
|
||||||
|
d := inherited;
|
||||||
|
if not d then return ;
|
||||||
|
if not ext then
|
||||||
|
begin
|
||||||
|
if ifkeywords(bttk) then
|
||||||
|
begin
|
||||||
|
d.FFColor := fkeywordcolor;
|
||||||
|
end
|
||||||
|
dopair(d,bttk);
|
||||||
|
end else
|
||||||
|
if ifarray(ext) then
|
||||||
|
begin
|
||||||
|
if ext[0]="str" then
|
||||||
|
begin
|
||||||
|
d.FFColor := fstringcolor;
|
||||||
|
end else
|
||||||
|
if ext[0] = "annote" then
|
||||||
|
begin
|
||||||
|
d.FFColor := fannotationcolor;
|
||||||
|
end else
|
||||||
|
if ext[0]= "sym" then
|
||||||
|
begin
|
||||||
|
d.FFColor := fsymcolor;
|
||||||
|
dopair(d,bttk);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return d;
|
||||||
|
end
|
||||||
|
|
||||||
|
function clean();override; //初始化
|
||||||
|
begin
|
||||||
|
FTokens := array();
|
||||||
|
FSates := array(0);
|
||||||
|
Fbgedstates := array();
|
||||||
|
FSatesCount := 0;
|
||||||
|
for i,v in fswordpairs do
|
||||||
|
begin
|
||||||
|
Fbgedstates[i,0]:= new tpairstate(i);
|
||||||
|
end
|
||||||
|
inherited;
|
||||||
|
end
|
||||||
|
property keywordcolor:color read fkeywordcolor write fkeywordcolor;
|
||||||
|
property stringcolor:color read fstringcolor write fstringcolor;
|
||||||
|
property annotationcolor:color read fannotationcolor write fannotationcolor;
|
||||||
|
property symcolor:color read fsymcolor write fsymcolor;
|
||||||
|
private
|
||||||
|
function dopair(d,bttk); //处理配对信息
|
||||||
|
begin
|
||||||
|
n := fswordpairshash[bttk];
|
||||||
|
if n then
|
||||||
|
begin
|
||||||
|
st := fcbgestate[n];
|
||||||
|
if fswordpairs[n][0]=bttk then
|
||||||
|
begin
|
||||||
|
st.GetLeft();
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
st.GetRight();
|
||||||
|
end
|
||||||
|
d.FMATe := st.GetSate();
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function ParserTokenLines(s,b,e,cst,tokens); //解析字符
|
||||||
|
begin
|
||||||
|
label L_XCDG;
|
||||||
|
if cst=0 then //普通情况
|
||||||
|
begin
|
||||||
|
idx := b;
|
||||||
|
ttk := "";
|
||||||
|
while idx <= e do
|
||||||
|
begin
|
||||||
|
vi := s[idx];
|
||||||
|
if vi=" " or vi="\t" then //分隔符
|
||||||
|
begin
|
||||||
|
SetTToken(tokens,ttk,idx-1);
|
||||||
|
end else
|
||||||
|
if ifrowannote(s,e,idx,oidx,ostr) then
|
||||||
|
begin
|
||||||
|
SetTToken(tokens,ttk,idx-1);
|
||||||
|
bostr := ostr;
|
||||||
|
SetTToken(tokens,ostr,oidx-1,array("annote",bostr));
|
||||||
|
if oidx<=e then
|
||||||
|
begin
|
||||||
|
SetTToken(tokens,s[oidx:],e,array("annote",bostr));
|
||||||
|
end
|
||||||
|
return 0;
|
||||||
|
end else
|
||||||
|
if ifblockannote(s,e,idx,oidx,ostr) then //查找块注释
|
||||||
|
begin
|
||||||
|
SetTToken(tokens,ttk,idx-1);
|
||||||
|
bostr := ostr;
|
||||||
|
ncost := array("annote",bostr,fblockstiresb[bostr]);
|
||||||
|
SetTToken(tokens,ostr,oidx-1);
|
||||||
|
idx := oidx-1;
|
||||||
|
return ParserTokenLines(s,idx+1,e,ncost,tokens);
|
||||||
|
end else
|
||||||
|
if ifstringstart(s,e,idx,oidx,ostr) then //查找字符串
|
||||||
|
begin
|
||||||
|
SetTToken(tokens,ttk,idx-1);
|
||||||
|
bostr := ostr;
|
||||||
|
ncost := array("str",bostr,fstrstires[bostr],fstrstires_zy[cst]);
|
||||||
|
SetTToken(tokens,ostr,oidx-1,ncost);
|
||||||
|
idx := oidx-1;
|
||||||
|
return ParserTokenLines(s,idx+1,e,ncost,tokens);
|
||||||
|
end else
|
||||||
|
if ifdefsym(s,e,idx,oidx,ostr) then //符号
|
||||||
|
begin
|
||||||
|
SetTToken(tokens,ttk,idx-1);
|
||||||
|
SetTToken(tokens,ostr,oidx-1,array("sym",ostr));
|
||||||
|
idx := oidx-1;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
ttk+=vi;
|
||||||
|
end
|
||||||
|
idx++;
|
||||||
|
end
|
||||||
|
SetTToken(tokens,ttk,idx-1);
|
||||||
|
end else //查找
|
||||||
|
begin
|
||||||
|
if b>e then return cst;
|
||||||
|
if ifarray(cst) and (cst[0]="str" or cst[0]="annote") then
|
||||||
|
begin
|
||||||
|
cst1 := cst[1];
|
||||||
|
cstL := length(cst1);
|
||||||
|
r := FindRightChar(cst[2],s,b,e,cst[3]);
|
||||||
|
if r=0 then //没找到
|
||||||
|
begin
|
||||||
|
Setttoken(tokens,s[b:],e,cst);
|
||||||
|
return cst;
|
||||||
|
end else //找到
|
||||||
|
if r <= e then
|
||||||
|
begin
|
||||||
|
if b<r then
|
||||||
|
begin
|
||||||
|
Setttoken(tokens,s[b:r-1],r-1,cst);
|
||||||
|
end
|
||||||
|
Setttoken(tokens,s[r:(r-1+cstL)],(r-1+cstL),cst);
|
||||||
|
if r<e then
|
||||||
|
begin
|
||||||
|
//消除递归
|
||||||
|
b := r+cstL;
|
||||||
|
cst := 0;
|
||||||
|
goto L_XCDG;
|
||||||
|
//return ParserTokenLines(s,r+1,e,0,tokens); //递归方式
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function setstring(d); //设置字符串信息
|
||||||
|
begin
|
||||||
|
fstrstires := array();
|
||||||
|
fstrstires_zy := array();
|
||||||
|
for i,v in d do
|
||||||
|
begin
|
||||||
|
if not ifarray(v) then continue;
|
||||||
|
v0 := v[0];
|
||||||
|
v1 := v[1];
|
||||||
|
if ifstring(v0) and v0 then
|
||||||
|
begin
|
||||||
|
st := new TTire();
|
||||||
|
fstrstires[v0] := st;
|
||||||
|
st.add(v0);
|
||||||
|
fstrstires_zy[v0] := v1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function setkeyword(ws); //设置关键字
|
||||||
|
begin
|
||||||
|
st := new TTire();
|
||||||
|
for i,v in ws do
|
||||||
|
begin
|
||||||
|
if v and ifstring(v) then st.add(v);
|
||||||
|
end
|
||||||
|
fkeystires := array(st);
|
||||||
|
end
|
||||||
|
function setblockannote(d); //设置块注释
|
||||||
|
begin
|
||||||
|
fblockstiresa := array();
|
||||||
|
fblockstiresb := array();
|
||||||
|
for i,v in d do
|
||||||
|
begin
|
||||||
|
if not ifarray(d) then continue ;
|
||||||
|
v0 := v[0];
|
||||||
|
v1 := v[1];
|
||||||
|
if ifstring(v0) and ifstring(v1) and v0 and v1 then
|
||||||
|
begin
|
||||||
|
st := new TTire();
|
||||||
|
st.add(v0);
|
||||||
|
fblockstiresa[v0] := st;
|
||||||
|
st := new TTire();
|
||||||
|
st.add(v1);
|
||||||
|
fblockstiresb[v0] := st;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function setrowannote(d);//设置行注释
|
||||||
|
begin
|
||||||
|
frowstires := array();
|
||||||
|
for i,v in d do
|
||||||
|
begin
|
||||||
|
if v and ifstring(v) then
|
||||||
|
begin
|
||||||
|
st := new TTire();
|
||||||
|
frowstires[v] := st;
|
||||||
|
st.add("//");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function setsyms(d);//设置符号
|
||||||
|
begin
|
||||||
|
st := new TTire();
|
||||||
|
fsymstires := array(st);
|
||||||
|
for i,v in d do
|
||||||
|
begin
|
||||||
|
if ifstring(v) and v then
|
||||||
|
begin
|
||||||
|
st.add(v);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function setpairs(d);//设置配对
|
||||||
|
begin
|
||||||
|
fswordpairs := array();
|
||||||
|
fswordpairshash := array();
|
||||||
|
for i,v in d do
|
||||||
|
begin
|
||||||
|
if not ifarray(v) then continue;
|
||||||
|
v0 := v[0];
|
||||||
|
v1 := v[1];
|
||||||
|
if ifstring(v0) and ifstring(v1) and v0 and v1 then
|
||||||
|
begin
|
||||||
|
fswordpairs[v0,0]:= v0;
|
||||||
|
fswordpairs[v0,1]:= v1;
|
||||||
|
fswordpairshash[v0]:=v0;
|
||||||
|
fswordpairshash[v1]:=v0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
function cyclefind(cys,s,l,idx,oidx,ostr,tidx);
|
||||||
|
begin
|
||||||
|
r := 0;
|
||||||
|
for i,v in cys do //字符串
|
||||||
|
begin
|
||||||
|
if v.find(s,l,idx,oidx,ostr) then
|
||||||
|
begin
|
||||||
|
r := 1;
|
||||||
|
tidx := i;
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return r;
|
||||||
|
end
|
||||||
|
function ifblockannote(s,l,idx,oidx,ostr,tidx);//是否为块注释
|
||||||
|
begin
|
||||||
|
return cyclefind(fblockstiresa,s,l,idx,oidx,ostr,tidx);
|
||||||
|
end
|
||||||
|
function ifrowannote(s,l,idx,oidx,ostr,tidx);//是为
|
||||||
|
begin
|
||||||
|
return cyclefind(frowstires,s,l,idx,oidx,ostr,tidx);
|
||||||
|
end
|
||||||
|
function ifstringstart(s,l,idx,oidx,ostr,tidx); //字符串判断
|
||||||
|
begin
|
||||||
|
return cyclefind(fstrstires,s,l,idx,oidx,ostr,tidx);
|
||||||
|
end
|
||||||
|
function ifkeywords(s);//关键字判断
|
||||||
|
begin
|
||||||
|
for i,v in fkeystires do
|
||||||
|
begin
|
||||||
|
if v.find(s,length(s),1,idx,ostr) and (ostr=s) then
|
||||||
|
return true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function ifdefsym(s,l,idx,oidx,ostr,tidx); //符号判断
|
||||||
|
begin
|
||||||
|
return cyclefind(fsymstires,s,l,idx,oidx,ostr,tidx);
|
||||||
|
end
|
||||||
|
function FindRightChar(vo,s,b,e,zy); //查找封闭的字符
|
||||||
|
begin
|
||||||
|
i := b;
|
||||||
|
if not vo then return 1;
|
||||||
|
while i <= e do
|
||||||
|
begin
|
||||||
|
si := s[i];
|
||||||
|
if si=zy then
|
||||||
|
begin
|
||||||
|
i += 2;
|
||||||
|
if i>e then return 0;
|
||||||
|
continue;
|
||||||
|
end
|
||||||
|
if vo.find(s,e,i,oidx,ostr) then
|
||||||
|
begin
|
||||||
|
return i;
|
||||||
|
end
|
||||||
|
i++;
|
||||||
|
end
|
||||||
|
return 0; //没找到
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
FSatesCount ;// 状态行号
|
||||||
|
FChangeDeal;//改变flag
|
||||||
|
fignorecase; //忽略大小写
|
||||||
|
//前后匹配
|
||||||
|
Fbgedstates;
|
||||||
|
fcbgestate;//当前匹配
|
||||||
|
|
||||||
|
///
|
||||||
|
FSates; //当前状态
|
||||||
|
FTokens;
|
||||||
|
fdolastline; //已经处理到行
|
||||||
|
|
||||||
|
|
||||||
|
///////tire树/////////////
|
||||||
|
fkeystires;
|
||||||
|
fstrstires;
|
||||||
|
fstrstires_zy;
|
||||||
|
fsymstires;
|
||||||
|
frowstires;
|
||||||
|
fblockstiresa;
|
||||||
|
fblockstiresb;
|
||||||
|
/////
|
||||||
|
fkeywordcolor;
|
||||||
|
fstringcolor;
|
||||||
|
fannotationcolor;
|
||||||
|
fsymcolor;
|
||||||
|
|
||||||
|
//
|
||||||
|
fswordpairs;
|
||||||
|
fswordpairshash;
|
||||||
|
|
||||||
end
|
end
|
||||||
type TSynCustomMemo = class(TCustomMemo)
|
type TSynCustomMemo = class(TCustomMemo)
|
||||||
{**
|
{**
|
||||||
|
|
|
||||||
|
|
@ -1695,6 +1695,84 @@ type TTire = class
|
||||||
end
|
end
|
||||||
FRoot;
|
FRoot;
|
||||||
end
|
end
|
||||||
|
type tpairstate =class //括号状态
|
||||||
|
function Create(t);
|
||||||
|
begin
|
||||||
|
FType := ifstring(t)?t:"";
|
||||||
|
FCJ := 0;
|
||||||
|
FState := 0;
|
||||||
|
FIndexs := array(0);
|
||||||
|
FIndex := 0;
|
||||||
|
FCstate := false;
|
||||||
|
end
|
||||||
|
function GetLeft();
|
||||||
|
begin
|
||||||
|
FCstate := true;
|
||||||
|
if FState then // 上一个是左括号
|
||||||
|
begin
|
||||||
|
FCJ++;
|
||||||
|
FIndex++;
|
||||||
|
FIndexs[FIndex]:=0;
|
||||||
|
end else //上一个非左括号
|
||||||
|
begin
|
||||||
|
|
||||||
|
FIndexs[FIndex]++;
|
||||||
|
end
|
||||||
|
FState := true;
|
||||||
|
end
|
||||||
|
function GetRight();
|
||||||
|
begin
|
||||||
|
FCstate := true;
|
||||||
|
//if FCJ=0 then return ;
|
||||||
|
if FState then // 上一个是左括号
|
||||||
|
begin
|
||||||
|
|
||||||
|
//FIndexs[FIndex]++;
|
||||||
|
end else //上一个非左括号
|
||||||
|
begin
|
||||||
|
if FCJ>0 then
|
||||||
|
begin
|
||||||
|
FCJ--;
|
||||||
|
DeleteIndex(FIndexs,FIndex);
|
||||||
|
FIndex--;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
FCstate := false;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
FState := false;
|
||||||
|
end
|
||||||
|
function GetSate();
|
||||||
|
begin
|
||||||
|
if FCstate then
|
||||||
|
begin
|
||||||
|
//return inttostr(FIndexs[FCJ])+FType;
|
||||||
|
return tostn(FIndexs)+FType;// inttostr(FCJ)+"+"+inttostr(FIndexs[FIndex])+FType; length(FIndexs)+FType ;//
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function Show();
|
||||||
|
begin
|
||||||
|
echo "层级:",FCJ," 序号:",FIndexs[FIndex],"状态:", FCstate;
|
||||||
|
end
|
||||||
|
function Clone();
|
||||||
|
begin
|
||||||
|
r := new tpairstate(FType);
|
||||||
|
r.FCstate := FCstate;
|
||||||
|
r.FState := FState;
|
||||||
|
r.FCJ := FCJ;
|
||||||
|
r.FIndexs := FIndexs;
|
||||||
|
r.FIndex := FIndex;
|
||||||
|
return r;
|
||||||
|
end
|
||||||
|
protected
|
||||||
|
FCstate;
|
||||||
|
FState;
|
||||||
|
FCJ;
|
||||||
|
FIndexs;
|
||||||
|
FIndex;
|
||||||
|
FType;
|
||||||
|
|
||||||
|
end
|
||||||
implementation
|
implementation
|
||||||
function includestate(u,s);
|
function includestate(u,s);
|
||||||
begin
|
begin
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue