6 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
7 ComCtrls, {IniFiles,} ShellAPI, ActnList, Math,
15 {HttpApp,} URLMon, IdGlobal, IdURI, {Masks,}
16 Setting, BoardGroup, gzip, Dolib, bmRegExp, AbonUnit,
17 ExternalBoardManager, ExternalBoardPlugInMain,
18 GikoBayesian, GikoMessage;
22 vrComments, //!<
\83R
\83\81\83\93\83g
23 vrCompanyName, //!<
\89ï
\8eÐ
\96¼
24 vrFileDescription, //!<
\90à
\96¾
25 vrFileVersion, //!<
\83t
\83@
\83C
\83\8b\83o
\81[
\83W
\83\87\83\93
26 vrInternalName, //!<
\93à
\95\94\96¼
27 vrLegalCopyright, //!<
\92\98\8dì
\8c
28 vrLegalTrademarks, //!<
\8f¤
\95W
29 vrOriginalFilename, //!<
\90³
\8e®
\83t
\83@
\83C
\83\8b\96¼
30 vrPrivateBuild, //!<
\83v
\83\89\83C
\83x
\81[
\83g
\83r
\83\8b\83h
\8fî
\95ñ
31 vrProductName, //!<
\90»
\95i
\96¼
32 vrProductVersion, //!<
\90»
\95i
\83o
\81[
\83W
\83\87\83\93
33 vrSpecialBuild); //!<
\83X
\83y
\83V
\83\83\83\8b\83r
\83\8b\83h
\8fî
\95ñ
36 TGikoBBSType = (gbt2ch);
37 //!
\83\8d\83O
\83^
\83C
\83v
38 TGikoLogType = (glt2chNew, glt2chOld);
39 //!
\83\81\83b
\83Z
\81[
\83W
\83A
\83C
\83R
\83\93
40 TGikoMessageIcon = (gmiOK, gmiSAD, gmiNG, gmiWhat, gmiNone);
41 //! URL
\83I
\81[
\83v
\83\93\83u
\83\89\83E
\83U
\83^
\83C
\83v
42 TGikoBrowserType = (gbtIE, gbtUserApp, gbtAuto);
45 TStrTokSeparator = set of Char;
51 //!
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b\83\8c\83R
\81[
\83h
59 FRoundDate: TDateTime;
60 FLastModified: TDateTime;
63 FMishiyou: Boolean; //!<
\96¢
\8eg
\97p
67 FAllResCount: Integer;
68 FNewResCount: Integer;
69 FAgeSage: TGikoAgeSage;
72 //!
\83T
\83u
\83W
\83F
\83N
\83g
\83\8c\83R
\81[
\83h
79 //!
\83\8c\83X
\83\8c\83R
\81[
\83h
\82Ö
\82Ì
\83|
\83C
\83\93\83^
82 //!
\83\8c\83X
\83\8c\83R
\81[
\83h
92 //! URLPath
\83\8c\83R
\81[
\83h
94 FBBS: string; //!< BBSID
95 FKey: string; //!< ThreadID
96 FSt: Int64; //!<
\8aJ
\8en
\83\8c\83X
\94Ô
97 FTo: Int64; //!<
\8fI
\97¹
\83\8c\83X
\94Ô
98 FFirst: Boolean; //!< >>1
\82Ì
\95\
\8e¦
99 FStBegin: Boolean; //!< 1
\81`
\95\
\8e¦
100 FToEnd: Boolean; //!<
\81`
\8dÅ
\8cã
\82Ü
\82Å
\95\
\8e¦
101 FDone: Boolean; //!<
\90¬
\8c÷
102 FNoParam: Boolean; //!<
\83\8c\83X
\94Ô
\83p
\83\89\83\81\81[
\83^
\82È
\82µ
105 TGikoSys = class(TObject)
112 FBayesian : TGikoBayesian; //!<
\83x
\83C
\83W
\83A
\83\93\83t
\83B
\83\8b\83^
113 FVersion : String; //!<
\83t
\83@
\83C
\83\8b\83o
\81[
\83W
\83\87\83\93
114 FGikoMessage: TGikoMessage;
115 //!
\82 \82é
\83Z
\83p
\83\8c\81[
\83^
\82Å
\8bæ
\90Ø
\82ç
\82ê
\82½
\95¶
\8e\9a\97ñ
\82©
\82ç
\82\8e\94Ô
\96Ú
\82Ì
\95¶
\8e\9a\97ñ
\82ð
\8eæ
\82è
\8fo
\82·
116 function ChooseString(const Text, Separator: string; Index: integer): string;
117 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
118 procedure RestoreThreadData(Board: TBoard);
122 FSelectResFilter : TAbon;
123 //FBoardURLList: TStringList;
126 destructor Destroy; override;
127 property ResRange : Longint read FResRange write FResRange;
128 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
129 property Version : String read FVersion;
130 function IsNumeric(s: string): boolean;
131 function IsFloat(s: string): boolean;
132 function DirectoryExistsEx(const Name: string): Boolean;
133 function ForceDirectoriesEx(Dir: string): Boolean;
135 function GetBoardFileName: string;
136 function GetCustomBoardFileName: string;
137 function GetHtmlTempFileName: string;
138 function GetAppDir: string;
139 function GetTempFolder: string;
140 function GetSentFileName: string;
141 function GetConfigDir: string;
142 function GetSkinDir: string;
143 function GetSkinHeaderFileName: string;
144 function GetSkinFooterFileName: string;
145 function GetSkinResFileName: string;
146 function GetSkinNewResFileName: string;
147 function GetSkinBookmarkFileName: string;
148 function GetSkinNewmarkFileName: string;
149 function GetStyleSheetDir: string;
150 function GetOutBoxFileName: string;
151 function GetUserAgent: string;
152 function GetSambaFileName : string;
154 function GetMainKeyFileName : String;
155 function GetEditorKeyFileName: String;
156 function GetInputAssistFileName: String;
157 procedure ReadSubjectFile(Board: TBoard);
158 procedure CreateThreadDat(Board: TBoard);
159 procedure WriteThreadDat(Board: TBoard);
160 function ParseIndexLine(Line: string): TIndexRec;
161 procedure GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean); overload;
162 procedure GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean); overload;//
\83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
163 procedure GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
165 function DivideSubject(Line: string): TSubjectRec;
166 property Setting: TSetting read FSetting write FSetting;
167 property Dolib: TDolib read FDolib write FDolib;
169 function UrlToID(url: string): string;
170 function UrlToServer(url: string): string;
172 function StrTokFirst(const s:string; const sep:TStrTokSeparator; var Rec:TStrTokRec):string;
173 function StrTokNext(const sep:TStrTokSeparator; var Rec:TStrTokRec): string;
175 function GetFileSize(FileName : string) : longint;
176 function GetFileLineCount(FileName : string): longint;
177 function IntToDateTime(val: Int64): TDateTime;
178 function DateTimeToInt(ADate: TDateTime): Int64;
180 function ReadThreadFile(FileName: string; Line: Integer): string;
182 procedure MenuFont(Font: TFont);
184 function RemoveToken(var s:string; const delimiter:string):string;
185 function GetTokenIndex(s: string; delimiter: string; index: Integer): string;
187 function GetShortName(const LongName: string; ALength: integer): string;
188 function BoolToInt(b: Boolean): Integer;
189 function IntToBool(i: Integer): Boolean;
190 function GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
191 procedure LoadKeySetting(ActionList: TActionList; FileName: String);
192 procedure SaveKeySetting(ActionList: TActionList; FileName: String);
193 procedure CreateProcess(const AppPath: string; const Param: string);
194 procedure OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
195 function HTMLDecode(const AStr: String): String;
196 function GetHRefText(s: string): string;
197 function Is2chHost(Host: string): Boolean;
198 function Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
199 function Parse2chURL2(URL: string): TPathRec;
200 procedure ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
201 function GetVersionBuild: Integer;
202 function GetBrowsableThreadURL( inURL : string ) : string;
203 function GetThreadURL2BoardURL( inURL : string ) : string;
204 function Get2chThreadURL2BoardURL( inURL : string ) : string;
205 function Get2chBrowsableThreadURL( inURL : string ) : string;
206 function Get2chBoard2ThreadURL( inBoard : TBoard; inKey : string ) : string;
207 procedure ListBoardFile;
208 procedure ReadBoardFile( bbs : TBBS );
210 function GetUnknownCategory : TCategory;
211 function GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
213 procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
215 property Bayesian : TGikoBayesian read FBayesian write FBayesian;
216 function GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: Integer):string; overload;
217 function GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: Integer):string; overload;
218 procedure GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList); overload;
219 procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
220 function GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer; overload;
221 function GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer; overload;
222 function GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
224 procedure SpamCountWord( const text : string; wordCount : TWordCount );
225 //!
\8aw
\8fK
\83N
\83\8a\83A
226 procedure SpamForget( wordCount : TWordCount; isSpam : Boolean );
227 //!
\83X
\83p
\83\80\8aw
\8fK
228 procedure SpamLearn( wordCount : TWordCount; isSpam : Boolean );
229 //!
\83X
\83p
\83\80\93x
\90\94
230 function SpamParse( const text : string; wordCount : TWordCount ) : Extended;
231 //
\88ø
\90\94\82ª
\81A
\93ú
\95t
\82Å
\82à
\8e\9e\8d\8f\82Å
\82à
\82È
\82¢
\82±
\82Æ
\82ð
\92²
\82×
\82é
232 function NotDateorTimeString(const AStr : string): boolean;
234 //!
\88ø
\90\94\82É
\91\97\82ç
\82ê
\82Ä
\82«
\82½
\93ú
\95t/ID
\95\94\82ÉBE
\82Ì
\95¶
\8e\9a\97ñ
\82ª
\82 \82Á
\82½
\82ç
\81A
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83\8a\83\93\83N
\82ð
\92Ç
\89Á
235 function AddBeProfileLink(AID : string; ANum: Integer): string;
236 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
237 function GetVersionInfo(KeyWord: TVerResourceKey): string;
238 //! Plugin
\82Ì
\8fî
\95ñ
\82Ì
\8eæ
\93¾
239 function GetPluginsInfo(): string;
240 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
241 function GetIEVersion: string;
242 function SetUserOptionalStyle(): string;
243 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
244 procedure SetGikoMessage;
245 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
246 function GetGikoMessage(MesType: TGikoMessageListType): String;
247 //! GMT
\82Ì
\8e\9e\8d\8f\82ðTDateTime
\82É
\95Ï
\8a·
\82·
\82é
248 function DateStrToDateTime(const DateStr: string): TDateTime;
249 //! User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
250 function CanUser32DLL: Boolean;
251 //! OE
\88ø
\97p
\95\84\8eæ
\93¾
252 function GetOEIndentChar : string;
253 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
254 function GetReplaceFileName: String;
255 //!
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
256 procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: boolean = True);
257 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
258 function GetCreateDateFromName(FileName: String): TDateTime;
259 function GetExtpreviewFileName: String;
261 procedure ShowRefCount(msg: String; unk: IUnknown);
267 //LENGTH_RESTITLE = 40;
268 ZERO_DATE: Integer = 25569;
269 BETA_VERSION_NAME_E = 'beta';
270 BETA_VERSION_NAME_J = 'ÊÞÀ';
272 BETA_VERSION_BUILD = ''; //!< debug
\94Å
\82È
\82Ç
273 APP_NAME = 'gikoNavi';
274 BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
280 Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils, Sort, YofUtils,
281 IniFiles, DateUtils, SkinFiles;
284 FOLDER_INDEX_VERSION = '1.01';
285 USER_AGENT = 'Monazilla';
286 DEFAULT_NGWORD_FILE_NAME : String = 'NGword.txt';
287 NGWORDs_DIR_NAME : String = 'NGwords';
289 READ_PATH: string = '/test/read.cgi/';
290 OLD_READ_PATH: string = '/test/read.cgi?';
291 KAKO_PATH: string = '/kako/';
293 KeyWordStr: array [TVerResourceKey] of String = (
307 // *************************************************************************
308 //! GikoSys
\83R
\83\93\83X
\83g
\83\89\83N
\83^
309 // *************************************************************************
310 constructor TGikoSys.Create;
313 FSetting := TSetting.Create;
314 FDolib := TDolib.Create;
315 FAWKStr := TAWKStr.Create(nil);
316 if DirectoryExists(GetConfigDir) = false then begin
317 CreateDir(GetConfigDir);
319 FAbon := TAbon.Create;
320 FAbon.IgnoreKana := FSetting.IgnoreKana;
321 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
323 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
324 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
325 FAbon.DeleteSyria := FSetting.DeleteSyria;
326 FAbon.Deleterlo := FSetting.AbonDeleterlo;
327 FAbon.Replaceul := FSetting.AbonReplaceul;
328 FAbon.AbonPopupRes := FSetting.PopUpAbon;
330 FSelectResFilter := TAbon.Create;
331 FSelectResFilter.IgnoreKana := True;
332 //
\8di
\82è
\8d\9e\82Þ
\82Æ
\82«
\82Í
\8bÉ
\97Í
\88ê
\97\97\82ª
\8c©
\82ç
\82ê
\82é
\82Ù
\82¤
\82ª
\82¢
\82¢
\82Ì
\82Å
\91¼
\82Í
\8a®
\91S
\82É
\8dí
\8f\9c
333 FSelectResFilter.AbonString := '';
335 ResRange := FSetting.ResRange;
336 FVersion := Trim(GetVersionInfo(vrFileVersion));
337 FBayesian := TGikoBayesian.Create;
338 //FBoardURLList := TStringList.Create;
339 //
\83\81\83b
\83Z
\81[
\83W
\82Ì
\8dì
\90¬
340 FGikoMessage := TGikoMessage.Create;
343 // *************************************************************************
344 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
345 // *************************************************************************
346 destructor TGikoSys.Destroy;
349 FileList: TStringList;
351 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
352 FileList := TStringList.Create;
354 FileList.BeginUpdate;
355 GetFileList(GetTempFolder, '*.html', FileList, False, True);
357 for i := 0 to FileList.Count - 1 do begin
358 DeleteFile(FileList[i]);
363 FreeAndNil(FGikoMessage);
364 FreeAndNil(FBayesian);
365 FreeAndNil(FSelectResFilter);
369 FreeAndNil(FSetting);
374 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
375 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
376 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
379 function TGikoSys.IsNumeric(s: string): boolean;
390 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
391 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
392 \return s
\82ª
\95\84\8d\86\95t
\82«
\95\82\93®
\8f¬
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
394 function TGikoSys.IsFloat(s: string): boolean;
398 Result := TextToFloat(PChar(s), v, fvExtended);
401 // *************************************************************************
402 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
403 // *************************************************************************
404 function TGikoSys.GetBoardFileName: string;
406 Result := Setting.GetBoardFileName;
409 // *************************************************************************
410 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
411 // *************************************************************************
412 function TGikoSys.GetCustomBoardFileName: string;
414 Result := Setting.GetCustomBoardFileName;
417 // *************************************************************************
418 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
419 // *************************************************************************
420 function TGikoSys.GetHtmlTempFileName: string;
422 Result := Setting.GetHtmlTempFileName;
426 // *************************************************************************
427 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
428 // *************************************************************************
429 function TGikoSys.GetAppDir: string;
431 Result := Setting.GetAppDir;
434 // *************************************************************************
435 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
436 // *************************************************************************
437 function TGikoSys.GetTempFolder: string;
439 Result := Setting.GetTempFolder;
442 // *************************************************************************
443 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
444 // *************************************************************************)
445 function TGikoSys.GetSentFileName: string;
447 Result := Setting.GetSentFileName;
450 // *************************************************************************
451 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
452 // *************************************************************************
453 function TGikoSys.GetOutBoxFileName: string;
455 Result := Setting.GetOutBoxFileName;
458 // *************************************************************************
459 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
460 // *************************************************************************
461 function TGikoSys.GetConfigDir: string;
463 Result := Setting.GetConfigDir;
466 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
467 function TGikoSys.GetStyleSheetDir: string;
469 Result := Setting.GetStyleSheetDir;
472 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
473 function TGikoSys.GetSkinDir: string;
475 Result := Setting.GetSkinDir;
478 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
479 function TGikoSys.GetSkinHeaderFileName: string;
481 Result := Setting.SkinFiles.GetSkinHeaderFileName;
484 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
485 function TGikoSys.GetSkinFooterFileName: string;
487 Result := Setting.SkinFiles.GetSkinFooterFileName;
490 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
491 function TGikoSys.GetSkinNewResFileName: string;
493 Result := Setting.SkinFiles.GetSkinNewResFileName;
496 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
497 function TGikoSys.GetSkinResFileName: string;
499 Result := Setting.SkinFiles.GetSkinResFileName;
502 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
503 function TGikoSys.GetSkinBookmarkFileName: string;
505 Result := Setting.SkinFiles.GetSkinBookmarkFileName;
508 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
509 function TGikoSys.GetSkinNewmarkFileName: string;
511 Result := Setting.SkinFiles.GetSkinNewmarkFileName;
514 //! UserAgent
\8eæ
\93¾
515 function TGikoSys.GetUserAgent: string;
517 if Dolib.Connected then begin
518 Result := Format('%s %s/%s%d/%s', [
525 Result := Format('%s/%s %s/%s%d/%s', [
536 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
537 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
538 \return val
\82ð
\8e¦
\82· TDateTime
540 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
542 Result := ZERO_DATE + val / 86400.0;
546 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
547 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
548 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
550 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
552 Result := Trunc((ADate - ZERO_DATE) * 86400);
557 \brief Subject
\83t
\83@
\83C
\83\8bRead
558 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
560 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
562 ThreadItem: TThreadItem;
564 FileList: TStringList;
573 datFileCheck: Boolean;
575 FavoThreadItem : TFavoriteThreadItem;
585 if Board.IsThreadDatRead then
589 usePlugIn := Board.IsBoardPlugInAvailable;
590 //server := UrlToServer( Board.URL );
591 //
\83X
\83\8c\83b
\83h
\82Å
\8b¤
\92Ê
\82ÌURL
\95\94
592 if Board.is2ch then begin
593 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi/' + Board.BBSID + '/';
595 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi?bbs=' + Board.BBSID + '&key=';
598 FileName := Board.GetFolderIndexFileName;
601 datFileCheck := (Setting.CheckDatFile) or (not FileExists(FileName));
602 if (datFileCheck) then begin
603 FileList := TStringList.Create;
604 FileList.Sorted := True;
605 FileList.BeginUpdate;
606 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
607 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
611 //
\8fd
\95¡
\82ð
\96h
\82®
613 Board.Sorted := True;
614 sl := TStringList.Create;
616 if FileExists(FileName) then begin
617 sl.LoadFromFile(FileName);
618 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
619 for i := sl.Count - 1 downto 1 do begin
620 Rec := ParseIndexLine(sl[i]);
621 if (datFileCheck) then begin
622 islog := FileList.Find( Rec.FFileName, Index );
624 islog := (Rec.FSize <> 0) and (Rec.FCount <> 0);
627 ThreadItem := TThreadItem.Create(
630 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
632 if Board.is2ch then begin
633 ThreadItem := TThreadItem.Create(
636 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
641 ThreadItem := TThreadItem.Create(
644 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
651 ThreadItem.BeginUpdate;
652 if (datFileCheck) and (islog) then
653 FileList.Delete( Index );
655 ThreadItem.No := Rec.FNo;
656 ThreadItem.FileName := Rec.FFileName;
657 ThreadItem.Title := MojuUtils.UnSanitize(Rec.FTitle);
658 ThreadItem.Count := Rec.FCount;
659 ThreadItem.Size := Rec.FSize;
660 ThreadItem.RoundDate := Rec.FRoundDate;
661 ThreadItem.LastModified := Rec.FLastModified;
662 ThreadItem.Kokomade := Rec.FKokomade;
663 ThreadItem.NewReceive := Rec.FNewReceive;
664 ThreadItem.UnRead := Rec.FUnRead;
665 ThreadItem.ScrollTop := Rec.FScrollTop;
666 ThreadItem.AllResCount := Rec.FAllResCount;
667 ThreadItem.NewResCount := Rec.FNewResCount;
668 ThreadItem.AgeSage := Rec.FAgeSage;
669 ThreadItem.ParentBoard := Board;
670 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
672 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
673 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
676 ThreadItem.EndUpdate;
677 Board.Add(ThreadItem);
679 if (ThreadItem.UnRead) and (ThreadItem.IsLogFile) then
684 if UnRead <> Board.UnRead then
685 Board.UnRead := UnRead;
687 if (datFileCheck) then begin
688 //
\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
689 AddOutofIndexDat(Board, FileList);
693 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
694 RestoreThreadData( Board );
697 if (datFileCheck) then begin
700 Board.Sorted := False;
702 Board.IsThreadDatRead := True;
704 rt := GetTickCount - st;
705 Writeln('Read Done.' + IntToStr(rt) + ' ms');
709 \brief
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
710 \param Board
\92Ç
\89Á
\82·
\82é
\94Â
711 \param DatList dat
\83t
\83@
\83C
\83\8b\96¼
713 procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: Boolean = True);
716 Boardpath,FileName : String;
718 ThreadItem: TThreadItem;
722 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
723 //
\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
724 for i := 0 to DatList.Count - 1 do begin
725 FileName := Boardpath + DatList[i];
727 if (not AllCreate) then begin
729 ThreadItem := Board.FindThreadFromFileName(DatList[i]);
730 if (ThreadItem = nil) then begin
733 if Board.IsBoardPlugInAvailable then begin
734 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
736 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
740 if (ThreadItem = nil) then begin
741 if Board.IsBoardPlugInAvailable then begin
742 ThreadItem := TThreadItem.Create(
745 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
746 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
748 ThreadItem := TThreadItem.Create(
751 Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
752 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
757 ThreadItem.BeginUpdate;
758 ThreadItem.FileName := DatList[i];
759 //ThreadItem.FilePath := FileName;
760 ThreadItem.No := Board.Count + 1;
761 ThreadItem.Title := ResRec.FTitle;
762 ThreadItem.Count := GetFileLineCount(FileName);
763 ThreadItem.AllResCount := ThreadItem.Count;
764 ThreadItem.NewResCount := ThreadItem.Count;
765 ThreadItem.Size := GetFileSize(FileName) - ThreadItem.Count;//1byte
\82¸
\82ê
\82é
\82Æ
\82«
\82ª
\82 \82é
\82¯
\82Ç
\82»
\82ê
\82Í
\82 \82«
\82ç
\82ß
\82é
766 ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) );
767 ThreadItem.LastModified := ThreadItem.RoundDate;
768 ThreadItem.Kokomade := -1;
769 ThreadItem.NewReceive := 0;
770 ThreadItem.ParentBoard := Board;
771 ThreadItem.IsLogFile := True;
772 ThreadItem.Round := False;
773 ThreadItem.UnRead := False;
774 ThreadItem.ScrollTop := 0;
775 ThreadItem.AgeSage := gasNone;
776 ThreadItem.EndUpdate;
777 if (AllCreate) or (create) then begin
778 Board.Add(ThreadItem);
783 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
784 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
786 procedure TGikoSys.CreateThreadDat(Board: TBoard);
790 SubjectList: TStringList;
796 if not FileExists(Board.GetSubjectFileName) then Exit;
797 FileName := Board.GetFolderIndexFileName;
799 SubjectList := TStringList.Create;
801 SubjectList.LoadFromFile(Board.GetSubjectFileName);
802 sl := TStringList.Create;
806 sl.Add(FOLDER_INDEX_VERSION);
807 for i := 0 to SubjectList.Count - 1 do begin
808 Rec := DivideSubject(SubjectList[i]);
810 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
813 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
814 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
815 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
816 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
817 + Format('%x', [0]) + #1 //size
818 + Format('%x', [0]) + #1 //RoundDate
819 + Format('%x', [0]) + #1 //LastModified
820 + Format('%x', [0]) + #1 //Kokomade
821 + Format('%x', [0]) + #1 //NewReceive
822 + '0' + #1 //
\96¢
\8eg
\97p
823 + Format('%x', [0]) + #1 //UnRead
824 + Format('%x', [0]) + #1 //ScrollTop
825 + Format('%x', [Rec.FCount]) + #1 //AllResCount
826 + Format('%x', [0]) + #1 //NewResCount
827 + Format('%x', [0]); //AgeSage
829 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
830 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
832 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
833 MojuUtils.Sanitize(Rec.FTitle), //
\83^
\83C
\83g
\83\8b
834 Rec.FCount, //
\83J
\83E
\83\93\83g
843 Rec.FCount, //AllResCount
852 sl.SaveToFile(FileName);
862 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
863 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
865 procedure TGikoSys.WriteThreadDat(Board: TBoard);
867 // Values: array[Boolean] of string = ('0', '1');
873 TmpFileList: TStringList;
875 if not Board.IsThreadDatRead then
877 FileName := Board.GetFolderIndexFileName;
878 ForceDirectoriesEx( ExtractFilePath( FileName ) );
880 sl := TStringList.Create;
881 TmpFileList := TStringList.Create;
882 TmpFileList.Sorted := true;
884 TmpFileList.BeginUpdate;
885 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
886 TmpFileList.EndUpdate;
888 sl.Add(FOLDER_INDEX_VERSION);
890 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
891 Sort.SetSortNoFlag(true);
892 Sort.SetSortOrder(true);
893 Sort.SetSortIndex(0);
894 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
895 Board.CustomSort(ThreadItemSortProc);
897 for i := 0 to Board.Count - 1 do begin
898 Board.Items[i].No := i + 1;
899 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
900 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
901 [Board.Items[i].No, //
\94Ô
\8d\86
902 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
903 MojuUtils.Sanitize(Board.Items[i].Title), //
\83^
\83C
\83g
\83\8b
904 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
905 Board.Items[i].Size, //size
906 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
907 DateTimeToInt(Board.Items[i].LastModified), //LastModified
908 Board.Items[i].Kokomade, //Kokomade
909 Board.Items[i].NewReceive, //NewReceive
911 BoolToInt(Board.Items[i].UnRead), //UnRead
912 Board.Items[i].ScrollTop, //ScrollTop
913 Board.Items[i].AllResCount, //AllResCount
914 Board.Items[i].NewResCount, //NewResCount
915 Ord(Board.Items[i].AgeSage)] //AgeSage
921 sl.SaveToFile(FileName);
923 for i := 0 to TmpFileList.Count - 1 do begin
924 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
934 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
935 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
936 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
938 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
940 Result.FNo := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
941 Result.FFileName := MojuUtils.RemoveToken(Line, #1);
942 Result.FTitle := MojuUtils.UnSanitize(MojuUtils.RemoveToken(Line, #1));
943 Result.FCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
944 Result.FSize := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
945 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
946 Result.FLastModified := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
947 Result.FKokomade := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), -1);
948 Result.FNewReceive := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
949 RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
950 Result.FUnRead := IntToBool(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
951 Result.FScrollTop := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
952 Result.FAllResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
953 Result.FNewResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
954 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
959 \brief
\8ew
\92è
\83t
\83H
\83\8b\83_
\93à
\82Ì
\8ew
\92è
\83t
\83@
\83C
\83\8b\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
960 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
961 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
962 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
963 \param SubDir
\92\86\82Ì
\83t
\83H
\83\8b\83_
\82Ü
\82Å
\8dÄ
\8bA
\93I
\82É
\83\8a\83X
\83g
\82·
\82é
\8fê
\8d\87\82Í True
964 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
966 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
967 \93Á
\92è
\82Ì
\83t
\83@
\83C
\83\8b\96¼
\82â
\93Á
\92è
\82Ì
\8ag
\92£
\8eq
\82É
\8di
\82Á
\82½
\83\8a\83X
\83g
\83A
\83b
\83v
\82ª
\89Â
\94\
\82Å
\82·
\81B
971 GetFileList('c:\', '*.txt', list, True, True);
974 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
977 SearchRec : TSearchRec;
980 Path := IncludeTrailingPathDelimiter(Path);
981 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
983 while rc = 0 do begin
984 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
985 s := Path + SearchRec.Name;
987 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
991 List.Add(SearchRec.Name);
992 if SubDir and (SearchRec.Attr and faDirectory > 0) then
993 GetFileList(s, Mask, List, True, IsPathAdd);
995 rc := FindNext(SearchRec);
998 SysUtils.FindClose(SearchRec);
1004 \breif
\8ew
\92è
\83t
\83H
\83\8b\83_
\93à
\82Ì
\8ew
\92è
\83t
\83@
\83C
\83\8b\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\81B
1005 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
1006 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1007 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
1008 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1009 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
1010 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
1013 GetFileList('c:\', '*.txt', list, True);
1016 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
1019 SearchRec : TSearchRec;
1021 Path := IncludeTrailingPathDelimiter(Path);
1022 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
1024 while rc = 0 do begin
1025 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1026 if (SearchRec.Attr and faDirectory = 0) then begin
1027 if IsPathAdd then begin
1028 List.Add(Path + SearchRec.Name)
1030 List.Add(SearchRec.Name);
1034 rc := FindNext(SearchRec);
1037 SysUtils.FindClose(SearchRec);
1043 \brief
\8ew
\92è
\83t
\83H
\83\8b\83_
\93à
\82Ì
\83f
\83B
\83\8c\83N
\83g
\83\8a\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
1044 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1045 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1046 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1047 \param SubDir
\92\86\82Ì
\83t
\83H
\83\8b\83_
\82Ü
\82Å
\8dÄ
\8bA
\93I
\82É
\83\8a\83X
\83g
\82·
\82é
\8fê
\8d\87\82Í True
1049 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1050 \93Á
\92è
\82Ì
\83t
\83@
\83C
\83\8b\96¼
\82â
\93Á
\92è
\82Ì
\8ag
\92£
\8eq
\82É
\8di
\82Á
\82½
\83\8a\83X
\83g
\83A
\83b
\83v
\82ª
\89Â
\94\
\82Å
\82·
\81B
1054 GetDirectoryList('c:\', '*.txt', list, True);
1057 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1060 SearchRec : TSearchRec;
1063 Path := IncludeTrailingPathDelimiter(Path);
1064 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1066 while rc = 0 do begin
1067 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1068 s := Path + SearchRec.Name;
1069 //if (SearchRec.Attr and faDirectory > 0) then
1070 // s := IncludeTrailingPathDelimiter(s)
1072 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1073 List.Add( IncludeTrailingPathDelimiter( s ) );
1074 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1075 GetDirectoryList(s, Mask, List, True);
1077 rc := FindNext(SearchRec);
1080 SysUtils.FindClose(SearchRec);
1086 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1087 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1088 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1090 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1100 if AnsiPos('<>', Line) = 0 then
1104 Result.FFileName := RemoveToken(Line, Delim);
1105 Result.FTitle := Trim(RemoveToken(Line, Delim));
1107 ws := Result.FTitle;
1108 if Copy(ws, Length(ws), 1) = ')' then begin
1111 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1114 end else if Copy(ws, Length(ws), 1) = '>' then begin
1118 for i := Length(ws) - 1 downto 1 do begin
1119 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1120 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1121 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1122 if IsNumeric(ws) then
1123 Result.FCount := StrToInt(ws);
1124 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1131 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1132 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1135 function TGikoSys.UrlToID(url: string): string;
1142 if url = '' then Exit;
1144 url := Copy(url, 0, Length(url) - 1);
1145 for i := Length(url) downto 0 do begin
1146 if url[i] = '/' then begin
1147 Result := Copy(url, i + 1, Length(url));
1157 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1158 \param url
\89ð
\8eß
\82·
\82é URL
1159 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1161 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1163 function TGikoSys.UrlToServer(url: string): string;
1170 wsURL := Trim(wsURL);
1172 if wsURL = '' then exit;
1174 if Copy(wsURL, Length(wsURL), 1) = '/' then
1175 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1177 for i := Length(wsURL) downto 0 do begin
1178 if wsURL[i] = '/' then begin
1179 Result := Copy(wsURL, 0, i);
1186 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1187 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1188 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1190 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1194 Code := GetFileAttributes(PChar(Name));
1195 Result := (Code <> Cardinal(-1)) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1199 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1200 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1201 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1203 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1206 if Length(Dir) = 0 then
1207 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1208 Dir := ExcludeTrailingPathDelimiter(Dir);
1209 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1210 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1211 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1215 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
\81i
\8f\89\8aú
\8f\88\97\9d\81j
1216 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1217 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1218 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1219 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1220 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1221 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1223 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1227 Result := StrTokNext(sep, Rec);
1231 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1232 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1233 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1234 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1235 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1236 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1238 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1245 if Len >= Pos then begin
1246 while (Pos <= Len) and (Str[Pos] in sep) do begin
1250 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1251 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1256 Result := Copy(Str, I, Pos - I);
1257 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1265 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1266 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1267 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1269 function TGikoSys.GetFileSize(FileName : string): longint;
1274 if not FileExists(FileName) then begin
1278 Assign(F, FileName);
1280 Result := FileSize(F);
1288 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1289 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1291 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1293 function TGikoSys.GetFileLineCount(FileName : string): longint;
1297 sl := TStringList.Create;
1300 sl.LoadFromFile(FileName);
1312 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1313 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1314 \param Line
\8ew
\92è
\8ds
1315 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1316 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1318 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1320 fileTmp : TStringList;
1323 if FileExists(FileName) then begin
1324 fileTmp := TStringList.Create;
1327 fileTmp.LoadFromFile( FileName );
1328 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1329 Result := fileTmp.Strings[ Line-1 ];
1332 //on EFOpenError do Result := '';
1341 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1342 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1344 procedure TGikoSys.MenuFont(Font: TFont);
1347 nm: NONCLIENTMETRICS;
1349 nm.cbSize := sizeof(NONCLIENTMETRICS);
1350 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1351 lf := nm.lfMenuFont;
1352 Font.Name := lf.lfFaceName;
1353 Font.Height := lf.lfHeight;
1355 if lf.lfWeight >= 700 then
1356 Font.Style := Font.Style + [fsBold];
1357 if lf.lfItalic = 1 then
1358 Font.Style := Font.Style + [fsItalic];
1362 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1363 \param s IN/OUT:
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
\81A
\90Ø
\82è
\8fo
\82µ
\82½
\8cã
\82Ì
\8ec
\82è
\82Ì
\95¶
\8e\9a\97ñ
1364 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1365 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1367 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1369 function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1373 p := AnsiPos(delimiter, s);
1377 Result := Copy(s, 1, p - 1);
1378 Delete(s, 1, Length(Result) + Length(delimiter));
1383 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1384 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1385 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1386 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1388 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1390 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1395 for i := 0 to index do
1396 Result := RemoveToken(s, delimiter);
1400 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1401 {procedure TGikoSys.FlashExitWrite;
1405 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1406 for i := 0 to FExitWrite.Count - 1 do
1407 WriteThreadDat(FExitWrite[i]);
1412 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1413 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1414 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1415 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1419 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1421 ERASECHAR : array [1..39] of string =
1422 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1423 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1424 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1425 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1427 Chr : array [0..255] of char;
1431 s := Trim(LongName);
1432 if (Length(s) <= ALength) then begin
1436 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1437 S := CustomStringReplace(S, ERASECHAR[i], '');
1439 if (Length(S) <= ALength) then begin
1442 Windows.LCMapString(
1443 GetUserDefaultLCID(),
1451 S := Copy(S,1,ALength);
1453 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1454 S := Copy(S, 1, Length(S) - 1);
1465 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1466 \return False..0, True..1
1468 function TGikoSys.BoolToInt(b: Boolean): Integer;
1470 Result := IfThen(b, 1, 0);
1474 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1475 \return 1..True, other..False
1476 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1477 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1479 function TGikoSys.IntToBool(i: Integer): Boolean;
1485 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1486 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1487 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1488 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1490 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1494 GZipStream: TGzipDecompressStream;
1495 TextStream: TStringStream;
1496 buf: array[0..BUF_SIZE - 1] of Byte;
1502 TextStream := TStringStream.Create('');
1504 //
\83m
\81[
\83g
\83\93\83E
\83\93\83`
\83E
\83B
\83\8b\83X2003
\91Î
\8dô(x-gzip
\82Æ
\82©
\82É
\82È
\82é
\82Ý
\82½
\82¢)
1505 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1506 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1507 ResStream.Position := 0;
1508 GZipStream := TGzipDecompressStream.Create(TextStream);
1511 FillChar(buf, BUF_SIZE, 0);
1512 cnt := ResStream.Read(buf, BUF_SIZE);
1514 GZipStream.Write(buf, BUF_SIZE);
1520 ResStream.Position := 0;
1522 FillChar(buf, BUF_SIZE, 0);
1523 cnt := ResStream.Read(buf, BUF_SIZE);
1525 TextStream.Write(buf, BUF_SIZE);
1529 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1530 s := TextStream.DataString;
1533 while (i > 0) and (s[i] = #0) do
1535 Delete(s, i + 1, ln - i);
1538 while i <> 0 do begin
1550 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1551 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1552 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1554 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1556 STD_SEC = 'KeySetting';
1562 SecList: TStringList;
1563 Component: TComponent;
1565 if not FileExists(fileName) then
1567 SecList := TStringList.Create;
1568 ini := TMemIniFile.Create(fileName);
1570 ini.ReadSection(STD_SEC, SecList);
1571 for i := 0 to SecList.Count - 1 do begin
1572 ActionName := SecList[i];
1573 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1574 if ActionKey <> -1 then begin
1575 Component := ActionList.Owner.FindComponent(ActionName);
1576 if TObject(Component) is TAction then begin
1577 TAction(Component).ShortCut := ActionKey;
1588 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82é
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\83t
\83@
\83C
\83\8b\82É
\95Û
\91¶
1589 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1590 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1592 ActionList
\82É
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82é
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð FileName
\82É
\95Û
\91¶
\82µ
\82Ü
\82·
\81B
1594 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1596 STD_SEC = 'KeySetting';
1601 ini := TMemIniFile.Create(GetConfigDir + FileName);
1603 for i := 0 to ActionList.ActionCount - 1 do begin
1604 if ActionList.Actions[i].Tag = -1 then
1606 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1616 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1617 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1618 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1620 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1622 PI: TProcessInformation;
1626 Path := '"' + AppPath + '"';
1628 Path := Path + ' ' + Param;
1630 SI.Cb := SizeOf(Si);
1631 SI.lpReserved := nil;
1632 SI.lpDesktop := nil;
1635 SI.cbReserved2 := 0;
1636 SI.lpReserved2 := nil;
1638 Windows.CreateProcess(nil,
1651 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1652 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1653 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1655 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1659 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1660 gbtUserApp, gbtAuto:
1661 if (Setting.URLApp) and (FileExists(Setting.URLAppFile)) then
1662 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1664 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1669 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1670 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1671 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1673 function TGikoSys.HTMLDecode(const AStr: String): String;
1675 Sp, Rp, Cp, Tp: PChar;
1680 SetLength(Result, Length(AStr));
1682 Rp := PChar(Result);
1685 while Sp^ <> #0 do begin
1691 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1697 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1701 while (Sp^ <> ';') and (Sp^ <> #0) do
1708 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1716 Num := IsNumeric(Copy(Tp, 1, 1));
1717 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1718 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1722 SetString(S, Tp, Sp - Tp);
1727 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1728 //[Cp^ + Sp^, Cp - PChar(AStr)])
1738 // on E:EConvertError do
1739 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1740 // [Cp^ + Sp^, Cp - PChar(AStr)])
1742 SetLength(Result, Rp - PChar(Result));
1746 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1747 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1748 \return
\8eæ
\93¾
\82µ
\82½ URL
1750 function TGikoSys.GetHRefText(s: string): string;
1760 Index := AnsiPos('href', LowerCase(s));
1763 s := Trim(Copy(s, Index + 4, Length(s)));
1764 s := Trim(Copy(s, 2, Length(s)));
1766 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1767 //if Copy(s, 1, 1) = '"' then begin
1768 if s[1] = '"' then begin
1769 s := Trim(Copy(s, 2, Length(s)));
1772 Index := AnsiPos('"', s);
1773 if Index <> 0 then begin
1774 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1775 s := Copy(s, 1, Index - 1);
1777 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1778 Index := AnsiPos(' ', s);
1779 Index2 := AnsiPos('>', s);
1782 if Index > Index2 then
1785 s := Copy(s, 1, Index - 1)
1787 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1794 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1795 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1796 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1798 function TGikoSys.Is2chHost(Host: string): Boolean;
1800 HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
1806 if RightStr( Host, 1 ) = '/' then
1807 Host := Copy( Host, 1, Length( Host ) - 1 );
1808 OutputDebugString(pchar(HOST_NAME[0]));
1809 for i := 0 to Length(HOST_NAME) - 1 do begin
1810 // Len := Length(HOST_NAME[i]);
1811 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1812 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1820 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1821 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1822 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1823 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1824 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1825 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1826 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1828 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1838 Index := AnsiPos(READ_PATH, path);
1839 if Index <> 0 then begin
1840 s := Copy(path, Index + Length(READ_PATH), Length(path));
1842 if (Length(s) > 0) and (s[1] = '/') then
1844 BBSID := GetTokenIndex(s, '/', 0);
1845 BBSKey := GetTokenIndex(s, '/', 1);
1848 Result := (BBSID <> '') or (BBSKey <> '');
1851 Index := AnsiPos(KAKO_PATH, path);
1852 if Index <> 0 then begin
1853 s := Copy(path, 2, Length(path));
1854 BBSID := GetTokenIndex(s, '/', 0);
1855 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1856 BBSID := GetTokenIndex(s, '/', 1);
1857 BBSKey := ChangeFileExt(Document, '');
1858 Result := (BBSID <> '') or (BBSKey <> '');
1861 Index := AnsiPos('read.cgi?', URL);
1862 if Index <> 0 then begin
1863 SList := TStringList.Create;
1866 // s := HTMLDecode(Document);
1867 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1868 BBSID := SList.Values['bbs'];
1869 BBSKey := SList.Values['key'];
1870 Result := (BBSID <> '') or (BBSKey <> '');
1882 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1883 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1884 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1885 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1887 http://2ch.net/
\92\86\97ª/32-50 \n
1888 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1890 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1897 URL := Trim(LowerCase(URL));
1898 if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
1902 buf := Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 );
1904 stRes := StrToInt64( buf );
1905 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1906 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
1908 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, Length( URL ) - AnsiPos('&to=', URL ) - 4 + 1 );
1911 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1912 buf := Copy( buf, 1, ps );
1916 endRes := StrToInt64(buf)
1923 if (stRes <> 0) and (endRes = 0) then
1924 endRes := stRes + MAX_POPUP_RES
1925 else if (stRes = 0) and (endRes <> 0) then begin
1926 stRes := endRes - MAX_POPUP_RES;
1930 GikoSys.GetBrowsableThreadURL( URL );
1931 end else if( AnsiPos('&res=', URL ) <> 0 ) then begin
1933 buf := Copy( URL, AnsiPos('&res=', URL ) + 5, Length( URL ) - AnsiPos('&res=', URL ) - 5 + 1 );
1936 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1937 buf := Copy( buf, 1, ps );
1940 stRes := StrToInt(buf)
1947 end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
1949 stRes := StrToInt64( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
1950 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1951 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, AnsiPos( '&nofirst=',URL) - AnsiPos('&end=', URL ) - 5);
1953 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, Length( URL ) - AnsiPos('&to=', URL ) - 5 + 1 );
1956 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1957 buf := Copy( buf, 1, ps );
1961 endRes := StrToInt64(buf);
1968 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
1969 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
1970 if Length(buf) > 0 then begin
1971 if AnsiPos('-', buf) = 1 then begin
1976 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1978 convBuf := Copy( buf, 1, ps );
1979 if convBuf <> '' then
1980 endRes := StrToInt64(convBuf)
1986 if endRes <> 0 then begin
1987 stRes := endRes - MAX_POPUP_RES;
1994 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1996 convBuf := Copy( buf, 1, ps );
1997 if convBuf <> '' then begin
1998 stRes := StrToInt64(convBuf);
2002 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2004 convBuf := Copy( buf, 1, ps );
2005 if convBuf <> '' then
2006 endRes := StrToInt64(convBuf)
2028 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2029 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2030 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2032 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2037 // convBuf : String;
2048 URL := Trim(LowerCase(URL));
2053 Result.FFirst := False;
2054 Result.FStBegin := False;
2055 Result.FToEnd := False;
2056 Result.FDone := False;
2057 Result.FNoParam := False;
2061 if URL[length(URL)] = '\' then
2063 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2064 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2065 s := Copy(URL, RStart + RLength - 1, Length(URL));
2067 //
\95W
\8f\80\8f\91\8e®
2068 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2069 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2070 FAWKStr.RegExp := '/test/read.cgi/.+/[0-9]+/?.*';
2071 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2072 s := Copy(s, 15, Length(s));
2074 SList := TStringList.Create;
2077 FAWKStr.RegExp := '/';
2078 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2079 Result.FBBS := SList[1];
2080 Result.FKey := SList[2];
2081 if SList.Count >= 4 then
2085 Result.FNoParam := true;
2091 FAWKStr.LineSeparator := mcls_CRLF;
2092 FAWKStr.RegExp := '-';
2093 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2094 Result.FFirst := True;
2096 FAWKStr.RegExp := 'l[0-9]+';
2097 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2098 Result.FFirst := True;
2100 for i := 0 to SList.Count - 1 do begin
2101 if Trim(SList[i]) = '' then begin
2103 Result.FStBegin := True;
2104 if i = (SList.Count - 1) then
2105 Result.FToEnd := True;
2106 end else if IsNumeric(SList[i]) then begin
2107 wkInt := StrToInt(SList[i]);
2108 wkMax := Max(wkMax, wkInt);
2112 wkMin := Min(wkMin, wkInt);
2113 end else if Trim(SList[i]) = 'n' then begin
2114 Result.FFirst := True;
2116 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2117 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2118 if Copy(SList[i], 1, 1) = 'n' then
2119 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2121 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2122 Result.FFirst := True;
2123 wkMax := Max(wkMax, wkInt);
2127 wkMin := Min(wkMin, wkInt);
2131 if Result.FStBegin and (not Result.FToEnd) then
2133 else if (not Result.FStBegin) and Result.FToEnd then
2135 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2136 Result.FSt := wkMin;
2137 Result.FTo := wkMax;
2139 //Result.FSt := wkMin;
2140 //Result.FTo := wkMax;
2146 Result.FDone := True;
2150 //
\90Vkako
\8f\91\8e®
2151 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2152 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2153 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2154 SList := TStringList.Create;
2157 FAWKStr.RegExp := '/';
2158 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2159 Result.FBBS := SList[1];
2160 Result.FKey := ChangeFileExt(SList[5], '');
2161 Result.FFirst := True;
2167 Result.FDone := True;
2171 //
\8b\8ckako
\8f\91\8e®
2172 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2173 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2174 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2175 SList := TStringList.Create;
2178 FAWKStr.RegExp := '/';
2179 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2180 Result.FBBS := SList[1];
2181 Result.FKey := ChangeFileExt(SList[4], '');
2182 Result.FFirst := True;
2188 Result.FDone := True;
2192 //log
\8by
\82Ñlog2
\8f\91\8e®
2193 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2194 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2195 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2196 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2197 SList := TStringList.Create;
2200 FAWKStr.RegExp := '/';
2201 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2202 Result.FBBS := SList[2];
2203 Result.FKey := ChangeFileExt(SList[5], '');
2204 Result.FFirst := True;
2210 Result.FDone := True;
2215 //
\8b\8cURL
\8f\91\8e®
2216 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2217 FAWKStr.RegExp := '/test/read\.cgi\?';
2218 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2219 s := Copy(s, 16, Length(s));
2220 SList := TStringList.Create;
2223 FAWKStr.RegExp := '&';
2224 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2225 Result.FFirst := True;
2226 for i := 0 to SList.Count - 1 do begin
2227 if Pos('bbs=', SList[i]) = 1 then begin
2228 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2229 end else if Pos('key=', SList[i]) = 1 then begin
2230 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2231 end else if Pos('st=', SList[i]) = 1 then begin
2232 wk := Copy(SList[i], 4, Length(SList[i]));
2233 if IsNumeric(wk) then
2234 Result.FSt := StrToInt(wk)
2235 else if wk = '' then
2236 Result.FStBegin := True;
2237 end else if Pos('to=', SList[i]) = 1 then begin
2238 wk := Copy(SList[i], 4, Length(SList[i]));
2239 if IsNumeric(wk) then
2240 Result.FTo := StrToInt(wk)
2241 else if wk = '' then
2242 Result.FToEnd := True;
2243 end else if Pos('nofirst=', SList[i]) = 1 then begin
2244 Result.FFirst := False;
2253 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2254 Result.FDone := True;
2262 \brief URI
\82ð
\95ª
\89ð
2263 \param URL
\95ª
\89ð
\82·
\82é URI
2264 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2265 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2266 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2267 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2268 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2269 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2271 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2281 URI := TIdURI.Create(URL);
2283 Protocol := URI.Protocol;
2286 Document := URI.Document;
2288 Bookmark := URI.Bookmark;
2295 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2296 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2298 function TGikoSys.GetVersionBuild: Integer;
2300 FixedFileInfo: PVSFixedFileInfo;
2301 VersionHandle, VersionSize: DWORD;
2302 pVersionInfo: Pointer;
2307 AppFile := Application.ExeName;
2308 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2309 if VersionSize = 0 then
2311 GetMem(pVersionInfo, VersionSize);
2313 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2314 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2315 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2317 FreeMem(pVersionInfo, VersionSize);
2322 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2323 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2324 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2326 \83X
\83\8c\83b
\83h URL
\82ð
\83M
\83R
\83i
\83r
\82Ì
\92\86\82Å
\88ê
\88Ó
\82È
\82à
\82Ì
\82É
\90³
\8bK
\89»
\82µ
\82Ü
\82·
\81B
2327 \88ê
\88Ó
\82È URL
\82É
\82·
\82é
\8e\96\82Å
\81AURL
\82©
\82ç
\83X
\83\8c\83b
\83h
\82ð
\93±
\82«
\8fo
\82·
\8dì
\8bÆ
\82ð
\8dÅ
\93K
\89»
\82µ
\82Ü
\82·
\81B\n
2328 \90³
\8bK
\89»
\82Ì
\95û
\90j
\82Æ
\82µ
\82Ä
\81A
\83T
\83C
\83g
\82ª
\90\84\8f§
\82·
\82é
\83f
\83t
\83H
\83\8b\83g
\82Ì URL
\82É
\82È
\82é
\82æ
\82¤
\82É
\90S
\82ª
\82¯
\82Ü
\82·
\81B
2329 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2331 \97á(
\90³
\8bK
\89»
\91O):\n
2332 http://
\92\86\97ª/ \n
2333 http://
\92\86\97ª/20-100
2335 (
\90³
\8bK
\89»
\8cã):\n
2336 http://
\92\86\97ª/l50
2338 function TGikoSys.GetBrowsableThreadURL(
2342 threadItem : TThreadItem;
2343 boardPlugIn : TBoardPlugIn;
2348 //=====
\83v
\83\89\83O
\83C
\83\93
2350 for i := Length( BoardGroups ) - 1 downto 1 do begin
2351 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2352 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2353 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2354 if board <> nil then begin
2355 boardPlugIn := BoardGroups[i].BoardPlugIn;
2356 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2357 Result := threadItem.URL;
2366 // exception
\82ª
\94
\90¶
\82µ
\82½
\8fê
\8d\87\82Í
\93à
\95\94\8f\88\97\9d\82É
\94C
\82¹
\82½
\82¢
\82Ì
\82Å
\82±
\82±
\82Å
\82Í
\89½
\82à
\82µ
\82È
\82¢
2369 if Length( Result ) = 0 then
2370 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2375 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2376 \param inURL
\83X
\83\8c\83b
\83h URL
2379 function TGikoSys.GetThreadURL2BoardURL(
2383 threadItem : TThreadItem;
2384 boardPlugIn : TBoardPlugIn;
2389 //=====
\83v
\83\89\83O
\83C
\83\93
2391 for i := Length( BoardGroups ) - 1 downto 1 do begin
2392 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2393 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2394 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2395 boardPlugIn := BoardGroups[i].BoardPlugIn;
2396 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2397 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2405 // exception
\82ª
\94
\90¶
\82µ
\82½
\8fê
\8d\87\82Í
\93à
\95\94\8f\88\97\9d\82É
\94C
\82¹
\82½
\82¢
\82Ì
\82Å
\82±
\82±
\82Å
\82Í
\89½
\82à
\82µ
\82È
\82¢
2408 if Length( Result ) = 0 then
2409 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2414 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2415 \param inURL
\83X
\83\8c\83b
\83h URL
2417 \see TGikoSys.GetThreadURL2BoardURL
2419 function TGikoSys.Get2chThreadURL2BoardURL(
2423 Protocol, Host, Path, Document, Port, Bookmark : string;
2424 BBSID, BBSKey : string;
2428 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2429 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2431 foundPos := Pos( '/test/read.cgi', inURL );
2432 if {(Is2chHost(Host)) and} (foundPos > 0) then
2433 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2435 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2440 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2441 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2442 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2443 \see TGikoSys.GetBrowsableThreadURL
2445 function TGikoSys.Get2chBrowsableThreadURL(
2449 Protocol, Host, Path, Document, Port, Bookmark : string;
2450 BBSID, BBSKey : string;
2454 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2457 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2458 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2459 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2461 if Is2chHost( Host ) then begin
2462 Result := Protocol + '://' + Host +
2463 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2465 if foundPos > 0 then
2466 Result := Copy( inURL, 1, foundPos ) +
2467 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2469 Result := Protocol + '://' + Host +
2470 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2477 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2478 \param inBoard
\94Â URL
2479 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2480 \return
\83X
\83\8c\83b
\83h URL
2482 function TGikoSys.Get2chBoard2ThreadURL(
2490 server := UrlToServer( inBoard.URL );
2491 //if Is2chHost( server ) then
2492 if inBoard.Is2ch then
2493 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2495 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2500 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2502 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2504 procedure TGikoSys.ListBoardFile;
2506 boardFileList : TStringList;
2511 for i := 0 to Length( BBSs ) - 1 do
2515 SetLength( BBSs, 0 );
2518 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2519 if FileExists( GikoSys.GetBoardFileName ) then begin
2520 SetLength( BBSs, l + 1 );
2521 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2522 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2526 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2527 SetLength( BBSs, l + 1 );
2528 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2529 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2533 // Board
\83t
\83H
\83\8b\83_
2534 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2535 BoardFileList := TStringList.Create;
2537 BoardFileList.BeginUpdate;
2538 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*.txt', BoardFileList, True, True );
2539 BoardFileList.EndUpdate;
2540 SetLength( BBSs, l + BoardFileList.Count );
2541 for i := BoardFileList.Count - 1 downto 0 do begin
2542 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2543 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2553 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2554 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2556 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2561 boardFile : TStringList;
2562 CategoryList : TStringList;
2563 BoardList : TStringList;
2564 Category : TCategory;
2568 // RoundItem : TRoundItem;
2570 i, iBound : Integer;
2571 j, jBound : Integer;
2572 k, kBound : Integer;
2575 if not FileExists( bbs.FilePath ) then
2579 ini := TMemIniFile.Create('');
2580 boardFile := TStringList.Create;
2583 boardFile.LoadFromFile( bbs.FilePath );
2585 ini.SetStrings( boardFile );
2586 CategoryList := TStringList.Create;
2587 BoardList := TStringList.Create;
2589 ini.ReadSections( CategoryList );
2591 iBound := CategoryList.Count - 1;
2592 for i := 0 to iBound do begin
2593 ini.ReadSection( CategoryList[i], BoardList );
2594 Category := TCategory.Create;
2595 Category.No := i + 1;
2596 Category.Title := CategoryList[i];
2598 jBound := BoardList.Count - 1;
2599 for j := 0 to jBound do begin
2601 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2602 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2603 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2604 //=====
\83v
\83\89\83O
\83C
\83\93
2606 kBound := Length(BoardGroups) - 1;
2607 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2608 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2609 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2610 if not BoardGroups[k].Find(inistr, p) then begin
2611 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2612 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2613 if not BoardGroups[k].Find(tmpstring, p) then begin
2615 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2616 BoardGroups[k].AddObject(tmpstring, Board);
2617 Category.Add(Board);
2619 //
\82±
\82±
\82É
\97\88\82é
\82Æ
\82µ
\82½
\82çBoard
\82Ì
\8dì
\90¬
\82É
\8e¸
\94s
\82µ
\82½
\82Æ
\82«
\82¾
\82©
\82çBoard
\82ðnil
\82É
\82·
\82é
2623 Board := TBoard(BoardGroups[k].Objects[p]);
2624 if Board.ParentCategory <> Category then
2625 Category.Add(Board);
2629 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2630 BoardGroups[k].AddObject(tmpstring, Board);
2631 Category.Add(Board);
2633 //
\82±
\82±
\82É
\97\88\82é
\82Æ
\82µ
\82½
\82çBoard
\82Ì
\8dì
\90¬
\82É
\8e¸
\94s
\82µ
\82½
\82Æ
\82«
\82¾
\82©
\82çBoard
\82ðnil
\82É
\82·
\82é
2638 Board := TBoard(BoardGroups[k].Objects[p]);
2639 if Board.ParentCategory <> Category then
2640 Category.Add(Board);
2647 // exception
\82ª
\94
\90¶
\82µ
\82½
\8fê
\8d\87\82Í
\93à
\95\94\8f\88\97\9d\82É
\94C
\82¹
\82½
\82¢
\82Ì
\82Å
\82±
\82±
\82Å
\82Í
\89½
\82à
\82µ
\82È
\82¢
2650 if (Board = nil) then begin
2651 if not BoardGroups[0].Find(inistr,p) then begin
2652 Board := TBoard.Create( nil, inistr );
2653 BoardGroups[0].AddObject(inistr, Board);
2654 Category.Add(Board);
2656 Board := TBoard(BoardGroups[0].Objects[p]);
2657 if Board.ParentCategory <> Category then
2658 Category.Add(Board);
2662 if (Board.Multiplicity = 0) then begin
2665 Board.Multiplicity := 1;
2666 Board.Title := BoardList[j];
2667 Board.RoundDate := ZERO_DATE;
2672 Board.Multiplicity := Board.Multiplicity + 1;
2677 bbs.Add( Category );
2682 bbs.IsBoardFileRead := True;
2695 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2696 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2698 function TGikoSys.GetUnknownCategory : TCategory;
2700 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2703 if Length( BBSs ) < 2 then begin
2708 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2709 if Result = nil then begin
2710 Result := TCategory.Create;
2711 Result.Title := UNKNOWN_CATEGORY;
2712 BBSs[ 1 ].Add( Result );
2718 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2719 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2721 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2723 category : TCategory;
2725 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2728 category := GetUnknownCategory;
2729 if category = nil then begin
2732 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2733 if Result = nil then begin
2734 Result := TBoard.Create( inPlugIn, inURL );
2735 Result.Title := UNKNOWN_BOARD;
2736 category.Add( Result );
2743 function TGikoSys.GetSambaFileName : string;
2745 Result := Setting.GetSambaFileName;
2749 \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
2750 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2751 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2752 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2753 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2755 function TGikoSys.GetSameIDResAnchor(
2756 const AID : string; ThreadItem: TThreadItem;
2757 limited: Integer):string;
2762 ResLink : TResLinkRec;
2764 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2766 Res.FType := glt2chNew;
2769 if (not IsNoValidID(AID)) and
2770 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2771 body := TStringList.Create;
2773 GetSameIDRes(AID, ThreadItem, body);
2774 if (limited > 0) and (body.Count > limited) then begin
2775 for i := body.Count - limited to body.Count - 1 do begin
2776 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2779 for i := 0 to body.Count - 1 do begin
2780 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2786 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2787 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2788 HTMLCreater.ConvRes(@Res, @ResLink, false);
2789 Result := Res.FBody;
2794 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2795 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2796 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2797 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2799 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2802 ReadList: TStringList;
2804 boardPlugIn : TBoardPlugIn;
2806 if (not IsNoValidID(AID)) and
2807 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2808 //if ThreadItem.IsBoardPlugInAvailable then begin
2809 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2810 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2811 //boardPlugIn := ThreadItem.BoardPlugIn;
2812 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2814 for i := 0 to threadItem.Count - 1 do begin
2816 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2817 if(AnsiPos(AID, Res.FDateTime) > 0) then begin
2818 body.Add(IntToStr(i+1));
2822 ReadList := TStringList.Create;
2824 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2825 for i := 0 to ReadList.Count - 1 do begin
2826 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2827 if AnsiPos(AID, Res.FDateTime) > 0 then begin
2828 body.Add(IntToStr(i+1));
2839 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2840 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2841 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2842 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2845 function TGikoSys.GetSameIDResAnchor(AIDNum : Integer;
2846 ThreadItem: TThreadItem;
2847 limited: Integer):string;
2852 ResLink : TResLinkRec;
2854 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2856 Res.FType := glt2chNew;
2859 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2860 body := TStringList.Create;
2862 GetSameIDRes(AIDNum, ThreadItem, body);
2863 if (limited > 0) and ( body.Count > limited) then begin
2864 for i := body.Count - 20 to body.Count - 1 do begin
2865 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2868 for i := 0 to body.Count - 1 do begin
2869 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2875 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2876 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2877 HTMLCreater.ConvRes(@Res, @ResLink, false);
2878 Result := Res.FBody;
2883 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2884 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2885 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2886 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2888 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2892 AID := GetResID(AIDNum, ThreadItem);
2893 if not IsNoValidID(AID) then begin
2894 GetSameIDRes(AID, ThreadItem, body);
2898 \brief
\93\8a\8de ID
\8eæ
\93¾
2899 \param AIDNum
\93\8a\8de
\83\8c\83X
\94Ô
\8d\86
2900 \param ThreadItem
\93\8a\8de
\83X
\83\8c\83b
\83h
2901 \param body OUT:
\93\8a\8deID
2903 function TGikoSys.GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
2906 boardPlugIn : TBoardPlugIn;
2907 stList: TStringList;
2911 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2912 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2913 //if ThreadItem.IsBoardPlugInAvailable then begin
2914 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2915 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2916 //boardPlugIn := ThreadItem.BoardPlugIn;
2917 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2918 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2920 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2922 Result := Res.FDateTime;
2923 if AnsiPos('id', AnsiLowerCase(Result)) > 0 then begin
2924 Result := Copy(Result, AnsiPos('id', AnsiLowerCase(Result)) - 1, 11);
2925 if AnsiPos(' be:', AnsiLowerCase(Result)) > 0 then begin
2926 Result := Copy(Result, 1, AnsiPos(' BE:', AnsiLowerCase(Result)) - 1)
2929 stlist := TStringList.Create;
2931 stList.DelimitedText := Result;
2933 for i := 0 to stList.Count - 1 do
2934 if Length(WideString(stList[i])) = 8 then begin
2935 if NotDateorTimeString(stList[i]) then begin
2936 Result := stList[i];
2947 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2948 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2949 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2950 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2952 function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer;
2957 if (not IsNoValidID(AID))
2958 and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2959 body := TStringList.Create;
2961 GetSameIDRes(AID, ThreadItem, body);
2962 Result := body.Count;
2971 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2972 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2973 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2974 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2976 function TGikoSys.GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer;
2981 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2982 body := TStringList.Create;
2984 GetSameIDRes(AIDNum, ThreadItem, body);
2985 Result := body.Count;
2993 \brief
\8e\9e\8d\8f\82ð
\8e¦
\82·
\95¶
\8e\9a\97ñ
\82Å
\82Í
\96³
\82¢
\82©
\82Ç
\82¤
\82©
2994 \param AStr
\92²
\82×
\82é
\95¶
\8e\9a\97ñ
2995 \return
\8e\9e\8d\8f\82Å
\82Í
\96³
\82¢
\82È
\82ç True
2996 \todo
\94Û
\92è
\8c`(Not)
\82æ
\82è
\8dm
\92è
\8cn(Is)
2998 function TGikoSys.NotDateorTimeString(const AStr : string): boolean;
3015 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
3016 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3017 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
3019 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
3022 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3023 Bayesian.CountWord( text, wordCount );
3028 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
3029 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3030 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
3031 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
3032 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
3033 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
3034 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
3036 \91S
\82Ä
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82·
\82é
\82í
\82¯
\82Å
\82Í
\82 \82è
\82Ü
\82¹
\82ñ
\81B\n
3037 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
3039 \8eå
\82É
\83X
\83p
\83\80\82Æ
\83n
\83\80\82ð
\90Ø
\82è
\91Ö
\82¦
\82é
\82½
\82ß
\82É Forget -> Learn
\82Ì
\8f\87\82Å
\8eg
\97p
\82µ
\82Ü
\82·
\81B
3041 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
3044 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3045 Bayesian.Forget( wordCount, isSpam );
3050 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3051 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3052 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3054 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3057 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3058 Bayesian.Learn( wordCount, isSpam );
3063 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3064 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3065 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é(SpamCountWord
\82Æ
\93¯
\93\99)
3066 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3068 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3071 case Setting.SpamFilterAlgorithm of
3072 gsfaNone: Result := 0;
3073 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3074 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3075 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3082 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3083 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3085 [
\83c
\81[
\83\8b]
\83\81\83j
\83\85\81[-[
\83I
\83v
\83V
\83\87\83\93]-[CSS
\82Æ
\83X
\83L
\83\93]
\83^
\83u
\82Ì
3086 [
\83t
\83H
\83\93\83g
\82ð
\8ew
\92è], [
\94w
\8ci
\90F
\82ð
\8ew
\92è]
\82É
\89\88\82Á
\82½ CSS
\82ð
\90¶
\90¬
\82µ
\82Ü
\82·
\81B
3088 function TGikoSys.SetUserOptionalStyle(): string;
3091 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3092 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3093 if GikoSys.Setting.BrowserFontSize <> 0 then
3094 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3095 if GikoSys.Setting.BrowserFontColor <> -1 then
3096 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3097 if GikoSys.Setting.BrowserBackColor <> -1 then
3098 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3099 case GikoSys.Setting.BrowserFontBold of
3100 -1: Result := Result + 'font-weight:normal;';
3101 1: Result := Result + 'font-weight:bold;';
3103 case GikoSys.Setting.BrowserFontItalic of
3104 -1: Result := Result + 'font-style:normal;';
3105 1: Result := Result + 'font-style:italic;';
3110 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3111 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3112 \param ANum
\83\8c\83X
\94Ô
3113 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3114 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3116 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3119 BNum, BMark : string;
3121 p := AnsiPos('BE:', AnsiUpperCase(AID));
3123 BNum := Copy(AID, p, Length(AID));
3124 AID := Copy(AID, 1, p - 1);
3125 p := AnsiPos('-', BNum);
3127 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3128 BNum := Copy(BNum, 1, p - 1);
3131 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3132 + '" target=_blank>' + BMark + '</a>';
3138 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3139 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3140 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3142 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3144 Translation = '\VarFileInfo\Translation';
3145 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3147 BufSize, HWnd: DWORD;
3148 VerInfoBuf: Pointer;
3150 VerDataLen: Longword;
3153 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3154 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3155 if BufSize <> 0 then begin
3156 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3157 GetMem(VerInfoBuf, BufSize);
3159 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3160 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3161 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3163 if not (VerDataLen > 0) then
3164 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3166 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3167 //
\81¨'\StringFileInfo\027382\FileDescription'
3168 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3169 [IntToHex(Integer(VerData^) and $FFFF, 4),
3170 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3171 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3173 if VerDataLen > 0 then begin
3174 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3176 SetLength(result, VerDataLen);
3177 StrLCopy(PChar(result), VerData, VerDataLen);
3181 FreeMem(VerInfoBuf);
3187 \brief Load
\82³
\82ê
\82Ä
\82¢
\82é
\83v
\83\89\83O
\83C
\83\93\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\97ñ
\8b\93
3188 \return 1
\8ds1plugin
3190 function TGikoSys.GetPluginsInfo(): String;
3193 major, minor, revision : Cardinal;
3194 agent, release : String;
3196 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3199 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3200 for i := 0 to Length(BoardGroups) - 1 do begin
3201 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3202 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3203 if BoardGroups[i].BoardPlugIn <> nil then begin
3204 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3207 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3209 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3215 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3216 function TGikoSys.GetIEVersion: string;
3220 R := TRegistry.Create;
3222 //
\93Ç
\82Ý
\8eæ
\82è
\90ê
\97p
\82É
\82µ
\82È
\82¢
\82Æ
\81A
\90§
\8cÀUSER
\82Æ
\82©
\82Ì
\8fê
\8d\87\81A
\8aJ
\82¯
\82È
\82¢
\82Ý
\82½
\82¢
3223 R.Access := KEY_EXECUTE;
3224 R.RootKey := HKEY_LOCAL_MACHINE;
3225 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3227 Result := R.ReadString('version');
3229 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3236 //! main
\83t
\83H
\81[
\83\80\82Ì
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ÌIni
\83t
\83@
\83C
\83\8b\96¼
3237 function TGikoSys.GetMainKeyFileName : String;
3239 Result := Setting.GetMainKeyFileName;
3241 //! Editor
\83t
\83H
\81[
\83\80\82Ì
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ÌIni
\83t
\83@
\83C
\83\8b\96¼
3242 function TGikoSys.GetEditorKeyFileName: String;
3244 Result := Setting.GetEditorKeyFileName;
3246 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3247 function TGikoSys.GetInputAssistFileName: String;
3249 Result := Setting.GetInputAssistFileName;
3251 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3252 procedure TGikoSys.SetGikoMessage;
3254 if FGikoMessage = nil then begin
3255 FGikoMessage := TGikoMessage.Create;
3260 if (Setting.GengoSupport) then begin
3262 if (FileExists(Setting.GetLanguageFileName)) then begin
3263 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3270 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3271 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3274 if FGikoMessage <> nil then begin
3275 Result := FGikoMessage.GetMessage(MesType);
3279 //Tue, 17 Dec 2002 12:18:07 GMT
\81¨ TDateTime
\82Ö
3280 //MonaUtils
\82©
\82ç
\88Ú
\93®
3281 function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime;
3282 function StrMonthToMonth(const s: string): integer;
3284 m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
3289 for i := Low(m) to High(m) do begin
3290 if (SameText(s, m[i])) then begin
3297 wDay, wMonth, wYear: word;
3298 wHour, wMinute, wSecond: word;
3302 wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0);
3303 wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2));
3304 wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0);
3305 sTime := ChooseString(DateStr, ' ', 4);
3306 wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0);
3307 wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0);
3308 wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0);
3309 d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0);
3312 //MonaUtils
\82©
\82ç
\88Ú
\93®
3313 //!
\82 \82é
\83Z
\83p
\83\8c\81[
\83^
\82Å
\8bæ
\90Ø
\82ç
\82ê
\82½
\95¶
\8e\9a\97ñ
\82©
\82ç
\82\8e\94Ô
\96Ú
\82Ì
\95¶
\8e\9a\97ñ
\82ð
\8eæ
\82è
\8fo
\82·
3314 function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string;
3320 for i := 0 to Index - 1 do begin
3321 if (AnsiPos(Separator, S) = 0) then S := ''
3322 else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S));
3324 p := AnsiPos(Separator, S);
3325 if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S;
3327 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
3328 procedure TGikoSys.RestoreThreadData(Board : TBoard);
3330 SECTION = 'Setting';
3332 TmpFileList : TStringList;
3335 ThreadItem : TThreadItem;
3336 Boardpath, tmpStr : string;
3338 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
3340 TmpFileList := TStringList.Create;
3341 TmpFileList.Sorted := True;
3342 TmpFileList.BeginUpdate;
3344 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
3345 GetFileList(Boardpath, '*.tmp', TmpFileList, False);
3346 TmpFileList.EndUpdate;
3347 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
3348 for i := TmpFileList.Count - 1 downto 0 do begin
3349 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
3350 if ThreadItem <> nil then begin
3351 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
3353 tmpStr := ini.ReadString(SECTION, 'RoundDate', DateTimeToStr(ZERO_DATE));
3354 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
3356 tmpStr := ini.ReadString(SECTION, 'LastModified', DateTimeToStr(ZERO_DATE));
3357 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
3358 ThreadItem.Count := ini.ReadInteger(SECTION, 'Count', 0);
3359 ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
3361 ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
3362 ThreadItem.IsLogFile := FileExists(ThreadItem.GetThreadFileName);
3363 if(ThreadItem.Size = 0) and (ThreadItem.IsLogFile) then begin
3365 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
3370 //
\8f\84\89ñ
\82Ì
\90Ý
\92è
\82ÍRoundData
\82Ì
\95û
\82ª
\82â
\82é
\82©
\82ç
\8f\9f\8eè
\82É
\90Ý
\92è
\82µ
\82Ä
\82Í
\83_
\83\81\81I
\81@by
\82à
\82¶
\82ã
3371 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
3372 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
3373 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
3374 ThreadItem.ScrollTop := ini.ReadInteger(SECTION, 'ScrollTop', 0);
3375 ThreadItem.AllResCount := ini.ReadInteger(SECTION, 'AllResCount', ThreadItem.Count);
3376 ThreadItem.NewResCount := ini.ReadInteger(SECTION, 'NewResCount', 0);
3377 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger(SECTION, 'AgeSage', Ord(gasNone)));
3381 DeleteFile(Boardpath + TmpFileList[i]);
3390 \brief User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
3391 \return Boolean
\97\98\97p
\82Å
\82«
\82é
\8fê
\8d\87\82ÍTrue
3393 function TGikoSys.CanUser32DLL: Boolean;
3401 hUser32 := LoadLibrary('User32.dll');
3402 if hUser32 <> 0 then begin
3409 FreeLibrary(hUser32);
3413 \brief OE
\88ø
\97p
\95\84\8eæ
\93¾
3414 \return OE
\82Ì
\88ø
\97p
\95\84\81i
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87\82Í'>')
3416 function TGikoSys.GetOEIndentChar : string;
3419 Identities : string;
3422 DEFAULT_CHAR = '> ';
3423 OE_MAIL_PATH = '\Software\Microsoft\Outlook Express\5.0\Mail';
3424 INDENT_CHAR = 'Indent Char';
3427 Result := DEFAULT_CHAR;
3428 regKey := TRegistry.Create;
3431 regKey.RootKey := HKEY_CURRENT_USER;
3432 if not regKey.OpenKey( 'Identities', False ) then
3434 Identities := regKey.ReadString( 'Default User ID' );
3435 if Identities = '' then
3437 if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then
3439 IndentChar := regKey.ReadInteger( INDENT_CHAR );
3440 Result := Char( IndentChar ) + ' ';
3448 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3449 function TGikoSys.GetReplaceFileName: String;
3451 Result := Setting.GetReplaceFileName;
3453 //!
\83v
\83\8c\83r
\83\85\81[
\8ag
\92£
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3454 function TGikoSys.GetExtpreviewFileName: String;
3456 Result := Setting.GetExtprevieFileName;
3459 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
3460 function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime;
3465 //
\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
3466 tmp := ChangeFileExt(FileName, '');
3467 if AnsiPos('_', tmp) <> 0 then
3468 if AnsiPos('_', tmp) > 9 then
3469 tmp := Copy(tmp, 1, AnsiPos('_', tmp)-1)
3471 Delete(tmp, AnsiPos('_', tmp), 1);
3473 if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
3474 Insert('1', tmp, 1);
3476 unixtime := StrToInt64Def(tmp, ZERO_DATE);
3477 Result := UnixToDateTime(unixtime) + OffsetFromUTC;
3480 procedure TGikoSys.ShowRefCount(msg: String; unk: IUnknown);
3484 if not Assigned(unk) then
3490 count := unk._Release;
3492 Writeln(msg + ' RefCount=' + IntToStr(count));
3494 Writeln(msg + ' RefCount=exception!!');
3500 GikoSys := TGikoSys.Create;
3503 if GikoSys <> nil then begin
3504 FreeAndNil(GikoSys);