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;
14 TWebModule1 = class(TWebModule)
15 articles: TDataSetPageProducer;
16 index: TDataSetPageProducer;
17 admin: TDataSetTableProducer;
18 search: TPageProducer;
19 items: TDataSetPageProducer;
22 master: TPageProducer;
23 alert: TDataSetPageProducer;
24 footer: TDataSetPageProducer;
30 header: TDataSetPageProducer;
31 login: 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;
52 FDTable4ID: TIntegerField;
53 FDTable4DBNAME: TIntegerField;
54 FDTable4POSNUM: TIntegerField;
55 FDTable4DATE: TDateField;
56 FDTable4REQUEST: TWideMemoField;
57 DataSource1: TDataSource;
59 FDTable3TITLE: TWideStringField;
60 FDTable3TITLE2: TWideStringField;
61 FDTable3mente: TBooleanField;
62 FDTable3INFO: TIntegerField;
63 FDTable3COUNT: TIntegerField;
64 FDTable3password: TWideStringField;
65 FDTable3ng: TWideStringField;
66 FDConnection1: TFDConnection;
68 FDTable1DBNUM: TIntegerField;
69 FDTable1DATABASE: TWideStringField;
70 FDTable5ID: TIntegerField;
71 FDTable5NAME: TWideStringField;
72 FDTable5SOURCE: TBlobField;
73 procedure indexHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
74 TagParams: TStrings; var ReplaceText: string);
75 procedure WebModule1indexpageAction(Sender: TObject; Request: TWebRequest;
76 Response: TWebResponse; var Handled: Boolean);
77 procedure WebModule1registAction(Sender: TObject; Request: TWebRequest;
78 Response: TWebResponse; var Handled: Boolean);
79 procedure WebModuleCreate(Sender: TObject);
80 procedure WebModule1adminAction(Sender: TObject; Request: TWebRequest;
81 Response: TWebResponse; var Handled: Boolean);
82 procedure WebModule1topAction(Sender: TObject; Request: TWebRequest;
83 Response: TWebResponse; var Handled: Boolean);
84 procedure itemsHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
85 TagParams: TStrings; var ReplaceText: string);
86 procedure topHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
87 TagParams: TStrings; var ReplaceText: string);
88 procedure WebModule1searchAction(Sender: TObject; Request: TWebRequest;
89 Response: TWebResponse; var Handled: Boolean);
90 procedure WebModule1helpAction(Sender: TObject; Request: TWebRequest;
91 Response: TWebResponse; var Handled: Boolean);
92 procedure searchHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
93 TagParams: TStrings; var ReplaceText: string);
94 procedure masterHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
95 TagParams: TStrings; var ReplaceText: string);
96 procedure articlesHTMLTag(Sender: TObject; Tag: TTag;
97 const TagString: string; TagParams: TStrings; var ReplaceText: string);
98 procedure footerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
99 TagParams: TStrings; var ReplaceText: string);
100 procedure WebModule1alertAction(Sender: TObject; Request: TWebRequest;
101 Response: TWebResponse; var Handled: Boolean);
102 procedure WebModule1masterAction(Sender: TObject; Request: TWebRequest;
103 Response: TWebResponse; var Handled: Boolean);
104 procedure mailHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
105 TagParams: TStrings; var ReplaceText: string);
106 procedure alertHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
107 TagParams: TStrings; var ReplaceText: string);
108 procedure WebModule1deleteAction(Sender: TObject; Request: TWebRequest;
109 Response: TWebResponse; var Handled: Boolean);
110 procedure WebModule1jumpAction(Sender: TObject; Request: TWebRequest;
111 Response: TWebResponse; var Handled: Boolean);
112 procedure WebModule1linkAction(Sender: TObject; Request: TWebRequest;
113 Response: TWebResponse; var Handled: Boolean);
114 procedure headerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
115 TagParams: TStrings; var ReplaceText: string);
116 procedure adminFormatCell(Sender: TObject; CellRow, CellColumn: Integer;
117 var BgColor: THTMLBgColor; var Align: THTMLAlign; var VAlign: THTMLVAlign;
118 var CustomAttrs, CellData: string);
119 procedure WebModule1admdelAction(Sender: TObject; Request: TWebRequest;
120 Response: TWebResponse; var Handled: Boolean);
121 procedure WebModule1loginAction(Sender: TObject; Request: TWebRequest;
122 Response: TWebResponse; var Handled: Boolean);
123 procedure WebModule1adminsetAction(Sender: TObject; Request: TWebRequest;
124 Response: TWebResponse; var Handled: Boolean);
125 procedure adheadHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
126 TagParams: TStrings; var ReplaceText: string);
127 procedure WebModule1logoutAction(Sender: TObject; Request: TWebRequest;
128 Response: TWebResponse; var Handled: Boolean);
129 procedure WebModule1imgAction(Sender: TObject; Request: TWebRequest;
130 Response: TWebResponse; var Handled: Boolean);
131 procedure WebModule1fileAction(Sender: TObject; Request: TWebRequest;
132 Response: TWebResponse; var Handled: Boolean);
133 procedure titleHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
134 TagParams: TStrings; var ReplaceText: string);
135 procedure WebModule1titleAction(Sender: TObject; Request: TWebRequest;
136 Response: TWebResponse; var Handled: Boolean);
137 procedure tiHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
138 TagParams: TStrings; var ReplaceText: string);
139 procedure helpHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
140 TagParams: TStrings; var ReplaceText: string);
141 procedure loginHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
142 TagParams: TStrings; var ReplaceText: string);
147 procedure pages(count: Integer; var page: Integer);
148 procedure strsCheck(var Error: string; var list: TStringList);
149 procedure setLastArticle;
150 function isInfo: Boolean;
151 function loginCheck: Boolean;
152 function hash(str: string): string;
153 function mente: Boolean;
154 function detail(ts, pid: string): string;
160 WebModuleClass: TComponentClass = TWebModule1;
164 { %CLASSGROUP 'Vcl.Controls.TControl' }
166 uses IdHashSHA, IdGlobal, IdHash, IdHashMessageDigest, Jpeg, Graphics;
171 promotion = '
\8dL
\8d\90:';
174 procedure TWebModule1.adheadHTMLTag(Sender: TObject; Tag: TTag;
175 const TagString: string; TagParams: TStrings; var ReplaceText: string);
177 if TagString = 'pr' then
178 ReplaceText := promotion
179 else if (TagString = 'mente') and
180 (FDTable3.FieldByName('mente').AsBoolean = true) then
181 ReplaceText := 'checked'
182 else if TagString = 'database' then
183 ReplaceText := Request.QueryFields.Values['db'];
186 procedure TWebModule1.adminFormatCell(Sender: TObject;
187 CellRow, CellColumn: Integer; var BgColor: THTMLBgColor;
188 var Align: THTMLAlign; var VAlign: THTMLVAlign;
189 var CustomAttrs, CellData: string);
191 if (CellColumn = 0) and (CellRow > 0) then
192 CellData := Format('<input name=check%d type=checkbox>', [CellRow]);
195 procedure TWebModule1.alertHTMLTag(Sender: TObject; Tag: TTag;
196 const TagString: string; TagParams: TStrings; var ReplaceText: string);
201 if (TagString = 'plus') and (alert.Tag = 0) then
203 '<a href=/jump?db=<#dbname>&num=<#posnum>>[ <#dbname>-<#posnum> ]</a>'
204 else if TagString = 'article' then
206 if (FDTable1.Locate('dbnum', FDTable4.FieldByName('dbname').AsInteger)
207 = false) or (FDTable2.Locate('number', FDTable4.FieldByName('posnum')
208 .AsInteger) = false) then
210 ReplaceText := '<p>
\83\8a\83N
\83G
\83X
\83g';
213 s := TStringList.Create;
215 s.Text := articles.Content;
218 for i := s.count - 1 downto 0 do
219 if Copy(s[i], 1, 18) = '<section id=master' then
224 ReplaceText := s.Text;
229 else if TagString = 'request' then
230 ReplaceText := FDTable4.FieldByName('request').AsString;
233 procedure TWebModule1.articlesHTMLTag(Sender: TObject; Tag: TTag;
234 const TagString: string; TagParams: TStrings; var ReplaceText: string);
236 if TagString = 'comment' then
237 ReplaceText := FDTable2.FieldByName('comment').AsString;
240 function TWebModule1.detail(ts, pid: string): string;
244 for i := 0 to ComponentCount - 1 do
245 if Components[i].Name = ts + pid then
246 result := (Components[i] as TPageProducer).Content;
249 procedure TWebModule1.footerHTMLTag(Sender: TObject; Tag: TTag;
250 const TagString: string; TagParams: TStrings; var ReplaceText: string);
254 if TagString = 'link' then
257 if i = index.Tag then
258 ReplaceText := ReplaceText + ' ' + i.ToString + ' '
260 ReplaceText := ReplaceText +
261 Format(' <a style=text-decoration-line:none href="%s?db=%d&num=%d">%d</a> ',
262 [PString(Self.Tag)^, FDTable1.FieldByName('dbnum').AsInteger, i, i]);
264 else if TagString = 'recent' then
265 if index.Tag = -1 then
266 ReplaceText := TagString
268 ReplaceText := '<a style=text-decoration-line:none href="' +
269 PString(Self.Tag)^ + '?db=' + FDTable1.FieldByName('dbnum').AsString +
273 function TWebModule1.hash(str: string): string;
275 with TIdHashSHA1.Create do
278 result := HashStringAsHex(str);
285 procedure TWebModule1.headerHTMLTag(Sender: TObject; Tag: TTag;
286 const TagString: string; TagParams: TStrings; var ReplaceText: string);
290 if TagString = 'cookie' then
292 s := TagParams.Values['param'];
293 ReplaceText := TNetEncoding.URL.Decode(Request.CookieFields.Values[s]);
295 else if (TagString = 'check') and
296 (Request.ContentFields.Values['show'] <> 'false') then
297 ReplaceText := 'checked'
298 else if TagString = 'preview' then
299 ReplaceText := Request.ContentFields.Values['preview']
300 else if TagString = 'raw' then
301 ReplaceText := Request.ContentFields.Values['raw']
302 else if TagString = 'pass' then
303 ReplaceText := Request.ContentFields.Values['password']
304 else if TagString = 'title' then
305 ReplaceText := Request.ContentFields.Values['title'];
308 procedure TWebModule1.helpHTMLTag(Sender: TObject; Tag: TTag;
309 const TagString: string; TagParams: TStrings; var ReplaceText: string);
311 if TagString = 'pr' then
312 ReplaceText := promotion
313 else if TagString = 'area' then
316 ss := TStringList.Create;
318 ss.Add('<form action=/help method=post><p>
\82¨
\96â
\82¢
\8d\87\82í
\82¹<
\8dí
\8f\9c\88Ë
\97\8a\82È
\82Ç
\89½
\82Å
\82à></p>');
319 ss.Add('<textarea name=help style=height:100px;width:250px>
\93\8a\8de
\8eÒ
\96¼
\82È
\82Ç
\81F');
320 ss.Add('
\91\8a\92k
\93à
\97e
\81F');
321 ss.Add('
\82»
\82Ì
\91¼
\81F</textarea><br>');
322 ss.Add('<input type=submit value="
\91\97\90M"></form>');
323 ReplaceText := ss.Text;
330 '<p style=color:yellow;background-color:aqua>
\82²
\95ñ
\8d\90\82 \82è
\82ª
\82Æ
\82¤
\82²
\82´
\82¢
\82Ü
\82·.';
333 procedure TWebModule1.indexHTMLTag(Sender: TObject; Tag: TTag;
334 const TagString: string; TagParams: TStrings; var ReplaceText: string);
338 if TagString = 'pr' then
339 ReplaceText := promotion
340 else if TagString = 'article' then
342 for i := 1 to FDTable3.FieldByName('count').AsInteger do
344 if FDTable2.Eof = true then
346 if isInfo = false then
347 ReplaceText := ReplaceText + articles.Content
349 ReplaceText := articles.Content + ReplaceText;
353 else if TagString = 'footer' then
354 ReplaceText := footer.Content
355 else if TagString = 'header' then
356 if (FDTable1.FieldByName('dbnum').AsInteger = FDTable3.FieldByName('info')
357 .AsInteger) and (loginCheck = false) then
358 ReplaceText := '<h1 style=text-align:center>
\8aÇ
\97\9d\90l
\82©
\82ç
\82¨
\92m
\82ç
\82¹
\82ª
\82 \82è
\82Ü
\82·.</h1>'
361 i := FDTable3.FieldByName('count').AsInteger;
362 if 10 * i <= FDTable2.RecordCount then
363 ReplaceText := '<h1>
\82±
\82ê
\88È
\8fã
\93\8a\8de
\82Å
\82«
\82Ü
\82¹
\82ñ.</h1>'
365 ReplaceText := header.Content;
367 else if (TagString = 'css') or (TagString = 'js') then
368 ReplaceText := detail(TagString, TagParams.Values['id'])
369 else if TagString = 'dbnum' then
370 ReplaceText := FDTable1.FieldByName('dbnum').AsString
371 else if TagString = 'database' then
372 ReplaceText := FDTable1.FieldByName('database').AsString;
375 function TWebModule1.isInfo: Boolean;
377 result := FDTable1.FieldByName('dbnum').AsInteger = FDTable3.FieldByName
381 procedure TWebModule1.itemsHTMLTag(Sender: TObject; Tag: TTag;
382 const TagString: string; TagParams: TStrings; var ReplaceText: string);
388 if TagString = 'item' then
390 s := TStringList.Create;
392 s.Text := FDTable2.FieldByName('raw').AsString;
393 for i := 0 to s.count - 1 do
394 for j := 0 to ss.count - 1 do
395 if Pos(ss[j], s[i]) > 0 then
397 s[i] := '<p style=background-color:aqua>' + s[i]
399 s[i] := '<p style=background-color:yellow>' + s[i];
402 i := FieldByName('dbnum').AsInteger;
403 j := FieldByName('number').AsInteger;
404 str := Request.QueryFields.Values['db'];
406 t := Format('<a href="/jump?db=%d&num=%d">[ %d-%d ]</a>',
409 t := Format('<a href="/jump?db=%s&num=%d">[ %d ]</a>', [str, j, j]);
411 ReplaceText := t + s.Text;
418 function TWebModule1.loginCheck: Boolean;
420 result := hash(Request.CookieFields.Values['user']) = FDTable3.FieldByName
421 ('password').AsString;
424 procedure TWebModule1.loginHTMLTag(Sender: TObject; Tag: TTag;
425 const TagString: string; TagParams: TStrings; var ReplaceText: string);
427 if TagString = 'pr' then
428 ReplaceText := promotion;
431 procedure TWebModule1.masterHTMLTag(Sender: TObject; Tag: TTag;
432 const TagString: string; TagParams: TStrings; var ReplaceText: string);
434 if TagString = 'pr' then
435 ReplaceText := promotion
436 else if TagString = 'request' then
440 ReplaceText := '<table border=1 align=center>';
443 if FieldByName('posnum').AsInteger = -1 then
447 ReplaceText := ReplaceText + alert.ContentFromString(alert.Content);
450 ReplaceText := ReplaceText + '</table>';
454 function TWebModule1.mente: Boolean;
456 if FDTable3.FieldByName('mente').AsBoolean = true then
460 '<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>' +
461 '<p style=text-align:center><a href=/admin>
\8aÇ
\97\9d\8eÒ
\97p
\83\8d\83O
\83C
\83\93</a>'
467 procedure TWebModule1.pages(count: Integer; var page: Integer);
471 max := FDTable3.FieldByName('count').AsInteger;
472 if (page > -1) and (count < max * (page - 1)) then
474 page := (count div max) + 1;
475 if count mod max = 0 then
482 FDTable2.MoveBy(1 - max);
486 FDTable2.MoveBy(max * (page - 1));
490 procedure TWebModule1.mailHTMLTag(Sender: TObject; Tag: TTag;
491 const TagString: string; TagParams: TStrings; var ReplaceText: string);
493 if TagString = 'pr' then
494 ReplaceText := promotion
495 else if TagString = 'content' then
496 ReplaceText := articles.Content
497 else if TagString = 'query' then
498 ReplaceText := '?' + Request.Query
499 else if TagString = 'number' then
500 ReplaceText := Request.QueryFields.Values['num'];
503 procedure TWebModule1.searchHTMLTag(Sender: TObject; Tag: TTag;
504 const TagString: string; TagParams: TStrings; var ReplaceText: string);
514 while FDTable2.Eof = false do
516 s.Text := FDTable2.FieldByName('raw').AsString;
517 ss.DelimitedText := Request.ContentFields.Values['word1'];
518 for j := 0 to ss.count - 1 do
519 for i := 0 to s.count - 1 do
520 if Pos(ss[j], s[i]) > 0 then
523 ReplaceText := ReplaceText + items.Content;
528 if j = ss.count - 1 then
530 ReplaceText := ReplaceText + items.Content;
536 else if i = s.count - 1 then
544 if TagString = 'pr' then
545 ReplaceText := promotion
546 else if (Request.MethodType = mtPost) and (TagString = 'items') then
548 if Request.ContentFields.Values['type'] = 'OR' then
552 s := TStringList.Create;
553 ss := TStringList.Create;
556 ss.StrictDelimiter := false;
557 if Request.QueryFields.Values['db'] = '' then
560 while FDTable1.Eof = false do
573 else if TagString = 'query' then
575 ReplaceText := Request.Query;
576 if ReplaceText <> '' then
577 ReplaceText := '?' + ReplaceText;
579 else if TagString = 'css' then
580 ReplaceText := css2.Content
581 else if TagString = 'dbnum' then
582 ReplaceText := Request.QueryFields.Values['dbnum'];
585 procedure TWebModule1.setLastArticle;
590 procedure TWebModule1.strsCheck(var Error: string; var list: TStringList);
597 s := TStringList.Create;
599 s.DelimitedText := FDTable3.FieldByName('ng').AsString;
600 for i := 0 to s.count - 1 do
601 for j := 0 to list.count - 1 do
603 if Pos(s[i], list[j]) > 0 then
605 list[j] := '<p>' + list[j];
611 Error := Error + '<p>
\8bÖ
\8e~
\8cê
\8bå
\82ª
\8aÜ
\82Ü
\82ê
\82Ä
\82¢
\82Ü
\82·.';
614 procedure TWebModule1.tiHTMLTag(Sender: TObject; Tag: TTag;
615 const TagString: string; TagParams: TStrings; var ReplaceText: string);
617 if TagString = 'count' then
618 ReplaceText := FDTable2.RecordCount.ToString
619 else if TagString = 'database' then
620 ReplaceText := FDTable1.FieldByName('database').AsString
621 else if TagString = 'date' then
625 ReplaceText := FieldByName('date').AsString;
629 procedure TWebModule1.titleHTMLTag(Sender: TObject; Tag: TTag;
630 const TagString: string; TagParams: TStrings; var ReplaceText: string);
632 if TagString = 'pr' then
633 ReplaceText := promotion
634 else if TagString = 'js' then
635 ReplaceText := detail(TagString, TagParams.Values['id'])
636 else if TagString = 'main' then
639 while (FDQuery1.Eof = false) and (FDTable1.Eof = false) do
641 if FDTable1.FieldByName('dbnum').AsInteger = FDQuery1.FieldByName('dbnum').AsInteger
644 ReplaceText := ReplaceText + ti.Content;
647 else if FDTable2.Eof = false then
651 ReplaceText := ReplaceText + ti.Content;
653 ti.DataSet := FDQuery1;
661 procedure TWebModule1.topHTMLTag(Sender: TObject; Tag: TTag;
662 const TagString: string; TagParams: TStrings; var ReplaceText: string);
667 if TagString = 'pr' then
668 ReplaceText := promotion
669 else if TagString = 'list' then
671 i := FDTable3.FieldByName('info').AsInteger;
672 for k := 0 to tcnt do
674 if FDTable1.Eof = true then
677 j := FDTable1.FieldByName('dbnum').AsInteger;
678 s := FDTable1.FieldByName('database').AsString;
679 if (i = j) or (s = 'master') then
685 if (Now - FDTable2.FieldByName('date').AsDateTime < 1) and
686 (FDTable2.RecordCount > 0) then
687 t := 'background-color:aqua;';
688 if FDTable2.RecordCount >= 10 * FDTable3.FieldByName('count').AsInteger
690 t := t + 'color:red;';
693 ReplaceText := ReplaceText +
694 Format('<p><a%s target=_blank href="/index?db=%d">%s</a><br></p>',
699 else if TagString = 'info' then
700 ReplaceText := FDTable1.Lookup('dbnum', FDTable3.FieldByName('info')
701 .AsInteger, 'database')
702 else if TagString = 'dbnum' then
703 ReplaceText := FDTable3.FieldByName('info').AsString
704 else if (TagString = 'css') or (TagString = 'js') then
705 ReplaceText := detail(TagString, TagParams.Values['id'])
706 else if TagString = 'slide' then
708 for i := 1 to (FDTable1.RecordCount div tcnt) + 1 do
709 ReplaceText := ReplaceText +
710 '<div class="slide"><img src="/src?name=slide' + i.ToString +
711 '.jpg" style=float:right;height:465px><#list></div>';
715 procedure TWebModule1.WebModule1admdelAction(Sender: TObject;
716 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
723 FDTable2.RecNo := admin.Tag;
724 for i := 0 to Request.ContentFields.count - 1 do
726 reg := TRegEx.Create('\d+');
727 match := reg.match(Request.ContentFields[i]);
728 if match.Success = true then
730 k := match.Value.ToInteger - j - 1;
731 j := match.Value.ToInteger;
737 WebModule1adminAction(nil, Request, Response, Handled);
740 procedure TWebModule1.WebModule1adminAction(Sender: TObject;
741 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
746 s := Request.CookieFields.Values['user'];
747 if (s = '') or (loginCheck = false) then
749 WebModule1loginAction(nil, Request, Response, Handled);
752 admin.MaxRows := FDTable3.FieldByName('count').AsInteger;
753 t := Request.QueryFields.Values['db'];
755 FDTable1.Locate('dbnum', t, []);
756 s := Request.QueryFields.Values['num'];
757 i := StrToIntDef(s, -1);
758 pages(FDTable2.RecordCount, i);
761 Self.Tag := Integer(@tagstr);
762 admin.header.Text := adhead.Content;
765 ('<input type=submit value=
\8dí
\8f\9c\82·
\82é><input type=reset value=
\83\8a\83Z
\83b
\83g></form>');
766 admin.footer.Add(footer.Content);
769 admin.footer.Add('<p style=text-align:center><a href="/index' + t +
771 admin.Tag := FDTable2.RecNo;
772 Response.ContentType := 'text/html;charset=utf-8';
773 Response.Content := admin.Content;
776 procedure TWebModule1.WebModule1adminsetAction(Sender: TObject;
777 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
781 s := Request.ContentFields.Values['pass'];
785 FieldByName('mente').AsBoolean := Request.ContentFields.Values
790 FieldByName('password').AsString := hash(s);
791 with Response.Cookies.Add do
801 WebModule1adminAction(nil, Request, Response, Handled);
804 procedure TWebModule1.WebModule1alertAction(Sender: TObject;
805 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
807 num1, num2, i: Integer;
810 num1 := FDTable1.FieldByName('dbnum').AsInteger;
811 num2 := StrToIntDef(Request.QueryFields.Values['num'], -1);
814 if Request.MethodType = mtGet then
816 FDTable2.Locate('number', num2, []);
817 Response.ContentType := 'text/html;charset=utf-8';
818 Response.Content := mail.Content;
825 i := FieldByName('id').AsInteger + 1;
826 s := Request.ContentFields.Values['request'];
829 AppendRecord([i, num1, num2, Now, s]);
832 Response.SendRedirect(Format('/index?db=%d&num=%d#%d',
835 Response.SendRedirect('/top');
839 procedure TWebModule1.WebModule1deleteAction(Sender: TObject;
840 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
845 s := Request.ContentFields.Values['num'];
849 s := hash(Request.ContentFields.Values['password']);
851 if Locate('number;pass', VarArrayOf([num, s])) = true then
854 FieldByName('title').AsString := '';
855 FieldByName('name').AsString := ' - - - ';
856 FieldByName('comment').AsString := '<em>
\93\8a\8de
\8eÒ
\82É
\82æ
\82è
\8dí
\8f\9c\82³
\82ê
\82Ü
\82µ
\82½.</em>';
857 FieldByName('raw').AsString := '';
858 FieldByName('date').AsDateTime := Now;
860 WebModule1jumpAction(nil, Request, Response, Handled);
863 WebModule1indexpageAction(nil, Request, Response, Handled);
866 procedure TWebModule1.WebModule1fileAction(Sender: TObject;
867 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
871 s := Request.QueryFields.Values['type'];
873 Response.ContentType := 'text/javascript'
874 else if s = 'css' then
875 Response.ContentType := 'text/css';
876 Response.Content := detail(s, Request.QueryFields.Values['id']);
879 procedure TWebModule1.WebModule1helpAction(Sender: TObject;
880 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
885 Response.ContentType := 'text/html;charset=utf-8';
886 if Request.MethodType = mtPost then
888 s := Request.ContentFields.Values['help'];
890 k := FDTable4.FieldByName('id').AsInteger + 1;
891 FDTable4.AppendRecord([k, -1, -1, Now, s]);
896 Response.Content := help.Content;
899 procedure TWebModule1.WebModule1imgAction(Sender: TObject; Request: TWebRequest;
900 Response: TWebResponse; var Handled: Boolean);
907 s := Request.ContentFields.Values['name'];
908 Response.ContentType := 'image/jpeg';
909 if Locate('name', s) = true then
911 res := CreateBlobStream(FieldByName('source'), bmRead);
912 Response.ContentStream := res;
914 else if s = 'sprites.png' then
916 Response.ContentType := 'image/png';
917 res := TResourceStream.Create(HInstance, 'PngImage_1', RT_RCDATA);
918 Response.ContentStream := res;
921 Response.ContentStream := nil;
925 procedure TWebModule1.WebModule1indexpageAction(Sender: TObject;
926 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
931 s := Request.QueryFields.Values['db'];
933 FDTable1.Locate('dbnum', s, []);
934 i := StrToIntDef(Request.QueryFields.Values['num'], -1);
936 pages(FDTable2.RecordCount, i);
939 Self.Tag := Integer(@tagstr);
940 Response.ContentType := 'text/html; charset="utf-8"';
941 if mente = false then
942 Response.Content := index.Content;
945 procedure TWebModule1.WebModule1jumpAction(Sender: TObject;
946 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
951 DB := Request.QueryFields.Values['db'];
952 s := Request.ContentFields.Values['num'];
954 FDTable1.Locate('dbnum', DB.ToInteger, []);
955 FDTable2.Locate('number', s.ToInteger, []);
957 pages(FDTable2.RecNo, page);
958 Response.SendRedirect(Format('/index?db=%s&num=%d#%s', [DB, page, s]));
961 procedure TWebModule1.WebModule1linkAction(Sender: TObject;
962 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
967 s := Request.QueryFields.Values['num'];
971 if FDTable2.Locate('number', num, []) = true then
973 Response.ContentType := 'text/html;charset=utf-8';
974 Response.Content := articles.Content;
978 procedure TWebModule1.WebModule1loginAction(Sender: TObject;
979 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
985 if Request.MethodType = mtGet then
987 Response.ContentType := 'text/html;charset=utf-8';
988 Response.Content := login.Content;
991 s := Request.ContentFields.Values['record'];
992 v := FDTable1.Lookup('database', s, 'dbnum');
993 if VarIsNull(v) = false then
995 with Response.Cookies.Add do
998 Value := hash(Request.ContentFields.Values['password']);
1003 if s = 'master' then
1004 Response.SendRedirect('/master')
1006 Response.SendRedirect('/admin?db=' + i.ToString);
1010 Response.ContentType := 'text/html;charset=utf-8';
1011 Response.Content := login.Content;
1015 procedure TWebModule1.WebModule1logoutAction(Sender: TObject;
1016 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1022 with Response.Cookies.Add do
1027 s := Request.QueryFields.Values['db'];
1028 i := StrToIntDef(s, -1);
1029 x := FDTable1.Locate('dbnum', i);
1030 if (x = true) and (FDTable1.FieldByName('database').AsString = 'master') then
1033 Response.SendRedirect('/')
1035 Response.SendRedirect('/index?db=' + s);
1038 procedure TWebModule1.WebModule1masterAction(Sender: TObject;
1039 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1044 if loginCheck = false then
1047 if Locate('database', 'master') = false then
1050 i := FieldByName('dbnum').AsInteger + 1;
1051 AppendRecord([i, 'master']);
1053 WebModule1loginAction(nil, Request, Response, Handled);
1056 if Request.MethodType = mtPost then
1058 s := Request.ContentFields.Values['delete'];
1061 while (Bof = false) or (Eof = false) do
1066 while FDTable4.Eof = false do
1068 i := FDTable4.FieldByName('dbname').AsInteger;
1069 if FDTable1.Locate('dbnum', i) = true then
1071 i := FDTable4.FieldByName('posnum').AsInteger;
1072 if FDTable2.Locate('number', i) = false then
1082 Response.ContentType := 'text/html;charset=utf-8';
1083 Response.Content := master.Content;
1086 procedure TWebModule1.WebModule1registAction(Sender: TObject;
1087 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1090 title, na, raw, pass, kotoba, Error: string;
1091 comment: TStringList;
1092 function scan(Text: string): string;
1095 coll: TMatchCollection;
1099 Text := TNetEncoding.HTML.Encode(Text);
1100 s := TNetEncoding.HTML.Encode('>>');
1101 reg := TRegEx.Create(s + '(\d+)');
1102 coll := reg.Matches(Text);
1103 for j := coll.count - 1 downto 0 do
1105 Delete(Text, coll[j].index, coll[j].Length);
1106 t := Copy(coll[j].Value, Length(s) + 1, coll[j].Length);
1108 ('<a class=minpreview data-preview-url=/link?num=%s href=/jump?num=%s>>>%s</a>',
1110 Insert(result, Text, coll[j].index);
1116 kotoba := Request.ContentFields.Values['aikotoba'];
1118 if kotoba <> '
\82°
\82ñ
\82«' then
1119 Error := Error + '<p>
\8d\87\8c¾
\97t
\82ª
\82¿
\82ª
\82¢
\82Ü
\82·.';
1121 number := FDTable2.FieldByName('number').AsInteger + 1;
1122 with Request.ContentFields do
1124 title := Values['title'];
1125 na := Values['name'];
1126 raw := Values['comment'];
1127 pass := hash(Values['password']);
1130 title := '
\83^
\83C
\83g
\83\8b\82È
\82µ.';
1131 with Response.Cookies.Add do
1135 Value := '
\92N
\82©
\82³
\82ñ.'
1138 Expires := Now + 14;
1141 with Response.Cookies.Add do
1145 Expires := Now + 14;
1147 comment := TStringList.Create;
1149 comment.Text := raw;
1150 strsCheck(Error, comment);
1151 Request.ContentFields.Values['raw'] := raw;
1153 Request.ContentFields.Values['preview'] := '<section style=color:red>' +
1154 Error + '</section>'
1155 else if Request.ContentFields.Values['show'] = 'true' then
1157 Error := '<p style=font-size:2.3em;color:blue>
\81«
\81«
\83v
\83\8c\83r
\83\85\81[
\81«
\81«<p>' +
1159 Request.ContentFields.Values['preview'] := Error;
1160 Request.ContentFields.Values['show'] := 'false';
1164 i := FDTable1.FieldByName('dbnum').AsInteger;
1165 FDTable2.AppendRecord([i, number, title, na, comment.Text, raw,
1167 Response.SendRedirect('index?db=' + i.ToString + '#article');
1173 WebModule1indexpageAction(nil, Request, Response, Handled);
1176 procedure TWebModule1.WebModule1searchAction(Sender: TObject;
1177 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1179 Response.ContentType := 'text/html;charset=utf-8';
1180 Response.Content := search.Content;
1183 procedure TWebModule1.WebModule1titleAction(Sender: TObject;
1184 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1186 Response.ContentType := 'text/html;charset=utf-8';
1187 Response.Content := title.Content;
1190 procedure TWebModule1.WebModule1topAction(Sender: TObject; Request: TWebRequest;
1191 Response: TWebResponse; var Handled: Boolean);
1193 Response.ContentType := 'text/html;charset=utf-8';
1195 if mente = false then
1196 Response.Content := top.ContentFromString(top.Content);
1199 procedure TWebModule1.WebModuleCreate(Sender: TObject);
1204 if FDTable1.Exists = false then
1205 FDTable1.CreateTable;
1206 if FDTable2.Exists = false then
1207 FDTable2.CreateTable;
1208 if FDTable3.Exists = false then
1209 FDTable3.CreateTable;
1210 if FDTable4.Exists = false then
1211 FDTable4.CreateTable;
1212 if FDTable5.Exists = false then
1213 FDTable5.CreateTable;
1219 if FDTable1.Bof and FDTable1.Eof then
1221 FDTable1.AppendRecord([0, 'info']);
1223 FDTable1.AppendRecord([i, '
\8cf
\8e¦
\94Â' + i.ToString]);
1225 if FDTable3.Bof and FDTable3.Eof then
1227 i := FDTable1.Lookup('database', 'info', 'dbnum');
1228 s := '
\88¢
\95Û,
\94n
\8e,
\8e\80\82Ë';
1229 FDTable3.AppendRecord
1230 (['
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86',
1231 '<h1 style=color:maron;text-align:center;font-style:italic>
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86</h1>',
1232 false, i, 30, hash(hash('admin')), s]);