-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathqtemplate.pp
140 lines (114 loc) · 3.32 KB
/
qtemplate.pp
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
unit QTemplate;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, fptemplate, Utils;
type
TTagCallback = function (const ATag: String; AParams: TStringList): String of object;
TCallbackMap = specialize TStringHashMap<TTagCallback>;
{ TQTemplate }
TQTemplate = class(TFPTemplate)
private
FTagMap: TCallbackMap;
FCaseSensitive: Boolean;
FStream:TStream;
function GetTagName(const TagString: String): String;
procedure ReplaceTags(Sender: TObject; const TagString: String;
TagParams: TStringList; out ReplaceText: String);
function GetTag(const TagString: String): TTagCallback;
procedure SetTag(const TagString: String; AValue: TTagCallback);
public
constructor Create(const AFileName: String);overload; virtual;
constructor Create(const AStream: TStream);overload; virtual;
destructor Destroy; override;
function GetContentSream:String;
property Tags[const TagString: String]: TTagCallback read GetTag write SetTag; default;
property CaseSensitive: Boolean read FCaseSensitive write FCaseSensitive;
end;
implementation
{ TQTemplate }
function TQTemplate.GetTagName(const TagString: String): String;
begin
if FCaseSensitive then
Result := TagString
else
Result := LowerCase(TagString);
end;
procedure TQTemplate.ReplaceTags(Sender: TObject; const TagString: String;
TagParams: TStringList; out ReplaceText: String);
var
TagName: String;
begin
TagName := GetTagName(TagString);
{$if fpc_fullversion >= 20701}
if FTagMap.Contains(TagName) then begin
{$else fpc_fullversion >= 20701}
if FTagMap.IndexOf(TagName) >= 0 then begin
{$endif fpc_fullversion >= 20701}
ReplaceText := FTagMap[TagName](TagName,TagParams);
end;
end;
function TQTemplate.GetTag(const TagString: String): TTagCallback;
var
TagName: String;
begin
TagName := GetTagName(TagString);
Result := FTagMap[TagName];
end;
procedure TQTemplate.SetTag(const TagString: String; AValue: TTagCallback);
var
TagName: String;
begin
TagName := GetTagName(TagString);
FTagMap[TagName] := AValue;
end;
constructor TQTemplate.Create(const AFileName: String);
begin
inherited Create;
FileName := AFileName;
FCaseSensitive := false;
FTagMap := TCallbackMap.Create;
StartDelimiter := '{+';
EndDelimiter := '+}';
ParamStartDelimiter := '[-';
ParamValueSeparator := '=';
ParamEndDelimiter := '-]';
AllowTagParams := true;
OnReplaceTag := @ReplaceTags;
end;
constructor TQTemplate.Create(const AStream: TStream);
begin
inherited Create;
FStream := AStream;
FCaseSensitive := false;
FTagMap := TCallbackMap.Create;
StartDelimiter := '{+';
EndDelimiter := '+}';
ParamStartDelimiter := '[-';
ParamValueSeparator := '=';
ParamEndDelimiter := '-]';
AllowTagParams := true;
OnReplaceTag := @ReplaceTags;
end;
destructor TQTemplate.Destroy;
begin
FreeAndNil(FTagMap);
inherited Destroy;
end;
function TQTemplate.GetContentSream: String;
var
S : TStringStream;
begin
S:=TStringStream.Create('');
try
If (FStream<>Nil) then
begin
CreateParser.ParseStream(FStream,S);
Result:=S.DataString;
end;
finally
FreeAndNil(S);
FreeAndNil(FStream);
end;
end;
end.