5 uses System.SysUtils, System.Classes, Web.HTTPApp, Web.DSProd, Web.HTTPProd,
6 Web.DBWeb, System.Variants, System.NetEncoding, System.RegularExpressions;
9 TTWebModule1 = class(TWebModule)
10 articles: TDataSetPageProducer;
11 index: TDataSetPageProducer;
12 admin: TDataSetTableProducer;
13 search: TPageProducer;
14 items: TDataSetPageProducer;
17 master: TPageProducer;
18 alert: TDataSetPageProducer;
19 footer: TDataSetPageProducer;
25 header: TDataSetPageProducer;
26 procedure indexHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
27 TagParams: TStrings; var ReplaceText: string);
28 procedure TWebModule1indexpageAction(Sender: TObject; Request: TWebRequest;
29 Response: TWebResponse; var Handled: Boolean);
30 procedure TWebModule1registAction(Sender: TObject; Request: TWebRequest;
31 Response: TWebResponse; var Handled: Boolean);
32 procedure WebModuleCreate(Sender: TObject);
33 procedure TWebModule1adminAction(Sender: TObject; Request: TWebRequest;
34 Response: TWebResponse; var Handled: Boolean);
35 procedure TWebModule1topAction(Sender: TObject; Request: TWebRequest;
36 Response: TWebResponse; var Handled: Boolean);
37 procedure itemsHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
38 TagParams: TStrings; var ReplaceText: string);
39 procedure topHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
40 TagParams: TStrings; var ReplaceText: string);
41 procedure TWebModule1searchAction(Sender: TObject; Request: TWebRequest;
42 Response: TWebResponse; var Handled: Boolean);
43 procedure TWebModule1helpAction(Sender: TObject; Request: TWebRequest;
44 Response: TWebResponse; var Handled: Boolean);
45 procedure searchHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
46 TagParams: TStrings; var ReplaceText: string);
47 procedure masterHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
48 TagParams: TStrings; var ReplaceText: string);
49 procedure articlesHTMLTag(Sender: TObject; Tag: TTag;
50 const TagString: string; TagParams: TStrings; var ReplaceText: string);
51 procedure footerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
52 TagParams: TStrings; var ReplaceText: string);
53 procedure TWebModule1alertAction(Sender: TObject; Request: TWebRequest;
54 Response: TWebResponse; var Handled: Boolean);
55 procedure TWebModule1masterAction(Sender: TObject; Request: TWebRequest;
56 Response: TWebResponse; var Handled: Boolean);
57 procedure mailHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
58 TagParams: TStrings; var ReplaceText: string);
59 procedure alertHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
60 TagParams: TStrings; var ReplaceText: string);
61 procedure TWebModule1deleteAction(Sender: TObject; Request: TWebRequest;
62 Response: TWebResponse; var Handled: Boolean);
63 procedure TWebModule1jumpAction(Sender: TObject; Request: TWebRequest;
64 Response: TWebResponse; var Handled: Boolean);
65 procedure TWebModule1linkAction(Sender: TObject; Request: TWebRequest;
66 Response: TWebResponse; var Handled: Boolean);
67 procedure headerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
68 TagParams: TStrings; var ReplaceText: string);
69 procedure adminFormatCell(Sender: TObject; CellRow, CellColumn: Integer;
70 var BgColor: THTMLBgColor; var Align: THTMLAlign; var VAlign: THTMLVAlign;
71 var CustomAttrs, CellData: string);
72 procedure TWebModule1admdelAction(Sender: TObject; Request: TWebRequest;
73 Response: TWebResponse; var Handled: Boolean);
79 procedure pages(count: Integer; var page: Integer);
85 WebModuleClass: TComponentClass = TTWebModule1;
89 { %CLASSGROUP 'Vcl.Controls.TControl' }
95 procedure TTWebModule1.adminFormatCell(Sender: TObject;
96 CellRow, CellColumn: Integer; var BgColor: THTMLBgColor;
97 var Align: THTMLAlign; var VAlign: THTMLVAlign;
98 var CustomAttrs, CellData: string);
100 if (CellColumn = 0) and (CellRow > 0) then
101 CellData := Format('<input name=check%d type=checkbox>', [CellRow]);
104 procedure TTWebModule1.alertHTMLTag(Sender: TObject; Tag: TTag;
105 const TagString: string; TagParams: TStrings; var ReplaceText: string);
110 if TagString = 'article' then
112 s := TStringList.Create;
114 s.Text := articles.Content;
115 for i := s.count - 1 downto 0 do
116 if Copy(s[i], 1, 18) = '<section id=master' then
121 ReplaceText := s.Text;
128 procedure TTWebModule1.articlesHTMLTag(Sender: TObject; Tag: TTag;
129 const TagString: string; TagParams: TStrings; var ReplaceText: string);
131 if TagString = 'database' then
132 ReplaceText := Request.QueryFields.Values['db']
133 else if TagString = 'comment' then
134 ReplaceText := DataModule1.FDTable2.FieldByName('comment').AsString;
137 procedure TTWebModule1.footerHTMLTag(Sender: TObject; Tag: TTag;
138 const TagString: string; TagParams: TStrings; var ReplaceText: string);
142 if TagString = 'link' then
145 if i = index.Tag then
146 ReplaceText := ReplaceText + ' ' + i.ToString + ' '
148 ReplaceText := ReplaceText +
149 Format(' <a style=text-decoration-line:none href=%s?db=%s&num=%d>%d</a> ',
151 TNetEncoding.URL.Decode(Request.QueryFields.Values['db']), i, i]);
153 else if TagString = 'recent' then
154 if index.Tag = -1 then
155 ReplaceText := TagString
157 ReplaceText := '<a style=text-decoration-line:none href=' +
158 PString(Self.Tag)^ + '?db=' + Request.QueryFields.Values['db'] +
160 else if TagString = 'pathinfo' then
161 ReplaceText := PString(Self.Tag)^;
164 procedure TTWebModule1.headerHTMLTag(Sender: TObject; Tag: TTag;
165 const TagString: string; TagParams: TStrings; var ReplaceText: string);
169 if TagString = 'cookie' then
171 s := TagParams.Values['param'];
172 ReplaceText := TNetEncoding.URL.Decode(Request.CookieFields.Values[s]);
174 else if (TagString = 'check') and (checkbox = true) then
175 ReplaceText := 'checked'
176 else if (TagString = 'raw') and (error <> '') then
177 ReplaceText := DataModule1.FDTable2.FieldByName('raw').AsString;
180 procedure TTWebModule1.indexHTMLTag(Sender: TObject; Tag: TTag;
181 const TagString: string; TagParams: TStrings; var ReplaceText: string);
186 if TagString = 'article' then
188 x := DataModule1.FDTable1.FieldByName('dbnum')
189 .AsInteger = DataModule1.FDTable3.FieldByName('info').AsInteger;
190 for i := 1 to DataModule1.FDTable3.FieldByName('count').AsInteger do
192 if DataModule1.FDTable2.Eof = true then
195 ReplaceText := ReplaceText + articles.Content
197 ReplaceText := articles.Content + ReplaceText;
198 if DataModule1.FDTable2.Eof = false then
199 DataModule1.FDTable2.Next;
202 else if TagString = 'footer' then
203 ReplaceText := footer.Content
204 else if TagString = 'header' then
206 i := DataModule1.FDTable3.FieldByName('count').AsInteger;
207 if 10 * i < DataModule1.FDTable2.RecordCount then
208 ReplaceText := '
\82±
\82ê
\88È
\8fã
\93\8a\8de
\82Å
\82«
\82Ü
\82¹
\82ñ.'
210 ReplaceText := header.Content + error;
212 else if TagString = 'css' then
213 ReplaceText := css2.Content;
216 procedure TTWebModule1.itemsHTMLTag(Sender: TObject; Tag: TTag;
217 const TagString: string; TagParams: TStrings; var ReplaceText: string);
223 if TagString = 'item' then
225 s := TStringList.Create;
227 s.Text := DataModule1.FDTable2.FieldByName('raw').AsString;
228 for i := 0 to s.count - 1 do
229 for j := 0 to ss.count - 1 do
230 if Pos(ss[j], s[i]) > 0 then
232 s[i] := '<p style=background-color:aqua>' + s[i]
234 s[i] := '<p style=background-color:yellow>' + s[i];
235 with DataModule1.FDTable2 do
237 i := FieldByName('dbnum').AsInteger;
238 j := FieldByName('number').AsInteger;
239 str := Request.QueryFields.Values['db'];
241 t := Format('<a href=/index?db=%s&num=%d>[ %d-%d ]</a>',
244 t := Format('<a href=/index?db=%s&num=%d>[ %d ]</a>', [str, j, j]);
246 ReplaceText := t + s.Text;
253 procedure TTWebModule1.masterHTMLTag(Sender: TObject; Tag: TTag;
254 const TagString: string; TagParams: TStrings; var ReplaceText: string);
259 if TagString = 'request' then
260 with DataModule1.FDTable4 do
265 i := FieldByName('dbname').AsInteger;
266 j := FieldByName('posnum').AsInteger;
267 DataModule1.FDTable2.Locate('dbnum;number', VarArrayOf([i, j]), []);
268 s := FieldByName('request').AsString;
269 ReplaceText := ReplaceText + alert.Content + s;
275 procedure TTWebModule1.pages(count: Integer; var page: Integer);
279 max := DataModule1.FDTable3.FieldByName('count').AsInteger;
280 if (page > -1) and (count < max * (page - 1)) then
281 page := (count div max) + 1;
285 DataModule1.FDTable2.Last;
286 DataModule1.FDTable2.MoveBy(1 - max);
289 DataModule1.FDTable2.First;
290 DataModule1.FDTable2.MoveBy(max * (page - 1));
294 procedure TTWebModule1.mailHTMLTag(Sender: TObject; Tag: TTag;
295 const TagString: string; TagParams: TStrings; var ReplaceText: string);
297 if TagString = 'content' then
298 ReplaceText := alert.Content
299 else if TagString = 'query' then
300 ReplaceText := '?' + Request.Query + '#' +
301 Request.QueryFields.Values['num'];
304 procedure TTWebModule1.searchHTMLTag(Sender: TObject; Tag: TTag;
305 const TagString: string; TagParams: TStrings; var ReplaceText: string);
314 DataModule1.FDTable2.First;
315 while DataModule1.FDTable2.Eof = false do
317 s.Text := DataModule1.FDTable2.FieldByName('raw').AsString;
318 ss.DelimitedText := Request.ContentFields.Values['word1'];
319 for j := 0 to ss.count - 1 do
320 for i := 0 to s.count - 1 do
321 if Pos(ss[j], s[i]) > 0 then
324 ReplaceText := ReplaceText + items.Content;
329 if j = ss.count - 1 then
331 ReplaceText := ReplaceText + items.Content;
337 else if i = s.count - 1 then
340 DataModule1.FDTable2.Next;
345 if (Request.MethodType = mtPost) and (TagString = 'items') then
347 if Request.ContentFields.Values['type'] = 'OR' then
351 s := TStringList.Create;
352 ss := TStringList.Create;
355 ss.StrictDelimiter := false;
356 if Request.QueryFields.Values['db'] = '' then
358 DataModule1.FDTable1.First;
359 while DataModule1.FDTable1.Eof = false do
362 DataModule1.FDTable1.Next;
372 else if TagString = 'query' then
374 ReplaceText := Request.Query;
375 if ReplaceText <> '' then
376 ReplaceText := '?' + ReplaceText;
378 else if TagString = 'css' then
379 ReplaceText := css2.Content;
382 procedure TTWebModule1.topHTMLTag(Sender: TObject; Tag: TTag;
383 const TagString: string; TagParams: TStrings; var ReplaceText: string);
388 if TagString = 'list' then
390 DataModule1.FDTable1.First;
391 i := DataModule1.FDTable3.FieldByName('info').AsInteger;
392 while DataModule1.FDTable1.Eof = false do
395 if i = DataModule1.FDTable1.FieldByName('dbnum').AsInteger then
397 DataModule1.FDTable1.Next;
400 s := DataModule1.FDTable1.FieldByName('database').AsString;
401 DataModule1.FDTable2.Last;
402 if Now - DataModule1.FDTable2.FieldByName('date').AsDateTime < 1 then
403 t := 'background-color:aqua;';
404 if DataModule1.FDTable2.RecordCount >= 10 *
405 DataModule1.FDTable3.FieldByName('count').AsInteger then
406 t := t + 'color:red;';
409 ReplaceText := ReplaceText +
410 Format('<p%s><a target=_blank href=%s>%s</a><br></p>',
411 [t, '/index?db=' + s, s]);
412 DataModule1.FDTable1.Next;
415 else if TagString = 'info' then
416 ReplaceText := DataModule1.FDTable1.Lookup('dbnum',
417 DataModule1.FDTable3.FieldByName('info').AsInteger, 'database')
418 else if TagString = 'css' then
419 case TagParams.Values['id'].ToInteger of
421 ReplaceText := css1.Content;
423 ReplaceText := css3.Content;
427 procedure TTWebModule1.TWebModule1admdelAction(Sender: TObject;
428 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
435 DataModule1.FDTable2.RecNo := admin.Tag;
436 for i := 0 to Request.ContentFields.count - 1 do
438 reg := TRegEx.Create('\d+');
439 match := reg.match(Request.ContentFields[i]);
440 if match.Success = true then
442 k := match.Value.ToInteger - j - 1;
443 j := match.Value.ToInteger;
445 DataModule1.FDTable2.Next;
446 DataModule1.FDTable2.Delete;
449 Response.SendRedirect('/admin?db=' + TNetEncoding.URL.Encode
450 (DataModule1.FDTable1.FieldByName('database').AsString));
453 procedure TTWebModule1.TWebModule1adminAction(Sender: TObject;
454 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
459 s := TNetEncoding.URL.Decode(Request.QueryFields.Values['db']);
460 DataModule1.FDTable1.Locate('database', s, []);
461 s := Request.QueryFields.Values['num'];
462 max := DataModule1.FDTable3.FieldByName('count').AsInteger;
466 index.Tag := s.ToInteger;
467 DataModule1.FDTable2.RecNo := (index.Tag - 1) * max - 1;
470 with DataModule1.FDTable2 do
471 RecNo := 1 + RecordCount - RecordCount mod max;
473 footer.Tag := Integer(@s);
474 if admin.Tag = -1 then
476 ss := TStringList.Create;
478 ss.Assign(admin.footer);
479 ss.Insert(2, footer.HTMLDoc.Text);
480 admin.footer.Text := footer.ContentFromString(ss.Text);
485 i := DataModule1.FDTable2.RecNo;
489 Response.ContentType := 'text/html;charset=utf-8';
490 Response.Content := admin.Content;
493 procedure TTWebModule1.TWebModule1alertAction(Sender: TObject;
494 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
499 s := Request.QueryFields.Values['db'];
500 num1 := DataModule1.FDTable1.Lookup('database', s, 'dbnum');
501 num2 := Request.QueryFields.Values['num'].ToInteger;
502 if Request.MethodType = mtGet then
504 DataModule1.FDTable2.Locate('number', num2, []);
505 Response.ContentType := 'text/html;charset=utf-8';
506 Response.Content := mail.Content;
510 DataModule1.FDTable4.AppendRecord
511 ([num1, num2, Now, Request.ContentFields.Values['request']]);
512 Response.SendRedirect(Format('/index?db=%s&num=%d#%d', [s, Tag, num2]));
516 procedure TTWebModule1.TWebModule1deleteAction(Sender: TObject;
517 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
522 s := Request.QueryFields.Values['number'];
526 s := Request.QueryFields.Values['password'];
527 with DataModule1.FDTable2 do
528 if Locate('number;password', VarArrayOf([num, s])) = true then
531 FieldByName('title').AsString := '';
532 FieldByName('name').AsString;
533 FieldByName('comment').AsString := '<em>
\93\8a\8de
\8eÒ
\82É
\82æ
\82è
\8dí
\8f\9c\82³
\82ê
\82Ü
\82µ
\82½.</em>';
534 FieldByName('raw').AsString := '';
535 FieldByName('date').AsDateTime := Now;
540 procedure TTWebModule1.TWebModule1helpAction(Sender: TObject;
541 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
546 Response.ContentType := 'text/html;charset=utf-8';
547 if Request.MethodType = mtPost then
549 i := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;;
550 j := DataModule1.FDTable2.FieldByName('number').AsInteger;
551 s := Request.ContentFields.Values['help'];
552 DataModule1.FDTable4.AppendRecord([i, j, s]);
554 Response.Content := help.Content;
557 procedure TTWebModule1.TWebModule1indexpageAction(Sender: TObject;
558 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
563 DataModule1.FDTable1.Locate('database', Request.QueryFields.Values['db'], []);
564 int := StrToIntDef(Request.QueryFields.Values['num'], -1);
565 pages(DataModule1.FDTable2.RecordCount, int);
568 Self.Tag := Integer(@s);
569 Response.ContentType := 'text/html; charset="utf-8"';
570 if DataModule1.FDTable3.FieldByName('mente').AsBoolean = true then
571 Response.Content := '
\82½
\82¾
\82¢
\82Ü
\83\81\83\93\83e
\83i
\83\93\83X
\92\86\82Å
\82·^_^'
573 Response.Content := index.Content;
576 procedure TTWebModule1.TWebModule1jumpAction(Sender: TObject;
577 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
582 db := DataModule1.FDTable1.FieldByName('database').AsString;
583 s := Request.ContentFields.Values['num'];
586 Response.ContentType := 'text/html;charset=utf-8';
587 Response.Content := '<a href=/index?db=' + db + '>
\96ß
\82é</a>';
590 DataModule1.FDTable2.Locate('number', s.ToInteger, []);
592 pages(DataModule1.FDTable2.RecNo, page);
593 Response.SendRedirect(Format('/index?db=%s&num=%d#%s',
594 [TNetEncoding.URL.Encode(db), page, s]));
597 procedure TTWebModule1.TWebModule1linkAction(Sender: TObject;
598 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
603 s := Request.QueryFields.Values['num'];
607 if DataModule1.FDTable2.Locate('number', num, []) = true then
609 Response.ContentType := 'text/html;charset=utf-8';
610 Response.Content := articles.Content;
614 procedure TTWebModule1.TWebModule1masterAction(Sender: TObject;
615 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
617 Response.ContentType := 'text/html;charset=utf-8';
618 Response.Content := master.Content;
621 procedure TTWebModule1.TWebModule1registAction(Sender: TObject;
622 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
625 title, na, raw, pass, kotoba, db: string;
626 comment: TStringList;
628 function scan(Text: string): string;
631 coll: TMatchCollection;
635 Text := TNetEncoding.HTML.Encode(Text);
636 s := TNetEncoding.HTML.Encode('>>');
637 reg := TRegEx.Create(s + '(\d+)');
638 coll := reg.Matches(Text);
639 for j := coll.count - 1 downto 0 do
641 Delete(Text, coll[i].index, coll[i].Length);
642 s := Copy(coll[j].Value, Length(s) + 1, coll[j].Length);
644 ('<a class=minpreview data-preview-url=/link?num=%s href=/jump?num=%s>>>%s</a>',
646 Insert(result, Text, coll[j].index);
653 db := Request.QueryFields.Values['db'];
654 kotoba := Request.ContentFields.Values['aikotoba'];
655 if kotoba <> '
\82°
\82ñ
\82«' then
656 error := '<section style=color:red><p>
\8d\87\8c¾
\97t
\82ª
\82¿
\82ª
\82¢
\82Ü
\82·.';
657 DataModule1.FDTable1.Locate('database', na, []);
658 with DataModule1.FDTable2 do
661 number := FieldByName('number').AsInteger + 1;
663 with Request.ContentFields do
665 na := Values['name'];
666 raw := Values['comment'];
667 pass := Values['password'];
669 with Response.Cookies.Add do
676 with Response.Cookies.Add do
682 comment := TStringList.Create;
685 for i := 0 to comment.count - 1 do
687 if Pos('ng', comment[i]) > 0 then
689 error := error + '<p>
\8bÖ
\8e~
\8cê
\8bå
\82ª
\8aÜ
\82Ü
\82ê
\82Ä
\82¢
\82Ü
\82·.';
692 comment[i] := '<p>' + scan(comment[i]);
695 error := error + '</section>'
696 else if Request.ContentFields.Values['show'] = 'true' then
698 error := '<p style=font-size:2.3em;color:blue>
\81«
\81«
\83v
\83\8c\83r
\83\85\81[
\81«
\81«<p>' +
704 i := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
705 DataModule1.FDTable2.AppendRecord([i, number, title, na, comment.Text,
712 TWebModule1indexpageAction(Sender, Request, Response, Handled);
715 procedure TTWebModule1.TWebModule1searchAction(Sender: TObject;
716 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
718 Response.ContentType := 'text/html;charset=utf-8';
719 Response.Content := search.Content;
722 procedure TTWebModule1.TWebModule1topAction(Sender: TObject;
723 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
725 Response.ContentType := 'text/html;charset=utf-8';
726 Response.Content := top.Content;
729 procedure TTWebModule1.WebModuleCreate(Sender: TObject);
734 if DataModule1.FDTable1.Bof and DataModule1.FDTable1.Eof then
736 DataModule1.FDTable1.AppendRecord([0, 'info']);
738 DataModule1.FDTable1.AppendRecord([i, '
\8cf
\8e¦
\94Â' + i.ToString]);
740 if DataModule1.FDTable3.Bof and DataModule1.FDTable3.Eof then
742 a := DataModule1.FDTable1.Lookup('database', 'info', 'dbnum');
743 DataModule1.FDTable3.AppendRecord
744 (['
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86', '<p style=font-color:gray>
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86</p>', false, a, 30]);