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 TrimThreadTitle(const SrcTitle: string): string;
192 function BoolToInt(b: Boolean): Integer;
193 function IntToBool(i: Integer): Boolean;
194 function GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
195 procedure LoadKeySetting(ActionList: TActionList; FileName: String);
196 procedure SaveKeySetting(ActionList: TActionList; FileName: String);
197 procedure CreateProcess(const AppPath: string; const Param: string);
198 procedure OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
199 function HTMLDecode(const AStr: String): String;
200 function GetHRefText(s: string): string;
201 function Is2chHost(Host: string): Boolean;
202 function Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
203 function Parse2chURL2(URL: string): TPathRec;
204 procedure ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
205 function GetVersionBuild: Integer;
206 function GetBrowsableThreadURL( inURL : string ) : string;
207 function GetThreadURL2BoardURL( inURL : string ) : string;
208 function Get2chThreadURL2BoardURL( inURL : string ) : string;
209 function Get2chBrowsableThreadURL( inURL : string ) : string;
210 function Get2chBoard2ThreadURL( inBoard : TBoard; inKey : string ) : string;
211 procedure ListBoardFile;
212 procedure ReadBoardFile( bbs : TBBS );
214 function GetUnknownCategory : TCategory;
215 function GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
217 procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
219 property Bayesian : TGikoBayesian read FBayesian write FBayesian;
220 function CreateResAnchor(var Numbers: TStringList; ThreadItem: TThreadItem; limited: Integer):string;
221 procedure GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList); overload;
222 procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
223 function GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
224 function ExtructResID(ADateStr: String): String;
226 procedure SpamCountWord( const text : string; wordCount : TWordCount );
227 //!
\8aw
\8fK
\83N
\83\8a\83A
228 procedure SpamForget( wordCount : TWordCount; isSpam : Boolean );
229 //!
\83X
\83p
\83\80\8aw
\8fK
230 procedure SpamLearn( wordCount : TWordCount; isSpam : Boolean );
231 //!
\83X
\83p
\83\80\93x
\90\94
232 function SpamParse( const text : string; wordCount : TWordCount ) : Extended;
234 //!
\88ø
\90\94\82É
\91\97\82ç
\82ê
\82Ä
\82«
\82½
\93ú
\95t/ID
\95\94\82ÉBE
\82Ì
\95¶
\8e\9a\97ñ
\82ª
\82 \82Á
\82½
\82ç
\81A
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83\8a\83\93\83N
\82ð
\92Ç
\89Á
235 function AddBeProfileLink(AID : string; ANum: Integer): string;
236 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
237 function GetVersionInfo(KeyWord: TVerResourceKey): string;
238 //! Plugin
\82Ì
\8fî
\95ñ
\82Ì
\8eæ
\93¾
239 function GetPluginsInfo(): string;
240 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
241 function GetIEVersion: string;
242 function SetUserOptionalStyle(): string;
243 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
244 procedure SetGikoMessage;
245 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
246 function GetGikoMessage(MesType: TGikoMessageListType): String;
247 //! GMT
\82Ì
\8e\9e\8d\8f\82ðTDateTime
\82É
\95Ï
\8a·
\82·
\82é
248 function DateStrToDateTime(const DateStr: string): TDateTime;
249 //! User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
250 function CanUser32DLL: Boolean;
251 //! OE
\88ø
\97p
\95\84\8eæ
\93¾
252 function GetOEIndentChar : string;
253 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
254 function GetReplaceFileName: String;
255 //!
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
256 procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: boolean = True);
257 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
258 function GetCreateDateFromName(FileName: String): TDateTime;
259 function GetExtpreviewFileName: String;
261 procedure ShowRefCount(msg: String; unk: IUnknown);
262 //!
\96`
\8c¯
\82Ì
\8f\91Cookie
\8eæ
\93¾
263 function GetBoukenCookie(AURL: String): String;
264 //!
\96`
\8c¯
\82Ì
\8f\91Cookie
\90Ý
\92è
265 procedure SetBoukenCookie(ACookieValue, ADomain: String);
266 //!
\96`
\8c¯
\82Ì
\8f\91Cookie
\8dí
\8f\9c
267 procedure DelBoukenCookie(ADomain: String);
268 //!
\96`
\8c¯
\82Ì
\8f\91Domain
\88ê
\97\97\8eæ
\93¾
269 procedure GetBoukenDomain(var ADomain: TStringList);
270 //!
\96`
\8c¯
\82Ì
\8f\91\83h
\83\81\83C
\83\93\96¼Cookie
\8eæ
\93¾
271 function GetBouken(AURL: String; var Domain: String): String;
277 //LENGTH_RESTITLE = 40;
278 ZERO_DATE: Integer = 25569;
279 BETA_VERSION_NAME_E = 'beta';
280 BETA_VERSION_NAME_J = 'ÊÞÀ';
282 BETA_VERSION_BUILD = ''; //!< debug
\94Å
\82È
\82Ç
283 APP_NAME = 'gikoNavi';
284 BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
290 Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils, Sort, YofUtils,
291 IniFiles, DateUtils, SkinFiles;
294 FOLDER_INDEX_VERSION = '1.01';
295 USER_AGENT = 'Monazilla';
296 DEFAULT_NGWORD_FILE_NAME : String = 'NGword.txt';
297 NGWORDs_DIR_NAME : String = 'NGwords';
299 READ_PATH: string = '/test/read.cgi/';
300 HTML_READ_PATH: string = '/test/read.html/';
301 OLD_READ_PATH: string = '/test/read.cgi?';
302 KAKO_PATH: string = '/kako/';
304 KeyWordStr: array [TVerResourceKey] of String = (
318 // *************************************************************************
319 //! GikoSys
\83R
\83\93\83X
\83g
\83\89\83N
\83^
320 // *************************************************************************
321 constructor TGikoSys.Create;
324 FSetting := TSetting.Create;
325 FDolib := TDolib.Create;
326 FBelib := TBelib.Create;
327 FAWKStr := TAWKStr.Create(nil);
328 if DirectoryExists(GetConfigDir) = false then begin
329 CreateDir(GetConfigDir);
331 FAbon := TAbon.Create;
332 FAbon.IgnoreKana := FSetting.IgnoreKana;
333 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
335 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
336 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
337 FAbon.DeleteSyria := FSetting.DeleteSyria;
338 FAbon.Deleterlo := FSetting.AbonDeleterlo;
339 FAbon.Replaceul := FSetting.AbonReplaceul;
340 FAbon.AbonPopupRes := FSetting.PopUpAbon;
342 FSelectResFilter := TAbon.Create;
343 FSelectResFilter.IgnoreKana := True;
344 //
\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
345 FSelectResFilter.AbonString := '';
347 ResRange := FSetting.ResRange;
348 FVersion := Trim(GetVersionInfo(vrFileVersion));
349 FBayesian := TGikoBayesian.Create;
350 //FBoardURLList := TStringList.Create;
351 //
\83\81\83b
\83Z
\81[
\83W
\82Ì
\8dì
\90¬
352 FGikoMessage := TGikoMessage.Create;
355 // *************************************************************************
356 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
357 // *************************************************************************
358 destructor TGikoSys.Destroy;
361 FileList: TStringList;
363 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
364 FileList := TStringList.Create;
366 FileList.BeginUpdate;
367 GetFileList(GetTempFolder, '*.html', FileList, False, True);
369 for i := 0 to FileList.Count - 1 do begin
370 DeleteFile(FileList[i]);
375 FreeAndNil(FGikoMessage);
376 FreeAndNil(FBayesian);
377 FreeAndNil(FSelectResFilter);
382 FreeAndNil(FSetting);
387 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
388 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
389 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
392 function TGikoSys.IsNumeric(s: string): boolean;
403 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
404 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
405 \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
407 function TGikoSys.IsFloat(s: string): boolean;
411 Result := TextToFloat(PChar(s), v, fvExtended);
414 // *************************************************************************
415 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
416 // *************************************************************************
417 function TGikoSys.GetBoardFileName: string;
419 Result := Setting.GetBoardFileName;
422 // *************************************************************************
423 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
424 // *************************************************************************
425 function TGikoSys.GetCustomBoardFileName: string;
427 Result := Setting.GetCustomBoardFileName;
430 // *************************************************************************
431 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
432 // *************************************************************************
433 function TGikoSys.GetHtmlTempFileName: string;
435 Result := Setting.GetHtmlTempFileName;
439 // *************************************************************************
440 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
441 // *************************************************************************
442 function TGikoSys.GetAppDir: string;
444 Result := Setting.GetAppDir;
447 // *************************************************************************
448 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
449 // *************************************************************************
450 function TGikoSys.GetTempFolder: string;
452 Result := Setting.GetTempFolder;
455 // *************************************************************************
456 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
457 // *************************************************************************)
458 function TGikoSys.GetSentFileName: string;
460 Result := Setting.GetSentFileName;
463 // *************************************************************************
464 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
465 // *************************************************************************
466 function TGikoSys.GetOutBoxFileName: string;
468 Result := Setting.GetOutBoxFileName;
471 // *************************************************************************
472 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
473 // *************************************************************************
474 function TGikoSys.GetConfigDir: string;
476 Result := Setting.GetConfigDir;
479 function TGikoSys.GetNGWordsDir: string;
481 Result := Setting.GetConfigDir + NGWORDs_DIR_NAME;
485 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
486 function TGikoSys.GetStyleSheetDir: string;
488 Result := Setting.GetStyleSheetDir;
491 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
492 function TGikoSys.GetSkinDir: string;
494 Result := Setting.GetSkinDir;
497 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
498 function TGikoSys.GetSkinHeaderFileName: string;
500 Result := Setting.SkinFiles.GetSkinHeaderFileName;
503 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
504 function TGikoSys.GetSkinFooterFileName: string;
506 Result := Setting.SkinFiles.GetSkinFooterFileName;
509 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
510 function TGikoSys.GetSkinNewResFileName: string;
512 Result := Setting.SkinFiles.GetSkinNewResFileName;
515 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
516 function TGikoSys.GetSkinResFileName: string;
518 Result := Setting.SkinFiles.GetSkinResFileName;
521 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
522 function TGikoSys.GetSkinBookmarkFileName: string;
524 Result := Setting.SkinFiles.GetSkinBookmarkFileName;
527 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
528 function TGikoSys.GetSkinNewmarkFileName: string;
530 Result := Setting.SkinFiles.GetSkinNewmarkFileName;
533 //! UserAgent
\8eæ
\93¾
534 function TGikoSys.GetUserAgent: string;
536 if Dolib.Connected then begin
537 Result := Format('%s %s/%s%d/%s', [
544 Result := Format('%s/%s %s/%s%d/%s', [
555 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
556 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
557 \return val
\82ð
\8e¦
\82· TDateTime
559 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
561 Result := ZERO_DATE + val / 86400.0;
565 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
566 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
567 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
569 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
571 Result := Trunc((ADate - ZERO_DATE) * 86400);
576 \brief Subject
\83t
\83@
\83C
\83\8bRead
577 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
579 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
581 ThreadItem: TThreadItem;
583 FileList: TStringList;
592 datFileCheck: Boolean;
594 FavoThreadItem : TFavoriteThreadItem;
604 if Board.IsThreadDatRead then
608 usePlugIn := Board.IsBoardPlugInAvailable;
609 //server := UrlToServer( Board.URL );
610 //
\83X
\83\8c\83b
\83h
\82Å
\8b¤
\92Ê
\82ÌURL
\95\94
611 if Board.is2ch then begin
612 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi/' + Board.BBSID + '/';
614 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi?bbs=' + Board.BBSID + '&key=';
617 FileName := Board.GetFolderIndexFileName;
620 datFileCheck := (Setting.CheckDatFile) or (not FileExists(FileName));
621 if (datFileCheck) then begin
622 FileList := TStringList.Create;
623 FileList.Sorted := True;
624 FileList.BeginUpdate;
625 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
626 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
630 //
\8fd
\95¡
\82ð
\96h
\82®
632 Board.Sorted := True;
633 sl := TStringList.Create;
635 if FileExists(FileName) then begin
636 sl.LoadFromFile(FileName);
637 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
638 for i := sl.Count - 1 downto 1 do begin
639 Rec := ParseIndexLine(sl[i]);
640 if (datFileCheck) then begin
641 islog := FileList.Find( Rec.FFileName, Index );
643 islog := (Rec.FSize <> 0) and (Rec.FCount <> 0);
646 ThreadItem := TThreadItem.Create(
649 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
651 if Board.is2ch then begin
652 ThreadItem := TThreadItem.Create(
655 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
660 ThreadItem := TThreadItem.Create(
663 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
670 //ThreadItem.BeginUpdate;
671 if (datFileCheck) and (islog) then
672 FileList.Delete( Index );
674 ThreadItem.No := Rec.FNo;
675 ThreadItem.FileName := Rec.FFileName;
676 ThreadItem.Title := MojuUtils.UnSanitize(Rec.FTitle);
677 ThreadItem.Count := Rec.FCount;
678 ThreadItem.Size := Rec.FSize;
679 ThreadItem.RoundDate := Rec.FRoundDate;
680 ThreadItem.LastModified := Rec.FLastModified;
681 ThreadItem.Kokomade := Rec.FKokomade;
682 ThreadItem.NewReceive := Rec.FNewReceive;
683 ThreadItem.UnRead := Rec.FUnRead;
684 ThreadItem.ScrollTop := Rec.FScrollTop;
685 ThreadItem.AllResCount := Rec.FAllResCount;
686 ThreadItem.NewResCount := Rec.FNewResCount;
687 ThreadItem.AgeSage := Rec.FAgeSage;
688 ThreadItem.ParentBoard := Board;
689 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
691 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
692 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
695 //ThreadItem.EndUpdate;
696 Board.Add(ThreadItem);
698 if (ThreadItem.UnRead) and (ThreadItem.IsLogFile) then
703 if UnRead <> Board.UnRead then
704 Board.UnRead := UnRead;
706 if (datFileCheck) then begin
707 //
\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
708 AddOutofIndexDat(Board, FileList);
712 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
713 RestoreThreadData( Board );
716 if (datFileCheck) then begin
719 Board.Sorted := False;
721 Board.IsThreadDatRead := True;
723 rt := GetTickCount - st;
724 Writeln('Read Done.' + Board.Title + ':' + IntToStr(rt) + ' ms');
728 \brief
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
729 \param Board
\92Ç
\89Á
\82·
\82é
\94Â
730 \param DatList dat
\83t
\83@
\83C
\83\8b\96¼
732 procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: Boolean = True);
735 Boardpath,FileName : String;
737 ThreadItem: TThreadItem;
741 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
742 //
\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
743 for i := 0 to DatList.Count - 1 do begin
744 FileName := Boardpath + DatList[i];
746 if (not AllCreate) then begin
748 ThreadItem := Board.FindThreadFromFileName(DatList[i]);
749 if (ThreadItem = nil) then begin
752 if Board.IsBoardPlugInAvailable then begin
753 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
755 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
759 if (ThreadItem = nil) then begin
760 if Board.IsBoardPlugInAvailable then begin
761 ThreadItem := TThreadItem.Create(
764 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
765 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
767 ThreadItem := TThreadItem.Create(
770 Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
771 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
776 ThreadItem.BeginUpdate;
777 ThreadItem.FileName := DatList[i];
778 //ThreadItem.FilePath := FileName;
779 ThreadItem.No := Board.Count + 1;
780 ThreadItem.Title := ResRec.FTitle;
781 ThreadItem.Count := GetFileLineCount(FileName);
782 ThreadItem.AllResCount := ThreadItem.Count;
783 ThreadItem.NewResCount := ThreadItem.Count;
784 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é
785 ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) );
786 ThreadItem.LastModified := ThreadItem.RoundDate;
787 ThreadItem.Kokomade := -1;
788 ThreadItem.NewReceive := 0;
789 ThreadItem.ParentBoard := Board;
790 ThreadItem.IsLogFile := True;
791 ThreadItem.Round := False;
792 ThreadItem.UnRead := False;
793 ThreadItem.ScrollTop := 0;
794 ThreadItem.AgeSage := gasNone;
795 ThreadItem.EndUpdate;
796 if (AllCreate) or (create) then begin
797 Board.Add(ThreadItem);
802 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
803 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
805 procedure TGikoSys.CreateThreadDat(Board: TBoard);
809 SubjectList: TStringList;
815 if not FileExists(Board.GetSubjectFileName) then Exit;
816 FileName := Board.GetFolderIndexFileName;
818 SubjectList := TStringList.Create;
820 SubjectList.LoadFromFile(Board.GetSubjectFileName);
821 sl := TStringList.Create;
825 sl.Add(FOLDER_INDEX_VERSION);
826 for i := 0 to SubjectList.Count - 1 do begin
827 Rec := DivideSubject(SubjectList[i]);
829 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
832 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
833 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
834 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
835 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
836 + Format('%x', [0]) + #1 //size
837 + Format('%x', [0]) + #1 //RoundDate
838 + Format('%x', [0]) + #1 //LastModified
839 + Format('%x', [0]) + #1 //Kokomade
840 + Format('%x', [0]) + #1 //NewReceive
841 + '0' + #1 //
\96¢
\8eg
\97p
842 + Format('%x', [0]) + #1 //UnRead
843 + Format('%x', [0]) + #1 //ScrollTop
844 + Format('%x', [Rec.FCount]) + #1 //AllResCount
845 + Format('%x', [0]) + #1 //NewResCount
846 + Format('%x', [0]); //AgeSage
848 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
849 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
851 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
852 MojuUtils.Sanitize(Rec.FTitle), //
\83^
\83C
\83g
\83\8b
853 Rec.FCount, //
\83J
\83E
\83\93\83g
862 Rec.FCount, //AllResCount
871 sl.SaveToFile(FileName);
881 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
882 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
884 procedure TGikoSys.WriteThreadDat(Board: TBoard);
886 // Values: array[Boolean] of string = ('0', '1');
892 TmpFileList: TStringList;
894 if not Board.IsThreadDatRead then
896 FileName := Board.GetFolderIndexFileName;
897 ForceDirectoriesEx( ExtractFilePath( FileName ) );
899 sl := TStringList.Create;
900 TmpFileList := TStringList.Create;
901 TmpFileList.Sorted := true;
903 TmpFileList.BeginUpdate;
904 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
905 TmpFileList.EndUpdate;
907 sl.Add(FOLDER_INDEX_VERSION);
909 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
910 Sort.SetSortNoFlag(true);
911 Sort.SetSortOrder(true);
912 Sort.SetSortIndex(0);
913 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
914 Board.CustomSort(ThreadItemSortProc);
916 for i := 0 to Board.Count - 1 do begin
917 Board.Items[i].No := i + 1;
918 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
919 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
920 [Board.Items[i].No, //
\94Ô
\8d\86
921 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
922 MojuUtils.Sanitize(Board.Items[i].Title), //
\83^
\83C
\83g
\83\8b
923 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
924 Board.Items[i].Size, //size
925 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
926 DateTimeToInt(Board.Items[i].LastModified), //LastModified
927 Board.Items[i].Kokomade, //Kokomade
928 Board.Items[i].NewReceive, //NewReceive
930 BoolToInt(Board.Items[i].UnRead), //UnRead
931 Board.Items[i].ScrollTop, //ScrollTop
932 Board.Items[i].AllResCount, //AllResCount
933 Board.Items[i].NewResCount, //NewResCount
934 Ord(Board.Items[i].AgeSage)] //AgeSage
940 sl.SaveToFile(FileName);
942 for i := 0 to TmpFileList.Count - 1 do begin
943 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
953 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
954 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
955 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
957 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
959 Result.FNo := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
960 Result.FFileName := MojuUtils.RemoveToken(Line, #1);
961 Result.FTitle := MojuUtils.UnSanitize(MojuUtils.RemoveToken(Line, #1));
962 Result.FCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
963 Result.FSize := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
964 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
965 Result.FLastModified := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
966 Result.FKokomade := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), -1);
967 Result.FNewReceive := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
968 MojuUtils.RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
969 Result.FUnRead := IntToBool(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
970 Result.FScrollTop := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
971 Result.FAllResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
972 Result.FNewResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
973 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
978 \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é
979 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
980 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
981 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
982 \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
983 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
985 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
986 \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
990 GetFileList('c:\', '*.txt', list, True, True);
993 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
996 SearchRec : TSearchRec;
999 Path := IncludeTrailingPathDelimiter(Path);
1000 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
1002 while rc = 0 do begin
1003 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1004 s := Path + SearchRec.Name;
1006 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
1010 List.Add(SearchRec.Name);
1011 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1012 GetFileList(s, Mask, List, True, IsPathAdd);
1014 rc := FindNext(SearchRec);
1017 SysUtils.FindClose(SearchRec);
1023 \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
1024 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
1025 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1026 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
1027 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1028 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
1029 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
1032 GetFileList('c:\', '*.txt', list, True);
1035 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
1038 SearchRec : TSearchRec;
1040 Path := IncludeTrailingPathDelimiter(Path);
1041 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
1043 while rc = 0 do begin
1044 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1045 if (SearchRec.Attr and faDirectory = 0) then begin
1046 if IsPathAdd then begin
1047 List.Add(Path + SearchRec.Name)
1049 List.Add(SearchRec.Name);
1053 rc := FindNext(SearchRec);
1056 SysUtils.FindClose(SearchRec);
1062 \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é
1063 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1064 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1065 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1066 \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
1068 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1069 \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
1073 GetDirectoryList('c:\', '*.txt', list, True);
1076 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1079 SearchRec : TSearchRec;
1082 Path := IncludeTrailingPathDelimiter(Path);
1083 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1085 while rc = 0 do begin
1086 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1087 s := Path + SearchRec.Name;
1088 //if (SearchRec.Attr and faDirectory > 0) then
1089 // s := IncludeTrailingPathDelimiter(s)
1091 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1092 List.Add( IncludeTrailingPathDelimiter( s ) );
1093 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1094 GetDirectoryList(s, Mask, List, True);
1096 rc := FindNext(SearchRec);
1099 SysUtils.FindClose(SearchRec);
1105 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1106 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1107 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1109 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1119 if AnsiPos('<>', Line) = 0 then
1123 Result.FFileName := MojuUtils.RemoveToken(Line, Delim);
1124 Result.FTitle := Trim(MojuUtils.RemoveToken(Line, Delim));
1126 ws := Result.FTitle;
1127 if Copy(ws, Length(ws), 1) = ')' then begin
1130 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1133 end else if Copy(ws, Length(ws), 1) = '>' then begin
1137 for i := Length(ws) - 1 downto 1 do begin
1138 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1139 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1140 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1141 if IsNumeric(ws) then
1142 Result.FCount := StrToInt(ws);
1143 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1150 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1151 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1154 function TGikoSys.UrlToID(url: string): string;
1161 if url = '' then Exit;
1163 url := Copy(url, 0, Length(url) - 1);
1164 for i := Length(url) downto 0 do begin
1165 if url[i] = '/' then begin
1166 Result := Copy(url, i + 1, Length(url));
1176 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1177 \param url
\89ð
\8eß
\82·
\82é URL
1178 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1180 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1182 function TGikoSys.UrlToServer(url: string): string;
1189 wsURL := Trim(wsURL);
1191 if wsURL = '' then exit;
1193 if Copy(wsURL, Length(wsURL), 1) = '/' then
1194 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1196 for i := Length(wsURL) downto 0 do begin
1197 if wsURL[i] = '/' then begin
1198 Result := Copy(wsURL, 0, i);
1205 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1206 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1207 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1209 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1213 Code := GetFileAttributes(PChar(Name));
1214 Result := (Code <> Cardinal(-1)) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1218 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1219 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1220 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1222 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1225 if Length(Dir) = 0 then
1226 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1227 Dir := ExcludeTrailingPathDelimiter(Dir);
1228 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1229 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1230 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1234 \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
1235 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1236 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1237 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1238 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1239 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1240 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1242 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1246 Result := StrTokNext(sep, Rec);
1250 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1251 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1252 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1253 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1254 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1255 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1257 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1264 if Len >= Pos then begin
1265 while (Pos <= Len) and (Str[Pos] in sep) do begin
1269 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1270 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1275 Result := Copy(Str, I, Pos - I);
1276 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1284 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1285 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1286 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1288 function TGikoSys.GetFileSize(FileName : string): longint;
1293 if not FileExists(FileName) then begin
1297 Assign(F, FileName);
1299 Result := FileSize(F);
1307 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1308 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1310 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1312 function TGikoSys.GetFileLineCount(FileName : string): longint;
1316 sl := TStringList.Create;
1319 sl.LoadFromFile(FileName);
1331 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1332 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1333 \param Line
\8ew
\92è
\8ds
1334 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1335 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1337 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1339 fileTmp : TStringList;
1342 if FileExists(FileName) then begin
1343 fileTmp := TStringList.Create;
1346 fileTmp.LoadFromFile( FileName );
1347 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1348 Result := fileTmp.Strings[ Line-1 ];
1351 //on EFOpenError do Result := '';
1360 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1361 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1363 procedure TGikoSys.MenuFont(Font: TFont);
1366 nm: NONCLIENTMETRICS;
1368 nm.cbSize := sizeof(NONCLIENTMETRICS);
1369 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1370 lf := nm.lfMenuFont;
1371 Font.Name := lf.lfFaceName;
1372 Font.Height := lf.lfHeight;
1374 if lf.lfWeight >= 700 then
1375 Font.Style := Font.Style + [fsBold];
1376 if lf.lfItalic = 1 then
1377 Font.Style := Font.Style + [fsItalic];
1381 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1382 \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ñ
1383 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1384 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1386 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1388 {function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1392 p := AnsiPos(delimiter, s);
1396 Result := Copy(s, 1, p - 1);
1397 Delete(s, 1, Length(Result) + Length(delimiter));
1402 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1403 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1404 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1405 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1407 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1409 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1414 for i := 0 to index do
1415 Result := MojuUtils.RemoveToken(s, delimiter);
1419 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1420 {procedure TGikoSys.FlashExitWrite;
1424 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1425 for i := 0 to FExitWrite.Count - 1 do
1426 WriteThreadDat(FExitWrite[i]);
1431 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1432 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1433 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1434 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1438 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1440 ERASECHAR : array [1..39] of string =
1441 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1442 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1443 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1444 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1446 Chr : array [0..255] of char;
1450 s := TrimThreadTitle(Trim(LongName));
1451 if (Length(s) <= ALength) then begin
1455 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1456 S := CustomStringReplace(S, ERASECHAR[i], '');
1458 if (Length(S) <= ALength) then begin
1461 Windows.LCMapString(
1462 GetUserDefaultLCID(),
1470 S := Copy(S,1,ALength);
1472 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1473 S := Copy(S, 1, Length(S) - 1);
1483 function TGikoSys.TrimThreadTitle(const SrcTitle: string): string;
1485 TRIM_STRING: array [1..4] of String =
1486 ('[
\93]
\8dÚ
\8bÖ
\8e~]', '©2ch.net', '©bbspink.com', #9);
1493 if (Setting.ThreadTitleTrim = True) then begin
1494 DstTitle := SrcTitle;
1495 for i := Low(TRIM_STRING) to High(TRIM_STRING) do begin
1496 Len := Length(TRIM_STRING[i]);
1497 while (True) do begin
1498 Idx := Pos(TRIM_STRING[i], DstTitle);
1501 Delete(DstTitle, Idx, Len);
1504 Result := Trim(DstTitle);
1511 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1512 \return False..0, True..1
1514 function TGikoSys.BoolToInt(b: Boolean): Integer;
1516 Result := IfThen(b, 1, 0);
1520 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1521 \return 1..True, other..False
1522 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1523 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1525 function TGikoSys.IntToBool(i: Integer): Boolean;
1531 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1532 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1533 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1534 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1536 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1540 GZipStream: TGzipDecompressStream;
1541 TextStream: TStringStream;
1542 buf: array[0..BUF_SIZE - 1] of Byte;
1548 TextStream := TStringStream.Create('');
1550 //
\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¢)
1551 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1552 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1553 ResStream.Position := 0;
1554 GZipStream := TGzipDecompressStream.Create(TextStream);
1557 FillChar(buf, BUF_SIZE, 0);
1558 cnt := ResStream.Read(buf, BUF_SIZE);
1560 GZipStream.Write(buf, BUF_SIZE);
1566 ResStream.Position := 0;
1568 FillChar(buf, BUF_SIZE, 0);
1569 cnt := ResStream.Read(buf, BUF_SIZE);
1571 TextStream.Write(buf, BUF_SIZE);
1575 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1576 s := TextStream.DataString;
1579 while (i > 0) and (s[i] = #0) do
1581 Delete(s, i + 1, ln - i);
1584 while i <> 0 do begin
1596 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1597 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1598 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1600 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1602 STD_SEC = 'KeySetting';
1608 SecList: TStringList;
1609 Component: TComponent;
1611 if not FileExists(fileName) then
1613 SecList := TStringList.Create;
1614 ini := TMemIniFile.Create(fileName);
1616 ini.ReadSection(STD_SEC, SecList);
1617 for i := 0 to SecList.Count - 1 do begin
1618 ActionName := SecList[i];
1619 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1620 if ActionKey <> -1 then begin
1621 Component := ActionList.Owner.FindComponent(ActionName);
1622 if TObject(Component) is TAction then begin
1623 TAction(Component).ShortCut := ActionKey;
1634 \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¶
1635 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1636 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1638 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
1640 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1642 STD_SEC = 'KeySetting';
1647 ini := TMemIniFile.Create(GetConfigDir + FileName);
1649 for i := 0 to ActionList.ActionCount - 1 do begin
1650 if ActionList.Actions[i].Tag = -1 then
1652 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1662 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1663 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1664 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1666 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1668 PI: TProcessInformation;
1672 Path := '"' + AppPath + '"';
1674 Path := Path + ' ' + Param;
1676 SI.Cb := SizeOf(Si);
1677 SI.lpReserved := nil;
1678 SI.lpDesktop := nil;
1681 SI.cbReserved2 := 0;
1682 SI.lpReserved2 := nil;
1684 if Windows.CreateProcess(nil,
1695 CloseHandle(PI.hProcess);
1701 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1702 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1703 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1705 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1709 params : TStringList;
1713 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1714 gbtUserApp, gbtAuto:
1715 if (Setting.URLApp) then begin
1716 if (FileExists(Setting.URLAppFile)) then begin
1717 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1719 //
\8bN
\93®
\83p
\83\89\83\81\81[
\83^
\95t
\82«
\91Î
\8dô
1721 params := TStringList.Create;
1723 params.Delimiter := ' ';
1724 params.DelimitedText := Setting.URLAppFile;
1725 for i := 0 to params.Count - 1 do begin
1726 path := TrimLeft(path + ' ' + params[i]);
1727 if (FileExists(path)) then begin
1729 for j := i + 1 to params.Count - 1 do begin
1730 arg := arg + ' ' + params[j];
1735 if i < params.Count then begin
1736 GikoSys.CreateProcess(path, arg + ' ' + URL);
1738 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1745 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1750 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1751 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1752 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1754 function TGikoSys.HTMLDecode(const AStr: String): String;
1756 Sp, Rp, Cp, Tp: PChar;
1761 SetLength(Result, Length(AStr));
1763 Rp := PChar(Result);
1766 while Sp^ <> #0 do begin
1772 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1778 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1782 while (Sp^ <> ';') and (Sp^ <> #0) do
1789 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1797 Num := IsNumeric(Copy(Tp, 1, 1));
1798 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1799 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1803 SetString(S, Tp, Sp - Tp);
1808 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1809 //[Cp^ + Sp^, Cp - PChar(AStr)])
1819 // on E:EConvertError do
1820 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1821 // [Cp^ + Sp^, Cp - PChar(AStr)])
1823 SetLength(Result, Rp - PChar(Result));
1827 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1828 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1829 \return
\8eæ
\93¾
\82µ
\82½ URL
1831 function TGikoSys.GetHRefText(s: string): string;
1841 Index := AnsiPos('href', LowerCase(s));
1844 s := Trim(Copy(s, Index + 4, Length(s)));
1845 s := Trim(Copy(s, 2, Length(s)));
1847 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1848 //if Copy(s, 1, 1) = '"' then begin
1849 if s[1] = '"' then begin
1850 s := Trim(Copy(s, 2, Length(s)));
1853 Index := AnsiPos('"', s);
1854 if Index <> 0 then begin
1855 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1856 s := Copy(s, 1, Index - 1);
1858 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1859 Index := AnsiPos(' ', s);
1860 Index2 := AnsiPos('>', s);
1863 if Index > Index2 then
1866 s := Copy(s, 1, Index - 1)
1868 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1875 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1876 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1877 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1879 function TGikoSys.Is2chHost(Host: string): Boolean;
1881 HOST_NAME: array[0..1] of string = ('.2ch.net', '.bbspink.com');
1887 if RightStr( Host, 1 ) = '/' then
1888 Host := Copy( Host, 1, Length( Host ) - 1 );
1889 OutputDebugString(pchar(HOST_NAME[0]));
1890 for i := 0 to Length(HOST_NAME) - 1 do begin
1891 // Len := Length(HOST_NAME[i]);
1892 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1893 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1901 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1902 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1903 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1904 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1905 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1906 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1907 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1909 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1919 Index := AnsiPos(READ_PATH, path);
1920 if Index <> 0 then begin
1921 s := Copy(path, Index + Length(READ_PATH), Length(path));
1923 Index := AnsiPos(HTML_READ_PATH, path);
1924 if Index <> 0 then begin
1925 s := Copy(path, Index + Length(HTML_READ_PATH), Length(path));
1928 if Index <> 0 then begin
1929 if (Length(s) > 0) and (s[1] = '/') then
1931 BBSID := GetTokenIndex(s, '/', 0);
1932 BBSKey := GetTokenIndex(s, '/', 1);
1935 Result := (BBSID <> '') or (BBSKey <> '');
1938 Index := AnsiPos(KAKO_PATH, path);
1939 if Index <> 0 then begin
1940 s := Copy(path, 2, Length(path));
1941 BBSID := GetTokenIndex(s, '/', 0);
1942 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1943 BBSID := GetTokenIndex(s, '/', 1);
1944 BBSKey := ChangeFileExt(Document, '');
1945 Result := (BBSID <> '') or (BBSKey <> '');
1948 Index := AnsiPos('read.cgi?', URL);
1949 if Index <> 0 then begin
1950 SList := TStringList.Create;
1953 // s := HTMLDecode(Document);
1954 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1955 BBSID := SList.Values['bbs'];
1956 BBSKey := SList.Values['key'];
1957 Result := (BBSID <> '') or (BBSKey <> '');
1969 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1970 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1971 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1972 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1974 http://2ch.net/
\92\86\97ª/32-50 \n
1975 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1977 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1979 START_NAME : array[0..1] of String = ('st=', 'start=');
1980 END_NAME : array[0..1] of String = ('to=', 'end=');
1981 RES_NAME : array[0..0] of String = ('res=');
1987 bufList : TStringList;
1988 i, j, idx : Integer;
1990 URL := Trim(LowerCase(URL));
1991 for i := 0 to Length(START_NAME) -1 do begin
1992 idx := AnsiPos(START_NAME[i], URL);
1993 if (idx <> 0) then begin
1996 idx := AnsiPos(END_NAME[i], URL);
1997 if (idx <> 0) then begin
2003 if (idx <> 0) then begin
2004 idx := AnsiPos('?', URL);
2005 if (idx = 0) then begin
2006 idx := LastDelimiter('/', URL);
2010 bufList := TStringList.Create();
2012 bufList.Delimiter := '&';
2013 bufList.DelimitedText := Copy(URL, idx + 1, Length(URL));
2014 for i := 0 to bufList.Count - 1 do begin
2016 //
\8aJ
\8en
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
2017 if (stRes = 0) then begin
2018 for j := 0 to Length(START_NAME) - 1 do begin
2019 idx := AnsiPos(START_NAME[j], bufList[i]);
2020 if (idx = 1) then begin
2021 convBuf := Copy(bufList[i], idx + Length(START_NAME[j]), Length(bufList[i]));
2022 stRes := StrToInt64Def( convBuf, 0 );
2027 //
\8fI
\97¹
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
2028 if (convBuf = '') and (endRes = 0) then begin
2029 for j := 0 to Length(END_NAME) - 1 do begin
2030 idx := AnsiPos(END_NAME[j], bufList[i]);
2031 if (idx = 1) then begin
2032 convBuf := Copy(bufList[i], idx + Length(END_NAME[j]), Length(bufList[i]));
2033 endRes := StrToInt64Def( convBuf, 0 );
2038 //
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
2039 if ((stRes = 0) and (endRes = 0) and (convBuf = '')) then begin
2040 for j := 0 to Length(RES_NAME) - 1 do begin
2041 idx := AnsiPos(RES_NAME[j], bufList[i]);
2042 if (idx = 1) then begin
2043 convBuf := Copy(bufList[i], idx + Length(RES_NAME[j]), Length(bufList[i]));
2044 stRes := StrToInt64Def( convBuf, 0 );
2052 if (stRes <> 0) and (endRes = 0) then begin
2053 endRes := stRes + MAX_POPUP_RES;
2054 end else if (stRes = 0) and (endRes <> 0) then begin
2055 stRes := endRes - MAX_POPUP_RES;
2056 if stRes < 1 then begin
2064 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
2065 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
2066 if Length(buf) > 0 then begin
2067 if AnsiPos('-', buf) = 1 then begin
2072 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2073 convBuf := Copy( buf, 1, ps );
2074 if convBuf <> '' then begin
2075 endRes := StrToInt64Def(convBuf, 0);
2077 if endRes <> 0 then begin
2078 stRes := endRes - MAX_POPUP_RES;
2085 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2087 convBuf := Copy( buf, 1, ps );
2088 if convBuf <> '' then begin
2089 stRes := StrToInt64(convBuf);
2093 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2094 convBuf := Copy( buf, 1, ps );
2095 if convBuf <> '' then begin
2096 endRes := StrToInt64Def(convBuf, 0);
2111 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2112 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2113 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2115 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2120 // convBuf : String;
2131 URL := Trim(LowerCase(URL));
2136 Result.FFirst := False;
2137 Result.FStBegin := False;
2138 Result.FToEnd := False;
2139 Result.FDone := False;
2140 Result.FNoParam := False;
2144 if URL[length(URL)] = '\' then
2146 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2147 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2148 s := Copy(URL, RStart + RLength - 1, Length(URL));
2150 //
\95W
\8f\80\8f\91\8e®
2151 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2152 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2153 FAWKStr.RegExp := '/test/read.(cgi|html)/.+/[0-9]+/?.*';
2154 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2155 s := Copy(s, 15, Length(s));
2157 SList := TStringList.Create;
2160 FAWKStr.RegExp := '/';
2161 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2162 Result.FBBS := SList[1];
2163 Result.FKey := SList[2];
2164 if SList.Count >= 4 then
2168 Result.FNoParam := true;
2174 FAWKStr.LineSeparator := mcls_CRLF;
2175 FAWKStr.RegExp := '-';
2176 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2177 Result.FFirst := True;
2179 FAWKStr.RegExp := 'l[0-9]+';
2180 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2181 Result.FFirst := True;
2183 for i := 0 to SList.Count - 1 do begin
2184 if Trim(SList[i]) = '' then begin
2186 Result.FStBegin := True;
2187 if i = (SList.Count - 1) then
2188 Result.FToEnd := True;
2189 end else if IsNumeric(SList[i]) then begin
2190 wkInt := StrToInt(SList[i]);
2191 wkMax := Max(wkMax, wkInt);
2195 wkMin := Min(wkMin, wkInt);
2196 end else if Trim(SList[i]) = 'n' then begin
2197 Result.FFirst := True;
2199 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2200 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2201 if Copy(SList[i], 1, 1) = 'n' then
2202 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2204 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2205 Result.FFirst := True;
2206 wkMax := Max(wkMax, wkInt);
2210 wkMin := Min(wkMin, wkInt);
2214 if Result.FStBegin and (not Result.FToEnd) then
2216 else if (not Result.FStBegin) and Result.FToEnd then
2218 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2219 Result.FSt := wkMin;
2220 Result.FTo := wkMax;
2222 //Result.FSt := wkMin;
2223 //Result.FTo := wkMax;
2229 Result.FDone := True;
2233 //
\90Vkako
\8f\91\8e®
2234 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2235 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2236 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2237 SList := TStringList.Create;
2240 FAWKStr.RegExp := '/';
2241 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2242 Result.FBBS := SList[1];
2243 Result.FKey := ChangeFileExt(SList[5], '');
2244 Result.FFirst := True;
2250 Result.FDone := True;
2254 //
\8b\8ckako
\8f\91\8e®
2255 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2256 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2257 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2258 SList := TStringList.Create;
2261 FAWKStr.RegExp := '/';
2262 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2263 Result.FBBS := SList[1];
2264 Result.FKey := ChangeFileExt(SList[4], '');
2265 Result.FFirst := True;
2271 Result.FDone := True;
2275 //log
\8by
\82Ñlog2
\8f\91\8e®
2276 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2277 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2278 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2279 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2280 SList := TStringList.Create;
2283 FAWKStr.RegExp := '/';
2284 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2285 Result.FBBS := SList[2];
2286 Result.FKey := ChangeFileExt(SList[5], '');
2287 Result.FFirst := True;
2293 Result.FDone := True;
2298 //
\8b\8cURL
\8f\91\8e®
2299 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2300 FAWKStr.RegExp := '/test/read\.cgi\?';
2301 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2302 s := Copy(s, 16, Length(s));
2303 SList := TStringList.Create;
2306 FAWKStr.RegExp := '&';
2307 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2308 Result.FFirst := True;
2309 for i := 0 to SList.Count - 1 do begin
2310 if Pos('bbs=', SList[i]) = 1 then begin
2311 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2312 end else if Pos('key=', SList[i]) = 1 then begin
2313 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2314 end else if Pos('st=', SList[i]) = 1 then begin
2315 wk := Copy(SList[i], 4, Length(SList[i]));
2316 if IsNumeric(wk) then
2317 Result.FSt := StrToInt(wk)
2318 else if wk = '' then
2319 Result.FStBegin := True;
2320 end else if Pos('to=', SList[i]) = 1 then begin
2321 wk := Copy(SList[i], 4, Length(SList[i]));
2322 if IsNumeric(wk) then
2323 Result.FTo := StrToInt(wk)
2324 else if wk = '' then
2325 Result.FToEnd := True;
2326 end else if Pos('nofirst=', SList[i]) = 1 then begin
2327 Result.FFirst := False;
2336 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2337 Result.FDone := True;
2345 \brief URI
\82ð
\95ª
\89ð
2346 \param URL
\95ª
\89ð
\82·
\82é URI
2347 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2348 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2349 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2350 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2351 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2352 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2354 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2364 URI := TIdURI.Create(URL);
2366 Protocol := URI.Protocol;
2369 Document := URI.Document;
2371 Bookmark := URI.Bookmark;
2378 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2379 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2381 function TGikoSys.GetVersionBuild: Integer;
2383 FixedFileInfo: PVSFixedFileInfo;
2384 VersionHandle, VersionSize: DWORD;
2385 pVersionInfo: Pointer;
2390 AppFile := Application.ExeName;
2391 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2392 if VersionSize = 0 then
2394 GetMem(pVersionInfo, VersionSize);
2396 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2397 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2398 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2400 FreeMem(pVersionInfo, VersionSize);
2405 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2406 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2407 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2409 \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
2410 \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
2411 \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
2412 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2414 \97á(
\90³
\8bK
\89»
\91O):\n
2415 http://
\92\86\97ª/ \n
2416 http://
\92\86\97ª/20-100
2418 (
\90³
\8bK
\89»
\8cã):\n
2419 http://
\92\86\97ª/l50
2421 function TGikoSys.GetBrowsableThreadURL(
2425 threadItem : TThreadItem;
2426 boardPlugIn : TBoardPlugIn;
2431 //=====
\83v
\83\89\83O
\83C
\83\93
2433 for i := Length( BoardGroups ) - 1 downto 1 do begin
2434 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2435 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2436 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2437 if board <> nil then begin
2438 boardPlugIn := BoardGroups[i].BoardPlugIn;
2439 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2440 Result := threadItem.URL;
2449 // 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¢
2452 if Length( Result ) = 0 then
2453 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2458 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2459 \param inURL
\83X
\83\8c\83b
\83h URL
2462 function TGikoSys.GetThreadURL2BoardURL(
2466 threadItem : TThreadItem;
2467 boardPlugIn : TBoardPlugIn;
2472 //=====
\83v
\83\89\83O
\83C
\83\93
2474 for i := Length( BoardGroups ) - 1 downto 1 do begin
2475 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2476 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2477 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2478 boardPlugIn := BoardGroups[i].BoardPlugIn;
2479 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2480 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2488 // 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¢
2491 if Length( Result ) = 0 then
2492 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2497 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2498 \param inURL
\83X
\83\8c\83b
\83h URL
2500 \see TGikoSys.GetThreadURL2BoardURL
2502 function TGikoSys.Get2chThreadURL2BoardURL(
2506 Protocol, Host, Path, Document, Port, Bookmark : string;
2507 BBSID, BBSKey : string;
2511 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2512 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2514 foundPos := Pos( '/test/read.cgi', inURL );
2515 if {(Is2chHost(Host)) and} (foundPos > 0) then
2516 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2518 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2523 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2524 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2525 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2526 \see TGikoSys.GetBrowsableThreadURL
2528 function TGikoSys.Get2chBrowsableThreadURL(
2532 Protocol, Host, Path, Document, Port, Bookmark : string;
2533 BBSID, BBSKey : string;
2537 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2540 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2541 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2542 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2544 if Is2chHost( Host ) then begin
2545 Result := Protocol + '://' + Host +
2546 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2548 if foundPos > 0 then
2549 Result := Copy( inURL, 1, foundPos ) +
2550 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2552 Result := Protocol + '://' + Host +
2553 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2560 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2561 \param inBoard
\94Â URL
2562 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2563 \return
\83X
\83\8c\83b
\83h URL
2565 function TGikoSys.Get2chBoard2ThreadURL(
2573 server := UrlToServer( inBoard.URL );
2574 //if Is2chHost( server ) then
2575 if inBoard.Is2ch then
2576 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2578 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2583 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2585 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2587 procedure TGikoSys.ListBoardFile;
2589 boardFileList : TStringList;
2591 sCategory : TCategory;
2595 for i := 0 to Length( BBSs ) - 1 do
2599 SetLength( BBSs, 0 );
2602 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2603 if FileExists( GikoSys.GetBoardFileName ) then begin
2604 SetLength( BBSs, l + 1 );
2605 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2606 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2610 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2611 SetLength( BBSs, l + 1 );
2612 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2613 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2617 // Board
\83t
\83H
\83\8b\83_
2618 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2619 BoardFileList := TStringList.Create;
2621 BoardFileList.BeginUpdate;
2622 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*.txt', BoardFileList, True, True );
2623 BoardFileList.EndUpdate;
2624 SetLength( BBSs, l + BoardFileList.Count );
2625 for i := BoardFileList.Count - 1 downto 0 do begin
2626 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2627 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2635 //
\93Á
\8eê
\97p
\93rBBS
\90¶
\90¬
2636 //
\8aù
\82É
\91¶
\8dÝ
\82·
\82é
\8fê
\8d\87\82Í
\8dí
\8f\9c\82·
\82é
2637 DestorySpecialBBS(BoardGroup.SpecialBBS);
2638 SpecialBBS := TBBS.Create('');
2639 SpecialBBS.Title := '
\93Á
\8eê
\97p
\93r(
\94ñ
\95\
\8e¦)';
2640 sCategory := TCategory.Create;
2642 sCategory.Title := '
\93Á
\8eê
\97p
\93r(
\94ñ
\95\
\8e¦)';
2643 SpecialBBS.Add(sCategory);
2644 BoardGroup.SpecialBoard := TSpecialBoard.Create(nil, 'http://localhost/gikonavi/special/index.html');
2645 BoardGroup.SpecialBoard.Title := '
\83^
\83u
\88ê
\97\97';
2646 BoardGroup.SpecialBoard.IsThreadDatRead := True;
2647 sCategory.Add(BoardGroup.SpecialBoard);
2651 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2652 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2654 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2659 boardFile : TStringList;
2660 CategoryList : TStringList;
2661 BoardList : TStringList;
2662 Category : TCategory;
2666 // RoundItem : TRoundItem;
2668 i, iBound : Integer;
2669 j, jBound : Integer;
2670 k, kBound : Integer;
2673 if not FileExists( bbs.FilePath ) then
2677 ini := TMemIniFile.Create('');
2678 boardFile := TStringList.Create;
2681 boardFile.LoadFromFile( bbs.FilePath );
2683 ini.SetStrings( boardFile );
2684 CategoryList := TStringList.Create;
2685 BoardList := TStringList.Create;
2687 ini.ReadSections( CategoryList );
2689 iBound := CategoryList.Count - 1;
2690 for i := 0 to iBound do begin
2691 ini.ReadSection( CategoryList[i], BoardList );
2692 Category := TCategory.Create;
2693 Category.No := i + 1;
2694 Category.Title := CategoryList[i];
2696 jBound := BoardList.Count - 1;
2697 for j := 0 to jBound do begin
2699 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2700 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2701 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2702 //=====
\83v
\83\89\83O
\83C
\83\93
2704 kBound := Length(BoardGroups) - 1;
2705 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2706 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2707 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2708 if not BoardGroups[k].Find(inistr, p) then begin
2709 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2710 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2711 if not BoardGroups[k].Find(tmpstring, p) then begin
2713 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2714 BoardGroups[k].AddObject(tmpstring, Board);
2715 Category.Add(Board);
2717 //
\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é
2721 Board := TBoard(BoardGroups[k].Objects[p]);
2722 if Board.ParentCategory <> Category then
2723 Category.Add(Board);
2727 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2728 BoardGroups[k].AddObject(tmpstring, Board);
2729 Category.Add(Board);
2731 //
\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é
2736 Board := TBoard(BoardGroups[k].Objects[p]);
2737 if Board.ParentCategory <> Category then
2738 Category.Add(Board);
2745 // 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¢
2748 if (Board = nil) then begin
2749 if not BoardGroups[0].Find(inistr,p) then begin
2750 Board := TBoard.Create( nil, inistr );
2751 BoardGroups[0].AddObject(inistr, Board);
2752 Category.Add(Board);
2754 Board := TBoard(BoardGroups[0].Objects[p]);
2755 if Board.ParentCategory <> Category then
2756 Category.Add(Board);
2760 if (Board.Multiplicity = 0) then begin
2763 Board.Multiplicity := 1;
2764 Board.Title := BoardList[j];
2765 Board.RoundDate := ZERO_DATE;
2770 Board.Multiplicity := Board.Multiplicity + 1;
2775 bbs.Add( Category );
2780 bbs.IsBoardFileRead := True;
2793 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2794 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2796 function TGikoSys.GetUnknownCategory : TCategory;
2798 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2801 if Length( BBSs ) < 2 then begin
2806 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2807 if Result = nil then begin
2808 Result := TCategory.Create;
2809 Result.Title := UNKNOWN_CATEGORY;
2810 BBSs[ 1 ].Add( Result );
2816 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2817 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2819 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2821 category : TCategory;
2823 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2826 category := GetUnknownCategory;
2827 if category = nil then begin
2830 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2831 if Result = nil then begin
2832 Result := TBoard.Create( inPlugIn, inURL );
2833 Result.Title := UNKNOWN_BOARD;
2834 category.Add( Result );
2841 function TGikoSys.GetSambaFileName : string;
2843 Result := Setting.GetSambaFileName;
2846 \brief
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82Ö
\82Ì
\83A
\83\93\83J
\81[
\97pHTML
\8dì
\90¬
2847 \param Numbers
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86
2848 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2849 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2850 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2852 function TGikoSys.CreateResAnchor(
2853 var Numbers: TStringList; ThreadItem: TThreadItem;
2854 limited: Integer):string;
2858 ResLink : TResLinkRec;
2860 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2862 Res.FType := glt2chNew;
2865 if (Numbers <> nil) and (Numbers.Count > 0) then begin
2866 if (limited > 0) and (Numbers.Count > limited) then begin
2867 for i := Numbers.Count - limited to Numbers.Count - 1 do begin
2868 Res.FBody := Res.FBody + '>' + Numbers[i] + ' ';
2871 for i := 0 to Numbers.Count - 1 do begin
2872 Res.FBody := Res.FBody + '>' + Numbers[i] + ' ';
2875 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2876 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2877 HTMLCreater.ConvRes(@Res, @ResLink, false);
2878 Result := Res.FBody;
2883 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2884 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2885 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2886 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2888 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2891 ReadList: TStringList;
2893 boardPlugIn : TBoardPlugIn;
2895 procedure CheckSameID(const AID:String; const Target: String; no: Integer);
2899 pos := AnsiPos('id:', LowerCase(Target));
2900 if (pos > 0) then begin
2901 if(AnsiPos(AID, Copy(Target, pos-1, Length(Target))) > 0) then begin
2902 body.Add(IntToStr(no));
2905 if(AnsiPos(AID, Target) > 0) then begin
2906 body.Add(IntToStr(no));
2911 if (not IsNoValidID(AID)) and
2912 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2913 //if ThreadItem.IsBoardPlugInAvailable then begin
2914 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2915 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2916 //boardPlugIn := ThreadItem.BoardPlugIn;
2917 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2919 for i := 0 to threadItem.Count - 1 do begin
2921 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2922 CheckSameID(AID, Res.FDateTime, i+1);
2925 ReadList := TStringList.Create;
2927 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2928 for i := 0 to ReadList.Count - 1 do begin
2929 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2930 CheckSameID(AID, Res.FDateTime, i+1);
2940 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2941 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2942 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2943 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2945 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2949 AID := GetResID(AIDNum, ThreadItem);
2950 if not IsNoValidID(AID) then begin
2951 GetSameIDRes(AID, ThreadItem, body);
2955 \brief
\93\8a\8de ID
\8eæ
\93¾
2956 \param AIDNum
\93\8a\8de
\83\8c\83X
\94Ô
\8d\86
2957 \param ThreadItem
\93\8a\8de
\83X
\83\8c\83b
\83h
2958 \param body OUT:
\93\8a\8deID
2960 function TGikoSys.GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
2963 boardPlugIn : TBoardPlugIn;
2966 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2967 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2968 //if ThreadItem.IsBoardPlugInAvailable then begin
2969 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2970 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2971 //boardPlugIn := ThreadItem.BoardPlugIn;
2972 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2973 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2975 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2977 Result := ExtructResID(Res.FDateTime);
2981 \brief
\83\8c\83X
\82Ì
\8e\9e\8d\8f\95\94\82©
\82çID
\82ð
\92\8a\8fo
\82·
\82é
2982 \param ADateStr
\8e\9e\8d\8f\95\94\82Ì
\95¶
\8e\9a\97ñ
2983 \return ID(ID
\82Æ
\82Ý
\82È
\82¹
\82é
\95\94\95ª
\82ª
\82È
\82¢
\82Æ
\82«
\82Í
\8bó
\95¶
\8e\9a\97ñ)
2985 function TGikoSys.ExtructResID(ADateStr: String): String;
2987 stlist : TStringList;
2990 if AnsiPos('id', AnsiLowerCase(ADateStr)) > 0 then begin
2991 Result := Copy(ADateStr, AnsiPos('id', AnsiLowerCase(ADateStr)), Length(ADateStr));
2992 if AnsiPos(' ', Result) > 0 then begin
2993 Result := Copy(Result, 1, AnsiPos(' ', Result) - 1);
2995 Result := ' ' + Result;
2997 stlist := TStringList.Create;
2999 stList.Delimiter := ' ';
3000 stList.DelimitedText := ADateStr;
3001 //
\93ú
\95t
\8e\9e\8d\8f ID
\91¼
\81@
\82Æ
\8cÅ
\92è
\82Å
\8dl
\82¦
\82é
3002 if (stList.Count >= 3) then begin
3003 if Length(stList[3 - 1]) >= 7 then begin
3004 Result := stList[3 - 1];
3014 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
3015 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3016 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
3018 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
3021 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3022 Bayesian.CountWord( text, wordCount );
3027 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
3028 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3029 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
3030 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
3031 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
3032 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
3033 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
3035 \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
3036 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
3038 \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
3040 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
3043 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3044 Bayesian.Forget( wordCount, isSpam );
3049 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3050 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3051 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3053 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3056 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3057 Bayesian.Learn( wordCount, isSpam );
3062 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3063 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3064 \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)
3065 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3067 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3070 case Setting.SpamFilterAlgorithm of
3071 gsfaNone: Result := 0;
3072 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3073 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3074 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3081 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3082 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3084 [
\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Ì
3085 [
\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
3087 function TGikoSys.SetUserOptionalStyle(): string;
3090 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3091 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3092 if GikoSys.Setting.BrowserFontSize <> 0 then
3093 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3094 if GikoSys.Setting.BrowserFontColor <> -1 then
3095 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3096 if GikoSys.Setting.BrowserBackColor <> -1 then
3097 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3098 case GikoSys.Setting.BrowserFontBold of
3099 -1: Result := Result + 'font-weight:normal;';
3100 1: Result := Result + 'font-weight:bold;';
3102 case GikoSys.Setting.BrowserFontItalic of
3103 -1: Result := Result + 'font-style:normal;';
3104 1: Result := Result + 'font-style:italic;';
3109 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3110 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3111 \param ANum
\83\8c\83X
\94Ô
3112 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3113 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3115 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3118 BNum, BMark : string;
3120 p := AnsiPos('BE:', AnsiUpperCase(AID));
3122 BNum := Copy(AID, p, Length(AID));
3123 AID := Copy(AID, 1, p - 1);
3124 p := AnsiPos('-', BNum);
3126 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3127 BNum := Copy(BNum, 1, p - 1);
3130 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3131 + '" target=_blank>' + BMark + '</a>';
3137 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3138 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3139 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3141 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3143 Translation = '\VarFileInfo\Translation';
3144 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3146 BufSize, HWnd: DWORD;
3147 VerInfoBuf: Pointer;
3149 VerDataLen: Longword;
3152 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3153 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3154 if BufSize <> 0 then begin
3155 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3156 GetMem(VerInfoBuf, BufSize);
3158 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3159 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3160 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3162 if not (VerDataLen > 0) then
3163 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3165 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3166 //
\81¨'\StringFileInfo\027382\FileDescription'
3167 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3168 [IntToHex(Integer(VerData^) and $FFFF, 4),
3169 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3170 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3172 if VerDataLen > 0 then begin
3173 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3175 SetLength(result, VerDataLen);
3176 StrLCopy(PChar(result), VerData, VerDataLen);
3180 FreeMem(VerInfoBuf);
3186 \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
3187 \return 1
\8ds1plugin
3189 function TGikoSys.GetPluginsInfo(): String;
3192 major, minor, revision : Cardinal;
3193 agent, release : String;
3195 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3198 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3199 for i := 0 to Length(BoardGroups) - 1 do begin
3200 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3201 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3202 if BoardGroups[i].BoardPlugIn <> nil then begin
3203 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3206 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3208 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3214 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3215 function TGikoSys.GetIEVersion: string;
3219 R := TRegistry.Create;
3221 //
\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¢
3222 R.Access := KEY_EXECUTE;
3223 R.RootKey := HKEY_LOCAL_MACHINE;
3224 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3226 Result := R.ReadString('version');
3228 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3235 //! 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¼
3236 function TGikoSys.GetMainKeyFileName : String;
3238 Result := Setting.GetMainKeyFileName;
3240 //! 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¼
3241 function TGikoSys.GetEditorKeyFileName: String;
3243 Result := Setting.GetEditorKeyFileName;
3245 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3246 function TGikoSys.GetInputAssistFileName: String;
3248 Result := Setting.GetInputAssistFileName;
3250 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3251 procedure TGikoSys.SetGikoMessage;
3253 if FGikoMessage = nil then begin
3254 FGikoMessage := TGikoMessage.Create;
3259 if (Setting.GengoSupport) then begin
3261 if (FileExists(Setting.GetLanguageFileName)) then begin
3262 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3269 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3270 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3273 if FGikoMessage <> nil then begin
3274 Result := FGikoMessage.GetMessage(MesType);
3278 //Tue, 17 Dec 2002 12:18:07 GMT
\81¨ TDateTime
\82Ö
3279 //MonaUtils
\82©
\82ç
\88Ú
\93®
3280 function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime;
3281 function StrMonthToMonth(const s: string): integer;
3283 m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
3288 for i := Low(m) to High(m) do begin
3289 if (SameText(s, m[i])) then begin
3296 wDay, wMonth, wYear: word;
3297 wHour, wMinute, wSecond: word;
3301 wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0);
3302 wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2));
3303 wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0);
3304 sTime := ChooseString(DateStr, ' ', 4);
3305 wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0);
3306 wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0);
3307 wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0);
3308 d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0);
3311 //MonaUtils
\82©
\82ç
\88Ú
\93®
3312 //!
\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·
3313 function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string;
3319 for i := 0 to Index - 1 do begin
3320 if (AnsiPos(Separator, S) = 0) then S := ''
3321 else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S));
3323 p := AnsiPos(Separator, S);
3324 if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S;
3326 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
3327 procedure TGikoSys.RestoreThreadData(Board : TBoard);
3329 SECTION = 'Setting';
3331 TmpFileList : TStringList;
3334 ThreadItem : TThreadItem;
3335 Boardpath, tmpStr : string;
3337 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
3339 TmpFileList := TStringList.Create;
3340 TmpFileList.Sorted := True;
3341 TmpFileList.BeginUpdate;
3343 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
3344 GetFileList(Boardpath, '*.tmp', TmpFileList, False);
3345 TmpFileList.EndUpdate;
3346 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
3347 for i := TmpFileList.Count - 1 downto 0 do begin
3348 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
3349 if ThreadItem <> nil then begin
3350 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
3352 tmpStr := ini.ReadString(SECTION, 'RoundDate', DateTimeToStr(ZERO_DATE));
3353 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
3355 tmpStr := ini.ReadString(SECTION, 'LastModified', DateTimeToStr(ZERO_DATE));
3356 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
3357 ThreadItem.Count := ini.ReadInteger(SECTION, 'Count', 0);
3358 ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
3360 ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
3361 ThreadItem.IsLogFile := FileExists(ThreadItem.GetThreadFileName);
3362 if(ThreadItem.Size = 0) and (ThreadItem.IsLogFile) then begin
3364 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
3369 //
\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ã
3370 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
3371 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
3372 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
3373 ThreadItem.ScrollTop := ini.ReadInteger(SECTION, 'ScrollTop', 0);
3374 ThreadItem.AllResCount := ini.ReadInteger(SECTION, 'AllResCount', ThreadItem.Count);
3375 ThreadItem.NewResCount := ini.ReadInteger(SECTION, 'NewResCount', 0);
3376 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger(SECTION, 'AgeSage', Ord(gasNone)));
3380 DeleteFile(Boardpath + TmpFileList[i]);
3389 \brief User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
3390 \return Boolean
\97\98\97p
\82Å
\82«
\82é
\8fê
\8d\87\82ÍTrue
3392 function TGikoSys.CanUser32DLL: Boolean;
3400 hUser32 := LoadLibrary('User32.dll');
3401 if hUser32 <> 0 then begin
3408 FreeLibrary(hUser32);
3412 \brief OE
\88ø
\97p
\95\84\8eæ
\93¾
3413 \return OE
\82Ì
\88ø
\97p
\95\84\81i
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87\82Í'>')
3415 function TGikoSys.GetOEIndentChar : string;
3418 Identities : string;
3421 DEFAULT_CHAR = '> ';
3422 OE_MAIL_PATH = '\Software\Microsoft\Outlook Express\5.0\Mail';
3423 INDENT_CHAR = 'Indent Char';
3426 Result := DEFAULT_CHAR;
3427 regKey := TRegistry.Create;
3430 regKey.RootKey := HKEY_CURRENT_USER;
3431 if not regKey.OpenKey( 'Identities', False ) then
3433 Identities := regKey.ReadString( 'Default User ID' );
3434 if Identities = '' then
3436 if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then
3438 IndentChar := regKey.ReadInteger( INDENT_CHAR );
3439 Result := Char( IndentChar ) + ' ';
3447 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3448 function TGikoSys.GetReplaceFileName: String;
3450 Result := Setting.GetReplaceFileName;
3452 //!
\83v
\83\8c\83r
\83\85\81[
\8ag
\92£
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3453 function TGikoSys.GetExtpreviewFileName: String;
3455 Result := Setting.GetExtprevieFileName;
3458 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
3459 function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime;
3464 //
\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
3465 tmp := ChangeFileExt(FileName, '');
3466 if AnsiPos('_', tmp) <> 0 then
3467 if AnsiPos('_', tmp) > 9 then
3468 tmp := Copy(tmp, 1, AnsiPos('_', tmp)-1)
3470 Delete(tmp, AnsiPos('_', tmp), 1);
3472 if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
3473 Insert('1', tmp, 1);
3475 unixtime := StrToInt64Def(tmp, ZERO_DATE);
3476 Result := UnixToDateTime(unixtime) + OffsetFromUTC;
3479 procedure TGikoSys.ShowRefCount(msg: String; unk: IUnknown);
3485 if not Assigned(unk) then
3491 count := unk._Release;
3493 Writeln(msg + ' RefCount=' + IntToStr(count));
3495 Writeln(msg + ' RefCount=exception!!');
3499 function TGikoSys.GetBoukenCookie(AURL: String): String;
3501 Protocol, Host, Path, Document, Port,Bookmark : String;
3504 GikoSys.ParseURI(AURL, Protocol, Host, Path, Document, Port,Bookmark);
3505 if ( Length(Host) > 0 ) then begin
3506 Result := Setting.GetBoukenCookie(Host);
3509 procedure TGikoSys.SetBoukenCookie(ACookieValue, ADomain: String);
3511 if ( Length(ADomain) > 0 ) then begin
3512 Setting.SetBoukenCookie(ACookieValue, ADomain);
3515 //!
\96`
\8c¯
\82Ì
\8f\91Domain
\88ê
\97\97\8eæ
\93¾
3516 procedure TGikoSys.GetBoukenDomain(var ADomain: TStringList);
3521 for i := 0 to Setting.BoukenCookieList.Count - 1 do begin
3522 ADomain.Add( Setting.BoukenCookieList.Names[i] );
3525 //!
\96`
\8c¯
\82Ì
\8f\91Cookie
\8dí
\8f\9c
3526 procedure TGikoSys.DelBoukenCookie(ADomain: String);
3530 for i := 0 to Setting.BoukenCookieList.Count - 1 do begin
3531 if ( Setting.BoukenCookieList.Names[i] = ADomain ) then begin
3532 Setting.BoukenCookieList.Delete(i);
3537 function TGikoSys.GetBouken(AURL: String; var Domain: String): String;
3539 Protocol, Host, Path, Document, Port,Bookmark : String;
3544 GikoSys.ParseURI(AURL, Protocol, Host, Path, Document, Port,Bookmark);
3545 if ( Length(Host) > 0 ) then begin
3546 Setting.GetBouken(Host, Domain, Cookie);
3552 GikoSys := TGikoSys.Create;
3555 if GikoSys <> nil then begin
3556 FreeAndNil(GikoSys);