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;
10 TWebModule1 = class(TWebModule)
11 articles: TDataSetPageProducer;
12 index: TDataSetPageProducer;
13 admin: TDataSetTableProducer;
14 search: TPageProducer;
15 items: TDataSetPageProducer;
18 master: TPageProducer;
19 alert: TDataSetPageProducer;
20 footer: TDataSetPageProducer;
26 header: TDataSetPageProducer;
27 login: TDataSetPageProducer;
32 adhead: TPageProducer;
35 ti: TDataSetPageProducer;
36 procedure indexHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
37 TagParams: TStrings; var ReplaceText: string);
38 procedure WebModule1indexpageAction(Sender: TObject; Request: TWebRequest;
39 Response: TWebResponse; var Handled: Boolean);
40 procedure WebModule1registAction(Sender: TObject; Request: TWebRequest;
41 Response: TWebResponse; var Handled: Boolean);
42 procedure WebModuleCreate(Sender: TObject);
43 procedure WebModule1adminAction(Sender: TObject; Request: TWebRequest;
44 Response: TWebResponse; var Handled: Boolean);
45 procedure WebModule1topAction(Sender: TObject; Request: TWebRequest;
46 Response: TWebResponse; var Handled: Boolean);
47 procedure itemsHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
48 TagParams: TStrings; var ReplaceText: string);
49 procedure topHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
50 TagParams: TStrings; var ReplaceText: string);
51 procedure WebModule1searchAction(Sender: TObject; Request: TWebRequest;
52 Response: TWebResponse; var Handled: Boolean);
53 procedure WebModule1helpAction(Sender: TObject; Request: TWebRequest;
54 Response: TWebResponse; var Handled: Boolean);
55 procedure searchHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
56 TagParams: TStrings; var ReplaceText: string);
57 procedure masterHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
58 TagParams: TStrings; var ReplaceText: string);
59 procedure articlesHTMLTag(Sender: TObject; Tag: TTag;
60 const TagString: string; TagParams: TStrings; var ReplaceText: string);
61 procedure footerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
62 TagParams: TStrings; var ReplaceText: string);
63 procedure WebModule1alertAction(Sender: TObject; Request: TWebRequest;
64 Response: TWebResponse; var Handled: Boolean);
65 procedure WebModule1masterAction(Sender: TObject; Request: TWebRequest;
66 Response: TWebResponse; var Handled: Boolean);
67 procedure mailHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
68 TagParams: TStrings; var ReplaceText: string);
69 procedure alertHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
70 TagParams: TStrings; var ReplaceText: string);
71 procedure WebModule1deleteAction(Sender: TObject; Request: TWebRequest;
72 Response: TWebResponse; var Handled: Boolean);
73 procedure WebModule1jumpAction(Sender: TObject; Request: TWebRequest;
74 Response: TWebResponse; var Handled: Boolean);
75 procedure WebModule1linkAction(Sender: TObject; Request: TWebRequest;
76 Response: TWebResponse; var Handled: Boolean);
77 procedure headerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
78 TagParams: TStrings; var ReplaceText: string);
79 procedure adminFormatCell(Sender: TObject; CellRow, CellColumn: Integer;
80 var BgColor: THTMLBgColor; var Align: THTMLAlign; var VAlign: THTMLVAlign;
81 var CustomAttrs, CellData: string);
82 procedure WebModule1admdelAction(Sender: TObject; Request: TWebRequest;
83 Response: TWebResponse; var Handled: Boolean);
84 procedure WebModule1loginAction(Sender: TObject; Request: TWebRequest;
85 Response: TWebResponse; var Handled: Boolean);
86 procedure WebModule1adminsetAction(Sender: TObject; Request: TWebRequest;
87 Response: TWebResponse; var Handled: Boolean);
88 procedure adheadHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
89 TagParams: TStrings; var ReplaceText: string);
90 procedure WebModule1logoutAction(Sender: TObject; Request: TWebRequest;
91 Response: TWebResponse; var Handled: Boolean);
92 procedure WebModule1imgAction(Sender: TObject; Request: TWebRequest;
93 Response: TWebResponse; var Handled: Boolean);
94 procedure WebModule1fileAction(Sender: TObject; Request: TWebRequest;
95 Response: TWebResponse; var Handled: Boolean);
96 procedure titleHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
97 TagParams: TStrings; var ReplaceText: string);
98 procedure WebModule1titleAction(Sender: TObject; Request: TWebRequest;
99 Response: TWebResponse; var Handled: Boolean);
100 procedure tiHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
101 TagParams: TStrings; var ReplaceText: string);
102 procedure helpHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
103 TagParams: TStrings; var ReplaceText: string);
104 procedure loginHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
105 TagParams: TStrings; var ReplaceText: string);
110 procedure pages(count: Integer; var page: Integer);
111 function hash(str: string): string;
112 function mente: Boolean;
113 function detail(ts, pid: string): string;
119 WebModuleClass: TComponentClass = TWebModule1;
123 { %CLASSGROUP 'Vcl.Controls.TControl' }
125 uses Unit1, IdHashSHA, IdGlobal, IdHash, IdHashMessageDigest;
130 promotion = '
\8dL
\8d\90:';
133 procedure TWebModule1.adheadHTMLTag(Sender: TObject; Tag: TTag;
134 const TagString: string; TagParams: TStrings; var ReplaceText: string);
136 if TagString = 'pr' then
137 ReplaceText := promotion
138 else if (TagString = 'mente') and
139 (DataModule1.FDTable3.FieldByName('mente').AsBoolean = true) then
140 ReplaceText := 'checked'
141 else if TagString = 'password' then
142 ReplaceText := Request.CookieFields.Values['user']
143 else if TagString = 'database' then
144 ReplaceText := Request.QueryFields.Values['db'];
147 procedure TWebModule1.adminFormatCell(Sender: TObject;
148 CellRow, CellColumn: Integer; var BgColor: THTMLBgColor;
149 var Align: THTMLAlign; var VAlign: THTMLVAlign;
150 var CustomAttrs, CellData: string);
152 if (CellColumn = 0) and (CellRow > 0) then
153 CellData := Format('<input name=check%d type=checkbox>', [CellRow]);
156 procedure TWebModule1.alertHTMLTag(Sender: TObject; Tag: TTag;
157 const TagString: string; TagParams: TStrings; var ReplaceText: string);
162 if TagString = 'plus' then
163 if alert.Tag = 0 then
164 ReplaceText:='<a href=/jump?db=<#dbname>&num=<#posnum>>[ <#dbname>-<#posnum> ]</a>'
167 else if TagString = 'article' then
170 if (FDTable1.Locate('dbnum', FDTable4.FieldByName('dbname').AsInteger) = false)or
171 (FDTable2.Locate('number', FDTable4.FieldByName('posnum').AsInteger) = false) then
173 ReplaceText:='<p>
\83\8a\83N
\83G
\83X
\83g';
177 s := TStringList.Create;
179 s.Text := articles.Content;
182 for i := s.count - 1 downto 0 do
183 if Copy(s[i], 1, 18) = '<section id=master' then
188 ReplaceText := s.Text;
193 else if TagString = 'request' then
194 ReplaceText := DataModule1.FDTable4.FieldByName('request').AsString;
197 procedure TWebModule1.articlesHTMLTag(Sender: TObject; Tag: TTag;
198 const TagString: string; TagParams: TStrings; var ReplaceText: string);
200 if TagString = 'comment' then
201 ReplaceText := DataModule1.FDTable2.FieldByName('comment').AsString;
204 function TWebModule1.detail(ts, pid: string): string;
208 for i := 0 to ComponentCount - 1 do
209 if Components[i].Name = ts + pid then
210 result := (Components[i] as TPageProducer).Content;
213 procedure TWebModule1.footerHTMLTag(Sender: TObject; Tag: TTag;
214 const TagString: string; TagParams: TStrings; var ReplaceText: string);
218 if TagString = 'link' then
221 if i = index.Tag then
222 ReplaceText := ReplaceText + ' ' + i.ToString + ' '
224 ReplaceText := ReplaceText +
225 Format(' <a style=text-decoration-line:none href="%s?db=%d&num=%d">%d</a> ',
226 [PString(Self.Tag)^, DataModule1.FDTable1.FieldByName('dbnum')
229 else if TagString = 'recent' then
230 if index.Tag = -1 then
231 ReplaceText := TagString
233 ReplaceText := '<a style=text-decoration-line:none href="' +
234 PString(Self.Tag)^ + '?db=' + DataModule1.FDTable1.FieldByName('dbnum')
235 .AsString + '">recent</a>';
238 function TWebModule1.hash(str: string): string;
240 with TIdHashSHA1.Create do
243 result := HashStringAsHex(str);
250 procedure TWebModule1.headerHTMLTag(Sender: TObject; Tag: TTag;
251 const TagString: string; TagParams: TStrings; var ReplaceText: string);
255 if TagString = 'cookie' then
257 s := TagParams.Values['param'];
258 ReplaceText := TNetEncoding.URL.Decode(Request.CookieFields.Values[s]);
260 else if (TagString = 'check') and
261 (Request.ContentFields.Values['show'] <> 'false') then
262 ReplaceText := 'checked'
263 else if TagString = 'preview' then
264 ReplaceText := Request.ContentFields.Values['preview']
265 else if TagString = 'raw' then
266 ReplaceText := Request.ContentFields.Values['raw']
267 else if TagString = 'pass' then
268 ReplaceText := Request.ContentFields.Values['password']
269 else if TagString = 'title' then
270 ReplaceText := Request.ContentFields.Values['title'];
273 procedure TWebModule1.helpHTMLTag(Sender: TObject; Tag: TTag;
274 const TagString: string; TagParams: TStrings; var ReplaceText: string);
276 if TagString = 'pr' then
277 ReplaceText := promotion;
280 procedure TWebModule1.indexHTMLTag(Sender: TObject; Tag: TTag;
281 const TagString: string; TagParams: TStrings; var ReplaceText: string);
286 if TagString = 'pr' then
287 ReplaceText := promotion
288 else if TagString = 'article' then
290 x := DataModule1.FDTable1.FieldByName('dbnum')
291 .AsInteger = DataModule1.FDTable3.FieldByName('info').AsInteger;
292 for i := 1 to DataModule1.FDTable3.FieldByName('count').AsInteger do
294 if DataModule1.FDTable2.Eof = true then
297 ReplaceText := ReplaceText + articles.Content
299 ReplaceText := articles.Content + ReplaceText;
300 if DataModule1.FDTable2.Eof = false then
301 DataModule1.FDTable2.Next;
304 else if TagString = 'footer' then
305 ReplaceText := footer.Content
306 else if TagString = 'header' then
308 i := DataModule1.FDTable3.FieldByName('count').AsInteger;
309 if 10 * i <= DataModule1.FDTable2.RecordCount then
310 ReplaceText := '<h1>
\82±
\82ê
\88È
\8fã
\93\8a\8de
\82Å
\82«
\82Ü
\82¹
\82ñ.</h1>'
312 ReplaceText := header.Content;
314 else if (TagString = 'css') or (TagString = 'js') then
315 ReplaceText := detail(TagString, TagParams.Values['id'])
316 else if TagString = 'dbnum' then
317 ReplaceText := DataModule1.FDTable1.FieldByName('dbnum').AsString
318 else if TagString = 'database' then
319 ReplaceText := DataModule1.FDTable1.FieldByName('database').AsString;
322 procedure TWebModule1.itemsHTMLTag(Sender: TObject; Tag: TTag;
323 const TagString: string; TagParams: TStrings; var ReplaceText: string);
329 if TagString = 'item' then
331 s := TStringList.Create;
333 s.Text := DataModule1.FDTable2.FieldByName('raw').AsString;
334 for i := 0 to s.count - 1 do
335 for j := 0 to ss.count - 1 do
336 if Pos(ss[j], s[i]) > 0 then
338 s[i] := '<p style=background-color:aqua>' + s[i]
340 s[i] := '<p style=background-color:yellow>' + s[i];
341 with DataModule1.FDTable2 do
343 i := FieldByName('dbnum').AsInteger;
344 j := FieldByName('number').AsInteger;
345 str := Request.QueryFields.Values['db'];
347 t := Format('<a href="/jump?db=%d&num=%d">[ %d-%d ]</a>',
348 [DataModule1.FDTable1.FieldByName('dbnum').AsInteger, j, i, j])
350 t := Format('<a href="/jump?db=%s&num=%d">[ %d ]</a>', [str, j, j]);
352 ReplaceText := t + s.Text;
359 procedure TWebModule1.loginHTMLTag(Sender: TObject; Tag: TTag;
360 const TagString: string; TagParams: TStrings; var ReplaceText: string);
362 if TagString = 'pr' then
363 ReplaceText := promotion;
366 procedure TWebModule1.masterHTMLTag(Sender: TObject; Tag: TTag;
367 const TagString: string; TagParams: TStrings; var ReplaceText: string);
369 if TagString = 'pr' then
370 ReplaceText := promotion
371 else if TagString = 'request' then
372 with DataModule1.FDTable4 do
375 ReplaceText := '<table border=1 align=center>';
378 ReplaceText := ReplaceText + alert.ContentFromString(alert.Content);
381 ReplaceText := ReplaceText + '</table>';
383 else if TagString = 'db' then
384 ReplaceText := DataModule1.FDTable1.FieldByName('database').AsString;
387 function TWebModule1.mente: Boolean;
389 if DataModule1.FDTable3.FieldByName('mente').AsBoolean = true then
393 '<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>' +
394 '<p style=text-align:center><a href=/admin>
\8aÇ
\97\9d\8eÒ
\97p
\83\8d\83O
\83C
\83\93</a>'
400 procedure TWebModule1.pages(count: Integer; var page: Integer);
404 max := DataModule1.FDTable3.FieldByName('count').AsInteger;
405 if (page > -1) and (count < max * (page - 1)) then
407 page := (count div max) + 1;
408 if count mod max = 0 then
414 DataModule1.FDTable2.Last;
415 DataModule1.FDTable2.MoveBy(1 - max);
418 DataModule1.FDTable2.First;
419 DataModule1.FDTable2.MoveBy(max * (page - 1));
423 procedure TWebModule1.mailHTMLTag(Sender: TObject; Tag: TTag;
424 const TagString: string; TagParams: TStrings; var ReplaceText: string);
426 if TagString = 'pr' then
427 ReplaceText := promotion
428 else if TagString = 'content' then
429 ReplaceText := articles.Content
430 else if TagString = 'query' then
431 ReplaceText := '?' + Request.Query
432 else if TagString = 'number' then
433 ReplaceText := Request.QueryFields.Values['num'];
436 procedure TWebModule1.searchHTMLTag(Sender: TObject; Tag: TTag;
437 const TagString: string; TagParams: TStrings; var ReplaceText: string);
446 DataModule1.FDTable2.First;
447 while DataModule1.FDTable2.Eof = false do
449 s.Text := DataModule1.FDTable2.FieldByName('raw').AsString;
450 ss.DelimitedText := Request.ContentFields.Values['word1'];
451 for j := 0 to ss.count - 1 do
452 for i := 0 to s.count - 1 do
453 if Pos(ss[j], s[i]) > 0 then
456 ReplaceText := ReplaceText + items.Content;
461 if j = ss.count - 1 then
463 ReplaceText := ReplaceText + items.Content;
469 else if i = s.count - 1 then
472 DataModule1.FDTable2.Next;
477 if TagString = 'pr' then
478 ReplaceText := promotion
479 else if (Request.MethodType = mtPost) and (TagString = 'items') then
481 if Request.ContentFields.Values['type'] = 'OR' then
485 s := TStringList.Create;
486 ss := TStringList.Create;
489 ss.StrictDelimiter := false;
490 if Request.QueryFields.Values['db'] = '' then
492 DataModule1.FDTable1.First;
493 while DataModule1.FDTable1.Eof = false do
496 DataModule1.FDTable1.Next;
506 else if TagString = 'query' then
508 ReplaceText := Request.Query;
509 if ReplaceText <> '' then
510 ReplaceText := '?' + ReplaceText;
512 else if TagString = 'css' then
513 ReplaceText := css2.Content;
516 procedure TWebModule1.tiHTMLTag(Sender: TObject; Tag: TTag;
517 const TagString: string; TagParams: TStrings; var ReplaceText: string);
519 if TagString = 'count' then
521 DataModule1.FDTable1.Locate('dbnum',
522 DataModule1.FDQuery1.FieldByName('dbnum').AsInteger);
523 ReplaceText := DataModule1.FDTable2.RecordCount.ToString;
525 else if TagString = 'database' then
526 ReplaceText := DataModule1.FDTable1.Lookup('dbnum',
527 DataModule1.FDQuery1.FieldByName('dbnum').AsInteger, 'database');
530 procedure TWebModule1.titleHTMLTag(Sender: TObject; Tag: TTag;
531 const TagString: string; TagParams: TStrings; var ReplaceText: string);
533 if TagString = 'pr' then
534 ReplaceText := promotion
535 else if TagString = 'js' then
536 ReplaceText := detail(TagString, TagParams.Values['id'])
537 else if TagString = 'main' then
538 with DataModule1.FDQuery1 do
543 ReplaceText := ReplaceText + ti.Content;
550 procedure TWebModule1.topHTMLTag(Sender: TObject; Tag: TTag;
551 const TagString: string; TagParams: TStrings; var ReplaceText: string);
556 if TagString = 'pr' then
557 ReplaceText := promotion
558 else if TagString = 'list' then
560 i := DataModule1.FDTable3.FieldByName('info').AsInteger;
561 for k := 0 to tcnt do
563 if DataModule1.FDTable1.Eof = true then
566 j := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
567 s := DataModule1.FDTable1.FieldByName('database').AsString;
568 if (i = j) or (s = 'master') then
570 DataModule1.FDTable1.Next;
573 DataModule1.FDTable2.Last;
574 if Now - DataModule1.FDTable2.FieldByName('date').AsDateTime < 1 then
575 t := 'background-color:aqua;';
576 if DataModule1.FDTable2.RecordCount >= 10 *
577 DataModule1.FDTable3.FieldByName('count').AsInteger then
578 t := t + 'color:red;';
581 ReplaceText := ReplaceText +
582 Format('<p><a%s target=_blank href="/index?db=%d">%s</a><br></p>',
584 DataModule1.FDTable1.Next;
587 else if TagString = 'info' then
588 ReplaceText := DataModule1.FDTable1.Lookup('dbnum',
589 DataModule1.FDTable3.FieldByName('info').AsInteger, 'database')
590 else if TagString = 'dbnum' then
591 ReplaceText := DataModule1.FDTable3.FieldByName('info').AsString
592 else if (TagString = 'css') or (TagString = 'js') then
593 ReplaceText := detail(TagString, TagParams.Values['id'])
594 else if TagString = 'slide' then
596 for i := 1 to (DataModule1.FDTable1.RecordCount div tcnt) + 1 do
597 ReplaceText := ReplaceText +
598 '<div class="slide"><img src="/src?name=slide' + i.ToString +
599 '.jpg" style=float:right;height:465px><#list></div>';
603 procedure TWebModule1.WebModule1admdelAction(Sender: TObject;
604 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
611 DataModule1.FDTable2.RecNo := admin.Tag;
612 for i := 0 to Request.ContentFields.count - 1 do
614 reg := TRegEx.Create('\d+');
615 match := reg.match(Request.ContentFields[i]);
616 if match.Success = true then
618 k := match.Value.ToInteger - j - 1;
619 j := match.Value.ToInteger;
621 DataModule1.FDTable2.Next;
622 DataModule1.FDTable2.Delete;
625 WebModule1adminAction(nil, Request, Response, Handled);
628 procedure TWebModule1.WebModule1adminAction(Sender: TObject;
629 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
634 s := Request.CookieFields.Values['user'];
635 if (s = '') or (hash(s) <> DataModule1.FDTable3.FieldByName('password')
638 WebModule1loginAction(nil, Request, Response, Handled);
641 admin.MaxRows := DataModule1.FDTable3.FieldByName('count').AsInteger;
642 t := Request.QueryFields.Values['db'];
644 DataModule1.FDTable1.Locate('dbnum', t, []);
645 s := Request.QueryFields.Values['num'];
646 i := StrToIntDef(s, -1);
647 pages(DataModule1.FDTable2.RecordCount, i);
650 Self.Tag := Integer(@tagstr);
651 admin.header.Text := adhead.Content;
654 ('<input type=submit value=
\8dí
\8f\9c\82·
\82é><input type=reset value=
\83\8a\83Z
\83b
\83g></form>');
655 admin.footer.Add(footer.Content);
658 admin.footer.Add('<p style=text-align:center><a href="/index' + t +
660 admin.Tag := DataModule1.FDTable2.RecNo;
661 Response.ContentType := 'text/html;charset=utf-8';
662 Response.Content := admin.Content;
665 procedure TWebModule1.WebModule1adminsetAction(Sender: TObject;
666 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
670 s := Request.ContentFields.Values['pass'];
671 with DataModule1.FDTable3 do
674 FieldByName('mente').AsBoolean := Request.ContentFields.Values
679 FieldByName('password').AsString := hash(s);
680 with Response.Cookies.Add do
690 WebModule1adminAction(nil, Request, Response, Handled);
693 procedure TWebModule1.WebModule1alertAction(Sender: TObject;
694 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
696 num1, num2, i, dbnum: Integer;
698 dbnum := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
699 num1 := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
700 num2 := Request.QueryFields.Values['num'].ToInteger;
701 if Request.MethodType = mtGet then
703 DataModule1.FDTable2.Locate('number', num2, []);
704 Response.ContentType := 'text/html;charset=utf-8';
705 Response.Content := mail.Content;
708 with DataModule1.FDTable4 do
711 i := FieldByName('id').AsInteger + 1;
712 AppendRecord([i, num1, num2, Now, Request.ContentFields.Values
714 Response.SendRedirect(Format('/index?db=%d&num=%d#%d', [dbnum, i, num2]));
718 procedure TWebModule1.WebModule1deleteAction(Sender: TObject;
719 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
724 s := Request.ContentFields.Values['num'];
728 s := hash(Request.ContentFields.Values['password']);
729 with DataModule1.FDTable2 do
730 if Locate('number;pass', VarArrayOf([num, s])) = true then
733 FieldByName('title').AsString := '';
734 FieldByName('name').AsString := ' - - - ';
735 FieldByName('comment').AsString := '<em>
\93\8a\8de
\8eÒ
\82É
\82æ
\82è
\8dí
\8f\9c\82³
\82ê
\82Ü
\82µ
\82½.</em>';
736 FieldByName('raw').AsString := '';
737 FieldByName('date').AsDateTime := Now;
739 WebModule1jumpAction(nil, Request, Response, Handled);
742 WebModule1indexpageAction(nil, Request, Response, Handled);
745 procedure TWebModule1.WebModule1fileAction(Sender: TObject;
746 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
750 s := Request.QueryFields.Values['type'];
752 Response.ContentType := 'text/javascript'
753 else if s = 'css' then
754 Response.ContentType := 'text/css';
755 Response.Content := detail(s, Request.QueryFields.Values['id']);
758 procedure TWebModule1.WebModule1helpAction(Sender: TObject;
759 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
764 Response.ContentType := 'text/html;charset=utf-8';
765 if Request.MethodType = mtPost then
767 i := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;;
768 j := DataModule1.FDTable2.FieldByName('number').AsInteger;
769 s := Request.ContentFields.Values['help'];
770 DataModule1.FDTable4.Last;
771 k := DataModule1.FDTable4.FieldByName('ID').AsInteger + 1;
772 DataModule1.FDTable4.AppendRecord([k, i, j, Now, s]);
774 Response.Content := help.Content;
777 procedure TWebModule1.WebModule1imgAction(Sender: TObject; Request: TWebRequest;
778 Response: TWebResponse; var Handled: Boolean);
781 res: TResourceStream;
783 with DataModule1.FDTable5 do
785 s := Request.ContentFields.Values['name'];
786 Response.ContentType := 'image/jpeg';
787 if Locate('name', s) = true then
788 Response.ContentStream := CreateBlobStream(FieldByName('source'), bmRead)
789 else if s = 'sprites.png' then
791 Response.ContentType := 'image/png';
792 res := TResourceStream.Create(HInstance, 'PngImage_1', RT_RCDATA);
793 Response.ContentStream := res;
796 Response.ContentStream := nil;
800 procedure TWebModule1.WebModule1indexpageAction(Sender: TObject;
801 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
806 s := Request.QueryFields.Values['db'];
808 DataModule1.FDTable1.Locate('dbnum', s, []);
809 int := StrToIntDef(Request.QueryFields.Values['num'], -1);
810 pages(DataModule1.FDTable2.RecordCount, int);
813 Self.Tag := Integer(@tagstr);
814 Response.ContentType := 'text/html; charset="utf-8"';
815 if mente = false then
816 Response.Content := index.Content;
819 procedure TWebModule1.WebModule1jumpAction(Sender: TObject;
820 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
825 DB := Request.QueryFields.Values['db'];
826 s := Request.ContentFields.Values['num'];
828 DataModule1.FDTable1.Locate('dbnum', DB.ToInteger, []);
829 DataModule1.FDTable2.Locate('number', s.ToInteger, []);
831 pages(DataModule1.FDTable2.RecNo, page);
832 Response.SendRedirect(Format('/index?db=%s&num=%d#%s', [DB, page, s]));
835 procedure TWebModule1.WebModule1linkAction(Sender: TObject;
836 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
841 s := Request.QueryFields.Values['num'];
845 if DataModule1.FDTable2.Locate('number', num, []) = true then
847 Response.ContentType := 'text/html;charset=utf-8';
848 Response.Content := articles.Content;
852 procedure TWebModule1.WebModule1loginAction(Sender: TObject;
853 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
859 if Request.MethodType = mtGet then
861 Response.ContentType := 'text/html;charset=utf-8';
862 Response.Content := login.Content;
865 s := Request.ContentFields.Values['record'];
866 v := DataModule1.FDTable1.Lookup('database', s, 'dbnum');
867 if VarIsNull(v) = false then
869 with Response.Cookies.Add do
872 Value := hash(Request.ContentFields.Values['password']);
878 Response.SendRedirect('/master')
880 Response.SendRedirect('/admin?db=' + i.ToString);
884 Response.ContentType := 'text/html;charset=utf-8';
885 Response.Content := login.Content;
889 procedure TWebModule1.WebModule1logoutAction(Sender: TObject;
890 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
896 with Response.Cookies.Add do
901 s := Request.QueryFields.Values['db'];
902 i := StrToIntDef(s, -1);
903 x := DataModule1.FDTable1.Locate('dbnum', i);
904 if (x = true) and (DataModule1.FDTable1.FieldByName('database')
905 .AsString = 'master') then
908 Response.SendRedirect('/')
910 Response.SendRedirect('/index?db=' + s);
913 procedure TWebModule1.WebModule1masterAction(Sender: TObject;
914 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
919 if hash(Request.CookieFields.Values['user']) <>
920 DataModule1.FDTable3.FieldByName('password').AsString then
922 with DataModule1.FDTable1 do
923 if Locate('database', 'master') = false then
924 AppendRecord([RecordCount, 'master']);
925 WebModule1loginAction(nil, Request, Response, Handled);
928 if Request.MethodType = mtPost then
930 s := Request.ContentFields.Values['delete'];
932 with DataModule1.FDTable4 do
933 while (Bof = false) or (Eof = false) do
937 DataModule1.FDTable4.First;
938 while DataModule1.FDTable4.Eof = false do
940 i := DataModule1.FDTable4.FieldByName('dbname').AsInteger;
941 if DataModule1.FDTable1.Locate('dbnum', i) = true then
943 i := DataModule1.FDTable4.FieldByName('posnum').AsInteger;
944 if DataModule1.FDTable2.Locate('number', i) = false then
946 DataModule1.FDTable4.Delete;
950 DataModule1.FDTable4.Next;
954 Response.ContentType := 'text/html;charset=utf-8';
955 Response.Content := master.Content;
958 procedure TWebModule1.WebModule1registAction(Sender: TObject;
959 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
962 title, na, raw, pass, kotoba, error: string;
963 comment: TStringList;
965 function scan(Text: string): string;
968 coll: TMatchCollection;
972 Text := TNetEncoding.HTML.Encode(Text);
973 s := TNetEncoding.HTML.Encode('>>');
974 reg := TRegEx.Create(s + '(\d+)');
975 coll := reg.Matches(Text);
976 for j := coll.count - 1 downto 0 do
978 Delete(Text, coll[j].index, coll[j].Length);
979 t := Copy(coll[j].Value, Length(s) + 1, coll[j].Length);
981 ('<a class=minpreview data-preview-url=/link?num=%s href=/jump?num=%s>>>%s</a>',
983 Insert(result, Text, coll[j].index);
990 kotoba := Request.ContentFields.Values['aikotoba'];
991 if kotoba <> '
\82°
\82ñ
\82«' then
992 error := '<section style=color:red><p>
\8d\87\8c¾
\97t
\82ª
\82¿
\82ª
\82¢
\82Ü
\82·.';
993 with DataModule1.FDTable2 do
996 number := FieldByName('number').AsInteger + 1;
998 with Request.ContentFields do
1000 title := Values['title'];
1001 na := Values['name'];
1002 raw := Values['comment'];
1003 pass := hash(Values['password']);
1006 title := '
\83^
\83C
\83g
\83\8b\82È
\82µ.';
1007 with Response.Cookies.Add do
1011 Value := '
\92N
\82©
\82³
\82ñ.'
1014 Expires := Now + 14;
1017 with Response.Cookies.Add do
1021 Expires := Now + 14;
1023 comment := TStringList.Create;
1025 comment.Text := raw;
1026 for i := 0 to comment.count - 1 do
1028 if Pos('ng', comment[i]) > 0 then
1030 error := error + '<p>
\8bÖ
\8e~
\8cê
\8bå
\82ª
\8aÜ
\82Ü
\82ê
\82Ä
\82¢
\82Ü
\82·.';
1033 comment[i] := '<p>' + scan(comment[i]);
1035 x := Request.ContentFields.Values['show'] = 'true';
1037 error := error + '</section>'
1038 else if x = true then
1040 error := '<p style=font-size:2.3em;color:blue>
\81«
\81«
\83v
\83\8c\83r
\83\85\81[
\81«
\81«<p>' +
1042 Request.ContentFields.Values['show'] := 'false';
1043 Request.ContentFields.Values['preview'] := error;
1044 Request.ContentFields.Values['raw'] := raw;
1048 i := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
1049 DataModule1.FDTable2.AppendRecord([i, number, title, na, comment.Text,
1051 Response.SendRedirect('index?db=' + i.ToString + '#article');
1057 WebModule1indexpageAction(nil, Request, Response, Handled);
1060 procedure TWebModule1.WebModule1searchAction(Sender: TObject;
1061 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1063 Response.ContentType := 'text/html;charset=utf-8';
1064 Response.Content := search.Content;
1067 procedure TWebModule1.WebModule1titleAction(Sender: TObject;
1068 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1070 Response.ContentType := 'text/html;charset=utf-8';
1071 Response.Content := title.Content;
1074 procedure TWebModule1.WebModule1topAction(Sender: TObject; Request: TWebRequest;
1075 Response: TWebResponse; var Handled: Boolean);
1077 Response.ContentType := 'text/html;charset=utf-8';
1078 DataModule1.FDTable1.First;
1079 if mente = false then
1080 Response.Content := top.ContentFromString(top.Content);
1083 procedure TWebModule1.WebModuleCreate(Sender: TObject);
1090 if FDTable1.Exists = false then
1091 FDTable1.CreateTable;
1092 if FDTable2.Exists = false then
1093 FDTable2.CreateTable;
1094 if FDTable3.Exists = false then
1095 FDTable3.CreateTable;
1096 if FDTable4.Exists = false then
1097 FDTable4.CreateTable;
1098 if FDTable5.Exists = false then
1099 FDTable5.CreateTable;
1109 if DataModule1.FDTable1.Bof and DataModule1.FDTable1.Eof then
1111 DataModule1.FDTable1.AppendRecord([0, 'info']);
1113 DataModule1.FDTable1.AppendRecord([i, '
\8cf
\8e¦
\94Â' + i.ToString]);
1115 if DataModule1.FDTable3.Bof and DataModule1.FDTable3.Eof then
1117 a := DataModule1.FDTable1.Lookup('database', 'info', 'dbnum');
1118 DataModule1.FDTable3.AppendRecord
1119 (['
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86',
1120 '<h1 style=color:maron;text-align:center;font-style:italic>
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86</h1>',
1121 false, a, 30, hash(hash('admin'))]);