OSDN Git Service

まちBBSの新URL(PATH_INFO)に対応
[gikonavigoeson/gikonavi.git] / GikoSystem.pas
index 572526f..a1a644a 100644 (file)
@@ -213,12 +213,9 @@ type
                procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
 
                property Bayesian : TGikoBayesian read FBayesian write FBayesian;
-               function GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: Integer):string; overload;
-               function GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: Integer):string; overload;
+        function CreateSameIDResAnchor(var Numbers: TStringList; ThreadItem: TThreadItem; limited: Integer):string;
                procedure GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList); overload;
                procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
-               function GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer; overload;
-               function GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer; overload;
         function GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
                //! \92P\8cê\89ð\90Í
                procedure SpamCountWord( const text : string; wordCount : TWordCount );
@@ -256,6 +253,9 @@ type
         procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: boolean = True);
         //! \83t\83@\83C\83\8b\96¼\82©\82ç\82Ì\83X\83\8c\83b\83h\8dì\90¬\93ú\82Ì\8eæ\93¾
         function GetCreateDateFromName(FileName: String): TDateTime;
+        function GetExtpreviewFileName: String;
+
+        procedure ShowRefCount(msg: String; unk: IUnknown);
        end;
 
 var
@@ -265,7 +265,7 @@ const
        ZERO_DATE: Integer      = 25569;
        BETA_VERSION_NAME_E = 'beta';
        BETA_VERSION_NAME_J = 'ÊÞÀ';
-       BETA_VERSION                            = 57;
+       BETA_VERSION                            = 58;
        BETA_VERSION_BUILD      = '';                           //!< debug\94Å\82È\82Ç
        APP_NAME                                                = 'gikoNavi';
        BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
@@ -284,6 +284,7 @@ const
        NGWORDs_DIR_NAME : String               = 'NGwords';
 
        READ_PATH: string =                     '/test/read.cgi/';
+    HTML_READ_PATH: string =        '/test/read.html/';
        OLD_READ_PATH: string =         '/test/read.cgi?';
        KAKO_PATH: string =                     '/kako/';
 
@@ -306,6 +307,7 @@ const
 // *************************************************************************
 constructor TGikoSys.Create;
 begin
+    Inherited;
        FSetting := TSetting.Create;
        FDolib := TDolib.Create;
        FAWKStr := TAWKStr.Create(nil);
@@ -344,18 +346,6 @@ var
        i: Integer;
        FileList: TStringList;
 begin
-       //\83X\83\8c\83b\83h\83f\81[\83^\83t\83@\83C\83\8b\82ð\8dX\90V
-//     FlashExitWrite;
-
-//     FExitWrite.Free;
-       FBayesian.Free;
-       FAWKStr.Free;
-       FSetting.Free;
-       FDolib.Free;
-       FAbon.Free;
-       FSelectResFilter.Free;
-    FGikoMessage.Free;
-       //FBoardURLList.Free;
        //\83e\83\93\83|\83\89\83\8aHTML\82ð\8dí\8f\9c
        FileList := TStringList.Create;
        try
@@ -368,6 +358,13 @@ begin
        finally
                FileList.Free;
        end;
+    FreeAndNil(FGikoMessage);
+       FreeAndNil(FBayesian);
+       FreeAndNil(FSelectResFilter);
+       FreeAndNil(FAbon);
+       FreeAndNil(FAWKStr);
+       FreeAndNil(FDolib);
+       FreeAndNil(FSetting);
        inherited;
 end;
 
@@ -1190,10 +1187,10 @@ end;
 }
 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
 var
-       Code: Integer;
+       Code: Cardinal;
 begin
        Code := GetFileAttributes(PChar(Name));
