X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=Favorite.pas;h=2bca35da50f997a1a55e060dc0715249dcc4efb6;hb=refs%2Fheads%2FBb62;hp=adc00276b7442a6d0883b7db31c47dccfc97b4a6;hpb=67c3619f5e15c43d39d3e98f204e37395cee7b3a;p=gikonavigoeson%2Fgikonavi.git diff --git a/Favorite.pas b/Favorite.pas index adc0027..2bca35d 100644 --- a/Favorite.pas +++ b/Favorite.pas @@ -4,83 +4,81 @@ interface uses Messages, SysUtils, Classes, Contnrs, ComCtrls, {HttpApp,} YofUtils, - GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc, BoardGroup, windows, - MojuUtils; + GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc, BoardGroup, windows; {SAX, SAXHelpers, SAXComps, SAXKW;} type TFavoriteFolder = class end; - TFavoriteBoardItem = class + TFavoriteItem = class(TObject) private - FItem : TBoard; FURL : string; FTitle : string; + public + function GetItemTitle : string; virtual;abstract; + property URL : string read FURL write FURL; // Item ‚ªŽæ“¾‚Å‚«‚È‚­‚Ä‚à URL ‚͏í‚É•ÛŽ‚³‚ê‚é + property Title : string read FTitle write FTitle; + end; + TFavoriteBoardItem = class(TFavoriteItem) + private + FItem : TBoard; function GetItem : TBoard; public constructor Create( inURL : string; inTitle : string = ''; inItem : TBoard = nil ); constructor CreateWithItem( inItem : TBoard ); - destructor Destory; + destructor Destory; + function GetItemTitle : string; override; property Item : TBoard read GetItem write FItem; - property URL : string read FURL write FURL; // Item ‚ªŽæ“¾‚Å‚«‚È‚­‚Ä‚à URL ‚͏í‚É•ÛŽ‚³‚ê‚é - property Title : string read FTitle write FTitle; end; - TFavoriteThreadItem = class + TFavoriteThreadItem = class(TFavoriteItem) private FItem : TThreadItem; - FURL : string; - FTitle : string; function GetItem : TThreadItem; public constructor Create( inURL : string; inTitle : string = ''; inItem : TThreadItem = nil ); constructor CreateWithItem( inItem : TThreadItem ); - destructor Destory; + destructor Destory; + function GetItemTitle : string; override; property Item : TThreadItem read GetItem write FItem; - property URL : string read FURL write FURL; // Item ‚ªŽæ“¾‚Å‚«‚È‚­‚Ä‚à URL ‚͏í‚É•ÛŽ‚³‚ê‚é - property Title : string read FTitle write FTitle; end; TFavoriteDM = class(TDataModule) - procedure DataModuleDestroy(Sender: TObject); private { Private éŒ¾ } - FStack: TStack; + FAbEnd: Boolean; FTreeView: TTreeView; - - procedure ReadNode(Node: IXMLNode); + FModified: boolean; + procedure ReadNode(Node: IXMLNode; Stack: TStack; TreeView: TTreeView); procedure AddSaveString(Node: TTreeNode; SaveList: TStringList); -// procedure AddSaveString(Node: TTreeNode; XMLNode: IXMLNode); -// procedure SAXStartDocument(Sender: TObject); -// procedure SAXEndDocument(Sender: TObject); -// procedure SAXStartElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString; const Atts: IAttributes); -// procedure SAXEndElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString); -// procedure SAXCharacters(Sender: TObject; const PCh: SAXString); public { Public éŒ¾ } - procedure Clear; - function GetFavoriteFilePath() : String; - function SaveFavoriteFile(FileName: String) : Boolean; + procedure Clear; + function GetFavoriteFilePath() : String; + function SaveFavoriteFile(FileName: String) : Boolean; procedure SetFavTreeView(TreeView: TTreeView); procedure ReadFavorite; procedure WriteFavorite; - procedure URLReplace(oldURLs: TStringList; newURLs: TStringList); + procedure URLReplace(oldURLs: TStringList; newURLs: TStringList); property TreeView: TTreeView read FTreeView; + property Modified: boolean read FModified write FModified; + property AbEnd: Boolean read FAbEnd write FAbEnd; end; var FavoriteDM: TFavoriteDM; const FAVORITE_LINK_NAME = 'ƒŠƒ“ƒN'; + FAVORITE_FILE_NAME = 'Favorite.xml'; implementation -uses ExternalBoardManager, ExternalBoardPlugInMain; +uses ExternalBoardManager, ExternalBoardPlugInMain, MojuUtils; const FAVORITE_ROOT_NAME = '‚¨‹C‚É“ü‚è'; - FAVORITE_FILE_NAME = 'Favorite.xml'; + {$R *.dfm} @@ -110,15 +108,33 @@ end; destructor TFavoriteBoardItem.Destory; begin if FItem <> nil then - FItem.Free; - inherited; + FItem.Free; + inherited; +end; +//! •ÛŽ‚µ‚Ä‚¢‚锂̃^ƒCƒgƒ‹‚ð•Ô‚· +function TFavoriteBoardItem.GetItemTitle : string; +begin + Result := ''; + //ˆê“x‚à”‚ðŠJ‚¢‚Ä‚¢‚È‚¢‚Æ‚«i‹N“®Žž‚ɃLƒƒƒrƒlƒbƒg‚ð‚¨‹C‚É“ü‚è‚Æ‚©j + //‚Ì‚Æ‚«‚ÉFItem‚ªnil‚È‚Ì‚Å‚»‚Ì‚Æ‚«‚ׂ͂Á‚ÆŒŸõ + if FItem = nil then begin + FItem := BBSsFindBoardFromURL(URL); + end; + if FItem <> nil then begin + try + if not FItem.IsThreadDatRead then begin + GikoSys.ReadSubjectFile(FItem); + end; + except + end; + Result := FItem.Title; + end; end; function TFavoriteBoardItem.GetItem : TBoard; var protocol, host, path, document, port, bookmark : string; - BBSID{, BBSKey} : string; - tmpURL : string; -// category : TCategory; + BBSID : string; + tmpURL : string; begin if FItem = nil then begin @@ -140,7 +156,7 @@ begin end; end; - Result := FItem; + Result := FItem; end; @@ -152,8 +168,8 @@ constructor TFavoriteThreadItem.Create( begin inherited Create; - URL := inURL; + Title := inTitle; Item := inItem; @@ -173,6 +189,17 @@ begin FItem.Free; inherited; end; +//! •ÛŽ‚µ‚Ä‚¢‚éƒXƒŒ‚̃^ƒCƒgƒ‹‚ð•Ô‚· +function TFavoriteThreadItem.GetItemTitle : string; +begin + Result := ''; + if FItem = nil then begin + FItem := BBSsFindThreadFromURL(URL); + end; + if FItem <> nil then begin + Result := FItem.Title; + end; +end; function TFavoriteThreadItem.GetItem : TThreadItem; var @@ -219,7 +246,7 @@ begin end; if FItem = nil then begin - FItem := TThreadItem.Create( board.BoardPlugIn, browsableURL ); + FItem := TThreadItem.Create( board.BoardPlugIn, board, browsableURL ); FItem.Title := Title; board.Add( FItem ); @@ -230,31 +257,21 @@ begin end; -procedure TFavoriteDM.DataModuleDestroy(Sender: TObject); -//var -// i: Integer; -begin -{ TreeView.Items.BeginUpdate; - for i := TreeView.Items.Count - 1 downto 0 do begin - // if TObject(TreeView.Items[i].Data) <> nil then - // TObject(TreeView.Items[i].Data).Free; - end; - TreeView.Items.Clear; - TreeView.Items.EndUpdate; -} //TreeView.Free; -end; procedure TFavoriteDM.Clear; var - i: Integer; + Node : TTreeNode; begin - TreeView.Items.BeginUpdate; - for i := TreeView.Items.Count - 1 downto 0 do begin - if TObject(TreeView.Items[i].Data) <> nil then - TObject(TreeView.Items[i].Data).Free; + TreeView.Items.BeginUpdate; + Node := TreeView.Items.GetFirstNode; + while Node <> nil do begin + if TObject(Node.Data) <> nil then + TObject(Node.Data).Free; + Node := Node.GetNext; end; - TreeView.Items.Clear; - TreeView.Items.EndUpdate; - //TreeView.Free; + TreeView.Items.Clear; + TreeView.Items.EndUpdate; + + FavoriteDM.Modified := true; end; procedure TFavoriteDM.SetFavTreeView(TreeView: TTreeView); @@ -271,12 +288,15 @@ var i: Integer; FavFolder: TFavoriteFolder; LinkExists: Boolean; + Stack: TStack; begin - + FABend := False; + + FavoriteDM.Modified := true; FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME; FavFolder := TFavoriteFolder.Create; - Node := FTreeView.Items.AddChildObject(nil, FAVORITE_ROOT_NAME, FavFolder); + Node := FTreeView.Items.AddChildObjectFirst(nil, FAVORITE_ROOT_NAME, FavFolder); Node.ImageIndex := 14; Node.SelectedIndex := 14; @@ -287,13 +307,13 @@ begin LoadXMLDocument(FileName, XMLDoc); XMLNode := XMLDoc.DocumentElement; - FStack := TStack.Create; + Stack := TStack.Create; try - FStack.Push(Node); + Stack.Push(Node); LinkExists := False; if XMLNode.NodeName = 'favorite' then begin - for i := 0 to XMLNode.ChildNodes.Count - 1 do begin - ReadNode(XMLNode.ChildNodes[i]); + for i := XMLNode.ChildNodes.Count - 1 downto 0 do begin + ReadNode(XMLNode.ChildNodes[i], Stack, FTreeView); if (XMLNode.ChildNodes[i].NodeName = 'folder') and (XMLNode.ChildNodes[i].Attributes['title'] = FAVORITE_LINK_NAME) then begin LinkExists := True; @@ -302,41 +322,25 @@ begin end; if not LinkExists then begin FavFolder := TFavoriteFolder.Create; - Node := FTreeView.Items.AddChildObject(Node, FAVORITE_LINK_NAME, FavFolder); + Node := FTreeView.Items.AddChildObjectFirst(Node, FAVORITE_LINK_NAME, FavFolder); Node.ImageIndex := 14; Node.SelectedIndex := 14; end; + finally - FStack.Free; + Stack.Free; XMLDoc.Free; end; except + on e : Exception do begin + FABend := True; + end; end; end; -{ - FavFolder := TFavoriteFolder.Create; - Node := FTreeView.Items.AddChildObject(nil, FAVORITE_ROOT_NAME, FavFolder); - Node.ImageIndex := 12; - Node.SelectedIndex := 13; - - FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME; - if not FileExists(FileName) then - Exit; - - FavSAXHandler.OnStartDocument := SAXStartDocument; - FavSAXHandler.OnEndDocument := SAXEndDocument; - FavSAXHandler.OnStartElement := SAXStartElement; - FavSAXHandler.OnStartElement := SAXStartElement; - FavSAXHandler.OnEndElement := SAXEndElement; - FavSAXHandler.OnCharacters := SAXCharacters; - - FavSAXReader.Vendor := 'Keith Wood'; - FavSAXReader.URL := FileName; - FavSAXReader.Parse;} end; -procedure TFavoriteDM.ReadNode(Node: IXMLNode); +procedure TFavoriteDM.ReadNode(Node: IXMLNode; Stack: TStack; TreeView: TTreeView); var i: Integer; @@ -349,23 +353,25 @@ var threadItem : TThreadItem; begin if Node.NodeName = 'folder' then begin - ParentNode := FStack.Peek; + CurrentNode := nil; + ParentNode := Stack.Peek; if TObject(ParentNode.Data) is TFavoriteFolder then begin FavFolder := TFavoriteFolder.Create; - CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavFolder); + CurrentNode := TreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavFolder); CurrentNode.ImageIndex := 14; CurrentNode.SelectedIndex := 14; - CurrentNode.Expanded := Node.Attributes[ 'expanded' ] = 'true'; - FStack.Push(CurrentNode); + Stack.Push(CurrentNode); end; - for i := 0 to Node.ChildNodes.Count - 1 do begin - ReadNode(Node.ChildNodes[i]); + for i := Node.ChildNodes.Count - 1 downto 0 do begin + ReadNode(Node.ChildNodes[i], Stack, TreeView); end; - if FStack.Count <> 0 then - FStack.Pop; + if CurrentNode <> nil then + CurrentNode.Expanded := Node.Attributes[ 'expanded' ] = 'true'; + if Stack.Count <> 0 then + Stack.Pop; end else if Node.NodeName = 'favitem' then begin try - ParentNode := FStack.Peek; + ParentNode := Stack.Peek; if TObject(ParentNode.Data) is TFavoriteFolder then begin if Node.Attributes['favtype'] = 'board' then begin FavBoard := nil; @@ -374,12 +380,12 @@ begin board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] ); if board <> nil then FavBoard := TFavoriteBoardItem.Create( - board.URL, Node.Attributes[ 'title' ], board ); + board.URL, MojuUtils.UnSanitize(Node.Attributes[ 'title' ]), board ); end else begin FavBoard := TFavoriteBoardItem.Create( - Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], nil ); + Node.Attributes[ 'url' ], MojuUtils.UnSanitize(Node.Attributes[ 'title' ]), nil ); end; - CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavBoard); + CurrentNode := TreeView.Items.AddChildObjectFirst(ParentNode, UnSanitize(Node.Attributes['title']), FavBoard); CurrentNode.ImageIndex := 15; CurrentNode.SelectedIndex := 15; end else if Node.Attributes['favtype'] = 'thread' then begin @@ -395,18 +401,19 @@ begin if threadItem = nil then begin threadItem := TThreadItem.Create( board.BoardPlugIn, + board, GikoSys.Get2chBoard2ThreadURL( board, ChangeFileExt( Node.Attributes[ 'thread' ], '' ) ) ); - threadItem.Title := Node.Attributes[ 'title' ]; + threadItem.Title := UnSanitize(Node.Attributes[ 'title' ]); board.Add( threadItem ); end; FavThread := TFavoriteThreadItem.Create( - threadItem.URL, Node.Attributes[ 'title' ], threadItem ); + threadItem.URL, UnSanitize(Node.Attributes[ 'title' ]), threadItem ); threadItem.Free; end else begin FavThread := TFavoriteThreadItem.Create( - Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], nil ); + Node.Attributes[ 'url' ], UnSanitize(Node.Attributes[ 'title' ]), nil ); end; - CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavThread); + CurrentNode := TreeView.Items.AddChildObjectFirst(ParentNode, UnSanitize(Node.Attributes['title']), FavThread); CurrentNode.ImageIndex := 16; CurrentNode.SelectedIndex := 16; end; @@ -418,182 +425,88 @@ begin end; procedure TFavoriteDM.WriteFavorite; -{ -var - FileName: string; -// SaveList: TStringList; -// i: Integer; -// Count: Integer; - - XMLDoc: IXMLDocument; - XMLNode: IXMLNode; -// FavoNode: IXMLNode; -begin - XMLDoc := NewXMLDocument; - XMLDoc.Encoding := 'Shift_JIS'; - XMLDoc.StandAlone := 'yes'; - XMLNode := XMLDoc.AddChild('favorite'); - FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME; - AddSaveString(TreeView.Items.GetFirstNode, XMLNode); - XMLDoc.SaveToFile(FileName); -} var - FileName: string; + FileName, tmpFileName, bakFileName: string; SaveList: TStringList; + Buffer: array[0..MAX_PATH] of Char; // ƒoƒbƒtƒ@ + FileRep : Boolean; begin + FavoriteDM.Modified := true; FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME; SaveList := TStringList.Create; - try - SaveList.Add(''); - SaveList.Add(''); - AddSaveString(TreeView.Items.GetFirstNode, SaveList); - SaveList.Add(''); - SaveList.SaveToFile(FileName); - finally - SaveList.Free; - end; -end; - -{ -procedure TFavoriteDM.AddSaveString(Node: TTreeNode; XMLNode: IXMLNode); -var - i: Integer; -// s: string; - FavBoard: TFavoriteBoardItem; - FavThread: TFavoriteThreadItem; - FavNode: IXMLNode; -begin - for i := 0 to Node.Count - 1 do begin - if TObject(Node.Item[i].Data) is TFavoriteFolder then begin - FavNode := XMLNode.AddChild('folder'); - FavNode.Attributes['title'] := Node.Item[i].Text; - AddSaveString(Node.Item[i], FavNode); - end else if TObject(Node.Item[i].Data) is TFavoriteBoardItem then begin - FavBoard := TFavoriteBoardItem(Node.Item[i].Data); - FavNode := XMLNode.AddChild('favitem'); - FavNode.Attributes['type'] := '2ch'; - FavNode.Attributes['favtype'] := 'board'; - FavNode.Attributes['bbs'] := FavBoard.BBSID; - FavNode.Attributes['title'] := Node.Item[i].Text; - FavNode.Attributes['boardname'] := FavBoard.BoardName; - end else if TObject(Node.Item[i].Data) is TFavoriteThreadItem then begin - FavThread := TFavoriteThreadItem(Node.Item[i].Data); - FavNode := XMLNode.AddChild('favitem'); - FavNode.Attributes['type'] := '2ch'; - FavNode.Attributes['favtype'] := 'thread'; - FavNode.Attributes['bbs'] := FavThread.BBSID; - FavNode.Attributes['thread'] := FavThread.ThreadID; - FavNode.Attributes['title'] := Node.Item[i].Text; - FavNode.Attributes['threadname'] := FavThread.ThreadName; - end; - end; + tmpFileName := ''; + // ‘‚«ž‚Ý—pˆêŽžƒtƒ@ƒCƒ‹Žæ“¾ + if GetTempFileName(PChar(GikoSys.GetConfigDir), PChar('fav'), 0, Buffer) <> 0 then begin + tmpFileName := Buffer; + try + try + SaveList.Add(''); + SaveList.Add(''); + AddSaveString(TreeView.Items.GetFirstNode.getFirstChild, SaveList); + SaveList.Add(''); + // ˆêŽžƒtƒ@ƒCƒ‹‚Æ‚µ‚Ä•Û‘¶ + SaveList.SaveToFile(tmpFileName); + FileRep := True; + // ‘O‚̃tƒ@ƒCƒ‹‚ðˆÚ“®‚·‚é + if FileExists(FileName) then begin + bakFileName := GikoSys.GetConfigDir + '~' + FAVORITE_FILE_NAME; + if FileExists(bakFileName) then begin + FileRep := SysUtils.DeleteFile(bakFileName); //SysUtils.‚ð‚‚¯‚È‚¢‚ÆWinAPI‚Æ‹æ•Ê‚Å‚«‚È‚¢‚Ì‚Å + end; + if FileRep then begin + FileRep := RenameFile(FileName, bakFileName); + end; + end; + // ³‹K‚̃tƒ@ƒCƒ‹–¼‚ɃŠƒl[ƒ€‚·‚é + if FileRep then begin + FileRep := RenameFile(tmpFileName, FileName); + end; + except + end; + finally + SaveList.Free; + end; + end; end; -} procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList); var - i: Integer; s: string; FavBoard: TFavoriteBoardItem; FavThread: TFavoriteThreadItem; + data : Pointer; begin - for i := 0 to Node.Count - 1 do begin - if TObject(Node.Item[i].Data) is TFavoriteFolder then begin - if Node.Item[ i ].Expanded then - s := Format('', [HtmlEncode(Node.Item[i].Text)]) + while Node <> nil do begin + data := Node.Data; + if TObject(data) is TFavoriteFolder then begin + if Node.Expanded then + s := Format('', [HtmlEncode(Node.Text)]) else - s := Format('', [HtmlEncode(Node.Item[i].Text)]); + s := Format('', [HtmlEncode(Node.Text)]); SaveList.Add(s); - AddSaveString(Node.Item[i], SaveList); + AddSaveString(Node.getFirstChild, SaveList); SaveList.Add(''); - end else if TObject(Node.Item[i].Data) is TFavoriteBoardItem then begin - FavBoard := TFavoriteBoardItem(Node.Item[i].Data); + end else if TObject(data) is TFavoriteBoardItem then begin + FavBoard := TFavoriteBoardItem(data); s := Format('', - [HtmlEncode( FavBoard.URL ), HtmlEncode(Node.Item[ i ].Text)]); + [HtmlEncode( FavBoard.URL ), HtmlEncode(MojuUtils.Sanitize(Node.Text))]); SaveList.Add(s); - end else if TObject(Node.Item[i].Data) is TFavoriteThreadItem then begin - FavThread := TFavoriteThreadItem(Node.Item[i].Data); + end else if TObject(data) is TFavoriteThreadItem then begin + FavThread := TFavoriteThreadItem(data); s := Format('', - [HtmlEncode( FavThread.URL ), HtmlEncode(Node.Item[ i ].Text)]); + [HtmlEncode( FavThread.URL ), HtmlEncode(MojuUtils.Sanitize(Node.Text))]); SaveList.Add(s); end; + Node := Node.getNextSibling; end; end; -{ -procedure TFavoriteDM.SAXStartDocument(Sender: TObject); -begin - FStack := TStack.Create; - FStack.Push(FTreeView.Items.GetFirstNode); -end; - -procedure TFavoriteDM.SAXEndDocument(Sender: TObject); -begin - FStack.Free; -end; - -procedure TFavoriteDM.SAXStartElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString; - const Atts: IAttributes); -var - FavType: string; - ParentNode: TTreeNode; - CurrentNode: TTreeNode; - FavFolder: TFavoriteFolder; - FavBoard: TFavoriteBoardItem; - FavThread: TFavoriteThreadItem; -begin - if QName = 'folder' then begin - ParentNode := FStack.Peek; - if TObject(ParentNode.Data) is TFavoriteFolder then begin - FavFolder := TFavoriteFolder.Create; - CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavFolder); - CurrentNode.ImageIndex := 12; - CurrentNode.SelectedIndex := 13; - FStack.Push(CurrentNode); - end; - end else if QName = 'favitem' then begin - ParentNode := FStack.Peek; - if TObject(ParentNode.Data) is TFavoriteFolder then begin - FavType := Atts.getValue('favtype'); - if FavType = 'board' then begin - FavBoard := TFavoriteBoardItem.Create; - FavBoard.BBSID := Atts.getValue('bbs'); - FavBoard.BoardName := Atts.getValue('boardname'); - CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavBoard); - CurrentNode.ImageIndex := 14; - CurrentNode.SelectedIndex := 15; - end else if FavType = 'thread' then begin - FavThread := TFavoriteThreadItem.Create; - FavThread.BBSID := Atts.getValue('bbs'); - FavThread.ThreadID := Atts.getValue('thread'); - FavThread.ThreadName := Atts.getValue('threadname'); - CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavThread); - CurrentNode.ImageIndex := 16; - CurrentNode.SelectedIndex := 17; - end; - end; - end; -end; - -procedure TFavoriteDM.SAXEndElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString); -begin - if QName = 'folder' then begin - if FStack.Count <> 0 then - FStack.Pop; - end; -end; - -procedure TFavoriteDM.SAXCharacters(Sender: TObject; const PCh: SAXString); -begin -// -end; -} function TFavoriteDM.SaveFavoriteFile(FileName: String) : Boolean; var FavoriteFilePath: string; tempStringList: TStringList; begin - + WriteFavorite; FavoriteFilePath := GikoSys.GetConfigDir + FAVORITE_FILE_NAME; if FileExists( FavoriteFilePath ) then begin @@ -612,67 +525,58 @@ end; procedure TFavoriteDM.URLReplace(oldURLs: TStringList; newURLs: TStringList); var - FavoriteFilePath: string; - tempStringList: TStringList; - i: Integer; - j: Integer; - tmpURL: string; + i : Integer; + tmpURL: string; oldHost: string; oldBoardName: string; newHost: string; newBoardName: string; - tempString: string; + tempString: string; + favBoard : TFavoriteBoardItem; + favThread : TFavoriteThreadItem; + favorites : TTreeNodes; + Node : TTreeNode; begin - FavoriteFilePath := GikoSys.GetConfigDir + FAVORITE_FILE_NAME; - - if FileExists( FavoriteFilePath ) then begin - tempStringList := TStringList.Create; + // –Ê“|‚¾‚¯‚Çthread‚Í‚»‚ꂼ‚êURL‚ðƒ`ƒFƒbƒN‚µ‚È‚ª‚ç‚â‚Á‚Ä‚©‚È‚«‚á‚¢‚¯‚È‚¢B + favorites := FavoriteDM.FTreeView.Items; + for i := 0 to oldURLs.Count - 1 do begin try - tempStringList.LoadFromFile( FavoriteFilePath ); - if oldURLs.Count = newURLs.Count then begin - //‚±‚ê‚ŁABoard‚Í‘S‚Đ؂è‘Ö‚í‚é - for i := 0 to oldURLs.Count - 1 do begin - try - CustomStringReplace(tempStringList,oldURLs[i],newURLs[i],true); - except - end; - end; - //–Ê“|‚¾‚¯‚Çthread‚Í‚»‚ꂼ‚êURL‚ðƒ`ƒƒƒbƒN‚µ‚È‚ª‚ç‚â‚Á‚Ä‚©‚È‚«‚á‚¢‚¯‚È‚¢B - for i := 0 to oldURLs.Count - 1 do begin - try - tmpURL := Copy(oldURLs[i], 1, Length(oldURLs[i]) -1); - oldHost := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) ); - oldBoardName := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/'; - tmpURL := Copy(newURLs[i], 1, Length(newURLs[i]) -1); - newHost := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) ); - newBoardName := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/'; - - for j := 0 to tempStringList.Count - 1 do begin - try - tempString := tempStringList[j]; - if AnsiPos('favtype="thread"',tempString ) <> 0 then begin - tempString := Copy(tempString, AnsiPos('url="',tempString ) + 5, AnsiPos('" title="',tempString ) -AnsiPos('url="',tempString ) - 5); - if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin - tempString := StringReplace(tempStringList[j], oldHost, newHost,[]); - //tempString := StringReplace(tempString, oldBoardName, newBoardName,[]); - tempStringList[j] := tempString; - end; - end; - except - end; + tmpURL := Copy(oldURLs[i], 1, Length(oldURLs[i]) -1); + oldHost := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) ); + oldBoardName := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/'; + tmpURL := Copy(newURLs[i], 1, Length(newURLs[i]) -1); + newHost := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) ); + newBoardName := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/'; + + Node := favorites.GetFirstNode.getFirstChild; + while Node <> nil do begin + try + if TObject( Node.Data ) is TFavoriteBoardItem then begin + favBoard := TFavoriteBoardItem( Node.Data ); + if favBoard = nil then continue; + tempString := favBoard.URL; + if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin + tempString := StringReplace(tempString, oldHost, newHost,[]); + favBoard.URL := tempString; + end; + end else if TObject( Node.Data ) is TFavoriteThreadItem then begin + favThread := TFavoriteThreadItem( Node.Data ); + if favThread = nil then continue; + tempString := favThread.URL; + if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin + tempString := StringReplace(tempString, oldHost, newHost,[]); + favThread.URL := tempString; end; - except end; - end; - - end; - - tempStringList.SaveToFile( FavoriteFilePath ); - finally - tempStringList.Free; + except + end; + Node := Node.GetNext; + end; + except end; end; + end; function TFavoriteDM.GetFavoriteFilePath() : String;