X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=HTMLCreate.pas;h=baf9a40c430664789b56e9a8b55f28dfbfd289e2;hb=refs%2Fheads%2FBb52;hp=82707a9ac0877d9f885f0d83bcda8056b2659337;hpb=0d66593c54e44c46e246478a99eb7f3a46f60ded;p=gikonavigoeson%2Fgikonavi.git diff --git a/HTMLCreate.pas b/HTMLCreate.pas index 82707a9..baf9a40 100644 --- a/HTMLCreate.pas +++ b/HTMLCreate.pas @@ -15,9 +15,32 @@ uses {HttpApp,} YofUtils, {URLMon,} BoardGroup, {gzip,} {Dolib,} {bmRegExp,} AbonUnit, MojuUtils, Setting, ExternalBoardManager, ExternalBoardPlugInMain{,} - {Sort,} ,GikoBayesian; + {Sort,} ,GikoBayesian, HintWindow, ActiveX; type + + PResLinkRec = ^TResLinkRec; + TResLinkRec = record + FBbs: string; + FKey : string; + end; + + TBufferedWebBrowser = class(TStringList) + private + //! ‘‚«ž‚Þƒuƒ‰ƒEƒU + FBrowser: TWebBrowser; + //! ‰½s‚Ü‚Å‚½‚ß‚é‚©‚̃TƒCƒY + FBuffSize: Integer; + //! ƒuƒ‰ƒEƒU‚ÌIHTMLDocument2ƒCƒ“ƒ^ƒtƒF[ƒX‚ð•ÛŽ‚·‚é open‚©‚çclose‚ÌŠÔ‚Å + FBrowserDoc: Variant; + public + constructor Create(Browser: TWebBrowser; BuffSize: Integer); + destructor Destory; + procedure Open; + procedure Close; + procedure Flush; + function Add(const S: string): Integer; override; + end; THTMLCreate = class(TObject) private { Private éŒ¾ } @@ -31,20 +54,34 @@ type constructor Create; function AddBeProfileLink(AID : string; ANum: Integer):string ; - procedure CreateUsePluginHTML(doc: Variant; ThreadItem: TThreadItem; var sTitle: string); - procedure CreateUseSKINHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList); - procedure CreateUseCSSHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string ); - procedure CreateDefaultHTML (doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string ); - function ConvertResAnchor(res: string): string; + procedure CreateUsePluginHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; var sTitle: string); + procedure CreateUseSKINHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList); + procedure CreateUseCSSHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string ); + procedure CreateDefaultHTML (html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string ); + procedure ConvertResAnchor(PRes: PResRec); + procedure separateNumber(var st: String; var et: String; const Text, Separator: String); + function checkComma(const s : String; var j : Integer; var No : String) : boolean; + function addResAnchor(PAddRes: PResRec; PResLink : PResLinkRec; dat : boolean; + var s : String; j : Integer; const No: String) : string; public { Public éŒ¾ } - function AddAnchorTag(s: string): string; + procedure AddAnchorTag(PRes: PResRec); function LoadFromSkin(fileName: string; ThreadItem: TThreadItem; SizeByte: Integer): string; - function SkinedRes(skin: string; Res: TResRec; No: string): string; + function SkinedRes(const skin: string; PRes: PResRec; const No: string): string; + procedure ConvRes( PRes : PResRec; PResLink : PResLinkRec; DatToHTML: boolean = false); overload; function ConvRes(const Body, Bbs, Key, ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string; DatToHTML: boolean = false): string; overload; - function ConvRes(const Body, Bbs, Key, ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue, FullURL : string): string; overload; - procedure CreateHTML2(doc: Variant; ThreadItem: TThreadItem; var sTitle: string); + procedure CreateHTML2(Browser: TWebBrowser; ThreadItem: TThreadItem; var sTitle: string); procedure CreateHTML3(var html: TStringList; ThreadItem: TThreadItem; var sTitle: string); + //ƒŒƒXƒ|ƒbƒvƒAƒbƒv‚̍쐬 + procedure SetResPopupText(Hint :TResPopup; threadItem: TThreadItem; StNum, ToNum: Integer; Title, First: Boolean); + //ƒŠƒ“ƒN‚Ì•¶Žš—ñ‚©‚烌ƒXƒ|ƒbƒvƒAƒbƒv—p‚ÌURL‚É•ÏŠ·‚·‚é + class function GetRespopupURL(AText, AThreadURL : string): string; + //Žw’肵‚½ƒpƒX‚ɃXƒLƒ“‚à‚µ‚­‚ÍCSS‚̃tƒ@ƒCƒ‹‚̃Rƒs[‚ðì‚é + class procedure SkinorCSSFilesCopy(path: string); + //dat‚Ps‚ðƒŒƒX‚É•ª‰ð‚·‚é + class procedure DivideStrLine(Line: string; PRes: PResRec); + //HTML‚©‚烊ƒ“ƒNƒ^ƒO‚ðíœ‚·‚é + class function DeleteLink(const s: string): string; end; var @@ -120,23 +157,25 @@ begin //----- ‚Æ‚è‚ ‚¦‚¸‚©‚¿‚ã`‚µ‚áŒÝŠ·—pBƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚à‚悵 // ‚â‚è‚©‚½‚ª‹ê‚µ‚¢‚¯‚ǁAƒIƒvƒVƒ‡ƒ“ƒ_ƒCƒAƒƒO‚̃vƒŒƒrƒ…[—p try - try - if ThreadItem.ParentBoard <> nil then - if ThreadItem.ParentBoard.ParentCategory <> nil then - CustomStringReplace( Skin, '&BBSNAME', ThreadItem.ParentBoard.ParentCategory.ParenTBBS.Title); - CustomStringReplace( Skin, '&THREADURL', ThreadItem.URL); - except end; - CustomStringReplace( Skin, '&BOARDNAME', ThreadItem.ParentBoard.Title); - CustomStringReplace( Skin, '&BOARDURL', ThreadItem.ParentBoard.URL); - CustomStringReplace( Skin, '&THREADNAME', ThreadItem.Title); - CustomStringReplace( Skin, '&SKINPATH', GikoSys.Setting.CSSFileName); - CustomStringReplace( Skin, '&GETRESCOUNT', IntToStr( ThreadItem.NewReceive - 1 )); - CustomStringReplace( Skin, '&NEWRESCOUNT', IntToStr( ThreadItem.NewResCount )); - CustomStringReplace( Skin, '&ALLRESCOUNT', IntToStr( ThreadItem.AllResCount )); - - CustomStringReplace( Skin, '&NEWDATE', FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate)); - CustomStringReplace( Skin, '&SIZEKB', IntToStr( Floor( SizeByte / 1024 ) )); - CustomStringReplace( Skin, '&SIZE', IntToStr( SizeByte )); + if GikoSys.Setting.UseKatjushaType then begin + try + if ThreadItem.ParentBoard <> nil then + if ThreadItem.ParentBoard.ParentCategory <> nil then + CustomStringReplace( Skin, '&BBSNAME', ThreadItem.ParentBoard.ParentCategory.ParenTBBS.Title); + CustomStringReplace( Skin, '&THREADURL', ThreadItem.URL); + except end; + CustomStringReplace( Skin, '&BOARDNAME', ThreadItem.ParentBoard.Title); + CustomStringReplace( Skin, '&BOARDURL', ThreadItem.ParentBoard.URL); + CustomStringReplace( Skin, '&THREADNAME', ThreadItem.Title); + CustomStringReplace( Skin, '&SKINPATH', GikoSys.Setting.CSSFileName); + CustomStringReplace( Skin, '&GETRESCOUNT', IntToStr( ThreadItem.NewReceive - 1 )); + CustomStringReplace( Skin, '&NEWRESCOUNT', IntToStr( ThreadItem.NewResCount )); + CustomStringReplace( Skin, '&ALLRESCOUNT', IntToStr( ThreadItem.AllResCount )); + + CustomStringReplace( Skin, '&NEWDATE', FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate)); + CustomStringReplace( Skin, '&SIZEKB', IntToStr( Floor( SizeByte / 1024 ) )); + CustomStringReplace( Skin, '&SIZE', IntToStr( SizeByte )); + end //----- ‚±‚±‚Ü‚Å end; Result := Skin.Text; @@ -147,56 +186,70 @@ end; // ƒŒƒX‚Ì’l‚ð’uŠ·‚·‚é function THTMLCreate.SkinedRes( - skin: string; - Res: TResRec; - No: string + const skin: string; + PRes: PResRec; + const No: string ): string; +const + FORMT_NAME = '%s'; + FORMT_NUM = '%s'; + FORMT_MAILNAME = '%s'; var spamminess : Extended; +{$IFDEF SPAM_FILTER_ENABLED} wordCount : TWordCount; +{$ENDIF} begin - +{$IFDEF SPAM_FILTER_ENABLED} wordCount := TWordCount.Create; try spamminess := Floor( GikoSys.SpamParse( Res.FName + '<>' + Res.FMailTo + '<>' + Res.FBody, wordCount ) * 100 ); - - Skin := CustomStringReplace( Skin, '', - '' + No + ''); - Skin := CustomStringReplace( Skin, '', No); - Skin := CustomStringReplace( Skin, '', '' + Res.FName + ''); - Skin := CustomStringReplace( Skin, '', - '' + Res.FName + ''); - Skin := CustomStringReplace( Skin, '', Res.FMailTo); - Skin := CustomStringReplace( Skin, '', Res.FDateTime); - Skin := CustomStringReplace( Skin, '', Res.FBody); - Skin := CustomStringReplace( Skin, '', FloatToStr( spamminess ) ); - Skin := CustomStringReplace( Skin, '', FloatToStr( 100 - spamminess ) ); +{$ELSE} + spamminess := 0; +{$ENDIF} + Result := CustomStringReplace( skin, '', FloatToStr( spamminess ) ); + Result := CustomStringReplace( Result, '', FloatToStr( 100 - spamminess ) ); + Result := CustomStringReplace( Result, '', PRes.FMailTo); + Result := CustomStringReplace( Result, '', PRes.FDateTime); + Result := CustomStringReplace( Result, '', No); + Result := CustomStringReplace( Result, '', + Format(FORMT_NAME, [PRes.FName])); + Result := CustomStringReplace( Result, '', + Format(FORMT_NUM, [No, No, No])); + Result := CustomStringReplace( Result, '', + Format(FORMT_MAILNAME,[PRes.FMailTo, PRes.FName])); + Result := CustomStringReplace( Result, '', PRes.FBody); //----- ‚©‚¿‚ã`‚µ‚áŒÝŠ·—pBƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚à‚悵 - Skin := CustomStringReplace( Skin, '&NUMBER', - '' + No + ''); - Skin := CustomStringReplace( Skin, '&PLAINNUMBER', No); - Skin := CustomStringReplace( Skin, '&NAME', '' + Res.FName + ''); - Skin := CustomStringReplace( Skin, '&MAILNAME', - '' + Res.FName + ''); - Skin := CustomStringReplace( Skin, '&MAIL', Res.FMailTo); - Skin := CustomStringReplace( Skin, '&DATE', Res.FDateTime); - Skin := CustomStringReplace( Skin, '&MESSAGE', Res.FBody); - Skin := CustomStringReplace( Skin, '&SPAMMINESS', FloatToStr( spamminess ) ); - Skin := CustomStringReplace( Skin, '&NONSPAMMINESS', FloatToStr( 100 - spamminess ) ); + if GikoSys.Setting.UseKatjushaType then begin + Result := CustomStringReplace( Result, '&NUMBER', + '' + No + ''); + Result := CustomStringReplace( Result, '&PLAINNUMBER', No); + Result := CustomStringReplace( Result, '&NAME', '' + PRes.FName + ''); + Result := CustomStringReplace( Result, '&MAILNAME', + '' + PRes.FName + ''); + Result := CustomStringReplace( Result, '&MAIL', PRes.FMailTo); + Result := CustomStringReplace( Result, '&DATE', PRes.FDateTime); + Result := CustomStringReplace( Result, '&MESSAGE', PRes.FBody); + Result := CustomStringReplace( Result, '&SPAMMINESS', FloatToStr( spamminess ) ); + Result := CustomStringReplace( Result, '&NONSPAMMINESS', FloatToStr( 100 - spamminess ) ); + end; //----- ‚±‚±‚Ü‚Å - - Result := Skin; +{$IFDEF SPAM_FILTER_ENABLED} finally wordCount.Free; end; +{$ENDIF} end; (************************************************************************* *http://‚Ì•¶Žš—ñ‚ðanchorƒ^ƒO•t‚«‚É‚·‚éB *************************************************************************) -function THTMLCreate.AddAnchorTag(s: string): string; +procedure THTMLCreate.AddAnchorTag(PRes: PResRec); +const + _HEAD : array[0..9] of String = + ('', 'h', 'ht', '', 'htt', '', 'http://', '', '', ''); var url: string; href: string; @@ -205,10 +258,14 @@ var idx, idx2: Integer; pos : PChar; pp, pe : PChar; + s : String; + len : Integer; begin - Result := ''; + s := PRes.FBody; + PRes.FBody := ''; - while True do begin + //while True do begin + repeat idx := MaxInt; idx2 := MaxInt; pp := PChar(s); @@ -225,63 +282,62 @@ begin if idx = MaxInt then begin //ƒŠƒ“ƒN‚ª–³‚¢‚æB - Result := Result + s; - Break; - end; - - if (idx > 1) and (idx > anchorLen) and - (AnsiStrPosEx(pp + idx - 1 - anchorLen, pp + idx, pANCHORs, pANCHORe) <> nil) then begin - //Šù‚ɃŠƒ“ƒNƒ^ƒO‚ª‚‚¢‚Ä‚¢‚é‚Á‚Û‚¢‚Æ‚«‚̓€ƒV - //‚ð’T‚·A¬•¶Žš‚ÅŒ©‚‚©‚ç‚È‚¯‚ê‚Α啶Žš‚ÅŒŸõ - pos := AnsiStrPosEx(pp + idx, pe, pCTAGLs, pCTAGLe); - if pos = nil then - pos := AnsiStrPosEx(pp + idx, pe, pCTAGUs, pCTAGUe); - if pos = nil then - b := Length(REF_MARK[idx2]) - else - b := pos - pp + 1; - - Result := Result + Copy(s, 1, idx + b); - Delete(s, 1, idx + b); - Continue; - end; - - Result := Result + Copy(s, 1, idx - 1); - Delete(s, 1, idx - 1); - b := Length( s ) + 1; - pp := PChar(s); - for i := 1 to b do begin - pe := AnsiStrPosEx(pURLCHARs, pURLCHARe, pp, pp + 1); - - if pe = nil then begin - //URL‚¶‚á‚È‚¢•¶Žš”­Œ©I‚Æ‚©A•¶Žš‚ª‚È‚­‚È‚Á‚½B - url := Copy(s, 1, i - 1); - case idx2 of - 1 : href := 'h' + url; - 2 : href := 'ht' + url; - 4 : href := 'htt' + url; - 6 : href := 'http://' + url; + len := Length(PRes.FBody); + SetLength(PRes.FBody, Length(s) + len); + Move(pp^, PRes.FBody[len + 1], Length(s)); + end else begin + if (idx > anchorLen) and + (AnsiStrPosEx(pp + idx - 1 - anchorLen, pp + idx, pANCHORs, pANCHORe) <> nil) then begin + //Šù‚ɃŠƒ“ƒNƒ^ƒO‚ª‚‚¢‚Ä‚¢‚é‚Á‚Û‚¢‚Æ‚«‚̓€ƒV + //‚ð’T‚·A¬•¶Žš‚ÅŒ©‚‚©‚ç‚È‚¯‚ê‚Α啶Žš‚ÅŒŸõ + pos := AnsiStrPosEx(pp + idx, pe, pCTAGLs, pCTAGLe); + if pos = nil then + pos := AnsiStrPosEx(pp + idx, pe, pCTAGUs, pCTAGUe); + if pos = nil then + b := Length(REF_MARK[idx2]) else - href := url; + b := pos - (pp + idx) + 1; + + len := Length(PRes.FBody); + SetLength(PRes.FBody, len + idx + b ); + Move(pp^, PRes.FBody[len + 1], idx + b); + Delete(s, 1, idx + b); + end else begin + pp := PChar(s); + len := Length(PRes.FBody); + SetLength(PRes.FBody, len + idx - 1); + Move(pp^, PRes.FBody[len + 1], idx - 1); + + Delete(s, 1, idx - 1); + b := Length( s ) + 1; + pp := PChar(s); + for i := 1 to b do begin + //‚PƒoƒCƒg•¶Žš‚ÅURL‚ÉŽg‚¦‚È‚¢•¶Žš‚È‚ç + if (AnsiStrPosEx(pURLCHARs, pURLCHARe, pp, pp + 1) = nil) then begin + url := Copy(s, 1, i - 1); + Delete(s, 1, i - 1); + href := Format('%s%s', [_HEAD[idx2], url]); + PRes.FBody + := Format('%s%s', [PRes.FBody, href, url]); + Break; + end; + //ˆê•¶Žši‚ß‚éB + Inc(pp); end; - - Result := Result + '' + url + ''; - Delete(s, 1, i - 1); - Break; end; - //ˆê•¶Žši‚ß‚éB - Inc(pp); end; - end; + until idx = MaxInt; end; //ˆø”AAIDF‘ΏۂƂȂé“ú•tID•¶Žš—ñAANum:ƒŒƒX”Ô AURLF‚»‚̃XƒŒƒbƒh‚ÌURL function THTMLCreate.AddBeProfileLink(AID : string; ANum: Integer):string ; +const + BE_MARK : string = 'BE:'; var p : integer; BNum, BMark : string; begin - p := AnsiPos('BE:', AnsiUpperCase(AID)); + p := AnsiPos(BE_MARK, AnsiUpperCase(AID)); if p > 0 then begin BNum := Copy(AID, p, Length(AID)); AID := Copy(AID, 1, p - 1); @@ -296,393 +352,398 @@ begin end else Result := AID; end; -(************************************************************************* - * - * from HotZonu - *************************************************************************) -function THTMLCreate.ConvRes(const Body, Bbs, Key, - ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string; - DatToHTML: boolean = false): string; -type - PIndex = ^TIndex; - TIndex = record - FIndexFrom : integer; - FIndexTo : integer; - FNo : string; +procedure THTMLCreate.separateNumber(var st: String; var et: String; const Text:String; const Separator: String); +var + p : Integer; +begin + p := Pos(Separator,Text); + if (p > 0 ) then begin + st := Copy(Text, 1, p - 1); + et := Copy(Text, p + Length(Separator), Length(Text)); + end else begin + st := Text; + et := Text; end; +end; +procedure THTMLCreate.ConvRes( PRes : PResRec; PResLink : PResLinkRec; DatToHTML: boolean = false); const GT = '>'; - SN = '0123456789-'; - ZN = '‚O‚P‚Q‚R‚S‚T‚U‚V‚W‚X|'; + SN = '0123456789'; + //ŒŸõ‘Ώۂ̕¶Žš—ñŒS + TOKEN : array[0..5] of string = (GT+GT, GT, '„„', '„', ' 0 then begin + No := No + ch; + end else if (ch = '-') then begin + if sw then break; + if No = '' then break; + No := No + ch; + sw := true; + end else begin + break; + end; end; - p := AnsiPos(Separator, S); - if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S; end; + begin - { v1.0 b2 - 03 } - s := Body; - r := Body; - i := 1; - sw := False; - No := ''; - List:= TList.Create; - oc := ''; - sp := 0; - chk := False; - al := False; - while true do begin - b := ByteType(s, i); - case b of - mbSingleByte : begin - if (not sw) and (Copy(s,i,8) = GT + GT) then begin - if (AnsiPos(' 0) then begin - No := No + sx; - end else begin - if (No <> '') and (No <> '-') then begin - Add(sp, i, No); - al := True; - end; - sw := False; - // - i := i - 1; - // - No := ''; - oc:=''; - //chk := False; + //s ‚É–{•¶‚ð‘S•”“ü‚ê‚é + s := PRes.FBody; + //Œ‹‰Ê‚ðƒNƒŠƒA + PRes.FBody := ''; + + // + while Length(s) > 2 do begin + pmin := Length(s) + 1; + i := Length(token); + for j := 0 to 5 do begin + pos := AnsiPos(TOKEN[j], s); + if pos <> 0 then begin + if pos < pmin then begin + //‚Ç‚ê‚Ńqƒbƒg‚µ‚½‚©•Û‘¶ + i := j; + //Å¬’l‚ðXV + pmin := pos; + end; + end; + end; + + //ƒqƒbƒg‚µ‚½•¶Žš—ñ‚̈ê‚ÂŽè‘O‚Ü‚ÅŒ‹‰Ê‚ɃRƒs[ + PRes.FBody := PRes.FBody + Copy(s, 1, pmin - 1); + Delete(s, 1, pmin - 1); + + if i = 6 then begin + //ƒqƒbƒg‚È‚µ + end else if (i = 4) or (i = 5) then begin + //'' or '' ‚܂ŃRƒs[ + pmin := AnsiPos('' , s); + pos := AnsiPos('' , s); + if (pmin <> 0) and (pos <> 0) then begin + if (pmin > pos) then begin + pmin := pos; + end; + end else if (pos <> 0) then begin + pmin := pos; + end; + rink := Copy(s, 1, pmin + 3); + PRes.FBody := PRes.FBody + rink; + Delete(s, 1, pmin + 3); + + pmin := Length(rink); + i := Length(TOKEN); + for j := 0 to 3 do begin + pos := AnsiPos(TOKEN[j], rink); + if pos <> 0 then begin + if pos < pmin then begin + //‚Ç‚ê‚Ńqƒbƒg‚µ‚½‚©•Û‘¶ + i := j; + //Å¬’l‚ðXV + pmin := pos; end; - end else begin - if Copy(s,i,1) = '<' then oc := ''; - oc := oc + Copy(s,i,1); - chk := False; - al := False; end; end; - mbLeadByte : begin - if (not sw) and (Copy(s,i,4) = '„„') then begin - sw := True; - sp := i; - i := i + 3; - chk := True; - end else - if (not sw) and (Copy(s,i,2) = '„') then begin - sw := True; - sp := i; - i := i + 1; - chk := True; - end else - if (sw) then begin - sx := Copy(s,i,2); - if (AnsiPos(sx, ZN) > 0) then begin - No := No + ZenToHan(sx); - end else begin - if (No <> '') and (No <> '-') and (No <> '|') then begin - Add(sp, i, No); - end; - sw := False; - i := i - 1; - No := ''; + // ƒŒƒXƒAƒ“ƒJ[‚ªŠÜ‚Ü‚ê‚Ä‚¢‚½‚ç,‚ª‘±‚­ŒÀ‚èƒAƒ“ƒJ[‚Æ‚µ‚Ĉµ‚¤ + if i <= 3 then begin + No := ''; + j := 1; + len := Length(s); + cm := checkComma(s, j, No); + len := Length(s); + while cm do begin + oc := ''; + No := ''; + sw := false; + db := false; + getNumberString; + //I’[‚܂ōs‚Á‚Ă̏I—¹‚©ƒ`ƒFƒbƒN + if j <= len then begin + if db then j := j - 2 + else j := j - 1; end; - end else begin - oc := ''; - chk := False; + addResAnchor(PRes, PResLink, DatToHTML, s, j, No); + j := 1; + len := Length(s); + cm := checkComma(s, j, No); end; - al := False; end; - end; - inc(i); - if (i > Length(Body)) then begin - if (sw) then begin - if (No <> '') then Add(sp, i, No); + end else begin + //‰½‚©‚µ‚猩‚‚©‚Á‚½ƒpƒ^[ƒ“ + j := Length(TOKEN[i]) + 1; + oc := ''; + No := ''; + sw := false; + db := false; + len := Length(s); + getNumberString; + //I’[‚܂ōs‚Á‚Ă̏I—¹‚©ƒ`ƒFƒbƒN + if j <= len then begin + if db then j := j - 2 + else j := j - 1; end; - Break; + addResAnchor(PRes, PResLink, DatToHTML, s, j, No); end; end; - for i := List.Count - 1 downto 0 do begin - if (AnsiPos('-', PIndex(List[i]).FNo) > 0) then begin - st := ChooseString(PIndex(List[i]).FNo, '-', 0); - et := ChooseString(PIndex(List[i]).FNo, '-', 1); - end else begin - st := PIndex(List[i]).FNo; - et := PIndex(List[i]).FNo; + if Length(s) > 0 then begin + PRes.FBody := PRes.FBody + s; + end; +end; +function THTMLCreate.checkComma( + const s : String; + var j : Integer; + var No : String +) : boolean; +var + bType : TMbcsByteType; +begin + Result := false; + if (Length(s) > 0) then begin + bType := ByteType(s, j); + if ((bType = mbSingleByte) and (s[j] = ',') or + ((bType = mbLeadByte) and (ZenToHan(Copy(s, j ,2)) = ','))) then begin + Result := true; + if (bType = mbSingleByte) then + Inc(j) + else + Inc(j, 2); + No := ''; end; - if not DatToHTML then - r := Copy(r,0, PIndex(List[i]).FIndexFrom - 1) + - Format('', - [ParamBBS, Bbs, ParamKey, Key, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]) + - Copy(r,PIndex(List[i]).FIndexFrom, PIndex(List[i]).FIndexTo - PIndex(List[i]).FIndexFrom) + '' + - Copy(r,PIndex(List[i]).FIndexTo,Length(r)) - else - r := Copy(r,0, PIndex(List[i]).FIndexFrom - 1) + - Format('', [st]) + - Copy(r,PIndex(List[i]).FIndexFrom, PIndex(List[i]).FIndexTo - PIndex(List[i]).FIndexFrom) + '' + - Copy(r,PIndex(List[i]).FIndexTo,Length(r)); - - Dispose(PIndex(List[i])); end; - List.Free; - Result := r; end; +function THTMLCreate.addResAnchor( + PAddRes: PResRec; PResLink : PResLinkRec; dat : boolean; + var s : String; j : Integer; const No: String) : string; +const + FORMAT_LINK = ''; +var + st,et : string; +begin -function THTMLCreate.ConvRes( - const Body, Bbs, Key, ParamBBS, ParamKey, - ParamStart, ParamTo, ParamNoFirst, - ParamTrue, FullURL : string -): string; -type - PIndex = ^TIndex; - TIndex = record - FIndexFrom : integer; - FIndexTo : integer; - FNo : string; + //‰½‚à”Žš‚ªŒ©‚‚©‚ç‚È‚¢‚Æ‚« + if No = '' then begin + PAddRes.FBody := PAddRes.FBody + Copy(s, 1, j - 1); + end else begin + separateNumber(st, et, No, '-'); + + if not dat then begin + PAddRes.FBody := PAddRes.FBody + + Format(FORMAT_LINK, [PResLink.FBbs, PResLink.FKey, st, et]); + end else begin + PAddRes.FBody := PAddRes.FBody + Format('', [st]); + end; + PAddRes.FBody := PAddRes.FBody + Copy(s, 1, j - 1) + ''; end; + Delete(s, 1, j - 1); +end; + +(************************************************************************* + * + * from HotZonu + *************************************************************************) +function THTMLCreate.ConvRes(const Body, Bbs, Key, + ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string; + DatToHTML: boolean = false): string; const GT = '>'; - SN = '0123456789-'; - ZN = '‚O‚P‚Q‚R‚S‚T‚U‚V‚W‚X|'; + SN = '0123456789'; + FORMAT_LINK = ''; + //ŒŸõ‘Ώۂ̕¶Žš—ñŒS + TOKEN : array[0..5] of string = (GT+GT, GT, '„„', '„', '', [st]); + end; + Result := Result + Copy(s, 1, j - 1) + ''; + end; + Delete(s, 1, j - 1); end; - function ChooseString(const Text, Separator: string; Index: integer): string; - var - S : string; - i, p : integer; + + procedure getNumberString; begin - S := Text; - for i := 0 to Index - 1 do begin - if (AnsiPos(Separator, S) = 0) then S := '' - else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S)); + while (j <= len) do begin + if (ByteType(s, j) = mbSingleByte) then begin + //1byte•¶Žš + ch := s[j]; + Inc(j); + db := false; + end else begin + //2byte•¶Žš + ch := ZenToHan(Copy(s, j, 2)); + Inc(j, 2); + db := true; + end; + + if System.Pos(ch, SN) > 0 then begin + No := No + ch; + end else if (ch = '-') then begin + if sw then break; + if No = '' then break; + No := No + ch; + sw := true; + end else begin + break; + end; + end; + end; + + function checkComma : boolean; + begin + j := 1; + len := Length(s); + if ((len > 0) and (s[j] = ',')) or ((len > 1) and (ZenToHan(Copy(s, j ,2)) = ',')) then begin + Result := true; + if (ByteType(s, j) = mbSingleByte) then + Inc(j) + else + Inc(j, 2); + No := ''; + end else begin + Result := false; end; - p := AnsiPos(Separator, S); - if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S; end; begin - { v1.0 b2 - 03 } + //s ‚É–{•¶‚ð‘S•”“ü‚ê‚é s := Body; - r := Body; - i := 1; - sw := False; - No := ''; - List:= TList.Create; - oc := ''; - sp := 0; - chk := False; - al := False; - while true do begin - b := ByteType(s, i); - case b of - mbSingleByte : begin - if (not sw) and (Copy(s,i,8) = GT + GT) then begin - if (AnsiPos(' 0) then begin - No := No + sx; - end else begin - if (No <> '') and (No <> '-') then begin - Add(sp, i, No); - al := True; - end; - sw := False; - // - i := i - 1; - // - No := ''; - oc:=''; - //chk := False; - end; - end else begin - if Copy(s,i,1) = '<' then oc := ''; - oc := oc + Copy(s,i,1); - chk := False; - al := False; + //Œ‹‰Ê‚ðƒNƒŠƒA + Result := ''; + + // + while Length(s) > 2 do begin + pmin := Length(s) + 1; + i := Length(token); + for j := 0 to 5 do begin + pos := AnsiPos(TOKEN[j], s); + if pos <> 0 then begin + if pos < pmin then begin + //‚Ç‚ê‚Ńqƒbƒg‚µ‚½‚©•Û‘¶ + i := j; + //Å¬’l‚ðXV + pmin := pos; end; end; - mbLeadByte : begin - if (not sw) and (Copy(s,i,4) = '„„') then begin - sw := True; - sp := i; - i := i + 3; - chk := True; - end else - if (not sw) and (Copy(s,i,2) = '„') then begin - sw := True; - sp := i; - i := i + 1; - chk := True; - end else - if (sw) then begin - sx := Copy(s,i,2); - if (AnsiPos(sx, ZN) > 0) then begin - No := No + ZenToHan(sx); - end else begin - if (No <> '') and (No <> '-') and (No <> '|') then begin - Add(sp, i, No); - end; - sw := False; - i := i - 1; - No := ''; + end; + + //ƒqƒbƒg‚µ‚½•¶Žš—ñ‚̈ê‚ÂŽè‘O‚Ü‚ÅŒ‹‰Ê‚ɃRƒs[ + Result := Result + Copy(s, 1, pmin - 1); + Delete(s, 1, pmin - 1); + + if i = 6 then begin + //ƒqƒbƒg‚È‚µ + end else if (i = 4) or (i = 5) then begin + //'' or '' ‚܂ŃRƒs[ + pmin := AnsiPos('' , s); + pos := AnsiPos('' , s); + if (pmin <> 0) and (pos <> 0) then begin + if (pmin > pos) then begin + pmin := pos; + end; + end else if (pos <> 0) then begin + pmin := pos; + end; + rink := Copy(s, 1, pmin + 3); + Result := Result + rink; + Delete(s, 1, pmin + 3); + + pmin := Length(rink); + i := Length(TOKEN); + for j := 0 to 3 do begin + pos := AnsiPos(TOKEN[j], rink); + if pos <> 0 then begin + if pos < pmin then begin + //‚Ç‚ê‚Ńqƒbƒg‚µ‚½‚©•Û‘¶ + i := j; + //Å¬’l‚ðXV + pmin := pos; end; - end else begin - oc := ''; - chk := False; end; - al := False; end; - end; - inc(i); - if (i > Length(Body)) then begin - if (sw) then begin - if (No <> '') then Add(sp, i, No); + // ƒŒƒXƒAƒ“ƒJ[‚ªŠÜ‚Ü‚ê‚Ä‚¢‚½‚ç,‚ª‘±‚­ŒÀ‚èƒAƒ“ƒJ[‚Æ‚µ‚Ĉµ‚¤ + if i <= 3 then begin + No := ''; + cm := checkComma; + len := Length(s); + while cm do begin + oc := ''; + No := ''; + sw := false; + db := false; + getNumberString; + Result := addResAnchor(Result); + cm := checkComma; + end; end; - Break; - end; - end; - for i := List.Count - 1 downto 0 do begin - //plName := Copy(PluginName, LastDelimiter('\',PluginName) + 1, Length(PluginName) - LastDelimiter('/',PluginName) -1 ); - if (AnsiPos('-', PIndex(List[i]).FNo) > 0) then begin - st := ChooseString(PIndex(List[i]).FNo, '-', 0); - et := ChooseString(PIndex(List[i]).FNo, '-', 1); end else begin - st := PIndex(List[i]).FNo; - et := PIndex(List[i]).FNo; + //‰½‚©‚µ‚猩‚‚©‚Á‚½ƒpƒ^[ƒ“ + j := Length(TOKEN[i]) + 1; + oc := ''; + No := ''; + sw := false; + db := false; + len := Length(s); + getNumberString; + Result := addResAnchor(Result); end; - r := Copy(r,0, PIndex(List[i]).FIndexFrom - 1) + - Format('', - [FullURL, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]) + - Copy(r,PIndex(List[i]).FIndexFrom, PIndex(List[i]).FIndexTo - PIndex(List[i]).FIndexFrom) + '' + - Copy(r,PIndex(List[i]).FIndexTo,Length(r)); - Dispose(PIndex(List[i])); end; - List.Free; - Result := r; + Result := Result + s; end; -function THTMLCreate.ConvertResAnchor(res: string): string; +procedure THTMLCreate.ConvertResAnchor(PRes: PResRec); const _HEAD : string = ''; @@ -693,15 +754,17 @@ const var i, j, k: Integer; tmp: string; + res: string; begin - Result := ''; + res := PRes.FBody; + PRes.FBody := ''; i := AnsiPos(_HEAD, res); while i <> 0 do begin - Result := Result + Copy(res, 1, i -1); + PRes.FBody := PRes.FBody + Copy(res, 1, i -1); Delete(res, 1, i - 1); j := AnsiPos(_TAIL, res); if j = 0 then begin - Result := Result + res; + PRes.FBody := PRes.FBody + res; Exit; end; tmp := Copy(res, 1, j - 1); @@ -709,11 +772,11 @@ begin if (AnsiPos(_ST, tmp) <> 0) and (AnsiPos(_TO, tmp) <> 0) then begin Delete(tmp, 1, AnsiPos(_ST, tmp) + 3); Delete(tmp, AnsiPos(_TO, tmp), Length(tmp)); - Result := Result + ''; + PRes.FBody := PRes.FBody + ''; end else if (AnsiPos(_STA, tmp) <> 0) and (AnsiPos(_END, tmp) <> 0) then begin Delete(tmp, 1, AnsiPos(_STA, tmp) + 6); Delete(tmp, AnsiPos(_END, tmp), Length(tmp)); - Result := Result + ''; + PRes.FBody := PRes.FBody + ''; end else begin k := LastDelimiter('/', tmp); Delete(tmp, 1, k); @@ -722,237 +785,206 @@ begin else Delete(tmp, AnsiPos('"', tmp), Length(tmp)); - Result := Result + ''; + PRes.FBody := PRes.FBody + ''; end; i := AnsiPos(_HEAD, res); end; - Result := Result + res; + PRes.FBody := PRes.FBody + res; end; //Plugin‚ð—˜—p‚·‚éBoard‚̃XƒŒƒbƒh‚ÌHTML‚ðì¬‚µ‚Ädoc‚ɏ‘‚«ž‚Þ -procedure THTMLCreate.CreateUsePluginHTML(doc: Variant; ThreadItem: TThreadItem; var sTitle: string); +procedure THTMLCreate.CreateUsePluginHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; var sTitle: string); var i: integer; NewReceiveNo: Integer; boardPlugIn : TBoardPlugIn; UserOptionalStyle: string; begin - if ThreadItem <> nil then begin - if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin - //===== ƒvƒ‰ƒOƒCƒ“‚É‚æ‚é•\Ž¦ - boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn; - NewReceiveNo := ThreadItem.NewReceive; - // ƒtƒHƒ“ƒg‚âƒTƒCƒY‚̐ݒè - UserOptionalStyle := GikoSys.SetUserOptionalStyle; - try - doc.open; - // ƒwƒbƒ_ - doc.Write( boardPlugIn.GetHeader( DWORD( threadItem ), - '' ) + #13#10 ); - doc.Write('

