-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathuCefScriptDict.pas
157 lines (137 loc) · 3.68 KB
/
uCefScriptDict.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
unit uCefScriptDict;
interface
uses
//
System.SysUtils, System.Classes, System.Generics.Collections,
System.Generics.Defaults, System.SyncObjs,
//
uCEFInterfaces, uCEFChromium,
//
uReLog3, uLoggerInterface,
//
uCefScriptBase, uCefUtilType;
type
TCefScriptClass = class of TCefScriptBase;
TCefScriptPair = TPair<string,TCefScriptClass>;
TCefScriptList = TList<TCefScriptPair>;
TCefScriptDict = class
private
FItems: TCefScriptList;
function Find(const AKey: string; var AClass: TCefScriptClass): Boolean;
function ParseLine(const ALine: string; var AName, AParam: string;
var AIgnore: Boolean): TCefScriptClass;
public
constructor Create;
destructor Destroy; override;
function MakeScript(const ALine: string; const AController: TCefControllerBase;
const ALogger: ILoggerInterface; const AWebBrowser: TChromium;
const AAbortEvent: TEvent): TCefScriptBase; overload;
function MakeScript(const ALine: string; const AParent: TCefScriptBase): TCefScriptBase; overload;
procedure Add(const AName: string; const AClass: TCefScriptClass); overload;
procedure Add(const AClass: TCefScriptClass); overload;
function Keys: TArray<string>;
end;
implementation
uses
//
uStringUtils, uGlobalConstants;
{ TCefScriptDict }
procedure TCefScriptDict.Add(const AName: string;
const AClass: TCefScriptClass);
begin
FItems.Add(TCefScriptPair.Create(AName, AClass))
end;
procedure TCefScriptDict.Add(const AClass: TCefScriptClass);
begin
Add(AClass.GetScriptName(), AClass)
end;
constructor TCefScriptDict.Create;
begin
inherited;
FItems := TCefScriptList.Create();
end;
destructor TCefScriptDict.Destroy;
begin
FreeAndNil(FItems);
inherited;
end;
function TCefScriptDict.Find(const AKey: string;
var AClass: TCefScriptClass): Boolean;
var
item: TCefScriptPair;
begin
for item in FItems do
begin
if AnsiCompareText(item.Key, AKey) = 0 then
begin
AClass := item.Value;
Exit(True);
end;
end;
Exit(False)
end;
function TCefScriptDict.Keys: TArray<string>;
var
list: TList<string>;
item: TCefScriptPair;
begin
list := TList<string>.Create;
try
for item in FItems do
list.Add(item.Key);
Result := list.ToArray
finally
list.Free
end
end;
function TCefScriptDict.ParseLine(const ALine: string; var AName,
AParam: string; var AIgnore: Boolean): TCefScriptClass;
var
cat, param: string;
clss: TCefScriptClass;
ignor: Boolean;
begin
param := ALine;
cat := StrCut(param, gCharsSpace);
ignor := False;
if (cat <> '') and (cat[1] = '!') then
begin
ignor := True;
Delete(cat, 1, 1)
end;
//---
AName := Trim(cat);
AParam := Trim(param);
AIgnore := ignor;
if Find(cat, clss) then
Exit(clss);
Exit(nil);
end;
function TCefScriptDict.MakeScript(const ALine: string;
const AParent: TCefScriptBase): TCefScriptBase;
var
cat, param: string;
clss: TCefScriptClass;
ignor: Boolean;
begin
clss := ParseLine(ALine, cat, param, ignor);
if Assigned(clss) then
Exit(clss.Create('', AParent, param, ignor));
Result := nil;
end;
function TCefScriptDict.MakeScript(const ALine: string;
const AController: TCefControllerBase;
const ALogger: ILoggerInterface;
const AWebBrowser: TChromium;
const AAbortEvent: TEvent): TCefScriptBase;
var
cat, param: string;
clss: TCefScriptClass;
ignor: Boolean;
begin
clss := ParseLine(ALine, cat, param, ignor);
if Assigned(clss) then
Exit(clss.Create('', param, ignor, ALogger, AWebBrowser, AController, AAbortEvent));
Result := nil;
end;
end.