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;
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);
52 HTMLCreater: THTMLCreate;
57 URL_CHAR: string = '0123456789'
58 + 'abcdefghijklmnopqrstuvwxyz'
59 + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
60 + '#$%&()*+,-./:;=?@[]^_`{|}~!''\';
65 REF_MARK: array[0..9] of string = ('http://', 'ttp://', 'tp://',
66 'ms-help://','p://', 'https://',
67 'www.', 'ftp://','news://','rtsp://');
69 constructor THTMLCreate.Create;
73 // + 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ß
74 anchorLen := Length( ANCHOR_REF ) + 3;
75 pANCHORs := PChar(ANCHOR_REF);
76 pANCHORe := pANCHORs + Length(ANCHOR_REF);
77 pURLCHARs := PChar(URL_CHAR);
78 pURLCHARe := pURLCHARs + Length(URL_CHAR);
79 pCTAGLs := PChar(CLOSE_TAGAL);
80 pCTAGLe := pCTAGLs + 4;
81 pCTAGUs := PChar(CLOSE_TAGAU);
82 pCTAGUe := pCTAGUs + 4;
83 for j := 0 to 9 do begin
84 pREF_MARKSs[j] := PChar(REF_MARK[j]);
85 pREF_MARKSe[j] := pREF_MARKSs[j] + Length(REF_MARK[j]);
88 //
\83X
\83L
\83\93\82ð
\93Ç
\82Ý
\8d\9e\82Ý
\81A
\92l
\82ð
\92u
\8a·
\82·
\82é
89 function THTMLCreate.LoadFromSkin(
91 ThreadItem: TThreadItem;
98 Skin := TStringList.Create;
100 if FileExists( fileName ) then begin
101 Skin.LoadFromFile( fileName );
103 //
\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
105 if ThreadItem.ParentBoard <> nil then
106 if ThreadItem.ParentBoard.ParentCategory <> nil then
107 CustomStringReplace( Skin, '<BBSNAME/>', ThreadItem.ParentBoard.ParentCategory.ParenTBBS.Title);
108 CustomStringReplace( Skin, '<THREADURL/>', ThreadItem.URL);
110 CustomStringReplace( Skin, '<BOARDNAME/>', ThreadItem.ParentBoard.Title);
111 CustomStringReplace( Skin, '<BOARDURL/>', ThreadItem.ParentBoard.URL);
112 CustomStringReplace( Skin, '<THREADNAME/>', ThreadItem.Title);
113 CustomStringReplace( Skin, '<SKINPATH/>', GikoSys.Setting.CSSFileName);
114 CustomStringReplace( Skin, '<GETRESCOUNT/>', IntToStr( ThreadItem.Count - ThreadItem.NewResCount ));
115 CustomStringReplace( Skin, '<NEWRESCOUNT/>', IntToStr( ThreadItem.NewResCount ));
116 CustomStringReplace( Skin, '<ALLRESCOUNT/>', IntToStr( ThreadItem.Count ));
118 CustomStringReplace( Skin, '<NEWDATE/>',FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate));
119 CustomStringReplace( Skin, '<SIZEKB/>', IntToStr( Floor( SizeByte / 1024 ) ));
120 CustomStringReplace( Skin, '<SIZE/>', IntToStr( SizeByte ));
122 //-----
\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µ
123 //
\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
124 if GikoSys.Setting.UseKatjushaType then begin
126 if ThreadItem.ParentBoard <> nil then
127 if ThreadItem.ParentBoard.ParentCategory <> nil then
128 CustomStringReplace( Skin, '&BBSNAME', ThreadItem.ParentBoard.ParentCategory.ParenTBBS.Title);
129 CustomStringReplace( Skin, '&THREADURL', ThreadItem.URL);
131 CustomStringReplace( Skin, '&BOARDNAME', ThreadItem.ParentBoard.Title);
132 CustomStringReplace( Skin, '&BOARDURL', ThreadItem.ParentBoard.URL);
133 CustomStringReplace( Skin, '&THREADNAME', ThreadItem.Title);
134 CustomStringReplace( Skin, '&SKINPATH', GikoSys.Setting.CSSFileName);
135 CustomStringReplace( Skin, '&GETRESCOUNT', IntToStr( ThreadItem.NewReceive - 1 ));
136 CustomStringReplace( Skin, '&NEWRESCOUNT', IntToStr( ThreadItem.NewResCount ));
137 CustomStringReplace( Skin, '&ALLRESCOUNT', IntToStr( ThreadItem.AllResCount ));
139 CustomStringReplace( Skin, '&NEWDATE', FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate));
140 CustomStringReplace( Skin, '&SIZEKB', IntToStr( Floor( SizeByte / 1024 ) ));
141 CustomStringReplace( Skin, '&SIZE', IntToStr( SizeByte ));
143 //-----
\82±
\82±
\82Ü
\82Å
151 //
\83\8c\83X
\82Ì
\92l
\82ð
\92u
\8a·
\82·
\82é
152 function THTMLCreate.SkinedRes(
158 spamminess : Extended;
159 wordCount : TWordCount;
162 wordCount := TWordCount.Create;
164 spamminess := Floor( GikoSys.SpamParse(
165 Res.FName + '<>' + Res.FMailTo + '<>' + Res.FBody, wordCount ) * 100 );
167 Skin := CustomStringReplace( Skin, '<NUMBER/>',
168 '<a href="menu:' + No + '" name="' + No + '">' + No + '</a>');
169 Skin := CustomStringReplace( Skin, '<PLAINNUMBER/>', No);
170 Skin := CustomStringReplace( Skin, '<NAME/>', '<b>' + Res.FName + '</b>');
171 Skin := CustomStringReplace( Skin, '<MAILNAME/>',
172 '<a href="mailto:' + Res.FMailTo + '"><b>' + Res.FName + '</b></a>');
173 Skin := CustomStringReplace( Skin, '<MAIL/>', Res.FMailTo);
174 Skin := CustomStringReplace( Skin, '<DATE/>', Res.FDateTime);
175 Skin := CustomStringReplace( Skin, '<MESSAGE/>', Res.FBody);
176 Skin := CustomStringReplace( Skin, '<SPAMMINESS/>', FloatToStr( spamminess ) );
177 Skin := CustomStringReplace( Skin, '<NONSPAMMINESS/>', FloatToStr( 100 - spamminess ) );
179 //-----
\82©
\82¿
\82ã
\81`
\82µ
\82á
\8cÝ
\8a·
\97p
\81B
\83R
\83\81\83\93\83g
\83A
\83E
\83g
\82µ
\82Ä
\82à
\82æ
\82µ
180 if GikoSys.Setting.UseKatjushaType then begin
181 Skin := CustomStringReplace( Skin, '&NUMBER',
182 '<a href="menu:' + No + '" name="' + No + '">' + No + '</a>');
183 Skin := CustomStringReplace( Skin, '&PLAINNUMBER', No);
184 Skin := CustomStringReplace( Skin, '&NAME', '<b>' + Res.FName + '</b>');
185 Skin := CustomStringReplace( Skin, '&MAILNAME',
186 '<a href="mailto:' + Res.FMailTo + '"><b>' + Res.FName + '</b></a>');
187 Skin := CustomStringReplace( Skin, '&MAIL', Res.FMailTo);
188 Skin := CustomStringReplace( Skin, '&DATE', Res.FDateTime);
189 Skin := CustomStringReplace( Skin, '&MESSAGE', Res.FBody);
190 Skin := CustomStringReplace( Skin, '&SPAMMINESS', FloatToStr( spamminess ) );
191 Skin := CustomStringReplace( Skin, '&NONSPAMMINESS', FloatToStr( 100 - spamminess ) );
193 //-----
\82±
\82±
\82Ü
\82Å
201 (*************************************************************************
202 *http://
\82Ì
\95¶
\8e\9a\97ñ
\82ðanchor
\83^
\83O
\95t
\82«
\82É
\82·
\82é
\81B
203 *************************************************************************)
204 function THTMLCreate.AddAnchorTag(s: string): string;
220 pe := pp + Length(s);
222 for j := 0 to 9 do begin
223 pos := AnsiStrPosEx(pp, pe, pREF_MARKSs[j], pREF_MARKSe[j]);
224 if pos <> nil then begin
226 idx := Min(tmp, idx);
227 if idx = tmp then idx2 := j; //
\82Ç
\82Ì
\83}
\81[
\83N
\82Å
\88ø
\82Á
\82©
\82©
\82Á
\82½
\82©
\82ð
\95Û
\91¶
231 if idx = MaxInt then begin
232 //
\83\8a\83\93\83N
\82ª
\96³
\82¢
\82æ
\81B
233 Result := Result + s;
237 if (idx > 1) and (idx > anchorLen) and
238 (AnsiStrPosEx(pp + idx - 1 - anchorLen, pp + idx, pANCHORs, pANCHORe) <> nil) then begin
239 //
\8aù
\82É
\83\8a\83\93\83N
\83^
\83O
\82ª
\82Â
\82¢
\82Ä
\82¢
\82é
\82Á
\82Û
\82¢
\82Æ
\82«
\82Í
\83\80\83V
240 //</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õ
241 pos := AnsiStrPosEx(pp + idx, pe, pCTAGLs, pCTAGLe);
243 pos := AnsiStrPosEx(pp + idx, pe, pCTAGUs, pCTAGUe);
245 b := Length(REF_MARK[idx2])
249 Result := Result + Copy(s, 1, idx + b);
250 Delete(s, 1, idx + b);
254 Result := Result + Copy(s, 1, idx - 1);
255 Delete(s, 1, idx - 1);
256 b := Length( s ) + 1;
258 for i := 1 to b do begin
259 pe := AnsiStrPosEx(pURLCHARs, pURLCHARe, pp, pp + 1);
261 if pe = nil then begin
262 //URL
\82¶
\82á
\82È
\82¢
\95¶
\8e\9a\94
\8c©
\81I
\82Æ
\82©
\81A
\95¶
\8e\9a\82ª
\82È
\82
\82È
\82Á
\82½
\81B
263 url := Copy(s, 1, i - 1);
265 1 : href := 'h' + url;
266 2 : href := 'ht' + url;
267 4 : href := 'htt' + url;
268 6 : href := 'http://' + url;
273 Result := Result + '<a href="' + href + '" target="_blank">' + url + '</a>';
277 //
\88ê
\95¶
\8e\9a\90i
\82ß
\82é
\81B
283 //
\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
284 function THTMLCreate.AddBeProfileLink(AID : string; ANum: Integer):string ;
287 BNum, BMark : string;
289 p := AnsiPos('BE:', AnsiUpperCase(AID));
291 BNum := Copy(AID, p, Length(AID));
292 AID := Copy(AID, 1, p - 1);
293 p := AnsiPos('-', BNum);
295 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
296 BNum := Copy(BNum, 1, p - 1);
299 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
300 + '" target=_blank>' + BMark + '</a>';
304 procedure THTMLCreate.separateNumber(var st: String; var et: String; const Text, Separator: String);
308 p := Pos(Separator,Text);
309 if (p > 0 ) then begin
310 st := Copy(Text, 1, p - 1);
311 et := Copy(Text, p + Length(Separator), Length(Text));
317 (*************************************************************************
320 *************************************************************************)
321 function THTMLCreate.ConvRes(const Body, Bbs, Key,
322 ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string;
323 DatToHTML: boolean = false): string;
327 FORMAT_LINK = '<a href="../test/read.cgi?%s=%s&%s=%s&%s=%s&%s=%s&%s=%s" target="_blank">';
337 token : array[0..5] of string;
342 function addResAnchor(const Left :string) : string;
346 //
\8fI
\92[
\82Ü
\82Å
\8ds
\82Á
\82Ä
\82Ì
\8fI
\97¹
\82©
\83`
\83F
\83b
\83N
347 if j <= len then begin
348 if db then j := j - 2
351 //
\89½
\82à
\90\94\8e\9a\82ª
\8c©
\82Â
\82©
\82ç
\82È
\82¢
\82Æ
\82«
352 if No = '' then begin
353 Result := Left + Copy(s, 1, j - 1);
355 separateNumber(st, et, No, '-');
357 if not DatToHTML then begin
358 Result := Left + Format(FORMAT_LINK,
359 [ParamBBS, Bbs, ParamKey, Key, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]);
361 Result := Left + Format('<a href="#%s">', [st]);
363 Result := Result + Copy(s, 1, j - 1) + '</a>';
368 procedure getNumberString;
370 while (j <= len) do begin
371 if (ByteType(s, j) = mbSingleByte) then begin
378 ch := ZenToHan(Copy(s, j, 2));
383 if System.Pos(ch, SN) > 0 then begin
385 end else if (ch = '-') then begin
387 if No = '' then break;
396 function checkComma : boolean;
400 if ((len > 0) and (s[j] = ',')) or ((len > 1) and (ZenToHan(Copy(s, j ,2)) = ',')) then begin
402 if (ByteType(s, j) = mbSingleByte) then
412 //s
\82É
\96{
\95¶
\82ð
\91S
\95\94\93ü
\82ê
\82é
414 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
416 //
\8c\9f\8dõ
\91Î
\8fÛ
\82Ì
\95¶
\8e\9a\97ñ
\8cS
419 token[2] := '
\81\84\81\84';
420 token[3] := '
\81\84';
425 while Length(s) > 2 do begin
426 pmin := Length(s) + 1;
428 for j := 0 to 5 do begin
429 pos := AnsiPos(token[j], s);
430 if pos <> 0 then begin
431 if pos < pmin then begin
432 //
\82Ç
\82ê
\82Å
\83q
\83b
\83g
\82µ
\82½
\82©
\95Û
\91¶
434 //
\8dÅ
\8f¬
\92l
\82ð
\8dX
\90V
440 //
\83q
\83b
\83g
\82µ
\82½
\95¶
\8e\9a\97ñ
\82Ì
\88ê
\82Â
\8eè
\91O
\82Ü
\82Å
\8c\8b\89Ê
\82É
\83R
\83s
\81[
441 Result := Result + Copy(s, 1, pmin - 1);
442 Delete(s, 1, pmin - 1);
445 //
\83q
\83b
\83g
\82È
\82µ
446 end else if (i = 4) or (i = 5) then begin
447 //'<a ' or '<A'
\82Å
\83q
\83b
\83g '</a>' or '</A>'
\82Ü
\82Å
\83R
\83s
\81[
448 pmin := AnsiPos('</a>' , s);
449 pos := AnsiPos('</A>' , s);
450 if (pmin <> 0) and (pos <> 0) then begin
451 if (pmin > pos) then begin
454 end else if (pos <> 0) then begin
457 rink := Copy(s, 1, pmin + 3);
458 Result := Result + rink;
459 Delete(s, 1, pmin + 3);
461 pmin := Length(rink);
463 for j := 0 to 3 do begin
464 pos := AnsiPos(token[j], rink);
465 if pos <> 0 then begin
466 if pos < pmin then begin
467 //
\82Ç
\82ê
\82Å
\83q
\83b
\83g
\82µ
\82½
\82©
\95Û
\91¶
469 //
\8dÅ
\8f¬
\92l
\82ð
\8dX
\90V
474 //
\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¤
485 Result := addResAnchor(Result);
490 //
\89½
\82©
\82µ
\82ç
\8c©
\82Â
\82©
\82Á
\82½
\83p
\83^
\81[
\83\93
491 j := Length(token[i]) + 1;
498 Result := addResAnchor(Result);
501 Result := Result + s;
504 function THTMLCreate.ConvertResAnchor(res: string): string;
506 _HEAD : string = '<a href="../';
507 _TAIL : string = ' target="_blank">';
508 _ST: string = '&st=';
509 _TO: string = '&to=';
510 _STA: string = '&START=';
511 _END: string = '&END=';
517 i := AnsiPos(_HEAD, res);
518 while i <> 0 do begin
519 Result := Result + Copy(res, 1, i -1);
520 Delete(res, 1, i - 1);
521 j := AnsiPos(_TAIL, res);
523 Result := Result + res;
526 tmp := Copy(res, 1, j - 1);
527 Delete(res, 1, j + 16);
528 if (AnsiPos(_ST, tmp) <> 0) and (AnsiPos(_TO, tmp) <> 0) then begin
529 Delete(tmp, 1, AnsiPos(_ST, tmp) + 3);
530 Delete(tmp, AnsiPos(_TO, tmp), Length(tmp));
531 Result := Result + '<a href="#' + tmp + '">';
532 end else if (AnsiPos(_STA, tmp) <> 0) and (AnsiPos(_END, tmp) <> 0) then begin
533 Delete(tmp, 1, AnsiPos(_STA, tmp) + 6);
534 Delete(tmp, AnsiPos(_END, tmp), Length(tmp));
535 Result := Result + '<a href="#' + tmp + '">';
537 k := LastDelimiter('/', tmp);
539 if AnsiPos('-', tmp) < AnsiPos('"', tmp) then
540 Delete(tmp, AnsiPos('-', tmp), Length(tmp))
542 Delete(tmp, AnsiPos('"', tmp), Length(tmp));
544 Result := Result + '<a href="#' + tmp + '">';
546 i := AnsiPos(_HEAD, res);
548 Result := Result + res;
552 //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Þ
553 procedure THTMLCreate.CreateUsePluginHTML(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
556 NewReceiveNo: Integer;
557 boardPlugIn : TBoardPlugIn;
558 UserOptionalStyle: string;
560 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
561 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
562 NewReceiveNo := ThreadItem.NewReceive;
563 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
564 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
568 doc.Write( boardPlugIn.GetHeader( DWORD( threadItem ),
569 '<style type="text/css">body {' + UserOptionalStyle + '}</style>' ) + #13#10 );
570 doc.Write('<p id="idSearch"></p>' + #13#10 );
572 for i := 0 to threadItem.Count - 1 do begin
573 // 1
\82Í
\95K
\82¸
\95\
\8e¦
575 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
576 case GikoSys.ResRange of
578 if ThreadItem.Kokomade > (i + 1) then
581 if NewReceiveNo > (i + 1) then
584 if (threadItem.Count - i) > GikoSys.ResRange then
589 //
\90V
\92\85\83}
\81[
\83N
590 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
592 if GikoSys.Setting.UseSkin then begin
593 if FileExists( GikoSys.GetSkinNewmarkFileName ) then
594 doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
596 doc.Write( '<a name="new"></a>' + #13#10 );
597 end else if GikoSys.Setting.UseCSS then begin
598 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);
601 doc.Write('<a name="new"></a>');
602 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>');
603 doc.Write('<dl> + #13#10');
606 doc.Write( '<a name="new"></a>' + #13#10);
611 doc.Write( boardPlugIn.GetRes( DWORD( threadItem ), i + 1 ) + #13#10 );
613 if ThreadItem.Kokomade = (i + 1) then begin
614 //
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾
616 if GikoSys.Setting.UseSkin then begin
617 if FileExists( GikoSys.GetSkinBookmarkFileName ) then
618 doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
620 doc.Write( '<a name="koko"></a>' + #13#10 );
621 end else if GikoSys.Setting.UseCSS then begin
622 doc.Write('<a name="koko"></a><div class="koko">
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾</div>' + #13#10 );
625 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>');
626 doc.Write('<dl>' + #13#10 );
629 doc.Write( '<a name="koko"></a>' + #13#10 );
635 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
636 doc.Write( boardPlugIn.GetFooter( DWORD( threadItem ), '<a name="bottom"></a>' ) + #13#10 );
643 procedure THTMLCreate.CreateUseSKINHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList);
648 NewReceiveNo: Integer;
650 UserOptionalStyle: string;
655 function ReplaceRes( skin: string ): string;
657 Result := SkinedRes( skin, Res, No );
660 NewReceiveNo := ThreadItem.NewReceive;
661 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
662 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
663 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
666 doc.charset := 'Shift_JIS';
668 //
\83X
\83L
\83\93\82Ì
\90Ý
\92è
670 SkinHeader := LoadFromSkin( GikoSys.GetSkinHeaderFileName, ThreadItem, ThreadItem.Size);
671 if Length( UserOptionalStyle ) > 0 then
672 SkinHeader := CustomStringReplace( SkinHeader, '</head>',
673 '<style type="text/css">body {' + UserOptionalStyle + '}</style></head>');
674 doc.Write( SkinHeader + #13#10);
679 SkinNewRes := LoadFromSkin( GikoSys.GetSkinNewResFileName, ThreadItem, ThreadItem.Size);
684 SkinRes := LoadFromSkin( GikoSys.GetSkinResFileName, ThreadItem, ThreadItem.Size );
688 doc.Write('<p id="idSearch"></p>' + #13#10);
689 doc.Write('<a name="top"></a>' + #13#10);
691 for i := 0 to ReadList.Count - 1 do begin
692 // 1
\82Í
\95K
\82¸
\95\
\8e¦
694 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
695 case GikoSys.ResRange of
697 if ThreadItem.Kokomade > (i + 1) then
700 if NewReceiveNo > (i + 1) then
703 if (threadItem.Count - i) > GikoSys.ResRange then
708 //
\90V
\92\85\83}
\81[
\83N
709 if (NewReceiveNo = i + 1) or ((NewReceiveNo = 0) and (i = 0)) then begin
711 if FileExists( GikoSys.GetSkinNewmarkFileName ) then
712 doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10)
714 doc.Write( '<a name="new"></a>' + #13#10 );
716 doc.Write( '<a name="new"></a>' + #13#10 );
720 if (Trim(ReadList[i]) <> '') then begin
721 No := IntToStr(i + 1);
723 Res := DivideStrLine(ReadList[i]);
724 Res.FBody := ConvRes(AddAnchorTag(Res.FBody), ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true');
725 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
728 if NewReceiveNo <= (i + 1) then
729 //
\90V
\92\85\83\8c\83X
730 strTmp := ReplaceRes( SkinNewRes )
732 //
\92Ê
\8fí
\82Ì
\83\8c\83X
733 strTmp := ReplaceRes( SkinRes );
735 doc.Write( strTmp + #13#10 );
740 if ThreadItem.Kokomade = (i + 1) then begin
741 //
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾
743 if FileExists( GikoSys.GetSkinBookmarkFileName ) then
744 doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
746 doc.Write( '<a name="koko"></a>' + #13#10 );
748 doc.Write( '<a name="koko"></a>' + #13#10 );
753 doc.Write('<a name="bottom"></a>' + #13#10);
754 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
756 doc.Write( LoadFromSkin( GikoSys.GetSkinFooterFileName, ThreadItem, ThreadItem.Size ) + #13#10 );
764 procedure THTMLCreate.CreateUseCSSHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
769 NewReceiveNo: Integer;
771 UserOptionalStyle: string;
775 doc.charset := 'Shift_JIS';
776 NewReceiveNo := ThreadItem.NewReceive;
777 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
778 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
779 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
780 if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
782 doc.Write('<html><head>' + #13#10);
783 doc.Write('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">' + #13#10);
784 doc.Write('<title>' + sTitle + '</title>' + #13#10);
785 doc.Write('<link rel="stylesheet" href="'+CSSFileName+'" type="text/css">' + #13#10);
786 if Length( UserOptionalStyle ) > 0 then
787 doc.Write('<style type="text/css">body {' + UserOptionalStyle + '}</style>' + #13#10);
788 doc.Write('</head>' + #13#10);
789 doc.Write('<body>' + #13#10);
790 doc.Write('<a name="top"></a>' + #13#10);
791 doc.Write('<p id="idSearch"></p>' + #13#10);
792 doc.Write('<div class="title">' + sTitle + '</div>' + #13#10);
793 for i := 0 to ReadList.Count - 1 do begin
794 // 1
\82Í
\95K
\82¸
\95\
\8e¦
796 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
797 case GikoSys.ResRange of
799 if ThreadItem.Kokomade > (i + 1) then
802 if NewReceiveNo > (i + 1) then
805 if (threadItem.Count - i) > GikoSys.ResRange then
810 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
811 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);
814 if (Trim(ReadList[i]) <> '') then begin
815 No := IntToStr(i + 1);
816 Res := DivideStrLine(ReadList[i]);
817 Res.FBody := ConvRes(AddAnchorTag(Res.FBody), ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true');
818 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
819 if Res.FMailTo = '' then
820 doc.Write('<a name="' + No + '"></a>'
821 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span> '
822 + '<span class="name_label">
\96¼
\91O
\81F</span> '
823 + '<span class="name"><b>' + Res.FName + '</b></span> '
824 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span> '
825 + '<span class="date">' + Res.FDateTime+ '</span></div>'
826 + '<div class="mes">' + Res.FBody + ' </div>' + #13#10)
827 else if GikoSys.Setting.ShowMail then
828 doc.Write('<a name="' + No + '"></a>'
829 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span>'
830 + '<span class="name_label">
\96¼
\91O
\81F </span>'
831 + '<a class="name_mail" href="mailto:' + Res.FMailTo + '">'
832 + '<b>' + Res.FName + '</b></a><span class="mail"> [' + Res.FMailTo + ']</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)
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>'
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);
847 if ThreadItem.Kokomade = (i + 1) then begin
848 doc.Write('<a name="koko"></a><div class="koko">
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾</div>' + #13#10);
853 doc.Write('<a name="bottom"></a>' + #13#10);
854 doc.Write('<a name="last"></a>' + #13#10);
855 doc.Write('</body></html>' + #13#10);
862 procedure THTMLCreate.CreateDefaultHTML (doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
866 NewReceiveNo: Integer;
871 doc.charset := 'Shift_JIS';
872 NewReceiveNo := ThreadItem.NewReceive;
873 doc.Write('<html><head>' + #13#10);
874 doc.Write('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">' + #13#10);
875 doc.Write('<title>' + sTitle + '</title></head>' + #13#10);
876 doc.Write('<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">' + #13#10);
877 doc.Write('<a name="top"></a>' + #13#10);
878 doc.Write('<font size=+1 color="#FF0000">' + sTitle + '</font>' + #13#10);
879 doc.Write('<dl>' + #13#10);
880 doc.Write('<p id="idSearch"></p>' + #13#10);
881 for i := 0 to ReadList.Count - 1 do begin
882 // 1
\82Í
\95K
\82¸
\95\
\8e¦
884 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
885 case GikoSys.ResRange of
887 if ThreadItem.Kokomade > (i + 1) then
890 if NewReceiveNo > (i + 1) then
893 if (threadItem.Count - i) > GikoSys.ResRange then
898 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
899 doc.Write('</dl>' + #13#10);
900 doc.Write('<a name="new"></a>' + #13#10);
901 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);
902 doc.Write('<dl>' + #13#10);
905 if (Trim(ReadList[i]) <> '') then begin
906 No := IntToStr(i + 1);
907 Res := DivideStrLine(ReadList[i]);
908 Res.FBody := ConvRes(AddAnchorTag(Res.FBody), ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true');
909 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
910 if Res.FMailTo = '' then
911 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)
912 else if GikoSys.Setting.ShowMail then
913 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)
915 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);
917 if ThreadItem.Kokomade = (i + 1) then begin
918 doc.Write('</dl>' + #13#10);
919 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);
920 doc.Write('<dl>' + #13#10);
923 doc.Write('</dl>' + #13#10);
924 doc.Write('<a name="bottom"></a>' + #13#10);
925 doc.Write('</body></html>' + #13#10);
931 procedure THTMLCreate.CreateHTML2(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
933 ReadList: TStringList;
942 Writeln('Create HTML');
945 if ThreadItem <> nil then begin
946 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
947 CreateUsePluginHTML(doc, ThreadItem, sTitle);
949 ShortDayNames[1] := '
\93ú'; ShortDayNames[2] := '
\8c\8e';
950 ShortDayNames[3] := '
\89Î'; ShortDayNames[4] := '
\90\85';
951 ShortDayNames[5] := '
\96Ø'; ShortDayNames[6] := '
\8bà';
952 ShortDayNames[7] := '
\93y';
954 ReadList := TStringList.Create;
956 if ThreadItem.IsLogFile then begin
957 FileName := ThreadItem.GetThreadFileName;
958 ReadList.LoadFromFile(FileName);
959 GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG'));
960 GikoSys.FAbon.Execute(ReadList); //
\82 \82Ú
\81`
\82ñ
\82µ
\82Ä
961 GikoSys.FSelectResFilter.Execute(ReadList); //
\83\8c\83X
\82Ì
\83t
\83B
\83\8b\83^
\83\8a\83\93\83O
\82ð
\82·
\82é
962 if ThreadItem.Title = '' then begin
963 Res := DivideStrLine(ReadList[0]);
964 sTitle := Res.FTitle;
966 sTitle := ThreadItem.Title
968 sTitle := CustomStringReplace(ThreadItem.Title, '
\81\97\81M', ',');
971 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
972 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
973 if GikoSys.Setting.UseSkin then begin
974 CreateUseSKINHTML(doc, ThreadItem, ReadList);
975 end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
976 CreateUseCSSHTML(doc, ThreadItem, ReadList, sTitle);
978 CreateDefaultHTML(doc, ThreadItem, ReadList, sTitle);
986 rt := GetTickCount - st;
988 Writeln(IntToStr(rt) + ' ms');
992 procedure THTMLCreate.CreateHTML3(var html: TStringList; ThreadItem: TThreadItem; var sTitle: string);
996 //bufList : TStringList;
997 ReadList: TStringList;
998 // SaveList: TStringList;
1003 boardPlugIn : TBoardPlugIn;
1005 UserOptionalStyle: string;
1009 function LoadSkin( fileName: string ): string;
1011 Result := LoadFromSkin( fileName, ThreadItem, ThreadItem.Size );
1013 function ReplaceRes( skin: string ): string;
1015 Result := SkinedRes( skin, Res, No );
1019 if ThreadItem <> nil then begin
1020 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
1023 //if ThreadItem.IsBoardPlugInAvailable then begin
1024 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
1025 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
1026 //boardPlugIn := ThreadItem.BoardPlugIn;
1027 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
1028 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
1029 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
1031 //
\95¶
\8e\9a\83R
\81[
\83h
\82Í
\83v
\83\89\83O
\83C
\83\93\82É
\94C
\82¹
\82é
1033 tmp := boardPlugIn.GetHeader( DWORD( threadItem ),
1034 '<style type="text/css">body {' + UserOptionalStyle + '}</style>' );
1035 //
\90â
\91Î
\8eQ
\8fÆ
\82©
\82ç
\91\8a\91Î
\8eQ
\8fÆ
\82Ö
1036 if GikoSys.Setting.UseSkin then begin
1037 tmp1 := './' + GikoSys.Setting.CSSFileName;
1038 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1039 tmp1 := CustomStringReplace(tmp1, '\', '/');
1040 tmp := CustomStringReplace(tmp, ExtractFilePath(GikoSys.Setting.CSSFileName), tmp1);
1041 end else if GikoSys.Setting.UseCSS then begin
1042 tmp1 := './' + CSSFileName;
1043 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1044 tmp1 := CustomStringReplace(tmp1, '\', '/');
1045 tmp := CustomStringReplace(tmp, CSSFileName, tmp1);
1049 for i := 0 to threadItem.Count - 1 do begin
1052 html.Append( ConvertResAnchor(boardPlugIn.GetRes( DWORD( threadItem ), i + 1 )) );
1055 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
1056 html.Append( boardPlugIn.GetFooter( DWORD( threadItem ), '<a name="bottom"></a>' ) );
1062 ShortDayNames[1] := '
\93ú'; ShortDayNames[2] := '
\8c\8e';
1063 ShortDayNames[3] := '
\89Î'; ShortDayNames[4] := '
\90\85';
1064 ShortDayNames[5] := '
\96Ø'; ShortDayNames[6] := '
\8bà';
1065 ShortDayNames[7] := '
\93y';
1066 BBSID := ThreadItem.ParentBoard.BBSID;
1067 ReadList := TStringList.Create;
1069 if ThreadItem.IsLogFile then begin
1070 FileName := ThreadItem.GetThreadFileName;
1071 ReadList.LoadFromFile(FileName);
1072 GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG'));
1073 GikoSys.FAbon.Execute(ReadList); //
\82 \82Ú
\81`
\82ñ
\82µ
\82Ä
1074 GikoSys.FSelectResFilter.Execute(ReadList); //
\83\8c\83X
\82Ì
\83t
\83B
\83\8b\83^
\83\8a\83\93\83O
\82ð
\82·
\82é
1075 Res := DivideStrLine(ReadList[0]);
1076 //Res.FTitle := CustomStringReplace(Res.FTitle, '
\81\97\81M', ',');
1077 sTitle := Res.FTitle;
1079 sTitle := CustomStringReplace(ThreadItem.Title, '
\81\97\81M', ',');
1082 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
1083 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
1085 if GikoSys.Setting.UseSkin then begin
1086 //
\83X
\83L
\83\93\8eg
\97p
1087 //
\83X
\83L
\83\93\82Ì
\90Ý
\92è
1089 SkinHeader := LoadSkin( GikoSys.GetSkinHeaderFileName );
1090 if Length( UserOptionalStyle ) > 0 then
1091 SkinHeader := CustomStringReplace( SkinHeader, '</head>',
1092 '<style type="text/css">body {' + UserOptionalStyle + '}</style></head>');
1093 //
\90â
\91Î
\8eQ
\8fÆ
\82©
\82ç
\91\8a\91Î
\8eQ
\8fÆ
\82Ö
1094 tmp1 := './' + GikoSys.Setting.CSSFileName;
1095 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1096 tmp1 := CustomStringReplace(tmp1, '\', '/');
1097 SkinHeader := CustomStringReplace(SkinHeader, ExtractFilePath(GikoSys.Setting.CSSFileName), tmp1);
1098 html.Append( SkinHeader );
1102 SkinRes := LoadSkin( GikoSys.GetSkinResFileName );
1105 html.Append('<a name="top"></a>');
1106 for i := 0 to ReadList.Count - 1 do begin
1107 if (Trim(ReadList[i]) <> '') then begin
1108 No := IntToStr(i + 1);
1110 Res := DivideStrLine(ReadList[i]);
1111 Res.FBody := AddAnchorTag(Res.FBody);
1112 Res.FBody := ConvertResAnchor(ConvRes(Res.FBody, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', true));
1115 html.Append( ReplaceRes( SkinRes ) );
1121 html.Append('<a name="bottom"></a>');
1122 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
1124 html.Append( LoadSkin( GikoSys.GetSkinFooterFileName ) );
1127 end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
1129 //CSSFileName := GetAppDir + CSS_FILE_NAME;
1130 html.Append('<html><head>');
1131 html.Append('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
1132 html.Append('<title>' + sTitle + '</title>');
1133 //
\90â
\91Î
\8eQ
\8fÆ
\82©
\82ç
\91\8a\91Î
\8eQ
\8fÆ
\82Ö
1134 tmp1 := './' + CSSFileName;
1135 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1136 tmp1 := CustomStringReplace(tmp1, '\', '/');
1138 html.Append('<link rel="stylesheet" href="'+tmp1+'" type="text/css">');
1139 if Length( UserOptionalStyle ) > 0 then
1140 html.Append('<style type="text/css">body {' + UserOptionalStyle + '}</style>');
1141 html.Append('</head>');
1142 html.Append('<body>');
1143 html.Append('<a name="top"></a>');
1144 html.Append('<div class="title">' + sTitle + '</div>');
1145 for i := 0 to ReadList.Count - 1 do begin
1146 if (Trim(ReadList[i]) <> '') then begin
1147 No := IntToStr(i + 1);
1148 Res := DivideStrLine(ReadList[i]);
1149 Res.FBody := AddAnchorTag(Res.FBody);
1150 Res.FBody := ConvertResAnchor(ConvRes(Res.FBody, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', true));
1151 if Res.FMailTo = '' then
1152 html.Append('<a name="' + No + '"></a>'
1153 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span> '
1154 + '<span class="name_label">
\96¼
\91O
\81F</span> '
1155 + '<span class="name"><b>' + Res.FName + '</b></span> '
1156 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span> '
1157 + '<span class="date">' + Res.FDateTime+ '</span></div>'
1158 + '<div class="mes">' + Res.FBody + ' </div>')
1159 else if GikoSys.Setting.ShowMail 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 + '<a class="name_mail" href="mailto:' + Res.FMailTo + '">'
1164 + '<b>' + Res.FName + '</b></a><span class="mail"> [' + Res.FMailTo + ']</span>'
1165 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span>'
1166 + '<span class="date"> ' + Res.FDateTime+ '</span></div>'
1167 + '<div class="mes">' + Res.FBody + ' </div>')
1169 html.Append('<a name="' + No + '"></a>'
1170 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span>'
1171 + '<span class="name_label">
\96¼
\91O
\81F </span>'
1172 + '<a class="name_mail" href="mailto:' + Res.FMailTo + '">'
1173 + '<b>' + Res.FName + '</b></a>'
1174 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span>'
1175 + '<span class="date"> ' + Res.FDateTime+ '</span></div>'
1176 + '<div class="mes">' + Res.FBody + ' </div>');
1179 html.Append('<a name="bottom"></a>');
1180 html.Append('<a name="last"></a>');
1181 html.Append('</body></html>');
1184 html.Append('<html><head>');
1185 html.Append('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
1186 html.Append('<title>' + sTitle + '</title></head>');
1187 html.Append('<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">');
1188 html.Append('<a name="top"></a>');
1189 html.Append('<font size=+1 color="#FF0000">' + sTitle + '</font>');
1190 html.Append('<dl>');
1191 for i := 0 to ReadList.Count - 1 do begin
1192 if (Trim(ReadList[i]) <> '') then begin
1193 No := IntToStr(i + 1);
1194 Res := DivideStrLine(ReadList[i]);
1195 Res.FBody := AddAnchorTag(Res.FBody);
1196 Res.FBody := ConvertResAnchor(ConvRes(Res.FBody, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', true));
1197 if Res.FMailTo = '' then
1198 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>')
1199 else if GikoSys.Setting.ShowMail then
1200 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>')
1202 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>');
1205 html.Append('</dl>');
1206 html.Append('<a name="bottom"></a>');
1207 html.Append('</body></html>');
1220 HTMLCreater := THTMLCreate.Create;
1223 if HTMLCreater <> nil then begin