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;
1578 if (i > 0) then begin
1580 while (i > 0) and (s[i] = #0) do
1583 Delete(s, i + 1, ln - i);
1587 while i > 0 do begin
1599 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1600 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1601 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1603 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1605 STD_SEC = 'KeySetting';
1611 SecList: TStringList;
1612 Component: TComponent;
1614 if not FileExists(fileName) then
1616 SecList := TStringList.Create;
1617 ini := TMemIniFile.Create(fileName);
1619 ini.ReadSection(STD_SEC, SecList);
1620 for i := 0 to SecList.Count - 1 do begin
1621 ActionName := SecList[i];
1622 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1623 if ActionKey <> -1 then begin
1624 Component := ActionList.Owner.FindComponent(ActionName);
1625 if TObject(Component) is TAction then begin
1626 TAction(Component).ShortCut := ActionKey;
1637 \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¶
1638 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1639 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1641 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
1643 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1645 STD_SEC = 'KeySetting';
1650 ini := TMemIniFile.Create(GetConfigDir + FileName);
1652 for i := 0 to ActionList.ActionCount - 1 do begin
1653 if ActionList.Actions[i].Tag = -1 then
1655 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1665 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1666 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1667 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1669 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1671 PI: TProcessInformation;
1675 Path := '"' + AppPath + '"';
1677 Path := Path + ' ' + Param;
1679 SI.Cb := SizeOf(Si);
1680 SI.lpReserved := nil;
1681 SI.lpDesktop := nil;
1684 SI.cbReserved2 := 0;
1685 SI.lpReserved2 := nil;
1687 if Windows.CreateProcess(nil,
1698 CloseHandle(PI.hProcess);
1704 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1705 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1706 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1708 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1712 params : TStringList;
1716 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1717 gbtUserApp, gbtAuto:
1718 if (Setting.URLApp) then begin
1719 if (FileExists(Setting.URLAppFile)) then begin
1720 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1722 //
\8bN
\93®
\83p
\83\89\83\81\81[
\83^
\95t
\82«
\91Î
\8dô
1724 params := TStringList.Create;
1726 params.Delimiter := ' ';
1727 params.DelimitedText := Setting.URLAppFile;
1728 for i := 0 to params.Count - 1 do begin
1729 path := TrimLeft(path + ' ' + params[i]);
1730 if (FileExists(path)) then begin
1732 for j := i + 1 to params.Count - 1 do begin
1733 arg := arg + ' ' + params[j];
1738 if i < params.Count then begin
1739 GikoSys.CreateProcess(path, arg + ' ' + URL);
1741 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1748 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1753 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1754 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1755 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1757 function TGikoSys.HTMLDecode(const AStr: String): String;
1759 Sp, Rp, Cp, Tp: PChar;
1764 SetLength(Result, Length(AStr));
1766 Rp := PChar(Result);
1769 while Sp^ <> #0 do begin
1775 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1781 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1785 while (Sp^ <> ';') and (Sp^ <> #0) do
1792 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1800 Num := IsNumeric(Copy(Tp, 1, 1));
1801 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1802 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1806 SetString(S, Tp, Sp - Tp);
1811 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1812 //[Cp^ + Sp^, Cp - PChar(AStr)])
1822 // on E:EConvertError do
1823 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1824 // [Cp^ + Sp^, Cp - PChar(AStr)])
1826 SetLength(Result, Rp - PChar(Result));
1830 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1831 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1832 \return
\8eæ
\93¾
\82µ
\82½ URL
1834 function TGikoSys.GetHRefText(s: string): string;
1844 Index := AnsiPos('href', LowerCase(s));
1847 s := Trim(Copy(s, Index + 4, Length(s)));
1848 s := Trim(Copy(s, 2, Length(s)));
1850 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1851 //if Copy(s, 1, 1) = '"' then begin
1852 if s[1] = '"' then begin
1853 s := Trim(Copy(s, 2, Length(s)));
1856 Index := AnsiPos('"', s);
1857 if Index <> 0 then begin
1858 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1859 s := Copy(s, 1, Index - 1);
1861 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1862 Index := AnsiPos(' ', s);
1863 Index2 := AnsiPos('>', s);
1866 if Index > Index2 then
1869 s := Copy(s, 1, Index - 1)
1871 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1878 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1879 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1880 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1882 function TGikoSys.Is2chHost(Host: string): Boolean;
1884 HOST_NAME: array[0..1] of string = ('.2ch.net', '.bbspink.com');
1890 if RightStr( Host, 1 ) = '/' then
1891 Host := Copy( Host, 1, Length( Host ) - 1 );
1892 OutputDebugString(pchar(HOST_NAME[0]));
1893 for i := 0 to Length(HOST_NAME) - 1 do begin
1894 // Len := Length(HOST_NAME[i]);
1895 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1896 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1904 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1905 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1906 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1907 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1908 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1909 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1910 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1912 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1922 Index := AnsiPos(READ_PATH, path);
1923 if Index <> 0 then begin
1924 s := Copy(path, Index + Length(READ_PATH), Length(path));
1926 Index := AnsiPos(HTML_READ_PATH, path);
1927 if Index <> 0 then begin
1928 s := Copy(path, Index + Length(HTML_READ_PATH), Length(path));
1931 if Index <> 0 then begin
1932 if (Length(s) > 0) and (s[1] = '/') then
1934 BBSID := GetTokenIndex(s, '/', 0);
1935 BBSKey := GetTokenIndex(s, '/', 1);
1938 Result := (BBSID <> '') or (BBSKey <> '');
1941 Index := AnsiPos(KAKO_PATH, path);
1942 if Index <> 0 then begin
1943 s := Copy(path, 2, Length(path));
1944 BBSID := GetTokenIndex(s, '/', 0);
1945 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1946 BBSID := GetTokenIndex(s, '/', 1);
1947 BBSKey := ChangeFileExt(Document, '');
1948 Result := (BBSID <> '') or (BBSKey <> '');
1951 Index := AnsiPos('read.cgi?', URL);
1952 if Index <> 0 then begin
1953 SList := TStringList.Create;
1956 // s := HTMLDecode(Document);
1957 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1958 BBSID := SList.Values['bbs'];
1959 BBSKey := SList.Values['key'];
1960 Result := (BBSID <> '') or (BBSKey <> '');
1972 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1973 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1974 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1975 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1977 http://2ch.net/
\92\86\97ª/32-50 \n
1978 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1980 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1982 START_NAME : array[0..1] of String = ('st=', 'start=');
1983 END_NAME : array[0..1] of String = ('to=', 'end=');
1984 RES_NAME : array[0..0] of String = ('res=');
1990 bufList : TStringList;
1991 i, j, idx : Integer;
1993 URL := Trim(LowerCase(URL));
1994 for i := 0 to Length(START_NAME) -1 do begin
1995 idx := AnsiPos(START_NAME[i], URL);
1996 if (idx <> 0) then begin
1999 idx := AnsiPos(END_NAME[i], URL);
2000 if (idx <> 0) then begin
2006 if (idx <> 0) then begin
2007 idx := AnsiPos('?', URL);
2008 if (idx = 0) then begin
2009 idx := LastDelimiter('/', URL);
2013 bufList := TStringList.Create();
2015 bufList.Delimiter := '&';
2016 bufList.DelimitedText := Copy(URL, idx + 1, Length(URL));
2017 for i := 0 to bufList.Count - 1 do begin
2019 //
\8aJ
\8en
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
2020 if (stRes = 0) then begin
2021 for j := 0 to Length(START_NAME) - 1 do begin
2022 idx := AnsiPos(START_NAME[j], bufList[i]);
2023 if (idx = 1) then begin
2024 convBuf := Copy(bufList[i], idx + Length(START_NAME[j]), Length(bufList[i]));
2025 stRes := StrToInt64Def( convBuf, 0 );
2030 //
\8fI
\97¹
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
2031 if (convBuf = '') and (endRes = 0) then begin
2032 for j := 0 to Length(END_NAME) - 1 do begin
2033 idx := AnsiPos(END_NAME[j], bufList[i]);
2034 if (idx = 1) then begin
2035 convBuf := Copy(bufList[i], idx + Length(END_NAME[j]), Length(bufList[i]));
2036 endRes := StrToInt64Def( convBuf, 0 );
2041 //
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
2042 if ((stRes = 0) and (endRes = 0) and (convBuf = '')) then begin
2043 for j := 0 to Length(RES_NAME) - 1 do begin
2044 idx := AnsiPos(RES_NAME[j], bufList[i]);
2045 if (idx = 1) then begin
2046 convBuf := Copy(bufList[i], idx + Length(RES_NAME[j]), Length(bufList[i]));
2047 stRes := StrToInt64Def( convBuf, 0 );
2055 if (stRes <> 0) and (endRes = 0) then begin
2056 endRes := stRes + MAX_POPUP_RES;
2057 end else if (stRes = 0) and (endRes <> 0) then begin
2058 stRes := endRes - MAX_POPUP_RES;
2059 if stRes < 1 then begin
2067 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
2068 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
2069 if Length(buf) > 0 then begin
2070 if AnsiPos('-', buf) = 1 then begin
2075 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2076 convBuf := Copy( buf, 1, ps );
2077 if convBuf <> '' then begin
2078 endRes := StrToInt64Def(convBuf, 0);
2080 if endRes <> 0 then begin
2081 stRes := endRes - MAX_POPUP_RES;
2088 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2090 convBuf := Copy( buf, 1, ps );
2091 if convBuf <> '' then begin
2092 stRes := StrToInt64(convBuf);
2096 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2097 convBuf := Copy( buf, 1, ps );
2098 if convBuf <> '' then begin
2099 endRes := StrToInt64Def(convBuf, 0);
2114 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2115 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2116 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2118 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2123 // convBuf : String;
2134 URL := Trim(LowerCase(URL));
2139 Result.FFirst := False;
2140 Result.FStBegin := False;
2141 Result.FToEnd := False;
2142 Result.FDone := False;
2143 Result.FNoParam := False;
2147 if URL[length(URL)] = '\' then
2149 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2150 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2151 s := Copy(URL, RStart + RLength - 1, Length(URL));
2153 //
\95W
\8f\80\8f\91\8e®
2154 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2155 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2156 FAWKStr.RegExp := '/test/read.(cgi|html)/.+/[0-9]+/?.*';
2157 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2158 s := Copy(s, 15, Length(s));
2160 SList := TStringList.Create;
2163 FAWKStr.RegExp := '/';
2164 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2165 Result.FBBS := SList[1];
2166 Result.FKey := SList[2];
2167 if SList.Count >= 4 then
2171 Result.FNoParam := true;
2177 FAWKStr.LineSeparator := mcls_CRLF;
2178 FAWKStr.RegExp := '-';
2179 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2180 Result.FFirst := True;
2182 FAWKStr.RegExp := 'l[0-9]+';
2183 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2184 Result.FFirst := True;
2186 for i := 0 to SList.Count - 1 do begin
2187 if Trim(SList[i]) = '' then begin
2189 Result.FStBegin := True;
2190 if i = (SList.Count - 1) then
2191 Result.FToEnd := True;
2192 end else if IsNumeric(SList[i]) then begin
2193 wkInt := StrToInt(SList[i]);
2194 wkMax := Max(wkMax, wkInt);
2198 wkMin := Min(wkMin, wkInt);
2199 end else if Trim(SList[i]) = 'n' then begin
2200 Result.FFirst := True;
2202 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2203 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2204 if Copy(SList[i], 1, 1) = 'n' then
2205 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2207 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2208 Result.FFirst := True;
2209 wkMax := Max(wkMax, wkInt);
2213 wkMin := Min(wkMin, wkInt);
2217 if Result.FStBegin and (not Result.FToEnd) then
2219 else if (not Result.FStBegin) and Result.FToEnd then
2221 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2222 Result.FSt := wkMin;
2223 Result.FTo := wkMax;
2225 //Result.FSt := wkMin;
2226 //Result.FTo := wkMax;
2232 Result.FDone := True;
2236 //
\90Vkako
\8f\91\8e®
2237 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2238 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2239 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2240 SList := TStringList.Create;
2243 FAWKStr.RegExp := '/';
2244 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2245 Result.FBBS := SList[1];
2246 Result.FKey := ChangeFileExt(SList[5], '');
2247 Result.FFirst := True;
2253 Result.FDone := True;
2257 //
\8b\8ckako
\8f\91\8e®
2258 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2259 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2260 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2261 SList := TStringList.Create;
2264 FAWKStr.RegExp := '/';
2265 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2266 Result.FBBS := SList[1];
2267 Result.FKey := ChangeFileExt(SList[4], '');
2268 Result.FFirst := True;
2274 Result.FDone := True;
2278 //log
\8by
\82Ñlog2
\8f\91\8e®
2279 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2280 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2281 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2282 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2283 SList := TStringList.Create;
2286 FAWKStr.RegExp := '/';
2287 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2288 Result.FBBS := SList[2];
2289 Result.FKey := ChangeFileExt(SList[5], '');
2290 Result.FFirst := True;
2296 Result.FDone := True;
2301 //
\8b\8cURL
\8f\91\8e®
2302 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2303 FAWKStr.RegExp := '/test/read\.cgi\?';
2304 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2305 s := Copy(s, 16, Length(s));
2306 SList := TStringList.Create;
2309 FAWKStr.RegExp := '&';
2310 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2311 Result.FFirst := True;
2312 for i := 0 to SList.Count - 1 do begin
2313 if Pos('bbs=', SList[i]) = 1 then begin
2314 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2315 end else if Pos('key=', SList[i]) = 1 then begin
2316 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2317 end else if Pos('st=', SList[i]) = 1 then begin
2318 wk := Copy(SList[i], 4, Length(SList[i]));
2319 if IsNumeric(wk) then
2320 Result.FSt := StrToInt(wk)
2321 else if wk = '' then
2322 Result.FStBegin := True;
2323 end else if Pos('to=', SList[i]) = 1 then begin
2324 wk := Copy(SList[i], 4, Length(SList[i]));
2325 if IsNumeric(wk) then
2326 Result.FTo := StrToInt(wk)
2327 else if wk = '' then
2328 Result.FToEnd := True;
2329 end else if Pos('nofirst=', SList[i]) = 1 then begin
2330 Result.FFirst := False;
2339 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2340 Result.FDone := True;
2348 \brief URI
\82ð
\95ª
\89ð
2349 \param URL
\95ª
\89ð
\82·
\82é URI
2350 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2351 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2352 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2353 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2354 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2355 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2357 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2367 URI := TIdURI.Create(URL);
2369 Protocol := URI.Protocol;
2372 Document := URI.Document;
2374 Bookmark := URI.Bookmark;
2381 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2382 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2384 function TGikoSys.GetVersionBuild: Integer;
2386 FixedFileInfo: PVSFixedFileInfo;
2387 VersionHandle, VersionSize: DWORD;
2388 pVersionInfo: Pointer;
2393 AppFile := Application.ExeName;
2394 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2395 if VersionSize = 0 then
2397 GetMem(pVersionInfo, VersionSize);
2399 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2400 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2401 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2403 FreeMem(pVersionInfo, VersionSize);
2408 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2409 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2410 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2412 \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
2413 \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
2414 \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
2415 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2417 \97á(
\90³
\8bK
\89»
\91O):\n
2418 http://
\92\86\97ª/ \n
2419 http://
\92\86\97ª/20-100
2421 (
\90³
\8bK
\89»
\8cã):\n
2422 http://
\92\86\97ª/l50
2424 function TGikoSys.GetBrowsableThreadURL(
2428 threadItem : TThreadItem;
2429 boardPlugIn : TBoardPlugIn;
2434 //=====
\83v
\83\89\83O
\83C
\83\93
2436 for i := Length( BoardGroups ) - 1 downto 1 do begin
2437 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2438 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2439 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2440 if board <> nil then begin
2441 boardPlugIn := BoardGroups[i].BoardPlugIn;
2442 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2443 Result := threadItem.URL;
2452 // 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¢
2455 if Length( Result ) = 0 then
2456 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2461 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2462 \param inURL
\83X
\83\8c\83b
\83h URL
2465 function TGikoSys.GetThreadURL2BoardURL(
2469 threadItem : TThreadItem;
2470 boardPlugIn : TBoardPlugIn;
2475 //=====
\83v
\83\89\83O
\83C
\83\93
2477 for i := Length( BoardGroups ) - 1 downto 1 do begin
2478 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2479 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2480 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2481 boardPlugIn := BoardGroups[i].BoardPlugIn;
2482 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2483 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2491 // 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¢
2494 if Length( Result ) = 0 then
2495 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2500 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2501 \param inURL
\83X
\83\8c\83b
\83h URL
2503 \see TGikoSys.GetThreadURL2BoardURL
2505 function TGikoSys.Get2chThreadURL2BoardURL(
2509 Protocol, Host, Path, Document, Port, Bookmark : string;
2510 BBSID, BBSKey : string;
2514 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2515 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2517 foundPos := Pos( '/test/read.cgi', inURL );
2518 if {(Is2chHost(Host)) and} (foundPos > 0) then
2519 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2521 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2526 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2527 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2528 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2529 \see TGikoSys.GetBrowsableThreadURL
2531 function TGikoSys.Get2chBrowsableThreadURL(
2535 Protocol, Host, Path, Document, Port, Bookmark : string;
2536 BBSID, BBSKey : string;
2540 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2543 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2544 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2545 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2547 if Is2chHost( Host ) then begin
2548 Result := Protocol + '://' + Host +
2549 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2551 if foundPos > 0 then
2552 Result := Copy( inURL, 1, foundPos ) +
2553 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2555 Result := Protocol + '://' + Host +
2556 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2563 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2564 \param inBoard
\94Â URL
2565 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2566 \return
\83X
\83\8c\83b
\83h URL
2568 function TGikoSys.Get2chBoard2ThreadURL(
2576 server := UrlToServer( inBoard.URL );
2577 //if Is2chHost( server ) then
2578 if inBoard.Is2ch then
2579 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2581 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2586 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2588 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2590 procedure TGikoSys.ListBoardFile;
2592 boardFileList : TStringList;
2594 sCategory : TCategory;
2598 for i := 0 to Length( BBSs ) - 1 do
2602 SetLength( BBSs, 0 );
2605 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2606 if FileExists( GikoSys.GetBoardFileName ) then begin
2607 SetLength( BBSs, l + 1 );
2608 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2609 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2613 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2614 SetLength( BBSs, l + 1 );
2615 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2616 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2620 // Board
\83t
\83H
\83\8b\83_
2621 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2622 BoardFileList := TStringList.Create;
2624 BoardFileList.BeginUpdate;
2625 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*.txt', BoardFileList, True, True );
2626 BoardFileList.EndUpdate;
2627 SetLength( BBSs, l + BoardFileList.Count );
2628 for i := BoardFileList.Count - 1 downto 0 do begin
2629 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2630 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2638 //
\93Á
\8eê
\97p
\93rBBS
\90¶
\90¬
2639 //
\8aù
\82É
\91¶
\8dÝ
\82·
\82é
\8fê
\8d\87\82Í
\8dí
\8f\9c\82·
\82é
2640 DestorySpecialBBS(BoardGroup.SpecialBBS);
2641 SpecialBBS := TBBS.Create('');
2642 SpecialBBS.Title := '
\93Á
\8eê
\97p
\93r(
\94ñ
\95\
\8e¦)';
2643 sCategory := TCategory.Create;
2645 sCategory.Title := '
\93Á
\8eê
\97p
\93r(
\94ñ
\95\
\8e¦)';
2646 SpecialBBS.Add(sCategory);
2647 BoardGroup.SpecialBoard := TSpecialBoard.Create(nil, 'http://localhost/gikonavi/special/index.html');
2648 BoardGroup.SpecialBoard.Title := '
\83^
\83u
\88ê
\97\97';
2649 BoardGroup.SpecialBoard.IsThreadDatRead := True;
2650 sCategory.Add(BoardGroup.SpecialBoard);
2654 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2655 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2657 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2662 boardFile : TStringList;
2663 CategoryList : TStringList;
2664 BoardList : TStringList;
2665 Category : TCategory;
2669 // RoundItem : TRoundItem;
2671 i, iBound : Integer;
2672 j, jBound : Integer;
2673 k, kBound : Integer;
2676 if not FileExists( bbs.FilePath ) then
2680 ini := TMemIniFile.Create('');
2681 boardFile := TStringList.Create;
2684 boardFile.LoadFromFile( bbs.FilePath );
2686 ini.SetStrings( boardFile );
2687 CategoryList := TStringList.Create;
2688 BoardList := TStringList.Create;
2690 ini.ReadSections( CategoryList );
2692 iBound := CategoryList.Count - 1;
2693 for i := 0 to iBound do begin
2694 ini.ReadSection( CategoryList[i], BoardList );
2695 Category := TCategory.Create;
2696 Category.No := i + 1;
2697 Category.Title := CategoryList[i];
2699 jBound := BoardList.Count - 1;
2700 for j := 0 to jBound do begin
2702 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2703 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2704 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2705 //=====
\83v
\83\89\83O
\83C
\83\93
2707 kBound := Length(BoardGroups) - 1;
2708 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2709 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2710 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2711 if not BoardGroups[k].Find(inistr, p) then begin
2712 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2713 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2714 if not BoardGroups[k].Find(tmpstring, p) then begin
2716 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2717 BoardGroups[k].AddObject(tmpstring, Board);
2718 Category.Add(Board);
2720 //
\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é
2724 Board := TBoard(BoardGroups[k].Objects[p]);
2725 if Board.ParentCategory <> Category then
2726 Category.Add(Board);
2730 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2731 BoardGroups[k].AddObject(tmpstring, Board);
2732 Category.Add(Board);
2734 //
\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é
2739 Board := TBoard(BoardGroups[k].Objects[p]);
2740 if Board.ParentCategory <> Category then
2741 Category.Add(Board);
2748 // 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¢
2751 if (Board = nil) then begin
2752 if not BoardGroups[0].Find(inistr,p) then begin
2753 Board := TBoard.Create( nil, inistr );
2754 BoardGroups[0].AddObject(inistr, Board);
2755 Category.Add(Board);
2757 Board := TBoard(BoardGroups[0].Objects[p]);
2758 if Board.ParentCategory <> Category then
2759 Category.Add(Board);
2763 if (Board.Multiplicity = 0) then begin
2766 Board.Multiplicity := 1;
2767 Board.Title := BoardList[j];
2768 Board.RoundDate := ZERO_DATE;
2773 Board.Multiplicity := Board.Multiplicity + 1;
2778 bbs.Add( Category );
2783 bbs.IsBoardFileRead := True;
2796 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2797 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2799 function TGikoSys.GetUnknownCategory : TCategory;
2801 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2804 if Length( BBSs ) < 2 then begin
2809 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2810 if Result = nil then begin
2811 Result := TCategory.Create;
2812 Result.Title := UNKNOWN_CATEGORY;
2813 BBSs[ 1 ].Add( Result );
2819 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2820 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2822 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2824 category : TCategory;
2826 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2829 category := GetUnknownCategory;
2830 if category = nil then begin
2833 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2834 if Result = nil then begin
2835 Result := TBoard.Create( inPlugIn, inURL );
2836 Result.Title := UNKNOWN_BOARD;
2837 category.Add( Result );
2844 function TGikoSys.GetSambaFileName : string;
2846 Result := Setting.GetSambaFileName;
2849 \brief
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82Ö
\82Ì
\83A
\83\93\83J
\81[
\97pHTML
\8dì
\90¬
2850 \param Numbers
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86
2851 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2852 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2853 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2855 function TGikoSys.CreateResAnchor(
2856 var Numbers: TStringList; ThreadItem: TThreadItem;
2857 limited: Integer):string;
2861 ResLink : TResLinkRec;
2863 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2865 Res.FType := glt2chNew;
2868 if (Numbers <> nil) and (Numbers.Count > 0) then begin
2869 if (limited > 0) and (Numbers.Count > limited) then begin
2870 for i := Numbers.Count - limited to Numbers.Count - 1 do begin
2871 Res.FBody := Res.FBody + '>' + Numbers[i] + ' ';
2874 for i := 0 to Numbers.Count - 1 do begin
2875 Res.FBody := Res.FBody + '>' + Numbers[i] + ' ';
2878 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2879 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2880 HTMLCreater.ConvRes(@Res, @ResLink, false);
2881 Result := Res.FBody;
2886 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2887 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2888 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2889 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2891 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2894 ReadList: TStringList;
2896 boardPlugIn : TBoardPlugIn;
2898 procedure CheckSameID(const AID:String; const Target: String; no: Integer);
2902 pos := AnsiPos('id:', LowerCase(Target));
2903 if (pos > 0) then begin
2904 if(AnsiPos(AID, Copy(Target, pos-1, Length(Target))) > 0) then begin
2905 body.Add(IntToStr(no));
2908 if(AnsiPos(AID, Target) > 0) then begin
2909 body.Add(IntToStr(no));
2914 if (not IsNoValidID(AID)) and
2915 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2916 //if ThreadItem.IsBoardPlugInAvailable then begin
2917 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2918 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2919 //boardPlugIn := ThreadItem.BoardPlugIn;
2920 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2922 for i := 0 to threadItem.Count - 1 do begin
2924 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2925 CheckSameID(AID, Res.FDateTime, i+1);
2928 ReadList := TStringList.Create;
2930 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2931 for i := 0 to ReadList.Count - 1 do begin
2932 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2933 CheckSameID(AID, Res.FDateTime, i+1);
2943 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2944 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2945 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2946 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2948 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2952 AID := GetResID(AIDNum, ThreadItem);
2953 if not IsNoValidID(AID) then begin
2954 GetSameIDRes(AID, ThreadItem, body);
2958 \brief
\93\8a\8de ID
\8eæ
\93¾
2959 \param AIDNum
\93\8a\8de
\83\8c\83X
\94Ô
\8d\86
2960 \param ThreadItem
\93\8a\8de
\83X
\83\8c\83b
\83h
2961 \param body OUT:
\93\8a\8deID
2963 function TGikoSys.GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
2966 boardPlugIn : TBoardPlugIn;
2969 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2970 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2971 //if ThreadItem.IsBoardPlugInAvailable then begin
2972 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2973 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2974 //boardPlugIn := ThreadItem.BoardPlugIn;
2975 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2976 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2978 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2980 Result := ExtructResID(Res.FDateTime);
2984 \brief
\83\8c\83X
\82Ì
\8e\9e\8d\8f\95\94\82©
\82çID
\82ð
\92\8a\8fo
\82·
\82é
2985 \param ADateStr
\8e\9e\8d\8f\95\94\82Ì
\95¶
\8e\9a\97ñ
2986 \return ID(ID
\82Æ
\82Ý
\82È
\82¹
\82é
\95\94\95ª
\82ª
\82È
\82¢
\82Æ
\82«
\82Í
\8bó
\95¶
\8e\9a\97ñ)
2988 function TGikoSys.ExtructResID(ADateStr: String): String;
2990 stlist : TStringList;
2993 if AnsiPos('id', AnsiLowerCase(ADateStr)) > 0 then begin
2994 Result := Copy(ADateStr, AnsiPos('id', AnsiLowerCase(ADateStr)), Length(ADateStr));
2995 if AnsiPos(' ', Result) > 0 then begin
2996 Result := Copy(Result, 1, AnsiPos(' ', Result) - 1);
2998 Result := ' ' + Result;
3000 stlist := TStringList.Create;
3002 stList.Delimiter := ' ';
3003 stList.DelimitedText := ADateStr;
3004 //
\93ú
\95t
\8e\9e\8d\8f ID
\91¼
\81@
\82Æ
\8cÅ
\92è
\82Å
\8dl
\82¦
\82é
3005 if (stList.Count >= 3) then begin
3006 if Length(stList[3 - 1]) >= 7 then begin
3007 Result := stList[3 - 1];
3017 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
3018 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3019 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
3021 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
3024 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3025 Bayesian.CountWord( text, wordCount );
3030 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
3031 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3032 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
3033 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
3034 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
3035 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
3036 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
3038 \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
3039 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
3041 \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
3043 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
3046 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3047 Bayesian.Forget( wordCount, isSpam );
3052 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3053 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3054 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3056 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3059 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3060 Bayesian.Learn( wordCount, isSpam );
3065 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3066 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3067 \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)
3068 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3070 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3073 case Setting.SpamFilterAlgorithm of
3074 gsfaNone: Result := 0;
3075 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3076 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3077 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3084 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3085 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3087 [
\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Ì
3088 [
\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
3090 function TGikoSys.SetUserOptionalStyle(): string;
3093 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3094 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3095 if GikoSys.Setting.BrowserFontSize <> 0 then
3096 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3097 if GikoSys.Setting.BrowserFontColor <> -1 then
3098 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3099 if GikoSys.Setting.BrowserBackColor <> -1 then
3100 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3101 case GikoSys.Setting.BrowserFontBold of
3102 -1: Result := Result + 'font-weight:normal;';
3103 1: Result := Result + 'font-weight:bold;';
3105 case GikoSys.Setting.BrowserFontItalic of
3106 -1: Result := Result + 'font-style:normal;';
3107 1: Result := Result + 'font-style:italic;';
3112 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3113 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3114 \param ANum
\83\8c\83X
\94Ô
3115 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3116 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3118 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3121 BNum, BMark : string;
3123 p := AnsiPos('BE:', AnsiUpperCase(AID));
3125 BNum := Copy(AID, p, Length(AID));
3126 AID := Copy(AID, 1, p - 1);
3127 p := AnsiPos('-', BNum);
3129 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3130 BNum := Copy(BNum, 1, p - 1);
3133 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3134 + '" target=_blank>' + BMark + '</a>';
3140 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3141 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3142 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3144 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3146 Translation = '\VarFileInfo\Translation';
3147 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3149 BufSize, HWnd: DWORD;
3150 VerInfoBuf: Pointer;
3152 VerDataLen: Longword;
3155 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3156 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3157 if BufSize <> 0 then begin
3158 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3159 GetMem(VerInfoBuf, BufSize);
3161 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3162 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3163 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3165 if not (VerDataLen > 0) then
3166 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3168 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3169 //
\81¨'\StringFileInfo\027382\FileDescription'
3170 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3171 [IntToHex(Integer(VerData^) and $FFFF, 4),
3172 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3173 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3175 if VerDataLen > 0 then begin
3176 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3178 SetLength(result, VerDataLen);
3179 StrLCopy(PChar(result), VerData, VerDataLen);
3183 FreeMem(VerInfoBuf);
3189 \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
3190 \return 1
\8ds1plugin
3192 function TGikoSys.GetPluginsInfo(): String;
3195 major, minor, revision : Cardinal;
3196 agent, release : String;
3198 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3201 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3202 for i := 0 to Length(BoardGroups) - 1 do begin
3203 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3204 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3205 if BoardGroups[i].BoardPlugIn <> nil then begin
3206 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3209 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3211 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3217 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3218 function TGikoSys.GetIEVersion: string;
3222 R := TRegistry.Create;
3224 //
\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¢
3225 R.Access := KEY_EXECUTE;
3226 R.RootKey := HKEY_LOCAL_MACHINE;
3227 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3229 Result := R.ReadString('version');
3231 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3238 //! 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¼
3239 function TGikoSys.GetMainKeyFileName : String;
3241 Result := Setting.GetMainKeyFileName;
3243 //! 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¼
3244 function TGikoSys.GetEditorKeyFileName: String;
3246 Result := Setting.GetEditorKeyFileName;
3248 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3249 function TGikoSys.GetInputAssistFileName: String;
3251 Result := Setting.GetInputAssistFileName;
3253 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3254 procedure TGikoSys.SetGikoMessage;
3256 if FGikoMessage = nil then begin
3257 FGikoMessage := TGikoMessage.Create;
3262 if (Setting.GengoSupport) then begin
3264 if (FileExists(Setting.GetLanguageFileName)) then begin
3265 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3272 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3273 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3276 if FGikoMessage <> nil then begin
3277 Result := FGikoMessage.GetMessage(MesType);
3281 //Tue, 17 Dec 2002 12:18:07 GMT
\81¨ TDateTime
\82Ö
3282 //MonaUtils
\82©
\82ç
\88Ú
\93®
3283 function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime;
3284 function StrMonthToMonth(const s: string): integer;
3286 m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
3291 for i := Low(m) to High(m) do begin
3292 if (SameText(s, m[i])) then begin
3299 wDay, wMonth, wYear: word;
3300 wHour, wMinute, wSecond: word;
3304 wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0);
3305 wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2));
3306 wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0);
3307 sTime := ChooseString(DateStr, ' ', 4);
3308 wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0);
3309 wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0);
3310 wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0);
3311 d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0);
3314 //MonaUtils
\82©
\82ç
\88Ú
\93®
3315 //!
\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·
3316 function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string;
3322 for i := 0 to Index - 1 do begin
3323 if (AnsiPos(Separator, S) = 0) then S := ''
3324 else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S));
3326 p := AnsiPos(Separator, S);
3327 if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S;
3329 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
3330 procedure TGikoSys.RestoreThreadData(Board : TBoard);
3332 SECTION = 'Setting';
3334 TmpFileList : TStringList;
3337 ThreadItem : TThreadItem;
3338 Boardpath, tmpStr : string;
3340 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
3342 TmpFileList := TStringList.Create;
3343 TmpFileList.Sorted := True;
3344 TmpFileList.BeginUpdate;
3346 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
3347 GetFileList(Boardpath, '*.tmp', TmpFileList, False);
3348 TmpFileList.EndUpdate;
3349 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
3350 for i := TmpFileList.Count - 1 downto 0 do begin
3351 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
3352 if ThreadItem <> nil then begin
3353 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
3355 tmpStr := ini.ReadString(SECTION, 'RoundDate', DateTimeToStr(ZERO_DATE));
3356 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
3358 tmpStr := ini.ReadString(SECTION, 'LastModified', DateTimeToStr(ZERO_DATE));
3359 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
3360 ThreadItem.Count := ini.ReadInteger(SECTION, 'Count', 0);
3361 ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
3363 ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
3364 ThreadItem.IsLogFile := FileExists(ThreadItem.GetThreadFileName);
3365 if(ThreadItem.Size = 0) and (ThreadItem.IsLogFile) then begin
3367 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
3372 //
\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ã
3373 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
3374 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
3375 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
3376 ThreadItem.ScrollTop := ini.ReadInteger(SECTION, 'ScrollTop', 0);
3377 ThreadItem.AllResCount := ini.ReadInteger(SECTION, 'AllResCount', ThreadItem.Count);
3378 ThreadItem.NewResCount := ini.ReadInteger(SECTION, 'NewResCount', 0);
3379 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger(SECTION, 'AgeSage', Ord(gasNone)));
3383 DeleteFile(Boardpath + TmpFileList[i]);
3392 \brief User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
3393 \return Boolean
\97\98\97p
\82Å
\82«
\82é
\8fê
\8d\87\82ÍTrue
3395 function TGikoSys.CanUser32DLL: Boolean;
3403 hUser32 := LoadLibrary('User32.dll');
3404 if hUser32 <> 0 then begin
3411 FreeLibrary(hUser32);
3415 \brief OE
\88ø
\97p
\95\84\8eæ
\93¾
3416 \return OE
\82Ì
\88ø
\97p
\95\84\81i
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87\82Í'>')
3418 function TGikoSys.GetOEIndentChar : string;
3421 Identities : string;
3424 DEFAULT_CHAR = '> ';
3425 OE_MAIL_PATH = '\Software\Microsoft\Outlook Express\5.0\Mail';
3426 INDENT_CHAR = 'Indent Char';
3429 Result := DEFAULT_CHAR;
3430 regKey := TRegistry.Create;
3433 regKey.RootKey := HKEY_CURRENT_USER;
3434 if not regKey.OpenKey( 'Identities', False ) then
3436 Identities := regKey.ReadString( 'Default User ID' );
3437 if Identities = '' then
3439 if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then
3441 IndentChar := regKey.ReadInteger( INDENT_CHAR );
3442 Result := Char( IndentChar ) + ' ';
3450 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3451 function TGikoSys.GetReplaceFileName: String;
3453 Result := Setting.GetReplaceFileName;
3455 //!
\83v
\83\8c\83r
\83\85\81[
\8ag
\92£
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3456 function TGikoSys.GetExtpreviewFileName: String;
3458 Result := Setting.GetExtprevieFileName;
3461 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
3462 function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime;
3467 //
\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
3468 tmp := ChangeFileExt(FileName, '');
3469 if AnsiPos('_', tmp) <> 0 then
3470 if AnsiPos('_', tmp) > 9 then
3471 tmp := Copy(tmp, 1, AnsiPos('_', tmp)-1)
3473 Delete(tmp, AnsiPos('_', tmp), 1);
3475 if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
3476 Insert('1', tmp, 1);
3478 unixtime := StrToInt64Def(tmp, ZERO_DATE);
3479 Result := UnixToDateTime(unixtime) + OffsetFromUTC;
3482 procedure TGikoSys.ShowRefCount(msg: String; unk: IUnknown);
3488 if not Assigned(unk) then
3494 count := unk._Release;
3496 Writeln(msg + ' RefCount=' + IntToStr(count));
3498 Writeln(msg + ' RefCount=exception!!');
3502 function TGikoSys.GetBoukenCookie(AURL: String): String;
3504 Protocol, Host, Path, Document, Port,Bookmark : String;
3507 GikoSys.ParseURI(AURL, Protocol, Host, Path, Document, Port,Bookmark);
3508 if ( Length(Host) > 0 ) then begin
3509 Result := Setting.GetBoukenCookie(Host);
3512 procedure TGikoSys.SetBoukenCookie(ACookieValue, ADomain: String);
3514 if ( Length(ADomain) > 0 ) then begin
3515 Setting.SetBoukenCookie(ACookieValue, ADomain);
3518 //!
\96`
\8c¯
\82Ì
\8f\91Domain
\88ê
\97\97\8eæ
\93¾
3519 procedure TGikoSys.GetBoukenDomain(var ADomain: TStringList);
3524 for i := 0 to Setting.BoukenCookieList.Count - 1 do begin
3525 ADomain.Add( Setting.BoukenCookieList.Names[i] );
3528 //!
\96`
\8c¯
\82Ì
\8f\91Cookie
\8dí
\8f\9c
3529 procedure TGikoSys.DelBoukenCookie(ADomain: String);
3533 for i := 0 to Setting.BoukenCookieList.Count - 1 do begin
3534 if ( Setting.BoukenCookieList.Names[i] = ADomain ) then begin
3535 Setting.BoukenCookieList.Delete(i);
3540 function TGikoSys.GetBouken(AURL: String; var Domain: String): String;
3542 Protocol, Host, Path, Document, Port,Bookmark : String;
3547 GikoSys.ParseURI(AURL, Protocol, Host, Path, Document, Port,Bookmark);
3548 if ( Length(Host) > 0 ) then begin
3549 Setting.GetBouken(Host, Domain, Cookie);
3555 GikoSys := TGikoSys.Create;
3558 if GikoSys <> nil then begin
3559 FreeAndNil(GikoSys);