5 uses System.SysUtils, System.Classes, Web.HTTPApp, Web.DSProd, Web.HTTPProd,
6 Web.DBWeb, System.Variants, System.NetEncoding, System.RegularExpressions,
7 Data.DB, Web.DBXpressWeb, System.Types, FireDAC.Stan.Intf,
8 FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
9 FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
10 FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.UI.Intf, FireDAC.Stan.Def,
11 FireDAC.Stan.Pool, FireDAC.Phys, FireDAC.Phys.FB, FireDAC.Phys.FBDef,
12 FireDAC.Phys.MySQL, FireDAC.Phys.MySQLDef, FireDAC.VCLUI.Wait,
16 TWebModule1 = class(TWebModule)
17 articles: TDataSetPageProducer;
18 index: TDataSetPageProducer;
19 admin: TDataSetTableProducer;
20 search: TPageProducer;
21 items: TDataSetPageProducer;
24 master: TPageProducer;
25 alert: TDataSetPageProducer;
31 header: TDataSetPageProducer;
36 adhead: TPageProducer;
39 ti: TDataSetPageProducer;
41 FDTable2DBNUM: TIntegerField;
42 FDTable2NUMBER: TIntegerField;
43 FDTable2TITLE: TWideStringField;
44 FDTable2NAME: TWideStringField;
45 FDTable2COMMENT: TWideMemoField;
46 FDTable2RAW: TWideMemoField;
47 FDTable2DATE: TDateField;
48 FDTable2PASS: TWideStringField;
51 FDTable4ID: TIntegerField;
52 FDTable4DBNAME: TIntegerField;
53 FDTable4POSNUM: TIntegerField;
54 FDTable4DATE: TDateField;
55 FDTable4REQUEST: TWideMemoField;
56 DataSource1: TDataSource;
58 FDTable3TITLE: TWideStringField;
59 FDTable3TITLE2: TWideStringField;
60 FDTable3INFO: TIntegerField;
61 FDTable3COUNT: TIntegerField;
62 FDTable3password: TWideStringField;
63 FDTable3ng: TWideStringField;
64 FDConnection1: TFDConnection;
66 FDTable1DBNUM: TIntegerField;
67 FDTable1DATABASE: TWideStringField;
68 FDTable5ID: TIntegerField;
69 FDTable5NAME: TWideStringField;
70 FDTable5SOURCE: TBlobField;
72 footer: TPageProducer;
73 FDGUIxWaitCursor1: TFDGUIxWaitCursor;
75 FDTable3mente: TSmallintField;
76 procedure indexHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
77 TagParams: TStrings; var ReplaceText: string);
78 procedure WebModule1indexpageAction(Sender: TObject; Request: TWebRequest;
79 Response: TWebResponse; var Handled: Boolean);
80 procedure WebModule1registAction(Sender: TObject; Request: TWebRequest;
81 Response: TWebResponse; var Handled: Boolean);
82 procedure WebModuleCreate(Sender: TObject);
83 procedure WebModule1adminAction(Sender: TObject; Request: TWebRequest;
84 Response: TWebResponse; var Handled: Boolean);
85 procedure WebModule1topAction(Sender: TObject; Request: TWebRequest;
86 Response: TWebResponse; var Handled: Boolean);
87 procedure itemsHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
88 TagParams: TStrings; var ReplaceText: string);
89 procedure topHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
90 TagParams: TStrings; var ReplaceText: string);
91 procedure WebModule1searchAction(Sender: TObject; Request: TWebRequest;
92 Response: TWebResponse; var Handled: Boolean);
93 procedure WebModule1helpAction(Sender: TObject; Request: TWebRequest;
94 Response: TWebResponse; var Handled: Boolean);
95 procedure searchHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
96 TagParams: TStrings; var ReplaceText: string);
97 procedure masterHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
98 TagParams: TStrings; var ReplaceText: string);
99 procedure articlesHTMLTag(Sender: TObject; Tag: TTag;
100 const TagString: string; TagParams: TStrings; var ReplaceText: string);
101 procedure footerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
102 TagParams: TStrings; var ReplaceText: string);
103 procedure WebModule1alertAction(Sender: TObject; Request: TWebRequest;
104 Response: TWebResponse; var Handled: Boolean);
105 procedure WebModule1masterAction(Sender: TObject; Request: TWebRequest;
106 Response: TWebResponse; var Handled: Boolean);
107 procedure mailHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
108 TagParams: TStrings; var ReplaceText: string);
109 procedure alertHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
110 TagParams: TStrings; var ReplaceText: string);
111 procedure WebModule1deleteAction(Sender: TObject; Request: TWebRequest;
112 Response: TWebResponse; var Handled: Boolean);
113 procedure WebModule1jumpAction(Sender: TObject; Request: TWebRequest;
114 Response: TWebResponse; var Handled: Boolean);
115 procedure WebModule1linkAction(Sender: TObject; Request: TWebRequest;
116 Response: TWebResponse; var Handled: Boolean);
117 procedure headerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
118 TagParams: TStrings; var ReplaceText: string);
119 procedure adminFormatCell(Sender: TObject; CellRow, CellColumn: Integer;
120 var BgColor: THTMLBgColor; var Align: THTMLAlign; var VAlign: THTMLVAlign;
121 var CustomAttrs, CellData: string);
122 procedure WebModule1admdelAction(Sender: TObject; Request: TWebRequest;
123 Response: TWebResponse; var Handled: Boolean);
124 procedure WebModule1loginAction(Sender: TObject; Request: TWebRequest;
125 Response: TWebResponse; var Handled: Boolean);
126 procedure WebModule1adminsetAction(Sender: TObject; Request: TWebRequest;
127 Response: TWebResponse; var Handled: Boolean);
128 procedure adheadHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
129 TagParams: TStrings; var ReplaceText: string);
130 procedure WebModule1logoutAction(Sender: TObject; Request: TWebRequest;
131 Response: TWebResponse; var Handled: Boolean);
132 procedure WebModule1imgAction(Sender: TObject; Request: TWebRequest;
133 Response: TWebResponse; var Handled: Boolean);
134 procedure WebModule1fileAction(Sender: TObject; Request: TWebRequest;
135 Response: TWebResponse; var Handled: Boolean);
136 procedure titleHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
137 TagParams: TStrings; var ReplaceText: string);
138 procedure WebModule1titleAction(Sender: TObject; Request: TWebRequest;
139 Response: TWebResponse; var Handled: Boolean);
140 procedure tiHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
141 TagParams: TStrings; var ReplaceText: string);
142 procedure helpHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
143 TagParams: TStrings; var ReplaceText: string);
144 procedure loginHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
145 TagParams: TStrings; var ReplaceText: string);
146 procedure css1HTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
147 TagParams: TStrings; var ReplaceText: string);
148 procedure WebModule1usrdelAction(Sender: TObject; Request: TWebRequest;
149 Response: TWebResponse; var Handled: Boolean);
154 procedure pages(count: Integer; var page: Integer);
155 procedure strsCheck(var Error: string; list: TStringList);
156 procedure setLastArticle;
157 function isInfo: Boolean;
158 function loginCheck: Boolean;
159 function hash(str: string): string;
160 function mente: Boolean;
161 function detail(ts, pid: string): string;
162 function scan(text: string): string;
168 WebModuleClass: TComponentClass = TWebModule1;
172 { %CLASSGROUP 'Vcl.Controls.TControl' }
174 uses IdHashSHA, IdGlobal, IdHash, IdHashMessageDigest, Jpeg, Graphics;
179 promotion = '
\8dL
\8d\90:';
182 procedure TWebModule1.adheadHTMLTag(Sender: TObject; Tag: TTag;
183 const TagString: string; TagParams: TStrings; var ReplaceText: string);
185 if TagString = 'pr' then
186 ReplaceText := promotion
187 else if TagString = 'uri' then
188 ReplaceText := Request.ScriptName
189 else if (TagString = 'mente') and (FDTable3.FieldByName('mente').AsInteger = 1)
191 ReplaceText := 'checked="checked"'
192 else if TagString = 'database' then
193 ReplaceText := Request.QueryFields.Values['db'];
196 procedure TWebModule1.adminFormatCell(Sender: TObject;
197 CellRow, CellColumn: Integer; var BgColor: THTMLBgColor;
198 var Align: THTMLAlign; var VAlign: THTMLVAlign;
199 var CustomAttrs, CellData: string);
205 CellData := Format('<input name=check%d type=checkbox>', [CellRow]);
207 CellData := '<b>' + CellData + '</b>';
209 CellData := '<p style=color:red>' + CellData + '</p>';
211 CellData := '<p style=color:green>' + CellData + '</p>';
215 procedure TWebModule1.alertHTMLTag(Sender: TObject; Tag: TTag;
216 const TagString: string; TagParams: TStrings; var ReplaceText: string);
221 if (TagString = 'plus') and (alert.Tag = 0) then
222 ReplaceText := '<a href=' + Request.ScriptName +
223 '/jump?db=<#dbname>&num=<#posnum>>[ <#dbname>-<#posnum> ]</a>'
224 else if TagString = 'article' then
226 if alert.Tag = 1 then
228 ReplaceText := '<p>
\83\8a\83N
\83G
\83X
\83g';
231 s := TStringList.Create;
233 s.text := articles.Content;
236 for i := s.count - 1 downto 0 do
237 if Copy(s[i], 1, 18) = '<section id=master' then
242 ReplaceText := s.text;
249 procedure TWebModule1.articlesHTMLTag(Sender: TObject; Tag: TTag;
250 const TagString: string; TagParams: TStrings; var ReplaceText: string);
252 if TagString = 'uri' then
253 ReplaceText := Request.ScriptName
254 else if TagString = 'comment' then
255 ReplaceText := FDTable2.FieldByName('comment').AsString;
258 procedure TWebModule1.css1HTMLTag(Sender: TObject; Tag: TTag;
259 const TagString: string; TagParams: TStrings; var ReplaceText: string);
261 if TagString = 'uri' then
262 ReplaceText := Request.ScriptName;
265 function TWebModule1.detail(ts, pid: string): string;
269 for i := 0 to ComponentCount - 1 do
270 if Components[i].Name = ts + pid then
271 result := (Components[i] as TPageProducer).Content;
274 procedure TWebModule1.footerHTMLTag(Sender: TObject; Tag: TTag;
275 const TagString: string; TagParams: TStrings; var ReplaceText: string);
279 if TagString = 'link' then
282 if i = index.Tag then
283 ReplaceText := ReplaceText + ' ' + i.ToString + ' '
285 ReplaceText := ReplaceText +
286 Format(' <a style=text-decoration-line:none href="%s?db=%d&num=%d">%d</a> ',
287 [Request.ScriptName + PString(Self.Tag)^,
288 FDTable1.FieldByName('dbnum').AsInteger, i, i]);
290 else if TagString = 'recent' then
291 if index.Tag = -1 then
292 ReplaceText := TagString
294 ReplaceText := '<a style=text-decoration-line:none href="' +
295 Request.ScriptName + PString(Self.Tag)^ + '?db=' +
296 FDTable1.FieldByName('dbnum').AsString + '">recent</a>';
299 function TWebModule1.hash(str: string): string;
301 with TIdHashSHA1.Create do
304 result := HashStringAsHex(str);
311 procedure TWebModule1.headerHTMLTag(Sender: TObject; Tag: TTag;
312 const TagString: string; TagParams: TStrings; var ReplaceText: string);
316 if TagString = 'uri' then
317 ReplaceText := Request.ScriptName
318 else if TagString = 'cookie' then
320 s := TagParams.Values['param'];
321 ReplaceText := TNetEncoding.URL.Decode(Request.CookieFields.Values[s]);
323 else if (TagString = 'check') and
324 (Request.ContentFields.Values['show'] <> 'false') then
325 ReplaceText := 'checked'
326 else if TagString = 'preview' then
327 ReplaceText := Request.ContentFields.Values['preview']
328 else if TagString = 'raw' then
329 ReplaceText := Request.ContentFields.Values['raw']
330 else if TagString = 'pass' then
331 ReplaceText := Request.ContentFields.Values['password']
332 else if TagString = 'title' then
333 ReplaceText := Request.ContentFields.Values['title'];
336 procedure TWebModule1.helpHTMLTag(Sender: TObject; Tag: TTag;
337 const TagString: string; TagParams: TStrings; var ReplaceText: string);
339 if TagString = 'pr' then
340 ReplaceText := promotion
341 else if TagString = 'uri' then
342 ReplaceText := Request.ScriptName
343 else if TagString = 'area' then
346 ss := TStringList.Create;
348 ss.Add('<form action=' + Request.ScriptName +
349 '/help method=post><p>
\82¨
\96â
\82¢
\8d\87\82í
\82¹<
\8dí
\8f\9c\88Ë
\97\8a\82È
\82Ç
\89½
\82Å
\82à></p>');
350 ss.Add('<textarea name=help style=height:100px;width:250px>
\93\8a\8de
\8eÒ
\96¼
\82È
\82Ç
\81F');
351 ss.Add('
\91\8a\92k
\93à
\97e
\81F');
352 ss.Add('
\82»
\82Ì
\91¼
\81F</textarea><br>');
353 ss.Add('<input type=submit value="
\91\97\90M"></form>');
354 ReplaceText := ss.text;
361 '<p style=color:yellow;background-color:aqua>
\82²
\95ñ
\8d\90\82 \82è
\82ª
\82Æ
\82¤
\82²
\82´
\82¢
\82Ü
\82·.';
364 procedure TWebModule1.indexHTMLTag(Sender: TObject; Tag: TTag;
365 const TagString: string; TagParams: TStrings; var ReplaceText: string);
369 if TagString = 'pr' then
370 ReplaceText := promotion
371 else if TagString = 'uri' then
372 ReplaceText := Request.ScriptName
373 else if TagString = 'article' then
375 for i := 1 to FDTable3.FieldByName('count').AsInteger do
377 if FDTable2.Eof = true then
379 if isInfo = false then
380 ReplaceText := ReplaceText + articles.Content
382 ReplaceText := articles.Content + ReplaceText;
386 else if TagString = 'footer' then
387 ReplaceText := footer.Content
388 else if TagString = 'header' then
389 if (FDTable1.FieldByName('dbnum').AsInteger = FDTable3.FieldByName('info')
390 .AsInteger) and (loginCheck = false) then
391 ReplaceText := '<h1 style=text-align:center>
\8aÇ
\97\9d\90l
\82©
\82ç
\82¨
\92m
\82ç
\82¹
\82ª
\82 \82è
\82Ü
\82·.</h1>'
394 i := FDTable3.FieldByName('count').AsInteger;
395 if 10 * i <= FDTable2.RecordCount then
396 ReplaceText := '<h1>
\82±
\82ê
\88È
\8fã
\93\8a\8de
\82Å
\82«
\82Ü
\82¹
\82ñ.</h1>'
398 ReplaceText := header.Content;
400 else if (TagString = 'css') or (TagString = 'js') then
401 ReplaceText := detail(TagString, TagParams.Values['id'])
402 else if TagString = 'dbnum' then
403 ReplaceText := FDTable1.FieldByName('dbnum').AsString
404 else if TagString = 'database' then
405 ReplaceText := FDTable1.FieldByName('database').AsString;
408 function TWebModule1.isInfo: Boolean;
410 result := FDTable1.FieldByName('dbnum').AsInteger = FDTable3.FieldByName
414 procedure TWebModule1.itemsHTMLTag(Sender: TObject; Tag: TTag;
415 const TagString: string; TagParams: TStrings; var ReplaceText: string);
421 if TagString = 'item' then
423 s := TStringList.Create;
425 s.text := FDTable2.FieldByName('raw').AsString;
426 for i := 0 to s.count - 1 do
427 for j := 0 to ss.count - 1 do
428 if Pos(ss[j], s[i]) > 0 then
430 s[i] := '<p style=background-color:aqua>' + s[i]
432 s[i] := '<p style=background-color:yellow>' + s[i];
435 i := FieldByName('dbnum').AsInteger;
436 j := FieldByName('number').AsInteger;
437 str := Request.QueryFields.Values['db'];
439 t := Format('<a href="%s/jump?db=%d&num=%d">[ %d-%d ]</a>',
440 [Request.ScriptName, i, j, i, j])
442 t := Format('<a href="%s/jump?db=%s&num=%d">[ %d ]</a>',
443 [Request.ScriptName, str, j, j]);
445 ReplaceText := t + s.text;
452 function TWebModule1.loginCheck: Boolean;
454 result := hash(Request.CookieFields.Values['user']) = FDTable3.FieldByName
455 ('password').AsString;
458 procedure TWebModule1.loginHTMLTag(Sender: TObject; Tag: TTag;
459 const TagString: string; TagParams: TStrings; var ReplaceText: string);
463 if TagString = 'pr' then
464 ReplaceText := promotion
465 else if TagString = 'uri' then
466 ReplaceText := Request.ScriptName
467 else if TagString = 'database' then
469 i := StrToIntDef(Request.QueryFields.Values['db'],
470 FDTable3.FieldByName('info').AsInteger);
471 if FDTable1.Locate('dbnum', i) = true then
472 ReplaceText := FDTable1.FieldByName('database').AsString;
476 procedure TWebModule1.masterHTMLTag(Sender: TObject; Tag: TTag;
477 const TagString: string; TagParams: TStrings; var ReplaceText: string);
481 if TagString = 'pr' then
482 ReplaceText := promotion
483 else if TagString = 'uri' then
484 ReplaceText := Request.ScriptName
485 else if TagString = 'request' then
493 i := FieldByName('dbname').AsInteger;
494 j := FieldByName('posnum').AsInteger;
495 if FDTable2.Locate('dbnum;number', VarArrayOf([i, j])) = true then
499 ReplaceText := ReplaceText + alert.ContentFromString(alert.Content);
502 if ReplaceText <> '' then
503 ReplaceText := '<table border=1 align=center>' + ReplaceText +
511 function TWebModule1.mente: Boolean;
515 if FDTable3.FieldByName('mente').AsInteger = 1 then
517 s := Request.QueryFields.Values['db'];
522 '<p><br><h1 style=text-align:center>
\82½
\82¾
\82¢
\82Ü
\83\81\83\93\83e
\83i
\83\93\83X
\92\86\82Å
\82·^_^</h1>' +
523 Format('<p style=text-align:center><a href=%s/admin%s>
\8aÇ
\97\9d\8eÒ
\97p
\83\8d\83O
\83C
\83\93</a>',
524 [Request.ScriptName, s]);
530 procedure TWebModule1.pages(count: Integer; var page: Integer);
534 max := FDTable3.FieldByName('count').AsInteger;
535 if (page > -1) and (count < max * (page - 1)) then
537 page := (count div max) + 1;
538 if count mod max = 0 then
545 FDTable2.MoveBy(1 - max);
549 FDTable2.MoveBy(max * (page - 1));
553 procedure TWebModule1.mailHTMLTag(Sender: TObject; Tag: TTag;
554 const TagString: string; TagParams: TStrings; var ReplaceText: string);
556 if TagString = 'pr' then
557 ReplaceText := promotion
558 else if TagString = 'uri' then
559 ReplaceText := Request.ScriptName
560 else if TagString = 'content' then
561 ReplaceText := articles.Content
562 else if TagString = 'query' then
563 ReplaceText := '?' + Request.Query
564 else if TagString = 'number' then
565 ReplaceText := Request.QueryFields.Values['num'];
568 function TWebModule1.scan(text: string): string;
571 coll: TMatchCollection;
575 i := Request.QueryFields.Values['db'].ToInteger;
576 s := Request.ScriptName;
577 text := TNetEncoding.HTML.Encode(text);
578 str := TNetEncoding.HTML.Encode('>>');
579 reg := TRegEx.Create(str + '(\d+)');
580 coll := reg.Matches(text);
581 for j := coll.count - 1 downto 0 do
583 Delete(text, coll[j].index, coll[j].Length);
584 t := Copy(coll[j].Value, Length(str) + 1, coll[j].Length);
586 ('<a class=minpreview data-preview-url=%s/link?db=%d&num=%s href=%s/jump?db=%d&num=%s>>>%s</a>',
587 [s, i, t, s, i, t, t]);
588 Insert(result, text, coll[j].index);
593 procedure TWebModule1.searchHTMLTag(Sender: TObject; Tag: TTag;
594 const TagString: string; TagParams: TStrings; var ReplaceText: string);
605 while FDTable2.Eof = false do
607 s.text := FDTable2.FieldByName('raw').AsString;
608 ss.DelimitedText := Request.ContentFields.Values['word1'];
609 for j := 0 to ss.count - 1 do
610 for i := 0 to s.count - 1 do
611 if Pos(ss[j], s[i]) > 0 then
614 ReplaceText := ReplaceText + items.Content;
619 if j = ss.count - 1 then
621 ReplaceText := ReplaceText + items.Content;
627 else if i = s.count - 1 then
635 if TagString = 'pr' then
636 ReplaceText := promotion
637 else if TagString = 'uri' then
638 ReplaceText := Request.ScriptName
639 else if TagString = 'select' then
641 str := Request.QueryFields.Values['db'];
643 ReplaceText := Request.ScriptName + '/'
645 ReplaceText := Request.ScriptName + '/index?db=' + str;
647 else if (Request.MethodType = mtPost) and (TagString = 'items') then
649 if Request.ContentFields.Values['type'] = 'OR' then
653 s := TStringList.Create;
654 ss := TStringList.Create;
657 ss.StrictDelimiter := false;
658 if Request.QueryFields.Values['db'] = '' then
661 while FDTable1.Eof = false do
674 else if TagString = 'query' then
676 ReplaceText := Request.Query;
677 if ReplaceText <> '' then
678 ReplaceText := '?' + ReplaceText;
680 else if TagString = 'css' then
681 ReplaceText := css2.Content
682 else if TagString = 'dbnum' then
683 ReplaceText := Request.QueryFields.Values['dbnum'];
686 procedure TWebModule1.setLastArticle;
691 procedure TWebModule1.strsCheck(var Error: string; list: TStringList);
698 s := TStringList.Create;
700 s.DelimitedText := FDTable3.FieldByName('ng').AsString;
701 for i := 0 to s.count - 1 do
702 for j := 0 to list.count - 1 do
703 if Pos(s[i], list[j]) > 0 then
708 for i := 0 to list.count - 1 do
709 list[i] := '<p>' + scan(list[i]);
714 Error := Error + '<p>
\8bÖ
\8e~
\8cê
\8bå
\82ª
\8aÜ
\82Ü
\82ê
\82Ä
\82¢
\82Ü
\82·.';
717 procedure TWebModule1.tiHTMLTag(Sender: TObject; Tag: TTag;
718 const TagString: string; TagParams: TStrings; var ReplaceText: string);
720 if TagString = 'uri' then
721 ReplaceText := Request.ScriptName
722 else if TagString = 'count' then
723 ReplaceText := FDTable2.RecordCount.ToString
724 else if TagString = 'database' then
725 ReplaceText := FDTable1.FieldByName('database').AsString
726 else if TagString = 'date' then
727 ReplaceText := FDQuery1.FieldByName('max(date)').AsString;
730 procedure TWebModule1.titleHTMLTag(Sender: TObject; Tag: TTag;
731 const TagString: string; TagParams: TStrings; var ReplaceText: string);
733 if TagString = 'pr' then
734 ReplaceText := promotion
735 else if TagString = 'uri' then
736 ReplaceText := Request.ScriptName
737 else if TagString = 'js' then
738 ReplaceText := detail(TagString, TagParams.Values['id'])
739 else if TagString = 'main' then
742 while FDQuery1.Eof = false do
744 FDTable1.Locate('dbnum', FDQuery1.FieldByName('dbnum').AsInteger);
745 ReplaceText := ReplaceText + ti.Content;
752 procedure TWebModule1.topHTMLTag(Sender: TObject; Tag: TTag;
753 const TagString: string; TagParams: TStrings; var ReplaceText: string);
758 if TagString = 'pr' then
759 ReplaceText := promotion
760 else if TagString = 'uri' then
761 ReplaceText := Request.ScriptName
762 else if TagString = 'list' then
764 i := FDTable3.FieldByName('info').AsInteger;
765 for k := 0 to tcnt do
767 if FDTable1.Eof = true then
770 j := FDTable1.FieldByName('dbnum').AsInteger;
771 s := FDTable1.FieldByName('database').AsString;
772 if (i = j) or (s = 'master') then
778 if (Now - FDTable2.FieldByName('date').AsDateTime < 1) and
779 (FDTable2.RecordCount > 0) then
780 t := 'background-color:aqua;';
781 if FDTable2.RecordCount >= 10 * FDTable3.FieldByName('count').AsInteger
783 t := t + 'color:red;';
786 ReplaceText := ReplaceText +
787 Format('<p><a%s target=_blank href="%s/index?db=%d">%s</a><br></p>',
788 [t, Request.ScriptName, j, s]);
792 else if TagString = 'info' then
793 ReplaceText := FDTable1.Lookup('dbnum', FDTable3.FieldByName('info')
794 .AsInteger, 'database')
795 else if TagString = 'dbnum' then
796 ReplaceText := FDTable3.FieldByName('info').AsString
797 else if (TagString = 'css') or (TagString = 'js') then
798 ReplaceText := detail(TagString, TagParams.Values['id'])
799 else if TagString = 'slide' then
801 for i := 1 to (FDTable1.RecordCount div tcnt) + 1 do
802 ReplaceText := ReplaceText +
803 Format('<div class="slide"><img src="%s/src?name=slide%d.jpg"',
804 [Request.ScriptName, i]) +
805 ' style=float:right;height:465px><#list></div>';
809 procedure TWebModule1.WebModule1admdelAction(Sender: TObject;
810 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
817 FDTable1.Locate('dbnum', Request.QueryFields.Values['db']);
818 for i := 0 to Request.ContentFields.count - 1 do
820 reg := TRegEx.Create('\d+');
821 match := reg.match(Request.ContentFields[i]);
822 if match.Success = true then
824 k := match.Value.ToInteger - j - 1;
825 j := match.Value.ToInteger;
831 WebModule1adminAction(nil, Request, Response, Handled);
834 procedure TWebModule1.WebModule1adminAction(Sender: TObject;
835 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
840 s := Request.CookieFields.Values['user'];
841 if (s = '') or (loginCheck = false) then
843 WebModule1loginAction(nil, Request, Response, Handled);
846 admin.MaxRows := FDTable3.FieldByName('count').AsInteger;
847 t := Request.QueryFields.Values['db'];
849 FDTable1.Locate('dbnum', t, []);
850 s := Request.QueryFields.Values['num'];
851 i := StrToIntDef(s, -1);
852 pages(FDTable2.RecordCount, i);
855 Self.Tag := Integer(@tagstr);
856 admin.header.text := adhead.Content;
859 ('<input type=submit value=
\8dí
\8f\9c\82·
\82é><input type=reset value=
\83\8a\83Z
\83b
\83g></form>');
860 admin.footer.Add(footer.Content);
864 (Format('<p style=text-align:center><a href="%s/index%s">
\96ß
\82é</a>',
865 [Request.ScriptName, t]));
866 Response.ContentType := 'text/html;charset=utf-8';
867 Response.Content := admin.Content;
870 procedure TWebModule1.WebModule1adminsetAction(Sender: TObject;
871 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
876 s := Request.ContentFields.Values['pass'];
880 if Request.ContentFields.Values['mente'] = 'on' then
884 FieldByName('mente').AsInteger := i;
885 if (s <> '')and(s = Request.ContentFields.Values['pass2']) then
888 FieldByName('password').AsString := hash(s);
889 with Response.Cookies.Add do
899 WebModule1adminAction(nil, Request, Response, Handled);
902 procedure TWebModule1.WebModule1alertAction(Sender: TObject;
903 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
905 num1, num2, i: Integer;
908 num1 := Request.QueryFields.Values['db'].ToInteger;
909 num2 := StrToIntDef(Request.QueryFields.Values['num'], -1);
912 if Request.MethodType = mtGet then
914 FDTable1.Locate('dbnum', num1);
915 FDTable2.Locate('number', num2);
916 Response.ContentType := 'text/html;charset=utf-8';
917 Response.Content := mail.Content;
924 i := FieldByName('id').AsInteger + 1;
925 s := Request.ContentFields.Values['request'];
928 AppendRecord([i, num1, num2, Now, s]);
930 WebModule1jumpAction(nil, Request, Response, Handled);
934 procedure TWebModule1.WebModule1deleteAction(Sender: TObject;
935 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
940 s := Request.ContentFields.Values['num'];
944 s := hash(Request.ContentFields.Values['password']);
946 if Locate('number;pass', VarArrayOf([num, s])) = true then
949 FieldByName('title').AsString := '';
950 FieldByName('name').AsString := ' - - - ';
951 FieldByName('comment').AsString := '<em>
\93\8a\8de
\8eÒ
\82É
\82æ
\82è
\8dí
\8f\9c\82³
\82ê
\82Ü
\82µ
\82½.</em>';
952 FieldByName('raw').AsString := '';
953 FieldByName('date').AsDateTime := Now;
955 WebModule1jumpAction(nil, Request, Response, Handled);
958 WebModule1indexpageAction(nil, Request, Response, Handled);
961 procedure TWebModule1.WebModule1fileAction(Sender: TObject;
962 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
966 s := Request.QueryFields.Values['type'];
968 Response.ContentType := 'text/javascript'
969 else if s = 'css' then
970 Response.ContentType := 'text/css';
971 Response.Content := detail(s, Request.QueryFields.Values['id']);
974 procedure TWebModule1.WebModule1helpAction(Sender: TObject;
975 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
980 Response.ContentType := 'text/html;charset=utf-8';
981 if Request.MethodType = mtPost then
983 s := Request.ContentFields.Values['help'];
985 k := FDTable4.FieldByName('id').AsInteger + 1;
986 FDTable4.AppendRecord([k, -1, -1, Now, s]);
991 Response.Content := help.Content;
994 procedure TWebModule1.WebModule1imgAction(Sender: TObject; Request: TWebRequest;
995 Response: TWebResponse; var Handled: Boolean);
1002 s := Request.QueryFields.Values['name'];
1003 Response.ContentType := 'image/jpeg';
1004 if Locate('name', s) = true then
1006 res := CreateBlobStream(FieldByName('source'), bmRead);
1007 Response.ContentStream := res;
1009 else if s = 'sprites.png' then
1011 Response.ContentType := 'image/png';
1012 res := TResourceStream.Create(HInstance, 'PngImage_1', RT_RCDATA);
1013 Response.ContentStream := res;
1016 Response.ContentStream := nil;
1020 procedure TWebModule1.WebModule1indexpageAction(Sender: TObject;
1021 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1026 Response.ContentType := 'text/html; charset="utf-8"';
1027 if mente = true then
1029 s := Request.QueryFields.Values['db'];
1031 FDTable1.Locate('dbnum', s, []);
1032 i := StrToIntDef(Request.QueryFields.Values['num'], -1);
1034 pages(FDTable2.RecordCount, i);
1037 Self.Tag := Integer(@tagstr);
1038 Response.Content := index.Content;
1041 procedure TWebModule1.WebModule1jumpAction(Sender: TObject;
1042 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1047 DB := Request.QueryFields.Values['db'];
1048 s := Request.QueryFields.Values['num'];
1050 s := Request.ContentFields.Values['num'];
1052 pages(s.ToInteger, i);
1053 Response.SendRedirect(Format('%s/index?db=%s&num=%d#%s', [Request.ScriptName,
1057 procedure TWebModule1.WebModule1linkAction(Sender: TObject;
1058 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1062 s := Request.QueryFields.Values['db'];
1063 if (s = '') or (FDTable1.Locate('dbnum', s.ToInteger) = false) then
1065 s := Request.QueryFields.Values['num'];
1066 if (s <> '') and (FDTable2.Locate('number', s.ToInteger) = true) then
1068 Response.ContentType := 'text/html;charset=utf-8';
1069 Response.Content := articles.Content;
1073 procedure TWebModule1.WebModule1loginAction(Sender: TObject;
1074 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1080 if Request.MethodType = mtGet then
1082 Response.ContentType := 'text/html;charset=utf-8';
1083 Response.Content := login.Content;
1086 s := Request.ContentFields.Values['record'];
1087 v := FDTable1.Lookup('database', s, 'dbnum');
1088 t := hash(Request.ContentFields.Values['password']);
1089 if (VarIsNull(v) = false) and (hash(t) = FDTable3.FieldByName('password')
1092 with Response.Cookies.Add do
1096 Expires := Now + 14;
1100 if s = 'master' then
1101 Response.SendRedirect(Request.ScriptName + '/master')
1103 Response.SendRedirect(Request.ScriptName + '/admin?db=' + i.ToString);
1105 else if VarIsNull(v) = false then
1108 Response.SendRedirect(Request.ScriptName + '/login?db=' + t);
1111 Response.SendRedirect(Request.ScriptName + '/login');
1114 procedure TWebModule1.WebModule1logoutAction(Sender: TObject;
1115 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1121 with Response.Cookies.Add do
1126 s := Request.QueryFields.Values['db'];
1127 i := StrToIntDef(s, -1);
1128 x := FDTable1.Locate('dbnum', i);
1129 if (x = true) and (FDTable1.FieldByName('database').AsString = 'master') then
1132 Response.SendRedirect(Request.ScriptName + '/')
1134 Response.SendRedirect(Request.ScriptName + '/index?db=' + s);
1137 procedure TWebModule1.WebModule1masterAction(Sender: TObject;
1138 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1143 if loginCheck = false then
1145 Request.QueryFields.Values['db'] := FDTable1.Lookup('database',
1147 WebModule1loginAction(nil, Request, Response, Handled);
1150 if Request.MethodType = mtPost then
1152 s := Request.ContentFields.Values['delete'];
1155 while not((Bof = true) and (Eof = true)) do
1160 while Eof = false do
1162 i := FieldByName('dbname').AsInteger;
1163 if FDTable1.Locate('dbnum', i) = true then
1165 i := FieldByName('posnum').AsInteger;
1166 if FDTable2.Locate('number', i) = false then
1177 Response.ContentType := 'text/html;charset=utf-8';
1178 Response.Content := master.Content;
1181 procedure TWebModule1.WebModule1registAction(Sender: TObject;
1182 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1185 title, na, raw, pass, kotoba, Error, temp: string;
1186 comment: TStringList;
1190 temp := Request.ContentFields.Values['preview'];
1193 kotoba := Request.ContentFields.Values['aikotoba'];
1194 if kotoba <> '
\82°
\82ñ
\82«' then
1195 Error := Error + '<p>
\8d\87\8c¾
\97t
\82ª
\82¿
\82ª
\82¢
\82Ü
\82·.';
1196 with Request.ContentFields do
1198 title := Values['title'];
1199 na := Values['name'];
1200 raw := Values['comment'];
1201 Values['comment'] := '';
1202 pass := hash(Values['password']);
1205 title := '
\83^
\83C
\83g
\83\8b\82È
\82µ.';
1206 with Response.Cookies.Add do
1210 Value := '
\92N
\82©
\82³
\82ñ.'
1213 Expires := Now + 14;
1216 with Response.Cookies.Add do
1220 Expires := Now + 14;
1222 comment := TStringList.Create;
1224 comment.text := raw;
1225 strsCheck(Error, comment);
1226 temp := comment.text;
1234 Request.ContentFields.Values['raw'] := raw;
1236 Request.ContentFields.Values['preview'] := '<section style=color:red>' +
1237 Error + '</section>'
1238 else if Request.ContentFields.Values['show'] = 'true' then
1240 if review = false then
1241 Error := '<p style=font-size:2.3em;color:blue>
\81«
\81«
\83v
\83\8c\83r
\83\85\81[
\81«
\81«<p>' + temp
1244 Request.ContentFields.Values['preview'] := Error;
1245 Request.ContentFields.Values['show'] := 'false';
1249 i := StrToIntDef(Request.QueryFields.Values['db'], -1);
1250 if FDTable1.Locate('dbnum', i) = false then
1251 Response.SendRedirect(Request.ScriptName + '/')
1255 number := FDTable2.FieldByName('number').AsInteger + 1;
1256 FDTable2.AppendRecord([i, number, title, na, temp, raw, Now, pass]);
1257 Response.SendRedirect(Request.ScriptName + '/index?db=' + i.ToString +
1262 WebModule1indexpageAction(nil, Request, Response, Handled);
1265 procedure TWebModule1.WebModule1searchAction(Sender: TObject;
1266 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1268 Response.ContentType := 'text/html;charset=utf-8';
1269 Response.Content := search.Content;
1272 procedure TWebModule1.WebModule1titleAction(Sender: TObject;
1273 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1275 Response.ContentType := 'text/html;charset=utf-8';
1276 Response.Content := title.Content;
1279 procedure TWebModule1.WebModule1topAction(Sender: TObject; Request: TWebRequest;
1280 Response: TWebResponse; var Handled: Boolean);
1282 Response.ContentType := 'text/html;charset=utf-8';
1284 if mente = false then
1285 Response.Content := top.ContentFromString(top.Content);
1288 procedure TWebModule1.WebModule1usrdelAction(Sender: TObject;
1289 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1293 s := Request.QueryFields.Values['db'];
1294 t := Request.ContentFields.Values['num'];
1295 p := Request.ContentFields.Values['password'];
1296 if FDTable2.Locate('dbnum;number;pass',
1297 VarArrayOf([s.ToInteger, t.ToInteger, p])) = true then
1299 WebModule1indexpageAction(nil, Request, Response, Handled);
1302 procedure TWebModule1.WebModuleCreate(Sender: TObject);
1307 if FDTable1.Exists = false then
1308 FDTable1.CreateTable;
1309 if FDTable2.Exists = false then
1310 FDTable2.CreateTable;
1311 if FDTable3.Exists = false then
1312 FDTable3.CreateTable;
1313 if FDTable4.Exists = false then
1314 FDTable4.CreateTable;
1315 if FDTable5.Exists = false then
1316 FDTable5.CreateTable;
1326 if (FDTable1.Bof = true) and (FDTable1.Eof = true) then
1328 FDTable1.AppendRecord([0, 'info']);
1329 FDTable1.AppendRecord([1, 'master']);
1331 FDTable1.AppendRecord([i + 1, '
\8cf
\8e¦
\94Â' + i.ToString]);
1333 if (FDTable3.Bof = true) and (FDTable3.Eof = true) then
1335 i := FDTable1.Lookup('database', 'info', 'dbnum');
1336 s := '
\88¢
\95Û,
\94n
\8e,
\8e\80\82Ë';
1337 FDTable3.AppendRecord
1338 (['
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86',
1339 '<h1 style=color:maron;text-align:center;font-style:italic>
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86</h1>',
1340 0, i, 30, hash(hash('admin')), s]);
1342 admin.MaxRows:=FDTable3.FieldByName('count').AsInteger;