OSDN Git Service

images テーブルの作成に関して見落としがありました
[newbbs/newbbs.git] / WebModuleUnit1.pas
1 unit WebModuleUnit1;
2
3 interface
4
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
13 type
14   TWebModule1 = class(TWebModule)
15     articles: TDataSetPageProducer;
16     index: TDataSetPageProducer;
17     admin: TDataSetTableProducer;
18     search: TPageProducer;
19     items: TDataSetPageProducer;
20     help: TPageProducer;
21     top: TPageProducer;
22     master: TPageProducer;
23     alert: TDataSetPageProducer;
24     footer: TDataSetPageProducer;
25     mail: TPageProducer;
26     css1: TPageProducer;
27     css2: TPageProducer;
28     css3: TPageProducer;
29     css4: TPageProducer;
30     header: TDataSetPageProducer;
31     login: TDataSetPageProducer;
32     js1: TPageProducer;
33     js2: TPageProducer;
34     js3: TPageProducer;
35     js4: TPageProducer;
36     adhead: TPageProducer;
37     js5: TPageProducer;
38     title: TPageProducer;
39     ti: TDataSetPageProducer;
40     FDTable2: TFDTable;
41     FDTable2DBNUM: TIntegerField;
42     FDTable2NUMBER: TIntegerField;
43     FDTable2TITLE: TWideStringField;
44     FDTable2NAME: TWideStringField;
45     FDTable2COMMENT: TWideMemoField;
46     FDTable2RAW: TWideMemoField;
47     FDTable2DATE: TDateField;
48     FDTable2PASS: TWideStringField;
49     FDTable5: TFDTable;
50     FDQuery1: TFDQuery;
51     FDTable4: TFDTable;
52     FDTable4ID: TIntegerField;
53     FDTable4DBNAME: TIntegerField;
54     FDTable4POSNUM: TIntegerField;
55     FDTable4DATE: TDateField;
56     FDTable4REQUEST: TWideMemoField;
57     DataSource1: TDataSource;
58     FDTable3: TFDTable;
59     FDTable3TITLE: TWideStringField;
60     FDTable3TITLE2: TWideStringField;
61     FDTable3mente: TBooleanField;
62     FDTable3INFO: TIntegerField;
63     FDTable3COUNT: TIntegerField;
64     FDTable3password: TWideStringField;
65     FDTable3ng: TWideStringField;
66     FDConnection1: TFDConnection;
67     FDTable1: TFDTable;
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);
143   private
144     { private \90é\8c¾ }
145     ss: TStringList;
146     tagstr: 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;
155   public
156     { public \90é\8c¾ }
157   end;
158
159 var
160   WebModuleClass: TComponentClass = TWebModule1;
161
162 implementation
163
164 { %CLASSGROUP 'Vcl.Controls.TControl' }
165
166 uses IdHashSHA, IdGlobal, IdHash, IdHashMessageDigest, Jpeg, Graphics;
167
168 {$R *.dfm}
169
170 const
171   promotion = '\8dL\8d\90:';
172   tcnt = 7;
173
174 procedure TWebModule1.adheadHTMLTag(Sender: TObject; Tag: TTag;
175   const TagString: string; TagParams: TStrings; var ReplaceText: string);
176 begin
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'];
184 end;
185
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);
190 begin
191   if (CellColumn = 0) and (CellRow > 0) then
192     CellData := Format('<input name=check%d type=checkbox>', [CellRow]);
193 end;
194
195 procedure TWebModule1.alertHTMLTag(Sender: TObject; Tag: TTag;
196   const TagString: string; TagParams: TStrings; var ReplaceText: string);
197 var
198   s: TStringList;
199   i: Integer;
200 begin
201   if (TagString = 'plus') and (alert.Tag = 0) then
202     ReplaceText :=
203       '<a href=/jump?db=<#dbname>&num=<#posnum>>[ <#dbname>-<#posnum> ]</a>'
204   else if TagString = 'article' then
205   begin
206     if (FDTable1.Locate('dbnum', FDTable4.FieldByName('dbname').AsInteger)
207       = false) or (FDTable2.Locate('number', FDTable4.FieldByName('posnum')
208       .AsInteger) = false) then
209     begin
210       ReplaceText := '<p>\83\8a\83N\83G\83X\83g';
211       Exit;
212     end;
213     s := TStringList.Create;
214     try
215       s.Text := articles.Content;
216       for i := 1 to 2 do
217         s.Delete(1);
218       for i := s.count - 1 downto 0 do
219         if Copy(s[i], 1, 18) = '<section id=master' then
220         begin
221           s.Delete(i);
222           break;
223         end;
224       ReplaceText := s.Text;
225     finally
226       s.Free;
227     end;
228   end
229   else if TagString = 'request' then
230     ReplaceText := FDTable4.FieldByName('request').AsString;
231 end;
232
233 procedure TWebModule1.articlesHTMLTag(Sender: TObject; Tag: TTag;
234   const TagString: string; TagParams: TStrings; var ReplaceText: string);
235 begin
236   if TagString = 'comment' then
237     ReplaceText := FDTable2.FieldByName('comment').AsString;
238 end;
239
240 function TWebModule1.detail(ts, pid: string): string;
241 var
242   i: Integer;
243 begin
244   for i := 0 to ComponentCount - 1 do
245     if Components[i].Name = ts + pid then
246       result := (Components[i] as TPageProducer).Content;
247 end;
248
249 procedure TWebModule1.footerHTMLTag(Sender: TObject; Tag: TTag;
250   const TagString: string; TagParams: TStrings; var ReplaceText: string);
251 var
252   i: Integer;
253 begin
254   if TagString = 'link' then
255   begin
256     for i := 1 to 10 do
257       if i = index.Tag then
258         ReplaceText := ReplaceText + ' ' + i.ToString + ' '
259       else
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]);
263   end
264   else if TagString = 'recent' then
265     if index.Tag = -1 then
266       ReplaceText := TagString
267     else
268       ReplaceText := '<a style=text-decoration-line:none href="' +
269         PString(Self.Tag)^ + '?db=' + FDTable1.FieldByName('dbnum').AsString +
270         '">recent</a>';
271 end;
272
273 function TWebModule1.hash(str: string): string;
274 begin
275   with TIdHashSHA1.Create do
276   begin
277     try
278       result := HashStringAsHex(str);
279     finally
280       Free;
281     end;
282   end;
283 end;
284
285 procedure TWebModule1.headerHTMLTag(Sender: TObject; Tag: TTag;
286   const TagString: string; TagParams: TStrings; var ReplaceText: string);
287 var
288   s: string;
289 begin
290   if TagString = 'cookie' then
291   begin
292     s := TagParams.Values['param'];
293     ReplaceText := TNetEncoding.URL.Decode(Request.CookieFields.Values[s]);
294   end
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'];
306 end;
307
308 procedure TWebModule1.helpHTMLTag(Sender: TObject; Tag: TTag;
309   const TagString: string; TagParams: TStrings; var ReplaceText: string);
310 begin
311   if TagString = 'pr' then
312     ReplaceText := promotion
313   else if TagString = 'area' then
314     if help.Tag = 0 then
315     begin
316       ss := TStringList.Create;
317       try
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;
324       finally
325         ss.Free;
326       end;
327     end
328     else
329       ReplaceText :=
330         '<p style=color:yellow;background-color:aqua>\82²\95ñ\8d\90\82 \82è\82ª\82Æ\82¤\82²\82´\82¢\82Ü\82·.';
331 end;
332
333 procedure TWebModule1.indexHTMLTag(Sender: TObject; Tag: TTag;
334   const TagString: string; TagParams: TStrings; var ReplaceText: string);
335 var
336   i: Integer;
337 begin
338   if TagString = 'pr' then
339     ReplaceText := promotion
340   else if TagString = 'article' then
341   begin
342     for i := 1 to FDTable3.FieldByName('count').AsInteger do
343     begin
344       if FDTable2.Eof = true then
345         break;
346       if isInfo = false then
347         ReplaceText := ReplaceText + articles.Content
348       else
349         ReplaceText := articles.Content + ReplaceText;
350       FDTable2.Next;
351     end;
352   end
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>'
359     else
360     begin
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>'
364       else
365         ReplaceText := header.Content;
366     end
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;
373 end;
374
375 function TWebModule1.isInfo: Boolean;
376 begin
377   result := FDTable1.FieldByName('dbnum').AsInteger = FDTable3.FieldByName
378     ('info').AsInteger;
379 end;
380
381 procedure TWebModule1.itemsHTMLTag(Sender: TObject; Tag: TTag;
382   const TagString: string; TagParams: TStrings; var ReplaceText: string);
383 var
384   s: TStringList;
385   t, str: string;
386   i, j: Integer;
387 begin
388   if TagString = 'item' then
389   begin
390     s := TStringList.Create;
391     try
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
396             if Self.Tag = 0 then
397               s[i] := '<p style=background-color:aqua>' + s[i]
398             else
399               s[i] := '<p style=background-color:yellow>' + s[i];
400       with FDTable2 do
401       begin
402         i := FieldByName('dbnum').AsInteger;
403         j := FieldByName('number').AsInteger;
404         str := Request.QueryFields.Values['db'];
405         if str = '' then
406           t := Format('<a href="/jump?db=%d&num=%d">[ %d-%d ]</a>',
407             [i, j, i, j])
408         else
409           t := Format('<a href="/jump?db=%s&num=%d">[ %d ]</a>', [str, j, j]);
410       end;
411       ReplaceText := t + s.Text;
412     finally
413       s.Free;
414     end;
415   end;
416 end;
417
418 function TWebModule1.loginCheck: Boolean;
419 begin
420   result := hash(Request.CookieFields.Values['user']) = FDTable3.FieldByName
421     ('password').AsString;
422 end;
423
424 procedure TWebModule1.loginHTMLTag(Sender: TObject; Tag: TTag;
425   const TagString: string; TagParams: TStrings; var ReplaceText: string);
426 begin
427   if TagString = 'pr' then
428     ReplaceText := promotion;
429 end;
430
431 procedure TWebModule1.masterHTMLTag(Sender: TObject; Tag: TTag;
432   const TagString: string; TagParams: TStrings; var ReplaceText: string);
433 begin
434   if TagString = 'pr' then
435     ReplaceText := promotion
436   else if TagString = 'request' then
437     with FDTable4 do
438     begin
439       First;
440       ReplaceText := '<table border=1 align=center>';
441       while Eof = false do
442       begin
443         if FieldByName('posnum').AsInteger = -1 then
444           alert.Tag := 1
445         else
446           alert.Tag := 0;
447         ReplaceText := ReplaceText + alert.ContentFromString(alert.Content);
448         Next;
449       end;
450       ReplaceText := ReplaceText + '</table>';
451     end;
452 end;
453
454 function TWebModule1.mente: Boolean;
455 begin
456   if FDTable3.FieldByName('mente').AsBoolean = true then
457   begin
458     result := true;
459     Response.Content :=
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>'
462   end
463   else
464     result := false;
465 end;
466
467 procedure TWebModule1.pages(count: Integer; var page: Integer);
468 var
469   max: Integer;
470 begin
471   max := FDTable3.FieldByName('count').AsInteger;
472   if (page > -1) and (count < max * (page - 1)) then
473   begin
474     page := (count div max) + 1;
475     if count mod max = 0 then
476       dec(page);
477   end;
478   case page of
479     - 1:
480       begin
481         FDTable2.Last;
482         FDTable2.MoveBy(1 - max);
483       end;
484   else
485     FDTable2.First;
486     FDTable2.MoveBy(max * (page - 1));
487   end;
488 end;
489
490 procedure TWebModule1.mailHTMLTag(Sender: TObject; Tag: TTag;
491   const TagString: string; TagParams: TStrings; var ReplaceText: string);
492 begin
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'];
501 end;
502
503 procedure TWebModule1.searchHTMLTag(Sender: TObject; Tag: TTag;
504   const TagString: string; TagParams: TStrings; var ReplaceText: string);
505 var
506   s: TStringList;
507   procedure sub;
508   var
509     i: Integer;
510     j: Integer;
511   label jump;
512   begin
513     FDTable2.First;
514     while FDTable2.Eof = false do
515     begin
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
521             if Self.Tag = 0 then
522             begin
523               ReplaceText := ReplaceText + items.Content;
524               goto jump;
525             end
526             else
527             begin
528               if j = ss.count - 1 then
529               begin
530                 ReplaceText := ReplaceText + items.Content;
531                 goto jump;
532               end
533               else
534                 break;
535             end
536           else if i = s.count - 1 then
537             goto jump;
538     jump:
539       FDTable2.Next;
540     end;
541   end;
542
543 begin
544   if TagString = 'pr' then
545     ReplaceText := promotion
546   else if (Request.MethodType = mtPost) and (TagString = 'items') then
547   begin
548     if Request.ContentFields.Values['type'] = 'OR' then
549       Self.Tag := 0
550     else
551       Self.Tag := 1;
552     s := TStringList.Create;
553     ss := TStringList.Create;
554     try
555       ss.Delimiter := ' ';
556       ss.StrictDelimiter := false;
557       if Request.QueryFields.Values['db'] = '' then
558       begin
559         FDTable1.First;
560         while FDTable1.Eof = false do
561         begin
562           sub;
563           FDTable1.Next;
564         end;
565       end
566       else
567         sub;
568     finally
569       s.Free;
570       ss.Free;
571     end;
572   end
573   else if TagString = 'query' then
574   begin
575     ReplaceText := Request.Query;
576     if ReplaceText <> '' then
577       ReplaceText := '?' + ReplaceText;
578   end
579   else if TagString = 'css' then
580     ReplaceText := css2.Content
581   else if TagString = 'dbnum' then
582     ReplaceText := Request.QueryFields.Values['dbnum'];
583 end;
584
585 procedure TWebModule1.setLastArticle;
586 begin
587   FDTable2.Last;
588 end;
589
590 procedure TWebModule1.strsCheck(var Error: string; var list: TStringList);
591 var
592   s: TStringList;
593   i, j: Integer;
594   x: Boolean;
595 begin
596   x := false;
597   s := TStringList.Create;
598   try
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
602       begin
603         if Pos(s[i], list[j]) > 0 then
604           x := true;
605         list[j] := '<p>' + list[j];
606       end;
607   finally
608     s.Free;
609   end;
610   if x = true then
611     Error := Error + '<p>\8bÖ\8e~\8cê\8bå\82ª\8aÜ\82Ü\82ê\82Ä\82¢\82Ü\82·.';
612 end;
613
614 procedure TWebModule1.tiHTMLTag(Sender: TObject; Tag: TTag;
615   const TagString: string; TagParams: TStrings; var ReplaceText: string);
616 begin
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
622     with FDTable2 do
623     begin
624       Last;
625       ReplaceText := FieldByName('date').AsString;
626     end;
627 end;
628
629 procedure TWebModule1.titleHTMLTag(Sender: TObject; Tag: TTag;
630   const TagString: string; TagParams: TStrings; var ReplaceText: string);
631 begin
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
637     FDQuery1.Open;
638   FDTable1.First;
639   while (FDQuery1.Eof = false) and (FDTable1.Eof = false) do
640   begin
641     if FDTable1.FieldByName('dbnum').AsInteger = FDQuery1.FieldByName('dbnum').AsInteger
642     then
643     begin
644       ReplaceText := ReplaceText + ti.Content;
645       FDQuery1.Next;
646     end
647     else if FDTable2.Eof = false then
648     begin
649       ti.DataSet := nil;
650       try
651         ReplaceText := ReplaceText + ti.Content;
652       finally
653         ti.DataSet := FDQuery1;
654       end;
655     end;
656     FDTable1.Next;
657   end;
658   FDQuery1.Close;
659 end;
660
661 procedure TWebModule1.topHTMLTag(Sender: TObject; Tag: TTag;
662   const TagString: string; TagParams: TStrings; var ReplaceText: string);
663 var
664   s, t: string;
665   i, j, k: Integer;
666 begin
667   if TagString = 'pr' then
668     ReplaceText := promotion
669   else if TagString = 'list' then
670   begin
671     i := FDTable3.FieldByName('info').AsInteger;
672     for k := 0 to tcnt do
673     begin
674       if FDTable1.Eof = true then
675         break;
676       t := '';
677       j := FDTable1.FieldByName('dbnum').AsInteger;
678       s := FDTable1.FieldByName('database').AsString;
679       if (i = j) or (s = 'master') then
680       begin
681         FDTable1.Next;
682         continue;
683       end;
684       FDTable2.Last;
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
689       then
690         t := t + 'color:red;';
691       if t <> '' then
692         t := ' style=' + t;
693       ReplaceText := ReplaceText +
694         Format('<p><a%s target=_blank href="/index?db=%d">%s</a><br></p>',
695         [t, j, s]);
696       FDTable1.Next;
697     end;
698   end
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
707   begin
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>';
712   end;
713 end;
714
715 procedure TWebModule1.WebModule1admdelAction(Sender: TObject;
716   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
717 var
718   i, j, k, m: Integer;
719   reg: TRegEx;
720   match: TMatch;
721 begin
722   j := 0;
723   FDTable2.RecNo := admin.Tag;
724   for i := 0 to Request.ContentFields.count - 1 do
725   begin
726     reg := TRegEx.Create('\d+');
727     match := reg.match(Request.ContentFields[i]);
728     if match.Success = true then
729     begin
730       k := match.Value.ToInteger - j - 1;
731       j := match.Value.ToInteger;
732       for m := 1 to k do
733         FDTable2.Next;
734       FDTable2.Delete;
735     end;
736   end;
737   WebModule1adminAction(nil, Request, Response, Handled);
738 end;
739
740 procedure TWebModule1.WebModule1adminAction(Sender: TObject;
741   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
742 var
743   s, t: string;
744   i: Integer;
745 begin
746   s := Request.CookieFields.Values['user'];
747   if (s = '') or (loginCheck = false) then
748   begin
749     WebModule1loginAction(nil, Request, Response, Handled);
750     Exit;
751   end;
752   admin.MaxRows := FDTable3.FieldByName('count').AsInteger;
753   t := Request.QueryFields.Values['db'];
754   if t <> '' then
755     FDTable1.Locate('dbnum', t, []);
756   s := Request.QueryFields.Values['num'];
757   i := StrToIntDef(s, -1);
758   pages(FDTable2.RecordCount, i);
759   index.Tag := i;
760   tagstr := '/admin';
761   Self.Tag := Integer(@tagstr);
762   admin.header.Text := adhead.Content;
763   admin.footer.Clear;
764   admin.footer.Add
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);
767   if t <> '' then
768     t := '?db=' + t;
769   admin.footer.Add('<p style=text-align:center><a href="/index' + t +
770     '">\96ß\82é</a>');
771   admin.Tag := FDTable2.RecNo;
772   Response.ContentType := 'text/html;charset=utf-8';
773   Response.Content := admin.Content;
774 end;
775
776 procedure TWebModule1.WebModule1adminsetAction(Sender: TObject;
777   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
778 var
779   s: string;
780 begin
781   s := Request.ContentFields.Values['pass'];
782   with FDTable3 do
783   begin
784     Edit;
785     FieldByName('mente').AsBoolean := Request.ContentFields.Values
786       ['mente'] = 'on';
787     if s <> '' then
788     begin
789       s := hash(s);
790       FieldByName('password').AsString := hash(s);
791       with Response.Cookies.Add do
792       begin
793         Name := 'user';
794         Value := s;
795         Expires := Now + 14;
796         Secure := true;
797       end;
798     end;
799     Post;
800   end;
801   WebModule1adminAction(nil, Request, Response, Handled);
802 end;
803
804 procedure TWebModule1.WebModule1alertAction(Sender: TObject;
805   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
806 var
807   num1, num2, i: Integer;
808   s: string;
809 begin
810   num1 := FDTable1.FieldByName('dbnum').AsInteger;
811   num2 := StrToIntDef(Request.QueryFields.Values['num'], -1);
812   if num2 = -1 then
813     num1 := -1;
814   if Request.MethodType = mtGet then
815   begin
816     FDTable2.Locate('number', num2, []);
817     Response.ContentType := 'text/html;charset=utf-8';
818     Response.Content := mail.Content;
819   end
820   else
821   begin
822     with FDTable4 do
823     begin
824       Last;
825       i := FieldByName('id').AsInteger + 1;
826       s := Request.ContentFields.Values['request'];
827       if s = '' then
828         s := '(No Comment)';
829       AppendRecord([i, num1, num2, Now, s]);
830     end;
831     if num1 > -1 then
832       Response.SendRedirect(Format('/index?db=%d&num=%d#%d',
833         [num1, num2, num2]))
834     else
835       Response.SendRedirect('/top');
836   end;
837 end;
838
839 procedure TWebModule1.WebModule1deleteAction(Sender: TObject;
840   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
841 var
842   num: Integer;
843   s: string;
844 begin
845   s := Request.ContentFields.Values['num'];
846   if s = '' then
847     Exit;
848   num := s.ToInteger;
849   s := hash(Request.ContentFields.Values['password']);
850   with FDTable2 do
851     if Locate('number;pass', VarArrayOf([num, s])) = true then
852     begin
853       Edit;
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;
859       Post;
860       WebModule1jumpAction(nil, Request, Response, Handled);
861     end
862     else
863       WebModule1indexpageAction(nil, Request, Response, Handled);
864 end;
865
866 procedure TWebModule1.WebModule1fileAction(Sender: TObject;
867   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
868 var
869   s: string;
870 begin
871   s := Request.QueryFields.Values['type'];
872   if s = 'js' then
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']);
877 end;
878
879 procedure TWebModule1.WebModule1helpAction(Sender: TObject;
880   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
881 var
882   k: Integer;
883   s: string;
884 begin
885   Response.ContentType := 'text/html;charset=utf-8';
886   if Request.MethodType = mtPost then
887   begin
888     s := Request.ContentFields.Values['help'];
889     FDTable4.Last;
890     k := FDTable4.FieldByName('id').AsInteger + 1;
891     FDTable4.AppendRecord([k, -1, -1, Now, s]);
892     help.Tag := 1;
893   end
894   else
895     help.Tag := 0;
896   Response.Content := help.Content;
897 end;
898
899 procedure TWebModule1.WebModule1imgAction(Sender: TObject; Request: TWebRequest;
900   Response: TWebResponse; var Handled: Boolean);
901 var
902   s: string;
903   res: TStream;
904 begin
905   with FDTable5 do
906   begin
907     s := Request.ContentFields.Values['name'];
908     Response.ContentType := 'image/jpeg';
909     if Locate('name', s) = true then
910     begin
911       res := CreateBlobStream(FieldByName('source'), bmRead);
912       Response.ContentStream := res;
913     end
914     else if s = 'sprites.png' then
915     begin
916       Response.ContentType := 'image/png';
917       res := TResourceStream.Create(HInstance, 'PngImage_1', RT_RCDATA);
918       Response.ContentStream := res;
919     end
920     else
921       Response.ContentStream := nil;
922   end;
923 end;
924
925 procedure TWebModule1.WebModule1indexpageAction(Sender: TObject;
926   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
927 var
928   i: Integer;
929   s: string;
930 begin
931   s := Request.QueryFields.Values['db'];
932   if s <> '' then
933     FDTable1.Locate('dbnum', s, []);
934   i := StrToIntDef(Request.QueryFields.Values['num'], -1);
935   isInfo;
936   pages(FDTable2.RecordCount, i);
937   index.Tag := i;
938   tagstr := '/index';
939   Self.Tag := Integer(@tagstr);
940   Response.ContentType := 'text/html; charset="utf-8"';
941   if mente = false then
942     Response.Content := index.Content;
943 end;
944
945 procedure TWebModule1.WebModule1jumpAction(Sender: TObject;
946   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
947 var
948   DB, s: string;
949   page: Integer;
950 begin
951   DB := Request.QueryFields.Values['db'];
952   s := Request.ContentFields.Values['num'];
953   if DB <> '' then
954     FDTable1.Locate('dbnum', DB.ToInteger, []);
955   FDTable2.Locate('number', s.ToInteger, []);
956   page := 10;
957   pages(FDTable2.RecNo, page);
958   Response.SendRedirect(Format('/index?db=%s&num=%d#%s', [DB, page, s]));
959 end;
960
961 procedure TWebModule1.WebModule1linkAction(Sender: TObject;
962   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
963 var
964   num: Integer;
965   s: string;
966 begin
967   s := Request.QueryFields.Values['num'];
968   if s = '' then
969     Exit;
970   num := s.ToInteger;
971   if FDTable2.Locate('number', num, []) = true then
972   begin
973     Response.ContentType := 'text/html;charset=utf-8';
974     Response.Content := articles.Content;
975   end;
976 end;
977
978 procedure TWebModule1.WebModule1loginAction(Sender: TObject;
979   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
980 var
981   v: Variant;
982   i: Integer;
983   s: string;
984 begin
985   if Request.MethodType = mtGet then
986   begin
987     Response.ContentType := 'text/html;charset=utf-8';
988     Response.Content := login.Content;
989     Exit;
990   end;
991   s := Request.ContentFields.Values['record'];
992   v := FDTable1.Lookup('database', s, 'dbnum');
993   if VarIsNull(v) = false then
994   begin
995     with Response.Cookies.Add do
996     begin
997       Name := 'user';
998       Value := hash(Request.ContentFields.Values['password']);
999       Expires := Now + 14;
1000       // Secure := true;
1001     end;
1002     i := v;
1003     if s = 'master' then
1004       Response.SendRedirect('/master')
1005     else
1006       Response.SendRedirect('/admin?db=' + i.ToString);
1007   end
1008   else
1009   begin
1010     Response.ContentType := 'text/html;charset=utf-8';
1011     Response.Content := login.Content;
1012   end;
1013 end;
1014
1015 procedure TWebModule1.WebModule1logoutAction(Sender: TObject;
1016   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1017 var
1018   i: Integer;
1019   s: string;
1020   x: Boolean;
1021 begin
1022   with Response.Cookies.Add do
1023   begin
1024     Name := 'user';
1025     Expires := Now - 1;
1026   end;
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
1031     x := false;
1032   if x = false then
1033     Response.SendRedirect('/')
1034   else
1035     Response.SendRedirect('/index?db=' + s);
1036 end;
1037
1038 procedure TWebModule1.WebModule1masterAction(Sender: TObject;
1039   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1040 var
1041   s: string;
1042   i: Integer;
1043 begin
1044   if loginCheck = false then
1045   begin
1046     with FDTable1 do
1047       if Locate('database', 'master') = false then
1048       begin
1049         Last;
1050         i := FieldByName('dbnum').AsInteger + 1;
1051         AppendRecord([i, 'master']);
1052       end;
1053     WebModule1loginAction(nil, Request, Response, Handled);
1054     Exit;
1055   end;
1056   if Request.MethodType = mtPost then
1057   begin
1058     s := Request.ContentFields.Values['delete'];
1059     if s = 'all' then
1060       with FDTable4 do
1061         while (Bof = false) or (Eof = false) do
1062           Delete
1063     else
1064     begin
1065       FDTable4.First;
1066       while FDTable4.Eof = false do
1067       begin
1068         i := FDTable4.FieldByName('dbname').AsInteger;
1069         if FDTable1.Locate('dbnum', i) = true then
1070         begin
1071           i := FDTable4.FieldByName('posnum').AsInteger;
1072           if FDTable2.Locate('number', i) = false then
1073             FDTable4.Delete
1074           else
1075             FDTable4.Next;
1076         end
1077         else
1078           FDTable4.Delete;
1079       end;
1080     end;
1081   end;
1082   Response.ContentType := 'text/html;charset=utf-8';
1083   Response.Content := master.Content;
1084 end;
1085
1086 procedure TWebModule1.WebModule1registAction(Sender: TObject;
1087   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1088 var
1089   number, i: Integer;
1090   title, na, raw, pass, kotoba, Error: string;
1091   comment: TStringList;
1092   function scan(Text: string): string;
1093   var
1094     reg: TRegEx;
1095     coll: TMatchCollection;
1096     j: Integer;
1097     s, t: string;
1098   begin
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
1104     begin
1105       Delete(Text, coll[j].index, coll[j].Length);
1106       t := Copy(coll[j].Value, Length(s) + 1, coll[j].Length);
1107       result := Format
1108         ('<a class=minpreview data-preview-url=/link?num=%s href=/jump?num=%s>>>%s</a>',
1109         [t, t, t]);
1110       Insert(result, Text, coll[j].index);
1111     end;
1112     result := Text;
1113   end;
1114
1115 begin
1116   kotoba := Request.ContentFields.Values['aikotoba'];
1117   Error := '';
1118   if kotoba <> '\82°\82ñ\82«' then
1119     Error := Error + '<p>\8d\87\8c¾\97t\82ª\82¿\82ª\82¢\82Ü\82·.';
1120   setLastArticle;
1121   number := FDTable2.FieldByName('number').AsInteger + 1;
1122   with Request.ContentFields do
1123   begin
1124     title := Values['title'];
1125     na := Values['name'];
1126     raw := Values['comment'];
1127     pass := hash(Values['password']);
1128   end;
1129   if title = '' then
1130     title := '\83^\83C\83g\83\8b\82È\82µ.';
1131   with Response.Cookies.Add do
1132   begin
1133     Name := 'name';
1134     if na = '' then
1135       Value := '\92N\82©\82³\82ñ.'
1136     else
1137       Value := na;
1138     Expires := Now + 14;
1139   end;
1140   if Error = '' then
1141     with Response.Cookies.Add do
1142     begin
1143       Name := 'aikotoba';
1144       Value := kotoba;
1145       Expires := Now + 14;
1146     end;
1147   comment := TStringList.Create;
1148   try
1149     comment.Text := raw;
1150     strsCheck(Error, comment);
1151     Request.ContentFields.Values['raw'] := raw;
1152     if Error <> '' then
1153       Request.ContentFields.Values['preview'] := '<section style=color:red>' +
1154         Error + '</section>'
1155     else if Request.ContentFields.Values['show'] = 'true' then
1156     begin
1157       Error := '<p style=font-size:2.3em;color:blue>\81«\81«\83v\83\8c\83r\83\85\81[\81«\81«<p>' +
1158         comment.Text;
1159       Request.ContentFields.Values['preview'] := Error;
1160       Request.ContentFields.Values['show'] := 'false';
1161     end
1162     else
1163     begin
1164       i := FDTable1.FieldByName('dbnum').AsInteger;
1165       FDTable2.AppendRecord([i, number, title, na, comment.Text, raw,
1166         Now, pass]);
1167       Response.SendRedirect('index?db=' + i.ToString + '#article');
1168       Exit;
1169     end;
1170   finally
1171     comment.Free;
1172   end;
1173   WebModule1indexpageAction(nil, Request, Response, Handled);
1174 end;
1175
1176 procedure TWebModule1.WebModule1searchAction(Sender: TObject;
1177   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1178 begin
1179   Response.ContentType := 'text/html;charset=utf-8';
1180   Response.Content := search.Content;
1181 end;
1182
1183 procedure TWebModule1.WebModule1titleAction(Sender: TObject;
1184   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1185 begin
1186   Response.ContentType := 'text/html;charset=utf-8';
1187   Response.Content := title.Content;
1188 end;
1189
1190 procedure TWebModule1.WebModule1topAction(Sender: TObject; Request: TWebRequest;
1191   Response: TWebResponse; var Handled: Boolean);
1192 begin
1193   Response.ContentType := 'text/html;charset=utf-8';
1194   FDTable1.First;
1195   if mente = false then
1196     Response.Content := top.ContentFromString(top.Content);
1197 end;
1198
1199 procedure TWebModule1.WebModuleCreate(Sender: TObject);
1200 var
1201   i: Integer;
1202   s: string;
1203 begin
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;
1214   FDTable1.Open;
1215   FDTable2.Open;
1216   FDTable3.Open;
1217   FDTable4.Open;
1218   FDTable5.Open;
1219   if FDTable1.Bof and FDTable1.Eof then
1220   begin
1221     FDTable1.AppendRecord([0, 'info']);
1222     for i := 1 to 10 do
1223       FDTable1.AppendRecord([i, '\8cf\8e¦\94Â' + i.ToString]);
1224   end;
1225   if FDTable3.Bof and FDTable3.Eof then
1226   begin
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]);
1233   end;
1234 end;
1235
1236 end.