Develop and Download Open Source Software

Browse CVS Repository

Contents of /gikonavigoeson/gikonavi/HTMLCreate.pas

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.13 - (show annotations) (download) (as text)
Tue Dec 6 15:25:24 2005 UTC (18 years, 4 months ago) by h677
Branch: MAIN
Changes since 1.12: +68 -54 lines
File MIME type: text/x-pascal
・ケ・?ホHTMLコ?ョ、ホコヌナャイス

1 unit HTMLCreate;
2
3 interface
4
5 uses
6 Windows, Messages, SysUtils, Classes, {Graphics,} Controls, {Forms,}
7 ComCtrls, IniFiles, ShellAPI, Math, GikoSystem,
8 {$IF Defined(DELPRO) }
9 SHDocVw,
10 MSHTML,
11 {$ELSE}
12 SHDocVw_TLB,
13 MSHTML_TLB,
14 {$IFEND}
15 {HttpApp,} YofUtils, {URLMon,} BoardGroup, {gzip,} {Dolib,}
16 {bmRegExp,} AbonUnit, MojuUtils, Setting,
17 ExternalBoardManager, ExternalBoardPlugInMain{,}
18 {Sort,} ,GikoBayesian, HintWindow;
19
20 type
21 THTMLCreate = class(TObject)
22 private
23 { Private ツ静ゥツ固セ }
24 anchorLen : Integer;
25 pURLCHARs,pURLCHARe : PChar;
26 pANCHORs, pANCHORe : PChar;
27 pCTAGLs, pCTAGLe : PChar;
28 pCTAGUs, pCTAGUe : PChar;
29 pREF_MARKSs : array[0..9] of PChar;
30 pREF_MARKSe : array[0..9] of PChar;
31 constructor Create;
32
33 function AddBeProfileLink(AID : string; ANum: Integer):string ;
34 procedure CreateUsePluginHTML(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
35 procedure CreateUseSKINHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList);
36 procedure CreateUseCSSHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
37 procedure CreateDefaultHTML (doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
38 procedure ConvertResAnchor(PRes: PResRec);
39 procedure separateNumber(var st: String; var et: String; const Text, Separator: String);
40 public
41 { Public ツ静ゥツ固セ }
42 //function AddAnchorTag(s: string): string;
43 procedure AddAnchorTag(PRes: PResRec);
44 function LoadFromSkin(fileName: string; ThreadItem: TThreadItem; SizeByte: Integer): string;
45 function SkinedRes(const skin: string; PRes: PResRec; const No: string): string;
46 procedure ConvRes( PRes : PResRec;const Bbs: string; const Key: string; DatToHTML: boolean = false); overload;
47 function ConvRes(const Body, Bbs, Key, ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string; DatToHTML: boolean = false): string; overload;
48 // function ConvRes(const Body, Bbs, Key, ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue, FullURL : string): string; overload;
49 procedure CreateHTML2(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
50 procedure CreateHTML3(var html: TStringList; ThreadItem: TThreadItem; var sTitle: string);
51 //ツδ個スツポツッツプツアツッツプツて堋再崢税ケ
52 procedure SetResPopupText(Hint :TResPopup; threadItem: TThreadItem; StNum, ToNum: Integer; Title, First: Boolean);
53 //ツδ環δ督クツて堋頁崢篠堋稜?で?ツづァツδ個スツポツッツプツアツッツプツ用ツて啅RLツづ可米篠翰?ね?づゥ
54 class function GetRespopupURL(AText, AThreadURL : string): string;
55 //ツ指ツ墜債てセツね敖パツスツづ可スツキツδ督で閉てセツつュツづ垢SSツて堋フツァツイツδ仰て堋コツピツーツて堕再崢づゥ
56 class procedure SkinorCSSFilesCopy(path: string);
57 end;
58
59 var
60 HTMLCreater: THTMLCreate;
61
62 implementation
63
64 const
65 URL_CHAR: string = '0123456789'
66 + 'abcdefghijklmnopqrstuvwxyz'
67 + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
68 + '#$%&()*+,-./:;=?@[]^_`{|}~!''\';
69 ANCHOR_REF = 'href=';
70 CLOSE_TAGAL = '</a>';
71 CLOSE_TAGAU = '</A>';
72 RES_REF = '&gt;&gt;';
73 REF_MARK: array[0..9] of string = ('http://', 'ttp://', 'tp://',
74 'ms-help://','p://', 'https://',
75 'www.', 'ftp://','news://','rtsp://');
76
77 constructor THTMLCreate.Create;
78 var
79 j : Integer;
80 begin
81 // + 3 ツづ 'href="' ('"'ツづつで、)ツて個づ?て堋バツδ環エツーツシツδ?δ督づ可余ツ裕ツて堕篠敖ね敖で。ツづゥツね敖づ?/span>
82 anchorLen := Length( ANCHOR_REF ) + 3;
83 pANCHORs := PChar(ANCHOR_REF);
84 pANCHORe := pANCHORs + Length(ANCHOR_REF);
85 pURLCHARs := PChar(URL_CHAR);
86 pURLCHARe := pURLCHARs + Length(URL_CHAR);
87 pCTAGLs := PChar(CLOSE_TAGAL);
88 pCTAGLe := pCTAGLs + 4;
89 pCTAGUs := PChar(CLOSE_TAGAU);
90 pCTAGUe := pCTAGUs + 4;
91 for j := 0 to 9 do begin
92 pREF_MARKSs[j] := PChar(REF_MARK[j]);
93 pREF_MARKSe[j] := pREF_MARKSs[j] + Length(REF_MARK[j]);
94 end;
95 end;
96 // ツスツキツδ督て堕禿?づ敖債楪づ敖、ツ値ツて堕置ツ翰?ね?づゥ
97 function THTMLCreate.LoadFromSkin(
98 fileName: string;
99 ThreadItem: TThreadItem;
100 SizeByte: Integer
101 ): string;
102 var
103 Skin: TStringList;
104 begin
105
106 Skin := TStringList.Create;
107 try
108 if FileExists( fileName ) then begin
109 Skin.LoadFromFile( fileName );
110
111 // ツづ「ツて債で?ツね敖で楪尭卍てセツね伉でサツづ?、ツオツプツシツδ?δ督ダツイツアツδ債グツて堋プツδ個ビツδ?ーツ用 try
112 try
113 if ThreadItem.ParentBoard <> nil then
114 if ThreadItem.ParentBoard.ParentCategory <> nil then
115 CustomStringReplace( Skin, '<BBSNAME/>', ThreadItem.ParentBoard.ParentCategory.ParenTBBS.Title);
116 CustomStringReplace( Skin, '<THREADURL/>', ThreadItem.URL);
117 except end;
118 CustomStringReplace( Skin, '<BOARDNAME/>', ThreadItem.ParentBoard.Title);
119 CustomStringReplace( Skin, '<BOARDURL/>', ThreadItem.ParentBoard.URL);
120 CustomStringReplace( Skin, '<THREADNAME/>', ThreadItem.Title);
121 CustomStringReplace( Skin, '<SKINPATH/>', GikoSys.Setting.CSSFileName);
122 CustomStringReplace( Skin, '<GETRESCOUNT/>', IntToStr( ThreadItem.Count - ThreadItem.NewResCount ));
123 CustomStringReplace( Skin, '<NEWRESCOUNT/>', IntToStr( ThreadItem.NewResCount ));
124 CustomStringReplace( Skin, '<ALLRESCOUNT/>', IntToStr( ThreadItem.Count ));
125
126 CustomStringReplace( Skin, '<NEWDATE/>',FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate));
127 CustomStringReplace( Skin, '<SIZEKB/>', IntToStr( Floor( SizeByte / 1024 ) ));
128 CustomStringReplace( Skin, '<SIZE/>', IntToStr( SizeByte ));
129
130 //----- ツて?て債つ?ツで堋つクツで?ツでシツてδ〜ツてセツづ。ツ古敖翰?用ツ。ツコツδ?δ督トツアツウツトツてセツづ?で閉て?てセ
131 // ツづ「ツて債で?ツね敖で楪尭卍てセツね伉でサツづ?、ツオツプツシツδ?δ督ダツイツアツδ債グツて堋プツδ個ビツδ?ーツ用 try
132 if GikoSys.Setting.UseKatjushaType then begin
133 try
134 if ThreadItem.ParentBoard <> nil then
135 if ThreadItem.ParentBoard.ParentCategory <> nil then
136 CustomStringReplace( Skin, '&BBSNAME', ThreadItem.ParentBoard.ParentCategory.ParenTBBS.Title);
137 CustomStringReplace( Skin, '&THREADURL', ThreadItem.URL);
138 except end;
139 CustomStringReplace( Skin, '&BOARDNAME', ThreadItem.ParentBoard.Title);
140 CustomStringReplace( Skin, '&BOARDURL', ThreadItem.ParentBoard.URL);
141 CustomStringReplace( Skin, '&THREADNAME', ThreadItem.Title);
142 CustomStringReplace( Skin, '&SKINPATH', GikoSys.Setting.CSSFileName);
143 CustomStringReplace( Skin, '&GETRESCOUNT', IntToStr( ThreadItem.NewReceive - 1 ));
144 CustomStringReplace( Skin, '&NEWRESCOUNT', IntToStr( ThreadItem.NewResCount ));
145 CustomStringReplace( Skin, '&ALLRESCOUNT', IntToStr( ThreadItem.AllResCount ));
146
147 CustomStringReplace( Skin, '&NEWDATE', FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate));
148 CustomStringReplace( Skin, '&SIZEKB', IntToStr( Floor( SizeByte / 1024 ) ));
149 CustomStringReplace( Skin, '&SIZE', IntToStr( SizeByte ));
150 end
151 //----- ツて?て?づ慊てケ
152 end;
153 Result := Skin.Text;
154 finally
155 Skin.Free;
156 end;
157 end;
158
159 // ツδ個スツて堋値ツて堕置ツ翰?ね?づゥ
160 function THTMLCreate.SkinedRes(
161 const skin: string;
162 PRes: PResRec;
163 const No: string
164 ): string;
165 const
166 FORMT_NAME = '<b>%s</b>';
167 FORMT_NUM = '<a href="menu:%s" name="%s">%s</a>';
168 FORMT_MAILNAME = '<a href="mailto:%s"><b>%s</b></a>';
169 var
170 spamminess : Extended;
171 {$IFDEF SPAM_FILTER_ENABLED}
172 wordCount : TWordCount;
173 {$ENDIF}
174 begin
175 {$IFDEF SPAM_FILTER_ENABLED}
176 wordCount := TWordCount.Create;
177 try
178 spamminess := Floor( GikoSys.SpamParse(
179 Res.FName + '<>' + Res.FMailTo + '<>' + Res.FBody, wordCount ) * 100 );
180 {$ELSE}
181 spamminess := 0;
182 {$ENDIF}
183 Result := CustomStringReplace( Skin, '<SPAMMINESS/>', FloatToStr( spamminess ) );
184 Result := CustomStringReplace( Result, '<NONSPAMMINESS/>', FloatToStr( 100 - spamminess ) );
185 Result := CustomStringReplace( Result, '<MAIL/>', PRes^.FMailTo);
186 Result := CustomStringReplace( Result, '<DATE/>', PRes^.FDateTime);
187 Result := CustomStringReplace( Result, '<PLAINNUMBER/>', No);
188 Result := CustomStringReplace( Result, '<NAME/>',
189 Format(FORMT_NAME, [PRes^.FName]));
190 Result := CustomStringReplace( Result, '<NUMBER/>',
191 Format(FORMT_NUM, [No, No, No]));
192 Result := CustomStringReplace( Result, '<MAILNAME/>',
193 Format(FORMT_MAILNAME,[PRes^.FMailTo, PRes^.FName]));
194 Result := CustomStringReplace( Result, '<MESSAGE/>', PRes^.FBody);
195 //----- ツで?ツでシツてδ〜ツてセツづ。ツ古敖翰?用ツ。ツコツδ?δ督トツアツウツトツてセツづ?で閉て?てセ
196 if GikoSys.Setting.UseKatjushaType then begin
197 Result := CustomStringReplace( Result, '&NUMBER',
198 '<a href="menu:' + No + '" name="' + No + '">' + No + '</a>');
199 Result := CustomStringReplace( Result, '&PLAINNUMBER', No);
200 Result := CustomStringReplace( Result, '&NAME', '<b>' + PRes^.FName + '</b>');
201 Result := CustomStringReplace( Result, '&MAILNAME',
202 '<a href="mailto:' + PRes^.FMailTo + '"><b>' + PRes^.FName + '</b></a>');
203 Result := CustomStringReplace( Result, '&MAIL', PRes^.FMailTo);
204 Result := CustomStringReplace( Result, '&DATE', PRes^.FDateTime);
205 Result := CustomStringReplace( Result, '&MESSAGE', PRes^.FBody);
206 Result := CustomStringReplace( Result, '&SPAMMINESS', FloatToStr( spamminess ) );
207 Result := CustomStringReplace( Result, '&NONSPAMMINESS', FloatToStr( 100 - spamminess ) );
208 end;
209 //----- ツて?て?づ慊てケ
210 {$IFDEF SPAM_FILTER_ENABLED}
211 finally
212 wordCount.Free;
213 end;
214 {$ENDIF}
215
216 end;
217 (*************************************************************************
218 *http://ツて堋頁崢篠堋稜?て疎nchorツタツグツ付ツで、ツづ可ね?づゥツ。
219 *************************************************************************)
220 procedure THTMLCreate.AddAnchorTag(PRes: PResRec);
221 const
222 _HEAD : array[0..9] of String =
223 ('', 'h', 'ht', '', 'htt', '', 'http://', '', '', '');
224 var
225 url: string;
226 href: string;
227 i, j, b: Integer;
228 tmp: Integer;
229 idx, idx2: Integer;
230 pos : PChar;
231 pp, pe : PChar;
232 s : String;
233 begin
234 s := PRes^.FBody;
235 PRes^.FBody := '';
236
237 while True do begin
238 idx := MaxInt;
239 idx2 := MaxInt;
240 pp := PChar(s);
241 pe := pp + Length(s);
242
243 for j := 0 to 9 do begin
244 pos := AnsiStrPosEx(pp, pe, pREF_MARKSs[j], pREF_MARKSe[j]);
245 if pos <> nil then begin
246 tmp := pos - pp + 1;
247 idx := Min(tmp, idx);
248 if idx = tmp then idx2 := j; //ツづ?て堋マツーツクツてケツ闇卍づ?で?ツで?ツづ?ね敖で?ツて堕頁ーツ打?/span>
249 end;
250 end;
251
252 if idx = MaxInt then begin
253 //ツδ環δ督クツで楪滅つね伉て?。
254 PRes^.FBody := PRes^.FBody + s;
255 Break;
256 end;
257
258 if (idx > 1) and (idx > anchorLen) and
259 (AnsiStrPosEx(pp + idx - 1 - anchorLen, pp + idx, pANCHORs, pANCHORe) <> nil) then begin
260 //ツ看ッツづ可δ環δ督クツタツグツで楪づつね伉づ?ね伉づゥツづ?でーツね伉て?で、ツづ債δ?ツシ
261 //</a></A>ツて堕探ツね?、ツ焦ケツ頁崢篠堋てケツ固?ツづつで?ツづァツて個でサツて卍づ篠惰コツ頁崢篠堋てケツ個淞最?/span>
262 pos := AnsiStrPosEx(pp + idx, pe, pCTAGLs, pCTAGLe);
263 if pos = nil then
264 pos := AnsiStrPosEx(pp + idx, pe, pCTAGUs, pCTAGUe);
265 if pos = nil then
266 b := Length(REF_MARK[idx2])
267 else
268 b := pos - pp + 1;
269
270 PRes^.FBody := PRes^.FBody + Copy(s, 1, idx + b);
271 Delete(s, 1, idx + b);
272 Continue;
273 end;
274
275 PRes^.FBody := PRes^.FBody + Copy(s, 1, idx - 1);
276 Delete(s, 1, idx - 1);
277 b := Length( s ) + 1;
278 pp := PChar(s);
279 for i := 1 to b do begin
280 pe := AnsiStrPosEx(pURLCHARs, pURLCHARe, pp, pp + 1);
281
282 if pe = nil then begin
283 //URLツで崢づ。ツて個ね伉頁崢篠堋板ュツ固?ツ!ツて?で?ツ、ツ頁崢篠堋で楪て個つュツて個づ?ね敖。
284 url := Copy(s, 1, i - 1);
285 href := Format('%s%s', [_HEAD[idx2], url]);
286 PRes^.FBody
287 //:= PRes^.FBody + '<a href="' + href + '" target="_blank">' + url + '</a>';
288 := Format('%s<a href="%s" target="_blank">%s</a>', [PRes^.FBody, href, url]);
289 Delete(s, 1, i - 1);
290 Break;
291 end;
292 //ツ案卍頁崢篠堋進ツづ淞づゥツ。
293 Inc(pp);
294 end;
295 end;
296 end;
297
298 //ツ闇卍青板、AIDツ:ツ妥篠焦ーツて?て個づゥツ禿コツ付IDツ頁崢篠堋稜?、ANum:ツδ個スツ氾 AURLツ:ツで・ツて堋スツδ個ッツドツて啅RL
299 function THTMLCreate.AddBeProfileLink(AID : string; ANum: Integer):string ;
300 var
301 p : integer;
302 BNum, BMark : string;
303 begin
304 p := AnsiPos('BE:', AnsiUpperCase(AID));
305 if p > 0 then begin
306 BNum := Copy(AID, p, Length(AID));
307 AID := Copy(AID, 1, p - 1);
308 p := AnsiPos('-', BNum);
309 if p > 0 then begin
310 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
311 BNum := Copy(BNum, 1, p - 1);
312 end;
313 BNum := Trim(BNum);
314 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
315 + '" target=_blank>' + BMark + '</a>';
316 end else
317 Result := AID;
318 end;
319 procedure THTMLCreate.separateNumber(var st: String; var et: String; const Text, Separator: String);
320 var
321 p : Integer;
322 begin
323 p := Pos(Separator,Text);
324 if (p > 0 ) then begin
325 st := Copy(Text, 1, p - 1);
326 et := Copy(Text, p + Length(Separator), Length(Text));
327 end else begin
328 st := Text;
329 et := Text;
330 end;
331 end;
332 procedure THTMLCreate.ConvRes( PRes : PResRec; const Bbs: string; const Key : string; DatToHTML: boolean = false);
333 const
334 ParamBBS = 'bbs';
335 ParamKey = 'key';
336 ParamStart = 'st';
337 ParamTo = 'to';
338 ParamNoFirst = 'nofirst';
339 ParamTrue = 'true';
340 GT = '&gt;';
341 SN = '0123456789';
342 FORMAT_LINK = '<a href="../test/read.cgi?%s=%s&%s=%s&%s=%s&%s=%s&%s=%s" target="_blank">';
343 //ツ個淞最堕妥篠焦ーツて堋頁崢篠堋稜?郡
344 TOKEN : array[0..5] of string = (GT+GT, GT, 'ツ????#39;, 'ツ??#39;, '<a ', '<A ');
345 var
346 i : integer;
347 s : string;
348 sw: boolean;
349 cm: boolean;
350 No: string;
351 oc : string;
352 pos, pmin : integer;
353 j : integer;
354 ch : string;
355 db : boolean;
356 len : integer;
357 rink : string;
358 function addResAnchor(const Left :string) : string;
359 var
360 st,et : string;
361 begin
362 //ツ終ツ端ツづ慊てケツ行ツづ?づ?て堋終ツ稜。ツで?ツチツェツッツク
363 if j <= len then begin
364 if db then j := j - 2
365 else j := j - 1;
366 end;
367 //ツ架敖で閉青板篠堋で楪固?ツづつで?ツづァツて個ね伉て?で、
368 if No = '' then begin
369 Result := Left + Copy(s, 1, j - 1);
370 end else begin
371 separateNumber(st, et, No, '-');
372
373 if not DatToHTML then begin
374 Result := Left + Format(FORMAT_LINK,
375 [ParamBBS, Bbs, ParamKey, Key, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]);
376 end else begin
377 Result := Left + Format('<a href="#%s">', [st]);
378 end;
379 Result := Result + Copy(s, 1, j - 1) + '</a>';
380 end;
381 Delete(s, 1, j - 1);
382 end;
383
384 procedure getNumberString;
385 begin
386 while (j <= len) do begin
387 if (ByteType(s, j) = mbSingleByte) then begin
388 //1byteツ頁崢篠?/span>
389 ch := s[j];
390 Inc(j);
391 db := false;
392 end else begin
393 //2byteツ頁崢篠?/span>
394 ch := ZenToHan(Copy(s, j, 2));
395 Inc(j, 2);
396 db := true;
397 end;
398
399 if System.Pos(ch, SN) > 0 then begin
400 No := No + ch;
401 end else if (ch = '-') then begin
402 if sw then break;
403 if No = '' then break;
404 No := No + ch;
405 sw := true;
406 end else begin
407 break;
408 end;
409 end;
410 end;
411
412 function checkComma : boolean;
413 begin
414 j := 1;
415 len := Length(s);
416 if ((len > 0) and (s[j] = ',')) or ((len > 1) and (ZenToHan(Copy(s, j ,2)) = ',')) then begin
417 Result := true;
418 if (ByteType(s, j) = mbSingleByte) then
419 Inc(j)
420 else
421 Inc(j, 2);
422 No := '';
423 end else begin
424 Result := false;
425 end;
426 end;
427 begin
428 //s ツづ可本ツ頁崢て堕全ツ閉板禿シツて卍づゥ
429 s := PRes^.FBody;
430 //ツ個仰夏伉て堕クツδ環ア
431 PRes^.FBody := '';
432
433 //
434 while Length(s) > 2 do begin
435 pmin := Length(s) + 1;
436 i := Length(token);
437 for j := 0 to 5 do begin
438 pos := AnsiPos(TOKEN[j], s);
439 if pos <> 0 then begin
440 if pos < pmin then begin
441 //ツづ?て卍てケツヒツッツトツてセツね敖で?ツ頁ーツ打?/span>
442 i := j;
443 //ツ再ケツ焦ケツ値ツて堕更ツ新
444 pmin := pos;
445 end;
446 end;
447 end;
448
449 //ツヒツッツトツてセツね敖頁崢篠堋稜?て堋案卍づつ柴債前ツづ慊てケツ個仰夏伉づ可コツピツー
450 PRes^.FBody := PRes^.FBody + Copy(s, 1, pmin - 1);
451 Delete(s, 1, pmin - 1);
452
453 if i = 6 then begin
454 //ツヒツッツトツて個てセ
455 end else if (i = 4) or (i = 5) then begin
456 //'<a ' or '<A' ツてケツヒツッツト '</a>' or '</A>' ツづ慊てケツコツピツー
457 pmin := AnsiPos('</a>' , s);
458 pos := AnsiPos('</A>' , s);
459 if (pmin <> 0) and (pos <> 0) then begin
460 if (pmin > pos) then begin
461 pmin := pos;
462 end;
463 end else if (pos <> 0) then begin
464 pmin := pos;
465 end;
466 rink := Copy(s, 1, pmin + 3);
467 PRes^.FBody := PRes^.FBody + rink;
468 Delete(s, 1, pmin + 3);
469
470 pmin := Length(rink);
471 i := Length(TOKEN);
472 for j := 0 to 3 do begin
473 pos := AnsiPos(TOKEN[j], rink);
474 if pos <> 0 then begin
475 if pos < pmin then begin
476 //ツづ?て卍てケツヒツッツトツてセツね敖で?ツ頁ーツ打?/span>
477 i := j;
478 //ツ再ケツ焦ケツ値ツて堕更ツ新
479 pmin := pos;
480 end;
481 end;
482 end;
483 // ツδ個スツアツδ督カツーツで楪甘慊づ慊て卍づ?ね伉ね敖づァ,ツで楪惰?つュツ固板て債アツδ督カツーツて?てセツづ?案セツつ、
484 if i <= 3 then begin
485 No := '';
486 cm := checkComma;
487 len := Length(s);
488 while cm do begin
489 oc := '';
490 No := '';
491 sw := false;
492 db := false;
493 getNumberString;
494 PRes^.FBody := addResAnchor(PRes^.FBody);
495 cm := checkComma;
496 end;
497 end;
498 end else begin
499 //ツ架敖で?ツてセツづァツ固?ツづつで?ツづ?ね敖パツタツーツδ?/span>
500 j := Length(TOKEN[i]) + 1;
501 oc := '';
502 No := '';
503 sw := false;
504 db := false;
505 len := Length(s);
506 getNumberString;
507 PRes^.FBody := addResAnchor(PRes^.FBody);
508 end;
509 end;
510 PRes^.FBody := PRes^.FBody + s;
511 end;
512
513 (*************************************************************************
514 *
515 * from HotZonu
516 *************************************************************************)
517 function THTMLCreate.ConvRes(const Body, Bbs, Key,
518 ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string;
519 DatToHTML: boolean = false): string;
520 const
521 GT = '&gt;';
522 SN = '0123456789';
523 FORMAT_LINK = '<a href="../test/read.cgi?%s=%s&%s=%s&%s=%s&%s=%s&%s=%s" target="_blank">';
524 //ツ個淞最堕妥篠焦ーツて堋頁崢篠堋稜?郡
525 TOKEN : array[0..5] of string = (GT+GT, GT, 'ツ????#39;, 'ツ??#39;, '<a ', '<A ');
526 var
527 i : integer;
528 s : string;
529 sw: boolean;
530 cm: boolean;
531 No: string;
532 oc : string;
533 pos, pmin : integer;
534 j : integer;
535 ch : string;
536 db : boolean;
537 len : integer;
538 rink : string;
539 function addResAnchor(const Left :string) : string;
540 var
541 st,et : string;
542 begin
543 //ツ終ツ端ツづ慊てケツ行ツづ?づ?て堋終ツ稜。ツで?ツチツェツッツク
544 if j <= len then begin
545 if db then j := j - 2
546 else j := j - 1;
547 end;
548 //ツ架敖で閉青板篠堋で楪固?ツづつで?ツづァツて個ね伉て?で、
549 if No = '' then begin
550 Result := Left + Copy(s, 1, j - 1);
551 end else begin
552 separateNumber(st, et, No, '-');
553
554 if not DatToHTML then begin
555 Result := Left + Format(FORMAT_LINK,
556 [ParamBBS, Bbs, ParamKey, Key, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]);
557 end else begin
558 Result := Left + Format('<a href="#%s">', [st]);
559 end;
560 Result := Result + Copy(s, 1, j - 1) + '</a>';
561 end;
562 Delete(s, 1, j - 1);
563 end;
564
565 procedure getNumberString;
566 begin
567 while (j <= len) do begin
568 if (ByteType(s, j) = mbSingleByte) then begin
569 //1byteツ頁崢篠?/span>
570 ch := s[j];
571 Inc(j);
572 db := false;
573 end else begin
574 //2byteツ頁崢篠?/span>
575 ch := ZenToHan(Copy(s, j, 2));
576 Inc(j, 2);
577 db := true;
578 end;
579
580 if System.Pos(ch, SN) > 0 then begin
581 No := No + ch;
582 end else if (ch = '-') then begin
583 if sw then break;
584 if No = '' then break;
585 No := No + ch;
586 sw := true;
587 end else begin
588 break;
589 end;
590 end;
591 end;
592
593 function checkComma : boolean;
594 begin
595 j := 1;
596 len := Length(s);
597 if ((len > 0) and (s[j] = ',')) or ((len > 1) and (ZenToHan(Copy(s, j ,2)) = ',')) then begin
598 Result := true;
599 if (ByteType(s, j) = mbSingleByte) then
600 Inc(j)
601 else
602 Inc(j, 2);
603 No := '';
604 end else begin
605 Result := false;
606 end;
607 end;
608 begin
609 //s ツづ可本ツ頁崢て堕全ツ閉板禿シツて卍づゥ
610 s := Body;
611 //ツ個仰夏伉て堕クツδ環ア
612 Result := '';
613
614 //
615 while Length(s) > 2 do begin
616 pmin := Length(s) + 1;
617 i := Length(token);
618 for j := 0 to 5 do begin
619 pos := AnsiPos(TOKEN[j], s);
620 if pos <> 0 then begin
621 if pos < pmin then begin
622 //ツづ?て卍てケツヒツッツトツてセツね敖で?ツ頁ーツ打?/span>
623 i := j;
624 //ツ再ケツ焦ケツ値ツて堕更ツ新
625 pmin := pos;
626 end;
627 end;
628 end;
629
630 //ツヒツッツトツてセツね敖頁崢篠堋稜?て堋案卍づつ柴債前ツづ慊てケツ個仰夏伉づ可コツピツー
631 Result := Result + Copy(s, 1, pmin - 1);
632 Delete(s, 1, pmin - 1);
633
634 if i = 6 then begin
635 //ツヒツッツトツて個てセ
636 end else if (i = 4) or (i = 5) then begin
637 //'<a ' or '<A' ツてケツヒツッツト '</a>' or '</A>' ツづ慊てケツコツピツー
638 pmin := AnsiPos('</a>' , s);
639 pos := AnsiPos('</A>' , s);
640 if (pmin <> 0) and (pos <> 0) then begin
641 if (pmin > pos) then begin
642 pmin := pos;
643 end;
644 end else if (pos <> 0) then begin
645 pmin := pos;
646 end;
647 rink := Copy(s, 1, pmin + 3);
648 Result := Result + rink;
649 Delete(s, 1, pmin + 3);
650
651 pmin := Length(rink);
652 i := Length(TOKEN);
653 for j := 0 to 3 do begin
654 pos := AnsiPos(TOKEN[j], rink);
655 if pos <> 0 then begin
656 if pos < pmin then begin
657 //ツづ?て卍てケツヒツッツトツてセツね敖で?ツ頁ーツ打?/span>
658 i := j;
659 //ツ再ケツ焦ケツ値ツて堕更ツ新
660 pmin := pos;
661 end;
662 end;
663 end;
664 // ツδ個スツアツδ督カツーツで楪甘慊づ慊て卍づ?ね伉ね敖づァ,ツで楪惰?つュツ固板て債アツδ督カツーツて?てセツづ?案セツつ、
665 if i <= 3 then begin
666 No := '';
667 cm := checkComma;
668 len := Length(s);
669 while cm do begin
670 oc := '';
671 No := '';
672 sw := false;
673 db := false;
674 getNumberString;
675 Result := addResAnchor(Result);
676 cm := checkComma;
677 end;
678 end;
679 end else begin
680 //ツ架敖で?ツてセツづァツ固?ツづつで?ツづ?ね敖パツタツーツδ?/span>
681 j := Length(TOKEN[i]) + 1;
682 oc := '';
683 No := '';
684 sw := false;
685 db := false;
686 len := Length(s);
687 getNumberString;
688 Result := addResAnchor(Result);
689 end;
690 end;
691 Result := Result + s;
692 end;
693
694 procedure THTMLCreate.ConvertResAnchor(PRes: PResRec);
695 const
696 _HEAD : string = '<a href="../';
697 _TAIL : string = ' target="_blank">';
698 _ST: string = '&st=';
699 _TO: string = '&to=';
700 _STA: string = '&START=';
701 _END: string = '&END=';
702 var
703 i, j, k: Integer;
704 tmp: string;
705 res: string;
706 begin
707 res := PRes^.FBody;
708 PRes^.FBody := '';
709 i := AnsiPos(_HEAD, res);
710 while i <> 0 do begin
711 PRes^.FBody := PRes^.FBody + Copy(res, 1, i -1);
712 Delete(res, 1, i - 1);
713 j := AnsiPos(_TAIL, res);
714 if j = 0 then begin
715 PRes^.FBody := PRes^.FBody + res;
716 Exit;
717 end;
718 tmp := Copy(res, 1, j - 1);
719 Delete(res, 1, j + 16);
720 if (AnsiPos(_ST, tmp) <> 0) and (AnsiPos(_TO, tmp) <> 0) then begin
721 Delete(tmp, 1, AnsiPos(_ST, tmp) + 3);
722 Delete(tmp, AnsiPos(_TO, tmp), Length(tmp));
723 PRes^.FBody := PRes^.FBody + '<a href="#' + tmp + '">';
724 end else if (AnsiPos(_STA, tmp) <> 0) and (AnsiPos(_END, tmp) <> 0) then begin
725 Delete(tmp, 1, AnsiPos(_STA, tmp) + 6);
726 Delete(tmp, AnsiPos(_END, tmp), Length(tmp));
727 PRes^.FBody := PRes^.FBody + '<a href="#' + tmp + '">';
728 end else begin
729 k := LastDelimiter('/', tmp);
730 Delete(tmp, 1, k);
731 if AnsiPos('-', tmp) < AnsiPos('"', tmp) then
732 Delete(tmp, AnsiPos('-', tmp), Length(tmp))
733 else
734 Delete(tmp, AnsiPos('"', tmp), Length(tmp));
735
736 PRes^.FBody := PRes^.FBody + '<a href="#' + tmp + '">';
737 end;
738 i := AnsiPos(_HEAD, res);
739 end;
740 PRes^.FBody := PRes^.FBody + res;
741
742 end;
743
744 //Pluginツて堕猟伉用ツね?づゥBoardツて堋スツδ個ッツドツて唏TMLツて堕再崢税ケツてセツづ?ocツづ可渉堕で、ツ債楪で「
745 procedure THTMLCreate.CreateUsePluginHTML(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
746 var
747 i: integer;
748 NewReceiveNo: Integer;
749 boardPlugIn : TBoardPlugIn;
750 UserOptionalStyle: string;
751 begin
752 //===== ツプツδ可グツイツδ督づ可て?づゥツ表ツ芝?/span>
753 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
754 NewReceiveNo := ThreadItem.NewReceive;
755 // ツフツォツδ督トツづ「ツサツイツズツて堋静敖墜?/span>
756 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
757 try
758 doc.open;
759 // ツヘツッツダ
760 doc.Write( boardPlugIn.GetHeader( DWORD( threadItem ),
761 '<style type="text/css">body {' + UserOptionalStyle + '}</style>' ));
762 doc.Write('<p id="idSearch"></p>');
763
764 for i := 0 to threadItem.Count - 1 do begin
765 // 1 ツづ債必ツつクツ表ツ芝?/span>
766 if i <> 0 then begin
767 // ツ表ツ芝堋氾債暗債て堕固板墜?/span>
768 case GikoSys.ResRange of
769 Ord( grrKoko ):
770 if ThreadItem.Kokomade > (i + 1) then
771 Continue;
772 Ord( grrNew ):
773 if NewReceiveNo > (i + 1) then
774 Continue;
775 10..65535:
776 if (threadItem.Count - i) > GikoSys.ResRange then
777 Continue;
778 end;
779 end;
780
781 // ツ新ツ陳?マツーツク
782 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
783 try
784 if GikoSys.Setting.UseSkin then begin
785 if FileExists( GikoSys.GetSkinNewmarkFileName ) then
786 doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ))
787 else
788 doc.Write( '<a name="new"></a>');
789 end else if GikoSys.Setting.UseCSS then begin
790 doc.Write('<a name="new"></a><div class="new">ツ新ツ陳?δ個ス <span class="newdate">' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</span></div>');
791 end else begin
792 doc.Write('</dl>');
793 doc.Write('<a name="new"></a>');
794 doc.Write('<table width="100%" bgcolor="#3333CC" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#6666FF" valign="middle"><font size="-1" color="#ffffff"><b>ツ新ツ陳?δ個ス ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</b></font></td></tr></table>');
795 doc.Write('<dl>');
796 end;
797 except
798 doc.Write( '<a name="new"></a>');
799 end;
800 end;
801
802 // ツδ個ス
803 doc.Write( boardPlugIn.GetRes( DWORD( threadItem ), i + 1 ));
804
805 if ThreadItem.Kokomade = (i + 1) then begin
806 // ツて?て?づ慊てケツ禿?で?でセ
807 try
808 if GikoSys.Setting.UseSkin then begin
809 if FileExists( GikoSys.GetSkinBookmarkFileName ) then
810 doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
811 else
812 doc.Write( '<a name="koko"></a>');
813 end else if GikoSys.Setting.UseCSS then begin
814 doc.Write('<a name="koko"></a><div class="koko">ツコツコツづ慊てケツ禿?で?でセ</div>');
815 end else begin
816 doc.Write('</dl>');
817 doc.Write('<a name="koko"></a><table width="100%" bgcolor="#55AA55" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#77CC77" valign="middle"><font size="-1" color="#ffffff"><b>ツコツコツづ慊てケツ禿?で?でセ</b></font></td></tr></table>');
818 doc.Write('<dl>');
819 end;
820 except
821 doc.Write( '<a name="koko"></a>');
822 end;
823 end;
824 end;
825
826
827 // ツスツキツδ?ツフツッツタ)
828 doc.Write( boardPlugIn.GetFooter( DWORD( threadItem ), '<a name="bottom"></a>' ));
829 finally
830 doc.Close;
831 end;
832 end;
833
834
835 procedure THTMLCreate.CreateUseSKINHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList);
836 var
837 i: integer;
838 No: string;
839 NewReceiveNo: Integer;
840 Res: TResRec;
841 UserOptionalStyle: string;
842 SkinHeader: string;
843 SkinNewRes: string;
844 SkinRes: string;
845 strTmp : string;
846 ThreadName : string;
847 begin
848 NewReceiveNo := ThreadItem.NewReceive;
849 // ツフツォツδ督トツづ「ツサツイツズツて堋静敖墜?/span>
850 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
851 ThreadName := ChangeFileExt(ThreadItem.FileName, '');
852
853 doc.open;
854 try
855 doc.charset := 'Shift_JIS';
856
857 // ツスツキツδ督て堋静敖墜?/span>
858 try
859 SkinHeader := LoadFromSkin( GikoSys.GetSkinHeaderFileName, ThreadItem, ThreadItem.Size);
860 if Length( UserOptionalStyle ) > 0 then
861 SkinHeader := CustomStringReplace( SkinHeader, '</head>',
862 '<style type="text/css">body {' + UserOptionalStyle + '}</style></head>');
863 doc.Write( SkinHeader );
864 except
865 end;
866
867 try
868 SkinNewRes := LoadFromSkin( GikoSys.GetSkinNewResFileName, ThreadItem, ThreadItem.Size);
869 except
870 end;
871
872 try
873 SkinRes := LoadFromSkin( GikoSys.GetSkinResFileName, ThreadItem, ThreadItem.Size );
874 except
875 end;
876
877 doc.Write('<p id="idSearch"></p>'#13#10'<a name="top"></a>');
878
879 for i := 0 to ReadList.Count - 1 do begin
880 // 1 ツづ債必ツつクツ表ツ芝?/span>
881 if i <> 0 then begin
882 // ツ表ツ芝堋氾債暗債て堕固板墜?/span>
883 case GikoSys.ResRange of
884 Ord( grrKoko ):
885 if ThreadItem.Kokomade > (i + 1) then
886 Continue;
887 Ord( grrNew ):
888 if NewReceiveNo > (i + 1) then
889 Continue;
890 10..65535:
891 if (threadItem.Count - i) > GikoSys.ResRange then
892 Continue;
893 end;
894 end;
895
896 // ツ新ツ陳?マツーツク
897 if (NewReceiveNo = i + 1) or ((NewReceiveNo = 0) and (i = 0)) then begin
898 try
899 if FileExists( GikoSys.GetSkinNewmarkFileName ) then
900 doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ))
901 else
902 doc.Write( '<a name="new"></a>');
903 except
904 doc.Write( '<a name="new"></a>' );
905 end;
906 end;
907
908 if (Trim(ReadList[i]) <> '') then begin
909 No := IntToStr(i + 1);
910
911 DivideStrLine(ReadList[i], @Res);
912 AddAnchorTag(@Res);
913 ConvRes(@Res, ThreadItem.ParentBoard.BBSID, ThreadName);
914 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
915
916 try
917 if NewReceiveNo <= (i + 1) then
918 // ツ新ツ陳?δ個ス
919 strTmp := SkinedRes(SkinNewRes, @Res, No)
920 else
921 // ツ墜伉湘ュツて堋δ個ス
922 strTmp := SkinedRes(SkinRes, @Res, No);
923
924 doc.Write( strTmp );
925 except
926 end;
927 end;
928
929 if ThreadItem.Kokomade = (i + 1) then begin
930 // ツて?て?づ慊てケツ禿?で?でセ
931 try
932 if FileExists( GikoSys.GetSkinBookmarkFileName ) then
933 doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
934 else
935 doc.Write( '<a name="koko"></a>' );
936 except
937 doc.Write( '<a name="koko"></a>' );
938 end;
939 end;
940 end;
941
942 doc.Write('<a name="bottom"></a>');
943 // ツスツキツδ?ツフツッツタ)
944 try
945 doc.Write( LoadFromSkin( GikoSys.GetSkinFooterFileName, ThreadItem, ThreadItem.Size ) );
946 except
947 end;
948 finally
949 doc.close;
950 end;
951 end;
952
953 procedure THTMLCreate.CreateUseCSSHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
954 const
955 FORMAT_NOMAIL = '<a name="%s"></a><div class="header"><span class="no"><a href="menu:%s">%s</a></span>'
956 + '<span class="name_label">ツ滅コツ前ツ:</span> <span class="name"><b>%s</b></span>'
957 + '<span class="date_label">ツ督環稿ツ禿コツ:</span> <span class="date">%s</span></div>'
958 + '<div class="mes">%s</div>';
959
960 FORMAT_SHOWMAIL = '<a name="%s"></a><div class="header"><span class="no"><a href="menu:%s">%s</a></span>'
961 + '<span class="name_label"> ツ滅コツ前ツ: </span><a class="name_mail" href="mailto:%s">'
962 + '<b>%s</b></a><span class="mail"> [%s]</span><span class="date_label"> ツ督環稿ツ禿コツ:</span>'
963 + '<span class="date"> %s</span></div><div class="mes">%s </div>';
964
965 FORMAT_NOSHOW = '<a name="%s"></a><div class="header"><span class="no"><a href="menu:%s">%s</a></span>'
966 + '<span class="name_label"> ツ滅コツ前ツ: </span><a class="name_mail" href="mailto:%s">'
967 + '<b>%s</b></a><span class="date_label"> ツ督環稿ツ禿コツ:</span><span class="date"> %s</span></div>'
968 + '<div class="mes">%s </div>';
969
970 var
971 i: integer;
972 No: string;
973 CSSFileName: string;
974 NewReceiveNo: Integer;
975 Res: TResRec;
976 UserOptionalStyle: string;
977 ThreadName :String;
978 begin
979 doc.open;
980 try
981 doc.charset := 'Shift_JIS';
982 NewReceiveNo := ThreadItem.NewReceive;
983 ThreadName := ChangeFileExt(ThreadItem.FileName, '');
984 // ツフツォツδ督トツづ「ツサツイツズツて堋静敖墜?/span>
985 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
986 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
987 if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
988 //CSSツ使ツ用
989 doc.Write('<html><head>');
990 doc.Write('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
991 doc.Write('<title>' + sTitle + '</title>');
992 doc.Write('<link rel="stylesheet" href="'+CSSFileName+'" type="text/css">');
993 if Length( UserOptionalStyle ) > 0 then
994 doc.Write('<style type="text/css">body {' + UserOptionalStyle + '}</style>');
995 doc.Write('</head>'#13#10'<body>');
996 doc.Write('<a name="top"></a>'#13#10'<p id="idSearch"></p>');
997 doc.Write('<div class="title">' + sTitle + '</div>');
998 for i := 0 to ReadList.Count - 1 do begin
999 // 1 ツづ債必ツつクツ表ツ芝?/span>
1000 if i <> 0 then begin
1001 // ツ表ツ芝堋氾債暗債て堕固板墜?/span>
1002 case GikoSys.ResRange of
1003 Ord( grrKoko ):
1004 if ThreadItem.Kokomade > (i + 1) then
1005 Continue;
1006 Ord( grrNew ):
1007 if NewReceiveNo > (i + 1) then
1008 Continue;
1009 10..65535:
1010 if (threadItem.Count - i) > GikoSys.ResRange then
1011 Continue;
1012 end;
1013 end;
1014
1015 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
1016 doc.Write('<a name="new"></a><div class="new">ツ新ツ陳?δ個ス <span class="newdate">' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</span></div>');
1017 end;
1018
1019 if (Trim(ReadList[i]) <> '') then begin
1020 No := IntToStr(i + 1);
1021 DivideStrLine(ReadList[i], @Res);
1022 AddAnchorTag(@Res);
1023 ConvRes(@Res, ThreadItem.ParentBoard.BBSID, ThreadName);
1024 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
1025 if Res.FMailTo = '' then
1026 doc.Write(Format(FORMAT_NOMAIL, [No, No, No, Res.FName, Res.FDateTime, Res.FBody]))
1027 else if GikoSys.Setting.ShowMail then
1028 doc.Write(Format(FORMAT_SHOWMAIL, [No, No, No, Res.FMailTo, Res.FName, Res.FMailTo, Res.FDateTime, Res.FBody]))
1029 else
1030 doc.Write(Format(FORMAT_NOSHOW, [No, No, No, Res.FName, Res.FDateTime, Res.FBody]));
1031 end;
1032
1033 if ThreadItem.Kokomade = (i + 1) then begin
1034 doc.Write('<a name="koko"></a><div class="koko">ツコツコツづ慊てケツ禿?で?でセ</div>');
1035 end;
1036
1037 end;
1038
1039 doc.Write('<a name="bottom"></a>');
1040 doc.Write('<a name="last"></a>');
1041 doc.Write('</body></html>');
1042 end;
1043 finally
1044 doc.Close;
1045 end;
1046 end;
1047
1048 procedure THTMLCreate.CreateDefaultHTML (doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
1049 var
1050 i: integer;
1051 No: string;
1052 NewReceiveNo: Integer;
1053 Res: TResRec;
1054 ThreadName: String;
1055 begin
1056 doc.open;
1057 try
1058 doc.charset := 'Shift_JIS';
1059 NewReceiveNo := ThreadItem.NewReceive;
1060 ThreadName := ChangeFileExt(ThreadItem.FileName, '');
1061 doc.Write('<html><head>'#13#10);
1062 doc.Write('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">'#13#10);
1063 doc.Write('<title>' + sTitle + '</title></head>'#13#10);
1064 doc.Write('<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">'#13#10);
1065 doc.Write('<a name="top"></a>'#13#10);
1066 doc.Write('<font size=+1 color="#FF0000">' + sTitle + '</font>'#13#10);
1067 doc.Write('<dl>'#13#10);
1068 doc.Write('<p id="idSearch"></p>'#13#10);
1069 for i := 0 to ReadList.Count - 1 do begin
1070 // 1 ツづ債必ツつクツ表ツ芝?/span>
1071 if i <> 0 then begin
1072 // ツ表ツ芝堋氾債暗債て堕固板墜?/span>
1073 case GikoSys.ResRange of
1074 Ord( grrKoko ):
1075 if ThreadItem.Kokomade > (i + 1) then
1076 Continue;
1077 Ord( grrNew ):
1078 if NewReceiveNo > (i + 1) then
1079 Continue;
1080 10..65535:
1081 if (threadItem.Count - i) > GikoSys.ResRange then
1082 Continue;
1083 end;
1084 end;
1085
1086 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
1087 doc.Write('</dl>');
1088 doc.Write('<a name="new"></a>');
1089 doc.Write('<table width="100%" bgcolor="#3333CC" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#6666FF" valign="middle"><font size="-1" color="#ffffff"><b>ツ新ツ陳?δ個ス ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</b></font></td></tr></table>');
1090 doc.Write('<dl>');
1091 end;
1092
1093 if (Trim(ReadList[i]) <> '') then begin
1094 No := IntToStr(i + 1);
1095 DivideStrLine(ReadList[i], @Res);
1096 AddAnchorTag(@Res);
1097 ConvRes(@Res, ThreadItem.ParentBoard.BBSID, ThreadName);
1098 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
1099 if Res.FMailTo = '' then
1100 doc.Write('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> ツ滅コツ前ツ:<font color="forestgreen"><b> ' + Res.FName + ' </b></font> ツ督環稿ツ禿コツ: <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10)
1101 else if GikoSys.Setting.ShowMail then
1102 doc.Write('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> ツ滅コツ前ツ:<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> [' + Res.FMailTo + '] ツ督環稿ツ禿コツ: <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10)
1103 else
1104 doc.Write('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> ツ滅コツ前ツ:<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> ツ督環稿ツ禿コツ: <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10);
1105 end;
1106 if ThreadItem.Kokomade = (i + 1) then begin
1107 doc.Write('</dl>');
1108 doc.Write('<a name="koko"></a><table width="100%" bgcolor="#55AA55" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#77CC77" valign="middle"><font size="-1" color="#ffffff"><b>ツコツコツづ慊てケツ禿?で?でセ</b></font></td></tr></table>');
1109 doc.Write('<dl>');
1110 end;
1111 end;
1112 doc.Write('</dl>'#13#10'<a name="bottom"></a>'#13#10'</body></html>');
1113 finally
1114 doc.Close;
1115 end;
1116 end;
1117
1118 procedure THTMLCreate.CreateHTML2(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
1119 var
1120 ReadList: TStringList;
1121 CSSFileName: string;
1122 FileName: string;
1123 Res: TResRec;
1124 {$IFDEF DEBUG}
1125 st, rt: Cardinal;
1126 {$ENDIF}
1127 begin
1128 {$IFDEF DEBUG}
1129 Writeln('Create HTML');
1130 st := GetTickCount;
1131 {$ENDIF}
1132 if ThreadItem <> nil then begin
1133 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
1134 CreateUsePluginHTML(doc, ThreadItem, sTitle);
1135 end else begin
1136 ShortDayNames[1] := 'ツ禿コ'; ShortDayNames[2] := 'ツ個?#39;;
1137 ShortDayNames[3] := 'ツ嘉?#39;; ShortDayNames[4] := 'ツ青?#39;;
1138 ShortDayNames[5] := 'ツ滅?#39;; ShortDayNames[6] := 'ツ暁?#39;;
1139 ShortDayNames[7] := 'ツ土';
1140
1141 ReadList := TStringList.Create;
1142 try
1143 if ThreadItem.IsLogFile then begin
1144 ReadList.BeginUpdate;
1145 FileName := ThreadItem.GetThreadFileName;
1146 ReadList.LoadFromFile(FileName);
1147 ReadList.EndUpdate;
1148 GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG'));
1149 GikoSys.FAbon.Execute(ReadList); // ツつ?ツづ堋〜ツで?てセツづ?/span>
1150 GikoSys.FSelectResFilter.Execute(ReadList); //ツδ個スツて堋フツィツδ仰タツδ環δ督グツて堕ね?づゥ
1151 if ThreadItem.Title = '' then begin
1152 DivideStrLine(ReadList[0], @Res);
1153 sTitle := Res.FTitle;
1154 end else
1155 sTitle := ThreadItem.Title
1156 end else begin
1157 sTitle := CustomStringReplace(ThreadItem.Title, 'ツ?猟`', ',');
1158 end;
1159 // ツフツォツδ督トツづ「ツサツイツズツて堋静敖墜?/span>
1160 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
1161 if GikoSys.Setting.UseSkin then begin
1162 CreateUseSKINHTML(doc, ThreadItem, ReadList);
1163 end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
1164 CreateUseCSSHTML(doc, ThreadItem, ReadList, sTitle);
1165 end else begin
1166 CreateDefaultHTML(doc, ThreadItem, ReadList, sTitle);
1167 end;
1168
1169 finally
1170 ReadList.Free;
1171 end;
1172 end;
1173 end;
1174 {$IFDEF DEBUG}
1175 rt := GetTickCount - st;
1176 Writeln('Done.');
1177 Writeln(IntToStr(rt) + ' ms');
1178 {$ENDIF}
1179 end;
1180
1181 procedure THTMLCreate.CreateHTML3(var html: TStringList; ThreadItem: TThreadItem; var sTitle: string);
1182 var
1183 i: integer;
1184 No: string;
1185 //bufList : TStringList;
1186 ReadList: TStringList;
1187 // SaveList: TStringList;
1188 CSSFileName: string;
1189 BBSID: string;
1190 FileName: string;
1191 Res: TResRec;
1192 boardPlugIn : TBoardPlugIn;
1193
1194 UserOptionalStyle: string;
1195 SkinHeader: string;
1196 SkinRes: string;
1197 tmp, tmp1: string;
1198 ThreadName: String;
1199 function LoadSkin( fileName: string ): string;
1200 begin
1201 Result := LoadFromSkin( fileName, ThreadItem, ThreadItem.Size );
1202 end;
1203 function ReplaceRes( skin: string ): string;
1204 begin
1205 Result := SkinedRes( skin, @Res, No );
1206 end;
1207
1208 begin
1209 if ThreadItem <> nil then begin
1210 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
1211 ThreadName := ChangeFileExt(ThreadItem.FileName, '');
1212 html.Clear;
1213 html.BeginUpdate;
1214 //if ThreadItem.IsBoardPlugInAvailable then begin
1215 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
1216 //===== ツプツδ可グツイツδ督づ可て?づゥツ表ツ芝?/span>
1217 //boardPlugIn := ThreadItem.BoardPlugIn;
1218 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
1219 // ツフツォツδ督トツづ「ツサツイツズツて堋静敖墜?/span>
1220 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
1221 try
1222 // ツ頁崢篠堋コツーツドツづ債プツδ可グツイツδ督づ可任ツで。ツづゥ
1223 // ツヘツッツダ
1224 tmp := boardPlugIn.GetHeader( DWORD( threadItem ),
1225 '<style type="text/css">body {' + UserOptionalStyle + '}</style>' );
1226 //ツ静「ツ妥篠参ツ焼?で?ツづァツ堕環妥篠参ツ焼?づ?/span>
1227 if GikoSys.Setting.UseSkin then begin
1228 tmp1 := './' + GikoSys.Setting.CSSFileName;
1229 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1230 tmp1 := CustomStringReplace(tmp1, '\', '/');
1231 tmp := CustomStringReplace(tmp, ExtractFilePath(GikoSys.Setting.CSSFileName), tmp1);
1232 end else if GikoSys.Setting.UseCSS then begin
1233 tmp1 := './' + CSSFileName;
1234 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1235 tmp1 := CustomStringReplace(tmp1, '\', '/');
1236 tmp := CustomStringReplace(tmp, CSSFileName, tmp1);
1237 end;
1238 html.Append( tmp );
1239
1240 for i := 0 to threadItem.Count - 1 do begin
1241
1242 // ツδ個ス
1243 Res.FBody := boardPlugIn.GetRes( DWORD( threadItem ), i + 1 );
1244 ConvertResAnchor(@Res);
1245 html.Append( Res.FBody );
1246
1247 end;
1248 // ツスツキツδ?ツフツッツタ)
1249 html.Append( boardPlugIn.GetFooter( DWORD( threadItem ), '<a name="bottom"></a>' ) );
1250 finally
1251 end;
1252 html.EndUpdate;
1253 //Exit;
1254 end else begin
1255 ShortDayNames[1] := 'ツ禿コ'; ShortDayNames[2] := 'ツ個?#39;;
1256 ShortDayNames[3] := 'ツ嘉?#39;; ShortDayNames[4] := 'ツ青?#39;;
1257 ShortDayNames[5] := 'ツ滅?#39;; ShortDayNames[6] := 'ツ暁?#39;;
1258 ShortDayNames[7] := 'ツ土';
1259 BBSID := ThreadItem.ParentBoard.BBSID;
1260 ReadList := TStringList.Create;
1261 try
1262 if ThreadItem.IsLogFile then begin
1263 FileName := ThreadItem.GetThreadFileName;
1264 ReadList.LoadFromFile(FileName);
1265 GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG'));
1266 GikoSys.FAbon.Execute(ReadList); // ツつ?ツづ堋〜ツで?てセツづ?/span>
1267 GikoSys.FSelectResFilter.Execute(ReadList); //ツδ個スツて堋フツィツδ仰タツδ環δ督グツて堕ね?づゥ
1268 DivideStrLine(ReadList[0], @Res);
1269 //Res.FTitle := CustomStringReplace(Res.FTitle, 'ツ?猟`', ',');
1270 sTitle := Res.FTitle;
1271 end else begin
1272 sTitle := CustomStringReplace(ThreadItem.Title, 'ツ?猟`', ',');
1273 end;
1274 try
1275 // ツフツォツδ督トツづ「ツサツイツズツて堋静敖墜?/span>
1276 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
1277
1278 if GikoSys.Setting.UseSkin then begin
1279 // ツスツキツδ督使ツ用
1280 // ツスツキツδ督て堋静敖墜?/span>
1281 try
1282 SkinHeader := LoadSkin( GikoSys.GetSkinHeaderFileName );
1283 if Length( UserOptionalStyle ) > 0 then
1284 SkinHeader := CustomStringReplace( SkinHeader, '</head>',
1285 '<style type="text/css">body {' + UserOptionalStyle + '}</style></head>');
1286 //ツ静「ツ妥篠参ツ焼?で?ツづァツ堕環妥篠参ツ焼?づ?/span>
1287 tmp1 := './' + GikoSys.Setting.CSSFileName;
1288 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1289 tmp1 := CustomStringReplace(tmp1, '\', '/');
1290 SkinHeader := CustomStringReplace(SkinHeader, ExtractFilePath(GikoSys.Setting.CSSFileName), tmp1);
1291 html.Append( SkinHeader );
1292 except
1293 end;
1294 try
1295 SkinRes := LoadSkin( GikoSys.GetSkinResFileName );
1296 except
1297 end;
1298 html.Append('<a name="top"></a>');
1299 for i := 0 to ReadList.Count - 1 do begin
1300 if (Trim(ReadList[i]) <> '') then begin
1301 No := IntToStr(i + 1);
1302
1303 DivideStrLine(ReadList[i], @Res);
1304 AddAnchorTag(@Res);
1305 ConvRes(@Res, ThreadItem.ParentBoard.BBSID, ThreadName, true);
1306 ConvertResAnchor(@Res);
1307
1308 try
1309 html.Append( ReplaceRes( SkinRes ) );
1310 except
1311 end;
1312 end;
1313
1314 end;
1315 html.Append('<a name="bottom"></a>');
1316 // ツスツキツδ?ツフツッツタ)
1317 try
1318 html.Append( LoadSkin( GikoSys.GetSkinFooterFileName ) );
1319 except
1320 end;
1321 end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
1322 //CSSツ使ツ用
1323 //CSSFileName := GetAppDir + CSS_FILE_NAME;
1324 html.Append('<html><head>');
1325 html.Append('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
1326 html.Append('<title>' + sTitle + '</title>');
1327 //ツ静「ツ妥篠参ツ焼?で?ツづァツ堕環妥篠参ツ焼?づ?/span>
1328 tmp1 := './' + CSSFileName;
1329 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1330 tmp1 := CustomStringReplace(tmp1, '\', '/');
1331
1332 html.Append('<link rel="stylesheet" href="'+tmp1+'" type="text/css">');
1333 if Length( UserOptionalStyle ) > 0 then
1334 html.Append('<style type="text/css">body {' + UserOptionalStyle + '}</style>');
1335 html.Append('</head>');
1336 html.Append('<body>');
1337 html.Append('<a name="top"></a>');
1338 html.Append('<div class="title">' + sTitle + '</div>');
1339 for i := 0 to ReadList.Count - 1 do begin
1340 if (Trim(ReadList[i]) <> '') then begin
1341 No := IntToStr(i + 1);
1342 DivideStrLine(ReadList[i], @Res);
1343 AddAnchorTag(@Res);
1344 ConvRes(@Res, ThreadItem.ParentBoard.BBSID, ThreadName, true);
1345 ConvertResAnchor(@Res);
1346 if Res.FMailTo = '' then
1347 html.Append('<a name="' + No + '"></a>'
1348 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span> '
1349 + '<span class="name_label">ツ滅コツ前ツ:</span> '
1350 + '<span class="name"><b>' + Res.FName + '</b></span> '
1351 + '<span class="date_label">ツ督環稿ツ禿コツ:</span> '
1352 + '<span class="date">' + Res.FDateTime+ '</span></div>'
1353 + '<div class="mes">' + Res.FBody + ' </div>')
1354 else if GikoSys.Setting.ShowMail then
1355 html.Append('<a name="' + No + '"></a>'
1356 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span>'
1357 + '<span class="name_label"> ツ滅コツ前ツ: </span>'
1358 + '<a class="name_mail" href="mailto:' + Res.FMailTo + '">'
1359 + '<b>' + Res.FName + '</b></a><span class="mail"> [' + Res.FMailTo + ']</span>'
1360 + '<span class="date_label"> ツ督環稿ツ禿コツ:</span>'
1361 + '<span class="date"> ' + Res.FDateTime+ '</span></div>'
1362 + '<div class="mes">' + Res.FBody + ' </div>')
1363 else
1364 html.Append('<a name="' + No + '"></a>'
1365 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span>'
1366 + '<span class="name_label"> ツ滅コツ前ツ: </span>'
1367 + '<a class="name_mail" href="mailto:' + Res.FMailTo + '">'
1368 + '<b>' + Res.FName + '</b></a>'
1369 + '<span class="date_label"> ツ督環稿ツ禿コツ:</span>'
1370 + '<span class="date"> ' + Res.FDateTime+ '</span></div>'
1371 + '<div class="mes">' + Res.FBody + ' </div>');
1372 end;
1373 end;
1374 html.Append('<a name="bottom"></a>');
1375 html.Append('<a name="last"></a>');
1376 html.Append('</body></html>');
1377 end else begin
1378 //CSSツ版?使ツ用
1379 html.Append('<html><head>');
1380 html.Append('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
1381 html.Append('<title>' + sTitle + '</title></head>');
1382 html.Append('<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">');
1383 html.Append('<a name="top"></a>');
1384 html.Append('<font size=+1 color="#FF0000">' + sTitle + '</font>');
1385 html.Append('<dl>');
1386 for i := 0 to ReadList.Count - 1 do begin
1387 if (Trim(ReadList[i]) <> '') then begin
1388 No := IntToStr(i + 1);
1389 DivideStrLine(ReadList[i], @Res);
1390 AddAnchorTag(@Res);
1391 ConvRes(@Res, ThreadItem.ParentBoard.BBSID, ThreadName, true);
1392 ConvertResAnchor(@Res);
1393 if Res.FMailTo = '' then
1394 html.Append('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> ツ滅コツ前ツ:<font color="forestgreen"><b> ' + Res.FName + ' </b></font> ツ督環稿ツ禿コツ: ' + Res.FDateTime+ '<br><dd>' + Res.Fbody + ' <br><br><br>')
1395 else if GikoSys.Setting.ShowMail then
1396 html.Append('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> ツ滅コツ前ツ:<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> [' + Res.FMailTo + '] ツ督環稿ツ禿コツ: ' + Res.FDateTime+ '<br><dd>' + Res.Fbody + ' <br><br><br>')
1397 else
1398 html.Append('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> ツ滅コツ前ツ:<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> ツ督環稿ツ禿コツ: ' + Res.FDateTime+ '<br><dd>' + Res.Fbody + ' <br><br><br>');
1399 end;
1400 end;
1401 html.Append('</dl>');
1402 html.Append('<a name="bottom"></a>');
1403 html.Append('</body></html>');
1404 end;
1405 finally
1406 html.EndUpdate;
1407 end;
1408 finally
1409 ReadList.Free;
1410 end;
1411 end;
1412 end;
1413 end;
1414
1415 procedure THTMLCreate.SetResPopupText(Hint : TResPopup; threadItem: TThreadItem; StNum, ToNum: Integer; Title, First: Boolean);
1416 var
1417 i: Integer;
1418 tmp: string;
1419 FileName: string;
1420 Line: Integer;
1421
1422 wkInt: Integer;
1423
1424 Res: TResRec;
1425 Header: string;
1426 Body: string;
1427 boardPlugIn : TBoardPlugIn;
1428 begin
1429 try
1430 if StNum > ToNum then begin
1431 wkInt := StNum;
1432 StNum := ToNum;
1433 ToNum := wkInt;
1434 end;
1435
1436 //ツ再ケツ惰コ10ツδ個スツづ慊てケツ表ツ芝?/span>
1437 if StNum + MAX_POPUP_RES < ToNum then
1438 ToNum := StNum + MAX_POPUP_RES;
1439
1440 //ツタツイツトツδ仰表ツ芝?/span>
1441 if Title then
1442 if ThreadItem <> nil then
1443 Hint.Title := ThreadItem.Title;
1444
1445 if ThreadItem <> nil then begin
1446 //if ThreadItem.IsBoardPlugInAvailable then begin
1447 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
1448 //===== ツプツδ可グツイツδ督づ可て?づゥツ表ツ芝?/span>
1449 //boardPlugIn := ThreadItem.BoardPlugIn;
1450 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
1451
1452 // ツフツォツδ督トツづ「ツサツイツズツて堋静敖墜?/span>
1453 // ツ頁崢篠堋コツーツドツづ債プツδ可グツイツδ督づ可任ツで。ツづゥ
1454 for i := StNum to ToNum do begin
1455 Line := i;
1456 //ツて?て?てケツ2ツでシツづ。ツで?づ仰づゥツて單atツて堋形ツ芝スツてケツ1ツ行ツ禿?づ敖債楪づ淞て卍づ柴ストストスツ。ツ?、ツ禿?づ淞づゥツて?つ、ツづ可て個づ?ね?/span>
1457 tmp := boardPlugIn.GetDat( DWORD( threadItem ), i );
1458 if (tmp <> '') And ( not GikoSys.FAbon.CheckAbonPopupRes(tmp) And( not GikoSys.FAbon.CheckIndividualAbonList(line))) then begin
1459 DivideStrLine(tmp, @Res);
1460 if (GikoSys.Setting.ShowMail = false) or (Length(res.FMailTo) = 0) then
1461 Header := IntToStr(Line) + ' ツ滅コツ前ツ: ' + Res.FName + ' ツ督環稿ツ禿コツ: ' + Res.FDateTime
1462 else
1463 Header := IntToStr(Line) + ' ツ滅コツ前ツ: ' + Res.FName + ' [' + res.FMailTo + '] ツ督環稿ツ禿コツ: ' + Res.FDateTime;
1464 Header := DeleteFontTag(Header);
1465 Header := CustomStringReplace(Header, '<br>', '',true);
1466
1467 Body := CustomStringReplace(Res.FBody, '<br> ', #10,true);
1468 Body := CustomStringReplace(Body, '<br>', #10,true);
1469 Body := CustomStringReplace(Body, '</a>', '',true);
1470 Body := GikoSys.DeleteLink(Body);
1471 Body := CustomStringReplace(Body, '&lt;', '<');
1472 Body := CustomStringReplace(Body, '&gt;', '>');
1473 Body := CustomStringReplace(Body, '&quot;', '"');
1474 Body := CustomStringReplace(Body, '&amp;', '&');
1475 Body := CustomStringReplace(Body, '&nbsp;', ' ');
1476
1477 Hint.Add(Header, Body);
1478 end;
1479 end;
1480 end else begin
1481 for i := StNum to ToNum do begin
1482 Line := i;
1483 FileName := ThreadItem.FilePath;
1484 tmp := GikoSys.ReadThreadFile(FileName, Line);
1485 if (tmp <> '') And ( not GikoSys.FAbon.CheckAbonPopupRes(tmp) And( not GikoSys.FAbon.CheckIndividualAbonList(line))) then begin
1486 DivideStrLine(tmp, @Res);
1487 if (GikoSys.Setting.ShowMail = false) or (Length(res.FMailTo) = 0) then
1488 Header := IntToStr(Line) + ' ツ滅コツ前ツ: ' + Res.FName + ' ツ督環稿ツ禿コツ: ' + Res.FDateTime
1489 else
1490 Header := IntToStr(Line) + ' ツ滅コツ前ツ: ' + Res.FName + ' [' + res.FMailTo + '] ツ督環稿ツ禿コツ: ' + Res.FDateTime;
1491
1492 Body := DeleteFontTag(Res.FBody);
1493 Body := CustomStringReplace(Body, '<br> ', #10,true);
1494 Body := CustomStringReplace(Body, '<br>', #10,true);
1495 Body := CustomStringReplace(Body, '</a>', '',true);
1496 Body := GikoSys.DeleteLink(Body);
1497 Body := CustomStringReplace(Body, '&lt;', '<');
1498 Body := CustomStringReplace(Body, '&gt;', '>');
1499 Body := CustomStringReplace(Body, '&quot;', '"');
1500 Body := CustomStringReplace(Body, '&amp;', '&');
1501 Body := CustomStringReplace(Body, '&nbsp;', ' ');
1502 Hint.Add(Header, Body);
1503 end;
1504 end;
1505 end;
1506 end;
1507 finally
1508 end;
1509 end;
1510
1511 //ツδ環δ督クツて堋頁崢篠堋稜?で?ツづァツδ個スツポツッツプツアツッツプツ用ツて啅RLツづ可米篠翰?ね?づゥ
1512 class function THTMLCreate.GetRespopupURL(AText, AThreadURL : string): string;
1513 var
1514 wkInt: Integer;
1515 begin
1516 Result := '';
1517 if Pos('about:blank..', AText) = 1 then begin
1518 wkInt := LastDelimiter( '/', AThreadURL );
1519 if Pos( '?', Copy( AThreadURL, wkInt, MaxInt ) ) = 0 then begin
1520 // Thread.URL ツづ PATH_INFO ツ渡ツてセ
1521 Result := Copy( AThreadURL, 1, LastDelimiter( '/', AThreadURL ) );
1522 wkInt := LastDelimiter( '/', AText );
1523 if Pos( '?', Copy( AText, wkInt, MaxInt ) ) = 0 then
1524 // Text ツで PATH_INFO ツ渡ツてセ
1525 Result := Result + Copy( AText, LastDelimiter( '/', AText ) + 1, MaxInt )
1526 else
1527 // Text ツづ QUERY_STRING ツ渡ツてセ
1528 Result := Result + Copy( AText, LastDelimiter( '?', AText ) + 1, MaxInt );
1529 end else begin
1530 // Thread.URL ツづ QUERY_STRING ツ渡ツてセ
1531 Result := Copy( AThreadURL, 1, LastDelimiter( '?', AThreadURL ) );
1532 wkInt := LastDelimiter( '/', AText );
1533 if Pos( '?', Copy( AText, wkInt, MaxInt ) ) = 0 then begin
1534 // Text ツづ PATH_INFO ツ渡ツてセ
1535 // URL ツづ可氾つて?キツーツで楪打、ツづァツて個ね伉て堋てケ Text ツで?ツづァツ陳クツ打青ね?づゥ
1536 wkInt := LastDelimiter( '/', Copy( AText, 1, wkInt - 1 ) );
1537 wkInt := LastDelimiter( '/', Copy( AText, 1, wkInt - 1 ) );
1538 Result := Copy( Result, 1, Length( Result ) - 1 ) + Copy( AText, wkInt, MaxInt );
1539 end else begin
1540 // Text ツで QUERY_STRING ツ渡ツてセ
1541 Result := Result + Copy( AText, LastDelimiter( '?', AText ) + 1, MaxInt )
1542 end;
1543 end;
1544 end else if Pos('about:blank/bbs/', AText) = 1 then begin
1545 //ツてセツね敖づァツづ捌BBSツて堋仕ツ米篠て堋吸ツ芝ア
1546 AText := CustomStringReplace(AText, 'about:blank/bbs/', 'about:blank../../bbs/');
1547 Result := GetRespopupURL(AText, AThreadURL);
1548 end else begin
1549 Result := AText;
1550 end;
1551
1552 end;
1553 //ツ指ツ墜債てセツね敖パツスツづ可スツキツδ督で閉てセツつュツづ垢SSツて堋フツァツイツδ仰て堋コツピツーツて堕再崢づゥ
1554 class procedure THTMLCreate.SkinorCSSFilesCopy(path: string);
1555 var
1556 tmp, tmpD, tmpF: string;
1557 current: string;
1558 dirs: TStringList;
1559 files: TStringList;
1560 i, j: Integer;
1561 begin
1562 if GikoSys.Setting.UseSkin then begin
1563 current := ExtractFilePath(GikoSys.GetSkinDir);
1564 tmp := GikoSys.Setting.CSSFileName;
1565 end else if GikoSys.Setting.UseCSS then begin
1566 current := ExtractFilePath(GikoSys.GetStyleSheetDir);
1567 tmp := ExtractFilePath(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName);
1568 end;
1569 dirs := TStringList.Create;
1570 try
1571 dirs.Add(tmp);
1572 if tmp <> current then begin
1573 GikoSys.GetDirectoryList(current, '*.*', dirs, true);
1574 for i := 0 to dirs.Count - 1 do begin
1575 files := TStringList.Create;
1576 try
1577 files.BeginUpdate;
1578 gikoSys.GetFileList(dirs[i], '*.*', files, true);
1579 files.EndUpdate;
1580 tmpD := CustomStringReplace(dirs[i], GikoSys.GetConfigDir, path);
1581 if (AnsiPos(dirs[i], tmp) <> 0) and not (DirectoryExists(tmpD)) then
1582 ForceDirectories(tmpD);
1583
1584 if(dirs[i] = tmp) and (dirs[i] <> current) then begin
1585 for j := 0 to files.Count - 1 do begin
1586 tmpF := CustomStringReplace(files[j], GikoSys.GetConfigDir, path);
1587 if not FileExists(tmpF) then begin
1588 CopyFile(PChar(files[j]), PChar(tmpF),True);
1589 end;
1590 end;
1591 end;
1592 finally
1593 files.Free;
1594 end;
1595 end;
1596 end else begin
1597 tmpD := CustomStringReplace(dirs[0], GikoSys.GetConfigDir, path);
1598 if not DirectoryExists(tmpD) then
1599 ForceDirectories(tmpD);
1600 tmpF := CustomStringReplace(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName
1601 , GikoSys.GetConfigDir, path);
1602 if not FileExists(tmpF) then begin
1603 CopyFile(PChar(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName)
1604 , PChar(tmpF), True);
1605 end;
1606 end;
1607 finally
1608 dirs.Free;
1609 end;
1610 end;
1611
1612
1613
1614 initialization
1615 HTMLCreater := THTMLCreate.Create;
1616
1617 finalization
1618 if HTMLCreater <> nil then begin
1619 HTMLCreater.Free;
1620 HTMLCreater := nil;
1621 end;
1622
1623 end.

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26