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;
264 //LENGTH_RESTITLE = 40;
265 ZERO_DATE: Integer = 25569;
266 BETA_VERSION_NAME_E = 'beta';
267 BETA_VERSION_NAME_J = 'ÊÞÀ';
269 BETA_VERSION_BUILD = ''; //!< debug
\94Å
\82È
\82Ç
270 APP_NAME = 'gikoNavi';
271 BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
277 Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils, Sort, YofUtils,
278 IniFiles, DateUtils, SkinFiles;
281 FOLDER_INDEX_VERSION = '1.01';
282 USER_AGENT = 'Monazilla';
283 DEFAULT_NGWORD_FILE_NAME : String = 'NGword.txt';
284 NGWORDs_DIR_NAME : String = 'NGwords';
286 READ_PATH: string = '/test/read.cgi/';
287 OLD_READ_PATH: string = '/test/read.cgi?';
288 KAKO_PATH: string = '/kako/';
290 KeyWordStr: array [TVerResourceKey] of String = (
304 // *************************************************************************
305 //! GikoSys
\83R
\83\93\83X
\83g
\83\89\83N
\83^
306 // *************************************************************************
307 constructor TGikoSys.Create;
309 FSetting := TSetting.Create;
310 FDolib := TDolib.Create;
311 FAWKStr := TAWKStr.Create(nil);
312 if DirectoryExists(GetConfigDir) = false then begin
313 CreateDir(GetConfigDir);
315 FAbon := TAbon.Create;
316 FAbon.IgnoreKana := FSetting.IgnoreKana;
317 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
319 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
320 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
321 FAbon.DeleteSyria := FSetting.DeleteSyria;
322 FAbon.Deleterlo := FSetting.AbonDeleterlo;
323 FAbon.Replaceul := FSetting.AbonReplaceul;
324 FAbon.AbonPopupRes := FSetting.PopUpAbon;
326 FSelectResFilter := TAbon.Create;
327 FSelectResFilter.IgnoreKana := True;
328 //
\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
329 FSelectResFilter.AbonString := '';
331 ResRange := FSetting.ResRange;
332 FVersion := Trim(GetVersionInfo(vrFileVersion));
333 FBayesian := TGikoBayesian.Create;
334 //FBoardURLList := TStringList.Create;
335 //
\83\81\83b
\83Z
\81[
\83W
\82Ì
\8dì
\90¬
336 FGikoMessage := TGikoMessage.Create;
339 // *************************************************************************
340 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
341 // *************************************************************************
342 destructor TGikoSys.Destroy;
345 FileList: TStringList;
347 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
356 FSelectResFilter.Free;
358 //FBoardURLList.Free;
359 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
360 FileList := TStringList.Create;
362 FileList.BeginUpdate;
363 GetFileList(GetTempFolder, '*.html', FileList, False, True);
365 for i := 0 to FileList.Count - 1 do begin
366 DeleteFile(FileList[i]);
375 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
376 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
377 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
380 function TGikoSys.IsNumeric(s: string): boolean;
391 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
392 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
393 \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
395 function TGikoSys.IsFloat(s: string): boolean;
399 Result := TextToFloat(PChar(s), v, fvExtended);
402 // *************************************************************************
403 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
404 // *************************************************************************
405 function TGikoSys.GetBoardFileName: string;
407 Result := Setting.GetBoardFileName;
410 // *************************************************************************
411 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
412 // *************************************************************************
413 function TGikoSys.GetCustomBoardFileName: string;
415 Result := Setting.GetCustomBoardFileName;
418 // *************************************************************************
419 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
420 // *************************************************************************
421 function TGikoSys.GetHtmlTempFileName: string;
423 Result := Setting.GetHtmlTempFileName;
427 // *************************************************************************
428 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
429 // *************************************************************************
430 function TGikoSys.GetAppDir: string;
432 Result := Setting.GetAppDir;
435 // *************************************************************************
436 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
437 // *************************************************************************
438 function TGikoSys.GetTempFolder: string;
440 Result := Setting.GetTempFolder;
443 // *************************************************************************
444 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
445 // *************************************************************************)
446 function TGikoSys.GetSentFileName: string;
448 Result := Setting.GetSentFileName;
451 // *************************************************************************
452 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
453 // *************************************************************************
454 function TGikoSys.GetOutBoxFileName: string;
456 Result := Setting.GetOutBoxFileName;
459 // *************************************************************************
460 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
461 // *************************************************************************
462 function TGikoSys.GetConfigDir: string;
464 Result := Setting.GetConfigDir;
467 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
468 function TGikoSys.GetStyleSheetDir: string;
470 Result := Setting.GetStyleSheetDir;
473 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
474 function TGikoSys.GetSkinDir: string;
476 Result := Setting.GetSkinDir;
479 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
480 function TGikoSys.GetSkinHeaderFileName: string;
482 Result := Setting.SkinFiles.GetSkinHeaderFileName;
485 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
486 function TGikoSys.GetSkinFooterFileName: string;
488 Result := Setting.SkinFiles.GetSkinFooterFileName;
491 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
492 function TGikoSys.GetSkinNewResFileName: string;
494 Result := Setting.SkinFiles.GetSkinNewResFileName;
497 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
498 function TGikoSys.GetSkinResFileName: string;
500 Result := Setting.SkinFiles.GetSkinResFileName;
503 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
504 function TGikoSys.GetSkinBookmarkFileName: string;
506 Result := Setting.SkinFiles.GetSkinBookmarkFileName;
509 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
510 function TGikoSys.GetSkinNewmarkFileName: string;
512 Result := Setting.SkinFiles.GetSkinNewmarkFileName;
515 //! UserAgent
\8eæ
\93¾
516 function TGikoSys.GetUserAgent: string;
518 if Dolib.Connected then begin
519 Result := Format('%s %s/%s%d/%s', [
526 Result := Format('%s/%s %s/%s%d/%s', [
537 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
538 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
539 \return val
\82ð
\8e¦
\82· TDateTime
541 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
543 Result := ZERO_DATE + val / 86400.0;
547 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
548 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
549 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
551 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
553 Result := Trunc((ADate - ZERO_DATE) * 86400);
558 \brief Subject
\83t
\83@
\83C
\83\8bRead
559 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
561 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
563 ThreadItem: TThreadItem;
565 FileList: TStringList;
574 datFileCheck: Boolean;
576 FavoThreadItem : TFavoriteThreadItem;
586 if Board.IsThreadDatRead then
590 usePlugIn := Board.IsBoardPlugInAvailable;
591 //server := UrlToServer( Board.URL );
592 //
\83X
\83\8c\83b
\83h
\82Å
\8b¤
\92Ê
\82ÌURL
\95\94
593 if Board.is2ch then begin
594 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi/' + Board.BBSID + '/';
596 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi?bbs=' + Board.BBSID + '&key=';
599 FileName := Board.GetFolderIndexFileName;
602 datFileCheck := (Setting.CheckDatFile) or (not FileExists(FileName));
603 if (datFileCheck) then begin
604 FileList := TStringList.Create;
605 FileList.Sorted := True;
606 FileList.BeginUpdate;
607 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
608 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
612 //
\8fd
\95¡
\82ð
\96h
\82®
614 Board.Sorted := True;
615 sl := TStringList.Create;
617 if FileExists(FileName) then begin
618 sl.LoadFromFile(FileName);
619 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
620 for i := sl.Count - 1 downto 1 do begin
621 Rec := ParseIndexLine(sl[i]);
622 if (datFileCheck) then begin
623 islog := FileList.Find( Rec.FFileName, Index );
625 islog := (Rec.FSize <> 0) and (Rec.FCount <> 0);
628 ThreadItem := TThreadItem.Create(
631 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
633 if Board.is2ch then begin
634 ThreadItem := TThreadItem.Create(
637 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
642 ThreadItem := TThreadItem.Create(
645 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
652 ThreadItem.BeginUpdate;
653 if (datFileCheck) and (islog) then
654 FileList.Delete( Index );
656 ThreadItem.No := Rec.FNo;
657 ThreadItem.FileName := Rec.FFileName;
658 ThreadItem.Title := MojuUtils.UnSanitize(Rec.FTitle);
659 ThreadItem.Count := Rec.FCount;
660 ThreadItem.Size := Rec.FSize;
661 ThreadItem.RoundDate := Rec.FRoundDate;
662 ThreadItem.LastModified := Rec.FLastModified;
663 ThreadItem.Kokomade := Rec.FKokomade;
664 ThreadItem.NewReceive := Rec.FNewReceive;
665 ThreadItem.UnRead := Rec.FUnRead;
666 ThreadItem.ScrollTop := Rec.FScrollTop;
667 ThreadItem.AllResCount := Rec.FAllResCount;
668 ThreadItem.NewResCount := Rec.FNewResCount;
669 ThreadItem.AgeSage := Rec.FAgeSage;
670 ThreadItem.ParentBoard := Board;
671 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
673 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
674 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
677 ThreadItem.EndUpdate;
678 Board.Add(ThreadItem);
680 if (ThreadItem.UnRead) and (ThreadItem.IsLogFile) then
685 if UnRead <> Board.UnRead then
686 Board.UnRead := UnRead;
688 if (datFileCheck) then begin
689 //
\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
690 AddOutofIndexDat(Board, FileList);
694 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
695 RestoreThreadData( Board );
698 if (datFileCheck) then begin
701 Board.Sorted := False;
703 Board.IsThreadDatRead := True;
705 rt := GetTickCount - st;
706 Writeln('Read Done.' + IntToStr(rt) + ' ms');
710 \brief
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
711 \param Board
\92Ç
\89Á
\82·
\82é
\94Â
712 \param DatList dat
\83t
\83@
\83C
\83\8b\96¼
714 procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: Boolean = True);
717 Boardpath,FileName : String;
719 ThreadItem: TThreadItem;
723 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
724 //
\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
725 for i := 0 to DatList.Count - 1 do begin
726 FileName := Boardpath + DatList[i];
728 if (not AllCreate) then begin
730 ThreadItem := Board.FindThreadFromFileName(DatList[i]);
731 if (ThreadItem = nil) then begin
734 if Board.IsBoardPlugInAvailable then begin
735 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
737 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
741 if (ThreadItem = nil) then begin
742 if Board.IsBoardPlugInAvailable then begin
743 ThreadItem := TThreadItem.Create(
746 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
747 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
749 ThreadItem := TThreadItem.Create(
752 Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
753 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
758 ThreadItem.BeginUpdate;
759 ThreadItem.FileName := DatList[i];
760 //ThreadItem.FilePath := FileName;
761 ThreadItem.No := Board.Count + 1;
762 ThreadItem.Title := ResRec.FTitle;
763 ThreadItem.Count := GetFileLineCount(FileName);
764 ThreadItem.AllResCount := ThreadItem.Count;
765 ThreadItem.NewResCount := ThreadItem.Count;
766 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é
767 ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) );
768 ThreadItem.LastModified := ThreadItem.RoundDate;
769 ThreadItem.Kokomade := -1;
770 ThreadItem.NewReceive := 0;
771 ThreadItem.ParentBoard := Board;
772 ThreadItem.IsLogFile := True;
773 ThreadItem.Round := False;
774 ThreadItem.UnRead := False;
775 ThreadItem.ScrollTop := 0;
776 ThreadItem.AgeSage := gasNone;
777 ThreadItem.EndUpdate;
778 if (AllCreate) or (create) then begin
779 Board.Add(ThreadItem);
784 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
785 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
787 procedure TGikoSys.CreateThreadDat(Board: TBoard);
791 SubjectList: TStringList;
797 if not FileExists(Board.GetSubjectFileName) then Exit;
798 FileName := Board.GetFolderIndexFileName;
800 SubjectList := TStringList.Create;
802 SubjectList.LoadFromFile(Board.GetSubjectFileName);
803 sl := TStringList.Create;
807 sl.Add(FOLDER_INDEX_VERSION);
808 for i := 0 to SubjectList.Count - 1 do begin
809 Rec := DivideSubject(SubjectList[i]);
811 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
814 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
815 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
816 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
817 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
818 + Format('%x', [0]) + #1 //size
819 + Format('%x', [0]) + #1 //RoundDate
820 + Format('%x', [0]) + #1 //LastModified
821 + Format('%x', [0]) + #1 //Kokomade
822 + Format('%x', [0]) + #1 //NewReceive
823 + '0' + #1 //
\96¢
\8eg
\97p
824 + Format('%x', [0]) + #1 //UnRead
825 + Format('%x', [0]) + #1 //ScrollTop
826 + Format('%x', [Rec.FCount]) + #1 //AllResCount
827 + Format('%x', [0]) + #1 //NewResCount
828 + Format('%x', [0]); //AgeSage
830 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
831 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
833 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
834 MojuUtils.Sanitize(Rec.FTitle), //
\83^
\83C
\83g
\83\8b
835 Rec.FCount, //
\83J
\83E
\83\93\83g
844 Rec.FCount, //AllResCount
853 sl.SaveToFile(FileName);
863 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
864 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
866 procedure TGikoSys.WriteThreadDat(Board: TBoard);
868 // Values: array[Boolean] of string = ('0', '1');
874 TmpFileList: TStringList;
876 if not Board.IsThreadDatRead then
878 FileName := Board.GetFolderIndexFileName;
879 ForceDirectoriesEx( ExtractFilePath( FileName ) );
881 sl := TStringList.Create;
882 TmpFileList := TStringList.Create;
883 TmpFileList.Sorted := true;
885 TmpFileList.BeginUpdate;
886 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
887 TmpFileList.EndUpdate;
889 sl.Add(FOLDER_INDEX_VERSION);
891 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
892 Sort.SetSortNoFlag(true);
893 Sort.SetSortOrder(true);
894 Sort.SetSortIndex(0);
895 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
896 Board.CustomSort(ThreadItemSortProc);
898 for i := 0 to Board.Count - 1 do begin
899 Board.Items[i].No := i + 1;
900 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
901 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
902 [Board.Items[i].No, //
\94Ô
\8d\86
903 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
904 MojuUtils.Sanitize(Board.Items[i].Title), //
\83^
\83C
\83g
\83\8b
905 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
906 Board.Items[i].Size, //size
907 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
908 DateTimeToInt(Board.Items[i].LastModified), //LastModified
909 Board.Items[i].Kokomade, //Kokomade
910 Board.Items[i].NewReceive, //NewReceive
912 BoolToInt(Board.Items[i].UnRead), //UnRead
913 Board.Items[i].ScrollTop, //ScrollTop
914 Board.Items[i].AllResCount, //AllResCount
915 Board.Items[i].NewResCount, //NewResCount
916 Ord(Board.Items[i].AgeSage)] //AgeSage
922 sl.SaveToFile(FileName);
924 for i := 0 to TmpFileList.Count - 1 do begin
925 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
935 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
936 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
937 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
939 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
941 Result.FNo := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
942 Result.FFileName := MojuUtils.RemoveToken(Line, #1);
943 Result.FTitle := MojuUtils.UnSanitize(MojuUtils.RemoveToken(Line, #1));
944 Result.FCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
945 Result.FSize := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
946 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
947 Result.FLastModified := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
948 Result.FKokomade := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), -1);
949 Result.FNewReceive := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
950 RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
951 Result.FUnRead := IntToBool(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
952 Result.FScrollTop := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
953 Result.FAllResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
954 Result.FNewResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
955 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
960 \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é
961 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
962 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
963 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
964 \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
965 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
967 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
968 \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
972 GetFileList('c:\', '*.txt', list, True, True);
975 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
978 SearchRec : TSearchRec;
981 Path := IncludeTrailingPathDelimiter(Path);
982 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
984 while rc = 0 do begin
985 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
986 s := Path + SearchRec.Name;
988 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
992 List.Add(SearchRec.Name);
993 if SubDir and (SearchRec.Attr and faDirectory > 0) then
994 GetFileList(s, Mask, List, True, IsPathAdd);
996 rc := FindNext(SearchRec);
999 SysUtils.FindClose(SearchRec);
1005 \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
1006 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
1007 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1008 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
1009 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1010 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
1011 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
1014 GetFileList('c:\', '*.txt', list, True);
1017 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
1020 SearchRec : TSearchRec;
1022 Path := IncludeTrailingPathDelimiter(Path);
1023 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
1025 while rc = 0 do begin
1026 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1027 if (SearchRec.Attr and faDirectory = 0) then begin
1028 if IsPathAdd then begin
1029 List.Add(Path + SearchRec.Name)
1031 List.Add(SearchRec.Name);
1035 rc := FindNext(SearchRec);
1038 SysUtils.FindClose(SearchRec);
1044 \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é
1045 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1046 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1047 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1048 \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
1050 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1051 \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
1055 GetDirectoryList('c:\', '*.txt', list, True);
1058 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1061 SearchRec : TSearchRec;
1064 Path := IncludeTrailingPathDelimiter(Path);
1065 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1067 while rc = 0 do begin
1068 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1069 s := Path + SearchRec.Name;
1070 //if (SearchRec.Attr and faDirectory > 0) then
1071 // s := IncludeTrailingPathDelimiter(s)
1073 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1074 List.Add( IncludeTrailingPathDelimiter( s ) );
1075 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1076 GetDirectoryList(s, Mask, List, True);
1078 rc := FindNext(SearchRec);
1081 SysUtils.FindClose(SearchRec);
1087 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1088 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1089 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1091 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1101 if AnsiPos('<>', Line) = 0 then
1105 Result.FFileName := RemoveToken(Line, Delim);
1106 Result.FTitle := Trim(RemoveToken(Line, Delim));
1108 ws := Result.FTitle;
1109 if Copy(ws, Length(ws), 1) = ')' then begin
1112 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1115 end else if Copy(ws, Length(ws), 1) = '>' then begin
1119 for i := Length(ws) - 1 downto 1 do begin
1120 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1121 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1122 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1123 if IsNumeric(ws) then
1124 Result.FCount := StrToInt(ws);
1125 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1132 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1133 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1136 function TGikoSys.UrlToID(url: string): string;
1143 if url = '' then Exit;
1145 url := Copy(url, 0, Length(url) - 1);
1146 for i := Length(url) downto 0 do begin
1147 if url[i] = '/' then begin
1148 Result := Copy(url, i + 1, Length(url));
1158 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1159 \param url
\89ð
\8eß
\82·
\82é URL
1160 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1162 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1164 function TGikoSys.UrlToServer(url: string): string;
1171 wsURL := Trim(wsURL);
1173 if wsURL = '' then exit;
1175 if Copy(wsURL, Length(wsURL), 1) = '/' then
1176 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1178 for i := Length(wsURL) downto 0 do begin
1179 if wsURL[i] = '/' then begin
1180 Result := Copy(wsURL, 0, i);
1187 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1188 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1189 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1191 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1195 Code := GetFileAttributes(PChar(Name));
1196 Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1200 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1201 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1202 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1204 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1207 if Length(Dir) = 0 then
1208 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1209 Dir := ExcludeTrailingPathDelimiter(Dir);
1210 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1211 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1212 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1216 \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
1217 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1218 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1219 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1220 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1221 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1222 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1224 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1228 Result := StrTokNext(sep, Rec);
1232 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1233 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1234 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1235 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1236 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1237 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1239 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1246 if Len >= Pos then begin
1247 while (Pos <= Len) and (Str[Pos] in sep) do begin
1251 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1252 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1257 Result := Copy(Str, I, Pos - I);
1258 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1266 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1267 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1268 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1270 function TGikoSys.GetFileSize(FileName : string): longint;
1275 if not FileExists(FileName) then begin
1279 Assign(F, FileName);
1281 Result := FileSize(F);
1289 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1290 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1292 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1294 function TGikoSys.GetFileLineCount(FileName : string): longint;
1298 sl := TStringList.Create;
1301 sl.LoadFromFile(FileName);
1313 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1314 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1315 \param Line
\8ew
\92è
\8ds
1316 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1317 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1319 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1321 fileTmp : TStringList;
1324 if FileExists(FileName) then begin
1325 fileTmp := TStringList.Create;
1328 fileTmp.LoadFromFile( FileName );
1329 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1330 Result := fileTmp.Strings[ Line-1 ];
1333 //on EFOpenError do Result := '';
1342 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1343 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1345 procedure TGikoSys.MenuFont(Font: TFont);
1348 nm: NONCLIENTMETRICS;
1350 nm.cbSize := sizeof(NONCLIENTMETRICS);
1352 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1353 lf := nm.lfMenuFont;
1355 Font.Name := lf.lfFaceName;
1356 Font.Height := lf.lfHeight;
1358 if lf.lfWeight >= 700 then
1359 Font.Style := Font.Style + [fsBold];
1360 if lf.lfItalic = 1 then
1361 Font.Style := Font.Style + [fsItalic];
1365 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1366 \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ñ
1367 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1368 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1370 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1372 function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1376 p := AnsiPos(delimiter, s);
1380 Result := Copy(s, 1, p - 1);
1381 Delete(s, 1, Length(Result) + Length(delimiter));
1386 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1387 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1388 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1389 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1391 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1393 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1398 for i := 0 to index do
1399 Result := RemoveToken(s, delimiter);
1403 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1404 {procedure TGikoSys.FlashExitWrite;
1408 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1409 for i := 0 to FExitWrite.Count - 1 do
1410 WriteThreadDat(FExitWrite[i]);
1415 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1416 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1417 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1418 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1422 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1424 ERASECHAR : array [1..39] of string =
1425 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1426 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1427 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1428 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1430 Chr : array [0..255] of char;
1434 s := Trim(LongName);
1435 if (Length(s) <= ALength) then begin
1439 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1440 S := CustomStringReplace(S, ERASECHAR[i], '');
1442 if (Length(S) <= ALength) then begin
1445 Windows.LCMapString(
1446 GetUserDefaultLCID(),
1454 S := Copy(S,1,ALength);
1456 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1457 S := Copy(S, 1, Length(S) - 1);
1468 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1469 \return False..0, True..1
1471 function TGikoSys.BoolToInt(b: Boolean): Integer;
1473 Result := IfThen(b, 1, 0);
1477 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1478 \return 1..True, other..False
1479 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1480 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1482 function TGikoSys.IntToBool(i: Integer): Boolean;
1488 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1489 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1490 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1491 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1493 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1497 GZipStream: TGzipDecompressStream;
1498 TextStream: TStringStream;
1499 buf: array[0..BUF_SIZE - 1] of Byte;
1505 TextStream := TStringStream.Create('');
1507 //
\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¢)
1508 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1509 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1510 ResStream.Position := 0;
1511 GZipStream := TGzipDecompressStream.Create(TextStream);
1514 FillChar(buf, BUF_SIZE, 0);
1515 cnt := ResStream.Read(buf, BUF_SIZE);
1517 GZipStream.Write(buf, BUF_SIZE);
1523 ResStream.Position := 0;
1525 FillChar(buf, BUF_SIZE, 0);
1526 cnt := ResStream.Read(buf, BUF_SIZE);
1528 TextStream.Write(buf, BUF_SIZE);
1532 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1533 s := TextStream.DataString;
1536 while (i > 0) and (s[i] = #0) do
1538 Delete(s, i + 1, ln - i);
1541 while i <> 0 do begin
1553 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1554 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1555 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1557 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1559 STD_SEC = 'KeySetting';
1565 SecList: TStringList;
1566 Component: TComponent;
1568 if not FileExists(fileName) then
1570 SecList := TStringList.Create;
1571 ini := TMemIniFile.Create(fileName);
1573 ini.ReadSection(STD_SEC, SecList);
1574 for i := 0 to SecList.Count - 1 do begin
1575 ActionName := SecList[i];
1576 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1577 if ActionKey <> -1 then begin
1578 Component := ActionList.Owner.FindComponent(ActionName);
1579 if TObject(Component) is TAction then begin
1580 TAction(Component).ShortCut := ActionKey;
1591 \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¶
1592 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1593 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1595 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
1597 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1599 STD_SEC = 'KeySetting';
1604 ini := TMemIniFile.Create(GetConfigDir + FileName);
1606 for i := 0 to ActionList.ActionCount - 1 do begin
1607 if ActionList.Actions[i].Tag = -1 then
1609 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1619 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1620 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1621 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1623 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1625 PI: TProcessInformation;
1629 Path := '"' + AppPath + '"';
1631 Path := Path + ' ' + Param;
1633 SI.Cb := SizeOf(Si);
1634 SI.lpReserved := nil;
1635 SI.lpDesktop := nil;
1638 SI.cbReserved2 := 0;
1639 SI.lpReserved2 := nil;
1641 Windows.CreateProcess(nil,
1654 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1655 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1656 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1658 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1662 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1663 gbtUserApp, gbtAuto:
1664 if (Setting.URLApp) and (FileExists(Setting.URLAppFile)) then
1665 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1667 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1672 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1673 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1674 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1676 function TGikoSys.HTMLDecode(const AStr: String): String;
1678 Sp, Rp, Cp, Tp: PChar;
1683 SetLength(Result, Length(AStr));
1685 Rp := PChar(Result);
1688 while Sp^ <> #0 do begin
1694 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1700 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1704 while (Sp^ <> ';') and (Sp^ <> #0) do
1711 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1719 Num := IsNumeric(Copy(Tp, 1, 1));
1720 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1721 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1725 SetString(S, Tp, Sp - Tp);
1730 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1731 //[Cp^ + Sp^, Cp - PChar(AStr)])
1741 // on E:EConvertError do
1742 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1743 // [Cp^ + Sp^, Cp - PChar(AStr)])
1745 SetLength(Result, Rp - PChar(Result));
1749 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1750 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1751 \return
\8eæ
\93¾
\82µ
\82½ URL
1753 function TGikoSys.GetHRefText(s: string): string;
1763 Index := AnsiPos('href', LowerCase(s));
1766 s := Trim(Copy(s, Index + 4, Length(s)));
1767 s := Trim(Copy(s, 2, Length(s)));
1769 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1770 //if Copy(s, 1, 1) = '"' then begin
1771 if s[1] = '"' then begin
1772 s := Trim(Copy(s, 2, Length(s)));
1775 Index := AnsiPos('"', s);
1776 if Index <> 0 then begin
1777 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1778 s := Copy(s, 1, Index - 1);
1780 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1781 Index := AnsiPos(' ', s);
1782 Index2 := AnsiPos('>', s);
1785 if Index > Index2 then
1788 s := Copy(s, 1, Index - 1)
1790 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1797 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1798 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1799 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1801 function TGikoSys.Is2chHost(Host: string): Boolean;
1803 HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
1809 if RightStr( Host, 1 ) = '/' then
1810 Host := Copy( Host, 1, Length( Host ) - 1 );
1811 OutputDebugString(pchar(HOST_NAME[0]));
1812 for i := 0 to Length(HOST_NAME) - 1 do begin
1813 // Len := Length(HOST_NAME[i]);
1814 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1815 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1823 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1824 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1825 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1826 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1827 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1828 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1829 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1831 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1841 Index := AnsiPos(READ_PATH, path);
1842 if Index <> 0 then begin
1843 s := Copy(path, Index + Length(READ_PATH), Length(path));
1845 if (Length(s) > 0) and (s[1] = '/') then
1847 BBSID := GetTokenIndex(s, '/', 0);
1848 BBSKey := GetTokenIndex(s, '/', 1);
1851 Result := (BBSID <> '') or (BBSKey <> '');
1854 Index := AnsiPos(KAKO_PATH, path);
1855 if Index <> 0 then begin
1856 s := Copy(path, 2, Length(path));
1857 BBSID := GetTokenIndex(s, '/', 0);
1858 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1859 BBSID := GetTokenIndex(s, '/', 1);
1860 BBSKey := ChangeFileExt(Document, '');
1861 Result := (BBSID <> '') or (BBSKey <> '');
1864 Index := AnsiPos('read.cgi?', URL);
1865 if Index <> 0 then begin
1866 SList := TStringList.Create;
1869 // s := HTMLDecode(Document);
1870 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1871 BBSID := SList.Values['bbs'];
1872 BBSKey := SList.Values['key'];
1873 Result := (BBSID <> '') or (BBSKey <> '');
1885 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1886 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1887 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1888 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1890 http://2ch.net/
\92\86\97ª/32-50 \n
1891 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1893 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1900 URL := Trim(LowerCase(URL));
1901 if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
1905 buf := Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 );
1907 stRes := StrToInt64( buf );
1908 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1909 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
1911 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, Length( URL ) - AnsiPos('&to=', URL ) - 4 + 1 );
1914 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1915 buf := Copy( buf, 1, ps );
1919 endRes := StrToInt64(buf)
1926 if (stRes <> 0) and (endRes = 0) then
1927 endRes := stRes + MAX_POPUP_RES
1928 else if (stRes = 0) and (endRes <> 0) then begin
1929 stRes := endRes - MAX_POPUP_RES;
1933 GikoSys.GetBrowsableThreadURL( URL );
1934 end else if( AnsiPos('&res=', URL ) <> 0 ) then begin
1936 buf := Copy( URL, AnsiPos('&res=', URL ) + 5, Length( URL ) - AnsiPos('&res=', URL ) - 5 + 1 );
1939 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1940 buf := Copy( buf, 1, ps );
1943 stRes := StrToInt(buf)
1950 end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
1952 stRes := StrToInt64( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
1953 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1954 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, AnsiPos( '&nofirst=',URL) - AnsiPos('&end=', URL ) - 5);
1956 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, Length( URL ) - AnsiPos('&to=', URL ) - 5 + 1 );
1959 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1960 buf := Copy( buf, 1, ps );
1964 endRes := StrToInt64(buf);
1971 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
1972 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
1973 if Length(buf) > 0 then begin
1974 if AnsiPos('-', buf) = 1 then begin
1979 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1981 convBuf := Copy( buf, 1, ps );
1982 if convBuf <> '' then
1983 endRes := StrToInt64(convBuf)
1989 if endRes <> 0 then begin
1990 stRes := endRes - MAX_POPUP_RES;
1997 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1999 convBuf := Copy( buf, 1, ps );
2000 if convBuf <> '' then begin
2001 stRes := StrToInt64(convBuf);
2005 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2007 convBuf := Copy( buf, 1, ps );
2008 if convBuf <> '' then
2009 endRes := StrToInt64(convBuf)
2031 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2032 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2033 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2035 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2040 // convBuf : String;
2051 URL := Trim(LowerCase(URL));
2056 Result.FFirst := False;
2057 Result.FStBegin := False;
2058 Result.FToEnd := False;
2059 Result.FDone := False;
2060 Result.FNoParam := False;
2064 if URL[length(URL)] = '\' then
2066 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2067 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2068 s := Copy(URL, RStart + RLength - 1, Length(URL));
2070 //
\95W
\8f\80\8f\91\8e®
2071 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2072 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2073 FAWKStr.RegExp := '/test/read.cgi/.+/[0-9]+/?.*';
2074 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2075 s := Copy(s, 15, Length(s));
2077 SList := TStringList.Create;
2080 FAWKStr.RegExp := '/';
2081 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2082 Result.FBBS := SList[1];
2083 Result.FKey := SList[2];
2084 if SList.Count >= 4 then
2088 Result.FNoParam := true;
2094 FAWKStr.LineSeparator := mcls_CRLF;
2095 FAWKStr.RegExp := '-';
2096 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2097 Result.FFirst := True;
2099 FAWKStr.RegExp := 'l[0-9]+';
2100 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2101 Result.FFirst := True;
2103 for i := 0 to SList.Count - 1 do begin
2104 if Trim(SList[i]) = '' then begin
2106 Result.FStBegin := True;
2107 if i = (SList.Count - 1) then
2108 Result.FToEnd := True;
2109 end else if IsNumeric(SList[i]) then begin
2110 wkInt := StrToInt(SList[i]);
2111 wkMax := Max(wkMax, wkInt);
2115 wkMin := Min(wkMin, wkInt);
2116 end else if Trim(SList[i]) = 'n' then begin
2117 Result.FFirst := True;
2119 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2120 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2121 if Copy(SList[i], 1, 1) = 'n' then
2122 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2124 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2125 Result.FFirst := True;
2126 wkMax := Max(wkMax, wkInt);
2130 wkMin := Min(wkMin, wkInt);
2134 if Result.FStBegin and (not Result.FToEnd) then
2136 else if (not Result.FStBegin) and Result.FToEnd then
2138 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2139 Result.FSt := wkMin;
2140 Result.FTo := wkMax;
2142 //Result.FSt := wkMin;
2143 //Result.FTo := wkMax;
2149 Result.FDone := True;
2153 //
\90Vkako
\8f\91\8e®
2154 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2155 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2156 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2157 SList := TStringList.Create;
2160 FAWKStr.RegExp := '/';
2161 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2162 Result.FBBS := SList[1];
2163 Result.FKey := ChangeFileExt(SList[5], '');
2164 Result.FFirst := True;
2170 Result.FDone := True;
2174 //
\8b\8ckako
\8f\91\8e®
2175 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2176 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2177 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2178 SList := TStringList.Create;
2181 FAWKStr.RegExp := '/';
2182 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2183 Result.FBBS := SList[1];
2184 Result.FKey := ChangeFileExt(SList[4], '');
2185 Result.FFirst := True;
2191 Result.FDone := True;
2195 //log
\8by
\82Ñlog2
\8f\91\8e®
2196 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2197 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2198 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2199 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2200 SList := TStringList.Create;
2203 FAWKStr.RegExp := '/';
2204 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2205 Result.FBBS := SList[2];
2206 Result.FKey := ChangeFileExt(SList[5], '');
2207 Result.FFirst := True;
2213 Result.FDone := True;
2218 //
\8b\8cURL
\8f\91\8e®
2219 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2220 FAWKStr.RegExp := '/test/read\.cgi\?';
2221 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2222 s := Copy(s, 16, Length(s));
2223 SList := TStringList.Create;
2226 FAWKStr.RegExp := '&';
2227 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2228 Result.FFirst := True;
2229 for i := 0 to SList.Count - 1 do begin
2230 if Pos('bbs=', SList[i]) = 1 then begin
2231 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2232 end else if Pos('key=', SList[i]) = 1 then begin
2233 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2234 end else if Pos('st=', SList[i]) = 1 then begin
2235 wk := Copy(SList[i], 4, Length(SList[i]));
2236 if IsNumeric(wk) then
2237 Result.FSt := StrToInt(wk)
2238 else if wk = '' then
2239 Result.FStBegin := True;
2240 end else if Pos('to=', SList[i]) = 1 then begin
2241 wk := Copy(SList[i], 4, Length(SList[i]));
2242 if IsNumeric(wk) then
2243 Result.FTo := StrToInt(wk)
2244 else if wk = '' then
2245 Result.FToEnd := True;
2246 end else if Pos('nofirst=', SList[i]) = 1 then begin
2247 Result.FFirst := False;
2256 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2257 Result.FDone := True;
2265 \brief URI
\82ð
\95ª
\89ð
2266 \param URL
\95ª
\89ð
\82·
\82é URI
2267 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2268 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2269 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2270 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2271 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2272 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2274 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2284 URI := TIdURI.Create(URL);
2286 Protocol := URI.Protocol;
2289 Document := URI.Document;
2291 Bookmark := URI.Bookmark;
2298 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2299 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2301 function TGikoSys.GetVersionBuild: Integer;
2303 FixedFileInfo: PVSFixedFileInfo;
2304 VersionHandle, VersionSize: DWORD;
2305 pVersionInfo: Pointer;
2310 AppFile := Application.ExeName;
2311 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2312 if VersionSize = 0 then
2314 GetMem(pVersionInfo, VersionSize);
2316 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2317 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2318 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2320 FreeMem(pVersionInfo, VersionSize);
2325 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2326 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2327 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2329 \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
2330 \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
2331 \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
2332 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2334 \97á(
\90³
\8bK
\89»
\91O):\n
2335 http://
\92\86\97ª/ \n
2336 http://
\92\86\97ª/20-100
2338 (
\90³
\8bK
\89»
\8cã):\n
2339 http://
\92\86\97ª/l50
2341 function TGikoSys.GetBrowsableThreadURL(
2345 threadItem : TThreadItem;
2346 boardPlugIn : TBoardPlugIn;
2351 //=====
\83v
\83\89\83O
\83C
\83\93
2353 for i := Length( BoardGroups ) - 1 downto 1 do begin
2354 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2355 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2356 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2357 if board <> nil then begin
2358 boardPlugIn := BoardGroups[i].BoardPlugIn;
2359 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2360 Result := threadItem.URL;
2369 // 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¢
2372 if Length( Result ) = 0 then
2373 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2378 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2379 \param inURL
\83X
\83\8c\83b
\83h URL
2382 function TGikoSys.GetThreadURL2BoardURL(
2386 threadItem : TThreadItem;
2387 boardPlugIn : TBoardPlugIn;
2392 //=====
\83v
\83\89\83O
\83C
\83\93
2394 for i := Length( BoardGroups ) - 1 downto 1 do begin
2395 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2396 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2397 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2398 boardPlugIn := BoardGroups[i].BoardPlugIn;
2399 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2400 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2408 // 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¢
2411 if Length( Result ) = 0 then
2412 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2417 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2418 \param inURL
\83X
\83\8c\83b
\83h URL
2420 \see TGikoSys.GetThreadURL2BoardURL
2422 function TGikoSys.Get2chThreadURL2BoardURL(
2426 Protocol, Host, Path, Document, Port, Bookmark : string;
2427 BBSID, BBSKey : string;
2431 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2432 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2434 foundPos := Pos( '/test/read.cgi', inURL );
2435 if {(Is2chHost(Host)) and} (foundPos > 0) then
2436 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2438 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2443 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2444 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2445 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2446 \see TGikoSys.GetBrowsableThreadURL
2448 function TGikoSys.Get2chBrowsableThreadURL(
2452 Protocol, Host, Path, Document, Port, Bookmark : string;
2453 BBSID, BBSKey : string;
2457 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2460 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2461 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2462 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2464 if Is2chHost( Host ) then begin
2465 Result := Protocol + '://' + Host +
2466 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2468 if foundPos > 0 then
2469 Result := Copy( inURL, 1, foundPos ) +
2470 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2472 Result := Protocol + '://' + Host +
2473 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2480 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2481 \param inBoard
\94Â URL
2482 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2483 \return
\83X
\83\8c\83b
\83h URL
2485 function TGikoSys.Get2chBoard2ThreadURL(
2493 server := UrlToServer( inBoard.URL );
2494 //if Is2chHost( server ) then
2495 if inBoard.Is2ch then
2496 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2498 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2503 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2505 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2507 procedure TGikoSys.ListBoardFile;
2509 boardFileList : TStringList;
2514 for i := 0 to Length( BBSs ) - 1 do
2518 SetLength( BBSs, 0 );
2521 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2522 if FileExists( GikoSys.GetBoardFileName ) then begin
2523 SetLength( BBSs, l + 1 );
2524 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2525 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2529 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2530 SetLength( BBSs, l + 1 );
2531 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2532 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2536 // Board
\83t
\83H
\83\8b\83_
2537 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2538 BoardFileList := TStringList.Create;
2540 BoardFileList.BeginUpdate;
2541 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*.txt', BoardFileList, True, True );
2542 BoardFileList.EndUpdate;
2543 SetLength( BBSs, l + BoardFileList.Count );
2544 for i := BoardFileList.Count - 1 downto 0 do begin
2545 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2546 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2556 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2557 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2559 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2564 boardFile : TStringList;
2565 CategoryList : TStringList;
2566 BoardList : TStringList;
2567 Category : TCategory;
2571 // RoundItem : TRoundItem;
2573 i, iBound : Integer;
2574 j, jBound : Integer;
2575 k, kBound : Integer;
2578 if not FileExists( bbs.FilePath ) then
2582 ini := TMemIniFile.Create('');
2583 boardFile := TStringList.Create;
2586 boardFile.LoadFromFile( bbs.FilePath );
2588 ini.SetStrings( boardFile );
2589 CategoryList := TStringList.Create;
2590 BoardList := TStringList.Create;
2592 ini.ReadSections( CategoryList );
2594 iBound := CategoryList.Count - 1;
2595 for i := 0 to iBound do begin
2596 ini.ReadSection( CategoryList[i], BoardList );
2597 Category := TCategory.Create;
2598 Category.No := i + 1;
2599 Category.Title := CategoryList[i];
2601 jBound := BoardList.Count - 1;
2602 for j := 0 to jBound do begin
2604 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2605 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2606 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2607 //=====
\83v
\83\89\83O
\83C
\83\93
2609 kBound := Length(BoardGroups) - 1;
2610 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2611 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2612 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2613 if not BoardGroups[k].Find(inistr, p) then begin
2614 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2615 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2616 if not BoardGroups[k].Find(tmpstring, p) then begin
2618 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2619 BoardGroups[k].AddObject(tmpstring, Board);
2620 Category.Add(Board);
2622 //
\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é
2626 Board := TBoard(BoardGroups[k].Objects[p]);
2627 if Board.ParentCategory <> Category then
2628 Category.Add(Board);
2632 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2633 BoardGroups[k].AddObject(tmpstring, Board);
2634 Category.Add(Board);
2636 //
\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é
2641 Board := TBoard(BoardGroups[k].Objects[p]);
2642 if Board.ParentCategory <> Category then
2643 Category.Add(Board);
2650 // 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¢
2653 if (Board = nil) then begin
2654 if not BoardGroups[0].Find(inistr,p) then begin
2655 Board := TBoard.Create( nil, inistr );
2656 BoardGroups[0].AddObject(inistr, Board);
2657 Category.Add(Board);
2659 Board := TBoard(BoardGroups[0].Objects[p]);
2660 if Board.ParentCategory <> Category then
2661 Category.Add(Board);
2665 if (Board.Multiplicity = 0) then begin
2668 Board.Multiplicity := 1;
2669 Board.Title := BoardList[j];
2670 Board.RoundDate := ZERO_DATE;
2675 Board.Multiplicity := Board.Multiplicity + 1;
2680 bbs.Add( Category );
2685 bbs.IsBoardFileRead := True;
2698 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2699 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2701 function TGikoSys.GetUnknownCategory : TCategory;
2703 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2706 if Length( BBSs ) < 2 then begin
2711 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2712 if Result = nil then begin
2713 Result := TCategory.Create;
2714 Result.Title := UNKNOWN_CATEGORY;
2715 BBSs[ 1 ].Add( Result );
2721 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2722 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2724 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2726 category : TCategory;
2728 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2731 category := GetUnknownCategory;
2732 if category = nil then begin
2735 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2736 if Result = nil then begin
2737 Result := TBoard.Create( inPlugIn, inURL );
2738 Result.Title := UNKNOWN_BOARD;
2739 category.Add( Result );
2746 function TGikoSys.GetSambaFileName : string;
2748 Result := Setting.GetSambaFileName;
2752 \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
2753 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2754 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2755 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2756 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2758 function TGikoSys.GetSameIDResAnchor(
2759 const AID : string; ThreadItem: TThreadItem;
2760 limited: Integer):string;
2765 ResLink : TResLinkRec;
2767 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2769 Res.FType := glt2chNew;
2772 if (not IsNoValidID(AID)) and
2773 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2774 body := TStringList.Create;
2776 GetSameIDRes(AID, ThreadItem, body);
2777 if (limited > 0) and (body.Count > limited) then begin
2778 for i := body.Count - limited to body.Count - 1 do begin
2779 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2782 for i := 0 to body.Count - 1 do begin
2783 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2789 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2790 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2791 HTMLCreater.ConvRes(@Res, @ResLink, false);
2792 Result := Res.FBody;
2797 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2798 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2799 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2800 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2802 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2805 ReadList: TStringList;
2807 boardPlugIn : TBoardPlugIn;
2809 if (not IsNoValidID(AID)) and
2810 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2811 //if ThreadItem.IsBoardPlugInAvailable then begin
2812 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2813 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2814 //boardPlugIn := ThreadItem.BoardPlugIn;
2815 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2817 for i := 0 to threadItem.Count - 1 do begin
2819 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2820 if(AnsiPos(AID, Res.FDateTime) > 0) then begin
2821 body.Add(IntToStr(i+1));
2825 ReadList := TStringList.Create;
2827 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2828 for i := 0 to ReadList.Count - 1 do begin
2829 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2830 if AnsiPos(AID, Res.FDateTime) > 0 then begin
2831 body.Add(IntToStr(i+1));
2842 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2843 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2844 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2845 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2848 function TGikoSys.GetSameIDResAnchor(AIDNum : Integer;
2849 ThreadItem: TThreadItem;
2850 limited: Integer):string;
2855 ResLink : TResLinkRec;
2857 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2859 Res.FType := glt2chNew;
2862 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2863 body := TStringList.Create;
2865 GetSameIDRes(AIDNum, ThreadItem, body);
2866 if (limited > 0) and ( body.Count > limited) then begin
2867 for i := body.Count - 20 to body.Count - 1 do begin
2868 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2871 for i := 0 to body.Count - 1 do begin
2872 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2878 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2879 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2880 HTMLCreater.ConvRes(@Res, @ResLink, false);
2881 Result := Res.FBody;
2886 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2887 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2888 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2889 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2891 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2895 AID := GetResID(AIDNum, ThreadItem);
2896 if not IsNoValidID(AID) then begin
2897 GetSameIDRes(AID, ThreadItem, body);
2901 \brief
\93\8a\8de ID
\8eæ
\93¾
2902 \param AIDNum
\93\8a\8de
\83\8c\83X
\94Ô
\8d\86
2903 \param ThreadItem
\93\8a\8de
\83X
\83\8c\83b
\83h
2904 \param body OUT:
\93\8a\8deID
2906 function TGikoSys.GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
2909 boardPlugIn : TBoardPlugIn;
2910 stList: TStringList;
2914 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2915 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2916 //if ThreadItem.IsBoardPlugInAvailable then begin
2917 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2918 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2919 //boardPlugIn := ThreadItem.BoardPlugIn;
2920 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2921 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2923 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2925 Result := Res.FDateTime;
2926 if AnsiPos('id', AnsiLowerCase(Result)) > 0 then begin
2927 Result := Copy(Result, AnsiPos('id', AnsiLowerCase(Result)) - 1, 11);
2928 if AnsiPos(' be:', AnsiLowerCase(Result)) > 0 then begin
2929 Result := Copy(Result, 1, AnsiPos(' BE:', AnsiLowerCase(Result)) - 1)
2932 stlist := TStringList.Create;
2934 stList.DelimitedText := Result;
2936 for i := 0 to stList.Count - 1 do
2937 if Length(WideString(stList[i])) = 8 then begin
2938 if NotDateorTimeString(stList[i]) then begin
2939 Result := stList[i];
2950 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2951 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2952 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2953 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2955 function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer;
2960 if (not IsNoValidID(AID))
2961 and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2962 body := TStringList.Create;
2964 GetSameIDRes(AID, ThreadItem, body);
2965 Result := body.Count;
2974 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2975 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2976 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2977 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2979 function TGikoSys.GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer;
2984 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2985 body := TStringList.Create;
2987 GetSameIDRes(AIDNum, ThreadItem, body);
2988 Result := body.Count;
2996 \brief
\8e\9e\8d\8f\82ð
\8e¦
\82·
\95¶
\8e\9a\97ñ
\82Å
\82Í
\96³
\82¢
\82©
\82Ç
\82¤
\82©
2997 \param AStr
\92²
\82×
\82é
\95¶
\8e\9a\97ñ
2998 \return
\8e\9e\8d\8f\82Å
\82Í
\96³
\82¢
\82È
\82ç True
2999 \todo
\94Û
\92è
\8c`(Not)
\82æ
\82è
\8dm
\92è
\8cn(Is)
3001 function TGikoSys.NotDateorTimeString(const AStr : string): boolean;
3018 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
3019 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3020 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
3022 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
3025 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3026 Bayesian.CountWord( text, wordCount );
3031 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
3032 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3033 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
3034 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
3035 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
3036 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
3037 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
3039 \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
3040 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
3042 \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
3044 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
3047 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3048 Bayesian.Forget( wordCount, isSpam );
3053 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3054 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3055 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3057 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3060 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3061 Bayesian.Learn( wordCount, isSpam );
3066 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3067 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3068 \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)
3069 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3071 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3074 case Setting.SpamFilterAlgorithm of
3075 gsfaNone: Result := 0;
3076 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3077 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3078 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3085 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3086 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3088 [
\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Ì
3089 [
\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
3091 function TGikoSys.SetUserOptionalStyle(): string;
3094 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3095 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3096 if GikoSys.Setting.BrowserFontSize <> 0 then
3097 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3098 if GikoSys.Setting.BrowserFontColor <> -1 then
3099 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3100 if GikoSys.Setting.BrowserBackColor <> -1 then
3101 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3102 case GikoSys.Setting.BrowserFontBold of
3103 -1: Result := Result + 'font-weight:normal;';
3104 1: Result := Result + 'font-weight:bold;';
3106 case GikoSys.Setting.BrowserFontItalic of
3107 -1: Result := Result + 'font-style:normal;';
3108 1: Result := Result + 'font-style:italic;';
3113 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3114 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3115 \param ANum
\83\8c\83X
\94Ô
3116 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3117 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3119 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3122 BNum, BMark : string;
3124 p := AnsiPos('BE:', AnsiUpperCase(AID));
3126 BNum := Copy(AID, p, Length(AID));
3127 AID := Copy(AID, 1, p - 1);
3128 p := AnsiPos('-', BNum);
3130 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3131 BNum := Copy(BNum, 1, p - 1);
3134 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3135 + '" target=_blank>' + BMark + '</a>';
3141 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3142 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3143 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3145 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3147 Translation = '\VarFileInfo\Translation';
3148 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3150 BufSize, HWnd: DWORD;
3151 VerInfoBuf: Pointer;
3153 VerDataLen: Longword;
3156 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3157 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3158 if BufSize <> 0 then begin
3159 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3160 GetMem(VerInfoBuf, BufSize);
3162 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3163 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3164 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3166 if not (VerDataLen > 0) then
3167 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3169 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3170 //
\81¨'\StringFileInfo\027382\FileDescription'
3171 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3172 [IntToHex(Integer(VerData^) and $FFFF, 4),
3173 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3174 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3176 if VerDataLen > 0 then begin
3177 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3179 SetLength(result, VerDataLen);
3180 StrLCopy(PChar(result), VerData, VerDataLen);
3184 FreeMem(VerInfoBuf);
3190 \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
3191 \return 1
\8ds1plugin
3193 function TGikoSys.GetPluginsInfo(): String;
3196 major, minor, revision : Cardinal;
3197 agent, release : String;
3199 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3202 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3203 for i := 0 to Length(BoardGroups) - 1 do begin
3204 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3205 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3206 if BoardGroups[i].BoardPlugIn <> nil then begin
3207 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3210 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3212 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3218 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3219 function TGikoSys.GetIEVersion: string;
3223 R := TRegistry.Create;
3225 //
\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¢
3226 R.Access := KEY_EXECUTE;
3227 R.RootKey := HKEY_LOCAL_MACHINE;
3228 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3230 Result := R.ReadString('version');
3232 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3239 //! 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¼
3240 function TGikoSys.GetMainKeyFileName : String;
3242 Result := Setting.GetMainKeyFileName;
3244 //! 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¼
3245 function TGikoSys.GetEditorKeyFileName: String;
3247 Result := Setting.GetEditorKeyFileName;
3249 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3250 function TGikoSys.GetInputAssistFileName: String;
3252 Result := Setting.GetInputAssistFileName;
3254 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3255 procedure TGikoSys.SetGikoMessage;
3257 if FGikoMessage = nil then begin
3258 FGikoMessage := TGikoMessage.Create;
3263 if (Setting.GengoSupport) then begin
3265 if (FileExists(Setting.GetLanguageFileName)) then begin
3266 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3273 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3274 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3277 if FGikoMessage <> nil then begin
3278 Result := FGikoMessage.GetMessage(MesType);
3282 //Tue, 17 Dec 2002 12:18:07 GMT
\81¨ TDateTime
\82Ö
3283 //MonaUtils
\82©
\82ç
\88Ú
\93®
3284 function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime;
3285 function StrMonthToMonth(const s: string): integer;
3287 m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
3292 for i := Low(m) to High(m) do begin
3293 if (SameText(s, m[i])) then begin
3300 wDay, wMonth, wYear: word;
3301 wHour, wMinute, wSecond: word;
3305 wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0);
3306 wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2));
3307 wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0);
3308 sTime := ChooseString(DateStr, ' ', 4);
3309 wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0);
3310 wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0);
3311 wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0);
3312 d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0);
3315 //MonaUtils
\82©
\82ç
\88Ú
\93®
3316 //!
\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·
3317 function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string;
3323 for i := 0 to Index - 1 do begin
3324 if (AnsiPos(Separator, S) = 0) then S := ''
3325 else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S));
3327 p := AnsiPos(Separator, S);
3328 if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S;
3330 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
3331 procedure TGikoSys.RestoreThreadData(Board : TBoard);
3333 SECTION = 'Setting';
3335 TmpFileList : TStringList;
3338 ThreadItem : TThreadItem;
3339 Boardpath, tmpStr : string;
3341 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
3343 TmpFileList := TStringList.Create;
3344 TmpFileList.Sorted := True;
3345 TmpFileList.BeginUpdate;
3347 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
3348 GetFileList(Boardpath, '*.tmp', TmpFileList, False);
3349 TmpFileList.EndUpdate;
3350 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
3351 for i := TmpFileList.Count - 1 downto 0 do begin
3352 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
3353 if ThreadItem <> nil then begin
3354 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
3356 tmpStr := ini.ReadString(SECTION, 'RoundDate', DateTimeToStr(ZERO_DATE));
3357 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
3359 tmpStr := ini.ReadString(SECTION, 'LastModified', DateTimeToStr(ZERO_DATE));
3360 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
3361 ThreadItem.Count := ini.ReadInteger(SECTION, 'Count', 0);
3362 ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
3364 ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
3365 ThreadItem.IsLogFile := FileExists(ThreadItem.GetThreadFileName);
3366 if(ThreadItem.Size = 0) and (ThreadItem.IsLogFile) then begin
3368 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
3373 //
\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ã
3374 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
3375 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
3376 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
3377 ThreadItem.ScrollTop := ini.ReadInteger(SECTION, 'ScrollTop', 0);
3378 ThreadItem.AllResCount := ini.ReadInteger(SECTION, 'AllResCount', ThreadItem.Count);
3379 ThreadItem.NewResCount := ini.ReadInteger(SECTION, 'NewResCount', 0);
3380 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger(SECTION, 'AgeSage', Ord(gasNone)));
3384 DeleteFile(Boardpath + TmpFileList[i]);
3393 \brief User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
3394 \return Boolean
\97\98\97p
\82Å
\82«
\82é
\8fê
\8d\87\82ÍTrue
3396 function TGikoSys.CanUser32DLL: Boolean;
3404 hUser32 := LoadLibrary('User32.dll');
3405 if hUser32 <> 0 then begin
3412 FreeLibrary(hUser32);
3416 \brief OE
\88ø
\97p
\95\84\8eæ
\93¾
3417 \return OE
\82Ì
\88ø
\97p
\95\84\81i
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87\82Í'>')
3419 function TGikoSys.GetOEIndentChar : string;
3422 Identities : string;
3425 DEFAULT_CHAR = '> ';
3426 OE_MAIL_PATH = '\Software\Microsoft\Outlook Express\5.0\Mail';
3427 INDENT_CHAR = 'Indent Char';
3430 Result := DEFAULT_CHAR;
3431 regKey := TRegistry.Create;
3434 regKey.RootKey := HKEY_CURRENT_USER;
3435 if not regKey.OpenKey( 'Identities', False ) then
3437 Identities := regKey.ReadString( 'Default User ID' );
3438 if Identities = '' then
3440 if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then
3442 IndentChar := regKey.ReadInteger( INDENT_CHAR );
3443 Result := Char( IndentChar ) + ' ';
3451 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3452 function TGikoSys.GetReplaceFileName: String;
3454 Result := Setting.GetReplaceFileName;
3456 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
3457 function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime;
3462 //
\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
3463 tmp := ChangeFileExt(FileName, '');
3464 if AnsiPos('_', tmp) <> 0 then
3465 if AnsiPos('_', tmp) > 9 then
3466 tmp := Copy(tmp, 1, AnsiPos('_', tmp)-1)
3468 Delete(tmp, AnsiPos('_', tmp), 1);
3470 if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
3471 Insert('1', tmp, 1);
3473 unixtime := StrToInt64Def(tmp, ZERO_DATE);
3474 Result := UnixToDateTime(unixtime) + OffsetFromUTC;
3478 GikoSys := TGikoSys.Create;
3481 if GikoSys <> nil then begin