-       Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
+       Result := (Code <> Cardinal(-1)) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
 end;
 
 {!
@@ -1348,17 +1345,15 @@ var
        nm: NONCLIENTMETRICS;
 begin
        nm.cbSize := sizeof(NONCLIENTMETRICS);
-
-       SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
-       lf := nm.lfMenuFont;
-
-       Font.Name := lf.lfFaceName;
-       Font.Height := lf.lfHeight;
-       Font.Style := [];
-       if lf.lfWeight >= 700 then
-               Font.Style := Font.Style + [fsBold];
-       if lf.lfItalic = 1 then
-               Font.Style := Font.Style + [fsItalic];
+    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
+    lf := nm.lfMenuFont;
+    Font.Name := lf.lfFaceName;
+    Font.Height := lf.lfHeight;
+    Font.Style := [];
+    if lf.lfWeight >= 700 then
+        Font.Style := Font.Style + [fsBold];
+    if lf.lfItalic = 1 then
+        Font.Style := Font.Style + [fsItalic];
 end;
 
 {!
@@ -1841,7 +1836,13 @@ begin
        Index := AnsiPos(READ_PATH, path);
        if Index <> 0 then begin
                s := Copy(path, Index + Length(READ_PATH), Length(path));
-
+    end else begin
+        Index := AnsiPos(HTML_READ_PATH, path);
+        if Index <> 0 then begin
+            s := Copy(path, Index + Length(HTML_READ_PATH), Length(path));
+        end;
+    end;
+    if Index <> 0 then begin
                if (Length(s) > 0) and (s[1] = '/') then
                        Delete(s, 1, 1);
                BBSID := GetTokenIndex(s, '/', 0);
@@ -2070,7 +2071,7 @@ begin
                //\95W\8f\80\8f\91\8e®
                //\8dÅ\8cã\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n- \82È\82Ç
                //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
-               FAWKStr.RegExp := '/test/read.cgi/.+/[0-9]+/?.*';
+               FAWKStr.RegExp := '/test/read.(cgi|html)/.+/[0-9]+/?.*';
                if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
                        s := Copy(s, 15, Length(s));
 
@@ -2508,6 +2509,8 @@ procedure TGikoSys.ListBoardFile;
 var
        boardFileList   : TStringList;
        i, l                    : Integer;
+    sCategory       : TCategory;
+    sBoard          : TBoard;
 begin
        // BBS \82Ì\8aJ\95ú
        try
@@ -2550,6 +2553,19 @@ begin
                BoardFileList.Free;
          end;
        end;
+
+    // \93Á\8eê\97p\93rBBS\90\90¬
+    // \8aù\82É\91\8dÝ\82·\82é\8fê\8d\87\82Í\8dí\8f\9c\82·\82é
+    DestorySpecialBBS(BoardGroup.SpecialBBS);
+    SpecialBBS := TBBS.Create('');
+    SpecialBBS.Title := '\93Á\8eê\97p\93r(\94ñ\95\\8e¦)';
+    sCategory := TCategory.Create;
+    sCategory.No := 1;
+    sCategory.Title := '\93Á\8eê\97p\93r(\94ñ\95\\8e¦)';
+    SpecialBBS.Add(sCategory);
+    sBoard := TSpecialBoard.Create(nil, 'http://localhost/gikonavi/special/index.html');
+    sBoard.IsThreadDatRead := True;
+    sCategory.Add(sBoard);
 end;
 
 {!
@@ -2747,20 +2763,18 @@ function TGikoSys.GetSambaFileName : string;
 begin
        Result := Setting.GetSambaFileName;
 end;
-
 {!
-\brief \93¯\82\93\8a\8de ID \82ð\8e\9d\82Â\83\8c\83X\82ð\83A\83\93\83J\81[\82É\82µ\82Ä\97ñ\8b\93
-\param AID        \8cÂ\90l\82ð\93Á\92è\82·\82é\93\8a\8de ID
+\brief \97ñ\8b\93\82³\82ê\82½\83\8c\83X\94Ô\8d\86\82Ö\82Ì\83A\83\93\83J\81[\97pHTML\8dì\90¬
+\param Numbers    \97ñ\8b\93\82³\82ê\82½\83\8c\83X\94Ô\8d\86
 \param ThreadItem \97ñ\8b\93\82·\82é\83X\83\8c\83b\83h
 \param limited    \97ñ\8b\93\82·\82é\90\94\82ð\90§\8cÀ\82·\82é\82È\82ç1\88È\8fã
 \return           \97ñ\8b\93\82³\82ê\82½\83\8c\83X\83A\83\93\83J\81[
 }
-function TGikoSys.GetSameIDResAnchor(
-    const AID : string; ThreadItem: TThreadItem;
+function TGikoSys.CreateSameIDResAnchor(
+    var Numbers: TStringList; ThreadItem: TThreadItem;
     limited: Integer):string;
 var
        i: integer;
-       body: TStringList;
     Res: TResRec;
     ResLink : TResLinkRec;
 begin
@@ -2768,29 +2782,22 @@ begin
     Res.FBody := '';
     Res.FType := glt2chNew;
 
-               Result := '';
-               if (not IsNoValidID(AID)) and
-                       (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
-                               body := TStringList.Create;
-                               try
-                                               GetSameIDRes(AID, ThreadItem, body);
-                                               if (limited > 0) and (body.Count > limited) then begin
-                                                               for i := body.Count - limited to body.Count - 1 do begin
-                                                                               Res.FBody := Res.FBody + '&gt;' + body[i] + ' ';
-                                                               end;
-                                               end else begin
-                                                               for i := 0 to body.Count - 1 do begin
-                                                                               Res.FBody := Res.FBody + '&gt;' + body[i] + ' ';
-                                                               end;
-                                               end;
-                               finally
-                                               body.Free;
-                               end;
+       Result := '';
+       if (Numbers <> nil) and (Numbers.Count > 0) then begin
+        if (limited > 0) and (Numbers.Count > limited) then begin
+            for i := Numbers.Count - limited to Numbers.Count - 1 do begin
+                Res.FBody := Res.FBody + '&gt;' + Numbers[i] + ' ';
+            end;
+        end else begin
+            for i := 0 to Numbers.Count - 1 do begin
+                Res.FBody := Res.FBody + '&gt;' + Numbers[i] + ' ';
+            end;
+        end;
         ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
         ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
         HTMLCreater.ConvRes(@Res, @ResLink, false);
         Result := Res.FBody;
-               end;
+    end;
 end;
 
 {!
@@ -2805,6 +2812,22 @@ var
        ReadList: TStringList;
        Res: TResRec;
        boardPlugIn : TBoardPlugIn;
+
+    procedure CheckSameID(const AID:String; const Target: String; no: Integer);
+    var
+        pos: Integer;
+    begin
+        pos := AnsiPos('id:', LowerCase(Target));
+        if (pos > 0) then begin
+            if(AnsiPos(AID, Copy(Target, pos-1, Length(Target))) > 0) then begin
+                body.Add(IntToStr(no));
+            end;
+        end else begin
+            if(AnsiPos(AID, Target) > 0) then begin
+                body.Add(IntToStr(no));
+            end;
+        end;
+    end;
 begin
        if (not IsNoValidID(AID)) and
        (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
@@ -2817,9 +2840,7 @@ begin
                        for i := 0 to threadItem.Count - 1 do begin
                                // \83\8c\83X
                                THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
-                               if(AnsiPos(AID, Res.FDateTime) > 0) then begin
-                                       body.Add(IntToStr(i+1));
-                               end;
+                CheckSameID(AID, Res.FDateTime, i+1);
                        end;
                end else begin
                        ReadList := TStringList.Create;
@@ -2827,9 +2848,7 @@ begin
                                ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
                                for i := 0 to ReadList.Count - 1 do begin
                                        THTMLCreate.DivideStrLine(ReadList[i], @Res);
-                                       if AnsiPos(AID, Res.FDateTime) > 0 then begin
-                                               body.Add(IntToStr(i+1));
-                                       end;
+                    CheckSameID(AID, Res.FDateTime, i+1);
                                end;
                        finally
                                ReadList.Free;
@@ -2842,50 +2861,6 @@ end;
 \brief \93¯\82\93\8a\8de ID \82ð\8e\9d\82Â\83\8c\83X\82ð\97ñ\8b\93
 \param AIDNum     \8cÂ\90l\82ð\93Á\92è\82·\82é\93\8a\8de ID
 \param ThreadItem \97ñ\8b\93\82·\82é\83X\83\8c\83b\83h
-\param limited    \97ñ\8b\93\82·\82é\90\94\82ð\90§\8cÀ\82·\82é\82È\82ç1\88È\8fã
-\return
-}
-function TGikoSys.GetSameIDResAnchor(AIDNum : Integer;
-     ThreadItem: TThreadItem;
-     limited: Integer):string;
-var
-       i: integer;
-       body: TStringList;
-    Res: TResRec;
-    ResLink : TResLinkRec;
-begin
-    // body\88È\8aO\82Í\8eg\97p\82µ\82È\82¢\82Ì\82Å\8f\89\8aú\89»\82µ\82È\82¢
-    Res.FBody := '';
-    Res.FType := glt2chNew;
-
-       Result := '';
-       if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
-               body := TStringList.Create;
-               try
-                       GetSameIDRes(AIDNum, ThreadItem, body);
-            if (limited > 0) and ( body.Count > limited) then begin
-                for i := body.Count - 20 to body.Count - 1 do begin
-                    Res.FBody := Res.FBody + '&gt;' + body[i] + ' ';
-                end;
-            end else begin
-                       for i := 0 to body.Count - 1 do begin
-                               Res.FBody := Res.FBody + '&gt;' + body[i] + ' ';
-                       end;
-            end;
-               finally
-                       body.Free;
-               end;
-        ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
-        ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
-        HTMLCreater.ConvRes(@Res, @ResLink, false);
-        Result := Res.FBody;
-       end;
-end;
-
-{!
-\brief \93¯\82\93\8a\8de ID \82ð\8e\9d\82Â\83\8c\83X\82ð\97ñ\8b\93
-\param AIDNum     \8cÂ\90l\82ð\93Á\92è\82·\82é\93\8a\8de ID
-\param ThreadItem \97ñ\8b\93\82·\82é\83X\83\8c\83b\83h
 \param body       OUT:\97ñ\8b\93\82³\82ê\82½\83\8c\83X\94Ô\8d\86\82ª\95Ô\82é
 }
 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
@@ -2946,51 +2921,6 @@ begin
                end;
        end;
 end;
-{!
-\brief \93¯\82\93\8a\8de ID \82ð\8e\9d\82Â\83\8c\83X\82ð\83J\83E\83\93\83g
-\param AID        \8cÂ\90l\82ð\93Á\92è\82·\82é\93\8a\8de ID
-\param ThreadItem \97ñ\8b\93\82·\82é\83X\83\8c\83b\83h
-\return           \93¯\82¶ ID \82ð\8e\9d\82Â\83\8c\83X\82Ì\90\94
-}
-function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer;
-var
-       body: TStringList;
-begin
-    Result := 0;
-       if (not IsNoValidID(AID))
-     and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
-               body := TStringList.Create;
-               try
-                       GetSameIDRes(AID, ThreadItem, body);
-                       Result := body.Count;
-               finally
-                       body.Free;
-               end;
-       end;
-
-end;
-
-{!
-\brief \93¯\82\93\8a\8de ID \82ð\8e\9d\82Â\83\8c\83X\82ð\83J\83E\83\93\83g
-\param AIDNum     \8cÂ\90l\82ð\93Á\92è\82·\82é\93\8a\8de ID
-\param ThreadItem \97ñ\8b\93\82·\82é\83X\83\8c\83b\83h
-\return           \93¯\82¶ ID \82ð\8e\9d\82Â\83\8c\83X\82Ì\90\94
-}
-function TGikoSys.GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer;
-var
-       body: TStringList;
-begin
-       Result := 0;
-       if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
-               body := TStringList.Create;
-               try
-                       GetSameIDRes(AIDNum, ThreadItem, body);
-            Result := body.Count;
-               finally
-                       body.Free;
-               end;
-       end;
-end;
 
 {!
 \brief \8e\9e\8d\8f\82ð\8e¦\82·\95\8e\9a\97ñ\82Å\82Í\96³\82¢\82©\82Ç\82¤\82©
@@ -3453,6 +3383,12 @@ function TGikoSys.GetReplaceFileName: String;
 begin
     Result := Setting.GetReplaceFileName;
 end;
+//! \83v\83\8c\83r\83\85\81[\8ag\92£\82Ì\90Ý\92è\83t\83@\83C\83\8b\8eæ\93¾
+function TGikoSys.GetExtpreviewFileName: String;
+begin
+    Result := Setting.GetExtprevieFileName;
+end;
+
 //! \83t\83@\83C\83\8b\96¼\82©\82ç\82Ì\83X\83\8c\83b\83h\8dì\90¬\93ú\82Ì\8eæ\93¾
 function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime;
 var
@@ -3474,12 +3410,32 @@ begin
     Result := UnixToDateTime(unixtime) + OffsetFromUTC;
 end;
 
+procedure TGikoSys.ShowRefCount(msg: String; unk: IUnknown);
+{$IFDEF DEBUG}
+var
+    count : integer;
+{$ENDIF}
+begin
+    if not Assigned(unk) then
+        Exit;
+
+{$IFDEF DEBUG}
+    try
+        unk._AddRef;
+        count := unk._Release;
+
+               Writeln(msg + ' RefCount=' + IntToStr(count));
+    except
+               Writeln(msg + ' RefCount=exception!!');
+       end;
+{$ENDIF}
+end;
+
 initialization
        GikoSys := TGikoSys.Create;
 
 finalization
        if GikoSys <> nil then begin
-               GikoSys.Free;
-               GikoSys := nil;
+               FreeAndNil(GikoSys);
        end;
 end.