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, Belib;
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;
116 //!
\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·
117 function ChooseString(const Text, Separator: string; Index: integer): string;
118 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
119 procedure RestoreThreadData(Board: TBoard);
123 FSelectResFilter : TAbon;
124 //FBoardURLList: TStringList;
127 destructor Destroy; override;
128 property ResRange : Longint read FResRange write FResRange;
129 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
130 property Version : String read FVersion;
131 function IsNumeric(s: string): boolean;
132 function IsFloat(s: string): boolean;
133 function DirectoryExistsEx(const Name: string): Boolean;
134 function ForceDirectoriesEx(Dir: string): Boolean;
136 function GetBoardFileName: string;
137 function GetCustomBoardFileName: string;
138 function GetHtmlTempFileName: string;
139 function GetAppDir: string;
140 function GetTempFolder: string;
141 function GetSentFileName: string;
142 function GetConfigDir: string;
143 function GetNGWordsDir: string;
144 function GetSkinDir: string;
145 function GetSkinHeaderFileName: string;
146 function GetSkinFooterFileName: string;
147 function GetSkinResFileName: string;
148 function GetSkinNewResFileName: string;
149 function GetSkinBookmarkFileName: string;
150 function GetSkinNewmarkFileName: string;
151 function GetStyleSheetDir: string;
152 function GetOutBoxFileName: string;
153 function GetUserAgent: string;
154 function GetSambaFileName : string;
156 function GetMainKeyFileName : String;
157 function GetEditorKeyFileName: String;
158 function GetInputAssistFileName: String;
159 procedure ReadSubjectFile(Board: TBoard);
160 procedure CreateThreadDat(Board: TBoard);
161 procedure WriteThreadDat(Board: TBoard);
162 function ParseIndexLine(Line: string): TIndexRec;
163 procedure GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean); overload;
164 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¢
165 procedure GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
167 function DivideSubject(Line: string): TSubjectRec;
168 property Setting: TSetting read FSetting write FSetting;
169 property Dolib: TDolib read FDolib write FDolib;
170 property Belib: TBelib read FBelib write FBelib;
172 function UrlToID(url: string): string;
173 function UrlToServer(url: string): string;
175 function StrTokFirst(const s:string; const sep:TStrTokSeparator; var Rec:TStrTokRec):string;
176 function StrTokNext(const sep:TStrTokSeparator; var Rec:TStrTokRec): string;
178 function GetFileSize(FileName : string) : longint;
179 function GetFileLineCount(FileName : string): longint;
180 function IntToDateTime(val: Int64): TDateTime;
181 function DateTimeToInt(ADate: TDateTime): Int64;
183 function ReadThreadFile(FileName: string; Line: Integer): string;
185 procedure MenuFont(Font: TFont);
187 // function RemoveToken(var s:string; const delimiter:string):string;
188 function GetTokenIndex(s: string; delimiter: string; index: Integer): string;
190 function GetShortName(const LongName: string; ALength: integer): string;
191 function BoolToInt(b: Boolean): Integer;
192 function IntToBool(i: Integer): Boolean;
193 function GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
194 procedure LoadKeySetting(ActionList: TActionList; FileName: String);
195 procedure SaveKeySetting(ActionList: TActionList; FileName: String);
196 procedure CreateProcess(const AppPath: string; const Param: string);
197 procedure OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
198 function HTMLDecode(const AStr: String): String;
199 function GetHRefText(s: string): string;
200 function Is2chHost(Host: string): Boolean;
201 function Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
202 function Parse2chURL2(URL: string): TPathRec;
203 procedure ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
204 function GetVersionBuild: Integer;
205 function GetBrowsableThreadURL( inURL : string ) : string;
206 function GetThreadURL2BoardURL( inURL : string ) : string;
207 function Get2chThreadURL2BoardURL( inURL : string ) : string;
208 function Get2chBrowsableThreadURL( inURL : string ) : string;
209 function Get2chBoard2ThreadURL( inBoard : TBoard; inKey : string ) : string;
210 procedure ListBoardFile;
211 procedure ReadBoardFile( bbs : TBBS );
213 function GetUnknownCategory : TCategory;
214 function GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
216 procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
218 property Bayesian : TGikoBayesian read FBayesian write FBayesian;
219 function CreateResAnchor(var Numbers: TStringList; ThreadItem: TThreadItem; limited: Integer):string;
220 procedure GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList); overload;
221 procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
222 function GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
223 function ExtructResID(ADateStr: String): String;
225 procedure SpamCountWord( const text : string; wordCount : TWordCount );
226 //!
\8aw
\8fK
\83N
\83\8a\83A
227 procedure SpamForget( wordCount : TWordCount; isSpam : Boolean );
228 //!
\83X
\83p
\83\80\8aw
\8fK
229 procedure SpamLearn( wordCount : TWordCount; isSpam : Boolean );
230 //!
\83X
\83p
\83\80\93x
\90\94
231 function SpamParse( const text : string; wordCount : TWordCount ) : Extended;
233 //!
\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Á
234 function AddBeProfileLink(AID : string; ANum: Integer): string;
235 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
236 function GetVersionInfo(KeyWord: TVerResourceKey): string;
237 //! Plugin
\82Ì
\8fî
\95ñ
\82Ì
\8eæ
\93¾
238 function GetPluginsInfo(): string;
239 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
240 function GetIEVersion: string;
241 function SetUserOptionalStyle(): string;
242 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
243 procedure SetGikoMessage;
244 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
245 function GetGikoMessage(MesType: TGikoMessageListType): String;
246 //! GMT
\82Ì
\8e\9e\8d\8f\82ðTDateTime
\82É
\95Ï
\8a·
\82·
\82é
247 function DateStrToDateTime(const DateStr: string): TDateTime;
248 //! User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
249 function CanUser32DLL: Boolean;
250 //! OE
\88ø
\97p
\95\84\8eæ
\93¾
251 function GetOEIndentChar : string;
252 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
253 function GetReplaceFileName: String;
254 //!
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
255 procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: boolean = True);
256 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
257 function GetCreateDateFromName(FileName: String): TDateTime;
258 function GetExtpreviewFileName: String;
260 procedure ShowRefCount(msg: String; unk: IUnknown);
261 //!
\96`
\8c¯
\82Ì
\8f\91Cookie
\8eæ
\93¾
262 function GetBoukenCookie(AURL: String): String;
263 //!
\96`
\8c¯
\82Ì
\8f\91Cookie
\90Ý
\92è
264 procedure SetBoukenCookie(ACookieValue, ADomain: String);
265 //!
\96`
\8c¯
\82Ì
\8f\91Cookie
\8dí
\8f\9c
266 procedure DelBoukenCookie(ADomain: String);
267 //!
\96`
\8c¯
\82Ì
\8f\91Domain
\88ê
\97\97\8eæ
\93¾
268 procedure GetBoukenDomain(var ADomain: TStringList);
269 //!
\96`
\8c¯
\82Ì
\8f\91\83h
\83\81\83C
\83\93\96¼Cookie
\8eæ
\93¾
270 function GetBouken(AURL: String; var Domain: String): String;
276 //LENGTH_RESTITLE = 40;
277 ZERO_DATE: Integer = 25569;
278 BETA_VERSION_NAME_E = 'beta';
279 BETA_VERSION_NAME_J = 'ÊÞÀ';
281 BETA_VERSION_BUILD = ''; //!< debug
\94Å
\82È
\82Ç
282 APP_NAME = 'gikoNavi';
283 BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
289 Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils, Sort, YofUtils,
290 IniFiles, DateUtils, SkinFiles;
293 FOLDER_INDEX_VERSION = '1.01';
294 USER_AGENT = 'Monazilla';
295 DEFAULT_NGWORD_FILE_NAME : String = 'NGword.txt';
296 NGWORDs_DIR_NAME : String = 'NGwords';
298 READ_PATH: string = '/test/read.cgi/';
299 HTML_READ_PATH: string = '/test/read.html/';
300 OLD_READ_PATH: string = '/test/read.cgi?';
301 KAKO_PATH: string = '/kako/';
303 KeyWordStr: array [TVerResourceKey] of String = (
317 // *************************************************************************
318 //! GikoSys
\83R
\83\93\83X
\83g
\83\89\83N
\83^
319 // *************************************************************************
320 constructor TGikoSys.Create;
323 FSetting := TSetting.Create;
324 FDolib := TDolib.Create;
325 FBelib := TBelib.Create;
326 FAWKStr := TAWKStr.Create(nil);
327 if DirectoryExists(GetConfigDir) = false then begin
328 CreateDir(GetConfigDir);
330 FAbon := TAbon.Create;
331 FAbon.IgnoreKana := FSetting.IgnoreKana;
332 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
334 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
335 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
336 FAbon.DeleteSyria := FSetting.DeleteSyria;
337 FAbon.Deleterlo := FSetting.AbonDeleterlo;
338 FAbon.Replaceul := FSetting.AbonReplaceul;
339 FAbon.AbonPopupRes := FSetting.PopUpAbon;
341 FSelectResFilter := TAbon.Create;
342 FSelectResFilter.IgnoreKana := True;
343 //
\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
344 FSelectResFilter.AbonString := '';
346 ResRange := FSetting.ResRange;
347 FVersion := Trim(GetVersionInfo(vrFileVersion));
348 FBayesian := TGikoBayesian.Create;
349 //FBoardURLList := TStringList.Create;
350 //
\83\81\83b
\83Z
\81[
\83W
\82Ì
\8dì
\90¬
351 FGikoMessage := TGikoMessage.Create;
354 // *************************************************************************
355 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
356 // *************************************************************************
357 destructor TGikoSys.Destroy;
360 FileList: TStringList;
362 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
363 FileList := TStringList.Create;
365 FileList.BeginUpdate;
366 GetFileList(GetTempFolder, '*.html', FileList, False, True);
368 for i := 0 to FileList.Count - 1 do begin
369 DeleteFile(FileList[i]);
374 FreeAndNil(FGikoMessage);
375 FreeAndNil(FBayesian);
376 FreeAndNil(FSelectResFilter);
381 FreeAndNil(FSetting);
386 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
387 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
388 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
391 function TGikoSys.IsNumeric(s: string): boolean;
402 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
403 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
404 \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
406 function TGikoSys.IsFloat(s: string): boolean;
410 Result := TextToFloat(PChar(s), v, fvExtended);
413 // *************************************************************************
414 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
415 // *************************************************************************
416 function TGikoSys.GetBoardFileName: string;
418 Result := Setting.GetBoardFileName;
421 // *************************************************************************
422 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
423 // *************************************************************************
424 function TGikoSys.GetCustomBoardFileName: string;
426 Result := Setting.GetCustomBoardFileName;
429 // *************************************************************************
430 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
431 // *************************************************************************
432 function TGikoSys.GetHtmlTempFileName: string;
434 Result := Setting.GetHtmlTempFileName;
438 // *************************************************************************
439 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
440 // *************************************************************************
441 function TGikoSys.GetAppDir: string;
443 Result := Setting.GetAppDir;
446 // *************************************************************************
447 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
448 // *************************************************************************
449 function TGikoSys.GetTempFolder: string;
451 Result := Setting.GetTempFolder;
454 // *************************************************************************
455 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
456 // *************************************************************************)
457 function TGikoSys.GetSentFileName: string;
459 Result := Setting.GetSentFileName;
462 // *************************************************************************
463 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
464 // *************************************************************************
465 function TGikoSys.GetOutBoxFileName: string;
467 Result := Setting.GetOutBoxFileName;
470 // *************************************************************************
471 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
472 // *************************************************************************
473 function TGikoSys.GetConfigDir: string;
475 Result := Setting.GetConfigDir;
478 function TGikoSys.GetNGWordsDir: string;
480 Result := Setting.GetConfigDir + NGWORDs_DIR_NAME;
484 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
485 function TGikoSys.GetStyleSheetDir: string;
487 Result := Setting.GetStyleSheetDir;
490 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
491 function TGikoSys.GetSkinDir: string;
493 Result := Setting.GetSkinDir;
496 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
497 function TGikoSys.GetSkinHeaderFileName: string;
499 Result := Setting.SkinFiles.GetSkinHeaderFileName;
502 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
503 function TGikoSys.GetSkinFooterFileName: string;
505 Result := Setting.SkinFiles.GetSkinFooterFileName;
508 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
509 function TGikoSys.GetSkinNewResFileName: string;
511 Result := Setting.SkinFiles.GetSkinNewResFileName;
514 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
515 function TGikoSys.GetSkinResFileName: string;
517 Result := Setting.SkinFiles.GetSkinResFileName;
520 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
521 function TGikoSys.GetSkinBookmarkFileName: string;
523 Result := Setting.SkinFiles.GetSkinBookmarkFileName;
526 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
527 function TGikoSys.GetSkinNewmarkFileName: string;
529 Result := Setting.SkinFiles.GetSkinNewmarkFileName;
532 //! UserAgent
\8eæ
\93¾
533 function TGikoSys.GetUserAgent: string;
535 if Dolib.Connected then begin
536 Result := Format('%s %s/%s%d/%s', [
543 Result := Format('%s/%s %s/%s%d/%s', [
554 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
555 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
556 \return val
\82ð
\8e¦
\82· TDateTime
558 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
560 Result := ZERO_DATE + val / 86400.0;
564 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
565 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
566 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
568 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
570 Result := Trunc((ADate - ZERO_DATE) * 86400);
575 \brief Subject
\83t
\83@
\83C
\83\8bRead
576 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
578 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
580 ThreadItem: TThreadItem;
582 FileList: TStringList;
591 datFileCheck: Boolean;
593 FavoThreadItem : TFavoriteThreadItem;
603 if Board.IsThreadDatRead then
607 usePlugIn := Board.IsBoardPlugInAvailable;
608 //server := UrlToServer( Board.URL );
609 //
\83X
\83\8c\83b
\83h
\82Å
\8b¤
\92Ê
\82ÌURL
\95\94
610 if Board.is2ch then begin
611 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi/' + Board.BBSID + '/';
613 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi?bbs=' + Board.BBSID + '&key=';
616 FileName := Board.GetFolderIndexFileName;
619 datFileCheck := (Setting.CheckDatFile) or (not FileExists(FileName));
620 if (datFileCheck) then begin
621 FileList := TStringList.Create;
622 FileList.Sorted := True;
623 FileList.BeginUpdate;
624 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
625 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
629 //
\8fd
\95¡
\82ð
\96h
\82®
631 Board.Sorted := True;
632 sl := TStringList.Create;
634 if FileExists(FileName) then begin
635 sl.LoadFromFile(FileName);
636 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
637 for i := sl.Count - 1 downto 1 do begin
638 Rec := ParseIndexLine(sl[i]);
639 if (datFileCheck) then begin
640 islog := FileList.Find( Rec.FFileName, Index );
642 islog := (Rec.FSize <> 0) and (Rec.FCount <> 0);
645 ThreadItem := TThreadItem.Create(
648 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
650 if Board.is2ch then begin
651 ThreadItem := TThreadItem.Create(
654 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
659 ThreadItem := TThreadItem.Create(
662 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
669 //ThreadItem.BeginUpdate;
670 if (datFileCheck) and (islog) then
671 FileList.Delete( Index );
673 ThreadItem.No := Rec.FNo;
674 ThreadItem.FileName := Rec.FFileName;
675 ThreadItem.Title := MojuUtils.UnSanitize(Rec.FTitle);
676 ThreadItem.Count := Rec.FCount;
677 ThreadItem.Size := Rec.FSize;
678 ThreadItem.RoundDate := Rec.FRoundDate;
679 ThreadItem.LastModified := Rec.FLastModified;
680 ThreadItem.Kokomade := Rec.FKokomade;
681 ThreadItem.NewReceive := Rec.FNewReceive;
682 ThreadItem.UnRead := Rec.FUnRead;
683 ThreadItem.ScrollTop := Rec.FScrollTop;
684 ThreadItem.AllResCount := Rec.FAllResCount;
685 ThreadItem.NewResCount := Rec.FNewResCount;
686 ThreadItem.AgeSage := Rec.FAgeSage;
687 ThreadItem.ParentBoard := Board;
688 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
690 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
691 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
694 //ThreadItem.EndUpdate;
695 Board.Add(ThreadItem);
697 if (ThreadItem.UnRead) and (ThreadItem.IsLogFile) then
702 if UnRead <> Board.UnRead then
703 Board.UnRead := UnRead;
705 if (datFileCheck) then begin
706 //
\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
707 AddOutofIndexDat(Board, FileList);
711 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
712 RestoreThreadData( Board );
715 if (datFileCheck) then begin
718 Board.Sorted := False;
720 Board.IsThreadDatRead := True;
722 rt := GetTickCount - st;
723 Writeln('Read Done.' + Board.Title + ':' + IntToStr(rt) + ' ms');
727 \brief
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
728 \param Board
\92Ç
\89Á
\82·
\82é
\94Â
729 \param DatList dat
\83t
\83@
\83C
\83\8b\96¼
731 procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: Boolean = True);
734 Boardpath,FileName : String;
736 ThreadItem: TThreadItem;
740 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
741 //
\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
742 for i := 0 to DatList.Count - 1 do begin
743 FileName := Boardpath + DatList[i];
745 if (not AllCreate) then begin
747 ThreadItem := Board.FindThreadFromFileName(DatList[i]);
748 if (ThreadItem = nil) then begin
751 if Board.IsBoardPlugInAvailable then begin
752 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
754 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
758 if (ThreadItem = nil) then begin
759 if Board.IsBoardPlugInAvailable then begin
760 ThreadItem := TThreadItem.Create(
763 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
764 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
766 ThreadItem := TThreadItem.Create(
769 Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
770 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
775 ThreadItem.BeginUpdate;
776 ThreadItem.FileName := DatList[i];
777 //ThreadItem.FilePath := FileName;
778 ThreadItem.No := Board.Count + 1;
779 ThreadItem.Title := ResRec.FTitle;
780 ThreadItem.Count := GetFileLineCount(FileName);
781 ThreadItem.AllResCount := ThreadItem.Count;
782 ThreadItem.NewResCount := ThreadItem.Count;
783 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é
784 ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) );
785 ThreadItem.LastModified := ThreadItem.RoundDate;
786 ThreadItem.Kokomade := -1;
787 ThreadItem.NewReceive := 0;
788 ThreadItem.ParentBoard := Board;
789 ThreadItem.IsLogFile := True;
790 ThreadItem.Round := False;
791 ThreadItem.UnRead := False;
792 ThreadItem.ScrollTop := 0;
793 ThreadItem.AgeSage := gasNone;
794 ThreadItem.EndUpdate;
795 if (AllCreate) or (create) then begin
796 Board.Add(ThreadItem);
801 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
802 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
804 procedure TGikoSys.CreateThreadDat(Board: TBoard);
808 SubjectList: TStringList;
814 if not FileExists(Board.GetSubjectFileName) then Exit;
815 FileName := Board.GetFolderIndexFileName;
817 SubjectList := TStringList.Create;
819 SubjectList.LoadFromFile(Board.GetSubjectFileName);
820 sl := TStringList.Create;
824 sl.Add(FOLDER_INDEX_VERSION);
825 for i := 0 to SubjectList.Count - 1 do begin
826 Rec := DivideSubject(SubjectList[i]);
828 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
831 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
832 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
833 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
834 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
835 + Format('%x', [0]) + #1 //size
836 + Format('%x', [0]) + #1 //RoundDate
837 + Format('%x', [0]) + #1 //LastModified
838 + Format('%x', [0]) + #1 //Kokomade
839 + Format('%x', [0]) + #1 //NewReceive
840 + '0' + #1 //
\96¢
\8eg
\97p
841 + Format('%x', [0]) + #1 //UnRead
842 + Format('%x', [0]) + #1 //ScrollTop
843 + Format('%x', [Rec.FCount]) + #1 //AllResCount
844 + Format('%x', [0]) + #1 //NewResCount
845 + Format('%x', [0]); //AgeSage
847 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
848 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
850 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
851 MojuUtils.Sanitize(Rec.FTitle), //
\83^
\83C
\83g
\83\8b
852 Rec.FCount, //
\83J
\83E
\83\93\83g
861 Rec.FCount, //AllResCount
870 sl.SaveToFile(FileName);
880 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
881 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
883 procedure TGikoSys.WriteThreadDat(Board: TBoard);
885 // Values: array[Boolean] of string = ('0', '1');
891 TmpFileList: TStringList;
893 if not Board.IsThreadDatRead then
895 FileName := Board.GetFolderIndexFileName;
896 ForceDirectoriesEx( ExtractFilePath( FileName ) );
898 sl := TStringList.Create;
899 TmpFileList := TStringList.Create;
900 TmpFileList.Sorted := true;
902 TmpFileList.BeginUpdate;
903 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
904 TmpFileList.EndUpdate;
906 sl.Add(FOLDER_INDEX_VERSION);
908 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
909 Sort.SetSortNoFlag(true);
910 Sort.SetSortOrder(true);
911 Sort.SetSortIndex(0);
912 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
913 Board.CustomSort(ThreadItemSortProc);
915 for i := 0 to Board.Count - 1 do begin
916 Board.Items[i].No := i + 1;
917 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
918 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
919 [Board.Items[i].No, //
\94Ô
\8d\86
920 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
921 MojuUtils.Sanitize(Board.Items[i].Title), //
\83^
\83C
\83g
\83\8b
922 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
923 Board.Items[i].Size, //size
924 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
925 DateTimeToInt(Board.Items[i].LastModified), //LastModified
926 Board.Items[i].Kokomade, //Kokomade
927 Board.Items[i].NewReceive, //NewReceive
929 BoolToInt(Board.Items[i].UnRead), //UnRead
930 Board.Items[i].ScrollTop, //ScrollTop
931 Board.Items[i].AllResCount, //AllResCount
932 Board.Items[i].NewResCount, //NewResCount
933 Ord(Board.Items[i].AgeSage)] //AgeSage
939 sl.SaveToFile(FileName);
941 for i := 0 to TmpFileList.Count - 1 do begin
942 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
952 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
953 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
954 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
956 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
958 Result.FNo := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
959 Result.FFileName := MojuUtils.RemoveToken(Line, #1);
960 Result.FTitle := MojuUtils.UnSanitize(MojuUtils.RemoveToken(Line, #1));
961 Result.FCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
962 Result.FSize := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
963 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
964 Result.FLastModified := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
965 Result.FKokomade := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), -1);
966 Result.FNewReceive := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
967 MojuUtils.RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
968 Result.FUnRead := IntToBool(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
969 Result.FScrollTop := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
970 Result.FAllResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
971 Result.FNewResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
972 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
977 \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é
978 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
979 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
980 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
981 \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
982 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
984 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
985 \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
989 GetFileList('c:\', '*.txt', list, True, True);
992 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
995 SearchRec : TSearchRec;
998 Path := IncludeTrailingPathDelimiter(Path);
999 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
1001 while rc = 0 do begin
1002 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1003 s := Path + SearchRec.Name;
1005 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
1009 List.Add(SearchRec.Name);
1010 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1011 GetFileList(s, Mask, List, True, IsPathAdd);
1013 rc := FindNext(SearchRec);
1016 SysUtils.FindClose(SearchRec);
1022 \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
1023 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
1024 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1025 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
1026 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1027 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
1028 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
1031 GetFileList('c:\', '*.txt', list, True);
1034 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
1037 SearchRec : TSearchRec;
1039 Path := IncludeTrailingPathDelimiter(Path);
1040 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
1042 while rc = 0 do begin
1043 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1044 if (SearchRec.Attr and faDirectory = 0) then begin
1045 if IsPathAdd then begin
1046 List.Add(Path + SearchRec.Name)
1048 List.Add(SearchRec.Name);
1052 rc := FindNext(SearchRec);
1055 SysUtils.FindClose(SearchRec);
1061 \brief
\8ew
\92è
\83t
\83H
\83\8b\83_
\93à
\82Ì
\83f
\83B
\83\8c\83N
\83g
\83\8a\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
1062 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1063 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1064 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1065 \param SubDir
\92\86\82Ì
\83t
\83H
\83\8b\83_
\82Ü
\82Å
\8dÄ
\8bA
\93I
\82É
\83\8a\83X
\83g
\82·
\82é
\8fê
\8d\87\82Í True
1067 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1068 \93Á
\92è
\82Ì
\83t
\83@
\83C
\83\8b\96¼
\82â
\93Á
\92è
\82Ì
\8ag
\92£
\8eq
\82É
\8di
\82Á
\82½
\83\8a\83X
\83g
\83A
\83b
\83v
\82ª
\89Â
\94\
\82Å
\82·
\81B
1072 GetDirectoryList('c:\', '*.txt', list, True);
1075 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1078 SearchRec : TSearchRec;
1081 Path := IncludeTrailingPathDelimiter(Path);
1082 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1084 while rc = 0 do begin
1085 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1086 s := Path + SearchRec.Name;
1087 //if (SearchRec.Attr and faDirectory > 0) then
1088 // s := IncludeTrailingPathDelimiter(s)
1090 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1091 List.Add( IncludeTrailingPathDelimiter( s ) );
1092 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1093 GetDirectoryList(s, Mask, List, True);
1095 rc := FindNext(SearchRec);
1098 SysUtils.FindClose(SearchRec);
1104 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1105 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1106 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1108 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1118 if AnsiPos('<>', Line) = 0 then
1122 Result.FFileName := MojuUtils.RemoveToken(Line, Delim);
1123 Result.FTitle := Trim(MojuUtils.RemoveToken(Line, Delim));
1125 ws := Result.FTitle;
1126 if Copy(ws, Length(ws), 1) = ')' then begin
1129 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1132 end else if Copy(ws, Length(ws), 1) = '>' then begin
1136 for i := Length(ws) - 1 downto 1 do begin
1137 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1138 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1139 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1140 if IsNumeric(ws) then
1141 Result.FCount := StrToInt(ws);
1142 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1149 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1150 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1153 function TGikoSys.UrlToID(url: string): string;
1160 if url = '' then Exit;
1162 url := Copy(url, 0, Length(url) - 1);
1163 for i := Length(url) downto 0 do begin
1164 if url[i] = '/' then begin
1165 Result := Copy(url, i + 1, Length(url));
1175 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1176 \param url
\89ð
\8eß
\82·
\82é URL
1177 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1179 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1181 function TGikoSys.UrlToServer(url: string): string;
1188 wsURL := Trim(wsURL);
1190 if wsURL = '' then exit;
1192 if Copy(wsURL, Length(wsURL), 1) = '/' then
1193 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1195 for i := Length(wsURL) downto 0 do begin
1196 if wsURL[i] = '/' then begin
1197 Result := Copy(wsURL, 0, i);
1204 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1205 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1206 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1208 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1212 Code := GetFileAttributes(PChar(Name));
1213 Result := (Code <> Cardinal(-1)) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1217 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1218 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1219 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1221 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1224 if Length(Dir) = 0 then
1225 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1226 Dir := ExcludeTrailingPathDelimiter(Dir);
1227 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1228 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1229 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1233 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
\81i
\8f\89\8aú
\8f\88\97\9d\81j
1234 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1235 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1236 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1237 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1238 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1239 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1241 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1245 Result := StrTokNext(sep, Rec);
1249 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1250 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1251 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1252 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1253 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1254 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1256 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1263 if Len >= Pos then begin
1264 while (Pos <= Len) and (Str[Pos] in sep) do begin
1268 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1269 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1274 Result := Copy(Str, I, Pos - I);
1275 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1283 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1284 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1285 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1287 function TGikoSys.GetFileSize(FileName : string): longint;
1292 if not FileExists(FileName) then begin
1296 Assign(F, FileName);
1298 Result := FileSize(F);
1306 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1307 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1309 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1311 function TGikoSys.GetFileLineCount(FileName : string): longint;
1315 sl := TStringList.Create;
1318 sl.LoadFromFile(FileName);
1330 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1331 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1332 \param Line
\8ew
\92è
\8ds
1333 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1334 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1336 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1338 fileTmp : TStringList;
1341 if FileExists(FileName) then begin
1342 fileTmp := TStringList.Create;
1345 fileTmp.LoadFromFile( FileName );
1346 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1347 Result := fileTmp.Strings[ Line-1 ];
1350 //on EFOpenError do Result := '';
1359 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1360 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1362 procedure TGikoSys.MenuFont(Font: TFont);
1365 nm: NONCLIENTMETRICS;
1367 nm.cbSize := sizeof(NONCLIENTMETRICS);
1368 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1369 lf := nm.lfMenuFont;
1370 Font.Name := lf.lfFaceName;
1371 Font.Height := lf.lfHeight;
1373 if lf.lfWeight >= 700 then
1374 Font.Style := Font.Style + [fsBold];
1375 if lf.lfItalic = 1 then
1376 Font.Style := Font.Style + [fsItalic];
1380 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1381 \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ñ
1382 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1383 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1385 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1387 {function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1391 p := AnsiPos(delimiter, s);
1395 Result := Copy(s, 1, p - 1);
1396 Delete(s, 1, Length(Result) + Length(delimiter));
1401 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1402 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1403 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1404 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1406 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1408 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1413 for i := 0 to index do
1414 Result := MojuUtils.RemoveToken(s, delimiter);
1418 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1419 {procedure TGikoSys.FlashExitWrite;
1423 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1424 for i := 0 to FExitWrite.Count - 1 do
1425 WriteThreadDat(FExitWrite[i]);
1430 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1431 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1432 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1433 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1437 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1439 ERASECHAR : array [1..39] of string =
1440 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1441 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1442 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1443 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1445 Chr : array [0..255] of char;
1449 s := Trim(LongName);
1450 if (Length(s) <= ALength) then begin
1454 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1455 S := CustomStringReplace(S, ERASECHAR[i], '');
1457 if (Length(S) <= ALength) then begin
1460 Windows.LCMapString(
1461 GetUserDefaultLCID(),
1469 S := Copy(S,1,ALength);
1471 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1472 S := Copy(S, 1, Length(S) - 1);
1483 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1484 \return False..0, True..1
1486 function TGikoSys.BoolToInt(b: Boolean): Integer;
1488 Result := IfThen(b, 1, 0);
1492 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1493 \return 1..True, other..False
1494 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1495 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1497 function TGikoSys.IntToBool(i: Integer): Boolean;
1503 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1504 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1505 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1506 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1508 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1512 GZipStream: TGzipDecompressStream;
1513 TextStream: TStringStream;
1514 buf: array[0..BUF_SIZE - 1] of Byte;
1520 TextStream := TStringStream.Create('');
1522 //
\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¢)
1523 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1524 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1525 ResStream.Position := 0;
1526 GZipStream := TGzipDecompressStream.Create(TextStream);
1529 FillChar(buf, BUF_SIZE, 0);
1530 cnt := ResStream.Read(buf, BUF_SIZE);
1532 GZipStream.Write(buf, BUF_SIZE);
1538 ResStream.Position := 0;
1540 FillChar(buf, BUF_SIZE, 0);
1541 cnt := ResStream.Read(buf, BUF_SIZE);
1543 TextStream.Write(buf, BUF_SIZE);
1547 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1548 s := TextStream.DataString;
1551 while (i > 0) and (s[i] = #0) do
1553 Delete(s, i + 1, ln - i);
1556 while i <> 0 do begin
1568 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1569 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1570 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1572 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1574 STD_SEC = 'KeySetting';
1580 SecList: TStringList;
1581 Component: TComponent;
1583 if not FileExists(fileName) then
1585 SecList := TStringList.Create;
1586 ini := TMemIniFile.Create(fileName);
1588 ini.ReadSection(STD_SEC, SecList);
1589 for i := 0 to SecList.Count - 1 do begin
1590 ActionName := SecList[i];
1591 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1592 if ActionKey <> -1 then begin
1593 Component := ActionList.Owner.FindComponent(ActionName);
1594 if TObject(Component) is TAction then begin
1595 TAction(Component).ShortCut := ActionKey;
1606 \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¶
1607 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1608 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1610 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
1612 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1614 STD_SEC = 'KeySetting';
1619 ini := TMemIniFile.Create(GetConfigDir + FileName);
1621 for i := 0 to ActionList.ActionCount - 1 do begin
1622 if ActionList.Actions[i].Tag = -1 then
1624 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1634 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1635 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1636 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1638 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1640 PI: TProcessInformation;
1644 Path := '"' + AppPath + '"';
1646 Path := Path + ' ' + Param;
1648 SI.Cb := SizeOf(Si);
1649 SI.lpReserved := nil;
1650 SI.lpDesktop := nil;
1653 SI.cbReserved2 := 0;
1654 SI.lpReserved2 := nil;
1656 if Windows.CreateProcess(nil,
1667 CloseHandle(PI.hProcess);
1673 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1674 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1675 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1677 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1681 params : TStringList;
1685 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1686 gbtUserApp, gbtAuto:
1687 if (Setting.URLApp) then begin
1688 if (FileExists(Setting.URLAppFile)) then begin
1689 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1691 //
\8bN
\93®
\83p
\83\89\83\81\81[
\83^
\95t
\82«
\91Î
\8dô
1693 params := TStringList.Create;
1695 params.Delimiter := ' ';
1696 params.DelimitedText := Setting.URLAppFile;
1697 for i := 0 to params.Count - 1 do begin
1698 path := TrimLeft(path + ' ' + params[i]);
1699 if (FileExists(path)) then begin
1701 for j := i + 1 to params.Count - 1 do begin
1702 arg := arg + ' ' + params[j];
1707 if i < params.Count then begin
1708 GikoSys.CreateProcess(path, arg + ' ' + URL);
1710 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1717 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1722 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1723 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1724 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1726 function TGikoSys.HTMLDecode(const AStr: String): String;
1728 Sp, Rp, Cp, Tp: PChar;
1733 SetLength(Result, Length(AStr));
1735 Rp := PChar(Result);
1738 while Sp^ <> #0 do begin
1744 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1750 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1754 while (Sp^ <> ';') and (Sp^ <> #0) do
1761 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1769 Num := IsNumeric(Copy(Tp, 1, 1));
1770 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1771 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1775 SetString(S, Tp, Sp - Tp);
1780 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1781 //[Cp^ + Sp^, Cp - PChar(AStr)])
1791 // on E:EConvertError do
1792 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1793 // [Cp^ + Sp^, Cp - PChar(AStr)])
1795 SetLength(Result, Rp - PChar(Result));
1799 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1800 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1801 \return
\8eæ
\93¾
\82µ
\82½ URL
1803 function TGikoSys.GetHRefText(s: string): string;
1813 Index := AnsiPos('href', LowerCase(s));
1816 s := Trim(Copy(s, Index + 4, Length(s)));
1817 s := Trim(Copy(s, 2, Length(s)));
1819 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1820 //if Copy(s, 1, 1) = '"' then begin
1821 if s[1] = '"' then begin
1822 s := Trim(Copy(s, 2, Length(s)));
1825 Index := AnsiPos('"', s);
1826 if Index <> 0 then begin
1827 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1828 s := Copy(s, 1, Index - 1);
1830 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1831 Index := AnsiPos(' ', s);
1832 Index2 := AnsiPos('>', s);
1835 if Index > Index2 then
1838 s := Copy(s, 1, Index - 1)
1840 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1847 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1848 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1849 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1851 function TGikoSys.Is2chHost(Host: string): Boolean;
1853 HOST_NAME: array[0..1] of string = ('.2ch.net', '.bbspink.com');
1859 if RightStr( Host, 1 ) = '/' then
1860 Host := Copy( Host, 1, Length( Host ) - 1 );
1861 OutputDebugString(pchar(HOST_NAME[0]));
1862 for i := 0 to Length(HOST_NAME) - 1 do begin
1863 // Len := Length(HOST_NAME[i]);
1864 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1865 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1873 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1874 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1875 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1876 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1877 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1878 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1879 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1881 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1891 Index := AnsiPos(READ_PATH, path);
1892 if Index <> 0 then begin
1893 s := Copy(path, Index + Length(READ_PATH), Length(path));
1895 Index := AnsiPos(HTML_READ_PATH, path);
1896 if Index <> 0 then begin
1897 s := Copy(path, Index + Length(HTML_READ_PATH), Length(path));
1900 if Index <> 0 then begin
1901 if (Length(s) > 0) and (s[1] = '/') then
1903 BBSID := GetTokenIndex(s, '/', 0);
1904 BBSKey := GetTokenIndex(s, '/', 1);
1907 Result := (BBSID <> '') or (BBSKey <> '');
1910 Index := AnsiPos(KAKO_PATH, path);
1911 if Index <> 0 then begin
1912 s := Copy(path, 2, Length(path));
1913 BBSID := GetTokenIndex(s, '/', 0);
1914 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1915 BBSID := GetTokenIndex(s, '/', 1);
1916 BBSKey := ChangeFileExt(Document, '');
1917 Result := (BBSID <> '') or (BBSKey <> '');
1920 Index := AnsiPos('read.cgi?', URL);
1921 if Index <> 0 then begin
1922 SList := TStringList.Create;
1925 // s := HTMLDecode(Document);
1926 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1927 BBSID := SList.Values['bbs'];
1928 BBSKey := SList.Values['key'];
1929 Result := (BBSID <> '') or (BBSKey <> '');
1941 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1942 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1943 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1944 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1946 http://2ch.net/
\92\86\97ª/32-50 \n
1947 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1949 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1951 START_NAME : array[0..1] of String = ('st=', 'start=');
1952 END_NAME : array[0..1] of String = ('to=', 'end=');
1953 RES_NAME : array[0..0] of String = ('res=');
1959 bufList : TStringList;
1960 i, j, idx : Integer;
1962 URL := Trim(LowerCase(URL));
1963 for i := 0 to Length(START_NAME) -1 do begin
1964 idx := AnsiPos(START_NAME[i], URL);
1965 if (idx <> 0) then begin
1968 idx := AnsiPos(END_NAME[i], URL);
1969 if (idx <> 0) then begin
1975 if (idx <> 0) then begin
1976 idx := AnsiPos('?', URL);
1977 if (idx = 0) then begin
1978 idx := LastDelimiter('/', URL);
1982 bufList := TStringList.Create();
1984 bufList.Delimiter := '&';
1985 bufList.DelimitedText := Copy(URL, idx + 1, Length(URL));
1986 for i := 0 to bufList.Count - 1 do begin
1988 //
\8aJ
\8en
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
1989 if (stRes = 0) then begin
1990 for j := 0 to Length(START_NAME) - 1 do begin
1991 idx := AnsiPos(START_NAME[j], bufList[i]);
1992 if (idx = 1) then begin
1993 convBuf := Copy(bufList[i], idx + Length(START_NAME[j]), Length(bufList[i]));
1994 stRes := StrToInt64Def( convBuf, 0 );
1999 //
\8fI
\97¹
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
2000 if (convBuf = '') and (endRes = 0) then begin
2001 for j := 0 to Length(END_NAME) - 1 do begin
2002 idx := AnsiPos(END_NAME[j], bufList[i]);
2003 if (idx = 1) then begin
2004 convBuf := Copy(bufList[i], idx + Length(END_NAME[j]), Length(bufList[i]));
2005 endRes := StrToInt64Def( convBuf, 0 );
2010 //
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
2011 if ((stRes = 0) and (endRes = 0) and (convBuf = '')) then begin
2012 for j := 0 to Length(RES_NAME) - 1 do begin
2013 idx := AnsiPos(RES_NAME[j], bufList[i]);
2014 if (idx = 1) then begin
2015 convBuf := Copy(bufList[i], idx + Length(RES_NAME[j]), Length(bufList[i]));
2016 stRes := StrToInt64Def( convBuf, 0 );
2024 if (stRes <> 0) and (endRes = 0) then begin
2025 endRes := stRes + MAX_POPUP_RES;
2026 end else if (stRes = 0) and (endRes <> 0) then begin
2027 stRes := endRes - MAX_POPUP_RES;
2028 if stRes < 1 then begin
2036 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
2037 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
2038 if Length(buf) > 0 then begin
2039 if AnsiPos('-', buf) = 1 then begin
2044 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2045 convBuf := Copy( buf, 1, ps );
2046 if convBuf <> '' then begin
2047 endRes := StrToInt64Def(convBuf, 0);
2049 if endRes <> 0 then begin
2050 stRes := endRes - MAX_POPUP_RES;
2057 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2059 convBuf := Copy( buf, 1, ps );
2060 if convBuf <> '' then begin
2061 stRes := StrToInt64(convBuf);
2065 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2066 convBuf := Copy( buf, 1, ps );
2067 if convBuf <> '' then begin
2068 endRes := StrToInt64Def(convBuf, 0);
2083 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2084 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2085 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2087 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2092 // convBuf : String;
2103 URL := Trim(LowerCase(URL));
2108 Result.FFirst := False;
2109 Result.FStBegin := False;
2110 Result.FToEnd := False;
2111 Result.FDone := False;
2112 Result.FNoParam := False;
2116 if URL[length(URL)] = '\' then
2118 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2119 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2120 s := Copy(URL, RStart + RLength - 1, Length(URL));
2122 //
\95W
\8f\80\8f\91\8e®
2123 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2124 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2125 FAWKStr.RegExp := '/test/read.(cgi|html)/.+/[0-9]+/?.*';
2126 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2127 s := Copy(s, 15, Length(s));
2129 SList := TStringList.Create;
2132 FAWKStr.RegExp := '/';
2133 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2134 Result.FBBS := SList[1];
2135 Result.FKey := SList[2];
2136 if SList.Count >= 4 then
2140 Result.FNoParam := true;
2146 FAWKStr.LineSeparator := mcls_CRLF;
2147 FAWKStr.RegExp := '-';
2148 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2149 Result.FFirst := True;
2151 FAWKStr.RegExp := 'l[0-9]+';
2152 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2153 Result.FFirst := True;
2155 for i := 0 to SList.Count - 1 do begin
2156 if Trim(SList[i]) = '' then begin
2158 Result.FStBegin := True;
2159 if i = (SList.Count - 1) then
2160 Result.FToEnd := True;
2161 end else if IsNumeric(SList[i]) then begin
2162 wkInt := StrToInt(SList[i]);
2163 wkMax := Max(wkMax, wkInt);
2167 wkMin := Min(wkMin, wkInt);
2168 end else if Trim(SList[i]) = 'n' then begin
2169 Result.FFirst := True;
2171 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2172 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2173 if Copy(SList[i], 1, 1) = 'n' then
2174 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2176 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2177 Result.FFirst := True;
2178 wkMax := Max(wkMax, wkInt);
2182 wkMin := Min(wkMin, wkInt);
2186 if Result.FStBegin and (not Result.FToEnd) then
2188 else if (not Result.FStBegin) and Result.FToEnd then
2190 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2191 Result.FSt := wkMin;
2192 Result.FTo := wkMax;
2194 //Result.FSt := wkMin;
2195 //Result.FTo := wkMax;
2201 Result.FDone := True;
2205 //
\90Vkako
\8f\91\8e®
2206 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2207 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2208 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2209 SList := TStringList.Create;
2212 FAWKStr.RegExp := '/';
2213 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2214 Result.FBBS := SList[1];
2215 Result.FKey := ChangeFileExt(SList[5], '');
2216 Result.FFirst := True;
2222 Result.FDone := True;
2226 //
\8b\8ckako
\8f\91\8e®
2227 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2228 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2229 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2230 SList := TStringList.Create;
2233 FAWKStr.RegExp := '/';
2234 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2235 Result.FBBS := SList[1];
2236 Result.FKey := ChangeFileExt(SList[4], '');
2237 Result.FFirst := True;
2243 Result.FDone := True;
2247 //log
\8by
\82Ñlog2
\8f\91\8e®
2248 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2249 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2250 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2251 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2252 SList := TStringList.Create;
2255 FAWKStr.RegExp := '/';
2256 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2257 Result.FBBS := SList[2];
2258 Result.FKey := ChangeFileExt(SList[5], '');
2259 Result.FFirst := True;
2265 Result.FDone := True;
2270 //
\8b\8cURL
\8f\91\8e®
2271 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2272 FAWKStr.RegExp := '/test/read\.cgi\?';
2273 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2274 s := Copy(s, 16, Length(s));
2275 SList := TStringList.Create;
2278 FAWKStr.RegExp := '&';
2279 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2280 Result.FFirst := True;
2281 for i := 0 to SList.Count - 1 do begin
2282 if Pos('bbs=', SList[i]) = 1 then begin
2283 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2284 end else if Pos('key=', SList[i]) = 1 then begin
2285 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2286 end else if Pos('st=', SList[i]) = 1 then begin
2287 wk := Copy(SList[i], 4, Length(SList[i]));
2288 if IsNumeric(wk) then
2289 Result.FSt := StrToInt(wk)
2290 else if wk = '' then
2291 Result.FStBegin := True;
2292 end else if Pos('to=', SList[i]) = 1 then begin
2293 wk := Copy(SList[i], 4, Length(SList[i]));
2294 if IsNumeric(wk) then
2295 Result.FTo := StrToInt(wk)
2296 else if wk = '' then
2297 Result.FToEnd := True;
2298 end else if Pos('nofirst=', SList[i]) = 1 then begin
2299 Result.FFirst := False;
2308 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2309 Result.FDone := True;
2317 \brief URI
\82ð
\95ª
\89ð
2318 \param URL
\95ª
\89ð
\82·
\82é URI
2319 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2320 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2321 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2322 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2323 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2324 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2326 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2336 URI := TIdURI.Create(URL);
2338 Protocol := URI.Protocol;
2341 Document := URI.Document;
2343 Bookmark := URI.Bookmark;
2350 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2351 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2353 function TGikoSys.GetVersionBuild: Integer;
2355 FixedFileInfo: PVSFixedFileInfo;
2356 VersionHandle, VersionSize: DWORD;
2357 pVersionInfo: Pointer;
2362 AppFile := Application.ExeName;
2363 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2364 if VersionSize = 0 then
2366 GetMem(pVersionInfo, VersionSize);
2368 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2369 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2370 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2372 FreeMem(pVersionInfo, VersionSize);
2377 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2378 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2379 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2381 \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
2382 \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
2383 \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
2384 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2386 \97á(
\90³
\8bK
\89»
\91O):\n
2387 http://
\92\86\97ª/ \n
2388 http://
\92\86\97ª/20-100
2390 (
\90³
\8bK
\89»
\8cã):\n
2391 http://
\92\86\97ª/l50
2393 function TGikoSys.GetBrowsableThreadURL(
2397 threadItem : TThreadItem;
2398 boardPlugIn : TBoardPlugIn;
2403 //=====
\83v
\83\89\83O
\83C
\83\93
2405 for i := Length( BoardGroups ) - 1 downto 1 do begin
2406 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2407 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2408 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2409 if board <> nil then begin
2410 boardPlugIn := BoardGroups[i].BoardPlugIn;
2411 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2412 Result := threadItem.URL;
2421 // 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¢
2424 if Length( Result ) = 0 then
2425 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2430 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2431 \param inURL
\83X
\83\8c\83b
\83h URL
2434 function TGikoSys.GetThreadURL2BoardURL(
2438 threadItem : TThreadItem;
2439 boardPlugIn : TBoardPlugIn;
2444 //=====
\83v
\83\89\83O
\83C
\83\93
2446 for i := Length( BoardGroups ) - 1 downto 1 do begin
2447 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2448 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2449 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2450 boardPlugIn := BoardGroups[i].BoardPlugIn;
2451 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2452 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2460 // 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¢
2463 if Length( Result ) = 0 then
2464 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2469 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2470 \param inURL
\83X
\83\8c\83b
\83h URL
2472 \see TGikoSys.GetThreadURL2BoardURL
2474 function TGikoSys.Get2chThreadURL2BoardURL(
2478 Protocol, Host, Path, Document, Port, Bookmark : string;
2479 BBSID, BBSKey : string;
2483 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2484 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2486 foundPos := Pos( '/test/read.cgi', inURL );
2487 if {(Is2chHost(Host)) and} (foundPos > 0) then
2488 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2490 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2495 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2496 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2497 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2498 \see TGikoSys.GetBrowsableThreadURL
2500 function TGikoSys.Get2chBrowsableThreadURL(
2504 Protocol, Host, Path, Document, Port, Bookmark : string;
2505 BBSID, BBSKey : string;
2509 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2512 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2513 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2514 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2516 if Is2chHost( Host ) then begin
2517 Result := Protocol + '://' + Host +
2518 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2520 if foundPos > 0 then
2521 Result := Copy( inURL, 1, foundPos ) +
2522 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2524 Result := Protocol + '://' + Host +
2525 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2532 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2533 \param inBoard
\94Â URL
2534 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2535 \return
\83X
\83\8c\83b
\83h URL
2537 function TGikoSys.Get2chBoard2ThreadURL(
2545 server := UrlToServer( inBoard.URL );
2546 //if Is2chHost( server ) then
2547 if inBoard.Is2ch then
2548 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2550 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2555 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2557 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2559 procedure TGikoSys.ListBoardFile;
2561 boardFileList : TStringList;
2563 sCategory : TCategory;
2567 for i := 0 to Length( BBSs ) - 1 do
2571 SetLength( BBSs, 0 );
2574 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2575 if FileExists( GikoSys.GetBoardFileName ) then begin
2576 SetLength( BBSs, l + 1 );
2577 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2578 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2582 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2583 SetLength( BBSs, l + 1 );
2584 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2585 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2589 // Board
\83t
\83H
\83\8b\83_
2590 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2591 BoardFileList := TStringList.Create;
2593 BoardFileList.BeginUpdate;
2594 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*.txt', BoardFileList, True, True );
2595 BoardFileList.EndUpdate;
2596 SetLength( BBSs, l + BoardFileList.Count );
2597 for i := BoardFileList.Count - 1 downto 0 do begin
2598 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2599 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2607 //
\93Á
\8eê
\97p
\93rBBS
\90¶
\90¬
2608 //
\8aù
\82É
\91¶
\8dÝ
\82·
\82é
\8fê
\8d\87\82Í
\8dí
\8f\9c\82·
\82é
2609 DestorySpecialBBS(BoardGroup.SpecialBBS);
2610 SpecialBBS := TBBS.Create('');
2611 SpecialBBS.Title := '
\93Á
\8eê
\97p
\93r(
\94ñ
\95\
\8e¦)';
2612 sCategory := TCategory.Create;
2614 sCategory.Title := '
\93Á
\8eê
\97p
\93r(
\94ñ
\95\
\8e¦)';
2615 SpecialBBS.Add(sCategory);
2616 BoardGroup.SpecialBoard := TSpecialBoard.Create(nil, 'http://localhost/gikonavi/special/index.html');
2617 BoardGroup.SpecialBoard.Title := '
\83^
\83u
\88ê
\97\97';
2618 BoardGroup.SpecialBoard.IsThreadDatRead := True;
2619 sCategory.Add(BoardGroup.SpecialBoard);
2623 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2624 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2626 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2631 boardFile : TStringList;
2632 CategoryList : TStringList;
2633 BoardList : TStringList;
2634 Category : TCategory;
2638 // RoundItem : TRoundItem;
2640 i, iBound : Integer;
2641 j, jBound : Integer;
2642 k, kBound : Integer;
2645 if not FileExists( bbs.FilePath ) then
2649 ini := TMemIniFile.Create('');
2650 boardFile := TStringList.Create;
2653 boardFile.LoadFromFile( bbs.FilePath );
2655 ini.SetStrings( boardFile );
2656 CategoryList := TStringList.Create;
2657 BoardList := TStringList.Create;
2659 ini.ReadSections( CategoryList );
2661 iBound := CategoryList.Count - 1;
2662 for i := 0 to iBound do begin
2663 ini.ReadSection( CategoryList[i], BoardList );
2664 Category := TCategory.Create;
2665 Category.No := i + 1;
2666 Category.Title := CategoryList[i];
2668 jBound := BoardList.Count - 1;
2669 for j := 0 to jBound do begin
2671 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2672 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2673 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2674 //=====
\83v
\83\89\83O
\83C
\83\93
2676 kBound := Length(BoardGroups) - 1;
2677 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2678 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2679 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2680 if not BoardGroups[k].Find(inistr, p) then begin
2681 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2682 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2683 if not BoardGroups[k].Find(tmpstring, p) then begin
2685 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2686 BoardGroups[k].AddObject(tmpstring, Board);
2687 Category.Add(Board);
2689 //
\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é
2693 Board := TBoard(BoardGroups[k].Objects[p]);
2694 if Board.ParentCategory <> Category then
2695 Category.Add(Board);
2699 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2700 BoardGroups[k].AddObject(tmpstring, Board);
2701 Category.Add(Board);
2703 //
\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é
2708 Board := TBoard(BoardGroups[k].Objects[p]);
2709 if Board.ParentCategory <> Category then
2710 Category.Add(Board);
2717 // 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¢
2720 if (Board = nil) then begin
2721 if not BoardGroups[0].Find(inistr,p) then begin
2722 Board := TBoard.Create( nil, inistr );
2723 BoardGroups[0].AddObject(inistr, Board);
2724 Category.Add(Board);
2726 Board := TBoard(BoardGroups[0].Objects[p]);
2727 if Board.ParentCategory <> Category then
2728 Category.Add(Board);
2732 if (Board.Multiplicity = 0) then begin
2735 Board.Multiplicity := 1;
2736 Board.Title := BoardList[j];
2737 Board.RoundDate := ZERO_DATE;
2742 Board.Multiplicity := Board.Multiplicity + 1;
2747 bbs.Add( Category );
2752 bbs.IsBoardFileRead := True;
2765 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2766 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2768 function TGikoSys.GetUnknownCategory : TCategory;
2770 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2773 if Length( BBSs ) < 2 then begin
2778 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2779 if Result = nil then begin
2780 Result := TCategory.Create;
2781 Result.Title := UNKNOWN_CATEGORY;
2782 BBSs[ 1 ].Add( Result );
2788 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2789 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2791 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2793 category : TCategory;
2795 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2798 category := GetUnknownCategory;
2799 if category = nil then begin
2802 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2803 if Result = nil then begin
2804 Result := TBoard.Create( inPlugIn, inURL );
2805 Result.Title := UNKNOWN_BOARD;
2806 category.Add( Result );
2813 function TGikoSys.GetSambaFileName : string;
2815 Result := Setting.GetSambaFileName;
2818 \brief
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82Ö
\82Ì
\83A
\83\93\83J
\81[
\97pHTML
\8dì
\90¬
2819 \param Numbers
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86
2820 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2821 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2822 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2824 function TGikoSys.CreateResAnchor(
2825 var Numbers: TStringList; ThreadItem: TThreadItem;
2826 limited: Integer):string;
2830 ResLink : TResLinkRec;
2832 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2834 Res.FType := glt2chNew;
2837 if (Numbers <> nil) and (Numbers.Count > 0) then begin
2838 if (limited > 0) and (Numbers.Count > limited) then begin
2839 for i := Numbers.Count - limited to Numbers.Count - 1 do begin
2840 Res.FBody := Res.FBody + '>' + Numbers[i] + ' ';
2843 for i := 0 to Numbers.Count - 1 do begin
2844 Res.FBody := Res.FBody + '>' + Numbers[i] + ' ';
2847 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2848 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2849 HTMLCreater.ConvRes(@Res, @ResLink, false);
2850 Result := Res.FBody;
2855 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2856 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2857 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2858 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2860 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2863 ReadList: TStringList;
2865 boardPlugIn : TBoardPlugIn;
2867 procedure CheckSameID(const AID:String; const Target: String; no: Integer);
2871 pos := AnsiPos('id:', LowerCase(Target));
2872 if (pos > 0) then begin
2873 if(AnsiPos(AID, Copy(Target, pos-1, Length(Target))) > 0) then begin
2874 body.Add(IntToStr(no));
2877 if(AnsiPos(AID, Target) > 0) then begin
2878 body.Add(IntToStr(no));
2883 if (not IsNoValidID(AID)) and
2884 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2885 //if ThreadItem.IsBoardPlugInAvailable then begin
2886 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2887 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2888 //boardPlugIn := ThreadItem.BoardPlugIn;
2889 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2891 for i := 0 to threadItem.Count - 1 do begin
2893 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2894 CheckSameID(AID, Res.FDateTime, i+1);
2897 ReadList := TStringList.Create;
2899 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2900 for i := 0 to ReadList.Count - 1 do begin
2901 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2902 CheckSameID(AID, Res.FDateTime, i+1);
2912 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2913 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2914 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2915 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2917 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2921 AID := GetResID(AIDNum, ThreadItem);
2922 if not IsNoValidID(AID) then begin
2923 GetSameIDRes(AID, ThreadItem, body);
2927 \brief
\93\8a\8de ID
\8eæ
\93¾
2928 \param AIDNum
\93\8a\8de
\83\8c\83X
\94Ô
\8d\86
2929 \param ThreadItem
\93\8a\8de
\83X
\83\8c\83b
\83h
2930 \param body OUT:
\93\8a\8deID
2932 function TGikoSys.GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
2935 boardPlugIn : TBoardPlugIn;
2938 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2939 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2940 //if ThreadItem.IsBoardPlugInAvailable then begin
2941 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2942 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2943 //boardPlugIn := ThreadItem.BoardPlugIn;
2944 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2945 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2947 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2949 Result := ExtructResID(Res.FDateTime);
2953 \brief
\83\8c\83X
\82Ì
\8e\9e\8d\8f\95\94\82©
\82çID
\82ð
\92\8a\8fo
\82·
\82é
2954 \param ADateStr
\8e\9e\8d\8f\95\94\82Ì
\95¶
\8e\9a\97ñ
2955 \return ID(ID
\82Æ
\82Ý
\82È
\82¹
\82é
\95\94\95ª
\82ª
\82È
\82¢
\82Æ
\82«
\82Í
\8bó
\95¶
\8e\9a\97ñ)
2957 function TGikoSys.ExtructResID(ADateStr: String): String;
2959 stlist : TStringList;
2962 if AnsiPos('id', AnsiLowerCase(ADateStr)) > 0 then begin
2963 Result := Copy(ADateStr, AnsiPos('id', AnsiLowerCase(ADateStr)), Length(ADateStr));
2964 if AnsiPos(' ', Result) > 0 then begin
2965 Result := Copy(Result, 1, AnsiPos(' ', Result) - 1);
2967 Result := ' ' + Result;
2969 stlist := TStringList.Create;
2971 stList.Delimiter := ' ';
2972 stList.DelimitedText := ADateStr;
2973 //
\93ú
\95t
\8e\9e\8d\8f ID
\91¼
\81@
\82Æ
\8cÅ
\92è
\82Å
\8dl
\82¦
\82é
2974 if (stList.Count >= 3) then begin
2975 if Length(stList[3 - 1]) >= 7 then begin
2976 Result := stList[3 - 1];
2986 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
2987 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
2988 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
2990 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
2993 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
2994 Bayesian.CountWord( text, wordCount );
2999 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
3000 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3001 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
3002 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
3003 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
3004 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
3005 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
3007 \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
3008 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
3010 \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
3012 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
3015 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3016 Bayesian.Forget( wordCount, isSpam );
3021 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3022 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3023 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3025 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3028 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3029 Bayesian.Learn( wordCount, isSpam );
3034 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3035 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3036 \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)
3037 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3039 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3042 case Setting.SpamFilterAlgorithm of
3043 gsfaNone: Result := 0;
3044 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3045 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3046 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3053 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3054 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3056 [
\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Ì
3057 [
\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
3059 function TGikoSys.SetUserOptionalStyle(): string;
3062 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3063 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3064 if GikoSys.Setting.BrowserFontSize <> 0 then
3065 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3066 if GikoSys.Setting.BrowserFontColor <> -1 then
3067 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3068 if GikoSys.Setting.BrowserBackColor <> -1 then
3069 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3070 case GikoSys.Setting.BrowserFontBold of
3071 -1: Result := Result + 'font-weight:normal;';
3072 1: Result := Result + 'font-weight:bold;';
3074 case GikoSys.Setting.BrowserFontItalic of
3075 -1: Result := Result + 'font-style:normal;';
3076 1: Result := Result + 'font-style:italic;';
3081 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3082 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3083 \param ANum
\83\8c\83X
\94Ô
3084 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3085 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3087 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3090 BNum, BMark : string;
3092 p := AnsiPos('BE:', AnsiUpperCase(AID));
3094 BNum := Copy(AID, p, Length(AID));
3095 AID := Copy(AID, 1, p - 1);
3096 p := AnsiPos('-', BNum);
3098 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3099 BNum := Copy(BNum, 1, p - 1);
3102 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3103 + '" target=_blank>' + BMark + '</a>';
3109 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3110 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3111 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3113 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3115 Translation = '\VarFileInfo\Translation';
3116 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3118 BufSize, HWnd: DWORD;
3119 VerInfoBuf: Pointer;
3121 VerDataLen: Longword;
3124 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3125 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3126 if BufSize <> 0 then begin
3127 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3128 GetMem(VerInfoBuf, BufSize);
3130 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3131 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3132 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3134 if not (VerDataLen > 0) then
3135 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3137 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3138 //
\81¨'\StringFileInfo\027382\FileDescription'
3139 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3140 [IntToHex(Integer(VerData^) and $FFFF, 4),
3141 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3142 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3144 if VerDataLen > 0 then begin
3145 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3147 SetLength(result, VerDataLen);
3148 StrLCopy(PChar(result), VerData, VerDataLen);
3152 FreeMem(VerInfoBuf);
3158 \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
3159 \return 1
\8ds1plugin
3161 function TGikoSys.GetPluginsInfo(): String;
3164 major, minor, revision : Cardinal;
3165 agent, release : String;
3167 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3170 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3171 for i := 0 to Length(BoardGroups) - 1 do begin
3172 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3173 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3174 if BoardGroups[i].BoardPlugIn <> nil then begin
3175 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3178 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3180 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3186 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3187 function TGikoSys.GetIEVersion: string;
3191 R := TRegistry.Create;
3193 //
\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¢
3194 R.Access := KEY_EXECUTE;
3195 R.RootKey := HKEY_LOCAL_MACHINE;
3196 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3198 Result := R.ReadString('version');
3200 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3207 //! 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¼
3208 function TGikoSys.GetMainKeyFileName : String;
3210 Result := Setting.GetMainKeyFileName;
3212 //! 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¼
3213 function TGikoSys.GetEditorKeyFileName: String;
3215 Result := Setting.GetEditorKeyFileName;
3217 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3218 function TGikoSys.GetInputAssistFileName: String;
3220 Result := Setting.GetInputAssistFileName;
3222 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3223 procedure TGikoSys.SetGikoMessage;
3225 if FGikoMessage = nil then begin
3226 FGikoMessage := TGikoMessage.Create;
3231 if (Setting.GengoSupport) then begin
3233 if (FileExists(Setting.GetLanguageFileName)) then begin
3234 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3241 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3242 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3245 if FGikoMessage <> nil then begin
3246 Result := FGikoMessage.GetMessage(MesType);
3250 //Tue, 17 Dec 2002 12:18:07 GMT
\81¨ TDateTime
\82Ö
3251 //MonaUtils
\82©
\82ç
\88Ú
\93®
3252 function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime;
3253 function StrMonthToMonth(const s: string): integer;
3255 m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
3260 for i := Low(m) to High(m) do begin
3261 if (SameText(s, m[i])) then begin
3268 wDay, wMonth, wYear: word;
3269 wHour, wMinute, wSecond: word;
3273 wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0);
3274 wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2));
3275 wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0);
3276 sTime := ChooseString(DateStr, ' ', 4);
3277 wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0);
3278 wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0);
3279 wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0);
3280 d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0);
3283 //MonaUtils
\82©
\82ç
\88Ú
\93®
3284 //!
\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·
3285 function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string;
3291 for i := 0 to Index - 1 do begin
3292 if (AnsiPos(Separator, S) = 0) then S := ''
3293 else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S));
3295 p := AnsiPos(Separator, S);
3296 if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S;
3298 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
3299 procedure TGikoSys.RestoreThreadData(Board : TBoard);
3301 SECTION = 'Setting';
3303 TmpFileList : TStringList;
3306 ThreadItem : TThreadItem;
3307 Boardpath, tmpStr : string;
3309 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
3311 TmpFileList := TStringList.Create;
3312 TmpFileList.Sorted := True;
3313 TmpFileList.BeginUpdate;
3315 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
3316 GetFileList(Boardpath, '*.tmp', TmpFileList, False);
3317 TmpFileList.EndUpdate;
3318 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
3319 for i := TmpFileList.Count - 1 downto 0 do begin
3320 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
3321 if ThreadItem <> nil then begin
3322 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
3324 tmpStr := ini.ReadString(SECTION, 'RoundDate', DateTimeToStr(ZERO_DATE));
3325 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
3327 tmpStr := ini.ReadString(SECTION, 'LastModified', DateTimeToStr(ZERO_DATE));
3328 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
3329 ThreadItem.Count := ini.ReadInteger(SECTION, 'Count', 0);
3330 ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
3332 ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
3333 ThreadItem.IsLogFile := FileExists(ThreadItem.GetThreadFileName);
3334 if(ThreadItem.Size = 0) and (ThreadItem.IsLogFile) then begin
3336 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
3341 //
\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ã
3342 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
3343 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
3344 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
3345 ThreadItem.ScrollTop := ini.ReadInteger(SECTION, 'ScrollTop', 0);
3346 ThreadItem.AllResCount := ini.ReadInteger(SECTION, 'AllResCount', ThreadItem.Count);
3347 ThreadItem.NewResCount := ini.ReadInteger(SECTION, 'NewResCount', 0);
3348 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger(SECTION, 'AgeSage', Ord(gasNone)));
3352 DeleteFile(Boardpath + TmpFileList[i]);
3361 \brief User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
3362 \return Boolean
\97\98\97p
\82Å
\82«
\82é
\8fê
\8d\87\82ÍTrue
3364 function TGikoSys.CanUser32DLL: Boolean;
3372 hUser32 := LoadLibrary('User32.dll');
3373 if hUser32 <> 0 then begin
3380 FreeLibrary(hUser32);
3384 \brief OE
\88ø
\97p
\95\84\8eæ
\93¾
3385 \return OE
\82Ì
\88ø
\97p
\95\84\81i
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87\82Í'>')
3387 function TGikoSys.GetOEIndentChar : string;
3390 Identities : string;
3393 DEFAULT_CHAR = '> ';
3394 OE_MAIL_PATH = '\Software\Microsoft\Outlook Express\5.0\Mail';
3395 INDENT_CHAR = 'Indent Char';
3398 Result := DEFAULT_CHAR;
3399 regKey := TRegistry.Create;
3402 regKey.RootKey := HKEY_CURRENT_USER;
3403 if not regKey.OpenKey( 'Identities', False ) then
3405 Identities := regKey.ReadString( 'Default User ID' );
3406 if Identities = '' then
3408 if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then
3410 IndentChar := regKey.ReadInteger( INDENT_CHAR );
3411 Result := Char( IndentChar ) + ' ';
3419 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3420 function TGikoSys.GetReplaceFileName: String;
3422 Result := Setting.GetReplaceFileName;
3424 //!
\83v
\83\8c\83r
\83\85\81[
\8ag
\92£
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3425 function TGikoSys.GetExtpreviewFileName: String;
3427 Result := Setting.GetExtprevieFileName;
3430 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
3431 function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime;
3436 //
\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
3437 tmp := ChangeFileExt(FileName, '');
3438 if AnsiPos('_', tmp) <> 0 then
3439 if AnsiPos('_', tmp) > 9 then
3440 tmp := Copy(tmp, 1, AnsiPos('_', tmp)-1)
3442 Delete(tmp, AnsiPos('_', tmp), 1);
3444 if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
3445 Insert('1', tmp, 1);
3447 unixtime := StrToInt64Def(tmp, ZERO_DATE);
3448 Result := UnixToDateTime(unixtime) + OffsetFromUTC;
3451 procedure TGikoSys.ShowRefCount(msg: String; unk: IUnknown);
3457 if not Assigned(unk) then
3463 count := unk._Release;
3465 Writeln(msg + ' RefCount=' + IntToStr(count));
3467 Writeln(msg + ' RefCount=exception!!');
3471 function TGikoSys.GetBoukenCookie(AURL: String): String;
3473 Protocol, Host, Path, Document, Port,Bookmark : String;
3476 GikoSys.ParseURI(AURL, Protocol, Host, Path, Document, Port,Bookmark);
3477 if ( Length(Host) > 0 ) then begin
3478 Result := Setting.GetBoukenCookie(Host);
3481 procedure TGikoSys.SetBoukenCookie(ACookieValue, ADomain: String);
3483 if ( Length(ADomain) > 0 ) then begin
3484 Setting.SetBoukenCookie(ACookieValue, ADomain);
3487 //!
\96`
\8c¯
\82Ì
\8f\91Domain
\88ê
\97\97\8eæ
\93¾
3488 procedure TGikoSys.GetBoukenDomain(var ADomain: TStringList);
3493 for i := 0 to Setting.BoukenCookieList.Count - 1 do begin
3494 ADomain.Add( Setting.BoukenCookieList.Names[i] );
3497 //!
\96`
\8c¯
\82Ì
\8f\91Cookie
\8dí
\8f\9c
3498 procedure TGikoSys.DelBoukenCookie(ADomain: String);
3502 for i := 0 to Setting.BoukenCookieList.Count - 1 do begin
3503 if ( Setting.BoukenCookieList.Names[i] = ADomain ) then begin
3504 Setting.BoukenCookieList.Delete(i);
3509 function TGikoSys.GetBouken(AURL: String; var Domain: String): String;
3511 Protocol, Host, Path, Document, Port,Bookmark : String;
3516 GikoSys.ParseURI(AURL, Protocol, Host, Path, Document, Port,Bookmark);
3517 if ( Length(Host) > 0 ) then begin
3518 Setting.GetBouken(Host, Domain, Cookie);
3524 GikoSys := TGikoSys.Create;
3527 if GikoSys <> nil then begin
3528 FreeAndNil(GikoSys);