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;
22 PResLinkRec = ^TResLinkRec;
28 THTMLCreate = class(TObject)
32 pURLCHARs,pURLCHARe : PChar;
33 pANCHORs, pANCHORe : PChar;
34 pCTAGLs, pCTAGLe : PChar;
35 pCTAGUs, pCTAGUe : PChar;
36 pREF_MARKSs : array[0..9] of PChar;
37 pREF_MARKSe : array[0..9] of PChar;
40 function AddBeProfileLink(AID : string; ANum: Integer):string ;
41 procedure CreateUsePluginHTML(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
42 procedure CreateUseSKINHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList);
43 procedure CreateUseCSSHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
44 procedure CreateDefaultHTML (doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
45 procedure ConvertResAnchor(PRes: PResRec);
46 procedure separateNumber(var st: String; var et: String; const Text, Separator: String);
47 function checkComma(const s : String; var j : Integer; var No : String) : boolean;
48 function addResAnchor(PAddRes: PResRec; PResLink : PResLinkRec; dat : boolean;
49 var s : String; j : Integer; const No: String) : string;
52 procedure AddAnchorTag(PRes: PResRec);
53 function LoadFromSkin(fileName: string; ThreadItem: TThreadItem; SizeByte: Integer): string;
54 function SkinedRes(const skin: string; PRes: PResRec; const No: string): string;
55 procedure ConvRes( PRes : PResRec; PResLink : PResLinkRec; DatToHTML: boolean = false); overload;
56 function ConvRes(const Body, Bbs, Key, ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string; DatToHTML: boolean = false): string; overload;
57 procedure CreateHTML2(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
58 procedure CreateHTML3(var html: TStringList; ThreadItem: TThreadItem; var sTitle: string);
59 //
\83\8c\83X
\83|
\83b
\83v
\83A
\83b
\83v
\82Ì
\8dì
\90¬
60 procedure SetResPopupText(Hint :TResPopup; threadItem: TThreadItem; StNum, ToNum: Integer; Title, First: Boolean);
61 //
\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é
62 class function GetRespopupURL(AText, AThreadURL : string): string;
63 //
\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é
64 class procedure SkinorCSSFilesCopy(path: string);
65 //dat
\82P
\8ds
\82ð
\83\8c\83X
\82É
\95ª
\89ð
\82·
\82é
66 class procedure DivideStrLine(Line: string; PRes: PResRec);
67 //HTML
\82©
\82ç
\83\8a\83\93\83N
\83^
\83O
\82ð
\8dí
\8f\9c\82·
\82é
68 class function DeleteLink(const s: string): string;
72 HTMLCreater: THTMLCreate;
77 URL_CHAR: string = '0123456789'
78 + 'abcdefghijklmnopqrstuvwxyz'
79 + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
80 + '#$%&()*+,-./:;=?@[]^_`{|}~!''\';
85 REF_MARK: array[0..9] of string = ('http://', 'ttp://', 'tp://',
86 'ms-help://','p://', 'https://',
87 'www.', 'ftp://','news://','rtsp://');
89 constructor THTMLCreate.Create;
93 // + 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ß
94 anchorLen := Length( ANCHOR_REF ) + 3;
95 pANCHORs := PChar(ANCHOR_REF);
96 pANCHORe := pANCHORs + Length(ANCHOR_REF);
97 pURLCHARs := PChar(URL_CHAR);
98 pURLCHARe := pURLCHARs + Length(URL_CHAR);
99 pCTAGLs := PChar(CLOSE_TAGAL);
100 pCTAGLe := pCTAGLs + 4;
101 pCTAGUs := PChar(CLOSE_TAGAU);
102 pCTAGUe := pCTAGUs + 4;
103 for j := 0 to 9 do begin
104 pREF_MARKSs[j] := PChar(REF_MARK[j]);
105 pREF_MARKSe[j] := pREF_MARKSs[j] + Length(REF_MARK[j]);
108 //
\83X
\83L
\83\93\82ð
\93Ç
\82Ý
\8d\9e\82Ý
\81A
\92l
\82ð
\92u
\8a·
\82·
\82é
109 function THTMLCreate.LoadFromSkin(
111 ThreadItem: TThreadItem;
118 Skin := TStringList.Create;
120 if FileExists( fileName ) then begin
121 Skin.LoadFromFile( fileName );
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
125 if ThreadItem.ParentBoard <> nil then
126 if ThreadItem.ParentBoard.ParentCategory <> nil then
127 CustomStringReplace( Skin, '<BBSNAME/>', ThreadItem.ParentBoard.ParentCategory.ParenTBBS.Title);
128 CustomStringReplace( Skin, '<THREADURL/>', ThreadItem.URL);
130 CustomStringReplace( Skin, '<BOARDNAME/>', ThreadItem.ParentBoard.Title);
131 CustomStringReplace( Skin, '<BOARDURL/>', ThreadItem.ParentBoard.URL);
132 CustomStringReplace( Skin, '<THREADNAME/>', ThreadItem.Title);
133 CustomStringReplace( Skin, '<SKINPATH/>', GikoSys.Setting.CSSFileName);
134 CustomStringReplace( Skin, '<GETRESCOUNT/>', IntToStr( ThreadItem.Count - ThreadItem.NewResCount ));
135 CustomStringReplace( Skin, '<NEWRESCOUNT/>', IntToStr( ThreadItem.NewResCount ));
136 CustomStringReplace( Skin, '<ALLRESCOUNT/>', IntToStr( ThreadItem.Count ));
138 CustomStringReplace( Skin, '<NEWDATE/>',FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate));
139 CustomStringReplace( Skin, '<SIZEKB/>', IntToStr( Floor( SizeByte / 1024 ) ));
140 CustomStringReplace( Skin, '<SIZE/>', IntToStr( SizeByte ));
142 //-----
\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µ
143 //
\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
144 if GikoSys.Setting.UseKatjushaType then begin
146 if ThreadItem.ParentBoard <> nil then
147 if ThreadItem.ParentBoard.ParentCategory <> nil then
148 CustomStringReplace( Skin, '&BBSNAME', ThreadItem.ParentBoard.ParentCategory.ParenTBBS.Title);
149 CustomStringReplace( Skin, '&THREADURL', ThreadItem.URL);
151 CustomStringReplace( Skin, '&BOARDNAME', ThreadItem.ParentBoard.Title);
152 CustomStringReplace( Skin, '&BOARDURL', ThreadItem.ParentBoard.URL);
153 CustomStringReplace( Skin, '&THREADNAME', ThreadItem.Title);
154 CustomStringReplace( Skin, '&SKINPATH', GikoSys.Setting.CSSFileName);
155 CustomStringReplace( Skin, '&GETRESCOUNT', IntToStr( ThreadItem.NewReceive - 1 ));
156 CustomStringReplace( Skin, '&NEWRESCOUNT', IntToStr( ThreadItem.NewResCount ));
157 CustomStringReplace( Skin, '&ALLRESCOUNT', IntToStr( ThreadItem.AllResCount ));
159 CustomStringReplace( Skin, '&NEWDATE', FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate));
160 CustomStringReplace( Skin, '&SIZEKB', IntToStr( Floor( SizeByte / 1024 ) ));
161 CustomStringReplace( Skin, '&SIZE', IntToStr( SizeByte ));
163 //-----
\82±
\82±
\82Ü
\82Å
171 //
\83\8c\83X
\82Ì
\92l
\82ð
\92u
\8a·
\82·
\82é
172 function THTMLCreate.SkinedRes(
178 FORMT_NAME = '<b>%s</b>';
179 FORMT_NUM = '<a href="menu:%s" name="%s">%s</a>';
180 FORMT_MAILNAME = '<a href="mailto:%s"><b>%s</b></a>';
182 spamminess : Extended;
183 {$IFDEF SPAM_FILTER_ENABLED}
184 wordCount : TWordCount;
187 {$IFDEF SPAM_FILTER_ENABLED}
188 wordCount := TWordCount.Create;
190 spamminess := Floor( GikoSys.SpamParse(
191 Res.FName + '<>' + Res.FMailTo + '<>' + Res.FBody, wordCount ) * 100 );
195 Result := CustomStringReplace( skin, '<SPAMMINESS/>', FloatToStr( spamminess ) );
196 Result := CustomStringReplace( Result, '<NONSPAMMINESS/>', FloatToStr( 100 - spamminess ) );
197 Result := CustomStringReplace( Result, '<MAIL/>', PRes.FMailTo);
198 Result := CustomStringReplace( Result, '<DATE/>', PRes.FDateTime);
199 Result := CustomStringReplace( Result, '<PLAINNUMBER/>', No);
200 Result := CustomStringReplace( Result, '<NAME/>',
201 Format(FORMT_NAME, [PRes.FName]));
202 Result := CustomStringReplace( Result, '<NUMBER/>',
203 Format(FORMT_NUM, [No, No, No]));
204 Result := CustomStringReplace( Result, '<MAILNAME/>',
205 Format(FORMT_MAILNAME,[PRes.FMailTo, PRes.FName]));
206 Result := CustomStringReplace( Result, '<MESSAGE/>', PRes.FBody);
208 //-----
\82©
\82¿
\82ã
\81`
\82µ
\82á
\8cÝ
\8a·
\97p
\81B
\83R
\83\81\83\93\83g
\83A
\83E
\83g
\82µ
\82Ä
\82à
\82æ
\82µ
209 if GikoSys.Setting.UseKatjushaType then begin
210 Result := CustomStringReplace( Result, '&NUMBER',
211 '<a href="menu:' + No + '" name="' + No + '">' + No + '</a>');
212 Result := CustomStringReplace( Result, '&PLAINNUMBER', No);
213 Result := CustomStringReplace( Result, '&NAME', '<b>' + PRes.FName + '</b>');
214 Result := CustomStringReplace( Result, '&MAILNAME',
215 '<a href="mailto:' + PRes.FMailTo + '"><b>' + PRes.FName + '</b></a>');
216 Result := CustomStringReplace( Result, '&MAIL', PRes.FMailTo);
217 Result := CustomStringReplace( Result, '&DATE', PRes.FDateTime);
218 Result := CustomStringReplace( Result, '&MESSAGE', PRes.FBody);
219 Result := CustomStringReplace( Result, '&SPAMMINESS', FloatToStr( spamminess ) );
220 Result := CustomStringReplace( Result, '&NONSPAMMINESS', FloatToStr( 100 - spamminess ) );
222 //-----
\82±
\82±
\82Ü
\82Å
223 {$IFDEF SPAM_FILTER_ENABLED}
230 (*************************************************************************
231 *http://
\82Ì
\95¶
\8e\9a\97ñ
\82ðanchor
\83^
\83O
\95t
\82«
\82É
\82·
\82é
\81B
232 *************************************************************************)
233 procedure THTMLCreate.AddAnchorTag(PRes: PResRec);
235 _HEAD : array[0..9] of String =
236 ('', 'h', 'ht', '', 'htt', '', 'http://', '', '', '');
251 //while True do begin
256 pe := pp + Length(s);
258 for j := 0 to 9 do begin
259 pos := AnsiStrPosEx(pp, pe, pREF_MARKSs[j], pREF_MARKSe[j]);
260 if pos <> nil then begin
262 idx := Min(tmp, idx);
263 if idx = tmp then idx2 := j; //
\82Ç
\82Ì
\83}
\81[
\83N
\82Å
\88ø
\82Á
\82©
\82©
\82Á
\82½
\82©
\82ð
\95Û
\91¶
267 if idx = MaxInt then begin
268 //
\83\8a\83\93\83N
\82ª
\96³
\82¢
\82æ
\81B
269 len := Length(PRes.FBody);
270 SetLength(PRes.FBody, Length(s) + len);
271 Move(pp^, PRes.FBody[len + 1], Length(s));
273 if (idx > anchorLen) and
274 (AnsiStrPosEx(pp + idx - 1 - anchorLen, pp + idx, pANCHORs, pANCHORe) <> nil) then begin
275 //
\8aù
\82É
\83\8a\83\93\83N
\83^
\83O
\82ª
\82Â
\82¢
\82Ä
\82¢
\82é
\82Á
\82Û
\82¢
\82Æ
\82«
\82Í
\83\80\83V
276 //</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õ
277 pos := AnsiStrPosEx(pp + idx, pe, pCTAGLs, pCTAGLe);
279 pos := AnsiStrPosEx(pp + idx, pe, pCTAGUs, pCTAGUe);
281 b := Length(REF_MARK[idx2])
285 len := Length(PRes.FBody);
286 SetLength(PRes.FBody, len + idx + b);
287 Move(pp^, PRes.FBody[len + 1], idx + b);
288 Delete(s, 1, idx + b);
291 len := Length(PRes.FBody);
292 SetLength(PRes.FBody, len + idx - 1);
293 Move(pp^, PRes.FBody[len + 1], idx - 1);
295 Delete(s, 1, idx - 1);
296 b := Length( s ) + 1;
298 for i := 1 to b do begin
299 //
\82P
\83o
\83C
\83g
\95¶
\8e\9a\82ÅURL
\82É
\8eg
\82¦
\82È
\82¢
\95¶
\8e\9a\82È
\82ç
300 if (AnsiStrPosEx(pURLCHARs, pURLCHARe, pp, pp + 1) = nil) then begin
301 url := Copy(s, 1, i - 1);
303 href := Format('%s%s', [_HEAD[idx2], url]);
305 := Format('%s<a href="%s" target="_blank">%s</a>', [PRes.FBody, href, url]);
308 //
\88ê
\95¶
\8e\9a\90i
\82ß
\82é
\81B
316 //
\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
317 function THTMLCreate.AddBeProfileLink(AID : string; ANum: Integer):string ;
319 BE_MARK : string = 'BE:';
322 BNum, BMark : string;
324 p := AnsiPos(BE_MARK, AnsiUpperCase(AID));
326 BNum := Copy(AID, p, Length(AID));
327 AID := Copy(AID, 1, p - 1);
328 p := AnsiPos('-', BNum);
330 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
331 BNum := Copy(BNum, 1, p - 1);
334 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
335 + '" target=_blank>' + BMark + '</a>';
339 procedure THTMLCreate.separateNumber(var st: String; var et: String; const Text:String; const Separator: String);
343 p := Pos(Separator,Text);
344 if (p > 0 ) then begin
345 st := Copy(Text, 1, p - 1);
346 et := Copy(Text, p + Length(Separator), Length(Text));
352 procedure THTMLCreate.ConvRes( PRes : PResRec; PResLink : PResLinkRec; DatToHTML: boolean = false);
356 //
\8c\9f\8dõ
\91Î
\8fÛ
\82Ì
\95¶
\8e\9a\97ñ
\8cS
357 TOKEN : array[0..5] of string = (GT+GT, GT, '
\81\84\81\84', '
\81\84', '<a ', '<A ');
372 procedure getNumberString;
374 while (j <= len) do begin
375 if (ByteType(s, j) = mbSingleByte) then begin
382 ch := ZenToHan(Copy(s, j, 2));
387 if System.Pos(ch, SN) > 0 then begin
389 end else if (ch = '-') then begin
391 if No = '' then break;
401 //s
\82É
\96{
\95¶
\82ð
\91S
\95\94\93ü
\82ê
\82é
403 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
407 while Length(s) > 2 do begin
408 pmin := Length(s) + 1;
410 for j := 0 to 5 do begin
411 pos := AnsiPos(TOKEN[j], s);
412 if pos <> 0 then begin
413 if pos < pmin then begin
414 //
\82Ç
\82ê
\82Å
\83q
\83b
\83g
\82µ
\82½
\82©
\95Û
\91¶
416 //
\8dÅ
\8f¬
\92l
\82ð
\8dX
\90V
422 //
\83q
\83b
\83g
\82µ
\82½
\95¶
\8e\9a\97ñ
\82Ì
\88ê
\82Â
\8eè
\91O
\82Ü
\82Å
\8c\8b\89Ê
\82É
\83R
\83s
\81[
423 PRes.FBody := PRes.FBody + Copy(s, 1, pmin - 1);
424 Delete(s, 1, pmin - 1);
427 //
\83q
\83b
\83g
\82È
\82µ
428 end else if (i = 4) or (i = 5) then begin
429 //'<a ' or '<A'
\82Å
\83q
\83b
\83g '</a>' or '</A>'
\82Ü
\82Å
\83R
\83s
\81[
430 pmin := AnsiPos('</a>' , s);
431 pos := AnsiPos('</A>' , s);
432 if (pmin <> 0) and (pos <> 0) then begin
433 if (pmin > pos) then begin
436 end else if (pos <> 0) then begin
439 rink := Copy(s, 1, pmin + 3);
440 PRes.FBody := PRes.FBody + rink;
441 Delete(s, 1, pmin + 3);
443 pmin := Length(rink);
445 for j := 0 to 3 do begin
446 pos := AnsiPos(TOKEN[j], rink);
447 if pos <> 0 then begin
448 if pos < pmin then begin
449 //
\82Ç
\82ê
\82Å
\83q
\83b
\83g
\82µ
\82½
\82©
\95Û
\91¶
451 //
\8dÅ
\8f¬
\92l
\82ð
\8dX
\90V
456 //
\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¤
461 cm := checkComma(s, j, No);
469 //
\8fI
\92[
\82Ü
\82Å
\8ds
\82Á
\82Ä
\82Ì
\8fI
\97¹
\82©
\83`
\83F
\83b
\83N
470 if j <= len then begin
471 if db then j := j - 2
474 addResAnchor(PRes, PResLink, DatToHTML, s, j, No);
477 cm := checkComma(s, j, No);
481 //
\89½
\82©
\82µ
\82ç
\8c©
\82Â
\82©
\82Á
\82½
\83p
\83^
\81[
\83\93
482 j := Length(TOKEN[i]) + 1;
489 //
\8fI
\92[
\82Ü
\82Å
\8ds
\82Á
\82Ä
\82Ì
\8fI
\97¹
\82©
\83`
\83F
\83b
\83N
490 if j <= len then begin
491 if db then j := j - 2
494 addResAnchor(PRes, PResLink, DatToHTML, s, j, No);
497 if Length(s) > 0 then begin
498 PRes.FBody := PRes.FBody + s;
501 function THTMLCreate.checkComma(
507 bType : TMbcsByteType;
510 if (Length(s) > 0) then begin
511 bType := ByteType(s, j);
512 if ((bType = mbSingleByte) and (s[j] = ',') or
513 ((bType = mbLeadByte) and (ZenToHan(Copy(s, j ,2)) = ','))) then begin
515 if (bType = mbSingleByte) then
523 function THTMLCreate.addResAnchor(
524 PAddRes: PResRec; PResLink : PResLinkRec; dat : boolean;
525 var s : String; j : Integer; const No: String) : string;
527 FORMAT_LINK = '<a href="../test/read.cgi?bbs=%s&key=%s&st=%s&to=%s&nofirst=true" target="_blank">';
532 //
\89½
\82à
\90\94\8e\9a\82ª
\8c©
\82Â
\82©
\82ç
\82È
\82¢
\82Æ
\82«
533 if No = '' then begin
534 PAddRes.FBody := PAddRes.FBody + Copy(s, 1, j - 1);
536 separateNumber(st, et, No, '-');
538 if not dat then begin
539 PAddRes.FBody := PAddRes.FBody +
540 Format(FORMAT_LINK, [PResLink.FBbs, PResLink.FKey, st, et]);
542 PAddRes.FBody := PAddRes.FBody + Format('<a href="#%s">', [st]);
544 PAddRes.FBody := PAddRes.FBody + Copy(s, 1, j - 1) + '</a>';
549 (*************************************************************************
552 *************************************************************************)
553 function THTMLCreate.ConvRes(const Body, Bbs, Key,
554 ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string;
555 DatToHTML: boolean = false): string;
559 FORMAT_LINK = '<a href="../test/read.cgi?%s=%s&%s=%s&%s=%s&%s=%s&%s=%s" target="_blank">';
560 //
\8c\9f\8dõ
\91Î
\8fÛ
\82Ì
\95¶
\8e\9a\97ñ
\8cS
561 TOKEN : array[0..5] of string = (GT+GT, GT, '
\81\84\81\84', '
\81\84', '<a ', '<A ');
575 function addResAnchor(const Left :string) : string;
579 //
\8fI
\92[
\82Ü
\82Å
\8ds
\82Á
\82Ä
\82Ì
\8fI
\97¹
\82©
\83`
\83F
\83b
\83N
580 if j <= len then begin
581 if db then j := j - 2
584 //
\89½
\82à
\90\94\8e\9a\82ª
\8c©
\82Â
\82©
\82ç
\82È
\82¢
\82Æ
\82«
585 if No = '' then begin
586 Result := Left + Copy(s, 1, j - 1);
588 separateNumber(st, et, No, '-');
590 if not DatToHTML then begin
591 Result := Left + Format(FORMAT_LINK,
592 [ParamBBS, Bbs, ParamKey, Key, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]);
594 Result := Left + Format('<a href="#%s">', [st]);
596 Result := Result + Copy(s, 1, j - 1) + '</a>';
601 procedure getNumberString;
603 while (j <= len) do begin
604 if (ByteType(s, j) = mbSingleByte) then begin
611 ch := ZenToHan(Copy(s, j, 2));
616 if System.Pos(ch, SN) > 0 then begin
618 end else if (ch = '-') then begin
620 if No = '' then break;
629 function checkComma : boolean;
633 if ((len > 0) and (s[j] = ',')) or ((len > 1) and (ZenToHan(Copy(s, j ,2)) = ',')) then begin
635 if (ByteType(s, j) = mbSingleByte) then
645 //s
\82É
\96{
\95¶
\82ð
\91S
\95\94\93ü
\82ê
\82é
647 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
651 while Length(s) > 2 do begin
652 pmin := Length(s) + 1;
654 for j := 0 to 5 do begin
655 pos := AnsiPos(TOKEN[j], s);
656 if pos <> 0 then begin
657 if pos < pmin then begin
658 //
\82Ç
\82ê
\82Å
\83q
\83b
\83g
\82µ
\82½
\82©
\95Û
\91¶
660 //
\8dÅ
\8f¬
\92l
\82ð
\8dX
\90V
666 //
\83q
\83b
\83g
\82µ
\82½
\95¶
\8e\9a\97ñ
\82Ì
\88ê
\82Â
\8eè
\91O
\82Ü
\82Å
\8c\8b\89Ê
\82É
\83R
\83s
\81[
667 Result := Result + Copy(s, 1, pmin - 1);
668 Delete(s, 1, pmin - 1);
671 //
\83q
\83b
\83g
\82È
\82µ
672 end else if (i = 4) or (i = 5) then begin
673 //'<a ' or '<A'
\82Å
\83q
\83b
\83g '</a>' or '</A>'
\82Ü
\82Å
\83R
\83s
\81[
674 pmin := AnsiPos('</a>' , s);
675 pos := AnsiPos('</A>' , s);
676 if (pmin <> 0) and (pos <> 0) then begin
677 if (pmin > pos) then begin
680 end else if (pos <> 0) then begin
683 rink := Copy(s, 1, pmin + 3);
684 Result := Result + rink;
685 Delete(s, 1, pmin + 3);
687 pmin := Length(rink);
689 for j := 0 to 3 do begin
690 pos := AnsiPos(TOKEN[j], rink);
691 if pos <> 0 then begin
692 if pos < pmin then begin
693 //
\82Ç
\82ê
\82Å
\83q
\83b
\83g
\82µ
\82½
\82©
\95Û
\91¶
695 //
\8dÅ
\8f¬
\92l
\82ð
\8dX
\90V
700 //
\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¤
711 Result := addResAnchor(Result);
716 //
\89½
\82©
\82µ
\82ç
\8c©
\82Â
\82©
\82Á
\82½
\83p
\83^
\81[
\83\93
717 j := Length(TOKEN[i]) + 1;
724 Result := addResAnchor(Result);
727 Result := Result + s;
730 procedure THTMLCreate.ConvertResAnchor(PRes: PResRec);
732 _HEAD : string = '<a href="../';
733 _TAIL : string = ' target="_blank">';
734 _ST: string = '&st=';
735 _TO: string = '&to=';
736 _STA: string = '&START=';
737 _END: string = '&END=';
745 i := AnsiPos(_HEAD, res);
746 while i <> 0 do begin
747 PRes.FBody := PRes.FBody + Copy(res, 1, i -1);
748 Delete(res, 1, i - 1);
749 j := AnsiPos(_TAIL, res);
751 PRes.FBody := PRes.FBody + res;
754 tmp := Copy(res, 1, j - 1);
755 Delete(res, 1, j + 16);
756 if (AnsiPos(_ST, tmp) <> 0) and (AnsiPos(_TO, tmp) <> 0) then begin
757 Delete(tmp, 1, AnsiPos(_ST, tmp) + 3);
758 Delete(tmp, AnsiPos(_TO, tmp), Length(tmp));
759 PRes.FBody := PRes.FBody + '<a href="#' + tmp + '">';
760 end else if (AnsiPos(_STA, tmp) <> 0) and (AnsiPos(_END, tmp) <> 0) then begin
761 Delete(tmp, 1, AnsiPos(_STA, tmp) + 6);
762 Delete(tmp, AnsiPos(_END, tmp), Length(tmp));
763 PRes.FBody := PRes.FBody + '<a href="#' + tmp + '">';
765 k := LastDelimiter('/', tmp);
767 if AnsiPos('-', tmp) < AnsiPos('"', tmp) then
768 Delete(tmp, AnsiPos('-', tmp), Length(tmp))
770 Delete(tmp, AnsiPos('"', tmp), Length(tmp));
772 PRes.FBody := PRes.FBody + '<a href="#' + tmp + '">';
774 i := AnsiPos(_HEAD, res);
776 PRes.FBody := PRes.FBody + res;
780 //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Þ
781 procedure THTMLCreate.CreateUsePluginHTML(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
784 NewReceiveNo: Integer;
785 boardPlugIn : TBoardPlugIn;
786 UserOptionalStyle: string;
788 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
789 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
790 NewReceiveNo := ThreadItem.NewReceive;
791 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
792 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
796 doc.Write( boardPlugIn.GetHeader( DWORD( threadItem ),
797 '<style type="text/css">body {' + UserOptionalStyle + '}</style>' ));
798 doc.Write('<p id="idSearch"></p>');
800 for i := 0 to threadItem.Count - 1 do begin
801 // 1
\82Í
\95K
\82¸
\95\
\8e¦
803 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
804 case GikoSys.ResRange of
806 if ThreadItem.Kokomade > (i + 1) then
809 if NewReceiveNo > (i + 1) then
812 if (threadItem.Count - i) > GikoSys.ResRange then
817 //
\90V
\92\85\83}
\81[
\83N
818 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
820 if GikoSys.Setting.UseSkin then begin
821 if FileExists( GikoSys.GetSkinNewmarkFileName ) then
822 doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ))
824 doc.Write( '<a name="new"></a>');
825 end else if GikoSys.Setting.UseCSS then begin
826 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>');
829 doc.Write('<a name="new"></a>');
830 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>');
834 doc.Write( '<a name="new"></a>');
839 doc.Write( boardPlugIn.GetRes( DWORD( threadItem ), i + 1 ));
841 if ThreadItem.Kokomade = (i + 1) then begin
842 //
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾
844 if GikoSys.Setting.UseSkin then begin
845 if FileExists( GikoSys.GetSkinBookmarkFileName ) then
846 doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
848 doc.Write( '<a name="koko"></a>');
849 end else if GikoSys.Setting.UseCSS then begin
850 doc.Write('<a name="koko"></a><div class="koko">
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾</div>');
853 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>');
857 doc.Write( '<a name="koko"></a>');
863 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
864 doc.Write( boardPlugIn.GetFooter( DWORD( threadItem ), '<a name="bottom"></a>' ));
871 procedure THTMLCreate.CreateUseSKINHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList);
873 KOKO_TAG = '<a name="koko"></a>';
874 NEW_TAG = '<a name="new"></a>';
877 NewReceiveNo: Integer;
879 UserOptionalStyle: string;
884 ResLink :TResLinkRec;
886 NewReceiveNo := ThreadItem.NewReceive;
887 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
888 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
889 ThreadName := ChangeFileExt(ThreadItem.FileName, '');
890 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
891 ResLink.FKey := ThreadName;
895 doc.charset := 'Shift_JIS';
897 //
\83X
\83L
\83\93\82Ì
\90Ý
\92è
899 SkinHeader := LoadFromSkin( GikoSys.GetSkinHeaderFileName, ThreadItem, ThreadItem.Size);
900 if Length( UserOptionalStyle ) > 0 then
901 SkinHeader := CustomStringReplace( SkinHeader, '</head>',
902 '<style type="text/css">body {' + UserOptionalStyle + '}</style></head>');
903 doc.Write( SkinHeader );
907 SkinNewRes := LoadFromSkin( GikoSys.GetSkinNewResFileName, ThreadItem, ThreadItem.Size);
908 SkinRes := LoadFromSkin( GikoSys.GetSkinResFileName, ThreadItem, ThreadItem.Size );
910 doc.Write('<p id="idSearch"></p>'#13#10'<a name="top"></a>');
912 for i := 0 to ReadList.Count - 1 do begin
913 // 1
\82Í
\95K
\82¸
\95\
\8e¦
915 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
916 case GikoSys.ResRange of
918 if ThreadItem.Kokomade > (i + 1) then
921 if NewReceiveNo > (i + 1) then
924 if (threadItem.Count - i) > GikoSys.ResRange then
929 //
\90V
\92\85\83}
\81[
\83N
930 if (NewReceiveNo = i + 1) or ((NewReceiveNo = 0) and (i = 0)) then begin
931 if FileExists( GikoSys.GetSkinNewmarkFileName ) then
932 doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ))
934 doc.Write( NEW_TAG );
937 if (Trim(ReadList[i]) <> '') then begin
938 DivideStrLine(ReadList[i], @Res);
940 ConvRes(@Res, @ResLink);
941 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
943 if NewReceiveNo <= (i + 1) then
944 //
\90V
\92\85\83\8c\83X
945 doc.Write(SkinedRes(SkinNewRes, @Res, IntToStr(i + 1)))
947 //
\92Ê
\8fí
\82Ì
\83\8c\83X
948 doc.Write(SkinedRes(SkinRes, @Res, IntToStr(i + 1)));
951 if ThreadItem.Kokomade = (i + 1) then begin
952 //
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾
953 if FileExists( GikoSys.GetSkinBookmarkFileName ) then
954 doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
956 doc.Write( KOKO_TAG );
960 doc.Write('<a name="bottom"></a>');
961 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
962 doc.Write( LoadFromSkin( GikoSys.GetSkinFooterFileName, ThreadItem, ThreadItem.Size ) );
968 procedure THTMLCreate.CreateUseCSSHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
970 FORMAT_NOMAIL = '<a name="%s"></a><div class="header"><span class="no"><a href="menu:%s">%s</a></span>'
971 + '<span class="name_label">
\96¼
\91O
\81F</span> <span class="name"><b>%s</b></span>'
972 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span> <span class="date">%s</span></div>'
973 + '<div class="mes">%s</div>';
975 FORMAT_SHOWMAIL = '<a name="%s"></a><div class="header"><span class="no"><a href="menu:%s">%s</a></span>'
976 + '<span class="name_label">
\96¼
\91O
\81F </span><a class="name_mail" href="mailto:%s">'
977 + '<b>%s</b></a><span class="mail"> [%s]</span><span class="date_label">
\93\8a\8de
\93ú
\81F</span>'
978 + '<span class="date"> %s</span></div><div class="mes">%s </div>';
980 FORMAT_NOSHOW = '<a name="%s"></a><div class="header"><span class="no"><a href="menu:%s">%s</a></span>'
981 + '<span class="name_label">
\96¼
\91O
\81F </span><a class="name_mail" href="mailto:%s">'
982 + '<b>%s</b></a><span class="date_label">
\93\8a\8de
\93ú
\81F</span><span class="date"> %s</span></div>'
983 + '<div class="mes">%s </div>';
989 NewReceiveNo: Integer;
991 UserOptionalStyle: string;
993 ResLink :TResLinkRec;
997 doc.charset := 'Shift_JIS';
998 NewReceiveNo := ThreadItem.NewReceive;
999 ThreadName := ChangeFileExt(ThreadItem.FileName, '');
1000 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
1001 ResLink.FKey := ThreadName;
1002 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
1003 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
1004 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
1005 if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
1007 doc.Write('<html><head>');
1008 doc.Write('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
1009 doc.Write('<title>' + sTitle + '</title>');
1010 doc.Write('<link rel="stylesheet" href="'+CSSFileName+'" type="text/css">');
1011 if Length( UserOptionalStyle ) > 0 then
1012 doc.Write('<style type="text/css">body {' + UserOptionalStyle + '}</style>');
1013 doc.Write('</head>'#13#10'<body>');
1014 doc.Write('<a name="top"></a>'#13#10'<p id="idSearch"></p>');
1015 doc.Write('<div class="title">' + sTitle + '</div>');
1016 for i := 0 to ReadList.Count - 1 do begin
1017 // 1
\82Í
\95K
\82¸
\95\
\8e¦
1018 if i <> 0 then begin
1019 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
1020 case GikoSys.ResRange of
1022 if ThreadItem.Kokomade > (i + 1) then
1025 if NewReceiveNo > (i + 1) then
1028 if (threadItem.Count - i) > GikoSys.ResRange then
1033 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
1034 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>');
1037 if (Trim(ReadList[i]) <> '') then begin
1038 No := IntToStr(i + 1);
1039 DivideStrLine(ReadList[i], @Res);
1041 ConvRes(@Res, @ResLink);
1042 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
1043 if Res.FMailTo = '' then
1044 doc.Write(Format(FORMAT_NOMAIL, [No, No, No, Res.FName, Res.FDateTime, Res.FBody]))
1045 else if GikoSys.Setting.ShowMail then
1046 doc.Write(Format(FORMAT_SHOWMAIL, [No, No, No, Res.FMailTo, Res.FName, Res.FMailTo, Res.FDateTime, Res.FBody]))
1048 doc.Write(Format(FORMAT_NOSHOW, [No, No, No, Res.FName, Res.FDateTime, Res.FBody]));
1051 if ThreadItem.Kokomade = (i + 1) then begin
1052 doc.Write('<a name="koko"></a><div class="koko">
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾</div>');
1057 doc.Write('<a name="bottom"></a>');
1058 doc.Write('<a name="last"></a>');
1059 doc.Write('</body></html>');
1066 procedure THTMLCreate.CreateDefaultHTML (doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
1070 NewReceiveNo: Integer;
1073 ResLink : TResLinkRec;
1077 doc.charset := 'Shift_JIS';
1078 NewReceiveNo := ThreadItem.NewReceive;
1079 ThreadName := ChangeFileExt(ThreadItem.FileName, '');
1080 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
1081 ResLink.FKey := ThreadName;
1082 doc.Write('<html><head>'#13#10);
1083 doc.Write('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">'#13#10);
1084 doc.Write('<title>' + sTitle + '</title></head>'#13#10);
1085 doc.Write('<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">'#13#10);
1086 doc.Write('<a name="top"></a>'#13#10);
1087 doc.Write('<font size=+1 color="#FF0000">' + sTitle + '</font>'#13#10);
1088 doc.Write('<dl>'#13#10);
1089 doc.Write('<p id="idSearch"></p>'#13#10);
1090 for i := 0 to ReadList.Count - 1 do begin
1091 // 1
\82Í
\95K
\82¸
\95\
\8e¦
1092 if i <> 0 then begin
1093 //
\95\
\8e¦
\94Í
\88Í
\82ð
\8cÀ
\92è
1094 case GikoSys.ResRange of
1096 if ThreadItem.Kokomade > (i + 1) then
1099 if NewReceiveNo > (i + 1) then
1102 if (threadItem.Count - i) > GikoSys.ResRange then
1107 if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
1109 doc.Write('<a name="new"></a>');
1110 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>');
1114 if (Trim(ReadList[i]) <> '') then begin
1115 No := IntToStr(i + 1);
1116 DivideStrLine(ReadList[i], @Res);
1118 ConvRes(@Res, @ResLink);
1119 Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
1120 if Res.FMailTo = '' then
1121 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)
1122 else if GikoSys.Setting.ShowMail then
1123 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)
1125 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);
1127 if ThreadItem.Kokomade = (i + 1) then begin
1129 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>');
1133 doc.Write('</dl>'#13#10'<a name="bottom"></a>'#13#10'</body></html>');
1139 procedure THTMLCreate.CreateHTML2(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
1141 ReadList: TStringList;
1142 CSSFileName: string;
1150 Writeln('Create HTML');
1153 if ThreadItem <> nil then begin
1154 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
1155 CreateUsePluginHTML(doc, ThreadItem, sTitle);
1157 ShortDayNames[1] := '
\93ú'; ShortDayNames[2] := '
\8c\8e';
1158 ShortDayNames[3] := '
\89Î'; ShortDayNames[4] := '
\90\85';
1159 ShortDayNames[5] := '
\96Ø'; ShortDayNames[6] := '
\8bà';
1160 ShortDayNames[7] := '
\93y';
1162 ReadList := TStringList.Create;
1164 if ThreadItem.IsLogFile then begin
1165 ReadList.BeginUpdate;
1166 FileName := ThreadItem.GetThreadFileName;
1167 ReadList.LoadFromFile(FileName);
1169 GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG'));
1170 GikoSys.FAbon.Execute(ReadList); //
\82 \82Ú
\81`
\82ñ
\82µ
\82Ä
1171 GikoSys.FSelectResFilter.Execute(ReadList); //
\83\8c\83X
\82Ì
\83t
\83B
\83\8b\83^
\83\8a\83\93\83O
\82ð
\82·
\82é
1172 if ThreadItem.Title = '' then begin
1173 DivideStrLine(ReadList[0], @Res);
1174 sTitle := Res.FTitle;
1176 sTitle := ThreadItem.Title
1178 sTitle := CustomStringReplace(ThreadItem.Title, '
\81\97\81M', ',');
1180 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
1181 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
1182 if GikoSys.Setting.UseSkin then begin
1183 CreateUseSKINHTML(doc, ThreadItem, ReadList);
1184 end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
1185 CreateUseCSSHTML(doc, ThreadItem, ReadList, sTitle);
1187 CreateDefaultHTML(doc, ThreadItem, ReadList, sTitle);
1196 rt := GetTickCount - st;
1198 Writeln(IntToStr(rt) + ' ms');
1202 procedure THTMLCreate.CreateHTML3(var html: TStringList; ThreadItem: TThreadItem; var sTitle: string);
1206 //bufList : TStringList;
1207 ReadList: TStringList;
1208 // SaveList: TStringList;
1209 CSSFileName: string;
1213 boardPlugIn : TBoardPlugIn;
1215 UserOptionalStyle: string;
1220 ResLink : TResLinkRec;
1221 function LoadSkin( fileName: string ): string;
1223 Result := LoadFromSkin( fileName, ThreadItem, ThreadItem.Size );
1225 function ReplaceRes( skin: string ): string;
1227 Result := SkinedRes( skin, @Res, No );
1231 if ThreadItem <> nil then begin
1232 CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
1233 ThreadName := ChangeFileExt(ThreadItem.FileName, '');
1234 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
1235 ResLink.FKey := ThreadName;
1238 //if ThreadItem.IsBoardPlugInAvailable then begin
1239 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
1240 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
1241 //boardPlugIn := ThreadItem.BoardPlugIn;
1242 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
1243 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
1244 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
1246 //
\95¶
\8e\9a\83R
\81[
\83h
\82Í
\83v
\83\89\83O
\83C
\83\93\82É
\94C
\82¹
\82é
1248 tmp := boardPlugIn.GetHeader( DWORD( threadItem ),
1249 '<style type="text/css">body {' + UserOptionalStyle + '}</style>' );
1250 //
\90â
\91Î
\8eQ
\8fÆ
\82©
\82ç
\91\8a\91Î
\8eQ
\8fÆ
\82Ö
1251 if GikoSys.Setting.UseSkin then begin
1252 tmp1 := './' + GikoSys.Setting.CSSFileName;
1253 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1254 tmp1 := CustomStringReplace(tmp1, '\', '/');
1255 tmp := CustomStringReplace(tmp, ExtractFilePath(GikoSys.Setting.CSSFileName), tmp1);
1256 end else if GikoSys.Setting.UseCSS then begin
1257 tmp1 := './' + CSSFileName;
1258 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1259 tmp1 := CustomStringReplace(tmp1, '\', '/');
1260 tmp := CustomStringReplace(tmp, CSSFileName, tmp1);
1264 for i := 0 to threadItem.Count - 1 do begin
1267 Res.FBody := boardPlugIn.GetRes( DWORD( threadItem ), i + 1 );
1268 ConvertResAnchor(@Res);
1269 html.Append( Res.FBody );
1272 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
1273 html.Append( boardPlugIn.GetFooter( DWORD( threadItem ), '<a name="bottom"></a>' ) );
1279 ShortDayNames[1] := '
\93ú'; ShortDayNames[2] := '
\8c\8e';
1280 ShortDayNames[3] := '
\89Î'; ShortDayNames[4] := '
\90\85';
1281 ShortDayNames[5] := '
\96Ø'; ShortDayNames[6] := '
\8bà';
1282 ShortDayNames[7] := '
\93y';
1283 BBSID := ThreadItem.ParentBoard.BBSID;
1284 ReadList := TStringList.Create;
1286 if ThreadItem.IsLogFile then begin
1287 FileName := ThreadItem.GetThreadFileName;
1288 ReadList.LoadFromFile(FileName);
1289 GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG'));
1290 GikoSys.FAbon.Execute(ReadList); //
\82 \82Ú
\81`
\82ñ
\82µ
\82Ä
1291 GikoSys.FSelectResFilter.Execute(ReadList); //
\83\8c\83X
\82Ì
\83t
\83B
\83\8b\83^
\83\8a\83\93\83O
\82ð
\82·
\82é
1292 DivideStrLine(ReadList[0], @Res);
1293 //Res.FTitle := CustomStringReplace(Res.FTitle, '
\81\97\81M', ',');
1294 sTitle := Res.FTitle;
1296 sTitle := CustomStringReplace(ThreadItem.Title, '
\81\97\81M', ',');
1299 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
1300 UserOptionalStyle := GikoSys.SetUserOptionalStyle;
1302 if GikoSys.Setting.UseSkin then begin
1303 //
\83X
\83L
\83\93\8eg
\97p
1304 //
\83X
\83L
\83\93\82Ì
\90Ý
\92è
1306 SkinHeader := LoadSkin( GikoSys.GetSkinHeaderFileName );
1307 if Length( UserOptionalStyle ) > 0 then
1308 SkinHeader := CustomStringReplace( SkinHeader, '</head>',
1309 '<style type="text/css">body {' + UserOptionalStyle + '}</style></head>');
1310 //
\90â
\91Î
\8eQ
\8fÆ
\82©
\82ç
\91\8a\91Î
\8eQ
\8fÆ
\82Ö
1311 tmp1 := './' + GikoSys.Setting.CSSFileName;
1312 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1313 tmp1 := CustomStringReplace(tmp1, '\', '/');
1314 SkinHeader := CustomStringReplace(SkinHeader, ExtractFilePath(GikoSys.Setting.CSSFileName), tmp1);
1315 html.Append( SkinHeader );
1319 SkinRes := LoadSkin( GikoSys.GetSkinResFileName );
1322 html.Append('<a name="top"></a>');
1323 for i := 0 to ReadList.Count - 1 do begin
1324 if (Trim(ReadList[i]) <> '') then begin
1325 No := IntToStr(i + 1);
1327 DivideStrLine(ReadList[i], @Res);
1329 ConvRes(@Res, @ResLink, true);
1330 ConvertResAnchor(@Res);
1333 html.Append( ReplaceRes( SkinRes ) );
1339 html.Append('<a name="bottom"></a>');
1340 //
\83X
\83L
\83\93(
\83t
\83b
\83^)
1342 html.Append( LoadSkin( GikoSys.GetSkinFooterFileName ) );
1345 end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
1347 //CSSFileName := GetAppDir + CSS_FILE_NAME;
1348 html.Append('<html><head>');
1349 html.Append('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
1350 html.Append('<title>' + sTitle + '</title>');
1351 //
\90â
\91Î
\8eQ
\8fÆ
\82©
\82ç
\91\8a\91Î
\8eQ
\8fÆ
\82Ö
1352 tmp1 := './' + CSSFileName;
1353 tmp1 := CustomStringReplace(tmp1, GikoSys.GetConfigDir, '');
1354 tmp1 := CustomStringReplace(tmp1, '\', '/');
1356 html.Append('<link rel="stylesheet" href="'+tmp1+'" type="text/css">');
1357 if Length( UserOptionalStyle ) > 0 then
1358 html.Append('<style type="text/css">body {' + UserOptionalStyle + '}</style>');
1359 html.Append('</head>');
1360 html.Append('<body>');
1361 html.Append('<a name="top"></a>');
1362 html.Append('<div class="title">' + sTitle + '</div>');
1363 for i := 0 to ReadList.Count - 1 do begin
1364 if (Trim(ReadList[i]) <> '') then begin
1365 No := IntToStr(i + 1);
1366 DivideStrLine(ReadList[i], @Res);
1368 ConvRes(@Res, @ResLink, true);
1369 ConvertResAnchor(@Res);
1370 if Res.FMailTo = '' then
1371 html.Append('<a name="' + No + '"></a>'
1372 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span> '
1373 + '<span class="name_label">
\96¼
\91O
\81F</span> '
1374 + '<span class="name"><b>' + Res.FName + '</b></span> '
1375 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span> '
1376 + '<span class="date">' + Res.FDateTime+ '</span></div>'
1377 + '<div class="mes">' + Res.FBody + ' </div>')
1378 else if GikoSys.Setting.ShowMail then
1379 html.Append('<a name="' + No + '"></a>'
1380 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span>'
1381 + '<span class="name_label">
\96¼
\91O
\81F </span>'
1382 + '<a class="name_mail" href="mailto:' + Res.FMailTo + '">'
1383 + '<b>' + Res.FName + '</b></a><span class="mail"> [' + Res.FMailTo + ']</span>'
1384 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span>'
1385 + '<span class="date"> ' + Res.FDateTime+ '</span></div>'
1386 + '<div class="mes">' + Res.FBody + ' </div>')
1388 html.Append('<a name="' + No + '"></a>'
1389 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + No + '</a></span>'
1390 + '<span class="name_label">
\96¼
\91O
\81F </span>'
1391 + '<a class="name_mail" href="mailto:' + Res.FMailTo + '">'
1392 + '<b>' + Res.FName + '</b></a>'
1393 + '<span class="date_label">
\93\8a\8de
\93ú
\81F</span>'
1394 + '<span class="date"> ' + Res.FDateTime+ '</span></div>'
1395 + '<div class="mes">' + Res.FBody + ' </div>');
1398 html.Append('<a name="bottom"></a>');
1399 html.Append('<a name="last"></a>');
1400 html.Append('</body></html>');
1403 html.Append('<html><head>');
1404 html.Append('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
1405 html.Append('<title>' + sTitle + '</title></head>');
1406 html.Append('<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">');
1407 html.Append('<a name="top"></a>');
1408 html.Append('<font size=+1 color="#FF0000">' + sTitle + '</font>');
1409 html.Append('<dl>');
1410 for i := 0 to ReadList.Count - 1 do begin
1411 if (Trim(ReadList[i]) <> '') then begin
1412 No := IntToStr(i + 1);
1413 DivideStrLine(ReadList[i], @Res);
1415 ConvRes(@Res, @ResLink, true);
1416 ConvertResAnchor(@Res);
1417 if Res.FMailTo = '' then
1418 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>')
1419 else if GikoSys.Setting.ShowMail then
1420 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>')
1422 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>');
1425 html.Append('</dl>');
1426 html.Append('<a name="bottom"></a>');
1427 html.Append('</body></html>');
1439 procedure THTMLCreate.SetResPopupText(Hint : TResPopup; threadItem: TThreadItem; StNum, ToNum: Integer; Title, First: Boolean);
1451 boardPlugIn : TBoardPlugIn;
1454 if StNum > ToNum then begin
1460 //
\8dÅ
\91å10
\83\8c\83X
\82Ü
\82Å
\95\
\8e¦
1461 if StNum + MAX_POPUP_RES < ToNum then
1462 ToNum := StNum + MAX_POPUP_RES;
1464 //
\83^
\83C
\83g
\83\8b\95\
\8e¦
1466 if ThreadItem <> nil then
1467 Hint.Title := ThreadItem.Title;
1469 if ThreadItem <> nil then begin
1470 //if ThreadItem.IsBoardPlugInAvailable then begin
1471 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
1472 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
1473 //boardPlugIn := ThreadItem.BoardPlugIn;
1474 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
1476 //
\83t
\83H
\83\93\83g
\82â
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
1477 //
\95¶
\8e\9a\83R
\81[
\83h
\82Í
\83v
\83\89\83O
\83C
\83\93\82É
\94C
\82¹
\82é
1478 for i := StNum to ToNum do begin
1480 //
\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½
1481 tmp := boardPlugIn.GetDat( DWORD( threadItem ), i );
1482 if (tmp <> '') And ( not GikoSys.FAbon.CheckAbonPopupRes(tmp) And( not GikoSys.FAbon.CheckIndividualAbonList(line))) then begin
1483 DivideStrLine(tmp, @Res);
1484 if (GikoSys.Setting.ShowMail = false) or (Length(res.FMailTo) = 0) then
1485 Header := IntToStr(Line) + '
\96¼
\91O
\81F ' + Res.FName + '
\93\8a\8de
\93ú
\81F ' + Res.FDateTime
1487 Header := IntToStr(Line) + '
\96¼
\91O
\81F ' + Res.FName + ' [' + res.FMailTo + ']
\93\8a\8de
\93ú
\81F ' + Res.FDateTime;
1488 Header := DeleteFontTag(Header);
1489 Header := CustomStringReplace(Header, '<br>', '',true);
1491 Body := CustomStringReplace(Res.FBody, '<br> ', #10,true);
1492 Body := CustomStringReplace(Body, '<br>', #10,true);
1493 Body := CustomStringReplace(Body, '</a>', '',true);
1494 Body := THTMLCreate.DeleteLink(Body);
1495 Body := CustomStringReplace(Body, '<', '<');
1496 Body := CustomStringReplace(Body, '>', '>');
1497 Body := CustomStringReplace(Body, '"', '"');
1498 Body := CustomStringReplace(Body, '&', '&');
1499 Body := CustomStringReplace(Body, ' ', ' ');
1501 Hint.Add(Header, Body);
1505 for i := StNum to ToNum do begin
1507 FileName := ThreadItem.FilePath;
1508 tmp := GikoSys.ReadThreadFile(FileName, Line);
1509 if (tmp <> '') And ( not GikoSys.FAbon.CheckAbonPopupRes(tmp) And( not GikoSys.FAbon.CheckIndividualAbonList(line))) then begin
1510 DivideStrLine(tmp, @Res);
1511 if (GikoSys.Setting.ShowMail = false) or (Length(res.FMailTo) = 0) then
1512 Header := IntToStr(Line) + '
\96¼
\91O
\81F ' + Res.FName + '
\93\8a\8de
\93ú
\81F ' + Res.FDateTime
1514 Header := IntToStr(Line) + '
\96¼
\91O
\81F ' + Res.FName + ' [' + res.FMailTo + ']
\93\8a\8de
\93ú
\81F ' + Res.FDateTime;
1516 Body := DeleteFontTag(Res.FBody);
1517 Body := CustomStringReplace(Body, '<br> ', #10,true);
1518 Body := CustomStringReplace(Body, '<br>', #10,true);
1519 Body := CustomStringReplace(Body, '</a>', '',true);
1520 Body := THTMLCreate.DeleteLink(Body);
1521 Body := CustomStringReplace(Body, '<', '<');
1522 Body := CustomStringReplace(Body, '>', '>');
1523 Body := CustomStringReplace(Body, '"', '"');
1524 Body := CustomStringReplace(Body, '&', '&');
1525 Body := CustomStringReplace(Body, ' ', ' ');
1526 Hint.Add(Header, Body);
1535 //
\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é
1536 class function THTMLCreate.GetRespopupURL(AText, AThreadURL : string): string;
1541 if Pos('about:blank..', AText) = 1 then begin
1542 wkInt := LastDelimiter( '/', AThreadURL );
1543 if Pos( '?', Copy( AThreadURL, wkInt, MaxInt ) ) = 0 then begin
1544 // Thread.URL
\82Í PATH_INFO
\93n
\82µ
1545 Result := Copy( AThreadURL, 1, LastDelimiter( '/', AThreadURL ) );
1546 wkInt := LastDelimiter( '/', AText );
1547 if Pos( '?', Copy( AText, wkInt, MaxInt ) ) = 0 then
1548 // Text
\82à PATH_INFO
\93n
\82µ
1549 Result := Result + Copy( AText, LastDelimiter( '/', AText ) + 1, MaxInt )
1551 // Text
\82Í QUERY_STRING
\93n
\82µ
1552 Result := Result + Copy( AText, LastDelimiter( '?', AText ) + 1, MaxInt );
1554 // Thread.URL
\82Í QUERY_STRING
\93n
\82µ
1555 Result := Copy( AThreadURL, 1, LastDelimiter( '?', AThreadURL ) );
1556 wkInt := LastDelimiter( '/', AText );
1557 if Pos( '?', Copy( AText, wkInt, MaxInt ) ) = 0 then begin
1558 // Text
\82Í PATH_INFO
\93n
\82µ
1559 // URL
\82É
\94Â
\82Æ
\83L
\81[
\82ª
\91«
\82ç
\82È
\82¢
\82Ì
\82Å Text
\82©
\82ç
\92¸
\91Õ
\82·
\82é
1560 wkInt := LastDelimiter( '/', Copy( AText, 1, wkInt - 1 ) );
1561 wkInt := LastDelimiter( '/', Copy( AText, 1, wkInt - 1 ) );
1562 Result := Copy( Result, 1, Length( Result ) - 1 ) + Copy( AText, wkInt, MaxInt );
1564 // Text
\82à QUERY_STRING
\93n
\82µ
1565 Result := Result + Copy( AText, LastDelimiter( '?', AText ) + 1, MaxInt )
1568 end else if Pos('about:blank/bbs/', AText) = 1 then begin
1569 //
\82µ
\82½
\82ç
\82ÎJBBS
\82Ì
\8ed
\95Ï
\82Ì
\8bz
\8eû
1570 AText := CustomStringReplace(AText, 'about:blank/bbs/', 'about:blank../../bbs/');
1571 Result := GetRespopupURL(AText, AThreadURL);
1577 //
\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é
1578 class procedure THTMLCreate.SkinorCSSFilesCopy(path: string);
1580 tmp, tmpD, tmpF: string;
1586 if GikoSys.Setting.UseSkin then begin
1587 current := ExtractFilePath(GikoSys.GetSkinDir);
1588 tmp := GikoSys.Setting.CSSFileName;
1589 end else if GikoSys.Setting.UseCSS then begin
1590 current := ExtractFilePath(GikoSys.GetStyleSheetDir);
1591 tmp := ExtractFilePath(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName);
1593 dirs := TStringList.Create;
1596 if tmp <> current then begin
1597 GikoSys.GetDirectoryList(current, '*.*', dirs, true);
1598 for i := 0 to dirs.Count - 1 do begin
1599 files := TStringList.Create;
1602 gikoSys.GetFileList(dirs[i], '*.*', files, true);
1604 tmpD := CustomStringReplace(dirs[i], GikoSys.GetConfigDir, path);
1605 if (AnsiPos(dirs[i], tmp) <> 0) and not (DirectoryExists(tmpD)) then
1606 ForceDirectories(tmpD);
1608 if(dirs[i] = tmp) and (dirs[i] <> current) then begin
1609 for j := 0 to files.Count - 1 do begin
1610 tmpF := CustomStringReplace(files[j], GikoSys.GetConfigDir, path);
1611 if not FileExists(tmpF) then begin
1612 CopyFile(PChar(files[j]), PChar(tmpF),True);
1621 tmpD := CustomStringReplace(dirs[0], GikoSys.GetConfigDir, path);
1622 if not DirectoryExists(tmpD) then
1623 ForceDirectories(tmpD);
1624 tmpF := CustomStringReplace(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName
1625 , GikoSys.GetConfigDir, path);
1626 if not FileExists(tmpF) then begin
1627 CopyFile(PChar(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName)
1628 , PChar(tmpF), True);
1635 \brief dat
\83t
\83@
\83C
\83\8b\82Ì
\88ê
\83\89\83C
\83\93\82ð
\95ª
\89ð
1636 \param Line dat
\83t
\83@
\83C
\83\8b\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1637 \return
\83\8c\83X
\8fî
\95ñ
1639 class procedure THTMLCreate.DivideStrLine(Line: string; PRes: PResRec);
1648 PRes.FType := glt2chNew;
1651 pse := pss + Length(Line);
1652 pds := PChar(delimiter);
1653 pde := pds + Length(delimiter);
1655 ppos := AnsiStrPosEx(pss, pse, pds, pde);
1656 if (ppos = nil) then begin
1657 Line := CustomStringReplace(Line, '<>', '<>');
1658 Line := CustomStringReplace(Line, ',', '<>');
1659 Line := CustomStringReplace(Line, '
\81\97\81M', ',');
1661 //Trim
\82µ
\82Ä
\82Í
\82¢
\82¯
\82È
\82¢
\8bC
\82ª
\82·
\82é
\81@by
\82à
\82¶
\82ã
1662 PRes.FName := RemoveToken(Line, delimiter);
1663 PRes.FMailTo := RemoveToken(Line, delimiter);
1664 PRes.FDateTime := RemoveToken(Line, delimiter);
1665 PRes.FBody := RemoveToken(Line, delimiter);
1666 //
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é
\82Æ
\82©
\82¾
\82Æ
\81A
\96{
\95¶
\82Ì
\90æ
\93ª
\82É
\82P
\82Â
\94¼
\8ap
\8bó
\94\92\82ª
\93ü
\82Á
\82Ä
\82¢
\82é
\82Ì
\82Å
\8dí
\8f\9c\82·
\82é
1667 //
\91¼
\82Ì
\8cf
\8e¦
\94Â
\82Å
\81A
\83\8c\83X
\8e©
\91Ì
\82Ì
\8bó
\94\92\82©
\82à
\82µ
\82ê
\82È
\82¢
\82¯
\82Ç
\82»
\82ê
\82Í
\92ú
\82ß
\82é
1668 PRes.FBody := TrimLeft(PRes.FBody);
1669 //
\8bó
\82¾
\82Æ
\96â
\91è
\82ª
\8bN
\82«
\82é
\82©
\82ç
\81A
\8bó
\94\92\82ð
\90Ý
\92è
\82·
\82é
1670 if PRes.FBody = '' then
1671 PRes.FBody := ' ';
1673 PRes.FTitle := RemoveToken(Line, delimiter);
1677 \brief HTML
\82©
\82ç
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\8dí
\8f\9c
1678 \param s
\8c³
\82É
\82È
\82é HTML
1679 \return
\83A
\83\93\83J
\81[
\83^
\83O
\82ª
\8dí
\8f\9c\82³
\82ê
\82½ HTML
1681 class function THTMLCreate.DeleteLink(const s: string): string;
1691 s1 := GikoSys.GetTokenIndex(s, '<a href="', i);
1692 s2 := GikoSys.GetTokenIndex(s, '<a href="', i + 1);
1694 idx := Pos('">', s1);
1696 Delete(s1, 1, idx + 1);
1697 idx := Pos('">', s2);
1699 Delete(s2, 1, idx + 1);
1701 Result := Result + s1 + s2;
1713 HTMLCreater := THTMLCreate.Create;
1716 if HTMLCreater <> nil then begin