-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathHTTP.HTMLBuild.pas
168 lines (139 loc) · 4.2 KB
/
HTTP.HTMLBuild.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
158
159
160
161
162
163
164
165
166
167
unit HTTP.HTMLBuild;
interface
uses
System.Classes, System.SysUtils;
type
TDocSection = class(TStringList)
procedure AddTagSection(const Tag: string; Lines: TArray<string>);
end;
IHTMLBuilder = interface
function Title(const Value: string): IHTMLBuilder;
function HTML: string;
function Head(const Tag: string; Lines: TArray<string>): IHTMLBuilder; overload;
function Body(const Tag: string; Lines: TArray<string>): IHTMLBuilder; overload;
function Doc(const Tag: string; Lines: TArray<string>): IHTMLBuilder; overload;
function Head(Lines: TArray<string>): IHTMLBuilder; overload;
function Body(Lines: TArray<string>): IHTMLBuilder; overload;
function Doc(Lines: TArray<string>): IHTMLBuilder; overload;
function Head(const Value: string): IHTMLBuilder; overload;
function Body(const Value: string): IHTMLBuilder; overload;
function Doc(const Value: string): IHTMLBuilder; overload;
end;
HTMLBuilder = class(TInterfacedObject, IHTMLBuilder)
private
FHead: TDocSection;
FBody: TDocSection;
FLines: TDocSection;
public
class function Build: IHTMLBuilder;
function HTML: string;
function Body(const Tag: string; Lines: TArray<string>): IHTMLBuilder; overload;
function Body(const Value: string): IHTMLBuilder; overload;
function Body(Lines: TArray<string>): IHTMLBuilder; overload;
function Doc(const Tag: string; Lines: TArray<string>): IHTMLBuilder; overload;
function Doc(Lines: TArray<string>): IHTMLBuilder; overload;
function Doc(const Value: string): IHTMLBuilder; overload;
function Head(const Tag: string; Lines: TArray<string>): IHTMLBuilder; overload;
function Head(Lines: TArray<string>): IHTMLBuilder; overload;
function Head(const Value: string): IHTMLBuilder; overload;
function Title(const Value: string): IHTMLBuilder;
constructor Create;
destructor Destroy; override;
end;
function OpenTag(const Tag: string): string;
function CloseTag(const Tag: string): string;
implementation
function OpenTag(const Tag: string): string;
begin
Result := Format('<%s>', [Tag]);
end;
function CloseTag(const Tag: string): string;
begin
Result := Format('</%s>', [Tag]);
end;
{ HTMLBuilder }
class function HTMLBuilder.Build: IHTMLBuilder;
begin
Result := HTMLBuilder.Create;
end;
constructor HTMLBuilder.Create;
begin
inherited;
FHead := TDocSection.Create;
FBody := TDocSection.Create;
FLines := TDocSection.Create;
end;
destructor HTMLBuilder.Destroy;
begin
FHead.Free;
FBody.Free;
FLines.Free;
inherited;
end;
function HTMLBuilder.Body(const Value: string): IHTMLBuilder;
begin
FBody.Add(Value);
Result := Self;
end;
function HTMLBuilder.Doc(const Value: string): IHTMLBuilder;
begin
FLines.Add(Value);
Result := Self;
end;
function HTMLBuilder.Head(const Value: string): IHTMLBuilder;
begin
FHead.Add(Value);
Result := Self;
end;
function HTMLBuilder.Body(Lines: TArray<string>): IHTMLBuilder;
begin
FBody.AddStrings(Lines);
Result := Self;
end;
function HTMLBuilder.Doc(Lines: TArray<string>): IHTMLBuilder;
begin
FLines.AddStrings(Lines);
Result := Self;
end;
function HTMLBuilder.Head(Lines: TArray<string>): IHTMLBuilder;
begin
FHead.AddStrings(Lines);
Result := Self;
end;
function HTMLBuilder.Doc(const Tag: string; Lines: TArray<string>): IHTMLBuilder;
begin
FLines.AddTagSection(Tag, Lines);
Result := Self;
end;
function HTMLBuilder.Head(const Tag: string; Lines: TArray<string>): IHTMLBuilder;
begin
FHead.AddTagSection(Tag, Lines);
Result := Self;
end;
function HTMLBuilder.Body(const Tag: string; Lines: TArray<string>): IHTMLBuilder;
begin
FBody.AddTagSection(Tag, Lines);
Result := Self;
end;
function HTMLBuilder.HTML: string;
begin
FLines.Insert(0, '<html>');
if FHead.Count > 0 then
FLines.AddTagSection('head', FHead.ToStringArray);
if FBody.Count > 0 then
FLines.AddTagSection('body', FBody.ToStringArray);
FLines.Add('</html>');
Result := FLines.Text;
end;
function HTMLBuilder.Title(const Value: string): IHTMLBuilder;
begin
Result := Head('title', [Value]);
end;
{ TDocSection }
procedure TDocSection.AddTagSection(const Tag: string; Lines: TArray<string>);
begin
Add(OpenTag(Tag));
AddStrings(Lines);
Add(CloseTag(Tag));
end;
end.