' + #13#10 ); - - for i := 0 to threadItem.Count - 1 do begin - // 1 ‚Í•K‚¸•\Ž¦ - if i <> 0 then begin - // •\Ž¦”͈͂ðŒÀ’è - case GikoSys.ResRange of - Ord( grrKoko ): - if ThreadItem.Kokomade > (i + 1) then - Continue; - Ord( grrNew ): - if NewReceiveNo > (i + 1) then - Continue; - 10..65535: - if (threadItem.Count - i) > GikoSys.ResRange then - Continue; - end; - end; - - // V’…ƒ}[ƒN - if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin - try - if GikoSys.Setting.UseSkin then begin - if FileExists( GikoSys.GetSkinNewmarkFileName ) then - doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 ) - else - doc.Write( '
' + #13#10 ); - end else if GikoSys.Setting.UseCSS then begin - doc.Write('
V’…ƒŒƒX ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '
' + #13#10); - end else begin - doc.Write(''); - doc.Write(''); - doc.Write('
V’…ƒŒƒX ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '
'); - doc.Write('
+ #13#10'); - end; - except - doc.Write( '' + #13#10); - end; - end; - - // ƒŒƒX - doc.Write( boardPlugIn.GetRes( DWORD( threadItem ), i + 1 ) + #13#10 ); + //===== ƒvƒ‰ƒOƒCƒ“‚É‚æ‚é•\Ž¦ + boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn; + NewReceiveNo := ThreadItem.NewReceive; + // ƒtƒHƒ“ƒg‚âƒTƒCƒY‚̐ݒè + UserOptionalStyle := GikoSys.SetUserOptionalStyle; + html.add(boardPlugIn.GetHeader( DWORD( threadItem ), + '' )); + html.Add('

