function ChooseString(const Text, Separator: string; Index: integer): string;
//! \88ê\8e\9e\83t\83@\83C\83\8b\82©\82ç\82Ì\95\9c\8b\8c
procedure RestoreThreadData(Board: TBoard);
- //! \83C\83\93\83f\83b\83N\83X\82É\82È\82¢dat\81i\82Í\82®\82êdat\81j\82Ì\92Ç\89Á
- procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList);
public
{ Public \90é\8c¾ }
FAbon : TAbon;
property ResRange : Longint read FResRange write FResRange;
//! \83o\81[\83W\83\87\83\93\8fî\95ñ
property Version : String read FVersion;
-// function MsgBox(Msg: string; Title: string; Flags: Longint): integer; overload;
-// function MsgBox(Handle: THandle; Msg: string; Title: string; Flags: Longint): integer; overload;
function IsNumeric(s: string): boolean;
function IsFloat(s: string): boolean;
function DirectoryExistsEx(const Name: string): Boolean;
function ForceDirectoriesEx(Dir: string): Boolean;
-// function GetVersion: string;
function GetBoardFileName: string;
function GetCustomBoardFileName: string;
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 );
//! \8aw\8fK\83N\83\8a\83A
function GetOEIndentChar : string;
//! \92u\8a·\90Ý\92è\83t\83@\83C\83\8b\8eæ\93¾
function GetReplaceFileName: String;
+ //! \83C\83\93\83f\83b\83N\83X\82É\82È\82¢dat\81i\82Í\82®\82êdat\81j\82Ì\92Ç\89Á
+ 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
ZERO_DATE: Integer = 25569;
BETA_VERSION_NAME_E = 'beta';
BETA_VERSION_NAME_J = 'ÊÞÀ';
- BETA_VERSION = 56;
+ BETA_VERSION = 58;
BETA_VERSION_BUILD = ''; //!< debug\94Å\82È\82Ç
APP_NAME = 'gikoNavi';
BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
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/';
// *************************************************************************
constructor TGikoSys.Create;
begin
+ Inherited;
FSetting := TSetting.Create;
FDolib := TDolib.Create;
FAWKStr := TAWKStr.Create(nil);
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
finally
FileList.Free;
end;
+ FreeAndNil(FGikoMessage);
+ FreeAndNil(FBayesian);
+ FreeAndNil(FSelectResFilter);
+ FreeAndNil(FAbon);
+ FreeAndNil(FAWKStr);
+ FreeAndNil(FDolib);
+ FreeAndNil(FSetting);
inherited;
end;
usePlugIn : Boolean;
islog : Boolean;
urlHead: String;
+ datFileCheck: Boolean;
{*
FavoThreadItem : TFavoriteThreadItem;
Node: TTreeNode;
*}
+{$IFDEF DEBUG}
+ st, rt: Cardinal;
+{$ENDIF}
begin
+{$IFDEF DEBUG}
+ st := GetTickCount;
+{$ENDIF}
if Board.IsThreadDatRead then
Exit;
Board.Clear;
FileName := Board.GetFolderIndexFileName;
- FileList := TStringList.Create;
- FileList.Sorted := True;
- FileList.BeginUpdate;
- //IsLogFile\97pDAT\83t\83@\83C\83\8b\83\8a\83X\83g
- GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
- FileList.EndUpdate;
+ //
+ datFileCheck := (Setting.CheckDatFile) or (not FileExists(FileName));
+ if (datFileCheck) then begin
+ FileList := TStringList.Create;
+ FileList.Sorted := True;
+ FileList.BeginUpdate;
+ //IsLogFile\97pDAT\83t\83@\83C\83\8b\83\8a\83X\83g
+ GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
+ FileList.EndUpdate;
+ end;
// \8fd\95¡\82ð\96h\82®
Board.BeginUpdate;
//\82Q\8ds\96Ú\82©\82ç\81i\82P\8ds\96Ú\82Í\83o\81[\83W\83\87\83\93\81j
for i := sl.Count - 1 downto 1 do begin
Rec := ParseIndexLine(sl[i]);
- islog := FileList.Find( Rec.FFileName, Index );
+ if (datFileCheck) then begin
+ islog := FileList.Find( Rec.FFileName, Index );
+ end else begin
+ islog := (Rec.FSize <> 0) and (Rec.FCount <> 0);
+ end;
if usePlugIn then
ThreadItem := TThreadItem.Create(
Board.BoardPlugIn,
end;
ThreadItem.BeginUpdate;
- if islog then
+ if (datFileCheck) and (islog) then
FileList.Delete( Index );
ThreadItem.No := Rec.FNo;
if UnRead <> Board.UnRead then
Board.UnRead := UnRead;
- //\83C\83\93\83f\83b\83N\83X\82É\96³\82©\82Á\82½\83\8d\83O\82ð\92Ç\89Á\81i\95\85\82ê\83C\83\93\83f\83b\83N\83X\91Î\89\9e\81j
- AddOutofIndexDat(Board, FileList);
+ if (datFileCheck) then begin
+ //\83C\83\93\83f\83b\83N\83X\82É\96³\82©\82Á\82½\83\8d\83O\82ð\92Ç\89Á\81i\95\85\82ê\83C\83\93\83f\83b\83N\83X\91Î\89\9e\81j
+ AddOutofIndexDat(Board, FileList);
+ end;
Board.EndUpdate;
//\91O\89ñ\88Ù\8fí\8fI\97¹\8e\9e\83`\83F\83b\83N
RestoreThreadData( Board );
finally
sl.Free;
- FileList.Free;
+ if (datFileCheck) then begin
+ FileList.Free;
+ end;
Board.Sorted := False;
end;
Board.IsThreadDatRead := True;
+{$IFDEF DEBUG}
+ rt := GetTickCount - st;
+ Writeln('Read Done.' + IntToStr(rt) + ' ms');
+{$ENDIF}
end;
{!
\brief \83C\83\93\83f\83b\83N\83X\82É\82È\82¢dat\81i\82Í\82®\82êdat\81j\82Ì\92Ç\89Á
\param Board \92Ç\89Á\82·\82é\94Â
\param DatList dat\83t\83@\83C\83\8b\96¼
}
-procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList);
+procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: Boolean = True);
var
i : Integer;
Boardpath,FileName : String;
ResRec: TResRec;
ThreadItem: TThreadItem;
+ create: Boolean;
begin
+ create := False;
Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
//\83C\83\93\83f\83b\83N\83X\82É\96³\82©\82Á\82½\83\8d\83O\82ð\92Ç\89Á\81i\95\85\82ê\83C\83\93\83f\83b\83N\83X\91Î\89\9e\81j
for i := 0 to DatList.Count - 1 do begin
FileName := Boardpath + DatList[i];
-
- //ResRec := DivideStrLine(ReadThreadFile(FileName, 1));
- if Board.IsBoardPlugInAvailable then begin
- ThreadItem := TThreadItem.Create(
- Board.BoardPlugIn,
- Board,
- Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
- THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
- end else begin
- ThreadItem := TThreadItem.Create(
- nil,
- Board,
- Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
- THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
+ ThreadItem := nil;
+ if (not AllCreate) then begin
+ create := False;
+ ThreadItem := Board.FindThreadFromFileName(DatList[i]);
+ if (ThreadItem = nil) then begin
+ create := True;
+ end else begin
+ if Board.IsBoardPlugInAvailable then begin
+ THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
+ end else begin
+ THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
+ end;
+ end;
+ end;
+ if (ThreadItem = nil) then begin
+ if Board.IsBoardPlugInAvailable then begin
+ ThreadItem := TThreadItem.Create(
+ Board.BoardPlugIn,
+ Board,
+ Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
+ THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
+ end else begin
+ ThreadItem := TThreadItem.Create(
+ nil,
+ Board,
+ Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
+ THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
+ end;
end;
+
ThreadItem.BeginUpdate;
ThreadItem.FileName := DatList[i];
ThreadItem.ScrollTop := 0;
ThreadItem.AgeSage := gasNone;
ThreadItem.EndUpdate;
- Board.Add(ThreadItem);
+ if (AllCreate) or (create) then begin
+ Board.Add(ThreadItem);
+ end;
end;
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;
{!
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;
{!
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);
//\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));
}
procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
var
+ AID : String;
+begin
+ AID := GetResID(AIDNum, ThreadItem);
+ if not IsNoValidID(AID) then begin
+ GetSameIDRes(AID, ThreadItem, body);
+ end;
+end;
+{!
+\brief \93\8a\8de ID \8eæ\93¾
+\param AIDNum \93\8a\8de \83\8c\83X\94Ô\8d\86
+\param ThreadItem \93\8a\8de\83X\83\8c\83b\83h
+\param body OUT:\93\8a\8deID
+}
+function TGikoSys.GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
+var
Res: TResRec;
boardPlugIn : TBoardPlugIn;
- AID : String;
stList: TStringList;
i : Integer;
begin
+ Result := '';
if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
//if ThreadItem.IsBoardPlugInAvailable then begin
end else begin
THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
end;
- AID := Res.FDateTime;
- if AnsiPos('id', AnsiLowerCase(AID)) > 0 then begin
- AID := Copy(AID, AnsiPos('id', AnsiLowerCase(AID)) - 1, 11);
- if AnsiPos(' be:', AnsiLowerCase(AID)) > 0 then begin
- AID := Copy(AID, 1, AnsiPos(' BE:', AnsiLowerCase(AID)) - 1)
+ Result := Res.FDateTime;
+ if AnsiPos('id', AnsiLowerCase(Result)) > 0 then begin
+ Result := Copy(Result, AnsiPos('id', AnsiLowerCase(Result)) - 1, 11);
+ if AnsiPos(' be:', AnsiLowerCase(Result)) > 0 then begin
+ Result := Copy(Result, 1, AnsiPos(' BE:', AnsiLowerCase(Result)) - 1)
end;
end else begin
stlist := TStringList.Create;
try
- stList.DelimitedText := AID;
- AID := '';
+ stList.DelimitedText := Result;
+ Result := '';
for i := 0 to stList.Count - 1 do
if Length(WideString(stList[i])) = 8 then begin
if NotDateorTimeString(stList[i]) then begin
- AID := stList[i];
+ Result := stList[i];
break;
end;
end;
stList.Free;
end;
end;
- if not IsNoValidID(AID) then
- GetSameIDRes(AID, ThreadItem, body);
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
ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
- if(ThreadItem.Size = 0) and (FileExists(ThreadItem.GetThreadFileName)) then begin
+ ThreadItem.IsLogFile := FileExists(ThreadItem.GetThreadFileName);
+ if(ThreadItem.Size = 0) and (ThreadItem.IsLogFile) then begin
try
ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
except
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
+ tmp : String;
+ unixtime: Int64;
+begin
+ // \83\8d\83O\83t\83@\83C\83\8b\82Ì\8ag\92£\8eq\82ð\82Í\82¸\82µ\82½\82à\82Ì\82ª\83X\83\8c\8dì\90¬\93ú\8e\9e
+ tmp := ChangeFileExt(FileName, '');
+ if AnsiPos('_', tmp) <> 0 then
+ if AnsiPos('_', tmp) > 9 then
+ tmp := Copy(tmp, 1, AnsiPos('_', tmp)-1)
+ else
+ Delete(tmp, AnsiPos('_', tmp), 1);
+
+ if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
+ Insert('1', tmp, 1);
+
+ unixtime := StrToInt64Def(tmp, ZERO_DATE);
+ Result := UnixToDateTime(unixtime) + OffsetFromUTC;
+end;
+
+procedure TGikoSys.ShowRefCount(msg: String; unk: IUnknown);
+var
+ count : integer;
+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.