6 Windows, Messages, SysUtils, Classes, {Graphics,} Controls, {Forms,}
7 ComCtrls, IniFiles, ShellAPI, Math, GikoSystem,
15 {HttpApp,} YofUtils, {URLMon,} BoardGroup, {gzip,} {Dolib,}
16 {bmRegExp,} AbonUnit, MojuUtils, Setting,
17 ExternalBoardManager, ExternalBoardPlugInMain{,}
18 {Sort,} ,GikoBayesian, HintWindow;
21 THTMLCreate = class(TObject)
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;
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 function ConvertResAnchor(res: string): string;
39 procedure separateNumber(var st: String; var et: String; const Text, Separator: String);
42 function AddAnchorTag(s: string): string;
43 function LoadFromSkin(fileName: string; ThreadItem: TThreadItem; SizeByte: Integer): string;
44 function SkinedRes(skin: string; Res: TResRec; No: string): string;
45 function ConvRes(const Body, Bbs, Key, ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string; DatToHTML: boolean = false): string; overload;
46 // function ConvRes(const Body, Bbs, Key, ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue, FullURL : string): string; overload;
47 procedure CreateHTML2(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
48 procedure CreateHTML3(var html: TStringList; ThreadItem: TThreadItem; var sTitle: string);
49 //
\83\8c\83X
\83|
\83b
\83v
\83A
\83b
\83v
\82Ì
\8dì
\90¬
50 procedure SetResPopupText(Hint :TResPopup; threadItem: TThreadItem; StNum, ToNum: Integer; Title, First: Boolean);
51 //
\83\8a\83\93\83N
\82Ì
\95¶
\8e\9a\97ñ
\82©
\82ç
\83\8c\83X
\83|
\83b
\83v
\83A
\83b
\83v
\97p
\82ÌURL
\82É
\95Ï
\8a·
\82·
\82é
52 class function GetRespopupURL(AText, AThreadURL : string): string;
53 //
\8ew
\92è
\82µ
\82½
\83p
\83X
\82É
\83X
\83L
\83\93\82à
\82µ
\82
\82ÍCSS
\82Ì
\83t
\83@
\83C
\83\8b\82Ì
\83R
\83s
\81[
\82ð
\8dì
\82é
54 class procedure SkinorCSSFilesCopy(path: string);
58 HTMLCreater: THTMLCreate;
63 URL_CHAR: string = '0123456789'
64 + 'abcdefghijklmnopqrstuvwxyz'
65 + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
66 + '#$%&()*+,-./:;=?@[]^_`{|}~!''\';
71 REF_MARK: array[0..9] of string = ('http://', 'ttp://', 'tp://',
72 'ms-help://','p://', 'https://',
73 'www.', 'ftp://','news://','rtsp://');
75 constructor THTMLCreate.Create;
79 // + 3
\82Í 'href="' ('"'
\82Â
\82«)
\82È
\82Ç
\82Ì
\83o
\83\8a\83G
\81[
\83V
\83\87\83\93\82É
\97]
\97T
\82ð
\8e\9d\82½
\82¹
\82é
\82½
\82ß
80 anchorLen := Length( ANCHOR_REF ) + 3;
81 pANCHORs := PChar(ANCHOR_REF);
82 pANCHORe := pANCHORs + Length(ANCHOR_REF);
83 pURLCHARs := PChar(URL_CHAR);
84 pURLCHARe := pURLCHARs + Length(URL_CHAR);
85 pCTAGLs := PChar(CLOSE_TAGAL);
86 pCTAGLe := pCTAGLs + 4;
87 pCTAGUs := PChar(CLOSE_TAGAU);
88 pCTAGUe := pCTAGUs + 4;
89 for j := 0 to 9 do begin
90 pREF_MARKSs[j] := PChar(REF_MARK[j]);
91 pREF_MARKSe[j] := pREF_MARKSs[j] + Length(REF_MARK[j]);
94 //
\83X
\83L
\83\93\82ð
\93Ç
\82Ý
\8d\9e\82Ý
\81A
\92l
\82ð
\92u
\8a·
\82·
\82é
95 function THTMLCreate.LoadFromSkin(
97 ThreadItem: TThreadItem;
104 Skin := TStringList.Create;
106 if FileExists( fileName ) then begin
107 Skin.LoadFromFile( fileName );
109 //
\82â
\82è
\82©
\82½
\82ª
\8bê
\82µ
\82¢
\82¯
\82Ç
\81A
\83I
\83v
\83V
\83\87\83\93\83_
\83C
\83A
\83\8d\83O
\82Ì
\83v
\83\8c\83r
\83\85\81[
\97p try
111 if ThreadItem.ParentBoard <> nil then
112 if ThreadItem.ParentBoard.ParentCategory <> nil then
113 CustomStringReplace( Skin, '<BBSNAME/>', ThreadItem.ParentBoard.ParentCategory.ParenTBBS.Title);
114 CustomStringReplace( Skin, '<THREADURL/>', ThreadItem.URL);
116 CustomStringReplace( Skin, '<BOARDNAME/>', ThreadItem.ParentBoard.Title);
117 CustomStringReplace( Skin, '<BOARDURL/>', ThreadItem.ParentBoard.URL);
118 CustomStringReplace( Skin, '<THREADNAME/>', ThreadItem.Title);
119 CustomStringReplace( Skin, '<SKINPATH/>', GikoSys.Setting.CSSFileName);
120 CustomStringReplace( Skin, '<GETRESCOUNT/>', IntToStr( ThreadItem.Count - ThreadItem.NewResCount ));
121 CustomStringReplace( Skin, '<NEWRESCOUNT/>', IntToStr( ThreadItem.NewResCount ));
122 CustomStringReplace( Skin, '<ALLRESCOUNT/>', IntToStr( ThreadItem.Count ));
124 CustomStringReplace( Skin, '<NEWDATE/>',FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate));
125 CustomStringReplace( Skin, '<SIZEKB/>', IntToStr( Floor( SizeByte / 1024 ) ));
126 CustomStringReplace( Skin, '<SIZE/>', IntToStr( SizeByte ));
128 //-----
\82Æ
\82è
\82 \82¦
\82¸
\82©
\82¿
\82ã
\81`
\82µ
\82á
\8cÝ
\8a·
\97p
\81B
\83R
\83\81\83\93\83g
\83A
\83E
\83g
\82µ
\82Ä
\82à
\82æ
\82µ
129 //
\82â
\82è
\82©
\82½
\82ª
\8bê
\82µ
\82¢
\82¯
\82Ç
\81A
\83I
\83v
\83V
\83\87\83\93\83_
\83C
\83A
\83\8d\83O
\82Ì
\83v
\83\8c\83r
\83\85\81[
\97p try
130 if GikoSys.Setting.UseKatjushaType then begin
132 if ThreadItem.ParentBoard <> nil then
133 if ThreadItem.ParentBoard.ParentCategory <> nil then
134 CustomStringReplace( Skin, '&BBSNAME', ThreadItem.ParentBoard.ParentCategory.ParenTBBS.Title);
135 CustomStringReplace( Skin, '&THREADURL', ThreadItem.URL);
137 CustomStringReplace( Skin, '&BOARDNAME', ThreadItem.ParentBoard.Title);
138 CustomStringReplace( Skin, '&BOARDURL', ThreadItem.ParentBoard.URL);
139 CustomStringReplace( Skin, '&THREADNAME', ThreadItem.Title);
140 CustomStringReplace( Skin, '&SKINPATH', GikoSys.Setting.CSSFileName);
141 CustomStringReplace( Skin, '&GETRESCOUNT', IntToStr( ThreadItem.NewReceive - 1 ));
142 CustomStringReplace( Skin, '&NEWRESCOUNT', IntToStr( ThreadItem.NewResCount ));
143 CustomStringReplace( Skin, '&ALLRESCOUNT', IntToStr( ThreadItem.AllResCount ));
145 CustomStringReplace( Skin, '&NEWDATE', FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate));
146 CustomStringReplace( Skin, '&SIZEKB', IntToStr( Floor( SizeByte / 1024 ) ));
147 CustomStringReplace( Skin, '&SIZE', IntToStr( SizeByte ));
149 //-----
\82±
\82±
\82Ü
\82Å
157 //
\83\8c\83X
\82Ì
\92l
\82ð
\92u
\8a·
\82·
\82é
158 function THTMLCreate.SkinedRes(
164 spamminess : Extended;
165 wordCount : TWordCount;
168 wordCount := TWordCount.Create;
170 spamminess := Floor( GikoSys.SpamParse(
171 Res.FName + '<>' + Res.FMailTo + '<>' + Res.FBody, wordCount ) * 100 );
173 Skin := CustomStringReplace( Skin, '<NUMBER/>',
174 '<a href="menu:' + No + '" name="' + No + '">' + No + '</a>');
175 Skin := CustomStringReplace( Skin, '<PLAINNUMBER/>', No);
176 Skin := CustomStringReplace( Skin, '<NAME/>', '<b>' + Res.FName + '</b>');
177 Skin := CustomStringReplace( Skin, '<MAILNAME/>',
178 '<a href="mailto:' + Res.FMailTo + '"><b>' + Res.FName + '</b></a>');
179 Skin := CustomStringReplace( Skin, '<MAIL/>', Res.FMailTo);
180 Skin := CustomStringReplace( Skin, '<DATE/>', Res.FDateTime);
181 Skin := CustomStringReplace( Skin, '<MESSAGE/>', Res.FBody);
182 Skin := CustomStringReplace( Skin, '<SPAMMINESS/>', FloatToStr( spamminess ) );
183 Skin := CustomStringReplace( Skin, '<NONSPAMMINESS/>', FloatToStr( 100 - spamminess ) );
185 //-----
\82©
\82¿
\82ã
\81`
\82µ
\82á
\8cÝ
\8a·
\97p
\81B
\83R
\83\81\83\93\83g
\83A
\83E
\83g
\82µ
\82Ä
\82à
\82æ
\82µ
186 if GikoSys.Setting.UseKatjushaType then begin
187 Skin := CustomStringReplace( Skin, '&NUMBER',
188 '<a href="menu:' + No + '" name="' + No + '">' + No + '</a>');
189 Skin := CustomStringReplace( Skin, '&PLAINNUMBER', No);
190 Skin := CustomStringReplace( Skin, '&NAME', '<b>' + Res.FName + '</b>');
191 Skin := CustomStringReplace( Skin, '&MAILNAME',
192 '<a href="mailto:' + Res.FMailTo + '"><b>' + Res.FName + '</b></a>');
193 Skin := CustomStringReplace( Skin, '&MAIL', Res.FMailTo);
194 Skin := CustomStringReplace( Skin, '&DATE', Res.FDateTime);
195 Skin := CustomStringReplace( Skin, '&MESSAGE', Res.FBody);
196 Skin := CustomStringReplace( Skin, '&SPAMMINESS', FloatToStr( spamminess ) );
197 Skin := CustomStringReplace( Skin, '&NONSPAMMINESS', FloatToStr( 100 - spamminess ) );
199 //-----
\82±
\82±
\82Ü
\82Å
207 (*************************************************************************
208 *http://
\82Ì
\95¶
\8e\9a\97ñ
\82ðanchor
\83^
\83O
\95t
\82«
\82É
\82·
\82é
\81B
209 *************************************************************************)
210 function THTMLCreate.AddAnchorTag(s: string): string;
226 pe := pp + Length(s);
228 for j := 0 to 9 do begin
229 pos := AnsiStrPosEx(pp, pe, pREF_MARKSs[j], pREF_MARKSe[j]);
230 if pos <> nil then begin
232 idx := Min(tmp, idx);
233 if idx = tmp then idx2 := j; //
\82Ç
\82Ì
\83}
\81[
\83N
\82Å
\88ø
\82Á
\82©
\82©
\82Á
\82½
\82©
\82ð
\95Û
\91¶
237 if idx = MaxInt then begin
238 //
\83\8a\83\93\83N
\82ª
\96³
\82¢
\82æ
\81B
239 Result := Result + s;
243 if (idx > 1) and (idx > anchorLen) and
244 (AnsiStrPosEx(pp + idx - 1 - anchorLen, pp + idx, pANCHORs, pANCHORe) <> nil) then begin
245 //
\8aù
\82É
\83\8a\83\93\83N
\83^
\83O
\82ª
\82Â
\82¢
\82Ä
\82¢
\82é
\82Á
\82Û
\82¢
\82Æ
\82«
\82Í
\83\80\83V
246 //</a></A>
\82ð
\92T
\82·
\81A
\8f¬
\95¶
\8e\9a\82Å
\8c©
\82Â
\82©
\82ç
\82È
\82¯
\82ê
\82Î
\91å
\95¶
\8e\9a\82Å
\8c\9f\8dõ
247 pos := AnsiStrPosEx(pp + idx, pe, pCTAGLs, pCTAGLe);
249 pos := AnsiStrPosEx(pp + idx, pe, pCTAGUs, pCTAGUe);
251 b := Length(REF_MARK[idx2])
255 Result := Result + Copy(s, 1, idx + b);
256 Delete(s, 1, idx + b);
260 Result := Result + Copy(s, 1, idx - 1);
261 Delete(s, 1, idx - 1);
262 b := Length( s ) + 1;
264 for i := 1 to b do begin
265 pe := AnsiStrPosEx(pURLCHARs, pURLCHARe, pp, pp + 1);
267 if pe = nil then begin
268 //URL
\82¶
\82á
\82È
\82¢
\95¶
\8e\9a\94
\8c©
\81I
\82Æ
\82©
\81A
\95¶
\8e\9a\82ª
\82È
\82
\82È
\82Á
\82½
\81B
269 url := Copy(s, 1, i - 1);
271 1 : href := 'h' + url;
272 2 : href := 'ht' + url;
273 4 : href := 'htt' + url;
274 6 : href := 'http://' + url;
279 Result := Result + '<a href="' + href + '" target="_blank">' + url + '</a>';
283 //
\88ê
\95¶
\8e\9a\90i
\82ß
\82é
\81B
289 //
\88ø
\90\94\81AAID
\81F
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
\81AANum:
\83\8c\83X
\94Ô AURL
\81F
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
290 function THTMLCreate.AddBeProfileLink(AID : string; ANum: Integer):string ;
293 BNum, BMark : string;
295 p := AnsiPos('BE:', AnsiUpperCase(AID));
297 BNum := Copy(AID, p, Length(AID));
298 AID := Copy(AID, 1, p - 1);
299 p := AnsiPos('-', BNum);
301 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
302 BNum := Copy(BNum, 1, p - 1);
305 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
306 + '" target=_blank>' + BMark + '</a>';
310 procedure THTMLCreate.separateNumber(var st: String; var et: String; const Text, Separator: String);
314 p := Pos(Separator,Text);
315 if (p > 0 ) then begin
316 st := Copy(Text, 1, p - 1);
317 et := Copy(Text, p + Length(Separator), Length(Text));
323 (*************************************************************************
326 *************************************************************************)
327 function THTMLCreate.ConvRes(const Body, Bbs, Key,
328 ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string;
329 DatToHTML: boolean = false): string;
333 FORMAT_LINK = '<a href="../test/read.cgi?%s=%s&%s=%s&%s=%s&%s=%s&%s=%s" target="_blank">';
343 token : array[0..5] of string;
348 function addResAnchor(const Left :string) : string;
352 //
\8fI
\92[
\82Ü
\82Å
\8ds
\82Á
\82Ä
\82Ì
\8fI
\97¹
\82©
\83`
\83F
\83b
\83N
353 if j <= len then begin
354 if db then j := j - 2
357 //
\89½
\82à
\90\94\8e\9a\82ª
\8c©
\82Â
\82©
\82ç
\82È
\82¢
\82Æ
\82«
358 if No = '' then begin
359 Result := Left + Copy(s, 1, j - 1);
361 separateNumber(st, et, No, '-');
363 if not DatToHTML then begin
364 Result := Left + Format(FORMAT_LINK,
365 [ParamBBS, Bbs, ParamKey, Key, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]);
367 Result := Left + Format('<a href="#%s">', [st]);
369 Result := Result + Copy(s, 1, j - 1) + '</a>';
374 procedure getNumberString;
376 while (j <= len) do begin
377 if (ByteType(s, j) = mbSingleByte) then begin
384 ch := ZenToHan(Copy(s, j, 2));
389 if System.Pos(ch, SN) > 0 then begin
391 end else if (ch = '-') then begin
393 if No = '' then break;
402 function checkComma : boolean;
406 if ((len > 0) and (s[j] = ',')) or ((len > 1) and (ZenToHan(Copy(s, j ,2)) = ',')) then begin
408 if (ByteType(s, j) = mbSingleByte) then
418 //s
\82É
\96{
\95¶
\82ð
\91S
\95\94\93ü
\82ê
\82é
420 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
422 //
\8c\9f\8dõ
\91Î
\8fÛ
\82Ì
\95¶
\8e\9a\97ñ
\8cS
425 token[2] := '
\81\84\81\84';
426 token[3] := '
\81\84';
431 while Length(s) > 2 do begin
432 pmin := Length(s) + 1;
434 for j := 0 to 5 do begin
435 pos := AnsiPos(token[j], s);
436 if pos <> 0 then begin
437 if pos < pmin then begin
438 //
\82Ç
\82ê
\82Å
\83q
\83b
\83g
\82µ
\82½
\82©
\95Û
\91¶
440 //
\8dÅ
\8f¬
\92l
\82ð
\8dX
\90V
446 //
\83q
\83b
\83g
\82µ
\82½
\95¶
\8e\9a\97ñ
\82Ì
\88ê
\82Â
\8eè
\91O
\82Ü
\82Å
\8c\8b\89Ê
\82É
\83R
\83s
\81[
447 Result := Result + Copy(s, 1, pmin - 1);
448 Delete(s, 1, pmin - 1);
451 //
\83q
\83b
\83g
\82È
\82µ
452 end else if (i = 4) or (i = 5) then begin
453 //'<a ' or '<A'
\82Å
\83q
\83b
\83g '</a>' or '</A>'
\82Ü
\82Å
\83R
\83s
\81[
454 pmin := AnsiPos('</a>' , s);
455 pos := AnsiPos('</A>' , s);
456 if (pmin <> 0) and (pos <> 0) then begin
457 if (pmin > pos) then begin
460 end else if (pos <> 0) then begin
463 rink := Copy(s, 1, pmin + 3);
464 Result := Result + rink;
465 Delete(s, 1, pmin + 3);
467 pmin := Length(rink);
469 for j := 0 to 3 do begin
470 pos := AnsiPos(token[j], rink);
471 if pos <> 0 then begin
472 if pos < pmin then begin
473 //
\82Ç
\82ê
\82Å
\83q
\83b
\83g
\82µ
\82½
\82©
\95Û
\91¶
475 //
\8dÅ
\8f¬
\92l
\82ð
\8dX
\90V
480 //
\83\8c\83X
\83A
\83\93\83J
\81[
\82ª
\8aÜ
\82Ü
\82ê
\82Ä
\82¢
\82½
\82ç,
\82ª
\91±
\82
\8cÀ
\82è
\83A
\83\93\83J
\81[
\82Æ
\82µ
\82Ä
\88µ
\82¤
491 Result := addResAnchor(Result);
496 //
\89½
\82©
\82µ
\82ç
\8c©
\82Â
\82©
\82Á
\82½
\83p
\83^
\81[
\83\93
497 j := Length(token[i]) + 1;
504 Result := addResAnchor(Result);
507 Result := Result + s;
510 function THTMLCreate.ConvertResAnchor(res: string): string;
512 _HEAD : string = '<a href="../';
513 _TAIL : string = ' target="_blank">';
514 _ST: string = '&st=';
515 _TO: string = '&to=';
516 _STA: string = '&START=';
517 _END: string = '&END=';
523 i := AnsiPos(_HEAD, res);
524 while i <> 0 do begin
525 Result := Result + Copy(res, 1, i -1);
526 Delete(res, 1, i - 1);
527 j := AnsiPos(_TAIL, res);
529 Result := Result + res;
532 tmp := Copy(res, 1, j - 1);
533 Delete(res, 1, j + 16);
534 if (AnsiPos(_ST, tmp) <> 0) and (AnsiPos(_TO, tmp) <> 0) then begin
535 Delete(tmp, 1, AnsiPos(_ST, tmp) + 3);
536 Delete(tmp, AnsiPos(_TO, tmp), Length(tmp));
537 Result := Result + '<a href="#' + tmp + '">';
538 end else if (AnsiPos(_STA, tmp) <> 0) and (AnsiPos(_END, tmp) <> 0) then begin
539 Delete(tmp, 1, AnsiPos(_STA, tmp) + 6);
540 Delete(tmp, AnsiPos(_END, tmp), Length(tmp));
541 Result := Result + '<a href="#' + tmp + '">';
543 k := LastDelimiter('/', tmp);
545 if AnsiPos('-', tmp) < AnsiPos('"', tmp) then
546 Delete(tmp, AnsiPos('-', tmp), Length(tmp))
548 Delete(tmp, AnsiPos('"', tmp), Length(tmp));
550 Result := Result + '<a href="#' + tmp + '">';
552 i := AnsiPos(_HEAD, res);
554 Result := Result + res;
558 //Plugin
\82ð
\97\98\97p
\82·
\82éBoard
\82Ì
\83X
\83\8c\83b
\83h
\82ÌHTML
\82ð
\8dì
\90¬
\82µ
\82Ädoc
\82É
\8f\91\82«
\8d\9e\82Þ
559 procedure THTMLCreate.CreateUsePluginHTML(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
562 NewReceiveNo: Integer;
563 boardPlugIn : TBoardPlugIn;
564 UserOptionalStyle: string;
566 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
567 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
568 NewReceiveNo := ThreadItem.NewReceive;
569 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
570 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
574 doc.Write( boardPlugIn.GetHeader( DWORD( threadItem ),
575 '<style type="text/css">body {' + UserOptionalStyle + '}</style>' ) + #13#10 );
576 doc.Write('<p id="idSearch"></p>'#13#10 );
578 for i := 0 to threadItem.Count - 1 do begin
579 // 1
\82Í
\95K
\82¸
\95\
\8e¦
581 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
582 case GikoSys.ResRange of
584 if ThreadItem.Kokomade > (i + 1) then
587 if NewReceiveNo > (i + 1) then
590 if (threadItem.Count - i) > GikoSys.ResRange then
595 //
\90V
\92\85\83}
\81[
\83N
596 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
598 if GikoSys.Setting.UseSkin then begin
599 if FileExists( GikoSys.GetSkinNewmarkFileName ) then
600 doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
602 doc.Write( '<a name="new"></a>'#13#10 );
603 end else if GikoSys.Setting.UseCSS then begin
604 doc.Write('<a name="new"></a><div class="new">
\90V
\92\85\83\8c\83X <span class="newdate">' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</span></div>'#13#10);
607 doc.Write('<a name="new"></a>');
608 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>
\90V
\92\85\83\8c\83X ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</b></font></td></tr></table>');
609 doc.Write('<dl>'#13#10);
612 doc.Write( '<a name="new"></a>'#13#10);
617 doc.Write( boardPlugIn.GetRes( DWORD( threadItem ), i + 1 ) + #13#10 );
619 if ThreadItem.Kokomade = (i + 1) then begin
620 //
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾
622 if GikoSys.Setting.UseSkin then begin
623 if FileExists( GikoSys.GetSkinBookmarkFileName ) then
624 doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
626 doc.Write( '<a name="koko"></a>'#13#10 );
627 end else if GikoSys.Setting.UseCSS then begin
628 doc.Write('<a name="koko"></a><div class="koko">
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾</div>'#13#10 );
631 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>
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾</b></font></td></tr></table>');
632 doc.Write('<dl>'#13#10 );
635 doc.Write( '<a name="koko"></a>'#13#10 );
641 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
642 doc.Write( boardPlugIn.GetFooter( DWORD( threadItem ), '<a name="bottom"></a>' ) + #13#10 );
649 procedure THTMLCreate.CreateUseSKINHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList);
654 NewReceiveNo: Integer;
656 UserOptionalStyle: string;
662 function ReplaceRes( skin: string ): string;
664 Result := SkinedRes( skin, Res, No );
667 NewReceiveNo := ThreadItem.NewReceive;
668 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
669 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
670 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
671 ThreadName := ChangeFileExt(ThreadItem.FileName, '');
675 doc.charset := 'Shift_JIS';
677 //
\83X
\83L
\83\93\82Ì
\90Ý
\92è
679 SkinHeader := LoadFromSkin( GikoSys.GetSkinHeaderFileName, ThreadItem, ThreadItem.Size);
680 if Length( UserOptionalStyle ) > 0 then
681 SkinHeader := CustomStringReplace( SkinHeader, '</head>',
682 '<style type="text/css">body {' + UserOptionalStyle + '}</style></head>');
683 doc.Write( SkinHeader + #13#10);
688 SkinNewRes := LoadFromSkin( GikoSys.GetSkinNewResFileName, ThreadItem, ThreadItem.Size);
693 SkinRes := LoadFromSkin( GikoSys.GetSkinResFileName, ThreadItem, ThreadItem.Size );
697 doc.Write('<p id="idSearch"></p>'#13#10);
698 doc.Write('<a name="top"></a>'#13#10);
700 for i := 0 to ReadList.Count - 1 do begin
701 // 1
\82Í
\95K
\82¸
\95\
\8e¦
703 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
704 case GikoSys.ResRange of
706 if ThreadItem.Kokomade > (i + 1) then
709 if NewReceiveNo > (i + 1) then
712 if (threadItem.Count - i) > GikoSys.ResRange then
717 //
\90V
\92\85\83}
\81[
\83N
718 if (NewReceiveNo = i + 1) or ((NewReceiveNo = 0) and (i = 0)) then begin
720 if FileExists( GikoSys.GetSkinNewmarkFileName ) then
721 doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10)
723 doc.Write( '<a name="new"></a>'#13#10 );
725 doc.Write( '<a name="new"></a>'#13#10 );
729 if (Trim(ReadList[i]) <> '') then begin
730 No := IntToStr(i + 1);
732 Res := DivideStrLine(ReadList[i]);
733 Res.FBody := ConvRes(AddAnchorTag(Res.FBody), ThreadItem.ParentBoard.BBSID, ThreadName, 'bbs', 'key', 'st', 'to', 'nofirst', 'true');
734 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
737 if NewReceiveNo <= (i + 1) then
738 //
\90V
\92\85\83\8c\83X
739 strTmp := ReplaceRes( SkinNewRes )
741 //
\92Ê
\8fí
\82Ì
\83\8c\83X
742 strTmp := ReplaceRes( SkinRes );
744 doc.Write( strTmp + #13#10 );
749 if ThreadItem.Kokomade = (i + 1) then begin
750 //
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾
752 if FileExists( GikoSys.GetSkinBookmarkFileName ) then
753 doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
755 doc.Write( '<a name="koko"></a>'#13#10 );
757 doc.Write( '<a name="koko"></a>'#13#10 );
762 doc.Write('<a name="bottom"></a>'#13#10);
763 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
765 doc.Write( LoadFromSkin( GikoSys.GetSkinFooterFileName, ThreadItem, ThreadItem.Size ) + #13#10 );
773 procedure THTMLCreate.CreateUseCSSHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
778 NewReceiveNo: Integer;
780 UserOptionalStyle: string;
784 doc.charset := 'Shift_JIS';
785 NewReceiveNo := ThreadItem.NewReceive;
786 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
787 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
788 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
789 if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
791 doc.Write('<html><head>'#13#10);
792 doc.Write('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">'#13#10);
793 doc.Write('<title>' + sTitle + '</title>'#13#10);
794 doc.Write('<link rel="stylesheet" href="'+CSSFileName+'" type="text/css">'#13#10);
795 if Length( UserOptionalStyle ) > 0 then
796 doc.Write('<style type="text/css">body {' + UserOptionalStyle + '}</style>'#13#10);
797 doc.Write('</head>'#13#10);
798 doc.Write('<body>'#13#10);
799 doc.Write('<a name="top"></a>'#13#10);
800 doc.Write('<p id="idSearch"></p>'#13#10);
801 doc.Write('<div class="title">' + sTitle + '</div>'#13#10);
802 for i := 0 to ReadList.Count - 1 do begin
803 // 1
\82Í
\95K
\82¸
\95\
\8e¦
805 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
806 case GikoSys.ResRange of
808 if ThreadItem.Kokomade > (i + 1) then
811 if NewReceiveNo > (i + 1) then
814 if (threadItem.Count - i) > GikoSys.ResRange then
819 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
820 doc.Write('<a name="new"></a><div class="new">
\90V
\92\85\83\8c\83X <span class="newdate">' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</span></div>'#13#10);
823 if (Trim(ReadList[i]) <> '') then begin
824 No := IntToStr(i + 1);
825 Res := DivideStrLine(ReadList[i]);
826 Res.FBody := ConvRes(AddAnchorTag(Res.FBody), ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true');
827 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
828 if Res.FMailTo = '' then
829 doc.Write('<a name="' + No + '"></a>'
830 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span> '
831 + '<span class="name_label">
\96¼
\91O
\81F</span> '
832 + '<span class="name"><b>' + Res.FName + '</b></span> '
833 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span> '
834 + '<span class="date">' + Res.FDateTime+ '</span></div>'
835 + '<div class="mes">' + Res.FBody + ' </div>'#13#10)
836 else if GikoSys.Setting.ShowMail then
837 doc.Write('<a name="' + No + '"></a>'
838 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span>'
839 + '<span class="name_label">
\96¼
\91O
\81F </span>'
840 + '<a class="name_mail" href="mailto:' + Res.FMailTo + '">'
841 + '<b>' + Res.FName + '</b></a><span class="mail"> [' + Res.FMailTo + ']</span>'
842 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span>'
843 + '<span class="date"> ' + Res.FDateTime+ '</span></div>'
844 + '<div class="mes">' + Res.FBody + ' </div>'#13#10)
846 doc.Write('<a name="' + No + '"></a>'
847 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span>'
848 + '<span class="name_label">
\96¼
\91O
\81F </span>'
849 + '<a class="name_mail" href="mailto:' + Res.FMailTo + '">'
850 + '<b>' + Res.FName + '</b></a>'
851 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span>'
852 + '<span class="date"> ' + Res.FDateTime+ '</span></div>'
853 + '<div class="mes">' + Res.FBody + ' </div>'#13#10);
856 if ThreadItem.Kokomade = (i + 1) then begin
857 doc.Write('<a name="koko"></a><div class="koko">
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾</div>'#13#10);
862 doc.Write('<a name="bottom"></a>'#13#10);
863 doc.Write('<a name="last"></a>'#13#10);
864 doc.Write('</body></html>'#13#10);
871 procedure THTMLCreate.CreateDefaultHTML (doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
875 NewReceiveNo: Integer;
880 doc.charset := 'Shift_JIS';
881 NewReceiveNo := ThreadItem.NewReceive;
882 doc.Write('<html><head>'#13#10);
883 doc.Write('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">'#13#10);
884 doc.Write('<title>' + sTitle + '</title></head>'#13#10);
885 doc.Write('<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">'#13#10);
886 doc.Write('<a name="top"></a>'#13#10);
887 doc.Write('<font size=+1 color="#FF0000">' + sTitle + '</font>'#13#10);
888 doc.Write('<dl>'#13#10);
889 doc.Write('<p id="idSearch"></p>'#13#10);
890 for i := 0 to ReadList.Count - 1 do begin
891 // 1
\82Í
\95K
\82¸
\95\
\8e¦
893 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
894 case GikoSys.ResRange of
896 if ThreadItem.Kokomade > (i + 1) then
899 if NewReceiveNo > (i + 1) then
902 if (threadItem.Count - i) > GikoSys.ResRange then
907 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
908 doc.Write('</dl>'#13#10);
909 doc.Write('<a name="new"></a>'#13#10);
910 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>
\90V
\92\85\83\8c\83X ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</b></font></td></tr></table>'#13#10);
911 doc.Write('<dl>'#13#10);
914 if (Trim(ReadList[i]) <> '') then begin
915 No := IntToStr(i + 1);
916 Res := DivideStrLine(ReadList[i]);
917 Res.FBody := ConvRes(AddAnchorTag(Res.FBody), ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true');
918 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
919 if Res.FMailTo = '' then
920 doc.Write('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a>
\96¼
\91O
\81F<font color="forestgreen"><b> ' + Res.FName + ' </b></font>
\93\8a\8de
\93ú
\81F <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10)
921 else if GikoSys.Setting.ShowMail then
922 doc.Write('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a>
\96¼
\91O
\81F<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> [' + Res.FMailTo + ']
\93\8a\8de
\93ú
\81F <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10)
924 doc.Write('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a>
\96¼
\91O
\81F<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a>
\93\8a\8de
\93ú
\81F <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10);
926 if ThreadItem.Kokomade = (i + 1) then begin
927 doc.Write('</dl>'#13#10);
928 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>
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾</b></font></td></tr></table>'#13#10);
929 doc.Write('<dl>'#13#10);
932 doc.Write('</dl>'#13#10);
933 doc.Write('<a name="bottom"></a>'#13#10);
934 doc.Write('</body></html>'#13#10);
940 procedure THTMLCreate.CreateHTML2(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
942 ReadList: TStringList;
951 Writeln('Create HTML');
954 if ThreadItem <> nil then begin
955 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
956 CreateUsePluginHTML(doc, ThreadItem, sTitle);
958 ShortDayNames[1] := '
\93ú'; ShortDayNames[2] := '
\8c\8e';
959 ShortDayNames[3] := '
\89Î'; ShortDayNames[4] := '
\90\85';
960 ShortDayNames[5] := '
\96Ø'; ShortDayNames[6] := '
\8bà';
961 ShortDayNames[7] := '
\93y';
963 ReadList := TStringList.Create;
965 if ThreadItem.IsLogFile then begin
966 FileName := ThreadItem.GetThreadFileName;
967 ReadList.LoadFromFile(FileName);
968 GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG'));
969 GikoSys.FAbon.Execute(ReadList); //
\82 \82Ú
\81`
\82ñ
\82µ
\82Ä
970 GikoSys.FSelectResFilter.Execute(ReadList); //
\83\8c\83X
\82Ì
\83t
\83B
\83\8b\83^
\83\8a\83\93\83O
\82ð
\82·
\82é
971 if ThreadItem.Title = '' then begin
972 Res := DivideStrLine(ReadList[0]);
973 sTitle := Res.FTitle;
975 sTitle := ThreadItem.Title
977 sTitle := CustomStringReplace(ThreadItem.Title, '
\81\97\81M', ',');
979 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
980 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
981 if GikoSys.Setting.UseSkin then begin
982 CreateUseSKINHTML(doc, ThreadItem, ReadList);
983 end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
984 CreateUseCSSHTML(doc, ThreadItem, ReadList, sTitle);
986 CreateDefaultHTML(doc, ThreadItem, ReadList, sTitle);
994 rt := GetTickCount - st;
996 Writeln(IntToStr(rt) + ' ms');
1000 procedure THTMLCreate.CreateHTML3(var html: TStringList; ThreadItem: TThreadItem; var sTitle: string);
1004 //bufList : TStringList;
1005 ReadList: TStringList;
1006 // SaveList: TStringList;
1007 CSSFileName: string;
1011 boardPlugIn : TBoardPlugIn;
1013 UserOptionalStyle: string;
1017 function LoadSkin( fileName: string ): string;
1019 Result := LoadFromSkin( fileName, ThreadItem, ThreadItem.Size );
1021 function ReplaceRes( skin: string ): string;
1023 Result := SkinedRes( skin, Res, No );
1027 if ThreadItem <> nil then begin
1028 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
1031 //if ThreadItem.IsBoardPlugInAvailable then begin
1032 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
1033 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
1034 //boardPlugIn := ThreadItem.BoardPlugIn;
1035 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
1036 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
1037 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
1039 //
\95¶
\8e\9a\83R
\81[
\83h
\82Í
\83v
\83\89\83O
\83C
\83\93\82É
\94C
\82¹
\82é
1041 tmp := boardPlugIn.GetHeader( DWORD( threadItem ),
1042 '<style type="text/css">body {' + UserOptionalStyle + '}</style>' );
1043 //
\90â
\91Î
\8eQ
\8fÆ
\82©
\82ç
\91\8a\91Î
\8eQ
\8fÆ
\82Ö
1044 if GikoSys.Setting.UseSkin then begin
1045 tmp1 := './' + GikoSys.Setting.CSSFileName;
1046 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1047 tmp1 := CustomStringReplace(tmp1, '\', '/');
1048 tmp := CustomStringReplace(tmp, ExtractFilePath(GikoSys.Setting.CSSFileName), tmp1);
1049 end else if GikoSys.Setting.UseCSS then begin
1050 tmp1 := './' + CSSFileName;
1051 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1052 tmp1 := CustomStringReplace(tmp1, '\', '/');
1053 tmp := CustomStringReplace(tmp, CSSFileName, tmp1);
1057 for i := 0 to threadItem.Count - 1 do begin
1060 html.Append( ConvertResAnchor(boardPlugIn.GetRes( DWORD( threadItem ), i + 1 )) );
1063 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
1064 html.Append( boardPlugIn.GetFooter( DWORD( threadItem ), '<a name="bottom"></a>' ) );
1070 ShortDayNames[1] := '
\93ú'; ShortDayNames[2] := '
\8c\8e';
1071 ShortDayNames[3] := '
\89Î'; ShortDayNames[4] := '
\90\85';
1072 ShortDayNames[5] := '
\96Ø'; ShortDayNames[6] := '
\8bà';
1073 ShortDayNames[7] := '
\93y';
1074 BBSID := ThreadItem.ParentBoard.BBSID;
1075 ReadList := TStringList.Create;
1077 if ThreadItem.IsLogFile then begin
1078 FileName := ThreadItem.GetThreadFileName;
1079 ReadList.LoadFromFile(FileName);
1080 GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG'));
1081 GikoSys.FAbon.Execute(ReadList); //
\82 \82Ú
\81`
\82ñ
\82µ
\82Ä
1082 GikoSys.FSelectResFilter.Execute(ReadList); //
\83\8c\83X
\82Ì
\83t
\83B
\83\8b\83^
\83\8a\83\93\83O
\82ð
\82·
\82é
1083 Res := DivideStrLine(ReadList[0]);
1084 //Res.FTitle := CustomStringReplace(Res.FTitle, '
\81\97\81M', ',');
1085 sTitle := Res.FTitle;
1087 sTitle := CustomStringReplace(ThreadItem.Title, '
\81\97\81M', ',');
1090 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
1091 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
1093 if GikoSys.Setting.UseSkin then begin
1094 //
\83X
\83L
\83\93\8eg
\97p
1095 //
\83X
\83L
\83\93\82Ì
\90Ý
\92è
1097 SkinHeader := LoadSkin( GikoSys.GetSkinHeaderFileName );
1098 if Length( UserOptionalStyle ) > 0 then
1099 SkinHeader := CustomStringReplace( SkinHeader, '</head>',
1100 '<style type="text/css">body {' + UserOptionalStyle + '}</style></head>');
1101 //
\90â
\91Î
\8eQ
\8fÆ
\82©
\82ç
\91\8a\91Î
\8eQ
\8fÆ
\82Ö
1102 tmp1 := './' + GikoSys.Setting.CSSFileName;
1103 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1104 tmp1 := CustomStringReplace(tmp1, '\', '/');
1105 SkinHeader := CustomStringReplace(SkinHeader, ExtractFilePath(GikoSys.Setting.CSSFileName), tmp1);
1106 html.Append( SkinHeader );
1110 SkinRes := LoadSkin( GikoSys.GetSkinResFileName );
1113 html.Append('<a name="top"></a>');
1114 for i := 0 to ReadList.Count - 1 do begin
1115 if (Trim(ReadList[i]) <> '') then begin
1116 No := IntToStr(i + 1);
1118 Res := DivideStrLine(ReadList[i]);
1119 Res.FBody := AddAnchorTag(Res.FBody);
1120 Res.FBody := ConvertResAnchor(ConvRes(Res.FBody, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', true));
1123 html.Append( ReplaceRes( SkinRes ) );
1129 html.Append('<a name="bottom"></a>');
1130 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
1132 html.Append( LoadSkin( GikoSys.GetSkinFooterFileName ) );
1135 end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
1137 //CSSFileName := GetAppDir + CSS_FILE_NAME;
1138 html.Append('<html><head>');
1139 html.Append('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
1140 html.Append('<title>' + sTitle + '</title>');
1141 //
\90â
\91Î
\8eQ
\8fÆ
\82©
\82ç
\91\8a\91Î
\8eQ
\8fÆ
\82Ö
1142 tmp1 := './' + CSSFileName;
1143 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1144 tmp1 := CustomStringReplace(tmp1, '\', '/');
1146 html.Append('<link rel="stylesheet" href="'+tmp1+'" type="text/css">');
1147 if Length( UserOptionalStyle ) > 0 then
1148 html.Append('<style type="text/css">body {' + UserOptionalStyle + '}</style>');
1149 html.Append('</head>');
1150 html.Append('<body>');
1151 html.Append('<a name="top"></a>');
1152 html.Append('<div class="title">' + sTitle + '</div>');
1153 for i := 0 to ReadList.Count - 1 do begin
1154 if (Trim(ReadList[i]) <> '') then begin
1155 No := IntToStr(i + 1);
1156 Res := DivideStrLine(ReadList[i]);
1157 Res.FBody := AddAnchorTag(Res.FBody);
1158 Res.FBody := ConvertResAnchor(ConvRes(Res.FBody, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', true));
1159 if Res.FMailTo = '' then
1160 html.Append('<a name="' + No + '"></a>'
1161 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span> '
1162 + '<span class="name_label">
\96¼
\91O
\81F</span> '
1163 + '<span class="name"><b>' + Res.FName + '</b></span> '
1164 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span> '
1165 + '<span class="date">' + Res.FDateTime+ '</span></div>'
1166 + '<div class="mes">' + Res.FBody + ' </div>')
1167 else if GikoSys.Setting.ShowMail then
1168 html.Append('<a name="' + No + '"></a>'
1169 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span>'
1170 + '<span class="name_label">
\96¼
\91O
\81F </span>'
1171 + '<a class="name_mail" href="mailto:' + Res.FMailTo + '">'
1172 + '<b>' + Res.FName + '</b></a><span class="mail"> [' + Res.FMailTo + ']</span>'
1173 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span>'
1174 + '<span class="date"> ' + Res.FDateTime+ '</span></div>'
1175 + '<div class="mes">' + Res.FBody + ' </div>')
1177 html.Append('<a name="' + No + '"></a>'
1178 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span>'
1179 + '<span class="name_label">
\96¼
\91O
\81F </span>'
1180 + '<a class="name_mail" href="mailto:' + Res.FMailTo + '">'
1181 + '<b>' + Res.FName + '</b></a>'
1182 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span>'
1183 + '<span class="date"> ' + Res.FDateTime+ '</span></div>'
1184 + '<div class="mes">' + Res.FBody + ' </div>');
1187 html.Append('<a name="bottom"></a>');
1188 html.Append('<a name="last"></a>');
1189 html.Append('</body></html>');
1192 html.Append('<html><head>');
1193 html.Append('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
1194 html.Append('<title>' + sTitle + '</title></head>');
1195 html.Append('<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">');
1196 html.Append('<a name="top"></a>');
1197 html.Append('<font size=+1 color="#FF0000">' + sTitle + '</font>');
1198 html.Append('<dl>');
1199 for i := 0 to ReadList.Count - 1 do begin
1200 if (Trim(ReadList[i]) <> '') then begin
1201 No := IntToStr(i + 1);
1202 Res := DivideStrLine(ReadList[i]);
1203 Res.FBody := AddAnchorTag(Res.FBody);
1204 Res.FBody := ConvertResAnchor(ConvRes(Res.FBody, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', true));
1205 if Res.FMailTo = '' then
1206 html.Append('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a>
\96¼
\91O
\81F<font color="forestgreen"><b> ' + Res.FName + ' </b></font>
\93\8a\8de
\93ú
\81F ' + Res.FDateTime+ '<br><dd>' + Res.Fbody + ' <br><br><br>')
1207 else if GikoSys.Setting.ShowMail then
1208 html.Append('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a>
\96¼
\91O
\81F<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> [' + Res.FMailTo + ']
\93\8a\8de
\93ú
\81F ' + Res.FDateTime+ '<br><dd>' + Res.Fbody + ' <br><br><br>')
1210 html.Append('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a>
\96¼
\91O
\81F<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a>
\93\8a\8de
\93ú
\81F ' + Res.FDateTime+ '<br><dd>' + Res.Fbody + ' <br><br><br>');
1213 html.Append('</dl>');
1214 html.Append('<a name="bottom"></a>');
1215 html.Append('</body></html>');
1227 procedure THTMLCreate.SetResPopupText(Hint : TResPopup; threadItem: TThreadItem; StNum, ToNum: Integer; Title, First: Boolean);
1239 boardPlugIn : TBoardPlugIn;
1242 if StNum > ToNum then begin
1248 //
\8dÅ
\91å10
\83\8c\83X
\82Ü
\82Å
\95\
\8e¦
1249 if StNum + MAX_POPUP_RES < ToNum then
1250 ToNum := StNum + MAX_POPUP_RES;
1252 //
\83^
\83C
\83g
\83\8b\95\
\8e¦
1254 if ThreadItem <> nil then
1255 Hint.Title := ThreadItem.Title;
1257 if ThreadItem <> nil then begin
1258 //if ThreadItem.IsBoardPlugInAvailable then begin
1259 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
1260 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
1261 //boardPlugIn := ThreadItem.BoardPlugIn;
1262 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
1264 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
1265 //
\95¶
\8e\9a\83R
\81[
\83h
\82Í
\83v
\83\89\83O
\83C
\83\93\82É
\94C
\82¹
\82é
1266 for i := StNum to ToNum do begin
1268 //
\82±
\82±
\82Å
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ìdat
\82Ì
\8c`
\8e®
\82Å
\82P
\8ds
\93Ç
\82Ý
\8d\9e\82ß
\82ê
\82Î¥¥¥
\81B
\81«
\93Ç
\82ß
\82é
\82æ
\82¤
\82É
\82È
\82Á
\82½
1269 tmp := boardPlugIn.GetDat( DWORD( threadItem ), i );
1270 if (tmp <> '') And ( not GikoSys.FAbon.CheckAbonPopupRes(tmp) And( not GikoSys.FAbon.CheckIndividualAbonList(line))) then begin
1271 Res := DivideStrLine(tmp);
1272 if (GikoSys.Setting.ShowMail = false) or (Length(res.FMailTo) = 0) then
1273 Header := IntToStr(Line) + '
\96¼
\91O
\81F ' + Res.FName + '
\93\8a\8de
\93ú
\81F ' + Res.FDateTime
1275 Header := IntToStr(Line) + '
\96¼
\91O
\81F ' + Res.FName + ' [' + res.FMailTo + ']
\93\8a\8de
\93ú
\81F ' + Res.FDateTime;
1276 Header := DeleteFontTag(Header);
1277 Header := CustomStringReplace(Header, '<br>', '',true);
1279 Body := CustomStringReplace(Res.FBody, '<br> ', #10,true);
1280 Body := CustomStringReplace(Body, '<br>', #10,true);
1281 Body := CustomStringReplace(Body, '</a>', '',true);
1282 Body := GikoSys.DeleteLink(Body);
1283 Body := CustomStringReplace(Body, '<', '<');
1284 Body := CustomStringReplace(Body, '>', '>');
1285 Body := CustomStringReplace(Body, '"', '"');
1286 Body := CustomStringReplace(Body, '&', '&');
1287 Body := CustomStringReplace(Body, ' ', ' ');
1289 Hint.Add(Header, Body);
1293 for i := StNum to ToNum do begin
1295 FileName := ThreadItem.FilePath;
1296 tmp := GikoSys.ReadThreadFile(FileName, Line);
1297 if (tmp <> '') And ( not GikoSys.FAbon.CheckAbonPopupRes(tmp) And( not GikoSys.FAbon.CheckIndividualAbonList(line))) then begin
1298 Res := DivideStrLine(tmp);
1299 if (GikoSys.Setting.ShowMail = false) or (Length(res.FMailTo) = 0) then
1300 Header := IntToStr(Line) + '
\96¼
\91O
\81F ' + Res.FName + '
\93\8a\8de
\93ú
\81F ' + Res.FDateTime
1302 Header := IntToStr(Line) + '
\96¼
\91O
\81F ' + Res.FName + ' [' + res.FMailTo + ']
\93\8a\8de
\93ú
\81F ' + Res.FDateTime;
1304 Body := DeleteFontTag(Res.FBody);
1305 Body := CustomStringReplace(Body, '<br> ', #10,true);
1306 Body := CustomStringReplace(Body, '<br>', #10,true);
1307 Body := CustomStringReplace(Body, '</a>', '',true);
1308 Body := GikoSys.DeleteLink(Body);
1309 Body := CustomStringReplace(Body, '<', '<');
1310 Body := CustomStringReplace(Body, '>', '>');
1311 Body := CustomStringReplace(Body, '"', '"');
1312 Body := CustomStringReplace(Body, '&', '&');
1313 Body := CustomStringReplace(Body, ' ', ' ');
1314 Hint.Add(Header, Body);
1323 //
\83\8a\83\93\83N
\82Ì
\95¶
\8e\9a\97ñ
\82©
\82ç
\83\8c\83X
\83|
\83b
\83v
\83A
\83b
\83v
\97p
\82ÌURL
\82É
\95Ï
\8a·
\82·
\82é
1324 class function THTMLCreate.GetRespopupURL(AText, AThreadURL : string): string;
1329 if Pos('about:blank..', AText) = 1 then begin
1330 wkInt := LastDelimiter( '/', AThreadURL );
1331 if Pos( '?', Copy( AThreadURL, wkInt, MaxInt ) ) = 0 then begin
1332 // Thread.URL
\82Í PATH_INFO
\93n
\82µ
1333 Result := Copy( AThreadURL, 1, LastDelimiter( '/', AThreadURL ) );
1334 wkInt := LastDelimiter( '/', AText );
1335 if Pos( '?', Copy( AText, wkInt, MaxInt ) ) = 0 then
1336 // Text
\82à PATH_INFO
\93n
\82µ
1337 Result := Result + Copy( AText, LastDelimiter( '/', AText ) + 1, MaxInt )
1339 // Text
\82Í QUERY_STRING
\93n
\82µ
1340 Result := Result + Copy( AText, LastDelimiter( '?', AText ) + 1, MaxInt );
1342 // Thread.URL
\82Í QUERY_STRING
\93n
\82µ
1343 Result := Copy( AThreadURL, 1, LastDelimiter( '?', AThreadURL ) );
1344 wkInt := LastDelimiter( '/', AText );
1345 if Pos( '?', Copy( AText, wkInt, MaxInt ) ) = 0 then begin
1346 // Text
\82Í PATH_INFO
\93n
\82µ
1347 // URL
\82É
\94Â
\82Æ
\83L
\81[
\82ª
\91«
\82ç
\82È
\82¢
\82Ì
\82Å Text
\82©
\82ç
\92¸
\91Õ
\82·
\82é
1348 wkInt := LastDelimiter( '/', Copy( AText, 1, wkInt - 1 ) );
1349 wkInt := LastDelimiter( '/', Copy( AText, 1, wkInt - 1 ) );
1350 Result := Copy( Result, 1, Length( Result ) - 1 ) + Copy( AText, wkInt, MaxInt );
1352 // Text
\82à QUERY_STRING
\93n
\82µ
1353 Result := Result + Copy( AText, LastDelimiter( '?', AText ) + 1, MaxInt )
1356 end else if Pos('about:blank/bbs/', AText) = 1 then begin
1357 //
\82µ
\82½
\82ç
\82ÎJBBS
\82Ì
\8ed
\95Ï
\82Ì
\8bz
\8eû
1358 AText := CustomStringReplace(AText, 'about:blank/bbs/', 'about:blank../../bbs/');
1359 Result := GetRespopupURL(AText, AThreadURL);
1365 //
\8ew
\92è
\82µ
\82½
\83p
\83X
\82É
\83X
\83L
\83\93\82à
\82µ
\82
\82ÍCSS
\82Ì
\83t
\83@
\83C
\83\8b\82Ì
\83R
\83s
\81[
\82ð
\8dì
\82é
1366 class procedure THTMLCreate.SkinorCSSFilesCopy(path: string);
1368 tmp, tmpD, tmpF: string;
1374 if GikoSys.Setting.UseSkin then begin
1375 current := ExtractFilePath(GikoSys.GetSkinDir);
1376 tmp := GikoSys.Setting.CSSFileName;
1377 end else if GikoSys.Setting.UseCSS then begin
1378 current := ExtractFilePath(GikoSys.GetStyleSheetDir);
1379 tmp := ExtractFilePath(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName);
1381 dirs := TStringList.Create;
1384 if tmp <> current then begin
1385 GikoSys.GetDirectoryList(current, '*.*', dirs, true);
1386 for i := 0 to dirs.Count - 1 do begin
1387 files := TStringList.Create;
1390 gikoSys.GetFileList(dirs[i], '*.*', files, true);
1392 tmpD := CustomStringReplace(dirs[i], GikoSys.GetConfigDir, path);
1393 if (AnsiPos(dirs[i], tmp) <> 0) and not (DirectoryExists(tmpD)) then
1394 ForceDirectories(tmpD);
1396 if(dirs[i] = tmp) and (dirs[i] <> current) then begin
1397 for j := 0 to files.Count - 1 do begin
1398 tmpF := CustomStringReplace(files[j], GikoSys.GetConfigDir, path);
1399 if not FileExists(tmpF) then begin
1400 CopyFile(PChar(files[j]), PChar(tmpF),True);
1409 tmpD := CustomStringReplace(dirs[0], GikoSys.GetConfigDir, path);
1410 if not DirectoryExists(tmpD) then
1411 ForceDirectories(tmpD);
1412 tmpF := CustomStringReplace(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName
1413 , GikoSys.GetConfigDir, path);
1414 if not FileExists(tmpF) then begin
1415 CopyFile(PChar(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName)
1416 , PChar(tmpF), True);
1427 HTMLCreater := THTMLCreate.Create;
1430 if HTMLCreater <> nil then begin