'); + html.Flush; + + for i := 0 to threadItem.Count - 1 do begin + // 1 ‚Í•K‚¸•\Ž¦ + if i <> 0 then begin + // •\Ž¦”͈͂ðŒÀ’è + case GikoSys.ResRange of + Ord( grrKoko ): + if ThreadItem.Kokomade > (i + 1) then + Continue; + Ord( grrNew ): + if NewReceiveNo > (i + 1) then + Continue; + 10..65535: + if (threadItem.Count - i) > GikoSys.ResRange then + Continue; + end; + end; - if ThreadItem.Kokomade = (i + 1) then begin - // ‚±‚±‚Ü‚Å“Ç‚ñ‚¾ - try - if GikoSys.Setting.UseSkin then begin - if FileExists( GikoSys.GetSkinBookmarkFileName ) then - doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 ) - else - doc.Write( '' + #13#10 ); - end else if GikoSys.Setting.UseCSS then begin - doc.Write('
ƒRƒR‚Ü‚Å“Ç‚ñ‚¾
' + #13#10 ); - end else begin - doc.Write('
'); - doc.Write('
ƒRƒR‚Ü‚Å“Ç‚ñ‚¾
'); - doc.Write('
' + #13#10 ); - end; - except - doc.Write( '' + #13#10 ); - end; - end; + // V’…ƒ}[ƒN + if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin + try + if GikoSys.Setting.UseSkin then begin + if FileExists( GikoSys.GetSkinNewmarkFileName ) then + html.Add( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size )) + else + html.Add( ''); + end else if GikoSys.Setting.UseCSS then begin + html.Add('
V’…ƒŒƒX ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '
'); + end else begin + html.Add('
'); + html.Add(''); + html.Add('
V’…ƒŒƒX ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '
'); + html.Add('
'); end; + except + html.Add( ''); + end; + end; + // ƒŒƒX + html.Add( boardPlugIn.GetRes( DWORD( threadItem ), i + 1 )); - // ƒXƒLƒ“(ƒtƒbƒ^) - doc.Write( boardPlugIn.GetFooter( DWORD( threadItem ), '' ) + #13#10 ); - finally - doc.Close; + if ThreadItem.Kokomade = (i + 1) then begin + // ‚±‚±‚Ü‚Å“Ç‚ñ‚¾ + try + if GikoSys.Setting.UseSkin then begin + if FileExists( GikoSys.GetSkinBookmarkFileName ) then + html.Add( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size )) + else + html.Add( ''); + end else if GikoSys.Setting.UseCSS then begin + html.Add('
ƒRƒR‚Ü‚Å“Ç‚ñ‚¾
'); + end else begin + html.Add('
'); + html.Add('
ƒRƒR‚Ü‚Å“Ç‚ñ‚¾
'); + html.Add('
'); + end; + except + html.Add(''); end; - end; end; + + + // ƒXƒLƒ“(ƒtƒbƒ^) + html.Add( boardPlugIn.GetFooter( DWORD( threadItem ), '' )); end; -procedure THTMLCreate.CreateUseSKINHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList); +procedure THTMLCreate.CreateUseSKINHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList); +const + KOKO_TAG = ''; + NEW_TAG = ''; var i: integer; - No: string; - CSSFileName: string; NewReceiveNo: Integer; Res: TResRec; UserOptionalStyle: string; SkinHeader: string; SkinNewRes: string; SkinRes: string; - strTmp : string; - function ReplaceRes( skin: string ): string; - begin - Result := SkinedRes( skin, Res, No ); - end; + ThreadName : string; + ResLink :TResLinkRec; begin - if ThreadItem <> nil then begin - // ƒXƒLƒ“Žg—p - if GikoSys.Setting.UseSkin then begin - NewReceiveNo := ThreadItem.NewReceive; - // ƒtƒHƒ“ƒg‚âƒTƒCƒY‚̐ݒè - UserOptionalStyle := GikoSys.SetUserOptionalStyle; - CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName; - doc.open; - try - doc.charset := 'Shift_JIS'; - - // ƒXƒLƒ“‚̐ݒè - try - SkinHeader := LoadFromSkin( GikoSys.GetSkinHeaderFileName, ThreadItem, ThreadItem.Size); - if Length( UserOptionalStyle ) > 0 then - SkinHeader := CustomStringReplace( SkinHeader, '', - ''); - doc.Write( SkinHeader + #13#10); - except - end; - - try - SkinNewRes := LoadFromSkin( GikoSys.GetSkinNewResFileName, ThreadItem, ThreadItem.Size); - except - end; - - try - SkinRes := LoadFromSkin( GikoSys.GetSkinResFileName, ThreadItem, ThreadItem.Size ); - except - end; - - doc.Write('

