6 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
7 ComCtrls, IniFiles, ShellAPI, ActnList, Math,
15 {HttpApp,} YofUtils, URLMon, IdGlobal, IdURI, {Masks,}
16 Setting, BoardGroup, gzip, Dolib, bmRegExp, AbonUnit,
17 ExternalBoardManager, ExternalBoardPlugInMain,
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
89 //! URLPath
\83\8c\83R
\81[
\83h
91 FBBS: string; //!< BBSID
92 FKey: string; //!< ThreadID
93 FSt: Int64; //!<
\8aJ
\8en
\83\8c\83X
\94Ô
94 FTo: Int64; //!<
\8fI
\97¹
\83\8c\83X
\94Ô
95 FFirst: Boolean; //!< >>1
\82Ì
\95\
\8e¦
96 FStBegin: Boolean; //!< 1
\81`
\95\
\8e¦
97 FToEnd: Boolean; //!<
\81`
\8dÅ
\8cã
\82Ü
\82Å
\95\
\8e¦
98 FDone: Boolean; //!<
\90¬
\8c÷
99 FNoParam: Boolean; //!<
\83\8c\83X
\94Ô
\83p
\83\89\83\81\81[
\83^
\82È
\82µ
103 TGikoMessageListType = (gmLogout, gmLogin, gmForceLogin, gmSureItiran,
104 gmUnKnown, gmSureSyutoku, gmSureDiff, gmNotMod, gmAbort, gmError,
105 gmNewRes, gmNewSure, gmResError, gmSureError);
107 TGikoSys = class(TObject)
114 FBayesian : TGikoBayesian; //!<
\83x
\83C
\83W
\83A
\83\93\83t
\83B
\83\8b\83^
115 FVersion : String; //!<
\83t
\83@
\83C
\83\8b\83o
\81[
\83W
\83\87\83\93
116 // FExitWrite: TStringList;
117 // function StrToFloatDef(s: string; Default: Double): Double;
121 FSelectResFilter : TAbon;
122 //FBoardURLList: TStringList;
125 destructor Destroy; override;
126 property ResRange : Longint read FResRange write FResRange;
127 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
128 property Version : String read FVersion;
129 // function MsgBox(Msg: string; Title: string; Flags: Longint): integer; overload;
130 // function MsgBox(Handle: THandle; Msg: string; Title: string; Flags: Longint): integer; overload;
131 function IsNumeric(s: string): boolean;
132 function IsFloat(s: string): boolean;
133 function DirectoryExistsEx(const Name: string): Boolean;
134 function ForceDirectoriesEx(Dir: string): Boolean;
135 // function GetVersion: string;
137 function GetBoardFileName: string;
138 function GetCustomBoardFileName: string;
139 function GetHtmlTempFileName: string;
140 function GetAppDir: string;
141 function GetTempFolder: string;
142 function GetSentFileName: string;
143 function GetConfigDir: string;
144 function GetSkinDir: string;
145 function GetSkinHeaderFileName: string;
146 function GetSkinFooterFileName: string;
147 function GetSkinResFileName: string;
148 function GetSkinNewResFileName: string;
149 function GetSkinBookmarkFileName: string;
150 function GetSkinNewmarkFileName: string;
151 function GetStyleSheetDir: string;
152 function GetOutBoxFileName: string;
153 function GetUserAgent: string;
154 function GetSambaFileName : string;
156 procedure ReadSubjectFile(Board: TBoard);
157 procedure CreateThreadDat(Board: TBoard);
158 procedure WriteThreadDat(Board: TBoard);
159 function ParseIndexLine(Line: string): TIndexRec;
160 procedure GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean); overload;
161 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¢
162 procedure GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
164 function DivideSubject(Line: string): TSubjectRec;
165 property Setting: TSetting read FSetting write FSetting;
166 property Dolib: TDolib read FDolib write FDolib;
168 function UrlToID(url: string): string;
169 function UrlToServer(url: string): string;
171 function StrTokFirst(const s:string; const sep:TStrTokSeparator; var Rec:TStrTokRec):string;
172 function StrTokNext(const sep:TStrTokSeparator; var Rec:TStrTokRec): string;
174 function GetFileSize(FileName : string) : longint;
175 function GetFileLineCount(FileName : string): longint;
176 function Get2chDate(aDate: TDateTime): string;
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;
186 function DeleteLink(const s: string): string;
188 function GetShortName(const LongName: string; ALength: integer): string;
189 function BoolToInt(b: Boolean): Integer;
190 function IntToBool(i: Integer): Boolean;
191 function GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
192 procedure LoadKeySetting(ActionList: TActionList);
193 procedure SaveKeySetting(ActionList: TActionList);
194 procedure LoadEditorKeySetting(ActionList: TActionList);
195 procedure SaveEditorKeySetting(ActionList: TActionList);
197 procedure CreateProcess(const AppPath: string; const Param: string);
198 procedure OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
199 function HTMLDecode(const AStr: String): String;
200 function GetHRefText(s: string): string;
201 function Is2chHost(Host: string): Boolean;
202 function Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
203 function Parse2chURL2(URL: string): TPathRec;
204 procedure ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
205 function GetVersionBuild: Integer;
206 function GetBrowsableThreadURL( inURL : string ) : string;
207 function GetThreadURL2BoardURL( inURL : string ) : string;
208 function Get2chThreadURL2BoardURL( inURL : string ) : string;
209 function Get2chBrowsableThreadURL( inURL : string ) : string;
210 function Get2chBoard2ThreadURL( inBoard : TBoard; inKey : string ) : string;
211 procedure ListBoardFile;
212 procedure ReadBoardFile( bbs : TBBS );
214 function GetUnknownCategory : TCategory;
215 function GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
217 procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
219 //! Samba24
\82Ì
\83t
\83@
\83C
\83\8b\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\81B
\91¶
\8dÝ
\82µ
\82È
\82¢
\8fê
\8d\87\81Adefault
\83t
\83@
\83C
\83\8b\82ðrename
\82·
\82é
220 procedure SambaFileExists();
222 property Bayesian : TGikoBayesian read FBayesian write FBayesian;
223 function GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string; overload;
224 function GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string; overload;
225 procedure GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList); overload;
226 procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
227 function GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer; overload;
228 function GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer; overload;
231 procedure SpamCountWord( const text : string; wordCount : TWordCount );
232 //!
\8aw
\8fK
\83N
\83\8a\83A
233 procedure SpamForget( wordCount : TWordCount; isSpam : Boolean );
234 //!
\83X
\83p
\83\80\8aw
\8fK
235 procedure SpamLearn( wordCount : TWordCount; isSpam : Boolean );
236 //!
\83X
\83p
\83\80\93x
\90\94
237 function SpamParse( const text : string; wordCount : TWordCount ) : Extended;
238 //
\88ø
\90\94\82ª
\81A
\93ú
\95t
\82Å
\82à
\8e\9e\8d\8f\82Å
\82à
\82È
\82¢
\82±
\82Æ
\82ð
\92²
\82×
\82é
239 function NotDateorTimeString(const AStr : string): boolean;
241 //!
\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Á
242 function AddBeProfileLink(AID : string; ANum: Integer): string;
243 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
244 function GetVersionInfo(KeyWord: TVerResourceKey): string;
245 //! Plugin
\82Ì
\8fî
\95ñ
\82Ì
\8eæ
\93¾
246 function GetPluginsInfo(): string;
247 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
248 function GetIEVersion: string;
249 function SetUserOptionalStyle(): string;
255 //LENGTH_RESTITLE = 40;
256 ZERO_DATE: Integer = 25569;
257 BETA_VERSION_NAME_E = 'beta';
258 BETA_VERSION_NAME_J = 'ÊÞÀ';
260 BETA_VERSION_BUILD = ''; //!< debug
\94Å
\82È
\82Ç
261 APP_NAME = 'gikoNavi';
262 BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
268 Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils;
271 FOLDER_INDEX_VERSION = '1.01';
272 USER_AGENT = 'Monazilla';
273 DEFAULT_NGWORD_FILE_NAME : String = 'NGword.txt';
274 NGWORDs_DIR_NAME : String = 'NGwords';
276 READ_PATH: string = '/test/read.cgi/';
277 OLD_READ_PATH: string = '/test/read.cgi?';
278 KAKO_PATH: string = '/kako/';
280 KeyWordStr: array [TVerResourceKey] of String = (
294 // *************************************************************************
295 //! GikoSys
\83R
\83\93\83X
\83g
\83\89\83N
\83^
296 // *************************************************************************
297 constructor TGikoSys.Create;
299 FSetting := TSetting.Create;
300 FDolib := TDolib.Create;
301 FAWKStr := TAWKStr.Create(nil);
302 if DirectoryExists(GetConfigDir) = false then begin
303 CreateDir(GetConfigDir);
305 FAbon := TAbon.Create;
306 FAbon.IgnoreKana := FSetting.IgnoreKana;
307 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
309 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
310 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
311 FAbon.DeleteSyria := FSetting.DeleteSyria;
312 FAbon.Deleterlo := FSetting.AbonDeleterlo;
313 FAbon.Replaceul := FSetting.AbonReplaceul;
314 FAbon.AbonPopupRes := FSetting.PopUpAbon;
316 FSelectResFilter := TAbon.Create;
317 FSelectResFilter.IgnoreKana := True;
318 //
\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
319 FSelectResFilter.AbonString := '';
321 ResRange := FSetting.ResRange;
322 FVersion := Trim(GetVersionInfo(vrFileVersion));
323 FBayesian := TGikoBayesian.Create;
324 //FBoardURLList := TStringList.Create;
327 // *************************************************************************
328 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
329 // *************************************************************************
330 destructor TGikoSys.Destroy;
333 FileList: TStringList;
335 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
344 FSelectResFilter.Free;
345 //FBoardURLList.Free;
346 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
347 FileList := TStringList.Create;
349 FileList.BeginUpdate;
350 GetFileList(GetTempFolder, '*.html', FileList, False, True);
352 for i := 0 to FileList.Count - 1 do begin
353 DeleteFile(FileList[i]);
362 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
363 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
364 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
365 \todo MonaUtils.IsNumeric()
\82ª
\93¯
\93\99\82Ì
\8b@
\94\
\82ð
\95Û
\8e\9d\82µ
\82Ä
\82¢
\82é
368 function TGikoSys.IsNumeric(s: string): boolean;
379 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
380 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
381 \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
382 \todo MonaUtils.IsFloat()
\82ª
\93¯
\93\99\82Ì
\8b@
\94\
\82ð
\95Û
\8e\9d\82µ
\82Ä
\82¢
\82é
384 function TGikoSys.IsFloat(s: string): boolean;
388 Result := TextToFloat(PChar(s), v, fvExtended);
391 // *************************************************************************
392 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
393 // *************************************************************************
394 function TGikoSys.GetBoardFileName: string;
396 Result := Setting.GetBoardFileName;
399 // *************************************************************************
400 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
401 // *************************************************************************
402 function TGikoSys.GetCustomBoardFileName: string;
404 Result := Setting.GetCustomBoardFileName;
407 // *************************************************************************
408 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
409 // *************************************************************************
410 function TGikoSys.GetHtmlTempFileName: string;
412 Result := Setting.GetHtmlTempFileName;
416 // *************************************************************************
417 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
418 // *************************************************************************
419 function TGikoSys.GetAppDir: string;
421 Result := Setting.GetAppDir;
424 // *************************************************************************
425 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
426 // *************************************************************************
427 function TGikoSys.GetTempFolder: string;
429 Result := Setting.GetTempFolder;
432 // *************************************************************************
433 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
434 // *************************************************************************)
435 function TGikoSys.GetSentFileName: string;
437 Result := Setting.GetSentFileName;
440 // *************************************************************************
441 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
442 // *************************************************************************
443 function TGikoSys.GetOutBoxFileName: string;
445 Result := Setting.GetOutBoxFileName;
448 // *************************************************************************
449 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
450 // *************************************************************************
451 function TGikoSys.GetConfigDir: string;
453 Result := Setting.GetConfigDir;
456 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
457 function TGikoSys.GetStyleSheetDir: string;
459 Result := Setting.GetStyleSheetDir;
462 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
463 function TGikoSys.GetSkinDir: string;
465 Result := Setting.GetSkinDir;
468 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
469 function TGikoSys.GetSkinHeaderFileName: string;
471 Result := Setting.GetSkinHeaderFileName;
474 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
475 function TGikoSys.GetSkinFooterFileName: string;
477 Result := Setting.GetSkinFooterFileName;
480 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
481 function TGikoSys.GetSkinNewResFileName: string;
483 Result := Setting.GetSkinNewResFileName;
486 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
487 function TGikoSys.GetSkinResFileName: string;
489 Result := Setting.GetSkinResFileName;
492 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
493 function TGikoSys.GetSkinBookmarkFileName: string;
495 Result := Setting.GetSkinBookmarkFileName;
498 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
499 function TGikoSys.GetSkinNewmarkFileName: string;
501 Result := Setting.GetSkinNewmarkFileName;
504 //! UserAgent
\8eæ
\93¾
505 function TGikoSys.GetUserAgent: string;
507 if Dolib.Connected then begin
508 Result := Format('%s %s/%s%d/%s', [
515 Result := Format('%s/%s %s/%s%d/%s', [
526 \brief
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é
\95û
\8e®
\8e\9e\8d\8f\8eæ
\93¾
527 \param
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
528 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\95û
\8e®
\82Å
\8e\9e\8d\8f\82ð
\95\
\82µ
\82½
\95¶
\8e\9a\97ñ
530 function TGikoSys.Get2chDate(aDate: TDateTime): string;
534 d2 := aDate - EncodeTime(9, 0, 0, 0);
535 Result := FloatToStr(Trunc((d2 - ZERO_DATE) * 86400));
539 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
540 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
541 \return val
\82ð
\8e¦
\82· TDateTime
543 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
545 Result := ZERO_DATE + val / 86400.0;
549 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
550 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
551 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
553 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
555 Result := Trunc((ADate - ZERO_DATE) * 86400);
560 \brief Subject
\83t
\83@
\83C
\83\8bRead
561 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
563 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
565 ThreadItem: TThreadItem;
567 FileList: TStringList;
568 TmpFileList: TStringList;
576 // RoundItem: TRoundItem;
583 //protocol, host, path, document, port, bookmark : string;
586 FavoThreadItem : TFavoriteThreadItem;
590 if Board.IsThreadDatRead then
595 usePlugIn := Board.IsBoardPlugInAvailable;
596 server := UrlToServer( Board.URL );
597 //is2ch := Is2chHost(server);
599 FileName := Board.GetFolderIndexFileName;
601 FileList := TStringList.Create;
602 FileList.Sorted := True;
603 FileList.BeginUpdate;
604 TmpFileList := TStringList.Create;
605 TmpFileList.Sorted := True;
606 TmpFileList.BeginUpdate;
607 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
608 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
610 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
611 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, False);
612 TmpFileList.EndUpdate;
614 //
\8fd
\95¡
\82ð
\96h
\82®
616 Board.Sorted := True;
618 sl := TStringList.Create;
620 if FileExists(FileName) then begin
621 sl.LoadFromFile(FileName);
623 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
624 for i := sl.Count - 1 downto 1 do begin
625 Rec := ParseIndexLine(sl[i]);
626 islog := FileList.Find( Rec.FFileName, Index );
628 ThreadItem := TThreadItem.Create(
631 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
633 if Board.is2ch then begin
634 ThreadItem := TThreadItem.Create(
637 server + 'test/read.cgi/' + Board.BBSID + '/' + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
642 ThreadItem := TThreadItem.Create(
645 server + 'test/read.cgi?bbs=' + Board.BBSID + '&key=' + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
652 ThreadItem.BeginUpdate;
654 FileList.Delete( Index );
656 ThreadItem.No := Rec.FNo;
657 ThreadItem.FileName := Rec.FFileName;
658 ThreadItem.Title := Rec.FTitle;
659 //ThreadItem.ShortTitle := CustomStringReplace(ZenToHan(ThreadItem.Title), ' ', '');
660 ThreadItem.Count := Rec.FCount;
661 ThreadItem.Size := Rec.FSize;
662 // ThreadItem.RoundNo := Rec.FRoundNo;
663 ThreadItem.RoundDate := Rec.FRoundDate;
664 ThreadItem.LastModified := Rec.FLastModified;
665 ThreadItem.Kokomade := Rec.FKokomade;
666 ThreadItem.NewReceive := Rec.FNewReceive;
667 // ThreadItem.Round := Rec.FRound;
668 ThreadItem.UnRead := Rec.FUnRead;
669 ThreadItem.ScrollTop := Rec.FScrollTop;
670 ThreadItem.AllResCount := Rec.FAllResCount;
671 ThreadItem.NewResCount := Rec.FNewResCount;
672 ThreadItem.AgeSage := Rec.FAgeSage;
673 ThreadItem.ParentBoard := Board;
674 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
676 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
677 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
680 {//
\8f\84\89ñ
\83\8a\83X
\83g
\82É
\91¶
\8dÝ
\82µ
\82½
\82ç
\8f\84\89ñ
\83t
\83\89\83O
\83Z
\83b
\83g
681 if ThreadItem.IsLogFile then begin
682 idx := RoundList.Find(ThreadItem);
683 if idx <> -1 then begin
684 RoundItem := RoundList.Items[idx, grtItem];
685 ThreadItem.RoundName := RoundItem.RoundName;
686 ThreadItem.Round := True;
691 ThreadItem.EndUpdate;
692 Board.Add(ThreadItem);
694 if (ThreadItem.IsLogFile) and (ThreadItem.UnRead) then
699 if UnRead <> Board.UnRead then
700 Board.UnRead := UnRead;
702 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
703 //
\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
704 for i := 0 to FileList.Count - 1 do begin
705 FileName := Boardpath + FileList[i];
707 //ResRec := DivideStrLine(ReadThreadFile(FileName, 1));
708 if usePlugIn then begin
709 ThreadItem := TThreadItem.Create(
712 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), FileList[i] ) );
713 ResRec := DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ));
715 ThreadItem := TThreadItem.Create(
718 Get2chBoard2ThreadURL( Board, ChangeFileExt( FileList[i], '' ) ) );
719 ResRec := DivideStrLine(ReadThreadFile(FileName, 1));
722 ThreadItem.BeginUpdate;
723 ThreadItem.FileName := FileList[i];
724 //ThreadItem.FilePath := FileName;
725 ThreadItem.No := Board.Count + 1;
726 ThreadItem.Title := ResRec.FTitle;
727 ThreadItem.Count := GetFileLineCount(FileName);
728 ThreadItem.AllResCount := ThreadItem.Count;
729 ThreadItem.NewResCount := ThreadItem.Count;
730 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é
731 ThreadItem.RoundDate := ZERO_DATE;
732 ThreadItem.LastModified := ZERO_DATE;
733 ThreadItem.Kokomade := -1;
734 ThreadItem.NewReceive := ThreadItem.Count;
735 ThreadItem.ParentBoard := Board;
736 ThreadItem.IsLogFile := True;
737 ThreadItem.Round := False;
738 ThreadItem.UnRead := False;
739 ThreadItem.ScrollTop := 0;
740 ThreadItem.AgeSage := gasNone;
741 ThreadItem.EndUpdate;
742 Board.Add(ThreadItem);
746 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
747 for i := TmpFileList.Count - 1 downto 0 do begin
748 //if TmpFileList.Count <> 0 then begin
749 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
750 if ThreadItem <> nil then begin
751 //if TmpFileList.Find(ChangeFileExt(ThreadItem.FileName, '.tmp'), Index) then begin
752 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
754 tmpStr := ini.ReadString('Setting', 'RoundDate', DateTimeToStr(ZERO_DATE));
755 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
757 tmpStr := ini.ReadString('Setting', 'LastModified', DateTimeToStr(ZERO_DATE));
758 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
759 ThreadItem.Count := ini.ReadInteger('Setting', 'Count', 0);
760 ThreadItem.NewReceive := ini.ReadInteger('Setting', 'NewReceive', 0);
762 ThreadItem.Size := ini.ReadInteger('Setting', 'Size', 0);
763 if(ThreadItem.Size = 0) and (FileExists(ThreadItem.GetThreadFileName)) then begin
765 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
770 //
\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ã
771 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
772 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
773 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
774 ThreadItem.ScrollTop := ini.ReadInteger('Setting', 'ScrollTop', 0);
775 ThreadItem.AllResCount := ini.ReadInteger('Setting', 'AllResCount', ThreadItem.Count);
776 ThreadItem.NewResCount := ini.ReadInteger('Setting', 'NewResCount', 0);
777 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger('Setting', 'AgeSage', Ord(gasNone)));
781 DeleteFile(Boardpath + TmpFileList[i]);
789 Board.Sorted := False;
791 Board.IsThreadDatRead := True;
795 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
796 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
798 procedure TGikoSys.CreateThreadDat(Board: TBoard);
802 SubjectList: TStringList;
808 if not FileExists(Board.GetSubjectFileName) then Exit;
809 FileName := Board.GetFolderIndexFileName;
811 SubjectList := TStringList.Create;
813 SubjectList.LoadFromFile(Board.GetSubjectFileName);
814 sl := TStringList.Create;
818 sl.Add(FOLDER_INDEX_VERSION);
819 for i := 0 to SubjectList.Count - 1 do begin
820 Rec := DivideSubject(SubjectList[i]);
822 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
825 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
826 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
827 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
828 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
829 + Format('%x', [0]) + #1 //size
830 + Format('%x', [0]) + #1 //RoundDate
831 + Format('%x', [0]) + #1 //LastModified
832 + Format('%x', [0]) + #1 //Kokomade
833 + Format('%x', [0]) + #1 //NewReceive
834 + '0' + #1 //
\96¢
\8eg
\97p
835 + Format('%x', [0]) + #1 //UnRead
836 + Format('%x', [0]) + #1 //ScrollTop
837 + Format('%x', [Rec.FCount]) + #1 //AllResCount
838 + Format('%x', [0]) + #1 //NewResCount
839 + Format('%x', [0]); //AgeSage
841 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
842 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
844 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
845 Rec.FTitle, //
\83^
\83C
\83g
\83\8b
846 Rec.FCount, //
\83J
\83E
\83\93\83g
855 Rec.FCount, //AllResCount
864 sl.SaveToFile(FileName);
874 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
875 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
877 procedure TGikoSys.WriteThreadDat(Board: TBoard);
879 // Values: array[Boolean] of string = ('0', '1');
885 TmpFileList: TStringList;
887 if not Board.IsThreadDatRead then
889 FileName := Board.GetFolderIndexFileName;
890 ForceDirectoriesEx( ExtractFilePath( FileName ) );
892 sl := TStringList.Create;
893 TmpFileList := TStringList.Create;
894 TmpFileList.Sorted := true;
896 TmpFileList.BeginUpdate;
897 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
898 TmpFileList.EndUpdate;
900 sl.Add(FOLDER_INDEX_VERSION);
902 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
903 Sort.SortNoFlag := true;
904 Sort.SortOrder := true;
906 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
907 Board.CustomSort(ThreadItemSortProc);
909 for i := 0 to Board.Count - 1 do begin
910 Board.Items[i].No := i + 1;
911 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
912 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
913 [Board.Items[i].No, //
\94Ô
\8d\86
914 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
915 Board.Items[i].Title, //
\83^
\83C
\83g
\83\8b
916 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
917 Board.Items[i].Size, //size
918 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
919 DateTimeToInt(Board.Items[i].LastModified), //LastModified
920 Board.Items[i].Kokomade, //Kokomade
921 Board.Items[i].NewReceive, //NewReceive
923 BoolToInt(Board.Items[i].UnRead), //UnRead
924 Board.Items[i].ScrollTop, //ScrollTop
925 Board.Items[i].AllResCount, //AllResCount
926 Board.Items[i].NewResCount, //NewResCount
927 Ord(Board.Items[i].AgeSage)] //AgeSage
933 sl.SaveToFile(FileName);
935 for i := 0 to TmpFileList.Count - 1 do begin
936 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
946 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
947 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
948 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
950 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
952 Result.FNo := StrToIntDef('$' + RemoveToken(Line, #1), 0);
953 Result.FFileName := RemoveToken(Line, #1);
954 Result.FTitle := RemoveToken(Line, #1);
955 Result.FCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
956 Result.FSize := StrToIntDef('$' + RemoveToken(Line, #1), 0);
957 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE));
958 Result.FLastModified := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE));
959 Result.FKokomade := StrToIntDef('$' + RemoveToken(Line, #1), -1);
960 Result.FNewReceive := StrToIntDef('$' + RemoveToken(Line, #1), 0);
961 RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
962 Result.FUnRead := IntToBool(StrToIntDef('$' + RemoveToken(Line, #1), 0));
963 Result.FScrollTop := StrToIntDef('$' + RemoveToken(Line, #1), 0);
964 Result.FAllResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
965 Result.FNewResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
966 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + RemoveToken(Line, #1), 0));
971 \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é
972 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
973 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
974 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
975 \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
976 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
978 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
979 \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
983 GetFileList('c:\', '*.txt', list, True, True);
986 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
989 SearchRec : TSearchRec;
993 //maskExt := Copy(Mask, 1, Length(Mask) - 1);
995 Path := IncludeTrailingPathDelimiter(Path);
996 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
998 while rc = 0 do begin
999 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1000 s := Path + SearchRec.Name;
1001 //if (SearchRec.Attr and faDirectory > 0) then
1002 // s := IncludeTrailingPathDelimiter(s)
1004 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
1008 List.Add(SearchRec.Name);
1009 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1010 GetFileList(s, Mask, List, True, IsPathAdd);
1012 rc := FindNext(SearchRec);
1015 SysUtils.FindClose(SearchRec);
1021 \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
1022 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
1023 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1024 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
1025 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1026 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
1027 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
1030 GetFileList('c:\', '*.txt', list, True);
1033 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
1036 SearchRec : TSearchRec;
1039 Path := IncludeTrailingPathDelimiter(Path);
1040 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
1042 while rc = 0 do begin
1043 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1044 s := Path + SearchRec.Name;
1046 if (SearchRec.Attr and faDirectory = 0) then
1050 List.Add(SearchRec.Name);
1052 rc := FindNext(SearchRec);
1055 SysUtils.FindClose(SearchRec);
1061 \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é
1062 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1063 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1064 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1065 \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
1067 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1068 \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
1072 GetDirectoryList('c:\', '*.txt', list, True);
1075 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1078 SearchRec : TSearchRec;
1081 Path := IncludeTrailingPathDelimiter(Path);
1082 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1084 while rc = 0 do begin
1085 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1086 s := Path + SearchRec.Name;
1087 //if (SearchRec.Attr and faDirectory > 0) then
1088 // s := IncludeTrailingPathDelimiter(s)
1090 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1091 List.Add( IncludeTrailingPathDelimiter( s ) );
1092 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1093 GetDirectoryList(s, Mask, List, True);
1095 rc := FindNext(SearchRec);
1098 SysUtils.FindClose(SearchRec);
1104 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1105 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1106 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1108 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1118 if AnsiPos('<>', Line) = 0 then
1122 Result.FFileName := RemoveToken(Line, Delim);
1123 Result.FTitle := Trim(RemoveToken(Line, Delim));
1125 ws := Result.FTitle;
1126 if Copy(ws, Length(ws), 1) = ')' then begin
1129 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1132 end else if Copy(ws, Length(ws), 1) = '>' then begin
1136 for i := Length(ws) - 1 downto 1 do begin
1137 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1138 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1139 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1140 if IsNumeric(ws) then
1141 Result.FCount := StrToInt(ws);
1142 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1149 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1150 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1153 function TGikoSys.UrlToID(url: string): string;
1160 if url = '' then Exit;
1162 url := Copy(url, 0, Length(url) - 1);
1163 for i := Length(url) downto 0 do begin
1164 if url[i] = '/' then begin
1165 Result := Copy(url, i + 1, Length(url));
1175 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1176 \param url
\89ð
\8eß
\82·
\82é URL
1177 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1179 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1181 function TGikoSys.UrlToServer(url: string): string;
1188 wsURL := Trim(wsURL);
1190 if wsURL = '' then exit;
1192 if Copy(wsURL, Length(wsURL), 1) = '/' then
1193 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1195 for i := Length(wsURL) downto 0 do begin
1196 if wsURL[i] = '/' then begin
1197 Result := Copy(wsURL, 0, i);
1204 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1205 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1206 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1208 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1212 Code := GetFileAttributes(PChar(Name));
1213 Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1217 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1218 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1219 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1221 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1224 if Length(Dir) = 0 then
1225 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1226 Dir := ExcludeTrailingPathDelimiter(Dir);
1227 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1228 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1229 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1233 \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
1234 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1235 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1236 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1237 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1238 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1239 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1241 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1245 Result := StrTokNext(sep, Rec);
1249 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1250 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1251 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1252 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1253 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1254 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1256 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1263 if Len >= Pos then begin
1264 while (Pos <= Len) and (Str[Pos] in sep) do begin
1268 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1269 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1274 Result := Copy(Str, I, Pos - I);
1275 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1283 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1284 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1285 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1287 function TGikoSys.GetFileSize(FileName : string): longint;
1292 if not FileExists(FileName) then begin
1296 Assign(F, FileName);
1298 Result := FileSize(F);
1306 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1307 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1309 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1311 function TGikoSys.GetFileLineCount(FileName : string): longint;
1315 sl := TStringList.Create;
1318 sl.LoadFromFile(FileName);
1330 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1331 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1332 \param Line
\8ew
\92è
\8ds
1333 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1334 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1336 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1338 fileTmp : TStringList;
1341 if FileExists(FileName) then begin
1342 fileTmp := TStringList.Create;
1345 fileTmp.LoadFromFile( FileName );
1346 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1347 Result := fileTmp.Strings[ Line-1 ];
1350 //on EFOpenError do Result := '';
1359 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1360 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1362 procedure TGikoSys.MenuFont(Font: TFont);
1365 nm: NONCLIENTMETRICS;
1367 nm.cbSize := sizeof(NONCLIENTMETRICS);
1369 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1370 lf := nm.lfMenuFont;
1372 Font.Name := lf.lfFaceName;
1373 Font.Height := lf.lfHeight;
1375 if lf.lfWeight >= 700 then
1376 Font.Style := Font.Style + [fsBold];
1377 if lf.lfItalic = 1 then
1378 Font.Style := Font.Style + [fsItalic];
1382 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1383 \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ñ
1384 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1385 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1387 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1389 function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1393 p := AnsiPos(delimiter, s);
1397 Result := Copy(s, 1, p - 1);
1398 Delete(s, 1, Length(Result) + Length(delimiter));
1403 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1404 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1405 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1406 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1408 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1410 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1415 for i := 0 to index do
1416 Result := RemoveToken(s, delimiter);
1420 \brief HTML
\82©
\82ç
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\8dí
\8f\9c
1421 \param s
\8c³
\82É
\82È
\82é HTML
1422 \return
\83A
\83\93\83J
\81[
\83^
\83O
\82ª
\8dí
\8f\9c\82³
\82ê
\82½ HTML
1424 function TGikoSys.DeleteLink(const s: string): string;
1434 s1 := GetTokenIndex(s, '<a href="', i);
1435 s2 := GetTokenIndex(s, '<a href="', i + 1);
1437 idx := Pos('">', s1);
1439 Delete(s1, 1, idx + 1);
1440 idx := Pos('">', s2);
1442 Delete(s2, 1, idx + 1);
1444 Result := Result + s1 + s2;
1453 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1454 {procedure TGikoSys.FlashExitWrite;
1458 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1459 for i := 0 to FExitWrite.Count - 1 do
1460 WriteThreadDat(FExitWrite[i]);
1465 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1466 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1467 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1468 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1472 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1474 ERASECHAR : array [1..39] of string =
1475 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1476 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1477 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1478 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1480 Chr : array [0..255] of char;
1484 s := Trim(LongName);
1485 if (Length(s) <= ALength) then begin
1489 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1490 S := CustomStringReplace(S, ERASECHAR[i], '');
1492 if (Length(S) <= ALength) then begin
1495 Windows.LCMapString(
1496 GetUserDefaultLCID(),
1504 S := Copy(S,1,ALength);
1506 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1507 S := Copy(S, 1, Length(S) - 1);
1518 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1519 \return False..0, True..1
1521 function TGikoSys.BoolToInt(b: Boolean): Integer;
1523 Result := IfThen(b, 1, 0);
1527 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1528 \return 1..True, other..False
1529 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1530 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1532 function TGikoSys.IntToBool(i: Integer): Boolean;
1538 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1539 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1540 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1541 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1543 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1547 GZipStream: TGzipDecompressStream;
1548 TextStream: TStringStream;
1549 buf: array[0..BUF_SIZE - 1] of Byte;
1555 TextStream := TStringStream.Create('');
1557 //
\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¢)
1558 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1559 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1560 ResStream.Position := 0;
1561 GZipStream := TGzipDecompressStream.Create(TextStream);
1564 FillChar(buf, BUF_SIZE, 0);
1565 cnt := ResStream.Read(buf, BUF_SIZE);
1567 GZipStream.Write(buf, BUF_SIZE);
1573 ResStream.Position := 0;
1575 FillChar(buf, BUF_SIZE, 0);
1576 cnt := ResStream.Read(buf, BUF_SIZE);
1578 TextStream.Write(buf, BUF_SIZE);
1582 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1583 s := TextStream.DataString;
1586 while (i > 0) and (s[i] = #0) do
1588 Delete(s, i + 1, ln - i);
1590 s := MojuUtils.CustomStringReplace(s, #0, '*');
1599 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1600 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1601 \todo STD_SEC
\82ð GetXXXFileName()
\82É
\92Ç
\82¢
\8fo
\82¹
1603 KeySetting.ini
\82É
\95Û
\91¶
\82³
\82ê
\82Ä
\82¢
\82é
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð ActionList
\82É
\90Ý
\92è
\82µ
\82Ü
\82·
\81B
1605 procedure TGikoSys.LoadKeySetting(ActionList: TActionList);
1607 STD_SEC = 'KeySetting';
1613 SecList: TStringList;
1614 Component: TComponent;
1616 if not FileExists(GetConfigDir + KEY_SETTING_FILE_NAME) then
1618 SecList := TStringList.Create;
1619 ini := TMemIniFile.Create(GetConfigDir + KEY_SETTING_FILE_NAME);
1621 ini.ReadSection(STD_SEC, SecList);
1622 for i := 0 to SecList.Count - 1 do begin
1623 ActionName := SecList[i];
1624 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1625 if ActionKey <> -1 then begin
1626 Component := ActionList.Owner.FindComponent(ActionName);
1627 if TObject(Component) is TAction then begin
1628 TAction(Component).ShortCut := ActionKey;
1639 \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¶
1640 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1641 \todo STD_SEC
\82ð GetXXXFileName()
\82É
\92Ç
\82¢
\8fo
\82¹
1643 ActionList
\82É
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82é
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð KeySetting.ini
\82É
\95Û
\91¶
\82µ
\82Ü
\82·
\81B
1645 procedure TGikoSys.SaveKeySetting(ActionList: TActionList);
1647 STD_SEC = 'KeySetting';
1652 ini := TMemIniFile.Create(GetConfigDir + KEY_SETTING_FILE_NAME);
1654 for i := 0 to ActionList.ActionCount - 1 do begin
1655 if ActionList.Actions[i].Tag = -1 then
1657 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1666 \brief
\83\8c\83X
\83G
\83f
\83B
\83^
\82Ì
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\82ð
\90Ý
\92è
1667 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1668 \todo STD_SEC, EKEY_SETTING_FILE_NAME
\82ð GetXXXFileName()
\82É
\92Ç
\82¢
\8fo
\82¹
1669 \todo LoadKeySetting
\82Æ
\93\9d\8d\87\82¹
\82æ
1671 \83t
\83@
\83C
\83\8b\82É
\95Û
\91¶
\82³
\82ê
\82Ä
\82¢
\82é
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð ActionList
\82É
\90Ý
\92è
\82µ
\82Ü
\82·
\81B
1673 procedure TGikoSys.LoadEditorKeySetting(ActionList: TActionList);
1675 STD_SEC = 'KeySetting';
1681 SecList: TStringList;
1682 Component: TComponent;
1684 if not FileExists(GetConfigDir + EKEY_SETTING_FILE_NAME) then
1686 SecList := TStringList.Create;
1687 ini := TMemIniFile.Create(GetConfigDir + EKEY_SETTING_FILE_NAME);
1689 ini.ReadSection(STD_SEC, SecList);
1690 for i := 0 to SecList.Count - 1 do begin
1691 ActionName := SecList[i];
1692 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1693 if ActionKey <> -1 then begin
1694 Component := ActionList.Owner.FindComponent(ActionName);
1695 if TObject(Component) is TAction then begin
1696 TAction(Component).ShortCut := ActionKey;
1707 \brief
\83\8c\83X
\83G
\83f
\83B
\83^
\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¶
1708 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1709 \todo STD_SEC, EKEY_SETTING_FILE_NAME
\82ð GetXXXFileName()
\82É
\92Ç
\82¢
\8fo
\82¹
1710 \todo LoadKeySetting
\82Æ
\93\9d\8d\87\82¹
\82æ
1712 ActionList
\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¶
\82µ
\82Ü
\82·
\81B
1714 procedure TGikoSys.SaveEditorKeySetting(ActionList: TActionList);
1716 STD_SEC = 'KeySetting';
1721 ini := TMemIniFile.Create(GetConfigDir + EKEY_SETTING_FILE_NAME);
1723 for i := 0 to ActionList.ActionCount - 1 do begin
1724 if ActionList.Actions[i].Tag = -1 then
1726 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1735 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1736 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1737 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1739 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1741 PI: TProcessInformation;
1745 Path := '"' + AppPath + '"';
1747 Path := Path + ' ' + Param;
1749 SI.Cb := SizeOf(Si);
1750 SI.lpReserved := nil;
1751 SI.lpDesktop := nil;
1754 SI.cbReserved2 := 0;
1755 SI.lpReserved2 := nil;
1757 Windows.CreateProcess(nil,
1770 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1771 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1772 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1774 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1778 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1779 gbtUserApp, gbtAuto:
1780 if (Setting.URLApp) and (FileExists(Setting.URLAppFile)) then
1781 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1783 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1788 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1789 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1790 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1792 function TGikoSys.HTMLDecode(const AStr: String): String;
1794 Sp, Rp, Cp, Tp: PChar;
1799 SetLength(Result, Length(AStr));
1801 Rp := PChar(Result);
1804 while Sp^ <> #0 do begin
1810 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1816 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1820 while (Sp^ <> ';') and (Sp^ <> #0) do
1827 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1835 Num := IsNumeric(Copy(Tp, 1, 1));
1836 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1837 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1841 SetString(S, Tp, Sp - Tp);
1846 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1847 //[Cp^ + Sp^, Cp - PChar(AStr)])
1857 // on E:EConvertError do
1858 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1859 // [Cp^ + Sp^, Cp - PChar(AStr)])
1861 SetLength(Result, Rp - PChar(Result));
1865 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1866 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1867 \return
\8eæ
\93¾
\82µ
\82½ URL
1869 function TGikoSys.GetHRefText(s: string): string;
1879 Index := AnsiPos('href', LowerCase(s));
1882 s := Trim(Copy(s, Index + 4, Length(s)));
1883 s := Trim(Copy(s, 2, Length(s)));
1885 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1886 //if Copy(s, 1, 1) = '"' then begin
1887 if s[1] = '"' then begin
1888 s := Trim(Copy(s, 2, Length(s)));
1891 Index := AnsiPos('"', s);
1892 if Index <> 0 then begin
1893 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1894 s := Copy(s, 1, Index - 1);
1896 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1897 Index := AnsiPos(' ', s);
1898 Index2 := AnsiPos('>', s);
1901 if Index > Index2 then
1904 s := Copy(s, 1, Index - 1)
1906 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1913 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1914 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1915 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1917 function TGikoSys.Is2chHost(Host: string): Boolean;
1919 HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
1925 if RightStr( Host, 1 ) = '/' then
1926 Host := Copy( Host, 1, Length( Host ) - 1 );
1927 OutputDebugString(pchar(HOST_NAME[0]));
1928 for i := 0 to Length(HOST_NAME) - 1 do begin
1929 // Len := Length(HOST_NAME[i]);
1930 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1931 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1939 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1940 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1941 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1942 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1943 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1944 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1945 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1947 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1957 Index := AnsiPos(READ_PATH, path);
1958 if Index <> 0 then begin
1959 s := Copy(path, Index + Length(READ_PATH), Length(path));
1961 if (Length(s) > 0) and (s[1] = '/') then
1963 BBSID := GetTokenIndex(s, '/', 0);
1964 BBSKey := GetTokenIndex(s, '/', 1);
1967 Result := (BBSID <> '') or (BBSKey <> '');
1970 Index := AnsiPos(KAKO_PATH, path);
1971 if Index <> 0 then begin
1972 s := Copy(path, 2, Length(path));
1973 BBSID := GetTokenIndex(s, '/', 0);
1974 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1975 BBSID := GetTokenIndex(s, '/', 1);
1976 BBSKey := ChangeFileExt(Document, '');
1977 Result := (BBSID <> '') or (BBSKey <> '');
1980 Index := AnsiPos('read.cgi?', URL);
1981 if Index <> 0 then begin
1982 SList := TStringList.Create;
1985 // s := HTMLDecode(Document);
1986 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1987 BBSID := SList.Values['bbs'];
1988 BBSKey := SList.Values['key'];
1989 Result := (BBSID <> '') or (BBSKey <> '');
2001 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
2002 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2003 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
2004 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
2006 http://2ch.net/
\92\86\97ª/32-50 \n
2007 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
2009 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
2016 URL := Trim(LowerCase(URL));
2017 if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
2021 buf := Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 );
2023 stRes := StrToInt64( buf );
2024 if AnsiPos( '&nofirst=',URL) <> 0 then begin
2025 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
2027 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, Length( URL ) - AnsiPos('&to=', URL ) - 4 + 1 );
2030 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2031 buf := Copy( buf, 1, ps );
2035 endRes := StrToInt64(buf)
2042 if (stRes <> 0) and (endRes = 0) then
2043 endRes := stRes + MAX_POPUP_RES
2044 else if (stRes = 0) and (endRes <> 0) then begin
2045 stRes := endRes - MAX_POPUP_RES;
2049 GikoSys.GetBrowsableThreadURL( URL );
2050 end else if( AnsiPos('&res=', URL ) <> 0 ) then begin
2052 buf := Copy( URL, AnsiPos('&res=', URL ) + 5, Length( URL ) - AnsiPos('&res=', URL ) - 5 + 1 );
2055 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2056 buf := Copy( buf, 1, ps );
2059 stRes := StrToInt(buf)
2066 end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
2068 stRes := StrToInt64( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
2069 if AnsiPos( '&nofirst=',URL) <> 0 then begin
2070 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, AnsiPos( '&nofirst=',URL) - AnsiPos('&end=', URL ) - 5);
2072 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, Length( URL ) - AnsiPos('&to=', URL ) - 5 + 1 );
2075 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2076 buf := Copy( buf, 1, ps );
2080 endRes := StrToInt64(buf);
2087 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
2088 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
2089 if Length(buf) > 0 then begin
2090 if AnsiPos('-', buf) = 1 then begin
2095 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2097 convBuf := Copy( buf, 1, ps );
2098 if convBuf <> '' then
2099 endRes := StrToInt64(convBuf)
2105 if endRes <> 0 then begin
2106 stRes := endRes - MAX_POPUP_RES;
2113 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2115 convBuf := Copy( buf, 1, ps );
2116 if convBuf <> '' then begin
2117 stRes := StrToInt64(convBuf);
2121 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2123 convBuf := Copy( buf, 1, ps );
2124 if convBuf <> '' then
2125 endRes := StrToInt64(convBuf)
2147 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2148 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2149 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2151 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2156 // convBuf : String;
2167 URL := Trim(LowerCase(URL));
2172 Result.FFirst := False;
2173 Result.FStBegin := False;
2174 Result.FToEnd := False;
2175 Result.FDone := False;
2176 Result.FNoParam := False;
2180 if URL[length(URL)] = '\' then
2182 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2183 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2184 s := Copy(URL, RStart + RLength - 1, Length(URL));
2186 //
\95W
\8f\80\8f\91\8e®
2187 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2188 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2189 FAWKStr.RegExp := '/test/read.cgi/.+/[0-9]+/?.*';
2190 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2191 s := Copy(s, 15, Length(s));
2193 SList := TStringList.Create;
2196 FAWKStr.RegExp := '/';
2197 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2198 Result.FBBS := SList[1];
2199 Result.FKey := SList[2];
2200 if SList.Count >= 4 then
2204 Result.FNoParam := true;
2210 FAWKStr.LineSeparator := mcls_CRLF;
2211 FAWKStr.RegExp := '-';
2212 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2213 Result.FFirst := True;
2215 FAWKStr.RegExp := 'l[0-9]+';
2216 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2217 Result.FFirst := True;
2219 for i := 0 to SList.Count - 1 do begin
2220 if Trim(SList[i]) = '' then begin
2222 Result.FStBegin := True;
2223 if i = (SList.Count - 1) then
2224 Result.FToEnd := True;
2225 end else if IsNumeric(SList[i]) then begin
2226 wkInt := StrToInt(SList[i]);
2227 wkMax := Max(wkMax, wkInt);
2231 wkMin := Min(wkMin, wkInt);
2232 end else if Trim(SList[i]) = 'n' then begin
2233 Result.FFirst := True;
2235 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2236 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2237 if Copy(SList[i], 1, 1) = 'n' then
2238 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2240 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2241 Result.FFirst := True;
2242 wkMax := Max(wkMax, wkInt);
2246 wkMin := Min(wkMin, wkInt);
2250 if Result.FStBegin and (not Result.FToEnd) then
2252 else if (not Result.FStBegin) and Result.FToEnd then
2254 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2255 Result.FSt := wkMin;
2256 Result.FTo := wkMax;
2258 //Result.FSt := wkMin;
2259 //Result.FTo := wkMax;
2265 Result.FDone := True;
2269 //
\90Vkako
\8f\91\8e®
2270 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2271 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2272 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2273 SList := TStringList.Create;
2276 FAWKStr.RegExp := '/';
2277 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2278 Result.FBBS := SList[1];
2279 Result.FKey := ChangeFileExt(SList[5], '');
2280 Result.FFirst := True;
2286 Result.FDone := True;
2290 //
\8b\8ckako
\8f\91\8e®
2291 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2292 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2293 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2294 SList := TStringList.Create;
2297 FAWKStr.RegExp := '/';
2298 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2299 Result.FBBS := SList[1];
2300 Result.FKey := ChangeFileExt(SList[4], '');
2301 Result.FFirst := True;
2307 Result.FDone := True;
2311 //log
\8by
\82Ñlog2
\8f\91\8e®
2312 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2313 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2314 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2315 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2316 SList := TStringList.Create;
2319 FAWKStr.RegExp := '/';
2320 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2321 Result.FBBS := SList[2];
2322 Result.FKey := ChangeFileExt(SList[5], '');
2323 Result.FFirst := True;
2329 Result.FDone := True;
2334 //
\8b\8cURL
\8f\91\8e®
2335 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2336 FAWKStr.RegExp := '/test/read\.cgi\?';
2337 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2338 s := Copy(s, 16, Length(s));
2339 SList := TStringList.Create;
2342 FAWKStr.RegExp := '&';
2343 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2344 Result.FFirst := True;
2345 for i := 0 to SList.Count - 1 do begin
2346 if Pos('bbs=', SList[i]) = 1 then begin
2347 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2348 end else if Pos('key=', SList[i]) = 1 then begin
2349 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2350 end else if Pos('st=', SList[i]) = 1 then begin
2351 wk := Copy(SList[i], 4, Length(SList[i]));
2352 if IsNumeric(wk) then
2353 Result.FSt := StrToInt(wk)
2354 else if wk = '' then
2355 Result.FStBegin := True;
2356 end else if Pos('to=', SList[i]) = 1 then begin
2357 wk := Copy(SList[i], 4, Length(SList[i]));
2358 if IsNumeric(wk) then
2359 Result.FTo := StrToInt(wk)
2360 else if wk = '' then
2361 Result.FToEnd := True;
2362 end else if Pos('nofirst=', SList[i]) = 1 then begin
2363 Result.FFirst := False;
2372 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2373 Result.FDone := True;
2381 \brief URI
\82ð
\95ª
\89ð
2382 \param URL
\95ª
\89ð
\82·
\82é URI
2383 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2384 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2385 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2386 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2387 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2388 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2390 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2400 URI := TIdURI.Create(URL);
2402 Protocol := URI.Protocol;
2405 Document := URI.Document;
2407 Bookmark := URI.Bookmark;
2414 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2415 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2417 function TGikoSys.GetVersionBuild: Integer;
2419 FixedFileInfo: PVSFixedFileInfo;
2420 VersionHandle, VersionSize: DWORD;
2421 pVersionInfo: Pointer;
2426 AppFile := Application.ExeName;
2427 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2428 if VersionSize = 0 then
2430 GetMem(pVersionInfo, VersionSize);
2432 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2433 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2434 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2436 FreeMem(pVersionInfo, VersionSize);
2441 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2442 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2443 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2445 \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
2446 \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
2447 \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
2448 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2450 \97á(
\90³
\8bK
\89»
\91O):\n
2451 http://
\92\86\97ª/ \n
2452 http://
\92\86\97ª/20-100
2454 (
\90³
\8bK
\89»
\8cã):\n
2455 http://
\92\86\97ª/l50
2457 function TGikoSys.GetBrowsableThreadURL(
2461 threadItem : TThreadItem;
2462 boardPlugIn : TBoardPlugIn;
2467 //=====
\83v
\83\89\83O
\83C
\83\93
2469 for i := Length( BoardGroups ) - 1 downto 1 do begin
2470 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2471 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2472 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2473 if board <> nil then begin
2474 boardPlugIn := BoardGroups[i].BoardPlugIn;
2475 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2476 Result := threadItem.URL;
2485 // 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¢
2488 if Length( Result ) = 0 then
2489 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2494 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2495 \param inURL
\83X
\83\8c\83b
\83h URL
2498 function TGikoSys.GetThreadURL2BoardURL(
2502 threadItem : TThreadItem;
2503 boardPlugIn : TBoardPlugIn;
2508 //=====
\83v
\83\89\83O
\83C
\83\93
2510 for i := Length( BoardGroups ) - 1 downto 1 do begin
2511 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2512 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2513 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2514 boardPlugIn := BoardGroups[i].BoardPlugIn;
2515 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2516 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2524 // 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¢
2527 if Length( Result ) = 0 then
2528 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2533 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2534 \param inURL
\83X
\83\8c\83b
\83h URL
2536 \see TGikoSys.GetThreadURL2BoardURL
2538 function TGikoSys.Get2chThreadURL2BoardURL(
2542 Protocol, Host, Path, Document, Port, Bookmark : string;
2543 BBSID, BBSKey : string;
2547 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2548 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2550 foundPos := Pos( '/test/read.cgi', inURL );
2551 if {(Is2chHost(Host)) and} (foundPos > 0) then
2552 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2554 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2559 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2560 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2561 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2562 \see TGikoSys.GetBrowsableThreadURL
2564 function TGikoSys.Get2chBrowsableThreadURL(
2568 Protocol, Host, Path, Document, Port, Bookmark : string;
2569 BBSID, BBSKey : string;
2573 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2576 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2577 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2578 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2580 if Is2chHost( Host ) then begin
2581 Result := Protocol + '://' + Host +
2582 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2584 if foundPos > 0 then
2585 Result := Copy( inURL, 1, foundPos ) +
2586 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2588 Result := Protocol + '://' + Host +
2589 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2596 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2597 \param inBoard
\94Â URL
2598 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2599 \return
\83X
\83\8c\83b
\83h URL
2601 function TGikoSys.Get2chBoard2ThreadURL(
2609 server := UrlToServer( inBoard.URL );
2610 //if Is2chHost( server ) then
2611 if inBoard.Is2ch then
2612 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2614 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2619 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2621 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2623 procedure TGikoSys.ListBoardFile;
2625 boardFileList : TStringList;
2630 for i := 0 to Length( BBSs ) - 1 do
2634 SetLength( BBSs, 0 );
2637 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2638 if FileExists( GikoSys.GetBoardFileName ) then begin
2639 SetLength( BBSs, l + 1 );
2640 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2641 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2645 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2646 SetLength( BBSs, l + 1 );
2647 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2648 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2652 // Board
\83t
\83H
\83\8b\83_
2653 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2654 BoardFileList := TStringList.Create;
2656 BoardFileList.BeginUpdate;
2657 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*', BoardFileList, True, True );
2658 BoardFileList.EndUpdate;
2659 for k := BoardFileList.Count - 1 downto 0 do begin
2660 if AnsiCompareText(ExtractFileExt(BoardFileList[ k ]), '.bak') = 0 then
2661 BoardFileList.Delete(k);
2663 SetLength( BBSs, l + BoardFileList.Count );
2664 for i := BoardFileList.Count - 1 downto 0 do begin
2665 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2666 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2676 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2677 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2679 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2684 boardFile : TStringList;
2685 CategoryList : TStringList;
2686 BoardList : TStringList;
2687 Category : TCategory;
2691 // RoundItem : TRoundItem;
2693 i, iBound : Integer;
2694 j, jBound : Integer;
2695 k, kBound : Integer;
2698 if not FileExists( bbs.FilePath ) then
2702 ini := TMemIniFile.Create('');
2703 boardFile := TStringList.Create;
2706 boardFile.LoadFromFile( bbs.FilePath );
2708 ini.SetStrings( boardFile );
2709 CategoryList := TStringList.Create;
2710 BoardList := TStringList.Create;
2712 ini.ReadSections( CategoryList );
2714 iBound := CategoryList.Count - 1;
2715 for i := 0 to iBound do begin
2716 ini.ReadSection( CategoryList[i], BoardList );
2717 Category := TCategory.Create;
2718 Category.No := i + 1;
2719 Category.Title := CategoryList[i];
2721 jBound := BoardList.Count - 1;
2722 for j := 0 to jBound do begin
2724 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2725 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2726 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2727 //=====
\83v
\83\89\83O
\83C
\83\93
2729 kBound := Length(BoardGroups) - 1;
2730 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2731 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2732 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2733 if not BoardGroups[k].Find(inistr, p) then begin
2734 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2735 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2736 if not BoardGroups[k].Find(tmpstring, p) then begin
2738 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2739 BoardGroups[k].AddObject(tmpstring, Board);
2740 Category.Add(Board);
2742 //
\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é
2746 Board := TBoard(BoardGroups[k].Objects[p]);
2747 if Board.ParentCategory <> Category then
2748 Category.Add(Board);
2752 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2753 BoardGroups[k].AddObject(tmpstring, Board);
2754 Category.Add(Board);
2756 //
\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é
2761 Board := TBoard(BoardGroups[k].Objects[p]);
2762 if Board.ParentCategory <> Category then
2763 Category.Add(Board);
2770 // 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¢
2773 if (Board = nil) then begin
2774 if not BoardGroups[0].Find(inistr,p) then begin
2775 Board := TBoard.Create( nil, inistr );
2776 BoardGroups[0].AddObject(inistr, Board);
2777 Category.Add(Board);
2779 Board := TBoard(BoardGroups[0].Objects[p]);
2780 if Board.ParentCategory <> Category then
2781 Category.Add(Board);
2785 if (Board.Multiplicity = 0) then begin
2788 Board.Multiplicity := 1;
2789 Board.Title := BoardList[j];
2790 Board.RoundDate := ZERO_DATE;
2795 Board.Multiplicity := Board.Multiplicity + 1;
2800 bbs.Add( Category );
2805 bbs.IsBoardFileRead := True;
2818 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2819 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2821 function TGikoSys.GetUnknownCategory : TCategory;
2823 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2826 if Length( BBSs ) < 2 then begin
2831 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2832 if Result = nil then begin
2833 Result := TCategory.Create;
2834 Result.Title := UNKNOWN_CATEGORY;
2835 BBSs[ 1 ].Add( Result );
2841 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2842 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2844 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2846 category : TCategory;
2848 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2851 category := GetUnknownCategory;
2852 if category = nil then begin
2855 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2856 if Result = nil then begin
2857 Result := TBoard.Create( inPlugIn, inURL );
2858 Result.Title := UNKNOWN_BOARD;
2859 category.Add( Result );
2866 function TGikoSys.GetSambaFileName : string;
2868 Result := Setting.GetSambaFileName;
2871 //! Samba.ini
\82ª
\96³
\82¯
\82ê
\82Î
\8dì
\90¬
2872 procedure TGikoSys.SambaFileExists();
2875 sambaStrList: TStringList;
2877 if not FileExists(GikoSys.GetSambaFileName) then begin
2878 sambaTmp := ChangeFileExt(GikoSys.GetSambaFileName, '.default');
2879 sambaStrList := TStringList.Create;
2881 if FileExists(sambaTmp) then begin
2882 sambaStrList.LoadFromFile(sambaTmp);
2883 sambaStrList.SaveToFile(GikoSys.GetSambaFileName);
2892 \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
2893 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2894 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2895 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç True
2896 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2897 \todo limited
\82ð Integer
\82É
\82·
\82é
\82©
\81A20
\82ð
\8aO
\82É
\8fo
\82·
2899 function TGikoSys.GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string;
2905 if (not IsNoValidID(AID)) and
2906 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2907 body := TStringList.Create;
2909 GetSameIDRes(AID, ThreadItem, body);
2910 if (limited) and (body.Count > 20) then begin
2911 for i := body.Count - 20 to body.Count - 1 do begin
2912 Result := Result + '>' + body[i] + ' ';
2915 for i := 0 to body.Count - 1 do begin
2916 Result := Result + '>' + body[i] + ' ';
2922 Result := HTMLCreater.ConvRes(Result, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', false);
2927 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2928 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2929 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2930 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2932 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2935 ReadList: TStringList;
2937 boardPlugIn : TBoardPlugIn;
2939 if (not IsNoValidID(AID)) and
2940 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2941 //if ThreadItem.IsBoardPlugInAvailable then begin
2942 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2943 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2944 //boardPlugIn := ThreadItem.BoardPlugIn;
2945 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2947 for i := 0 to threadItem.Count - 1 do begin
2949 Res := DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1));
2950 if(AnsiPos(AID, Res.FDateTime) > 0) then begin
2951 body.Add(IntToStr(i+1));
2955 ReadList := TStringList.Create;
2957 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2958 for i := 0 to ReadList.Count - 1 do begin
2959 Res := DivideStrLine(ReadList[i]);
2960 if AnsiPos(AID, Res.FDateTime) > 0 then begin
2961 body.Add(IntToStr(i+1));
2972 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2973 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2974 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2975 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç True
2977 \todo limited
\82ð Integer
\82É
\82·
\82é
\82©
\81A20
\82ð
\8aO
\82É
\8fo
\82·
2979 function TGikoSys.GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string;
2985 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2986 body := TStringList.Create;
2988 GetSameIDRes(AIDNum, ThreadItem, body);
2989 if (limited) and (body.Count > 20) then begin
2990 for i := body.Count - 20 to body.Count - 1 do begin
2991 Result := Result + '>' + body[i] + ' ';
2994 for i := 0 to body.Count - 1 do begin
2995 Result := Result + '>' + body[i] + ' ';
3001 Result := HTMLCreater.ConvRes(Result, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', false);
3006 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
3007 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
3008 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
3009 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
3011 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
3014 boardPlugIn : TBoardPlugIn;
3016 stList: TStringList;
3019 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
3020 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
3021 //if ThreadItem.IsBoardPlugInAvailable then begin
3022 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
3023 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
3024 //boardPlugIn := ThreadItem.BoardPlugIn;
3025 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
3026 Res := DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum));
3028 Res := DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum));
3030 AID := Res.FDateTime;
3031 if AnsiPos('id', AnsiLowerCase(AID)) > 0 then begin
3032 AID := Copy(AID, AnsiPos('id', AnsiLowerCase(AID)) - 1, 11);
3033 if AnsiPos(' be:', AnsiLowerCase(AID)) > 0 then begin
3034 AID := Copy(AID, 1, AnsiPos(' BE:', AnsiLowerCase(AID)) - 1)
3037 stlist := TStringList.Create;
3039 stList.DelimitedText := AID;
3041 for i := 0 to stList.Count - 1 do
3042 if Length(WideString(stList[i])) = 8 then begin
3043 if NotDateorTimeString(stList[i]) then begin
3052 if not IsNoValidID(AID) then
3053 GetSameIDRes(AID, ThreadItem, body);
3058 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
3059 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
3060 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
3061 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
3063 function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer;
3068 if (not IsNoValidID(AID))
3069 and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
3070 body := TStringList.Create;
3072 GetSameIDRes(AID, ThreadItem, body);
3073 Result := body.Count;
3082 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
3083 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
3084 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
3085 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
3087 function TGikoSys.GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer;
3092 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
3093 body := TStringList.Create;
3095 GetSameIDRes(AIDNum, ThreadItem, body);
3096 Result := body.Count;
3104 \brief
\8e\9e\8d\8f\82ð
\8e¦
\82·
\95¶
\8e\9a\97ñ
\82Å
\82Í
\96³
\82¢
\82©
\82Ç
\82¤
\82©
3105 \param AStr
\92²
\82×
\82é
\95¶
\8e\9a\97ñ
3106 \return
\8e\9e\8d\8f\82Å
\82Í
\96³
\82¢
\82È
\82ç True
3107 \todo
\94Û
\92è
\8c`(Not)
\82æ
\82è
\8dm
\92è
\8cn(Is)
3109 function TGikoSys.NotDateorTimeString(const AStr : string): boolean;
3126 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
3127 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3128 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
3130 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
3133 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3134 Bayesian.CountWord( text, wordCount );
3139 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
3140 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3141 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
3142 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
3143 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
3144 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
3145 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
3147 \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
3148 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
3150 \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
3152 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
3155 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3156 Bayesian.Forget( wordCount, isSpam );
3161 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3162 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3163 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3165 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3168 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3169 Bayesian.Learn( wordCount, isSpam );
3174 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3175 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3176 \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)
3177 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3179 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3182 case Setting.SpamFilterAlgorithm of
3183 gsfaNone: Result := 0;
3184 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3185 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3186 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3193 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3194 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3196 [
\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Ì
3197 [
\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
3199 function TGikoSys.SetUserOptionalStyle(): string;
3202 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3203 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3204 if GikoSys.Setting.BrowserFontSize <> 0 then
3205 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3206 if GikoSys.Setting.BrowserFontColor <> -1 then
3207 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3208 if GikoSys.Setting.BrowserBackColor <> -1 then
3209 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3210 case GikoSys.Setting.BrowserFontBold of
3211 -1: Result := Result + 'font-weight:normal;';
3212 1: Result := Result + 'font-weight:bold;';
3214 case GikoSys.Setting.BrowserFontItalic of
3215 -1: Result := Result + 'font-style:normal;';
3216 1: Result := Result + 'font-style:italic;';
3221 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3222 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3223 \param ANum
\83\8c\83X
\94Ô
3224 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3225 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3227 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3230 BNum, BMark : string;
3232 p := AnsiPos('BE:', AnsiUpperCase(AID));
3234 BNum := Copy(AID, p, Length(AID));
3235 AID := Copy(AID, 1, p - 1);
3236 p := AnsiPos('-', BNum);
3238 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3239 BNum := Copy(BNum, 1, p - 1);
3242 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3243 + '" target=_blank>' + BMark + '</a>';
3249 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3250 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3251 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3253 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3255 Translation = '\VarFileInfo\Translation';
3256 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3258 BufSize, HWnd: DWORD;
3259 VerInfoBuf: Pointer;
3261 VerDataLen: Longword;
3264 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3265 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3266 if BufSize <> 0 then begin
3267 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3268 GetMem(VerInfoBuf, BufSize);
3270 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3271 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3272 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3274 if not (VerDataLen > 0) then
3275 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3277 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3278 //
\81¨'\StringFileInfo\027382\FileDescription'
3279 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3280 [IntToHex(Integer(VerData^) and $FFFF, 4),
3281 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3282 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3284 if VerDataLen > 0 then begin
3285 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3287 SetLength(result, VerDataLen);
3288 StrLCopy(PChar(result), VerData, VerDataLen);
3292 FreeMem(VerInfoBuf);
3298 \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
3299 \return 1
\8ds1plugin
3301 function TGikoSys.GetPluginsInfo(): String;
3304 major, minor, revision : Cardinal;
3305 agent, release : String;
3307 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3310 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3311 for i := 0 to Length(BoardGroups) - 1 do begin
3312 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3313 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3314 if BoardGroups[i].BoardPlugIn <> nil then begin
3315 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3318 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3320 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3326 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3327 function TGikoSys.GetIEVersion: string;
3331 R := TRegistry.Create;
3333 //
\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¢
3334 R.Access := KEY_EXECUTE;
3335 R.RootKey := HKEY_LOCAL_MACHINE;
3336 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3338 Result := R.ReadString('version');
3340 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3350 GikoSys := TGikoSys.Create;
3353 if GikoSys <> nil then begin