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;
310 FSetting := TSetting.Create;
311 FDolib := TDolib.Create;
312 FAWKStr := TAWKStr.Create(nil);
313 if DirectoryExists(GetConfigDir) = false then begin
314 CreateDir(GetConfigDir);
316 FAbon := TAbon.Create;
317 FAbon.IgnoreKana := FSetting.IgnoreKana;
318 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
320 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
321 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
322 FAbon.DeleteSyria := FSetting.DeleteSyria;
323 FAbon.Deleterlo := FSetting.AbonDeleterlo;
324 FAbon.Replaceul := FSetting.AbonReplaceul;
325 FAbon.AbonPopupRes := FSetting.PopUpAbon;
327 FSelectResFilter := TAbon.Create;
328 FSelectResFilter.IgnoreKana := True;
329 //
\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
330 FSelectResFilter.AbonString := '';
332 ResRange := FSetting.ResRange;
333 FVersion := Trim(GetVersionInfo(vrFileVersion));
334 FBayesian := TGikoBayesian.Create;
335 //FBoardURLList := TStringList.Create;
336 //
\83\81\83b
\83Z
\81[
\83W
\82Ì
\8dì
\90¬
337 FGikoMessage := TGikoMessage.Create;
340 // *************************************************************************
341 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
342 // *************************************************************************
343 destructor TGikoSys.Destroy;
346 FileList: TStringList;
348 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
349 FileList := TStringList.Create;
351 FileList.BeginUpdate;
352 GetFileList(GetTempFolder, '*.html', FileList, False, True);
354 for i := 0 to FileList.Count - 1 do begin
355 DeleteFile(FileList[i]);
360 FreeAndNil(FGikoMessage);
361 FreeAndNil(FBayesian);
362 FreeAndNil(FSelectResFilter);
366 FreeAndNil(FSetting);
371 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
372 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
373 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
376 function TGikoSys.IsNumeric(s: string): boolean;
387 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
388 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
389 \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
391 function TGikoSys.IsFloat(s: string): boolean;
395 Result := TextToFloat(PChar(s), v, fvExtended);
398 // *************************************************************************
399 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
400 // *************************************************************************
401 function TGikoSys.GetBoardFileName: string;
403 Result := Setting.GetBoardFileName;
406 // *************************************************************************
407 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
408 // *************************************************************************
409 function TGikoSys.GetCustomBoardFileName: string;
411 Result := Setting.GetCustomBoardFileName;
414 // *************************************************************************
415 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
416 // *************************************************************************
417 function TGikoSys.GetHtmlTempFileName: string;
419 Result := Setting.GetHtmlTempFileName;
423 // *************************************************************************
424 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
425 // *************************************************************************
426 function TGikoSys.GetAppDir: string;
428 Result := Setting.GetAppDir;
431 // *************************************************************************
432 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
433 // *************************************************************************
434 function TGikoSys.GetTempFolder: string;
436 Result := Setting.GetTempFolder;
439 // *************************************************************************
440 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
441 // *************************************************************************)
442 function TGikoSys.GetSentFileName: string;
444 Result := Setting.GetSentFileName;
447 // *************************************************************************
448 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
449 // *************************************************************************
450 function TGikoSys.GetOutBoxFileName: string;
452 Result := Setting.GetOutBoxFileName;
455 // *************************************************************************
456 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
457 // *************************************************************************
458 function TGikoSys.GetConfigDir: string;
460 Result := Setting.GetConfigDir;
463 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
464 function TGikoSys.GetStyleSheetDir: string;
466 Result := Setting.GetStyleSheetDir;
469 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
470 function TGikoSys.GetSkinDir: string;
472 Result := Setting.GetSkinDir;
475 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
476 function TGikoSys.GetSkinHeaderFileName: string;
478 Result := Setting.SkinFiles.GetSkinHeaderFileName;
481 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
482 function TGikoSys.GetSkinFooterFileName: string;
484 Result := Setting.SkinFiles.GetSkinFooterFileName;
487 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
488 function TGikoSys.GetSkinNewResFileName: string;
490 Result := Setting.SkinFiles.GetSkinNewResFileName;
493 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
494 function TGikoSys.GetSkinResFileName: string;
496 Result := Setting.SkinFiles.GetSkinResFileName;
499 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
500 function TGikoSys.GetSkinBookmarkFileName: string;
502 Result := Setting.SkinFiles.GetSkinBookmarkFileName;
505 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
506 function TGikoSys.GetSkinNewmarkFileName: string;
508 Result := Setting.SkinFiles.GetSkinNewmarkFileName;
511 //! UserAgent
\8eæ
\93¾
512 function TGikoSys.GetUserAgent: string;
514 if Dolib.Connected then begin
515 Result := Format('%s %s/%s%d/%s', [
522 Result := Format('%s/%s %s/%s%d/%s', [
533 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
534 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
535 \return val
\82ð
\8e¦
\82· TDateTime
537 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
539 Result := ZERO_DATE + val / 86400.0;
543 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
544 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
545 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
547 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
549 Result := Trunc((ADate - ZERO_DATE) * 86400);
554 \brief Subject
\83t
\83@
\83C
\83\8bRead
555 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
557 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
559 ThreadItem: TThreadItem;
561 FileList: TStringList;
570 datFileCheck: Boolean;
572 FavoThreadItem : TFavoriteThreadItem;
582 if Board.IsThreadDatRead then
586 usePlugIn := Board.IsBoardPlugInAvailable;
587 //server := UrlToServer( Board.URL );
588 //
\83X
\83\8c\83b
\83h
\82Å
\8b¤
\92Ê
\82ÌURL
\95\94
589 if Board.is2ch then begin
590 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi/' + Board.BBSID + '/';
592 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi?bbs=' + Board.BBSID + '&key=';
595 FileName := Board.GetFolderIndexFileName;
598 datFileCheck := (Setting.CheckDatFile) or (not FileExists(FileName));
599 if (datFileCheck) then begin
600 FileList := TStringList.Create;
601 FileList.Sorted := True;
602 FileList.BeginUpdate;
603 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
604 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
608 //
\8fd
\95¡
\82ð
\96h
\82®
610 Board.Sorted := True;
611 sl := TStringList.Create;
613 if FileExists(FileName) then begin
614 sl.LoadFromFile(FileName);
615 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
616 for i := sl.Count - 1 downto 1 do begin
617 Rec := ParseIndexLine(sl[i]);
618 if (datFileCheck) then begin
619 islog := FileList.Find( Rec.FFileName, Index );
621 islog := (Rec.FSize <> 0) and (Rec.FCount <> 0);
624 ThreadItem := TThreadItem.Create(
627 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
629 if Board.is2ch then begin
630 ThreadItem := TThreadItem.Create(
633 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
638 ThreadItem := TThreadItem.Create(
641 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
648 ThreadItem.BeginUpdate;
649 if (datFileCheck) and (islog) then
650 FileList.Delete( Index );
652 ThreadItem.No := Rec.FNo;
653 ThreadItem.FileName := Rec.FFileName;
654 ThreadItem.Title := MojuUtils.UnSanitize(Rec.FTitle);
655 ThreadItem.Count := Rec.FCount;
656 ThreadItem.Size := Rec.FSize;
657 ThreadItem.RoundDate := Rec.FRoundDate;
658 ThreadItem.LastModified := Rec.FLastModified;
659 ThreadItem.Kokomade := Rec.FKokomade;
660 ThreadItem.NewReceive := Rec.FNewReceive;
661 ThreadItem.UnRead := Rec.FUnRead;
662 ThreadItem.ScrollTop := Rec.FScrollTop;
663 ThreadItem.AllResCount := Rec.FAllResCount;
664 ThreadItem.NewResCount := Rec.FNewResCount;
665 ThreadItem.AgeSage := Rec.FAgeSage;
666 ThreadItem.ParentBoard := Board;
667 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
669 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
670 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
673 ThreadItem.EndUpdate;
674 Board.Add(ThreadItem);
676 if (ThreadItem.UnRead) and (ThreadItem.IsLogFile) then
681 if UnRead <> Board.UnRead then
682 Board.UnRead := UnRead;
684 if (datFileCheck) then begin
685 //
\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
686 AddOutofIndexDat(Board, FileList);
690 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
691 RestoreThreadData( Board );
694 if (datFileCheck) then begin
697 Board.Sorted := False;
699 Board.IsThreadDatRead := True;
701 rt := GetTickCount - st;
702 Writeln('Read Done.' + IntToStr(rt) + ' ms');
706 \brief
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
707 \param Board
\92Ç
\89Á
\82·
\82é
\94Â
708 \param DatList dat
\83t
\83@
\83C
\83\8b\96¼
710 procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: Boolean = True);
713 Boardpath,FileName : String;
715 ThreadItem: TThreadItem;
719 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
720 //
\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
721 for i := 0 to DatList.Count - 1 do begin
722 FileName := Boardpath + DatList[i];
724 if (not AllCreate) then begin
726 ThreadItem := Board.FindThreadFromFileName(DatList[i]);
727 if (ThreadItem = nil) then begin
730 if Board.IsBoardPlugInAvailable then begin
731 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
733 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
737 if (ThreadItem = nil) then begin
738 if Board.IsBoardPlugInAvailable then begin
739 ThreadItem := TThreadItem.Create(
742 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
743 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
745 ThreadItem := TThreadItem.Create(
748 Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
749 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
754 ThreadItem.BeginUpdate;
755 ThreadItem.FileName := DatList[i];
756 //ThreadItem.FilePath := FileName;
757 ThreadItem.No := Board.Count + 1;
758 ThreadItem.Title := ResRec.FTitle;
759 ThreadItem.Count := GetFileLineCount(FileName);
760 ThreadItem.AllResCount := ThreadItem.Count;
761 ThreadItem.NewResCount := ThreadItem.Count;
762 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é
763 ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) );
764 ThreadItem.LastModified := ThreadItem.RoundDate;
765 ThreadItem.Kokomade := -1;
766 ThreadItem.NewReceive := 0;
767 ThreadItem.ParentBoard := Board;
768 ThreadItem.IsLogFile := True;
769 ThreadItem.Round := False;
770 ThreadItem.UnRead := False;
771 ThreadItem.ScrollTop := 0;
772 ThreadItem.AgeSage := gasNone;
773 ThreadItem.EndUpdate;
774 if (AllCreate) or (create) then begin
775 Board.Add(ThreadItem);
780 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
781 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
783 procedure TGikoSys.CreateThreadDat(Board: TBoard);
787 SubjectList: TStringList;
793 if not FileExists(Board.GetSubjectFileName) then Exit;
794 FileName := Board.GetFolderIndexFileName;
796 SubjectList := TStringList.Create;
798 SubjectList.LoadFromFile(Board.GetSubjectFileName);
799 sl := TStringList.Create;
803 sl.Add(FOLDER_INDEX_VERSION);
804 for i := 0 to SubjectList.Count - 1 do begin
805 Rec := DivideSubject(SubjectList[i]);
807 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
810 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
811 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
812 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
813 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
814 + Format('%x', [0]) + #1 //size
815 + Format('%x', [0]) + #1 //RoundDate
816 + Format('%x', [0]) + #1 //LastModified
817 + Format('%x', [0]) + #1 //Kokomade
818 + Format('%x', [0]) + #1 //NewReceive
819 + '0' + #1 //
\96¢
\8eg
\97p
820 + Format('%x', [0]) + #1 //UnRead
821 + Format('%x', [0]) + #1 //ScrollTop
822 + Format('%x', [Rec.FCount]) + #1 //AllResCount
823 + Format('%x', [0]) + #1 //NewResCount
824 + Format('%x', [0]); //AgeSage
826 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
827 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
829 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
830 MojuUtils.Sanitize(Rec.FTitle), //
\83^
\83C
\83g
\83\8b
831 Rec.FCount, //
\83J
\83E
\83\93\83g
840 Rec.FCount, //AllResCount
849 sl.SaveToFile(FileName);
859 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
860 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
862 procedure TGikoSys.WriteThreadDat(Board: TBoard);
864 // Values: array[Boolean] of string = ('0', '1');
870 TmpFileList: TStringList;
872 if not Board.IsThreadDatRead then
874 FileName := Board.GetFolderIndexFileName;
875 ForceDirectoriesEx( ExtractFilePath( FileName ) );
877 sl := TStringList.Create;
878 TmpFileList := TStringList.Create;
879 TmpFileList.Sorted := true;
881 TmpFileList.BeginUpdate;
882 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
883 TmpFileList.EndUpdate;
885 sl.Add(FOLDER_INDEX_VERSION);
887 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
888 Sort.SetSortNoFlag(true);
889 Sort.SetSortOrder(true);
890 Sort.SetSortIndex(0);
891 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
892 Board.CustomSort(ThreadItemSortProc);
894 for i := 0 to Board.Count - 1 do begin
895 Board.Items[i].No := i + 1;
896 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
897 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
898 [Board.Items[i].No, //
\94Ô
\8d\86
899 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
900 MojuUtils.Sanitize(Board.Items[i].Title), //
\83^
\83C
\83g
\83\8b
901 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
902 Board.Items[i].Size, //size
903 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
904 DateTimeToInt(Board.Items[i].LastModified), //LastModified
905 Board.Items[i].Kokomade, //Kokomade
906 Board.Items[i].NewReceive, //NewReceive
908 BoolToInt(Board.Items[i].UnRead), //UnRead
909 Board.Items[i].ScrollTop, //ScrollTop
910 Board.Items[i].AllResCount, //AllResCount
911 Board.Items[i].NewResCount, //NewResCount
912 Ord(Board.Items[i].AgeSage)] //AgeSage
918 sl.SaveToFile(FileName);
920 for i := 0 to TmpFileList.Count - 1 do begin
921 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
931 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
932 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
933 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
935 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
937 Result.FNo := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
938 Result.FFileName := MojuUtils.RemoveToken(Line, #1);
939 Result.FTitle := MojuUtils.UnSanitize(MojuUtils.RemoveToken(Line, #1));
940 Result.FCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
941 Result.FSize := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
942 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
943 Result.FLastModified := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
944 Result.FKokomade := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), -1);
945 Result.FNewReceive := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
946 RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
947 Result.FUnRead := IntToBool(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
948 Result.FScrollTop := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
949 Result.FAllResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
950 Result.FNewResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
951 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
956 \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é
957 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
958 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
959 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
960 \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
961 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
963 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
964 \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
968 GetFileList('c:\', '*.txt', list, True, True);
971 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
974 SearchRec : TSearchRec;
977 Path := IncludeTrailingPathDelimiter(Path);
978 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
980 while rc = 0 do begin
981 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
982 s := Path + SearchRec.Name;
984 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
988 List.Add(SearchRec.Name);
989 if SubDir and (SearchRec.Attr and faDirectory > 0) then
990 GetFileList(s, Mask, List, True, IsPathAdd);
992 rc := FindNext(SearchRec);
995 SysUtils.FindClose(SearchRec);
1001 \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
1002 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
1003 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1004 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
1005 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1006 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
1007 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
1010 GetFileList('c:\', '*.txt', list, True);
1013 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
1016 SearchRec : TSearchRec;
1018 Path := IncludeTrailingPathDelimiter(Path);
1019 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
1021 while rc = 0 do begin
1022 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1023 if (SearchRec.Attr and faDirectory = 0) then begin
1024 if IsPathAdd then begin
1025 List.Add(Path + SearchRec.Name)
1027 List.Add(SearchRec.Name);
1031 rc := FindNext(SearchRec);
1034 SysUtils.FindClose(SearchRec);
1040 \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é
1041 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1042 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1043 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1044 \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
1046 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1047 \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
1051 GetDirectoryList('c:\', '*.txt', list, True);
1054 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1057 SearchRec : TSearchRec;
1060 Path := IncludeTrailingPathDelimiter(Path);
1061 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1063 while rc = 0 do begin
1064 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1065 s := Path + SearchRec.Name;
1066 //if (SearchRec.Attr and faDirectory > 0) then
1067 // s := IncludeTrailingPathDelimiter(s)
1069 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1070 List.Add( IncludeTrailingPathDelimiter( s ) );
1071 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1072 GetDirectoryList(s, Mask, List, True);
1074 rc := FindNext(SearchRec);
1077 SysUtils.FindClose(SearchRec);
1083 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1084 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1085 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1087 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1097 if AnsiPos('<>', Line) = 0 then
1101 Result.FFileName := RemoveToken(Line, Delim);
1102 Result.FTitle := Trim(RemoveToken(Line, Delim));
1104 ws := Result.FTitle;
1105 if Copy(ws, Length(ws), 1) = ')' then begin
1108 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1111 end else if Copy(ws, Length(ws), 1) = '>' then begin
1115 for i := Length(ws) - 1 downto 1 do begin
1116 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1117 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1118 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1119 if IsNumeric(ws) then
1120 Result.FCount := StrToInt(ws);
1121 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1128 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1129 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1132 function TGikoSys.UrlToID(url: string): string;
1139 if url = '' then Exit;
1141 url := Copy(url, 0, Length(url) - 1);
1142 for i := Length(url) downto 0 do begin
1143 if url[i] = '/' then begin
1144 Result := Copy(url, i + 1, Length(url));
1154 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1155 \param url
\89ð
\8eß
\82·
\82é URL
1156 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1158 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1160 function TGikoSys.UrlToServer(url: string): string;
1167 wsURL := Trim(wsURL);
1169 if wsURL = '' then exit;
1171 if Copy(wsURL, Length(wsURL), 1) = '/' then
1172 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1174 for i := Length(wsURL) downto 0 do begin
1175 if wsURL[i] = '/' then begin
1176 Result := Copy(wsURL, 0, i);
1183 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1184 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1185 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1187 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1191 Code := GetFileAttributes(PChar(Name));
1192 Result := (Code <> Cardinal(-1)) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1196 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1197 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1198 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1200 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1203 if Length(Dir) = 0 then
1204 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1205 Dir := ExcludeTrailingPathDelimiter(Dir);
1206 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1207 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1208 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1212 \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
1213 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1214 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1215 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1216 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1217 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1218 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1220 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1224 Result := StrTokNext(sep, Rec);
1228 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1229 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1230 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1231 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1232 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1233 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1235 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1242 if Len >= Pos then begin
1243 while (Pos <= Len) and (Str[Pos] in sep) do begin
1247 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1248 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1253 Result := Copy(Str, I, Pos - I);
1254 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1262 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1263 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1264 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1266 function TGikoSys.GetFileSize(FileName : string): longint;
1271 if not FileExists(FileName) then begin
1275 Assign(F, FileName);
1277 Result := FileSize(F);
1285 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1286 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1288 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1290 function TGikoSys.GetFileLineCount(FileName : string): longint;
1294 sl := TStringList.Create;
1297 sl.LoadFromFile(FileName);
1309 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1310 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1311 \param Line
\8ew
\92è
\8ds
1312 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1313 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1315 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1317 fileTmp : TStringList;
1320 if FileExists(FileName) then begin
1321 fileTmp := TStringList.Create;
1324 fileTmp.LoadFromFile( FileName );
1325 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1326 Result := fileTmp.Strings[ Line-1 ];
1329 //on EFOpenError do Result := '';
1338 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1339 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1341 procedure TGikoSys.MenuFont(Font: TFont);
1344 nm: NONCLIENTMETRICS;
1346 nm.cbSize := sizeof(NONCLIENTMETRICS);
1347 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1348 lf := nm.lfMenuFont;
1349 Font.Name := lf.lfFaceName;
1350 Font.Height := lf.lfHeight;
1352 if lf.lfWeight >= 700 then
1353 Font.Style := Font.Style + [fsBold];
1354 if lf.lfItalic = 1 then
1355 Font.Style := Font.Style + [fsItalic];
1359 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1360 \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ñ
1361 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1362 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1364 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1366 function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1370 p := AnsiPos(delimiter, s);
1374 Result := Copy(s, 1, p - 1);
1375 Delete(s, 1, Length(Result) + Length(delimiter));
1380 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1381 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1382 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1383 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1385 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1387 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1392 for i := 0 to index do
1393 Result := RemoveToken(s, delimiter);
1397 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1398 {procedure TGikoSys.FlashExitWrite;
1402 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1403 for i := 0 to FExitWrite.Count - 1 do
1404 WriteThreadDat(FExitWrite[i]);
1409 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1410 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1411 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1412 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1416 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1418 ERASECHAR : array [1..39] of string =
1419 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1420 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1421 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1422 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1424 Chr : array [0..255] of char;
1428 s := Trim(LongName);
1429 if (Length(s) <= ALength) then begin
1433 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1434 S := CustomStringReplace(S, ERASECHAR[i], '');
1436 if (Length(S) <= ALength) then begin
1439 Windows.LCMapString(
1440 GetUserDefaultLCID(),
1448 S := Copy(S,1,ALength);
1450 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1451 S := Copy(S, 1, Length(S) - 1);
1462 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1463 \return False..0, True..1
1465 function TGikoSys.BoolToInt(b: Boolean): Integer;
1467 Result := IfThen(b, 1, 0);
1471 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1472 \return 1..True, other..False
1473 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1474 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1476 function TGikoSys.IntToBool(i: Integer): Boolean;
1482 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1483 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1484 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1485 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1487 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1491 GZipStream: TGzipDecompressStream;
1492 TextStream: TStringStream;
1493 buf: array[0..BUF_SIZE - 1] of Byte;
1499 TextStream := TStringStream.Create('');
1501 //
\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¢)
1502 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1503 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1504 ResStream.Position := 0;
1505 GZipStream := TGzipDecompressStream.Create(TextStream);
1508 FillChar(buf, BUF_SIZE, 0);
1509 cnt := ResStream.Read(buf, BUF_SIZE);
1511 GZipStream.Write(buf, BUF_SIZE);
1517 ResStream.Position := 0;
1519 FillChar(buf, BUF_SIZE, 0);
1520 cnt := ResStream.Read(buf, BUF_SIZE);
1522 TextStream.Write(buf, BUF_SIZE);
1526 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1527 s := TextStream.DataString;
1530 while (i > 0) and (s[i] = #0) do
1532 Delete(s, i + 1, ln - i);
1535 while i <> 0 do begin
1547 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1548 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1549 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1551 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1553 STD_SEC = 'KeySetting';
1559 SecList: TStringList;
1560 Component: TComponent;
1562 if not FileExists(fileName) then
1564 SecList := TStringList.Create;
1565 ini := TMemIniFile.Create(fileName);
1567 ini.ReadSection(STD_SEC, SecList);
1568 for i := 0 to SecList.Count - 1 do begin
1569 ActionName := SecList[i];
1570 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1571 if ActionKey <> -1 then begin
1572 Component := ActionList.Owner.FindComponent(ActionName);
1573 if TObject(Component) is TAction then begin
1574 TAction(Component).ShortCut := ActionKey;
1585 \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¶
1586 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1587 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1589 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
1591 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1593 STD_SEC = 'KeySetting';
1598 ini := TMemIniFile.Create(GetConfigDir + FileName);
1600 for i := 0 to ActionList.ActionCount - 1 do begin
1601 if ActionList.Actions[i].Tag = -1 then
1603 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1613 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1614 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1615 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1617 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1619 PI: TProcessInformation;
1623 Path := '"' + AppPath + '"';
1625 Path := Path + ' ' + Param;
1627 SI.Cb := SizeOf(Si);
1628 SI.lpReserved := nil;
1629 SI.lpDesktop := nil;
1632 SI.cbReserved2 := 0;
1633 SI.lpReserved2 := nil;
1635 Windows.CreateProcess(nil,
1648 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1649 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1650 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1652 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1656 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1657 gbtUserApp, gbtAuto:
1658 if (Setting.URLApp) and (FileExists(Setting.URLAppFile)) then
1659 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1661 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1666 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1667 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1668 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1670 function TGikoSys.HTMLDecode(const AStr: String): String;
1672 Sp, Rp, Cp, Tp: PChar;
1677 SetLength(Result, Length(AStr));
1679 Rp := PChar(Result);
1682 while Sp^ <> #0 do begin
1688 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1694 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1698 while (Sp^ <> ';') and (Sp^ <> #0) do
1705 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1713 Num := IsNumeric(Copy(Tp, 1, 1));
1714 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1715 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1719 SetString(S, Tp, Sp - Tp);
1724 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1725 //[Cp^ + Sp^, Cp - PChar(AStr)])
1735 // on E:EConvertError do
1736 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1737 // [Cp^ + Sp^, Cp - PChar(AStr)])
1739 SetLength(Result, Rp - PChar(Result));
1743 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1744 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1745 \return
\8eæ
\93¾
\82µ
\82½ URL
1747 function TGikoSys.GetHRefText(s: string): string;
1757 Index := AnsiPos('href', LowerCase(s));
1760 s := Trim(Copy(s, Index + 4, Length(s)));
1761 s := Trim(Copy(s, 2, Length(s)));
1763 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1764 //if Copy(s, 1, 1) = '"' then begin
1765 if s[1] = '"' then begin
1766 s := Trim(Copy(s, 2, Length(s)));
1769 Index := AnsiPos('"', s);
1770 if Index <> 0 then begin
1771 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1772 s := Copy(s, 1, Index - 1);
1774 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1775 Index := AnsiPos(' ', s);
1776 Index2 := AnsiPos('>', s);
1779 if Index > Index2 then
1782 s := Copy(s, 1, Index - 1)
1784 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1791 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1792 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1793 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1795 function TGikoSys.Is2chHost(Host: string): Boolean;
1797 HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
1803 if RightStr( Host, 1 ) = '/' then
1804 Host := Copy( Host, 1, Length( Host ) - 1 );
1805 OutputDebugString(pchar(HOST_NAME[0]));
1806 for i := 0 to Length(HOST_NAME) - 1 do begin
1807 // Len := Length(HOST_NAME[i]);
1808 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1809 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1817 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1818 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1819 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1820 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1821 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1822 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1823 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1825 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1835 Index := AnsiPos(READ_PATH, path);
1836 if Index <> 0 then begin
1837 s := Copy(path, Index + Length(READ_PATH), Length(path));
1839 if (Length(s) > 0) and (s[1] = '/') then
1841 BBSID := GetTokenIndex(s, '/', 0);
1842 BBSKey := GetTokenIndex(s, '/', 1);
1845 Result := (BBSID <> '') or (BBSKey <> '');
1848 Index := AnsiPos(KAKO_PATH, path);
1849 if Index <> 0 then begin
1850 s := Copy(path, 2, Length(path));
1851 BBSID := GetTokenIndex(s, '/', 0);
1852 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1853 BBSID := GetTokenIndex(s, '/', 1);
1854 BBSKey := ChangeFileExt(Document, '');
1855 Result := (BBSID <> '') or (BBSKey <> '');
1858 Index := AnsiPos('read.cgi?', URL);
1859 if Index <> 0 then begin
1860 SList := TStringList.Create;
1863 // s := HTMLDecode(Document);
1864 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1865 BBSID := SList.Values['bbs'];
1866 BBSKey := SList.Values['key'];
1867 Result := (BBSID <> '') or (BBSKey <> '');
1879 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1880 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1881 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1882 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1884 http://2ch.net/
\92\86\97ª/32-50 \n
1885 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1887 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1894 URL := Trim(LowerCase(URL));
1895 if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
1899 buf := Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 );
1901 stRes := StrToInt64( buf );
1902 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1903 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
1905 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, Length( URL ) - AnsiPos('&to=', URL ) - 4 + 1 );
1908 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1909 buf := Copy( buf, 1, ps );
1913 endRes := StrToInt64(buf)
1920 if (stRes <> 0) and (endRes = 0) then
1921 endRes := stRes + MAX_POPUP_RES
1922 else if (stRes = 0) and (endRes <> 0) then begin
1923 stRes := endRes - MAX_POPUP_RES;
1927 GikoSys.GetBrowsableThreadURL( URL );
1928 end else if( AnsiPos('&res=', URL ) <> 0 ) then begin
1930 buf := Copy( URL, AnsiPos('&res=', URL ) + 5, Length( URL ) - AnsiPos('&res=', URL ) - 5 + 1 );
1933 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1934 buf := Copy( buf, 1, ps );
1937 stRes := StrToInt(buf)
1944 end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
1946 stRes := StrToInt64( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
1947 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1948 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, AnsiPos( '&nofirst=',URL) - AnsiPos('&end=', URL ) - 5);
1950 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, Length( URL ) - AnsiPos('&to=', URL ) - 5 + 1 );
1953 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1954 buf := Copy( buf, 1, ps );
1958 endRes := StrToInt64(buf);
1965 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
1966 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
1967 if Length(buf) > 0 then begin
1968 if AnsiPos('-', buf) = 1 then begin
1973 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1975 convBuf := Copy( buf, 1, ps );
1976 if convBuf <> '' then
1977 endRes := StrToInt64(convBuf)
1983 if endRes <> 0 then begin
1984 stRes := endRes - MAX_POPUP_RES;
1991 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1993 convBuf := Copy( buf, 1, ps );
1994 if convBuf <> '' then begin
1995 stRes := StrToInt64(convBuf);
1999 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2001 convBuf := Copy( buf, 1, ps );
2002 if convBuf <> '' then
2003 endRes := StrToInt64(convBuf)
2025 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2026 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2027 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2029 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2034 // convBuf : String;
2045 URL := Trim(LowerCase(URL));
2050 Result.FFirst := False;
2051 Result.FStBegin := False;
2052 Result.FToEnd := False;
2053 Result.FDone := False;
2054 Result.FNoParam := False;
2058 if URL[length(URL)] = '\' then
2060 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2061 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2062 s := Copy(URL, RStart + RLength - 1, Length(URL));
2064 //
\95W
\8f\80\8f\91\8e®
2065 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2066 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2067 FAWKStr.RegExp := '/test/read.cgi/.+/[0-9]+/?.*';
2068 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2069 s := Copy(s, 15, Length(s));
2071 SList := TStringList.Create;
2074 FAWKStr.RegExp := '/';
2075 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2076 Result.FBBS := SList[1];
2077 Result.FKey := SList[2];
2078 if SList.Count >= 4 then
2082 Result.FNoParam := true;
2088 FAWKStr.LineSeparator := mcls_CRLF;
2089 FAWKStr.RegExp := '-';
2090 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2091 Result.FFirst := True;
2093 FAWKStr.RegExp := 'l[0-9]+';
2094 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2095 Result.FFirst := True;
2097 for i := 0 to SList.Count - 1 do begin
2098 if Trim(SList[i]) = '' then begin
2100 Result.FStBegin := True;
2101 if i = (SList.Count - 1) then
2102 Result.FToEnd := True;
2103 end else if IsNumeric(SList[i]) then begin
2104 wkInt := StrToInt(SList[i]);
2105 wkMax := Max(wkMax, wkInt);
2109 wkMin := Min(wkMin, wkInt);
2110 end else if Trim(SList[i]) = 'n' then begin
2111 Result.FFirst := True;
2113 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2114 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2115 if Copy(SList[i], 1, 1) = 'n' then
2116 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2118 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2119 Result.FFirst := True;
2120 wkMax := Max(wkMax, wkInt);
2124 wkMin := Min(wkMin, wkInt);
2128 if Result.FStBegin and (not Result.FToEnd) then
2130 else if (not Result.FStBegin) and Result.FToEnd then
2132 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2133 Result.FSt := wkMin;
2134 Result.FTo := wkMax;
2136 //Result.FSt := wkMin;
2137 //Result.FTo := wkMax;
2143 Result.FDone := True;
2147 //
\90Vkako
\8f\91\8e®
2148 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2149 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2150 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2151 SList := TStringList.Create;
2154 FAWKStr.RegExp := '/';
2155 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2156 Result.FBBS := SList[1];
2157 Result.FKey := ChangeFileExt(SList[5], '');
2158 Result.FFirst := True;
2164 Result.FDone := True;
2168 //
\8b\8ckako
\8f\91\8e®
2169 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2170 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2171 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2172 SList := TStringList.Create;
2175 FAWKStr.RegExp := '/';
2176 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2177 Result.FBBS := SList[1];
2178 Result.FKey := ChangeFileExt(SList[4], '');
2179 Result.FFirst := True;
2185 Result.FDone := True;
2189 //log
\8by
\82Ñlog2
\8f\91\8e®
2190 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2191 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2192 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2193 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2194 SList := TStringList.Create;
2197 FAWKStr.RegExp := '/';
2198 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2199 Result.FBBS := SList[2];
2200 Result.FKey := ChangeFileExt(SList[5], '');
2201 Result.FFirst := True;
2207 Result.FDone := True;
2212 //
\8b\8cURL
\8f\91\8e®
2213 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2214 FAWKStr.RegExp := '/test/read\.cgi\?';
2215 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2216 s := Copy(s, 16, Length(s));
2217 SList := TStringList.Create;
2220 FAWKStr.RegExp := '&';
2221 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2222 Result.FFirst := True;
2223 for i := 0 to SList.Count - 1 do begin
2224 if Pos('bbs=', SList[i]) = 1 then begin
2225 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2226 end else if Pos('key=', SList[i]) = 1 then begin
2227 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2228 end else if Pos('st=', SList[i]) = 1 then begin
2229 wk := Copy(SList[i], 4, Length(SList[i]));
2230 if IsNumeric(wk) then
2231 Result.FSt := StrToInt(wk)
2232 else if wk = '' then
2233 Result.FStBegin := True;
2234 end else if Pos('to=', SList[i]) = 1 then begin
2235 wk := Copy(SList[i], 4, Length(SList[i]));
2236 if IsNumeric(wk) then
2237 Result.FTo := StrToInt(wk)
2238 else if wk = '' then
2239 Result.FToEnd := True;
2240 end else if Pos('nofirst=', SList[i]) = 1 then begin
2241 Result.FFirst := False;
2250 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2251 Result.FDone := True;
2259 \brief URI
\82ð
\95ª
\89ð
2260 \param URL
\95ª
\89ð
\82·
\82é URI
2261 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2262 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2263 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2264 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2265 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2266 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2268 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2278 URI := TIdURI.Create(URL);
2280 Protocol := URI.Protocol;
2283 Document := URI.Document;
2285 Bookmark := URI.Bookmark;
2292 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2293 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2295 function TGikoSys.GetVersionBuild: Integer;
2297 FixedFileInfo: PVSFixedFileInfo;
2298 VersionHandle, VersionSize: DWORD;
2299 pVersionInfo: Pointer;
2304 AppFile := Application.ExeName;
2305 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2306 if VersionSize = 0 then
2308 GetMem(pVersionInfo, VersionSize);
2310 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2311 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2312 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2314 FreeMem(pVersionInfo, VersionSize);
2319 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2320 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2321 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2323 \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
2324 \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
2325 \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
2326 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2328 \97á(
\90³
\8bK
\89»
\91O):\n
2329 http://
\92\86\97ª/ \n
2330 http://
\92\86\97ª/20-100
2332 (
\90³
\8bK
\89»
\8cã):\n
2333 http://
\92\86\97ª/l50
2335 function TGikoSys.GetBrowsableThreadURL(
2339 threadItem : TThreadItem;
2340 boardPlugIn : TBoardPlugIn;
2345 //=====
\83v
\83\89\83O
\83C
\83\93
2347 for i := Length( BoardGroups ) - 1 downto 1 do begin
2348 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2349 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2350 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2351 if board <> nil then begin
2352 boardPlugIn := BoardGroups[i].BoardPlugIn;
2353 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2354 Result := threadItem.URL;
2363 // 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¢
2366 if Length( Result ) = 0 then
2367 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2372 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2373 \param inURL
\83X
\83\8c\83b
\83h URL
2376 function TGikoSys.GetThreadURL2BoardURL(
2380 threadItem : TThreadItem;
2381 boardPlugIn : TBoardPlugIn;
2386 //=====
\83v
\83\89\83O
\83C
\83\93
2388 for i := Length( BoardGroups ) - 1 downto 1 do begin
2389 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2390 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2391 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2392 boardPlugIn := BoardGroups[i].BoardPlugIn;
2393 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2394 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2402 // 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¢
2405 if Length( Result ) = 0 then
2406 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2411 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2412 \param inURL
\83X
\83\8c\83b
\83h URL
2414 \see TGikoSys.GetThreadURL2BoardURL
2416 function TGikoSys.Get2chThreadURL2BoardURL(
2420 Protocol, Host, Path, Document, Port, Bookmark : string;
2421 BBSID, BBSKey : string;
2425 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2426 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2428 foundPos := Pos( '/test/read.cgi', inURL );
2429 if {(Is2chHost(Host)) and} (foundPos > 0) then
2430 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2432 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2437 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2438 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2439 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2440 \see TGikoSys.GetBrowsableThreadURL
2442 function TGikoSys.Get2chBrowsableThreadURL(
2446 Protocol, Host, Path, Document, Port, Bookmark : string;
2447 BBSID, BBSKey : string;
2451 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2454 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2455 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2456 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2458 if Is2chHost( Host ) then begin
2459 Result := Protocol + '://' + Host +
2460 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2462 if foundPos > 0 then
2463 Result := Copy( inURL, 1, foundPos ) +
2464 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2466 Result := Protocol + '://' + Host +
2467 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2474 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2475 \param inBoard
\94Â URL
2476 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2477 \return
\83X
\83\8c\83b
\83h URL
2479 function TGikoSys.Get2chBoard2ThreadURL(
2487 server := UrlToServer( inBoard.URL );
2488 //if Is2chHost( server ) then
2489 if inBoard.Is2ch then
2490 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2492 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2497 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2499 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2501 procedure TGikoSys.ListBoardFile;
2503 boardFileList : TStringList;
2508 for i := 0 to Length( BBSs ) - 1 do
2512 SetLength( BBSs, 0 );
2515 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2516 if FileExists( GikoSys.GetBoardFileName ) then begin
2517 SetLength( BBSs, l + 1 );
2518 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2519 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2523 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2524 SetLength( BBSs, l + 1 );
2525 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2526 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2530 // Board
\83t
\83H
\83\8b\83_
2531 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2532 BoardFileList := TStringList.Create;
2534 BoardFileList.BeginUpdate;
2535 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*.txt', BoardFileList, True, True );
2536 BoardFileList.EndUpdate;
2537 SetLength( BBSs, l + BoardFileList.Count );
2538 for i := BoardFileList.Count - 1 downto 0 do begin
2539 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2540 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2550 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2551 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2553 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2558 boardFile : TStringList;
2559 CategoryList : TStringList;
2560 BoardList : TStringList;
2561 Category : TCategory;
2565 // RoundItem : TRoundItem;
2567 i, iBound : Integer;
2568 j, jBound : Integer;
2569 k, kBound : Integer;
2572 if not FileExists( bbs.FilePath ) then
2576 ini := TMemIniFile.Create('');
2577 boardFile := TStringList.Create;
2580 boardFile.LoadFromFile( bbs.FilePath );
2582 ini.SetStrings( boardFile );
2583 CategoryList := TStringList.Create;
2584 BoardList := TStringList.Create;
2586 ini.ReadSections( CategoryList );
2588 iBound := CategoryList.Count - 1;
2589 for i := 0 to iBound do begin
2590 ini.ReadSection( CategoryList[i], BoardList );
2591 Category := TCategory.Create;
2592 Category.No := i + 1;
2593 Category.Title := CategoryList[i];
2595 jBound := BoardList.Count - 1;
2596 for j := 0 to jBound do begin
2598 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2599 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2600 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2601 //=====
\83v
\83\89\83O
\83C
\83\93
2603 kBound := Length(BoardGroups) - 1;
2604 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2605 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2606 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2607 if not BoardGroups[k].Find(inistr, p) then begin
2608 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2609 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2610 if not BoardGroups[k].Find(tmpstring, p) then begin
2612 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2613 BoardGroups[k].AddObject(tmpstring, Board);
2614 Category.Add(Board);
2616 //
\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é
2620 Board := TBoard(BoardGroups[k].Objects[p]);
2621 if Board.ParentCategory <> Category then
2622 Category.Add(Board);
2626 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2627 BoardGroups[k].AddObject(tmpstring, Board);
2628 Category.Add(Board);
2630 //
\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é
2635 Board := TBoard(BoardGroups[k].Objects[p]);
2636 if Board.ParentCategory <> Category then
2637 Category.Add(Board);
2644 // 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¢
2647 if (Board = nil) then begin
2648 if not BoardGroups[0].Find(inistr,p) then begin
2649 Board := TBoard.Create( nil, inistr );
2650 BoardGroups[0].AddObject(inistr, Board);
2651 Category.Add(Board);
2653 Board := TBoard(BoardGroups[0].Objects[p]);
2654 if Board.ParentCategory <> Category then
2655 Category.Add(Board);
2659 if (Board.Multiplicity = 0) then begin
2662 Board.Multiplicity := 1;
2663 Board.Title := BoardList[j];
2664 Board.RoundDate := ZERO_DATE;
2669 Board.Multiplicity := Board.Multiplicity + 1;
2674 bbs.Add( Category );
2679 bbs.IsBoardFileRead := True;
2692 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2693 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2695 function TGikoSys.GetUnknownCategory : TCategory;
2697 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2700 if Length( BBSs ) < 2 then begin
2705 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2706 if Result = nil then begin
2707 Result := TCategory.Create;
2708 Result.Title := UNKNOWN_CATEGORY;
2709 BBSs[ 1 ].Add( Result );
2715 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2716 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2718 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2720 category : TCategory;
2722 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2725 category := GetUnknownCategory;
2726 if category = nil then begin
2729 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2730 if Result = nil then begin
2731 Result := TBoard.Create( inPlugIn, inURL );
2732 Result.Title := UNKNOWN_BOARD;
2733 category.Add( Result );
2740 function TGikoSys.GetSambaFileName : string;
2742 Result := Setting.GetSambaFileName;
2746 \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
2747 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2748 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2749 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2750 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2752 function TGikoSys.GetSameIDResAnchor(
2753 const AID : string; ThreadItem: TThreadItem;
2754 limited: Integer):string;
2759 ResLink : TResLinkRec;
2761 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2763 Res.FType := glt2chNew;
2766 if (not IsNoValidID(AID)) and
2767 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2768 body := TStringList.Create;
2770 GetSameIDRes(AID, ThreadItem, body);
2771 if (limited > 0) and (body.Count > limited) then begin
2772 for i := body.Count - limited to body.Count - 1 do begin
2773 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2776 for i := 0 to body.Count - 1 do begin
2777 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2783 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2784 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2785 HTMLCreater.ConvRes(@Res, @ResLink, false);
2786 Result := Res.FBody;
2791 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2792 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2793 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2794 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2796 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2799 ReadList: TStringList;
2801 boardPlugIn : TBoardPlugIn;
2803 if (not IsNoValidID(AID)) and
2804 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2805 //if ThreadItem.IsBoardPlugInAvailable then begin
2806 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2807 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2808 //boardPlugIn := ThreadItem.BoardPlugIn;
2809 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2811 for i := 0 to threadItem.Count - 1 do begin
2813 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2814 if(AnsiPos(AID, Res.FDateTime) > 0) then begin
2815 body.Add(IntToStr(i+1));
2819 ReadList := TStringList.Create;
2821 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2822 for i := 0 to ReadList.Count - 1 do begin
2823 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2824 if AnsiPos(AID, Res.FDateTime) > 0 then begin
2825 body.Add(IntToStr(i+1));
2836 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2837 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2838 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2839 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2842 function TGikoSys.GetSameIDResAnchor(AIDNum : Integer;
2843 ThreadItem: TThreadItem;
2844 limited: Integer):string;
2849 ResLink : TResLinkRec;
2851 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2853 Res.FType := glt2chNew;
2856 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2857 body := TStringList.Create;
2859 GetSameIDRes(AIDNum, ThreadItem, body);
2860 if (limited > 0) and ( body.Count > limited) then begin
2861 for i := body.Count - 20 to body.Count - 1 do begin
2862 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2865 for i := 0 to body.Count - 1 do begin
2866 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2872 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2873 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2874 HTMLCreater.ConvRes(@Res, @ResLink, false);
2875 Result := Res.FBody;
2880 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2881 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2882 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2883 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2885 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2889 AID := GetResID(AIDNum, ThreadItem);
2890 if not IsNoValidID(AID) then begin
2891 GetSameIDRes(AID, ThreadItem, body);
2895 \brief
\93\8a\8de ID
\8eæ
\93¾
2896 \param AIDNum
\93\8a\8de
\83\8c\83X
\94Ô
\8d\86
2897 \param ThreadItem
\93\8a\8de
\83X
\83\8c\83b
\83h
2898 \param body OUT:
\93\8a\8deID
2900 function TGikoSys.GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
2903 boardPlugIn : TBoardPlugIn;
2904 stList: TStringList;
2908 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2909 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2910 //if ThreadItem.IsBoardPlugInAvailable then begin
2911 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2912 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2913 //boardPlugIn := ThreadItem.BoardPlugIn;
2914 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2915 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2917 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2919 Result := Res.FDateTime;
2920 if AnsiPos('id', AnsiLowerCase(Result)) > 0 then begin
2921 Result := Copy(Result, AnsiPos('id', AnsiLowerCase(Result)) - 1, 11);
2922 if AnsiPos(' be:', AnsiLowerCase(Result)) > 0 then begin
2923 Result := Copy(Result, 1, AnsiPos(' BE:', AnsiLowerCase(Result)) - 1)
2926 stlist := TStringList.Create;
2928 stList.DelimitedText := Result;
2930 for i := 0 to stList.Count - 1 do
2931 if Length(WideString(stList[i])) = 8 then begin
2932 if NotDateorTimeString(stList[i]) then begin
2933 Result := stList[i];
2944 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2945 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2946 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2947 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2949 function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer;
2954 if (not IsNoValidID(AID))
2955 and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2956 body := TStringList.Create;
2958 GetSameIDRes(AID, ThreadItem, body);
2959 Result := body.Count;
2968 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2969 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2970 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2971 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2973 function TGikoSys.GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer;
2978 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2979 body := TStringList.Create;
2981 GetSameIDRes(AIDNum, ThreadItem, body);
2982 Result := body.Count;
2990 \brief
\8e\9e\8d\8f\82ð
\8e¦
\82·
\95¶
\8e\9a\97ñ
\82Å
\82Í
\96³
\82¢
\82©
\82Ç
\82¤
\82©
2991 \param AStr
\92²
\82×
\82é
\95¶
\8e\9a\97ñ
2992 \return
\8e\9e\8d\8f\82Å
\82Í
\96³
\82¢
\82È
\82ç True
2993 \todo
\94Û
\92è
\8c`(Not)
\82æ
\82è
\8dm
\92è
\8cn(Is)
2995 function TGikoSys.NotDateorTimeString(const AStr : string): boolean;
3012 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
3013 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3014 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
3016 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
3019 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3020 Bayesian.CountWord( text, wordCount );
3025 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
3026 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3027 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
3028 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
3029 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
3030 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
3031 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
3033 \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
3034 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
3036 \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
3038 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
3041 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3042 Bayesian.Forget( wordCount, isSpam );
3047 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3048 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3049 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3051 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3054 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3055 Bayesian.Learn( wordCount, isSpam );
3060 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3061 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3062 \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)
3063 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3065 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3068 case Setting.SpamFilterAlgorithm of
3069 gsfaNone: Result := 0;
3070 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3071 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3072 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3079 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3080 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3082 [
\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Ì
3083 [
\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
3085 function TGikoSys.SetUserOptionalStyle(): string;
3088 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3089 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3090 if GikoSys.Setting.BrowserFontSize <> 0 then
3091 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3092 if GikoSys.Setting.BrowserFontColor <> -1 then
3093 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3094 if GikoSys.Setting.BrowserBackColor <> -1 then
3095 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3096 case GikoSys.Setting.BrowserFontBold of
3097 -1: Result := Result + 'font-weight:normal;';
3098 1: Result := Result + 'font-weight:bold;';
3100 case GikoSys.Setting.BrowserFontItalic of
3101 -1: Result := Result + 'font-style:normal;';
3102 1: Result := Result + 'font-style:italic;';
3107 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3108 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3109 \param ANum
\83\8c\83X
\94Ô
3110 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3111 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3113 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3116 BNum, BMark : string;
3118 p := AnsiPos('BE:', AnsiUpperCase(AID));
3120 BNum := Copy(AID, p, Length(AID));
3121 AID := Copy(AID, 1, p - 1);
3122 p := AnsiPos('-', BNum);
3124 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3125 BNum := Copy(BNum, 1, p - 1);
3128 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3129 + '" target=_blank>' + BMark + '</a>';
3135 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3136 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3137 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3139 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3141 Translation = '\VarFileInfo\Translation';
3142 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3144 BufSize, HWnd: DWORD;
3145 VerInfoBuf: Pointer;
3147 VerDataLen: Longword;
3150 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3151 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3152 if BufSize <> 0 then begin
3153 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3154 GetMem(VerInfoBuf, BufSize);
3156 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3157 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3158 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3160 if not (VerDataLen > 0) then
3161 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3163 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3164 //
\81¨'\StringFileInfo\027382\FileDescription'
3165 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3166 [IntToHex(Integer(VerData^) and $FFFF, 4),
3167 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3168 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3170 if VerDataLen > 0 then begin
3171 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3173 SetLength(result, VerDataLen);
3174 StrLCopy(PChar(result), VerData, VerDataLen);
3178 FreeMem(VerInfoBuf);
3184 \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
3185 \return 1
\8ds1plugin
3187 function TGikoSys.GetPluginsInfo(): String;
3190 major, minor, revision : Cardinal;
3191 agent, release : String;
3193 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3196 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3197 for i := 0 to Length(BoardGroups) - 1 do begin
3198 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3199 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3200 if BoardGroups[i].BoardPlugIn <> nil then begin
3201 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3204 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3206 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3212 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3213 function TGikoSys.GetIEVersion: string;
3217 R := TRegistry.Create;
3219 //
\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¢
3220 R.Access := KEY_EXECUTE;
3221 R.RootKey := HKEY_LOCAL_MACHINE;
3222 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3224 Result := R.ReadString('version');
3226 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3233 //! 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¼
3234 function TGikoSys.GetMainKeyFileName : String;
3236 Result := Setting.GetMainKeyFileName;
3238 //! 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¼
3239 function TGikoSys.GetEditorKeyFileName: String;
3241 Result := Setting.GetEditorKeyFileName;
3243 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3244 function TGikoSys.GetInputAssistFileName: String;
3246 Result := Setting.GetInputAssistFileName;
3248 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3249 procedure TGikoSys.SetGikoMessage;
3251 if FGikoMessage = nil then begin
3252 FGikoMessage := TGikoMessage.Create;
3257 if (Setting.GengoSupport) then begin
3259 if (FileExists(Setting.GetLanguageFileName)) then begin
3260 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3267 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3268 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3271 if FGikoMessage <> nil then begin
3272 Result := FGikoMessage.GetMessage(MesType);
3276 //Tue, 17 Dec 2002 12:18:07 GMT
\81¨ TDateTime
\82Ö
3277 //MonaUtils
\82©
\82ç
\88Ú
\93®
3278 function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime;
3279 function StrMonthToMonth(const s: string): integer;
3281 m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
3286 for i := Low(m) to High(m) do begin
3287 if (SameText(s, m[i])) then begin
3294 wDay, wMonth, wYear: word;
3295 wHour, wMinute, wSecond: word;
3299 wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0);
3300 wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2));
3301 wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0);
3302 sTime := ChooseString(DateStr, ' ', 4);
3303 wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0);
3304 wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0);
3305 wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0);
3306 d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0);
3309 //MonaUtils
\82©
\82ç
\88Ú
\93®
3310 //!
\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·
3311 function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string;
3317 for i := 0 to Index - 1 do begin
3318 if (AnsiPos(Separator, S) = 0) then S := ''
3319 else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S));
3321 p := AnsiPos(Separator, S);
3322 if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S;
3324 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
3325 procedure TGikoSys.RestoreThreadData(Board : TBoard);
3327 SECTION = 'Setting';
3329 TmpFileList : TStringList;
3332 ThreadItem : TThreadItem;
3333 Boardpath, tmpStr : string;
3335 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
3337 TmpFileList := TStringList.Create;
3338 TmpFileList.Sorted := True;
3339 TmpFileList.BeginUpdate;
3341 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
3342 GetFileList(Boardpath, '*.tmp', TmpFileList, False);
3343 TmpFileList.EndUpdate;
3344 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
3345 for i := TmpFileList.Count - 1 downto 0 do begin
3346 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
3347 if ThreadItem <> nil then begin
3348 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
3350 tmpStr := ini.ReadString(SECTION, 'RoundDate', DateTimeToStr(ZERO_DATE));
3351 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
3353 tmpStr := ini.ReadString(SECTION, 'LastModified', DateTimeToStr(ZERO_DATE));
3354 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
3355 ThreadItem.Count := ini.ReadInteger(SECTION, 'Count', 0);
3356 ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
3358 ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
3359 ThreadItem.IsLogFile := FileExists(ThreadItem.GetThreadFileName);
3360 if(ThreadItem.Size = 0) and (ThreadItem.IsLogFile) then begin
3362 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
3367 //
\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ã
3368 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
3369 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
3370 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
3371 ThreadItem.ScrollTop := ini.ReadInteger(SECTION, 'ScrollTop', 0);
3372 ThreadItem.AllResCount := ini.ReadInteger(SECTION, 'AllResCount', ThreadItem.Count);
3373 ThreadItem.NewResCount := ini.ReadInteger(SECTION, 'NewResCount', 0);
3374 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger(SECTION, 'AgeSage', Ord(gasNone)));
3378 DeleteFile(Boardpath + TmpFileList[i]);
3387 \brief User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
3388 \return Boolean
\97\98\97p
\82Å
\82«
\82é
\8fê
\8d\87\82ÍTrue
3390 function TGikoSys.CanUser32DLL: Boolean;
3398 hUser32 := LoadLibrary('User32.dll');
3399 if hUser32 <> 0 then begin
3406 FreeLibrary(hUser32);
3410 \brief OE
\88ø
\97p
\95\84\8eæ
\93¾
3411 \return OE
\82Ì
\88ø
\97p
\95\84\81i
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87\82Í'>')
3413 function TGikoSys.GetOEIndentChar : string;
3416 Identities : string;
3419 DEFAULT_CHAR = '> ';
3420 OE_MAIL_PATH = '\Software\Microsoft\Outlook Express\5.0\Mail';
3421 INDENT_CHAR = 'Indent Char';
3424 Result := DEFAULT_CHAR;
3425 regKey := TRegistry.Create;
3428 regKey.RootKey := HKEY_CURRENT_USER;
3429 if not regKey.OpenKey( 'Identities', False ) then
3431 Identities := regKey.ReadString( 'Default User ID' );
3432 if Identities = '' then
3434 if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then
3436 IndentChar := regKey.ReadInteger( INDENT_CHAR );
3437 Result := Char( IndentChar ) + ' ';
3445 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3446 function TGikoSys.GetReplaceFileName: String;
3448 Result := Setting.GetReplaceFileName;
3450 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
3451 function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime;
3456 //
\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
3457 tmp := ChangeFileExt(FileName, '');
3458 if AnsiPos('_', tmp) <> 0 then
3459 if AnsiPos('_', tmp) > 9 then
3460 tmp := Copy(tmp, 1, AnsiPos('_', tmp)-1)
3462 Delete(tmp, AnsiPos('_', tmp), 1);
3464 if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
3465 Insert('1', tmp, 1);
3467 unixtime := StrToInt64Def(tmp, ZERO_DATE);
3468 Result := UnixToDateTime(unixtime) + OffsetFromUTC;
3472 GikoSys := TGikoSys.Create;
3475 if GikoSys <> nil then begin
3476 FreeAndNil(GikoSys);