' + #13#10); - doc.Write('' + #13#10); - - for i := 0 to ReadList.Count - 1 do begin - // 1 ‚Í•K‚¸•\Ž¦ - if i <> 0 then begin - // •\Ž¦”͈͂ðŒÀ’è - case GikoSys.ResRange of - Ord( grrKoko ): - if ThreadItem.Kokomade > (i + 1) then - Continue; - Ord( grrNew ): - if NewReceiveNo > (i + 1) then - Continue; - 10..65535: - if (threadItem.Count - i) > GikoSys.ResRange then - Continue; - end; - end; - - // V’…ƒ}[ƒN - if (NewReceiveNo = i + 1) or ((NewReceiveNo = 0) and (i = 0)) then begin - try - if FileExists( GikoSys.GetSkinNewmarkFileName ) then - doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10) - else - doc.Write( '' + #13#10 ); - except - doc.Write( '' + #13#10 ); - end; - end; + NewReceiveNo := ThreadItem.NewReceive; + // ƒtƒHƒ“ƒg‚âƒTƒCƒY‚̐ݒè + UserOptionalStyle := GikoSys.SetUserOptionalStyle; + ThreadName := ChangeFileExt(ThreadItem.FileName, ''); + ResLink.FBbs := ThreadItem.ParentBoard.BBSID; + ResLink.FKey := ThreadName; + // ƒXƒLƒ“‚̐ݒè + try + SkinHeader := LoadFromSkin( GikoSys.GetSkinHeaderFileName, ThreadItem, ThreadItem.Size); + if Length( UserOptionalStyle ) > 0 then + SkinHeader := CustomStringReplace( SkinHeader, '', + ''); + html.Add( SkinHeader ); + except + end; - if (Trim(ReadList[i]) <> '') then begin - No := IntToStr(i + 1); + SkinNewRes := LoadFromSkin( GikoSys.GetSkinNewResFileName, ThreadItem, ThreadItem.Size); + SkinRes := LoadFromSkin( GikoSys.GetSkinResFileName, ThreadItem, ThreadItem.Size ); + + html.Add('

