Develop and Download Open Source Software

Browse CVS Repository

Contents of /gikonavigoeson/gikonavi/Favorite.pas

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.48 - (show annotations) (download) (as text)
Sat Dec 10 06:13:31 2005 UTC (18 years, 4 months ago) by h677
Branch: MAIN
Changes since 1.47: +46 -17 lines
File MIME type: text/x-pascal
リファクタリング中

1 unit Favorite;
2
3 interface
4
5 uses
6 Messages, SysUtils, Classes, Contnrs, ComCtrls, {HttpApp,} YofUtils,
7 GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc, BoardGroup, windows,
8 MojuUtils;
9 {SAX, SAXHelpers, SAXComps, SAXKW;}
10
11 type
12 TFavoriteFolder = class
13 end;
14
15 TFavoriteItem = class(TObject)
16 private
17 FURL : string;
18 FTitle : string;
19 public
20 function GetItemTitle : string; virtual;abstract;
21 property URL : string read FURL write FURL; // Item ?????転?長?鼎???足???? URL ???鱈???徹???????辿
22 property Title : string read FTitle write FTitle;
23 end;
24 TFavoriteBoardItem = class(TFavoriteItem)
25 private
26 FItem : TBoard;
27 function GetItem : TBoard;
28 public
29 constructor Create( inURL : string; inTitle : string = ''; inItem : TBoard = nil );
30 constructor CreateWithItem( inItem : TBoard );
31 destructor Destory;
32 function GetItemTitle : string; override;
33 property Item : TBoard read GetItem write FItem;
34 end;
35
36 TFavoriteThreadItem = class(TFavoriteItem)
37 private
38 FItem : TThreadItem;
39 function GetItem : TThreadItem;
40 public
41 constructor Create( inURL : string; inTitle : string = ''; inItem : TThreadItem = nil );
42 constructor CreateWithItem( inItem : TThreadItem );
43 destructor Destory;
44 function GetItemTitle : string; override;
45 property Item : TThreadItem read GetItem write FItem;
46 end;
47
48 TFavoriteDM = class(TDataModule)
49 procedure DataModuleDestroy(Sender: TObject);
50 private
51 { Private ?辿?転 }
52 FStack: TStack;
53 FTreeView: TTreeView;
54
55 procedure ReadNode(Node: IXMLNode);
56 procedure AddSaveString(Node: TTreeNode; SaveList: TStringList);
57 // procedure AddSaveString(Node: TTreeNode; XMLNode: IXMLNode);
58 // procedure SAXStartDocument(Sender: TObject);
59 // procedure SAXEndDocument(Sender: TObject);
60 // procedure SAXStartElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString; const Atts: IAttributes);
61 // procedure SAXEndElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString);
62 // procedure SAXCharacters(Sender: TObject; const PCh: SAXString);
63 public
64 { Public ?辿?転 }
65 procedure Clear;
66 function GetFavoriteFilePath() : String;
67 function SaveFavoriteFile(FileName: String) : Boolean;
68 procedure SetFavTreeView(TreeView: TTreeView);
69 procedure ReadFavorite;
70 procedure WriteFavorite;
71 procedure URLReplace(oldURLs: TStringList; newURLs: TStringList);
72 property TreeView: TTreeView read FTreeView;
73 end;
74
75 var
76 FavoriteDM: TFavoriteDM;
77 const
78 FAVORITE_LINK_NAME = '?????N';
79
80 implementation
81
82 uses ExternalBoardManager, ExternalBoardPlugInMain;
83
84 const
85 FAVORITE_ROOT_NAME = '?即?C???端??';
86 FAVORITE_FILE_NAME = 'Favorite.xml';
87
88 {$R *.dfm}
89
90 constructor TFavoriteBoardItem.Create(
91 inURL : string;
92 inTitle : string = '';
93 inItem : TBoard = nil
94 );
95 begin
96
97 inherited Create;
98
99 URL := inURL;
100 Title := inTitle;
101 Item := inItem;
102
103 end;
104
105 constructor TFavoriteBoardItem.CreateWithItem(
106 inItem : TBoard
107 );
108 begin
109
110 Create( inItem.URL, inItem.Title, inItem );
111
112 end;
113 destructor TFavoriteBoardItem.Destory;
114 begin
115 if FItem <> nil then
116 FItem.Free;
117 inherited;
118 end;
119 //! ?徹???直?????辿?????^?C?g????????
120 function TFavoriteBoardItem.GetItemTitle : string;
121 begin
122 Result := '';
123 //???x???????J?????????????鼎?i?N?貼?????L???r?l?b?g???即?C???端???????j
124 //?????鼎??FItem??nil?????長?泥?????鼎????????????
125 if FItem = nil then begin
126 FItem := BBSsFindBoardFromURL(URL);
127 end;
128 if FItem <> nil then begin
129 try
130 if not FItem.IsThreadDatRead then begin
131 GikoSys.ReadSubjectFile(FItem);
132 end;
133 except
134 end;
135 Result := FItem.Title;
136 end;
137 end;
138 function TFavoriteBoardItem.GetItem : TBoard;
139 var
140 protocol, host, path, document, port, bookmark : string;
141 BBSID : string;
142 tmpURL : string;
143 begin
144
145 if FItem = nil then begin
146 FItem := BBSsFindBoardFromURL( URL );
147 if FItem = nil then begin
148 tmpURL := URL;
149 GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
150 if GikoSys.Is2chHost( host ) then begin
151 BBSID := GikoSys.URLToID( tmpURL );
152 FItem := BBSs[ 0 ].FindBBSID( BBSID );
153 if FItem <> nil then
154 URL := FItem.URL;
155 end;
156 {
157 // ???????????A???????辿?J?e?S???????????長???直?足?徹?纏
158 FItem := GikoSys.GetUnknownBoard( nil, URL );
159 FItem.Title := Title;
160 }
161 end;
162 end;
163
164 Result := FItem;
165
166 end;
167
168 constructor TFavoriteThreadItem.Create(
169 inURL : string;
170 inTitle : string = '';
171 inItem : TThreadItem = nil
172 );
173 begin
174
175 inherited Create;
176 URL := inURL;
177
178 Title := inTitle;
179 Item := inItem;
180
181 end;
182
183 constructor TFavoriteThreadItem.CreateWithItem(
184 inItem : TThreadItem
185 );
186 begin
187
188 Create( inItem.URL, inItem.Title, inItem );
189
190 end;
191 destructor TFavoriteThreadItem.Destory;
192 begin
193 if FItem <> nil then
194 FItem.Free;
195 inherited;
196 end;
197 //! ?徹???直?????辿?X?????^?C?g????????
198 function TFavoriteThreadItem.GetItemTitle : string;
199 begin
200 Result := '';
201 if FItem = nil then begin
202 FItem := BBSsFindThreadFromURL(URL);
203 end;
204 if FItem <> nil then begin
205 Result := FItem.Title;
206 end;
207 end;
208
209 function TFavoriteThreadItem.GetItem : TThreadItem;
210 var
211 board : TBoard;
212 boardURL : string;
213 browsableURL : string;
214 protocol, host, path, document, port, bookmark : string;
215 BBSID, BBSKey : string;
216 tmpURL : string;
217 begin
218
219 Result := nil;
220 if FItem = nil then begin
221 browsableURL := GikoSys.GetBrowsableThreadURL( URL );
222 boardURL := GikoSys.GetThreadURL2BoardURL( browsableURL );
223 board := BBSsFindBoardFromURL( boardURL );
224
225 if board = nil then begin
226 tmpURL := URL;
227 GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
228 if GikoSys.Is2chHost( host ) then begin
229 GikoSys.Parse2chURL( tmpURL, path, document, BBSID, BBSKey );
230 board := BBSs[ 0 ].FindBBSID( BBSID );
231 end;
232
233 if board = nil then begin
234 Exit;
235 // ???????????A???????辿?J?e?S???????????長???直?足?徹?纏
236 //board := GikoSys.GetUnknownBoard( nil, boardURL )
237 end;
238 end;
239
240 FItem := board.FindThreadFromURL( browsableURL );
241
242 if FItem = nil then begin
243 tmpURL := URL;
244 GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
245 if GikoSys.Is2chHost( host ) then begin
246 GikoSys.Parse2chURL( tmpURL, path, document, BBSID, BBSKey );
247 FItem := BBSs[ 0 ].FindThreadItem( BBSID, BBSKey + '.dat' );
248 if FItem <> nil then
249 URL := FItem.URL;
250 end;
251 end;
252
253 if FItem = nil then begin
254 FItem := TThreadItem.Create( board.BoardPlugIn, board, browsableURL );
255
256 FItem.Title := Title;
257 board.Add( FItem );
258 end;
259 end;
260
261 Result := FItem;
262
263 end;
264
265 procedure TFavoriteDM.DataModuleDestroy(Sender: TObject);
266 //var
267 // i: Integer;
268 begin
269 { TreeView.Items.BeginUpdate;
270 for i := TreeView.Items.Count - 1 downto 0 do begin
271 // if TObject(TreeView.Items[i].Data) <> nil then
272 // TObject(TreeView.Items[i].Data).Free;
273 end;
274 TreeView.Items.Clear;
275 TreeView.Items.EndUpdate;
276 } //TreeView.Free;
277 end;
278 procedure TFavoriteDM.Clear;
279 var
280 Node : TTreeNode;
281 begin
282 TreeView.Items.BeginUpdate;
283 Node := TreeView.Items.GetFirstNode;
284 while Node <> nil do begin
285 if TObject(Node.Data) <> nil then
286 TObject(Node.Data).Free;
287 Node := Node.GetNext;
288 end;
289 TreeView.Items.Clear;
290 TreeView.Items.EndUpdate;
291 //TreeView.Free;
292 end;
293
294 procedure TFavoriteDM.SetFavTreeView(TreeView: TTreeView);
295 begin
296 FTreeView := TreeView;
297 end;
298
299 procedure TFavoriteDM.ReadFavorite;
300 var
301 FileName: string;
302 XMLDoc: IXMLDocument;
303 XMLNode: IXMLNode;
304 Node: TTreeNode;
305 i: Integer;
306 FavFolder: TFavoriteFolder;
307 LinkExists: Boolean;
308 begin
309
310 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
311
312 FavFolder := TFavoriteFolder.Create;
313 Node := FTreeView.Items.AddChildObjectFirst(nil, FAVORITE_ROOT_NAME, FavFolder);
314 Node.ImageIndex := 14;
315 Node.SelectedIndex := 14;
316
317 if FileExists(FileName) then begin
318 try
319 XMLDoc := IXMLDocument.Create;
320 //XMLDoc := LoadXMLDocument(FileName);
321 LoadXMLDocument(FileName, XMLDoc);
322 XMLNode := XMLDoc.DocumentElement;
323
324 FStack := TStack.Create;
325 try
326 FStack.Push(Node);
327 LinkExists := False;
328 if XMLNode.NodeName = 'favorite' then begin
329 for i := XMLNode.ChildNodes.Count - 1 downto 0 do begin
330 ReadNode(XMLNode.ChildNodes[i]);
331 if (XMLNode.ChildNodes[i].NodeName = 'folder') and
332 (XMLNode.ChildNodes[i].Attributes['title'] = FAVORITE_LINK_NAME) then begin
333 LinkExists := True;
334 end;
335 end;
336 end;
337 if not LinkExists then begin
338 FavFolder := TFavoriteFolder.Create;
339 Node := FTreeView.Items.AddChildObjectFirst(Node, FAVORITE_LINK_NAME, FavFolder);
340 Node.ImageIndex := 14;
341 Node.SelectedIndex := 14;
342 end;
343 finally
344 FStack.Free;
345 XMLDoc.Free;
346 end;
347 except
348 end;
349 end;
350
351 {
352 FavFolder := TFavoriteFolder.Create;
353 Node := FTreeView.Items.AddChildObjectFirst(nil, FAVORITE_ROOT_NAME, FavFolder);
354 Node.ImageIndex := 12;
355 Node.SelectedIndex := 13;
356
357 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
358 if not FileExists(FileName) then
359 Exit;
360
361 FavSAXHandler.OnStartDocument := SAXStartDocument;
362 FavSAXHandler.OnEndDocument := SAXEndDocument;
363 FavSAXHandler.OnStartElement := SAXStartElement;
364 FavSAXHandler.OnStartElement := SAXStartElement;
365 FavSAXHandler.OnEndElement := SAXEndElement;
366 FavSAXHandler.OnCharacters := SAXCharacters;
367
368 FavSAXReader.Vendor := 'Keith Wood';
369 FavSAXReader.URL := FileName;
370 FavSAXReader.Parse;}
371 end;
372
373 procedure TFavoriteDM.ReadNode(Node: IXMLNode);
374 var
375 i: Integer;
376
377 ParentNode: TTreeNode;
378 CurrentNode: TTreeNode;
379 FavFolder: TFavoriteFolder;
380 FavBoard: TFavoriteBoardItem;
381 FavThread: TFavoriteThreadItem;
382 board : TBoard;
383 threadItem : TThreadItem;
384 begin
385 if Node.NodeName = 'folder' then begin
386 ParentNode := FStack.Peek;
387 if TObject(ParentNode.Data) is TFavoriteFolder then begin
388 FavFolder := TFavoriteFolder.Create;
389 CurrentNode := FTreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavFolder);
390 CurrentNode.ImageIndex := 14;
391 CurrentNode.SelectedIndex := 14;
392 FStack.Push(CurrentNode);
393 end;
394 for i := Node.ChildNodes.Count - 1 downto 0 do begin
395 ReadNode(Node.ChildNodes[i]);
396 end;
397 if TObject(ParentNode.Data) is TFavoriteFolder then
398 CurrentNode.Expanded := Node.Attributes[ 'expanded' ] = 'true';
399 if FStack.Count <> 0 then
400 FStack.Pop;
401 end else if Node.NodeName = 'favitem' then begin
402 try
403 ParentNode := FStack.Peek;
404 if TObject(ParentNode.Data) is TFavoriteFolder then begin
405 if Node.Attributes['favtype'] = 'board' then begin
406 FavBoard := nil;
407 // ???貼???即?C???端???????????鼎??????
408 if Length( Node.Attributes[ 'bbs' ] ) > 0 then begin
409 board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );
410 if board <> nil then
411 FavBoard := TFavoriteBoardItem.Create(
412 board.URL, Node.Attributes[ 'title' ], board );
413 end else begin
414 FavBoard := TFavoriteBoardItem.Create(
415 Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], nil );
416 end;
417 CurrentNode := FTreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavBoard);
418 CurrentNode.ImageIndex := 15;
419 CurrentNode.SelectedIndex := 15;
420 end else if Node.Attributes['favtype'] = 'thread' then begin
421 // ???貼???即?C???端???????????鼎??????
422 if Length( Node.Attributes[ 'bbs' ] ) > 0 then begin
423 board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );
424 if board = nil then
425 Exit;
426
427 if not board.IsThreadDatRead then
428 GikoSys.ReadSubjectFile( board );
429 threadItem := board.FindThreadFromFileName( Node.Attributes[ 'thread' ] );
430 if threadItem = nil then begin
431 threadItem := TThreadItem.Create(
432 board.BoardPlugIn,
433 board,
434 GikoSys.Get2chBoard2ThreadURL( board, ChangeFileExt( Node.Attributes[ 'thread' ], '' ) ) );
435 threadItem.Title := Node.Attributes[ 'title' ];
436 board.Add( threadItem );
437 end;
438 FavThread := TFavoriteThreadItem.Create(
439 threadItem.URL, Node.Attributes[ 'title' ], threadItem );
440 threadItem.Free;
441 end else begin
442 FavThread := TFavoriteThreadItem.Create(
443 Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], nil );
444 end;
445 CurrentNode := FTreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavThread);
446 CurrentNode.ImageIndex := 16;
447 CurrentNode.SelectedIndex := 16;
448 end;
449 end;
450 except
451 // ?????A?C?e???長?但?????N?鼎?????添???A?C?e?????e?甜???^?????足???????長
452 end;
453 end;
454 end;
455
456 procedure TFavoriteDM.WriteFavorite;
457 {
458 var
459 FileName: string;
460 // SaveList: TStringList;
461 // i: Integer;
462 // Count: Integer;
463
464 XMLDoc: IXMLDocument;
465 XMLNode: IXMLNode;
466 // FavoNode: IXMLNode;
467 begin
468 XMLDoc := NewXMLDocument;
469 XMLDoc.Encoding := 'Shift_JIS';
470 XMLDoc.StandAlone := 'yes';
471 XMLNode := XMLDoc.AddChild('favorite');
472 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
473 AddSaveString(TreeView.Items.GetFirstNode, XMLNode);
474 XMLDoc.SaveToFile(FileName);
475 }
476 var
477 FileName, tmpFileName: string;
478 SaveList: TStringList;
479
480 begin
481 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
482 if FileExists(FileName) then begin
483 tmpFileName := GikoSys.GetConfigDir + '~' + FAVORITE_FILE_NAME;
484 if FileExists(tmpFileName) then
485 SysUtils.DeleteFile(tmpFileName); //SysUtils.?????纏??????WinAPI???????長?鼎???????長
486 RenameFile(FileName, tmpFileName);
487 end;
488 SaveList := TStringList.Create;
489 try
490 SaveList.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');
491 SaveList.Add('<favorite>');
492 AddSaveString(TreeView.Items.GetFirstNode.getFirstChild, SaveList);
493 SaveList.Add('</favorite>');
494 SaveList.SaveToFile(FileName);
495 finally
496 SaveList.Free;
497 end;
498 end;
499
500 {
501 procedure TFavoriteDM.AddSaveString(Node: TTreeNode; XMLNode: IXMLNode);
502 var
503 i: Integer;
504 // s: string;
505 FavBoard: TFavoriteBoardItem;
506 FavThread: TFavoriteThreadItem;
507 FavNode: IXMLNode;
508 begin
509 for i := 0 to Node.Count - 1 do begin
510 if TObject(Node.Item[i].Data) is TFavoriteFolder then begin
511 FavNode := XMLNode.AddChild('folder');
512 FavNode.Attributes['title'] := Node.Item[i].Text;
513 AddSaveString(Node.Item[i], FavNode);
514 end else if TObject(Node.Item[i].Data) is TFavoriteBoardItem then begin
515 FavBoard := TFavoriteBoardItem(Node.Item[i].Data);
516 FavNode := XMLNode.AddChild('favitem');
517 FavNode.Attributes['type'] := '2ch';
518 FavNode.Attributes['favtype'] := 'board';
519 FavNode.Attributes['bbs'] := FavBoard.BBSID;
520 FavNode.Attributes['title'] := Node.Item[i].Text;
521 FavNode.Attributes['boardname'] := FavBoard.BoardName;
522 end else if TObject(Node.Item[i].Data) is TFavoriteThreadItem then begin
523 FavThread := TFavoriteThreadItem(Node.Item[i].Data);
524 FavNode := XMLNode.AddChild('favitem');
525 FavNode.Attributes['type'] := '2ch';
526 FavNode.Attributes['favtype'] := 'thread';
527 FavNode.Attributes['bbs'] := FavThread.BBSID;
528 FavNode.Attributes['thread'] := FavThread.ThreadID;
529 FavNode.Attributes['title'] := Node.Item[i].Text;
530 FavNode.Attributes['threadname'] := FavThread.ThreadName;
531 end;
532 end;
533 end;
534 }
535
536 procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList);
537 var
538 s: string;
539 FavBoard: TFavoriteBoardItem;
540 FavThread: TFavoriteThreadItem;
541 data : Pointer;
542 begin
543 while Node <> nil do begin
544 data := Node.Data;
545 if TObject(data) is TFavoriteFolder then begin
546 if Node.Expanded then
547 s := Format('<folder title="%s" expanded="true">', [HtmlEncode(Node.Text)])
548 else
549 s := Format('<folder title="%s" expanded="false">', [HtmlEncode(Node.Text)]);
550 SaveList.Add(s);
551 AddSaveString(Node.getFirstChild, SaveList);
552 SaveList.Add('</folder>');
553 end else if TObject(data) is TFavoriteBoardItem then begin
554 FavBoard := TFavoriteBoardItem(data);
555 s := Format('<favitem type="2ch" favtype="board" url="%s" title="%s"/>',
556 [HtmlEncode( FavBoard.URL ), HtmlEncode(Node.Text)]);
557 SaveList.Add(s);
558 end else if TObject(data) is TFavoriteThreadItem then begin
559 FavThread := TFavoriteThreadItem(data);
560 s := Format('<favitem type="2ch" favtype="thread" url="%s" title="%s"/>',
561 [HtmlEncode( FavThread.URL ), HtmlEncode(Node.Text)]);
562 SaveList.Add(s);
563 end;
564 Node := Node.getNextSibling;
565 end;
566 end;
567
568 {
569 procedure TFavoriteDM.SAXStartDocument(Sender: TObject);
570 begin
571 FStack := TStack.Create;
572 FStack.Push(FTreeView.Items.GetFirstNode);
573 end;
574
575 procedure TFavoriteDM.SAXEndDocument(Sender: TObject);
576 begin
577 FStack.Free;
578 end;
579
580 procedure TFavoriteDM.SAXStartElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString;
581 const Atts: IAttributes);
582 var
583 FavType: string;
584 ParentNode: TTreeNode;
585 CurrentNode: TTreeNode;
586 FavFolder: TFavoriteFolder;
587 FavBoard: TFavoriteBoardItem;
588 FavThread: TFavoriteThreadItem;
589 begin
590 if QName = 'folder' then begin
591 ParentNode := FStack.Peek;
592 if TObject(ParentNode.Data) is TFavoriteFolder then begin
593 FavFolder := TFavoriteFolder.Create;
594 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavFolder);
595 CurrentNode.ImageIndex := 12;
596 CurrentNode.SelectedIndex := 13;
597 FStack.Push(CurrentNode);
598 end;
599 end else if QName = 'favitem' then begin
600 ParentNode := FStack.Peek;
601 if TObject(ParentNode.Data) is TFavoriteFolder then begin
602 FavType := Atts.getValue('favtype');
603 if FavType = 'board' then begin
604 FavBoard := TFavoriteBoardItem.Create;
605 FavBoard.BBSID := Atts.getValue('bbs');
606 FavBoard.BoardName := Atts.getValue('boardname');
607 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavBoard);
608 CurrentNode.ImageIndex := 14;
609 CurrentNode.SelectedIndex := 15;
610 end else if FavType = 'thread' then begin
611 FavThread := TFavoriteThreadItem.Create;
612 FavThread.BBSID := Atts.getValue('bbs');
613 FavThread.ThreadID := Atts.getValue('thread');
614 FavThread.ThreadName := Atts.getValue('threadname');
615 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavThread);
616 CurrentNode.ImageIndex := 16;
617 CurrentNode.SelectedIndex := 17;
618 end;
619 end;
620 end;
621 end;
622
623 procedure TFavoriteDM.SAXEndElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString);
624 begin
625 if QName = 'folder' then begin
626 if FStack.Count <> 0 then
627 FStack.Pop;
628 end;
629 end;
630
631 procedure TFavoriteDM.SAXCharacters(Sender: TObject; const PCh: SAXString);
632 begin
633 //
634 end;
635 }
636 function TFavoriteDM.SaveFavoriteFile(FileName: String) : Boolean;
637 var
638 FavoriteFilePath: string;
639 tempStringList: TStringList;
640 begin
641 WriteFavorite;
642 FavoriteFilePath := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
643
644 if FileExists( FavoriteFilePath ) then begin
645 tempStringList := TStringList.Create;
646 try
647 tempStringList.LoadFromFile( FavoriteFilePath );
648 tempStringList.SaveToFile( FileName );
649 finally
650 tempStringList.Free;
651 end;
652 Result := true;
653 end else begin
654 Result := false;
655 end;
656 end;
657
658 procedure TFavoriteDM.URLReplace(oldURLs: TStringList; newURLs: TStringList);
659 var
660 i : Integer;
661 tmpURL: string;
662 oldHost: string;
663 oldBoardName: string;
664 newHost: string;
665 newBoardName: string;
666 tempString: string;
667 favBoard : TFavoriteBoardItem;
668 favThread : TFavoriteThreadItem;
669 favorites : TTreeNodes;
670 Node : TTreeNode;
671 begin
672
673 // ???|?転?纏??thread???泥???添??URL???`?F?b?N?直?????巽?但?????????鼎?叩???纏?????B
674 favorites := FavoriteDM.FTreeView.Items;
675 for i := 0 to oldURLs.Count - 1 do begin
676 try
677 tmpURL := Copy(oldURLs[i], 1, Length(oldURLs[i]) -1);
678 oldHost := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
679 oldBoardName := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
680 tmpURL := Copy(newURLs[i], 1, Length(newURLs[i]) -1);
681 newHost := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
682 newBoardName := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
683
684 Node := favorites.GetFirstNode.getFirstChild;
685 while Node <> nil do begin
686 try
687 if TObject( Node.Data ) is TFavoriteBoardItem then begin
688 favBoard := TFavoriteBoardItem( Node.Data );
689 if favBoard = nil then continue;
690 tempString := favBoard.URL;
691 if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin
692 tempString := StringReplace(tempString, oldHost, newHost,[]);
693 favBoard.URL := tempString;
694 end;
695 end else if TObject( Node.Data ) is TFavoriteThreadItem then begin
696 favThread := TFavoriteThreadItem( Node.Data );
697 if favThread = nil then continue;
698 tempString := favThread.URL;
699 if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin
700 tempString := StringReplace(tempString, oldHost, newHost,[]);
701 favThread.URL := tempString;
702 end;
703 end;
704 except
705 end;
706 Node := Node.GetNext;
707 end;
708 except
709 end;
710 end;
711
712 end;
713
714 function TFavoriteDM.GetFavoriteFilePath() : String;
715 begin
716 Result := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
717 end;
718
719 end.

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26