OSDN Git Service

ローカルルール関係の基礎作り
[gikonavigoeson/gikonavi.git] / Editor.pas
index cd9be7b..dd00fc8 100644 (file)
@@ -7,8 +7,10 @@ uses
        Dialogs, StdCtrls, ComCtrls, ExtCtrls, ToolWin, Menus, OleCtrls, Registry,
 {$IF Defined(DELPRO) }
        SHDocVw,
+       MSHTML,
 {$ELSE}
        SHDocVw_TLB,
+       MSHTML_TLB,
 {$IFEND}
        ActiveX, {HTTPApp,} YofUtils, Trip, IniFiles, StrUtils,
        GikoSystem, GikoUtil, ImgList, Clipbrd, BoardGroup,
@@ -29,7 +31,7 @@ type
                CloseMenu: TMenuItem;
                N01: TMenuItem;
                StatusBar: TStatusBar;
-               EditorPage: TPageControl;
+       EditorPage: TPageControl;
                EditorTab: TTabSheet;
                PreviewTab: TTabSheet;
                Browser: TWebBrowser;
@@ -87,16 +89,30 @@ type
                SelectAllAction: TAction;
                N2: TMenuItem;
                SelectAll1: TMenuItem;
-    Timer1: TTimer;
-    QuotePasteAction: TAction;
-    QuotePasteMenuItem: TMenuItem;
-    C1: TMenuItem;
-    SpaceToNBSPAction: TAction;
-    AmpToCharRefAction: TAction;
-    SpaceTabnbsp1: TMenuItem;
-    amp1: TMenuItem;
-    SettingTXT1: TMenuItem;
-    HEADTXT1: TMenuItem;
+       Timer1: TTimer;
+       QuotePasteAction: TAction;
+       QuotePasteMenuItem: TMenuItem;
+       C1: TMenuItem;
+       SpaceToNBSPAction: TAction;
+       AmpToCharRefAction: TAction;
+       SpaceTabnbsp1: TMenuItem;
+       amp1: TMenuItem;
+       BoardInformationTab: TTabSheet;
+                               BoardtopTab: TTabSheet;
+       TitlePictureBrowser: TWebBrowser;
+       BoardTop: TMenuItem;
+       BoardInformationMemo: TMemo;
+       GetSETTINGTXTAction: TAction;
+       N3: TMenuItem;
+       SETTINGTXT2: TMenuItem;
+       GetTitlePictureAction: TAction;
+       OP1: TMenuItem;
+    GetHeadTXTAction: TAction;
+    HeadTXT1: TMenuItem;
+    TabSheet1: TTabSheet;
+    Memo1: TMemo;
+    WebBrowser1: TWebBrowser;
+
                procedure EditorPageChange(Sender: TObject);
                procedure FormCreate(Sender: TObject);
                procedure BrowserStatusTextChange(Sender: TObject;
@@ -129,15 +145,18 @@ type
                procedure IdLogDebugSend(ASender: TIdConnectionIntercept;
                        AStream: TStream);
                procedure SelectAllActionExecute(Sender: TObject);
-    procedure StatusBarResize(Sender: TObject);
-    procedure Timer1Timer(Sender: TObject);
-    procedure FormActivate(Sender: TObject);
-    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+       procedure StatusBarResize(Sender: TObject);
+       procedure Timer1Timer(Sender: TObject);
+       procedure FormActivate(Sender: TObject);
+       procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
                procedure QuotePasteActionExecute(Sender: TObject);
-    procedure SpaceToNBSPActionExecute(Sender: TObject);
-    procedure AmpToCharRefActionExecute(Sender: TObject);
-    procedure SettingTXT1Click(Sender: TObject);
-    procedure HEADTXT1Click(Sender: TObject);
+       procedure SpaceToNBSPActionExecute(Sender: TObject);
+       procedure AmpToCharRefActionExecute(Sender: TObject);
+       procedure BoardTopClick(Sender: TObject);
+       procedure GetSETTINGTXTActionExecute(Sender: TObject);
+       procedure GetTitlePictureActionUpdate(Sender: TObject);
+       procedure GetTitlePictureActionExecute(Sender: TObject);
+    procedure GetHeadTXTActionExecute(Sender: TObject);
        private
                FThreadItem: TThreadItem;
                FBoard: TBoard;
@@ -148,8 +167,8 @@ type
                FStatusCode: Integer;
                FDebugStrReceive: string;
                FDebugStrSend: string;
-        FSambaTime: TDateTime;
-        FHost: string;
+               FSambaTime: TDateTime;
+               FHost: string;
                FNow: TDateTime;
                procedure Preview;
                function RepHtml(s: string): string;
@@ -163,27 +182,34 @@ type
 //             procedure GetSendData(Source: TStringStream);
                procedure GetSendData(Source: TStringStream);
                procedure SaveSendFile;
-               procedure SetContent(Content: string);
+               procedure SetContent(Content: string; ABrowser: TWebBrowser);
                function GetSPID(CookieLine: string): string;
                function GetPON(CookieLine: string): string;
                function GetResultType(ResponseText: string): TGikoResultType;
-        procedure ReadSambaTime(const AHost: string);
-        procedure WriteSambaTime(const AHost: string; ATime: TDateTime);
-        function ReadSettingTime(const AHost: string): Integer;
-        function CheckSambaTime(const AHost: string; ATime: TDateTime): Boolean;
+               procedure ReadSambaTime(const AHost: string);
+               procedure WriteSambaTime(const AHost: string; ATime: TDateTime);
+               function ReadSettingTime(const AHost: string): Integer;
+               function CheckSambaTime(const AHost: string; ATime: TDateTime): Boolean;
                                procedure SetSamba24(AURL: string);
                /// \88ø\97p\95\84\82Ì\8eæ\93¾
                function GetOEIndentChar : string;
                /// \96{\95\82Ì\8eæ\93¾
                function GetBody : string;
+               //IdHttp\82Ì\8f\89\8aú\89»
+               procedure InitIdHTTP(http: TIdHTTP);
+               procedure ShowBoardInformation(ABoard: TBoard; AMemo: TMemo);
+               function GetTitlePictureURL(body: TStringList; ABoard: TBoard): string;
+               procedure ShowTitlePicture();
+                               function GetFusianaName(body: TStringList; ABoard: TBoard): String;
        protected
                procedure CreateParams(var Params: TCreateParams); override;
        public
-                FBBSID: String;
+                               FBBSID: String;
                procedure SetFont;
                procedure SetThreadItem(Item: TThreadItem);
                procedure SetBoard(Item: TBoard);
-                property BBSID: string read FBBSID write FBBSID;
+                               property BBSID: string read FBBSID write FBBSID;
+
        end;
 
 implementation
@@ -258,10 +284,11 @@ procedure TEditorForm.FormCreate(Sender: TObject);
 var
        wp: TWindowPlacement;
                hUser32 : HINST;
+        ini: TIniFile;
 begin
        FWork := False;
        Browser.Navigate('about:blank');
-
+       TitlePictureBrowser.Navigate('about:blank');
        FBoard := nil;
        FThreadItem := nil;
 
@@ -346,6 +373,16 @@ begin
 
        SpaceToNBSPAction.Checked               := GikoSys.Setting.SpaceToNBSP;
        AmpToCharRefAction.Checked      := GikoSys.Setting.AmpToCharRef;
+
+               ini := TIniFile.Create(GikoSys.Setting.GetFileName);
+
+               try
+                       BoardtopTab.TabVisible := ini.Readbool('EditorForm', 'BoardTopTab', False);
+                       BoardTop.Checked := BoardtopTab.TabVisible;
+               finally
+                       ini.Free;
+               end;
+
 end;
 
 procedure TEditorForm.SetBoard(Item: TBoard);
@@ -356,7 +393,9 @@ begin
        MailComboBox.Text := FBoard.KotehanMail;
        SageCheckBox.Checked := AnsiPos('sage', MailComboBox.Text) <> 0;
        TitlePanel.Visible := True;
-    SetSamba24('');
+       SetSamba24(FBoard.URL);
+       ShowBoardInformation(FBoard, BoardInformationMemo);
+       ShowTitlePicture();
 end;
 
 procedure TEditorForm.SetThreadItem(Item: TThreadItem);
@@ -367,13 +406,18 @@ begin
        MailComboBox.Text := FThreadItem.ParentBoard.KotehanMail;
        SageCheckBox.Checked := AnsiPos('sage', MailComboBox.Text) <> 0;
        TitlePanel.Visible := False;
-    SetSamba24(FThreadItem.ParentBoard.URL);
+       SetSamba24(FThreadItem.ParentBoard.URL);
+       ShowBoardInformation(FThreadItem.ParentBoard, BoardInformationMemo);
+       ShowTitlePicture();
 end;
 
 function TEditorForm.GetBody : string;
 var
-       body            : string;
-       regexp  : TAWKStr;
+       body, tmp               : string;
+       p, tail                 : PChar;
+       len                                     : Integer;
+const
+       TAB_LENGTH      = 4;
 begin
 
        body := BodyEdit.Text;
@@ -381,16 +425,65 @@ begin
                // & \82Ì\92u\8a·\82Í\88ê\94Ô\8dÅ\8f\89\82É\82â\82é\82±\82Æ
                body := CustomStringReplace( body, '&', '&amp;' );
        if SpaceToNBSPAction.Checked then begin
-               body := CustomStringReplace( body, #09, '&nbsp;&nbsp;&nbsp;&nbsp;' );
-               body := CustomStringReplace( body, '  ', '&nbsp;&nbsp;' );
-               body := CustomStringReplace( body, '&nbsp; ', '&nbsp;&nbsp;' );
-               regexp := TAWKStr.Create( nil );
-               try
-                       regexp.RegExp := '^ ';
-                       regexp.GSub( '\&nbsp;', body );
-               finally
-                       regexp.Free;
+               p                       := PChar( body );
+               tail    := p + Length( body );
+               len             := 0;
+               while p < tail do begin
+                       case p^ of
+                       #09:
+                               begin
+                                       Inc( p );
+                                       repeat
+                                               Inc( len );
+                                               tmp := tmp + '&nbsp;';
+                                       until (len mod TAB_LENGTH) = 0;
+                               end;
+
+                       #10, #13:
+                               begin
+                                       tmp := tmp + p^;        Inc( p );
+                                       len     := 0;
+                               end;
+
+                       ' ':
+                               begin
+                                       tmp     := tmp + '&nbsp;';
+                                       Inc( p );
+                                       Inc( len );
+                               end;
+                               
+                       '&':
+                               // \8eÀ\91Ì\8eQ\8fÆ\82Í 1 \95\8e\9a\95ª
+                               begin
+                                       tmp := tmp + '&';
+                                       Inc( p );
+                                       Inc( len );
+                                       while p < tail do begin
+                                               if p^ in ['a'..'z', 'A'..'Z', '0'..'9', '#'] then begin
+                                                       tmp := tmp + p^;
+                                               end else if p^ = ';' then begin
+                                                       tmp := tmp + p^;
+                                                       Inc( p );
+                                                       Break;
+                                               end else begin
+                                                       Break;
+                                               end;
+                                               Inc( p );
+                                       end;
+                               end;
+
+                       else
+                               if p^ in kYofKanji then begin
+                                       tmp := tmp + p^;        Inc( p );
+                                       tmp     := tmp + p^;    Inc( p );
+                                       len     := len + 2;
+                               end else begin
+                                       tmp := tmp + p^;        Inc( p );
+                                       Inc( len );
+                               end;
+                       end;
                end;
+               body := tmp;
        end;
 
        Result  := body;
@@ -427,7 +520,6 @@ begin
        end;
 
        body := GetBody;
-
        Namae := RepHtml(NameComboBox.Text);
        Mail := RepHtml(MailComboBox.Text);
        Body := RepHtml(body);
@@ -458,7 +550,7 @@ begin
        else
                s := s + '<DT>' + No + ' \81F <A href="mailto:' + Mail + '"><B>' + Namae + '</B></A> [' + Mail + ']\81F ' + DateTime+ '<BR><DD>' + Body + '<BR><BR><BR>' + #13#10;
        s := s + '</BODY></HTML>';
-       SetContent(s);
+       SetContent(s, Browser);
 end;
 
 function TEditorForm.RepHtml(s: string): string;
@@ -575,16 +667,21 @@ begin
                        Result := TitleEdit.Handle
                else
                        Result := 0;
+       end else if Editorpage.ActivePage = BoardInformationTab then begin
+               if ActiveControl = BoardInformationMemo then
+                       Result := BoardInformationMemo.Handle
+               else
+                       Result := 0;
        end else
                Result := 0;
 end;
 
-procedure TEditorForm.SetContent(Content: string);
+procedure TEditorForm.SetContent(Content: string; ABrowser: TWebBrowser);
 var
-       doc : Variant;
+       doc: Variant;
 begin
-       if Browser.Document <> nil then begin
-               doc := Browser.Document;
+       if ABrowser.Document <> nil then begin
+               doc := Idispatch( olevariant(ABrowser.ControlInterface).Document) as IHTMLDocument2;
                doc.Clear;
                doc.open;
                doc.charset := 'Shift_JIS';
@@ -592,6 +689,26 @@ begin
                doc.Close;
        end;
 end;
+procedure TEditorForm.InitIdHTTP(http: TIdHTTP);
+begin
+       http.Request.Clear;
+       http.ProxyParams.BasicAuthentication := False;
+       if GikoSys.Setting.WriteProxy then begin
+               http.ProxyParams.ProxyServer := GikoSys.Setting.WriteProxyAddress;
+               http.ProxyParams.ProxyPort := GikoSys.Setting.WriteProxyPort;
+               http.ProxyParams.ProxyUsername := GikoSys.Setting.WriteProxyUserID;
+               http.ProxyParams.ProxyPassword := GikoSys.Setting.WriteProxyPassword;
+               if GikoSys.Setting.ReadProxyUserID <> '' then
+                       http.ProxyParams.BasicAuthentication := True;
+       end else begin
+               http.ProxyParams.ProxyServer := '';
+               http.ProxyParams.ProxyPort := 80;
+               http.ProxyParams.ProxyUsername := '';
+               http.ProxyParams.ProxyPassword := '';
+       end;
+       Indy.Request.UserAgent := GikoSys.GetUserAgent;
+       Indy.Request.AcceptEncoding := '';
+end;
 
 procedure TEditorForm.Send(SPID: string; PON: string; FirstWriting: Boolean);
 var
@@ -608,10 +725,13 @@ var
        sysMenu : HMENU;
        //fusianasan\83g\83\89\83b\83v by\92è\8aú\95Ö
        Namae: String;
-       SettingTxt: String;
-        RefeURL: string;
+//     SettingTxt: String;
+//        RefeURL: string;
 //        RuleURL: String;
 //        RuleTxt: String;
+//        Name: String;
+//        SettingBody: TStringList;
+//        tmpBoard: TBoard;
 begin
        FAbort := False;
        State := gdsError;
@@ -621,21 +741,8 @@ begin
        else
                Board := FThreadItem.ParentBoard;
 
-       Indy.Request.Clear;
-       Indy.ProxyParams.BasicAuthentication := False;
-       if GikoSys.Setting.WriteProxy then begin
-               Indy.ProxyParams.ProxyServer := GikoSys.Setting.WriteProxyAddress;
-               Indy.ProxyParams.ProxyPort := GikoSys.Setting.WriteProxyPort;
-               Indy.ProxyParams.ProxyUsername := GikoSys.Setting.WriteProxyUserID;
-               Indy.ProxyParams.ProxyPassword := GikoSys.Setting.WriteProxyPassword;
-               if GikoSys.Setting.ReadProxyUserID <> '' then
-                       Indy.ProxyParams.BasicAuthentication := True;
-       end else begin
-               Indy.ProxyParams.ProxyServer := '';
-               Indy.ProxyParams.ProxyPort := 80;
-               Indy.ProxyParams.ProxyUsername := '';
-               Indy.ProxyParams.ProxyPassword := '';
-       end;
+
+       InitIdHTTP(Indy);
        if FThreadItem = nil then begin
                URL := FBoard.GetSendURL;
                RefURL := GikoSys.UrlToServer(FBoard.URL) + 'test/bbs.cgi';
@@ -643,9 +750,9 @@ begin
                URL := FThreadItem.GetSendURL;
                RefURL := FThreadItem.URL;
        end;
-       Indy.Request.UserAgent := GikoSys.GetUserAgent;
+//     Indy.Request.UserAgent := GikoSys.GetUserAgent;
        Indy.Request.Referer := RefURL;
-       Indy.Request.AcceptEncoding := '';
+//     Indy.Request.AcceptEncoding := '';
 
        Cookie := '';
        if SPID <> '' then
@@ -699,39 +806,7 @@ begin
                                        Exit;
                                end;
                        end;
-                       {
-                       //\83t\83V\83A\83i\83g\83\89\83b\83v\8cx\8d\90(SETTING.TXT Mode) by \92è\8aú\95Ö
-                       RefURL := GikoSys.UrlToServer(FBoard.URL)
-                               + GikoSys.UrlToID(FBoard.URL)
-                               + '/';
-                       //RefURL\82ð\8c³\82ÉSETTING.TXT\83A\83h\83\8c\83X\8ew\92è
-                       RefeURL := RefURL
-                               + 'SETTING.TXT';
-
-                                               //\8e\8e\82µ\82É\83\8d\81[\83J\83\8b\83\8b\81[\83\8b\8eæ\93¾\82à
-                                               RuleURL := RefURL
-                                                               + 'head.txt';
-                                               //\8eæ\93¾\81`
-                       Settingtxt := Indy.Get(RefeURL);
-                                               RuleTxt := Indy.Get(RuleURL);
-
-                                               //SETTING.TXT In DebugOnly
-                                               if Settingtxt = '' then begin
-                                                               ShowMessage('\8eæ\93¾\8e¸\94s');
-                                                               Exit;
-                                               end else begin
-                                                               ShowMessage('\8eæ\93¾\90¬\8c÷' + #13#10 + Settingtxt);
-                                                               Exit;
-                                               end;
 
-                                               //RocalRule In Debug Only
-                                               if RuleTxt = '' then begin
-                                                               ShowMessage('\8eæ\93¾\8e¸\94s');
-                                                               Exit;
-                                               end else begin
-                                                               ShowMessage('\8eæ\93¾\90¬\8c÷' + #13#10 + RuleTxt);
-                                               end;
-                       }
                        if ResultType = grtOK then begin
                                WriteSambaTime(FHost, Now());
                                State := gdsComplete;
@@ -866,7 +941,7 @@ begin
                else
                        GikoForm.AddMessageList(FThreadItem.Title + ' [\83\8c\83X\91\97\90M\8e¸\94s]', nil, gmiNG);
                EditorPage.ActivePage := PreviewTab;
-               SetContent(ResponseText);
+               SetContent(ResponseText, Browser);
        end else if State = gdsAbort then begin
                GikoForm.AddMessageList(FThreadItem.Title + ' [\92\86\92f]', nil, gmiSAD);
        end;
@@ -1467,112 +1542,260 @@ begin
                Preview;
 end;
 
-procedure TEditorForm.SettingTXT1Click(Sender: TObject);
+procedure TEditorForm.BoardTopClick(Sender: TObject);
 var
-        RefURL, RefeURL, SettingTxt, FilePath, FileName: String;
-        ini: TMemIniFile;
-begin
-        RefURL := GikoSys.UrlToServer(FBoard.URL)
-               + GikoSys.UrlToID(FBoard.URL)
-               + '/';
-       //RefURL\82ð\8c³\82ÉSETTING.TXT\83A\83h\83\8c\83X\8ew\92è
-       RefeURL := RefURL
-               + 'SETTING.TXT';
-       Settingtxt := Indy.Get(RefeURL);
-       if Length( FilePath ) > 0 then
-               FileName := ExtractFilePath( FilePath )
+       ini: TIniFile;
+begin
+       ini := TIniFile.Create(GikoSys.Setting.GetFileName);
+       try
+               BoardtopTab.TabVisible := BoardTop.Checked;
+               ini.WriteBool('EditorForm', 'BoardTopTab', BoardtopTab.TabVisible);
+       finally
+               ini.Free;
+       end;
+end;
+
+
+procedure TEditorForm.GetSETTINGTXTActionExecute(Sender: TObject);
+var
+       URL, RefURL: string;
+       settingBody: TStringList;
+       tmpBoard: TBoard;
+begin
+       InitIdHTTP(Indy);
+       if FThreadItem = nil then
+               tmpBoard := FBoard
        else
-               FileName := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
-                                                       + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM;
-        FileName := FileName + FOLDER_INI_FILENAME;
-       ini := TMemIniFile.Create(FileName);
-
-        try
-                ini.WriteString('Rule', 'SETTING.TXT', Settingtxt);
-                ini.WriteString('Rule', 'SETTINGUpdate', DateTimeToStr(Date));
-        finally
-                ini.Free;
-        end;
+               tmpBoard := FThreadItem.ParentBoard;
 
-        //SETTING.TXT In DebugOnly
-       if Settingtxt = '' then begin
-               ShowMessage('\8eæ\93¾\8e¸\94s');
-               Exit;
+       if tmpBoard = nil then Exit;
+
+       RefURL  := tmpBoard.URL;
+       if RefURL[Length(RefURL)] <> '/' then
+               URL     := RefURL + '/' + 'SETTING.TXT'
+       else
+               URL     := RefURL + 'SETTING.TXT';
+
+       Indy.Request.LastModified := tmpBoard.SETTINGTXTTime;
+       Indy.Request.Referer := RefURL;
+       Screen.Cursor := crHourGlass;
+       settingBody := TStringList.Create;
+       try
+               StatusBar.Panels[0].Text := 'SETTING.TXT\83_\83E\83\93\83\8d\81[\83h\92\86';
+               try
+                       settingBody.Text := Indy.Get(URL);
+                       if( Indy.ResponseCode = 200 ) then begin
+                               settingBody.SaveToFile(tmpBoard.GetSETTINGTXTFileName);
+                               tmpBoard.SETTINGTXTTime := Indy.Response.LastModified;
+                               tmpBoard.IsSETTINGTXT := true;
+                               tmpBoard.TitlePictureURL := GetTitlePictureURL(settingBody, tmpBoard);
+                               tmpBoard.Modified := true;
+                               StatusBar.Panels[0].Text := 'SETTING.TXT\8eæ\93¾\8a®\97¹(' + IntToStr(Indy.ResponseCode) + ')';
+                       end;
+               except
+                       on E: EIdException do begin
+                               if( AnsiPos('304', E.Message) > 0 ) then
+                                       StatusBar.Panels[0].Text := 'SETTING.TXT\8dX\90V\96³\82µ(' + IntToStr(Indy.ResponseCode) + ')'
+                               else
+                                       StatusBar.Panels[0].Text := 'SETTING.TXT\8eæ\93¾\83G\83\89\81[(' + IntToStr(Indy.ResponseCode) + ')';
+                       end;
+               end;
+       finally
+               settingBody.Free;
+               Screen.Cursor := crDefault;
+       end;
+       ShowBoardInformation(tmpBoard, BoardInformationMemo);
+end;
+
+procedure TEditorForm.ShowBoardInformation(ABoard: TBoard; AMemo: TMemo);
+var
+       body: TStringList;
+begin
+       AMemo.Clear;
+       AMemo.Lines.Add('[SETTING.TXT]');
+       if ABoard.IsSETTINGTXT then begin
+               if FileExists(ABoard.GetSETTINGTXTFileName)  then begin
+                       AMemo.Lines.Add(DateTimeToStr(ABoard.SETTINGTXTTime) + ' \8dX\90V');
+                       body := TStringList.Create;
+                       try
+                               body.LoadFromFile(ABoard.GetSETTINGTXTFileName);
+                               AMemo.Lines.AddStrings(body);
+                       finally
+                               body.Free;
+                       end;
+               end else begin
+                       ABoard.IsSETTINGTXT := false;
+                       ABoard.SETTINGTXTTime := ZERO_DATE;
+                       AMemo.Lines.Add('Local\82É\95Û\91\82³\82ê\82½SETTING.TXT\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ');
+                       AMemo.Lines.Add('\83\81\83j\83\85\81[\82æ\82è\8dÄ\8eæ\93¾\82µ\82Ä\82­\82¾\82³\82¢\81B');
+               end;
        end else begin
-                       ShowMessage('\8eæ\93¾\90¬\8c÷' + #13#10 + Settingtxt);
-        end;
+               AMemo.Lines.Add('SETTING.TXT\82ð\8eæ\93¾\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B');
+               AMemo.Lines.Add('\83\81\83j\83\85\81[\82æ\82è\8eæ\93¾\82µ\82Ä\82­\82¾\82³\82¢\81B');
+       end;
+end;
+function TEditorForm.GetTitlePictureURL(body: TStringList; ABoard: TBoard): string;
+//BBS_TITLE_PICTURE=
+//BBS_FIGUREHEAD=
+var
+       i: Integer;
+       tmp: string;
+begin
+       Result := '';
+       for i := 0 to body.Count - 1 do begin
+               if (AnsiPos('BBS_TITLE_PICTURE=', body[i]) > 0) or
+                  (AnsiPos('BBS_FIGUREHEAD=', body[i]) > 0) then begin
+                       tmp := body[i];
+                       Delete(tmp, 1, AnsiPos('=', tmp));
+                       if AnsiPos('../', tmp) > 0 then begin
+                               tmp := CustomStringReplace(tmp, '../', GikoSys.UrlToServer(ABoard.URL));
+                       end;
+                       Result := tmp;
+                       Exit;
+               end;
+       end;
+end;
+
+procedure TEditorForm.GetTitlePictureActionUpdate(Sender: TObject);
+begin
+       if FThreadItem = nil then
+               GetTitlePictureAction.Enabled :=  FBoard.IsSETTINGTXT
+       else
+               GetTitlePictureAction.Enabled :=  FThreadItem.ParentBoard.IsSETTINGTXT;
+
 end;
 
-procedure TEditorForm.HEADTXT1Click(Sender: TObject);
+procedure TEditorForm.GetTitlePictureActionExecute(Sender: TObject);
 var
-        RefURL, RuleURL, RuleTxt, FileName, FilePath, LocalHeadUpdate,
-        ServerHeadUpdate: String;
-        ini: TMemIniFile;
-begin
-        FileName := FileName + FOLDER_INI_FILENAME;
-       ini := TMemIniFile.Create(FileName);
-
-        RefURL := GikoSys.UrlToServer(FBoard.URL)
-               + GikoSys.UrlToID(FBoard.URL)
-               + '/';
-       //RefURL\82ð\8c³\82ÉSETTING.TXT\83A\83h\83\8c\83X\8ew\92è
-       RuleURL := RefURL
-                + 'HEAD.TXT';
-
-        try
-               LocalHeadUpdate := ini.ReadString('Rule', 'HEADUpdate', '0');
-               RuleTxt := ini.ReadString('Rule', 'HEAD.TXT', '');
-        finally
-                ini.Free;
-        end;
+       memStream: TMemoryStream;
+       tmpBoard: TBoard;
+begin
+       InitIdHTTP(Indy);
+       memStream := TMemoryStream.Create;
+       try
+               if FThreadItem = nil then
+                       tmpBoard := FBoard
+               else
+                       tmpBoard := FThreadItem.ParentBoard;
+
+               Indy.Request.Referer := tmpBoard.URL;
+               if      tmpBoard.TitlePictureURL <> '' then begin
+                       StatusBar.Panels[0].Text := '\94Â\83g\83b\83v\89æ\91\9c\83_\83E\83\93\83\8d\81[\83h\92\86';
+                       Screen.Cursor := crHourGlass;
+                       try
+                               Indy.Get(tmpBoard.TitlePictureURL, memStream);
+                               if Indy.ResponseCode = 200 then begin
+                                       memStream.SaveToFile(tmpBoard.GetTitlePictureFileName);
+                                       ShowTitlePicture();
+                                       tmpBoard.Modified := true;
+                               end;
+                       except
+                       end;
+               end;
+       finally
+               Screen.Cursor := crDefault;
+               StatusBar.Panels[0].Text := '\94Â\83g\83b\83v\89æ\91\9c (' + IntToStr(Indy.ResponseCode) + ')';
+               memStream.Free;
+       end;
 
-        if LocalHeadUpdate = '0' then begin
-                RuleTxt := Indy.Get(RuleURL);
-               if Length( FilePath ) > 0 then
-                       FileName := ExtractFilePath( FilePath )
-               else
-                       FileName := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
-                                                               + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM;
-
-                try
-                        ini.WriteString('Rule', 'HEAD.TXT', RuleTxt);
-                        ini.WriteString('Rule', 'HEADUpdate', DateTimeToStr(Date));
-
-                finally
-                        ini.Free;
-                end;
+end;
+procedure TEditorForm.ShowTitlePicture();
+var
+       tmpBoard: TBoard;
+       s: String;
+begin
+       if FThreadItem = nil then
+               tmpBoard := FBoard
+       else
+               tmpBoard := FThreadItem.ParentBoard;
+
+       if FileExists(tmpBoard.GetTitlePictureFileName) then begin
+               TitlePictureBrowser.Navigate(tmpBoard.GetTitlePictureFileName);
+       end else begin
+               s := '\94Â\83g\83b\83v\89æ\91\9c\96¢\8eæ\93¾\82Å\82·\81B<br>\83\81\83j\83\85\81[\82æ\82è\8eæ\93¾\82µ\82Ä\82­\82¾\82³\82¢\81B';
+               SetContent(s, TitlePictureBrowser);
+       end;
+end;
+
+function TEditorForm.GetFusianaName(body: TStringList; ABoard: TBoard): String;
+var
+       i: Integer;
+       tmp: string;
+begin
+       for i := 0 to body.Count - 1 do begin
+               if (AnsiPos('BBS_NONAME_NAME=', body[i]) > 0) then begin
+                       tmp := body[i];
+                       Delete(tmp, 1, AnsiPos('=', tmp));
+                       Result := tmp;
+                       Exit;
+               end;
+       end;
+end;
+
+procedure TEditorForm.GetHeadTXTActionExecute(Sender: TObject);
+var
+       URL, RefURL: string;
+       settingBody: TStringList;
+       tmpBoard: TBoard;
+        wDoc, WTex: OLEVariant;
+begin
+       InitIdHTTP(Indy);
+       if FThreadItem = nil then
+               tmpBoard := FBoard
+       else
+               tmpBoard := FThreadItem.ParentBoard;
+
+       if tmpBoard = nil then Exit;
+
+       RefURL  := tmpBoard.URL;
+       if RefURL[Length(RefURL)] <> '/' then
+               URL     := RefURL + '/' + 'head.txt'
+       else
+               URL     := RefURL + 'head.txt';
+
+       if FileExists(tmpBoard.GETHEADTXTFileName) then
+               Indy.Request.LastModified := tmpBoard.HEADTXTTime
+       else
+               Indy.Request.LastModified := ZERO_DATE;
+
+       Indy.Request.Referer := RefURL;
+       Screen.Cursor := crHourGlass;
+       settingBody := TStringList.Create;
+       try
+               StatusBar.Panels[0].Text := 'head.txt\83_\83E\83\93\83\8d\81[\83h\92\86';
+               try
+                       settingBody.Text := Indy.Get(URL);
+                       if( Indy.ResponseCode = 200 ) then begin
+                               settingBody.Insert(0, '<HTML lang="ja"><HEAD>');
+                               settingBody.Insert(1, '<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">');
+                               settingBody.Insert(2, '<TITLE>' + tmpBoard.Title + '</TITLE>');
+                               settingBody.Insert(3, '<base href="' + RefURL + '"></HEAD><BODY>');
+                               settingBody.Add('</BODY></HTML>');
+                               settingBody.SaveToFile(tmpBoard.GETHEADTXTFileName);
+                               tmpBoard.HEADTXTTime := Indy.Response.LastModified;
+                               tmpBoard.IsHEADTXT := true;
+                               tmpBoard.Modified := true;
+                               StatusBar.Panels[0].Text := 'head.txt\8eæ\93¾\8a®\97¹(' + IntToStr(Indy.ResponseCode) + ')';
+                       end;
+               except
+                       on E: EIdException do begin
+                               if( AnsiPos('304', E.Message) > 0 ) then
+                                       StatusBar.Panels[0].Text := 'head.txt\8dX\90V\96³\82µ(' + IntToStr(Indy.ResponseCode) + ')'
+                               else
+                                       StatusBar.Panels[0].Text := 'head.txt\8eæ\93¾\83G\83\89\81[(' + IntToStr(Indy.ResponseCode) + ')';
+                       end;
+               end;
+       finally
+               settingBody.Free;
+               Screen.Cursor := crDefault;
+       end;
+       if tmpBoard.IsHEADTXT then begin
+                WebBrowser1.Navigate(tmpBoard.GETHEADTXTFileName);
+                wDoc := WebBrowser1.Document;
+                wTex := wDoc.body.createTextRange;
+                Memo1.Text := wTex.text;
         end;
 
-        //if HEADUpdate = DateTimeToStr(Date) then begin
-                RefURL := GikoSys.UrlToServer(FBoard.URL)
-                       + GikoSys.UrlToID(FBoard.URL)
-                       + '/';
-               //RefURL\82ð\8c³\82ÉSETTING.TXT\83A\83h\83\8c\83X\8ew\92è
-               RuleURL := RefURL
-                       + 'HEAD.TXT';
-                RuleTxt := Indy.Get(RuleURL);
-               if Length( FilePath ) > 0 then
-                       FileName := ExtractFilePath( FilePath )
-               else
-                       FileName := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
-                                                               + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM;
-
-                try
-                        ini.WriteString('Rule', 'HEAD.TXT', RuleTxt);
-                        ini.WriteString('Rule', 'HEADUpdate', DateTimeToStr(Date));
-
-                finally
-                        ini.Free;
-                end;
-                ShowMessage('\8eæ\93¾\90¬\8c÷' + #13#10 + RuleTxt);
-
-                if RuleTxt = '' then begin
-                       ShowMessage('\8eæ\93¾\8e¸\94s');
-                       Exit;
-                end else
-                ShowMessage('\8eæ\93¾\90¬\8c÷' + #13#10 + RuleTxt);
-        //end;
 end;
 
 end.
-