'#13#10''); + html.Flush; + + for i := 0 to ReadList.Count - 1 do begin + // 1 ‚Í•K‚¸•\Ž¦ + if i <> 0 then begin + // •\Ž¦”͈͂ðŒÀ’è + case GikoSys.ResRange of + Ord( grrKoko ): + if ThreadItem.Kokomade > (i + 1) then + Continue; + Ord( grrNew ): + if NewReceiveNo > (i + 1) then + Continue; + 10..65535: + if (threadItem.Count - i) > GikoSys.ResRange then + Continue; + end; + end; - Res := DivideStrLine(ReadList[i]); - Res.FBody := ConvRes(AddAnchorTag(Res.FBody), ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true'); - Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1); + // V’…ƒ}[ƒN + if (NewReceiveNo = i + 1) or ((NewReceiveNo = 0) and (i = 0)) then begin + if FileExists( GikoSys.GetSkinNewmarkFileName ) then + html.Add( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size )) + else + html.Add( NEW_TAG ); + end; - try - if NewReceiveNo <= (i + 1) then - // V’…ƒŒƒX - strTmp := ReplaceRes( SkinNewRes ) - else - // ’ʏí‚̃ŒƒX - strTmp := ReplaceRes( SkinRes ); - - doc.Write( strTmp + #13#10 ); - except - end; - end; + if (Trim(ReadList[i]) <> '') then begin + DivideStrLine(ReadList[i], @Res); + AddAnchorTag(@Res); + ConvRes(@Res, @ResLink); + Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1); - if ThreadItem.Kokomade = (i + 1) then begin - // ‚±‚±‚Ü‚Å“Ç‚ñ‚¾ - try - if FileExists( GikoSys.GetSkinBookmarkFileName ) then - doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 ) - else - doc.Write( '' + #13#10 ); - except - doc.Write( '' + #13#10 ); - end; - end; - end; + if NewReceiveNo <= (i + 1) then + // V’…ƒŒƒX + html.Add(SkinedRes(SkinNewRes, @Res, IntToStr(i + 1))) + else + // ’ʏí‚̃ŒƒX + html.Add(SkinedRes(SkinRes, @Res, IntToStr(i + 1))); + end; - doc.Write('' + #13#10); - // ƒXƒLƒ“(ƒtƒbƒ^) - try - doc.Write( LoadFromSkin( GikoSys.GetSkinFooterFileName, ThreadItem, ThreadItem.Size ) + #13#10 ); - except - end; - finally - doc.close; - end; + if ThreadItem.Kokomade = (i + 1) then begin + // ‚±‚±‚Ü‚Å“Ç‚ñ‚¾ + if FileExists( GikoSys.GetSkinBookmarkFileName ) then + html.Add( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size )) + else + html.Add( KOKO_TAG ); end; end; + + html.Add(''); + // ƒXƒLƒ“(ƒtƒbƒ^) + html.Add( LoadFromSkin( GikoSys.GetSkinFooterFileName, ThreadItem, ThreadItem.Size ) ); end; -procedure THTMLCreate.CreateUseCSSHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string ); +procedure THTMLCreate.CreateUseCSSHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string ); +const + FORMAT_NOMAIL = '
%s' + + ' –¼‘OF %s' + + ' “Še“úF %s
' + + '
%s
'; + + FORMAT_SHOWMAIL = '
%s' + + ' –¼‘OF ' + + '%s [%s] “Še“úF' + + ' %s
%s
'; + + FORMAT_NOSHOW = '
%s' + + ' –¼‘OF ' + + '%s “Še“úF %s
' + + '
%s
'; var i: integer; No: string; @@ -960,175 +992,150 @@ var NewReceiveNo: Integer; Res: TResRec; UserOptionalStyle: string; + ThreadName :String; + ResLink :TResLinkRec; begin - if ThreadItem <> nil then begin - doc.open; - try - doc.charset := 'Shift_JIS'; - NewReceiveNo := ThreadItem.NewReceive; - // ƒtƒHƒ“ƒg‚âƒTƒCƒY‚̐ݒè - UserOptionalStyle := GikoSys.SetUserOptionalStyle; - CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName; - if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin - //CSSŽg—p - doc.Write('' + #13#10); - doc.Write('' + #13#10); - doc.Write('' + sTitle + '' + #13#10); - doc.Write('' + #13#10); - if Length( UserOptionalStyle ) > 0 then - doc.Write('' + #13#10); - doc.Write('' + #13#10); - doc.Write('' + #13#10); - doc.Write('' + #13#10); - doc.Write('

' + #13#10); - doc.Write('
' + sTitle + '
' + #13#10); - for i := 0 to ReadList.Count - 1 do begin - // 1 ‚Í•K‚¸•\Ž¦ - if i <> 0 then begin - // •\Ž¦”͈͂ðŒÀ’è - case GikoSys.ResRange of - Ord( grrKoko ): - if ThreadItem.Kokomade > (i + 1) then - Continue; - Ord( grrNew ): - if NewReceiveNo > (i + 1) then - Continue; - 10..65535: - if (threadItem.Count - i) > GikoSys.ResRange then - Continue; - end; - end; - - if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin - doc.Write('
V’…ƒŒƒX ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '
' + #13#10); - end; - - if (Trim(ReadList[i]) <> '') then begin - No := IntToStr(i + 1); - Res := DivideStrLine(ReadList[i]); - Res.FBody := ConvRes(AddAnchorTag(Res.FBody), ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true'); - Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1); - if Res.FMailTo = '' then - doc.Write('' - + '
' + No + ' ' - + '–¼‘OF ' - + '' + Res.FName + ' ' - + '“Še“úF ' - + '' + Res.FDateTime+ '
' - + '
' + Res.FBody + '
' + #13#10) - else if GikoSys.Setting.ShowMail then - doc.Write('' - + '
' + No + '' - + ' –¼‘OF ' - + '' - + '' + Res.FName + ' [' + Res.FMailTo + ']' - + ' “Še“úF' - + ' ' + Res.FDateTime+ '
' - + '
' + Res.FBody + '
' + #13#10) - else - doc.Write('' - + '
' + No + '' - + ' –¼‘OF ' - + '' - + '' + Res.FName + '' - + ' “Še“úF' - + ' ' + Res.FDateTime+ '
' - + '
' + Res.FBody + '
' + #13#10); - end; + NewReceiveNo := ThreadItem.NewReceive; + ThreadName := ChangeFileExt(ThreadItem.FileName, ''); + ResLink.FBbs := ThreadItem.ParentBoard.BBSID; + ResLink.FKey := ThreadName; + // ƒtƒHƒ“ƒg‚âƒTƒCƒY‚̐ݒè + UserOptionalStyle := GikoSys.SetUserOptionalStyle; + CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName; + if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin + //CSSŽg—p + html.Add(''); + html.Add(''); + html.Add('' + sTitle + ''); + html.Add(''); + if Length( UserOptionalStyle ) > 0 then + html.Add(''); + html.Add(''#13#10''); + html.Add(''#13#10'

'); + html.Add('
' + sTitle + '
'); + html.Flush; + for i := 0 to ReadList.Count - 1 do begin + // 1 ‚Í•K‚¸•\Ž¦ + if i <> 0 then begin + // •\Ž¦”͈͂ðŒÀ’è + case GikoSys.ResRange of + Ord( grrKoko ): + if ThreadItem.Kokomade > (i + 1) then + Continue; + Ord( grrNew ): + if NewReceiveNo > (i + 1) then + Continue; + 10..65535: + if (threadItem.Count - i) > GikoSys.ResRange then + Continue; + end; + end; - if ThreadItem.Kokomade = (i + 1) then begin - doc.Write('
ƒRƒR‚Ü‚Å“Ç‚ñ‚¾
' + #13#10); - end; + if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin + html.Add('
V’…ƒŒƒX ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '
'); + end; - end; + if (Trim(ReadList[i]) <> '') then begin + No := IntToStr(i + 1); + DivideStrLine(ReadList[i], @Res); + AddAnchorTag(@Res); + ConvRes(@Res, @ResLink); + Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1); + if Res.FMailTo = '' then + html.Add(Format(FORMAT_NOMAIL, [No, No, No, Res.FName, Res.FDateTime, Res.FBody])) + else if GikoSys.Setting.ShowMail then + html.Add(Format(FORMAT_SHOWMAIL, [No, No, No, Res.FMailTo, Res.FName, Res.FMailTo, Res.FDateTime, Res.FBody])) + else + html.Add(Format(FORMAT_NOSHOW, [No, No, No, Res.FMailTo, Res.FName, Res.FDateTime, Res.FBody])); + end; - doc.Write('' + #13#10); - doc.Write('' + #13#10); - doc.Write('' + #13#10); + if ThreadItem.Kokomade = (i + 1) then begin + html.Add('
ƒRƒR‚Ü‚Å“Ç‚ñ‚¾
'); end; - finally - doc.Close; + end; + + html.Add(''); + html.Add(''); + html.Add(''); end; end; -procedure THTMLCreate.CreateDefaultHTML (doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string ); +procedure THTMLCreate.CreateDefaultHTML (html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string ); var i: integer; No: string; NewReceiveNo: Integer; Res: TResRec; + ThreadName: String; + ResLink : TResLinkRec; begin - if ThreadItem <> nil then begin - doc.open; - try - doc.charset := 'Shift_JIS'; - NewReceiveNo := ThreadItem.NewReceive; - doc.Write('' + #13#10); - doc.Write('' + #13#10); - doc.Write('' + sTitle + '' + #13#10); - doc.Write('' + #13#10); - doc.Write('' + #13#10); - doc.Write('' + sTitle + '' + #13#10); - doc.Write('
' + #13#10); - doc.Write('

' + #13#10); - for i := 0 to ReadList.Count - 1 do begin - // 1 ‚Í•K‚¸•\Ž¦ - if i <> 0 then begin - // •\Ž¦”͈͂ðŒÀ’è - case GikoSys.ResRange of - Ord( grrKoko ): - if ThreadItem.Kokomade > (i + 1) then - Continue; - Ord( grrNew ): - if NewReceiveNo > (i + 1) then - Continue; - 10..65535: - if (threadItem.Count - i) > GikoSys.ResRange then - Continue; - end; - end; + NewReceiveNo := ThreadItem.NewReceive; + ThreadName := ChangeFileExt(ThreadItem.FileName, ''); + ResLink.FBbs := ThreadItem.ParentBoard.BBSID; + ResLink.FKey := ThreadName; + html.Add(''); + html.Add(''); + html.Add('' + sTitle + ''); + html.Add(''); + html.Add(''); + html.Add('' + sTitle + ''); + html.Add('
'); + html.Add('

'); + html.Flush; + for i := 0 to ReadList.Count - 1 do begin + // 1 ‚Í•K‚¸•\Ž¦ + if i <> 0 then begin + // •\Ž¦”͈͂ðŒÀ’è + case GikoSys.ResRange of + Ord( grrKoko ): + if ThreadItem.Kokomade > (i + 1) then + Continue; + Ord( grrNew ): + if NewReceiveNo > (i + 1) then + Continue; + 10..65535: + if (threadItem.Count - i) > GikoSys.ResRange then + Continue; + end; + end; - if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin - doc.Write('
' + #13#10); - doc.Write('' + #13#10); - doc.Write('
V’…ƒŒƒX ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '
' + #13#10); - doc.Write('
' + #13#10); - end; + if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin + html.Add('
'); + html.Add(''); + html.Add('
V’…ƒŒƒX ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '
'); + html.Add('
'); + end; - if (Trim(ReadList[i]) <> '') then begin - No := IntToStr(i + 1); - Res := DivideStrLine(ReadList[i]); - Res.FBody := ConvRes(AddAnchorTag(Res.FBody), ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true'); - Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1); - if Res.FMailTo = '' then - doc.Write('
' + No + ' –¼‘OF ' + Res.FName + ' “Še“úF ' + Res.FDateTime+ '
' + Res.Fbody + '


' + #13#10) - else if GikoSys.Setting.ShowMail then - doc.Write('
' + No + ' –¼‘OF ' + Res.FName + ' [' + Res.FMailTo + '] “Še“úF ' + Res.FDateTime+ '
' + Res.Fbody + '


' + #13#10) - else - doc.Write('
' + No + ' –¼‘OF ' + Res.FName + ' “Še“úF ' + Res.FDateTime+ '
' + Res.Fbody + '


' + #13#10); - end; - if ThreadItem.Kokomade = (i + 1) then begin - doc.Write('
' + #13#10); - doc.Write('
ƒRƒR‚Ü‚Å“Ç‚ñ‚¾
' + #13#10); - doc.Write('
' + #13#10); - end; - end; - doc.Write('
' + #13#10); - doc.Write('' + #13#10); - doc.Write('' + #13#10); - finally - doc.Close; + if (Trim(ReadList[i]) <> '') then begin + No := IntToStr(i + 1); + DivideStrLine(ReadList[i], @Res); + AddAnchorTag(@Res); + ConvRes(@Res, @ResLink); + Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1); + if Res.FMailTo = '' then + html.Add('
' + No + ' –¼‘OF ' + Res.FName + ' “Še“úF ' + Res.FDateTime+ '
' + Res.Fbody + '


'#13#10) + else if GikoSys.Setting.ShowMail then + html.Add('
' + No + ' –¼‘OF ' + Res.FName + ' [' + Res.FMailTo + '] “Še“úF ' + Res.FDateTime+ '
' + Res.Fbody + '


'#13#10) + else + html.Add('
' + No + ' –¼‘OF ' + Res.FName + ' “Še“úF ' + Res.FDateTime+ '
' + Res.Fbody + '


'#13#10); + end; + if ThreadItem.Kokomade = (i + 1) then begin + html.Add('
'); + html.Add('
ƒRƒR‚Ü‚Å“Ç‚ñ‚¾
'); + html.Add('
'); end; end; + html.Add('
'#13#10''#13#10''); end; -procedure THTMLCreate.CreateHTML2(doc: Variant; ThreadItem: TThreadItem; var sTitle: string); +procedure THTMLCreate.CreateHTML2(Browser: TWebBrowser; ThreadItem: TThreadItem; var sTitle: string); var ReadList: TStringList; CSSFileName: string; FileName: string; Res: TResRec; + body : TBufferedWebBrowser; {$IFDEF DEBUG} st, rt: Cardinal; {$ENDIF} @@ -1138,43 +1145,51 @@ begin st := GetTickCount; {$ENDIF} if ThreadItem <> nil then begin - if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin - CreateUsePluginHTML(doc, ThreadItem, sTitle); - end else begin - ShortDayNames[1] := '“ú'; ShortDayNames[2] := 'ŒŽ'; - ShortDayNames[3] := '‰Î'; ShortDayNames[4] := '…'; - ShortDayNames[5] := '–Ø'; ShortDayNames[6] := '‹à'; - ShortDayNames[7] := '“y'; - - ReadList := TStringList.Create; - try - if ThreadItem.IsLogFile then begin - FileName := ThreadItem.GetThreadFileName; - ReadList.LoadFromFile(FileName); - GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG')); - GikoSys.FAbon.Execute(ReadList); // ‚ ‚ځ`‚ñ‚µ‚Ä - GikoSys.FSelectResFilter.Execute(ReadList); //ƒŒƒX‚̃tƒBƒ‹ƒ^ƒŠƒ“ƒO‚ð‚·‚é - if ThreadItem.Title = '' then begin - Res := DivideStrLine(ReadList[0]); - sTitle := Res.FTitle; - end else - sTitle := ThreadItem.Title - end else begin - sTitle := CustomStringReplace(ThreadItem.Title, '—M', ','); - end; - - // ƒtƒHƒ“ƒg‚âƒTƒCƒY‚̐ݒè - CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName; - if GikoSys.Setting.UseSkin then begin - CreateUseSKINHTML(doc, ThreadItem, ReadList); - end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin - CreateUseCSSHTML(doc, ThreadItem, ReadList, sTitle); - end else begin - CreateDefaultHTML(doc, ThreadItem, ReadList, sTitle); + body := TBufferedWebBrowser.Create(Browser, 100); + try + body.Open; + if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin + CreateUsePluginHTML(body, ThreadItem, sTitle); + end else begin + ShortDayNames[1] := '“ú'; ShortDayNames[2] := 'ŒŽ'; + ShortDayNames[3] := '‰Î'; ShortDayNames[4] := '…'; + ShortDayNames[5] := '–Ø'; ShortDayNames[6] := '‹à'; + ShortDayNames[7] := '“y'; + + ReadList := TStringList.Create; + try + if ThreadItem.IsLogFile then begin + ReadList.BeginUpdate; + FileName := ThreadItem.GetThreadFileName; + ReadList.LoadFromFile(FileName); + ReadList.EndUpdate; + GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG')); + GikoSys.FAbon.Execute(ReadList); // ‚ ‚ځ`‚ñ‚µ‚Ä + GikoSys.FSelectResFilter.Execute(ReadList); //ƒŒƒX‚̃tƒBƒ‹ƒ^ƒŠƒ“ƒO‚ð‚·‚é + if ThreadItem.Title = '' then begin + DivideStrLine(ReadList[0], @Res); + sTitle := Res.FTitle; + end else + sTitle := ThreadItem.Title + end else begin + sTitle := CustomStringReplace(ThreadItem.Title, '—M', ','); + end; + // ƒtƒHƒ“ƒg‚âƒTƒCƒY‚̐ݒè + CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName; + if GikoSys.Setting.UseSkin then begin + CreateUseSKINHTML(body, ThreadItem, ReadList); + end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin + CreateUseCSSHTML(body, ThreadItem, ReadList, sTitle); + end else begin + CreateDefaultHTML(body, ThreadItem, ReadList, sTitle); + end; + finally + ReadList.Free; end; - finally - ReadList.Free; end; + finally + body.Close; + body.Free; end; end; {$IFDEF DEBUG} @@ -1201,18 +1216,23 @@ var SkinHeader: string; SkinRes: string; tmp, tmp1: string; + ThreadName: String; + ResLink : TResLinkRec; function LoadSkin( fileName: string ): string; begin Result := LoadFromSkin( fileName, ThreadItem, ThreadItem.Size ); end; function ReplaceRes( skin: string ): string; begin - Result := SkinedRes( skin, Res, No ); + Result := SkinedRes( skin, @Res, No ); end; begin if ThreadItem <> nil then begin CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName; + ThreadName := ChangeFileExt(ThreadItem.FileName, ''); + ResLink.FBbs := ThreadItem.ParentBoard.BBSID; + ResLink.FKey := ThreadName; html.Clear; html.BeginUpdate; //if ThreadItem.IsBoardPlugInAvailable then begin @@ -1244,7 +1264,9 @@ begin for i := 0 to threadItem.Count - 1 do begin // ƒŒƒX - html.Append( ConvertResAnchor(boardPlugIn.GetRes( DWORD( threadItem ), i + 1 )) ); + Res.FBody := boardPlugIn.GetRes( DWORD( threadItem ), i + 1 ); + ConvertResAnchor(@Res); + html.Append( Res.FBody ); end; // ƒXƒLƒ“(ƒtƒbƒ^) @@ -1267,7 +1289,7 @@ begin GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG')); GikoSys.FAbon.Execute(ReadList); // ‚ ‚ځ`‚ñ‚µ‚Ä GikoSys.FSelectResFilter.Execute(ReadList); //ƒŒƒX‚̃tƒBƒ‹ƒ^ƒŠƒ“ƒO‚ð‚·‚é - Res := DivideStrLine(ReadList[0]); + DivideStrLine(ReadList[0], @Res); //Res.FTitle := CustomStringReplace(Res.FTitle, '—M', ','); sTitle := Res.FTitle; end else begin @@ -1302,9 +1324,10 @@ begin if (Trim(ReadList[i]) <> '') then begin No := IntToStr(i + 1); - Res := DivideStrLine(ReadList[i]); - Res.FBody := AddAnchorTag(Res.FBody); - Res.FBody := ConvertResAnchor(ConvRes(Res.FBody, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', true)); + DivideStrLine(ReadList[i], @Res); + AddAnchorTag(@Res); + ConvRes(@Res, @ResLink, true); + ConvertResAnchor(@Res); try html.Append( ReplaceRes( SkinRes ) ); @@ -1340,9 +1363,10 @@ begin for i := 0 to ReadList.Count - 1 do begin if (Trim(ReadList[i]) <> '') then begin No := IntToStr(i + 1); - Res := DivideStrLine(ReadList[i]); - Res.FBody := AddAnchorTag(Res.FBody); - Res.FBody := ConvertResAnchor(ConvRes(Res.FBody, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', true)); + DivideStrLine(ReadList[i], @Res); + AddAnchorTag(@Res); + ConvRes(@Res, @ResLink, true); + ConvertResAnchor(@Res); if Res.FMailTo = '' then html.Append('' + '
' + No + ' ' @@ -1386,9 +1410,10 @@ begin for i := 0 to ReadList.Count - 1 do begin if (Trim(ReadList[i]) <> '') then begin No := IntToStr(i + 1); - Res := DivideStrLine(ReadList[i]); - Res.FBody := AddAnchorTag(Res.FBody); - Res.FBody := ConvertResAnchor(ConvRes(Res.FBody, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', true)); + DivideStrLine(ReadList[i], @Res); + AddAnchorTag(@Res); + ConvRes(@Res, @ResLink, true); + ConvertResAnchor(@Res); if Res.FMailTo = '' then html.Append('
' + No + ' –¼‘OF ' + Res.FName + ' “Še“úF ' + Res.FDateTime+ '
' + Res.Fbody + '


') else if GikoSys.Setting.ShowMail then @@ -1411,6 +1436,335 @@ begin end; end; +procedure THTMLCreate.SetResPopupText(Hint : TResPopup; threadItem: TThreadItem; StNum, ToNum: Integer; Title, First: Boolean); +var + i: Integer; + tmp: string; + FileName: string; + Line: Integer; + + wkInt: Integer; + + Res: TResRec; + Header: string; + Body: string; + boardPlugIn : TBoardPlugIn; +begin + try + if StNum > ToNum then begin + wkInt := StNum; + StNum := ToNum; + ToNum := wkInt; + end; + + //Å‘å10ƒŒƒX‚Ü‚Å•\Ž¦ + if StNum + MAX_POPUP_RES < ToNum then + ToNum := StNum + MAX_POPUP_RES; + + //ƒ^ƒCƒgƒ‹•\Ž¦ + if Title then + if ThreadItem <> nil then + Hint.Title := ThreadItem.Title; + + if ThreadItem <> nil then begin + //if ThreadItem.IsBoardPlugInAvailable then begin + if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin + //===== ƒvƒ‰ƒOƒCƒ“‚É‚æ‚é•\Ž¦ + //boardPlugIn := ThreadItem.BoardPlugIn; + boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn; + + // ƒtƒHƒ“ƒg‚âƒTƒCƒY‚̐ݒè + // •¶ŽšƒR[ƒh‚̓vƒ‰ƒOƒCƒ“‚É”C‚¹‚é + for i := StNum to ToNum do begin + Line := i; + //‚±‚±‚Å‚Q‚¿‚á‚ñ‚Ë‚é‚Ìdat‚ÌŒ`Ž®‚Å‚Ps“ǂݍž‚ß‚ê‚Î¥¥¥B«“Ç‚ß‚é‚悤‚É‚È‚Á‚½ + tmp := boardPlugIn.GetDat( DWORD( threadItem ), i ); + if (tmp <> '') And ( not GikoSys.FAbon.CheckAbonPopupRes(tmp) And( not GikoSys.FAbon.CheckIndividualAbonList(line))) then begin + DivideStrLine(tmp, @Res); + if (GikoSys.Setting.ShowMail = false) or (Length(res.FMailTo) = 0) then + Header := IntToStr(Line) + ' –¼‘OF ' + Res.FName + ' “Še“úF ' + Res.FDateTime + else + Header := IntToStr(Line) + ' –¼‘OF ' + Res.FName + ' [' + res.FMailTo + '] “Še“úF ' + Res.FDateTime; + Header := DeleteFontTag(Header); + Header := CustomStringReplace(Header, '
', '',true); + + Body := CustomStringReplace(Res.FBody, '
', #10,true); + Body := CustomStringReplace(Body, '
', #10,true); + Body := CustomStringReplace(Body, '', '',true); + Body := THTMLCreate.DeleteLink(Body); + Body := CustomStringReplace(Body, '<', '<'); + Body := CustomStringReplace(Body, '>', '>'); + Body := CustomStringReplace(Body, '"', '"'); + Body := CustomStringReplace(Body, '&', '&'); + Body := CustomStringReplace(Body, ' ', ' '); + + Hint.Add(Header, Body); + end; + end; + end else begin + for i := StNum to ToNum do begin + Line := i; + FileName := ThreadItem.FilePath; + tmp := GikoSys.ReadThreadFile(FileName, Line); + if (tmp <> '') And ( not GikoSys.FAbon.CheckAbonPopupRes(tmp) And( not GikoSys.FAbon.CheckIndividualAbonList(line))) then begin + DivideStrLine(tmp, @Res); + if (GikoSys.Setting.ShowMail = false) or (Length(res.FMailTo) = 0) then + Header := IntToStr(Line) + ' –¼‘OF ' + Res.FName + ' “Še“úF ' + Res.FDateTime + else + Header := IntToStr(Line) + ' –¼‘OF ' + Res.FName + ' [' + res.FMailTo + '] “Še“úF ' + Res.FDateTime; + + Body := DeleteFontTag(Res.FBody); + Body := CustomStringReplace(Body, '
', #10,true); + Body := CustomStringReplace(Body, '
', #10,true); + Body := CustomStringReplace(Body, '', '',true); + Body := THTMLCreate.DeleteLink(Body); + Body := CustomStringReplace(Body, '<', '<'); + Body := CustomStringReplace(Body, '>', '>'); + Body := CustomStringReplace(Body, '"', '"'); + Body := CustomStringReplace(Body, '&', '&'); + Body := CustomStringReplace(Body, ' ', ' '); + Hint.Add(Header, Body); + end; + end; + end; + end; + finally + end; +end; + +//ƒŠƒ“ƒN‚Ì•¶Žš—ñ‚©‚烌ƒXƒ|ƒbƒvƒAƒbƒv—p‚ÌURL‚É•ÏŠ·‚·‚é +class function THTMLCreate.GetRespopupURL(AText, AThreadURL : string): string; +var + wkInt: Integer; +begin + Result := ''; + if Pos('about:blank..', AText) = 1 then begin + wkInt := LastDelimiter( '/', AThreadURL ); + if Pos( '?', Copy( AThreadURL, wkInt, MaxInt ) ) = 0 then begin + // Thread.URL ‚Í PATH_INFO “n‚µ + Result := Copy( AThreadURL, 1, LastDelimiter( '/', AThreadURL ) ); + wkInt := LastDelimiter( '/', AText ); + if Pos( '?', Copy( AText, wkInt, MaxInt ) ) = 0 then + // Text ‚à PATH_INFO “n‚µ + Result := Result + Copy( AText, LastDelimiter( '/', AText ) + 1, MaxInt ) + else + // Text ‚Í QUERY_STRING “n‚µ + Result := Result + Copy( AText, LastDelimiter( '?', AText ) + 1, MaxInt ); + end else begin + // Thread.URL ‚Í QUERY_STRING “n‚µ + Result := Copy( AThreadURL, 1, LastDelimiter( '?', AThreadURL ) ); + wkInt := LastDelimiter( '/', AText ); + if Pos( '?', Copy( AText, wkInt, MaxInt ) ) = 0 then begin + // Text ‚Í PATH_INFO “n‚µ + // URL ‚ɔ‚ƃL[‚ª‘«‚ç‚È‚¢‚Ì‚Å Text ‚©‚ç’¸‘Õ‚·‚é + wkInt := LastDelimiter( '/', Copy( AText, 1, wkInt - 1 ) ); + wkInt := LastDelimiter( '/', Copy( AText, 1, wkInt - 1 ) ); + Result := Copy( Result, 1, Length( Result ) - 1 ) + Copy( AText, wkInt, MaxInt ); + end else begin + // Text ‚à QUERY_STRING “n‚µ + Result := Result + Copy( AText, LastDelimiter( '?', AText ) + 1, MaxInt ) + end; + end; + end else if Pos('about:blank/bbs/', AText) = 1 then begin + //‚µ‚½‚ç‚ÎJBBS‚ÌŽd•Ï‚Ì‹zŽû + AText := CustomStringReplace(AText, 'about:blank/bbs/', 'about:blank../../bbs/'); + Result := GetRespopupURL(AText, AThreadURL); + end else begin + Result := AText; + end; + +end; +//Žw’肵‚½ƒpƒX‚ɃXƒLƒ“‚à‚µ‚­‚ÍCSS‚̃tƒ@ƒCƒ‹‚̃Rƒs[‚ðì‚é +class procedure THTMLCreate.SkinorCSSFilesCopy(path: string); +var + tmp, tmpD, tmpF: string; + current: string; + dirs: TStringList; + files: TStringList; + i, j: Integer; +begin + if GikoSys.Setting.UseSkin then begin + current := ExtractFilePath(GikoSys.GetSkinDir); + tmp := GikoSys.Setting.CSSFileName; + end else if GikoSys.Setting.UseCSS then begin + current := ExtractFilePath(GikoSys.GetStyleSheetDir); + tmp := ExtractFilePath(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName); + end; + dirs := TStringList.Create; + try + dirs.Add(tmp); + if tmp <> current then begin + GikoSys.GetDirectoryList(current, '*.*', dirs, true); + for i := 0 to dirs.Count - 1 do begin + files := TStringList.Create; + try + files.BeginUpdate; + gikoSys.GetFileList(dirs[i], '*.*', files, true); + files.EndUpdate; + tmpD := CustomStringReplace(dirs[i], GikoSys.GetConfigDir, path); + if (AnsiPos(dirs[i], tmp) <> 0) and not (DirectoryExists(tmpD)) then + ForceDirectories(tmpD); + + if(dirs[i] = tmp) and (dirs[i] <> current) then begin + for j := 0 to files.Count - 1 do begin + tmpF := CustomStringReplace(files[j], GikoSys.GetConfigDir, path); + if not FileExists(tmpF) then begin + CopyFile(PChar(files[j]), PChar(tmpF),True); + end; + end; + end; + finally + files.Free; + end; + end; + end else begin + tmpD := CustomStringReplace(dirs[0], GikoSys.GetConfigDir, path); + if not DirectoryExists(tmpD) then + ForceDirectories(tmpD); + tmpF := CustomStringReplace(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName + , GikoSys.GetConfigDir, path); + if not FileExists(tmpF) then begin + CopyFile(PChar(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName) + , PChar(tmpF), True); + end; + end; + finally + dirs.Free; + end; +end;{! +\brief datƒtƒ@ƒCƒ‹‚̈ꃉƒCƒ“‚𕪉ð +\param Line datƒtƒ@ƒCƒ‹‚ð\¬‚·‚é 1 s +\return ƒŒƒXî•ñ +} +class procedure THTMLCreate.DivideStrLine(Line: string; PRes: PResRec); +const + delimiter = '<>'; +var + pds, pde : PChar; + pss, pse : PChar; + ppos : PChar; +begin + //ŒÅ’è + PRes.FType := glt2chNew; + + pss := PChar(Line); + pse := pss + Length(Line); + pds := PChar(delimiter); + pde := pds + Length(delimiter); + + ppos := AnsiStrPosEx(pss, pse, pds, pde); + if (ppos = nil) then begin + Line := CustomStringReplace(Line, '<>', '<>'); + Line := CustomStringReplace(Line, ',', '<>'); + Line := CustomStringReplace(Line, '—M', ','); + end; + //Trim‚µ‚Ä‚Í‚¢‚¯‚È‚¢‹C‚ª‚·‚é@by‚à‚¶‚ã + PRes.FName := RemoveToken(Line, delimiter); + PRes.FMailTo := RemoveToken(Line, delimiter); + PRes.FDateTime := RemoveToken(Line, delimiter); + PRes.FBody := RemoveToken(Line, delimiter); + //‚Q‚¿‚á‚ñ‚Ë‚é‚Æ‚©‚¾‚ƁA–{•¶‚̐擪‚É‚P‚”¼Šp‹ó”’‚ª“ü‚Á‚Ä‚¢‚é‚̂ō폜‚·‚é + //‘¼‚ÌŒfŽ¦”‚ŁAƒŒƒXŽ©‘Ì‚Ì‹ó”’‚©‚à‚µ‚ê‚È‚¢‚¯‚Ç‚»‚ê‚Í’ú‚ß‚é + PRes.FBody := TrimLeft(PRes.FBody); + //‹ó‚¾‚Æ–â‘肪‹N‚«‚é‚©‚çA‹ó”’‚ðÝ’è‚·‚é + if PRes.FBody = '' then + PRes.FBody := ' '; + + PRes.FTitle := RemoveToken(Line, delimiter); +end; + +{! +\brief HTML ‚©‚çƒAƒ“ƒJ[ƒ^ƒO‚ðíœ +\param s Œ³‚É‚È‚é HTML +\return ƒAƒ“ƒJ[ƒ^ƒO‚ªíœ‚³‚ꂽ HTML +} +class function THTMLCreate.DeleteLink(const s: string): string; +var + s1: string; + s2: string; + idx: Integer; + i: Integer; +begin + i := 0; + Result := ''; + while True do begin + s1 := GikoSys.GetTokenIndex(s, '', s1); + if idx <> 0 then + Delete(s1, 1, idx + 1); + idx := Pos('">', s2); + if idx <> 0 then + Delete(s2, 1, idx + 1); + + Result := Result + s1 + s2; + + if s2 = '' then + Break; + + inc(i, 2); + end; +end; + +constructor TBufferedWebBrowser.Create(Browser: TWebBrowser; BuffSize: Integer); +begin + inherited Create; + Self.Sorted := False; + if (Browser = nil) then + Raise Exception.Create('Browser is NULL'); + FBrowser := Browser; + + // ƒoƒbƒtƒ@‚·‚és”‚ð + if (BuffSize < 0) then begin + FBuffSize := 100; + end else begin + FBuffSize := BuffSize; + end; + Self.Capacity := FBuffSize + 10; +end; +procedure TBufferedWebBrowser.Open; +begin + FBrowserDoc := Idispatch( olevariant(FBrowser.ControlInterface).Document); + FBrowserDoc.open; + FBrowserDoc.charset := 'Shift_JIS'; +end; +procedure TBufferedWebBrowser.Close; +begin + Self.Flush; + try + FBrowserDoc.Close; + except + end; + FBrowser := nil; +end; +function TBufferedWebBrowser.Add(const S: string): Integer; +begin + Result := inherited Add(TrimRight(s)); + if (Self.Count > FBuffSize) then begin + FBrowserDoc.Write(Self.Text); + Self.Clear; + end; +end; +procedure TBufferedWebBrowser.Flush ; +begin + if (Self.Count > 0) then begin + FBrowserDoc.Write(Self.Text); + Self.Clear; + end; +end; +destructor TBufferedWebBrowser.Destory; +begin + try + if (FBrowserDoc <> 0) then begin + FBrowserDoc.close; + FBrowserDoc := 0; + end; + except + end; + inherited; +end; + initialization HTMLCreater := THTMLCreate.Create;