6 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
7 ComCtrls, {IniFiles,} ShellAPI, ActnList, Math,
15 {HttpApp,} URLMon, IdGlobal, IdURI, {Masks,}
16 Setting, BoardGroup, gzip, Dolib, bmRegExp, AbonUnit,
17 ExternalBoardManager, ExternalBoardPlugInMain,
18 GikoBayesian, GikoMessage;
22 vrComments, //!<
\83R
\83\81\83\93\83g
23 vrCompanyName, //!<
\89ï
\8eÐ
\96¼
24 vrFileDescription, //!<
\90à
\96¾
25 vrFileVersion, //!<
\83t
\83@
\83C
\83\8b\83o
\81[
\83W
\83\87\83\93
26 vrInternalName, //!<
\93à
\95\94\96¼
27 vrLegalCopyright, //!<
\92\98\8dì
\8c
28 vrLegalTrademarks, //!<
\8f¤
\95W
29 vrOriginalFilename, //!<
\90³
\8e®
\83t
\83@
\83C
\83\8b\96¼
30 vrPrivateBuild, //!<
\83v
\83\89\83C
\83x
\81[
\83g
\83r
\83\8b\83h
\8fî
\95ñ
31 vrProductName, //!<
\90»
\95i
\96¼
32 vrProductVersion, //!<
\90»
\95i
\83o
\81[
\83W
\83\87\83\93
33 vrSpecialBuild); //!<
\83X
\83y
\83V
\83\83\83\8b\83r
\83\8b\83h
\8fî
\95ñ
36 TGikoBBSType = (gbt2ch);
37 //!
\83\8d\83O
\83^
\83C
\83v
38 TGikoLogType = (glt2chNew, glt2chOld);
39 //!
\83\81\83b
\83Z
\81[
\83W
\83A
\83C
\83R
\83\93
40 TGikoMessageIcon = (gmiOK, gmiSAD, gmiNG, gmiWhat, gmiNone);
41 //! URL
\83I
\81[
\83v
\83\93\83u
\83\89\83E
\83U
\83^
\83C
\83v
42 TGikoBrowserType = (gbtIE, gbtUserApp, gbtAuto);
45 TStrTokSeparator = set of Char;
51 //!
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b\83\8c\83R
\81[
\83h
59 FRoundDate: TDateTime;
60 FLastModified: TDateTime;
63 FMishiyou: Boolean; //!<
\96¢
\8eg
\97p
67 FAllResCount: Integer;
68 FNewResCount: Integer;
69 FAgeSage: TGikoAgeSage;
72 //!
\83T
\83u
\83W
\83F
\83N
\83g
\83\8c\83R
\81[
\83h
79 //!
\83\8c\83X
\83\8c\83R
\81[
\83h
\82Ö
\82Ì
\83|
\83C
\83\93\83^
82 //!
\83\8c\83X
\83\8c\83R
\81[
\83h
92 //! URLPath
\83\8c\83R
\81[
\83h
94 FBBS: string; //!< BBSID
95 FKey: string; //!< ThreadID
96 FSt: Int64; //!<
\8aJ
\8en
\83\8c\83X
\94Ô
97 FTo: Int64; //!<
\8fI
\97¹
\83\8c\83X
\94Ô
98 FFirst: Boolean; //!< >>1
\82Ì
\95\
\8e¦
99 FStBegin: Boolean; //!< 1
\81`
\95\
\8e¦
100 FToEnd: Boolean; //!<
\81`
\8dÅ
\8cã
\82Ü
\82Å
\95\
\8e¦
101 FDone: Boolean; //!<
\90¬
\8c÷
102 FNoParam: Boolean; //!<
\83\8c\83X
\94Ô
\83p
\83\89\83\81\81[
\83^
\82È
\82µ
105 TGikoSys = class(TObject)
112 FBayesian : TGikoBayesian; //!<
\83x
\83C
\83W
\83A
\83\93\83t
\83B
\83\8b\83^
113 FVersion : String; //!<
\83t
\83@
\83C
\83\8b\83o
\81[
\83W
\83\87\83\93
114 FGikoMessage: TGikoMessage;
118 FSelectResFilter : TAbon;
119 //FBoardURLList: TStringList;
122 destructor Destroy; override;
123 property ResRange : Longint read FResRange write FResRange;
124 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
125 property Version : String read FVersion;
126 // function MsgBox(Msg: string; Title: string; Flags: Longint): integer; overload;
127 // function MsgBox(Handle: THandle; Msg: string; Title: string; Flags: Longint): integer; overload;
128 function IsNumeric(s: string): boolean;
129 function IsFloat(s: string): boolean;
130 function DirectoryExistsEx(const Name: string): Boolean;
131 function ForceDirectoriesEx(Dir: string): Boolean;
132 // function GetVersion: string;
134 function GetBoardFileName: string;
135 function GetCustomBoardFileName: string;
136 function GetHtmlTempFileName: string;
137 function GetAppDir: string;
138 function GetTempFolder: string;
139 function GetSentFileName: string;
140 function GetConfigDir: string;
141 function GetSkinDir: string;
142 function GetSkinHeaderFileName: string;
143 function GetSkinFooterFileName: string;
144 function GetSkinResFileName: string;
145 function GetSkinNewResFileName: string;
146 function GetSkinBookmarkFileName: string;
147 function GetSkinNewmarkFileName: string;
148 function GetStyleSheetDir: string;
149 function GetOutBoxFileName: string;
150 function GetUserAgent: string;
151 function GetSambaFileName : string;
153 function GetMainKeyFileName : String;
154 function GetEditorKeyFileName: String;
155 function GetInputAssistFileName: String;
156 procedure ReadSubjectFile(Board: TBoard);
157 procedure CreateThreadDat(Board: TBoard);
158 procedure WriteThreadDat(Board: TBoard);
159 function ParseIndexLine(Line: string): TIndexRec;
160 procedure GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean); overload;
161 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¢
162 procedure GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
164 function DivideSubject(Line: string): TSubjectRec;
165 property Setting: TSetting read FSetting write FSetting;
166 property Dolib: TDolib read FDolib write FDolib;
168 function UrlToID(url: string): string;
169 function UrlToServer(url: string): string;
171 function StrTokFirst(const s:string; const sep:TStrTokSeparator; var Rec:TStrTokRec):string;
172 function StrTokNext(const sep:TStrTokSeparator; var Rec:TStrTokRec): string;
174 function GetFileSize(FileName : string) : longint;
175 function GetFileLineCount(FileName : string): longint;
176 function IntToDateTime(val: Int64): TDateTime;
177 function DateTimeToInt(ADate: TDateTime): Int64;
179 function ReadThreadFile(FileName: string; Line: Integer): string;
181 procedure MenuFont(Font: TFont);
183 function RemoveToken(var s:string; const delimiter:string):string;
184 function GetTokenIndex(s: string; delimiter: string; index: Integer): string;
186 function GetShortName(const LongName: string; ALength: integer): string;
187 function BoolToInt(b: Boolean): Integer;
188 function IntToBool(i: Integer): Boolean;
189 function GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
190 procedure LoadKeySetting(ActionList: TActionList; FileName: String);
191 procedure SaveKeySetting(ActionList: TActionList; FileName: String);
192 procedure CreateProcess(const AppPath: string; const Param: string);
193 procedure OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
194 function HTMLDecode(const AStr: String): String;
195 function GetHRefText(s: string): string;
196 function Is2chHost(Host: string): Boolean;
197 function Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
198 function Parse2chURL2(URL: string): TPathRec;
199 procedure ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
200 function GetVersionBuild: Integer;
201 function GetBrowsableThreadURL( inURL : string ) : string;
202 function GetThreadURL2BoardURL( inURL : string ) : string;
203 function Get2chThreadURL2BoardURL( inURL : string ) : string;
204 function Get2chBrowsableThreadURL( inURL : string ) : string;
205 function Get2chBoard2ThreadURL( inBoard : TBoard; inKey : string ) : string;
206 procedure ListBoardFile;
207 procedure ReadBoardFile( bbs : TBBS );
209 function GetUnknownCategory : TCategory;
210 function GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
212 procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
214 //! Samba24
\82Ì
\83t
\83@
\83C
\83\8b\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\81B
\91¶
\8dÝ
\82µ
\82È
\82¢
\8fê
\8d\87\81Adefault
\83t
\83@
\83C
\83\8b\82ðrename
\82·
\82é
215 procedure SambaFileExists();
217 property Bayesian : TGikoBayesian read FBayesian write FBayesian;
218 function GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string; overload;
219 function GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string; overload;
220 procedure GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList); overload;
221 procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
222 function GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer; overload;
223 function GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer; overload;
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;
233 //
\88ø
\90\94\82ª
\81A
\93ú
\95t
\82Å
\82à
\8e\9e\8d\8f\82Å
\82à
\82È
\82¢
\82±
\82Æ
\82ð
\92²
\82×
\82é
234 function NotDateorTimeString(const AStr : string): boolean;
236 //!
\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Á
237 function AddBeProfileLink(AID : string; ANum: Integer): string;
238 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
239 function GetVersionInfo(KeyWord: TVerResourceKey): string;
240 //! Plugin
\82Ì
\8fî
\95ñ
\82Ì
\8eæ
\93¾
241 function GetPluginsInfo(): string;
242 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
243 function GetIEVersion: string;
244 function SetUserOptionalStyle(): string;
245 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
246 procedure SetGikoMessage;
247 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
248 function GetGikoMessage(MesType: TGikoMessageListType): String;
254 //LENGTH_RESTITLE = 40;
255 ZERO_DATE: Integer = 25569;
256 BETA_VERSION_NAME_E = 'beta';
257 BETA_VERSION_NAME_J = 'ÊÞÀ';
259 BETA_VERSION_BUILD = ''; //!< debug
\94Å
\82È
\82Ç
260 APP_NAME = 'gikoNavi';
261 BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
267 Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils, Sort, YofUtils,
271 FOLDER_INDEX_VERSION = '1.01';
272 USER_AGENT = 'Monazilla';
273 DEFAULT_NGWORD_FILE_NAME : String = 'NGword.txt';
274 NGWORDs_DIR_NAME : String = 'NGwords';
276 READ_PATH: string = '/test/read.cgi/';
277 OLD_READ_PATH: string = '/test/read.cgi?';
278 KAKO_PATH: string = '/kako/';
280 KeyWordStr: array [TVerResourceKey] of String = (
294 // *************************************************************************
295 //! GikoSys
\83R
\83\93\83X
\83g
\83\89\83N
\83^
296 // *************************************************************************
297 constructor TGikoSys.Create;
299 FSetting := TSetting.Create;
300 FDolib := TDolib.Create;
301 FAWKStr := TAWKStr.Create(nil);
302 if DirectoryExists(GetConfigDir) = false then begin
303 CreateDir(GetConfigDir);
305 FAbon := TAbon.Create;
306 FAbon.IgnoreKana := FSetting.IgnoreKana;
307 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
309 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
310 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
311 FAbon.DeleteSyria := FSetting.DeleteSyria;
312 FAbon.Deleterlo := FSetting.AbonDeleterlo;
313 FAbon.Replaceul := FSetting.AbonReplaceul;
314 FAbon.AbonPopupRes := FSetting.PopUpAbon;
316 FSelectResFilter := TAbon.Create;
317 FSelectResFilter.IgnoreKana := True;
318 //
\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
319 FSelectResFilter.AbonString := '';
321 ResRange := FSetting.ResRange;
322 FVersion := Trim(GetVersionInfo(vrFileVersion));
323 FBayesian := TGikoBayesian.Create;
324 //FBoardURLList := TStringList.Create;
325 //
\83\81\83b
\83Z
\81[
\83W
\82Ì
\8dì
\90¬
326 FGikoMessage := TGikoMessage.Create;
329 // *************************************************************************
330 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
331 // *************************************************************************
332 destructor TGikoSys.Destroy;
335 FileList: TStringList;
337 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
346 FSelectResFilter.Free;
348 //FBoardURLList.Free;
349 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
350 FileList := TStringList.Create;
352 FileList.BeginUpdate;
353 GetFileList(GetTempFolder, '*.html', FileList, False, True);
355 for i := 0 to FileList.Count - 1 do begin
356 DeleteFile(FileList[i]);
365 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
366 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
367 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
368 \todo MonaUtils.IsNumeric()
\82ª
\93¯
\93\99\82Ì
\8b@
\94\
\82ð
\95Û
\8e\9d\82µ
\82Ä
\82¢
\82é
371 function TGikoSys.IsNumeric(s: string): boolean;
382 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
383 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
384 \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
385 \todo MonaUtils.IsFloat()
\82ª
\93¯
\93\99\82Ì
\8b@
\94\
\82ð
\95Û
\8e\9d\82µ
\82Ä
\82¢
\82é
387 function TGikoSys.IsFloat(s: string): boolean;
391 Result := TextToFloat(PChar(s), v, fvExtended);
394 // *************************************************************************
395 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
396 // *************************************************************************
397 function TGikoSys.GetBoardFileName: string;
399 Result := Setting.GetBoardFileName;
402 // *************************************************************************
403 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
404 // *************************************************************************
405 function TGikoSys.GetCustomBoardFileName: string;
407 Result := Setting.GetCustomBoardFileName;
410 // *************************************************************************
411 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
412 // *************************************************************************
413 function TGikoSys.GetHtmlTempFileName: string;
415 Result := Setting.GetHtmlTempFileName;
419 // *************************************************************************
420 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
421 // *************************************************************************
422 function TGikoSys.GetAppDir: string;
424 Result := Setting.GetAppDir;
427 // *************************************************************************
428 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
429 // *************************************************************************
430 function TGikoSys.GetTempFolder: string;
432 Result := Setting.GetTempFolder;
435 // *************************************************************************
436 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
437 // *************************************************************************)
438 function TGikoSys.GetSentFileName: string;
440 Result := Setting.GetSentFileName;
443 // *************************************************************************
444 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
445 // *************************************************************************
446 function TGikoSys.GetOutBoxFileName: string;
448 Result := Setting.GetOutBoxFileName;
451 // *************************************************************************
452 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
453 // *************************************************************************
454 function TGikoSys.GetConfigDir: string;
456 Result := Setting.GetConfigDir;
459 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
460 function TGikoSys.GetStyleSheetDir: string;
462 Result := Setting.GetStyleSheetDir;
465 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
466 function TGikoSys.GetSkinDir: string;
468 Result := Setting.GetSkinDir;
471 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
472 function TGikoSys.GetSkinHeaderFileName: string;
474 Result := Setting.GetSkinHeaderFileName;
477 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
478 function TGikoSys.GetSkinFooterFileName: string;
480 Result := Setting.GetSkinFooterFileName;
483 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
484 function TGikoSys.GetSkinNewResFileName: string;
486 Result := Setting.GetSkinNewResFileName;
489 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
490 function TGikoSys.GetSkinResFileName: string;
492 Result := Setting.GetSkinResFileName;
495 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
496 function TGikoSys.GetSkinBookmarkFileName: string;
498 Result := Setting.GetSkinBookmarkFileName;
501 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
502 function TGikoSys.GetSkinNewmarkFileName: string;
504 Result := Setting.GetSkinNewmarkFileName;
507 //! UserAgent
\8eæ
\93¾
508 function TGikoSys.GetUserAgent: string;
510 if Dolib.Connected then begin
511 Result := Format('%s %s/%s%d/%s', [
518 Result := Format('%s/%s %s/%s%d/%s', [
529 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
530 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
531 \return val
\82ð
\8e¦
\82· TDateTime
533 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
535 Result := ZERO_DATE + val / 86400.0;
539 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
540 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
541 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
543 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
545 Result := Trunc((ADate - ZERO_DATE) * 86400);
550 \brief Subject
\83t
\83@
\83C
\83\8bRead
551 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
553 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
555 ThreadItem: TThreadItem;
557 FileList: TStringList;
558 TmpFileList: TStringList;
566 // RoundItem: TRoundItem;
573 //protocol, host, path, document, port, bookmark : string;
576 FavoThreadItem : TFavoriteThreadItem;
580 if Board.IsThreadDatRead then
585 usePlugIn := Board.IsBoardPlugInAvailable;
586 server := UrlToServer( Board.URL );
587 //is2ch := Is2chHost(server);
589 FileName := Board.GetFolderIndexFileName;
591 FileList := TStringList.Create;
592 FileList.Sorted := True;
593 FileList.BeginUpdate;
594 TmpFileList := TStringList.Create;
595 TmpFileList.Sorted := True;
596 TmpFileList.BeginUpdate;
597 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
598 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
600 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
601 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, False);
602 TmpFileList.EndUpdate;
604 //
\8fd
\95¡
\82ð
\96h
\82®
606 Board.Sorted := True;
608 sl := TStringList.Create;
610 if FileExists(FileName) then begin
611 sl.LoadFromFile(FileName);
613 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
614 for i := sl.Count - 1 downto 1 do begin
615 Rec := ParseIndexLine(sl[i]);
616 islog := FileList.Find( Rec.FFileName, Index );
618 ThreadItem := TThreadItem.Create(
621 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
623 if Board.is2ch then begin
624 ThreadItem := TThreadItem.Create(
627 server + 'test/read.cgi/' + Board.BBSID + '/' + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
632 ThreadItem := TThreadItem.Create(
635 server + 'test/read.cgi?bbs=' + Board.BBSID + '&key=' + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
642 ThreadItem.BeginUpdate;
644 FileList.Delete( Index );
646 ThreadItem.No := Rec.FNo;
647 ThreadItem.FileName := Rec.FFileName;
648 ThreadItem.Title := Rec.FTitle;
649 //ThreadItem.ShortTitle := CustomStringReplace(ZenToHan(ThreadItem.Title), ' ', '');
650 ThreadItem.Count := Rec.FCount;
651 ThreadItem.Size := Rec.FSize;
652 ThreadItem.RoundDate := Rec.FRoundDate;
653 ThreadItem.LastModified := Rec.FLastModified;
654 ThreadItem.Kokomade := Rec.FKokomade;
655 ThreadItem.NewReceive := Rec.FNewReceive;
656 ThreadItem.UnRead := Rec.FUnRead;
657 ThreadItem.ScrollTop := Rec.FScrollTop;
658 ThreadItem.AllResCount := Rec.FAllResCount;
659 ThreadItem.NewResCount := Rec.FNewResCount;
660 ThreadItem.AgeSage := Rec.FAgeSage;
661 ThreadItem.ParentBoard := Board;
662 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
664 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
665 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
668 ThreadItem.EndUpdate;
669 Board.Add(ThreadItem);
671 if (ThreadItem.IsLogFile) and (ThreadItem.UnRead) then
676 if UnRead <> Board.UnRead then
677 Board.UnRead := UnRead;
679 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
680 //
\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
681 for i := 0 to FileList.Count - 1 do begin
682 FileName := Boardpath + FileList[i];
684 //ResRec := DivideStrLine(ReadThreadFile(FileName, 1));
685 if usePlugIn then begin
686 ThreadItem := TThreadItem.Create(
689 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), FileList[i] ) );
690 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
692 ThreadItem := TThreadItem.Create(
695 Get2chBoard2ThreadURL( Board, ChangeFileExt( FileList[i], '' ) ) );
696 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
699 ThreadItem.BeginUpdate;
700 ThreadItem.FileName := FileList[i];
701 //ThreadItem.FilePath := FileName;
702 ThreadItem.No := Board.Count + 1;
703 ThreadItem.Title := ResRec.FTitle;
704 ThreadItem.Count := GetFileLineCount(FileName);
705 ThreadItem.AllResCount := ThreadItem.Count;
706 ThreadItem.NewResCount := ThreadItem.Count;
707 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é
708 ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) );
709 ThreadItem.LastModified := ThreadItem.RoundDate;
710 ThreadItem.Kokomade := -1;
711 ThreadItem.NewReceive := 0;
712 ThreadItem.ParentBoard := Board;
713 ThreadItem.IsLogFile := True;
714 ThreadItem.Round := False;
715 ThreadItem.UnRead := False;
716 ThreadItem.ScrollTop := 0;
717 ThreadItem.AgeSage := gasNone;
718 ThreadItem.EndUpdate;
719 Board.Add(ThreadItem);
723 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
724 for i := TmpFileList.Count - 1 downto 0 do begin
725 //if TmpFileList.Count <> 0 then begin
726 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
727 if ThreadItem <> nil then begin
728 //if TmpFileList.Find(ChangeFileExt(ThreadItem.FileName, '.tmp'), Index) then begin
729 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
731 tmpStr := ini.ReadString('Setting', 'RoundDate', DateTimeToStr(ZERO_DATE));
732 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
734 tmpStr := ini.ReadString('Setting', 'LastModified', DateTimeToStr(ZERO_DATE));
735 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
736 ThreadItem.Count := ini.ReadInteger('Setting', 'Count', 0);
737 ThreadItem.NewReceive := ini.ReadInteger('Setting', 'NewReceive', 0);
739 ThreadItem.Size := ini.ReadInteger('Setting', 'Size', 0);
740 if(ThreadItem.Size = 0) and (FileExists(ThreadItem.GetThreadFileName)) then begin
742 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
747 //
\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ã
748 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
749 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
750 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
751 ThreadItem.ScrollTop := ini.ReadInteger('Setting', 'ScrollTop', 0);
752 ThreadItem.AllResCount := ini.ReadInteger('Setting', 'AllResCount', ThreadItem.Count);
753 ThreadItem.NewResCount := ini.ReadInteger('Setting', 'NewResCount', 0);
754 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger('Setting', 'AgeSage', Ord(gasNone)));
758 DeleteFile(Boardpath + TmpFileList[i]);
766 Board.Sorted := False;
768 Board.IsThreadDatRead := True;
772 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
773 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
775 procedure TGikoSys.CreateThreadDat(Board: TBoard);
779 SubjectList: TStringList;
785 if not FileExists(Board.GetSubjectFileName) then Exit;
786 FileName := Board.GetFolderIndexFileName;
788 SubjectList := TStringList.Create;
790 SubjectList.LoadFromFile(Board.GetSubjectFileName);
791 sl := TStringList.Create;
795 sl.Add(FOLDER_INDEX_VERSION);
796 for i := 0 to SubjectList.Count - 1 do begin
797 Rec := DivideSubject(SubjectList[i]);
799 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
802 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
803 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
804 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
805 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
806 + Format('%x', [0]) + #1 //size
807 + Format('%x', [0]) + #1 //RoundDate
808 + Format('%x', [0]) + #1 //LastModified
809 + Format('%x', [0]) + #1 //Kokomade
810 + Format('%x', [0]) + #1 //NewReceive
811 + '0' + #1 //
\96¢
\8eg
\97p
812 + Format('%x', [0]) + #1 //UnRead
813 + Format('%x', [0]) + #1 //ScrollTop
814 + Format('%x', [Rec.FCount]) + #1 //AllResCount
815 + Format('%x', [0]) + #1 //NewResCount
816 + Format('%x', [0]); //AgeSage
818 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
819 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
821 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
822 Rec.FTitle, //
\83^
\83C
\83g
\83\8b
823 Rec.FCount, //
\83J
\83E
\83\93\83g
832 Rec.FCount, //AllResCount
841 sl.SaveToFile(FileName);
851 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
852 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
854 procedure TGikoSys.WriteThreadDat(Board: TBoard);
856 // Values: array[Boolean] of string = ('0', '1');
862 TmpFileList: TStringList;
864 if not Board.IsThreadDatRead then
866 FileName := Board.GetFolderIndexFileName;
867 ForceDirectoriesEx( ExtractFilePath( FileName ) );
869 sl := TStringList.Create;
870 TmpFileList := TStringList.Create;
871 TmpFileList.Sorted := true;
873 TmpFileList.BeginUpdate;
874 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
875 TmpFileList.EndUpdate;
877 sl.Add(FOLDER_INDEX_VERSION);
879 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
880 Sort.SetSortNoFlag(true);
881 Sort.SetSortOrder(true);
882 Sort.SetSortIndex(0);
883 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
884 Board.CustomSort(ThreadItemSortProc);
886 for i := 0 to Board.Count - 1 do begin
887 Board.Items[i].No := i + 1;
888 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
889 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
890 [Board.Items[i].No, //
\94Ô
\8d\86
891 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
892 Board.Items[i].Title, //
\83^
\83C
\83g
\83\8b
893 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
894 Board.Items[i].Size, //size
895 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
896 DateTimeToInt(Board.Items[i].LastModified), //LastModified
897 Board.Items[i].Kokomade, //Kokomade
898 Board.Items[i].NewReceive, //NewReceive
900 BoolToInt(Board.Items[i].UnRead), //UnRead
901 Board.Items[i].ScrollTop, //ScrollTop
902 Board.Items[i].AllResCount, //AllResCount
903 Board.Items[i].NewResCount, //NewResCount
904 Ord(Board.Items[i].AgeSage)] //AgeSage
910 sl.SaveToFile(FileName);
912 for i := 0 to TmpFileList.Count - 1 do begin
913 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
923 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
924 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
925 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
927 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
929 Result.FNo := StrToIntDef('$' + RemoveToken(Line, #1), 0);
930 Result.FFileName := RemoveToken(Line, #1);
931 Result.FTitle := RemoveToken(Line, #1);
932 Result.FCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
933 Result.FSize := StrToIntDef('$' + RemoveToken(Line, #1), 0);
934 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE));
935 Result.FLastModified := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE));
936 Result.FKokomade := StrToIntDef('$' + RemoveToken(Line, #1), -1);
937 Result.FNewReceive := StrToIntDef('$' + RemoveToken(Line, #1), 0);
938 RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
939 Result.FUnRead := IntToBool(StrToIntDef('$' + RemoveToken(Line, #1), 0));
940 Result.FScrollTop := StrToIntDef('$' + RemoveToken(Line, #1), 0);
941 Result.FAllResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
942 Result.FNewResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
943 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + RemoveToken(Line, #1), 0));
948 \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é
949 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
950 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
951 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
952 \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
953 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
955 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
956 \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
960 GetFileList('c:\', '*.txt', list, True, True);
963 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
966 SearchRec : TSearchRec;
970 //maskExt := Copy(Mask, 1, Length(Mask) - 1);
972 Path := IncludeTrailingPathDelimiter(Path);
973 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
975 while rc = 0 do begin
976 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
977 s := Path + SearchRec.Name;
978 //if (SearchRec.Attr and faDirectory > 0) then
979 // s := IncludeTrailingPathDelimiter(s)
981 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
985 List.Add(SearchRec.Name);
986 if SubDir and (SearchRec.Attr and faDirectory > 0) then
987 GetFileList(s, Mask, List, True, IsPathAdd);
989 rc := FindNext(SearchRec);
992 SysUtils.FindClose(SearchRec);
998 \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
999 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
1000 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1001 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
1002 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1003 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
1004 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
1007 GetFileList('c:\', '*.txt', list, True);
1010 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
1013 SearchRec : TSearchRec;
1016 Path := IncludeTrailingPathDelimiter(Path);
1017 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
1019 while rc = 0 do begin
1020 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1021 s := Path + SearchRec.Name;
1023 if (SearchRec.Attr and faDirectory = 0) then
1027 List.Add(SearchRec.Name);
1029 rc := FindNext(SearchRec);
1032 SysUtils.FindClose(SearchRec);
1038 \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é
1039 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1040 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1041 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1042 \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
1044 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1045 \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
1049 GetDirectoryList('c:\', '*.txt', list, True);
1052 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1055 SearchRec : TSearchRec;
1058 Path := IncludeTrailingPathDelimiter(Path);
1059 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1061 while rc = 0 do begin
1062 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1063 s := Path + SearchRec.Name;
1064 //if (SearchRec.Attr and faDirectory > 0) then
1065 // s := IncludeTrailingPathDelimiter(s)
1067 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1068 List.Add( IncludeTrailingPathDelimiter( s ) );
1069 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1070 GetDirectoryList(s, Mask, List, True);
1072 rc := FindNext(SearchRec);
1075 SysUtils.FindClose(SearchRec);
1081 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1082 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1083 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1085 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1095 if AnsiPos('<>', Line) = 0 then
1099 Result.FFileName := RemoveToken(Line, Delim);
1100 Result.FTitle := Trim(RemoveToken(Line, Delim));
1102 ws := Result.FTitle;
1103 if Copy(ws, Length(ws), 1) = ')' then begin
1106 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1109 end else if Copy(ws, Length(ws), 1) = '>' then begin
1113 for i := Length(ws) - 1 downto 1 do begin
1114 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1115 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1116 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1117 if IsNumeric(ws) then
1118 Result.FCount := StrToInt(ws);
1119 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1126 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1127 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1130 function TGikoSys.UrlToID(url: string): string;
1137 if url = '' then Exit;
1139 url := Copy(url, 0, Length(url) - 1);
1140 for i := Length(url) downto 0 do begin
1141 if url[i] = '/' then begin
1142 Result := Copy(url, i + 1, Length(url));
1152 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1153 \param url
\89ð
\8eß
\82·
\82é URL
1154 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1156 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1158 function TGikoSys.UrlToServer(url: string): string;
1165 wsURL := Trim(wsURL);
1167 if wsURL = '' then exit;
1169 if Copy(wsURL, Length(wsURL), 1) = '/' then
1170 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1172 for i := Length(wsURL) downto 0 do begin
1173 if wsURL[i] = '/' then begin
1174 Result := Copy(wsURL, 0, i);
1181 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1182 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1183 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1185 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1189 Code := GetFileAttributes(PChar(Name));
1190 Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1194 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1195 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1196 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1198 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1201 if Length(Dir) = 0 then
1202 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1203 Dir := ExcludeTrailingPathDelimiter(Dir);
1204 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1205 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1206 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1210 \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
1211 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1212 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1213 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1214 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1215 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1216 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1218 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1222 Result := StrTokNext(sep, Rec);
1226 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1227 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1228 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1229 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1230 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1231 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1233 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1240 if Len >= Pos then begin
1241 while (Pos <= Len) and (Str[Pos] in sep) do begin
1245 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1246 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1251 Result := Copy(Str, I, Pos - I);
1252 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1260 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1261 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1262 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1264 function TGikoSys.GetFileSize(FileName : string): longint;
1269 if not FileExists(FileName) then begin
1273 Assign(F, FileName);
1275 Result := FileSize(F);
1283 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1284 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1286 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1288 function TGikoSys.GetFileLineCount(FileName : string): longint;
1292 sl := TStringList.Create;
1295 sl.LoadFromFile(FileName);
1307 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1308 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1309 \param Line
\8ew
\92è
\8ds
1310 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1311 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1313 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1315 fileTmp : TStringList;
1318 if FileExists(FileName) then begin
1319 fileTmp := TStringList.Create;
1322 fileTmp.LoadFromFile( FileName );
1323 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1324 Result := fileTmp.Strings[ Line-1 ];
1327 //on EFOpenError do Result := '';
1336 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1337 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1339 procedure TGikoSys.MenuFont(Font: TFont);
1342 nm: NONCLIENTMETRICS;
1344 nm.cbSize := sizeof(NONCLIENTMETRICS);
1346 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1347 lf := nm.lfMenuFont;
1349 Font.Name := lf.lfFaceName;
1350 Font.Height := lf.lfHeight;
1352 if lf.lfWeight >= 700 then
1353 Font.Style := Font.Style + [fsBold];
1354 if lf.lfItalic = 1 then
1355 Font.Style := Font.Style + [fsItalic];
1359 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1360 \param s IN/OUT:
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
\81A
\90Ø
\82è
\8fo
\82µ
\82½
\8cã
\82Ì
\8ec
\82è
\82Ì
\95¶
\8e\9a\97ñ
1361 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1362 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1364 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1366 function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1370 p := AnsiPos(delimiter, s);
1374 Result := Copy(s, 1, p - 1);
1375 Delete(s, 1, Length(Result) + Length(delimiter));
1380 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1381 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1382 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1383 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1385 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1387 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1392 for i := 0 to index do
1393 Result := RemoveToken(s, delimiter);
1397 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1398 {procedure TGikoSys.FlashExitWrite;
1402 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1403 for i := 0 to FExitWrite.Count - 1 do
1404 WriteThreadDat(FExitWrite[i]);
1409 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1410 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1411 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1412 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1416 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1418 ERASECHAR : array [1..39] of string =
1419 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1420 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1421 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1422 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1424 Chr : array [0..255] of char;
1428 s := Trim(LongName);
1429 if (Length(s) <= ALength) then begin
1433 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1434 S := CustomStringReplace(S, ERASECHAR[i], '');
1436 if (Length(S) <= ALength) then begin
1439 Windows.LCMapString(
1440 GetUserDefaultLCID(),
1448 S := Copy(S,1,ALength);
1450 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1451 S := Copy(S, 1, Length(S) - 1);
1462 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1463 \return False..0, True..1
1465 function TGikoSys.BoolToInt(b: Boolean): Integer;
1467 Result := IfThen(b, 1, 0);
1471 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1472 \return 1..True, other..False
1473 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1474 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1476 function TGikoSys.IntToBool(i: Integer): Boolean;
1482 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1483 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1484 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1485 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1487 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1491 GZipStream: TGzipDecompressStream;
1492 TextStream: TStringStream;
1493 buf: array[0..BUF_SIZE - 1] of Byte;
1499 TextStream := TStringStream.Create('');
1501 //
\83m
\81[
\83g
\83\93\83E
\83\93\83`
\83E
\83B
\83\8b\83X2003
\91Î
\8dô(x-gzip
\82Æ
\82©
\82É
\82È
\82é
\82Ý
\82½
\82¢)
1502 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1503 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1504 ResStream.Position := 0;
1505 GZipStream := TGzipDecompressStream.Create(TextStream);
1508 FillChar(buf, BUF_SIZE, 0);
1509 cnt := ResStream.Read(buf, BUF_SIZE);
1511 GZipStream.Write(buf, BUF_SIZE);
1517 ResStream.Position := 0;
1519 FillChar(buf, BUF_SIZE, 0);
1520 cnt := ResStream.Read(buf, BUF_SIZE);
1522 TextStream.Write(buf, BUF_SIZE);
1526 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1527 s := TextStream.DataString;
1530 while (i > 0) and (s[i] = #0) do
1532 Delete(s, i + 1, ln - i);
1535 while i <> 0 do begin
1547 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1548 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1549 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1551 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1553 STD_SEC = 'KeySetting';
1559 SecList: TStringList;
1560 Component: TComponent;
1562 if not FileExists(fileName) then
1564 SecList := TStringList.Create;
1565 ini := TMemIniFile.Create(fileName);
1567 ini.ReadSection(STD_SEC, SecList);
1568 for i := 0 to SecList.Count - 1 do begin
1569 ActionName := SecList[i];
1570 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1571 if ActionKey <> -1 then begin
1572 Component := ActionList.Owner.FindComponent(ActionName);
1573 if TObject(Component) is TAction then begin
1574 TAction(Component).ShortCut := ActionKey;
1585 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82é
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\83t
\83@
\83C
\83\8b\82É
\95Û
\91¶
1586 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1587 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1589 ActionList
\82É
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82é
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð FileName
\82É
\95Û
\91¶
\82µ
\82Ü
\82·
\81B
1591 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1593 STD_SEC = 'KeySetting';
1598 ini := TMemIniFile.Create(GetConfigDir + FileName);
1600 for i := 0 to ActionList.ActionCount - 1 do begin
1601 if ActionList.Actions[i].Tag = -1 then
1603 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1613 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1614 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1615 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1617 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1619 PI: TProcessInformation;
1623 Path := '"' + AppPath + '"';
1625 Path := Path + ' ' + Param;
1627 SI.Cb := SizeOf(Si);
1628 SI.lpReserved := nil;
1629 SI.lpDesktop := nil;
1632 SI.cbReserved2 := 0;
1633 SI.lpReserved2 := nil;
1635 Windows.CreateProcess(nil,
1648 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1649 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1650 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1652 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1656 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1657 gbtUserApp, gbtAuto:
1658 if (Setting.URLApp) and (FileExists(Setting.URLAppFile)) then
1659 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1661 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1666 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1667 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1668 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1670 function TGikoSys.HTMLDecode(const AStr: String): String;
1672 Sp, Rp, Cp, Tp: PChar;
1677 SetLength(Result, Length(AStr));
1679 Rp := PChar(Result);
1682 while Sp^ <> #0 do begin
1688 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1694 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1698 while (Sp^ <> ';') and (Sp^ <> #0) do
1705 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1713 Num := IsNumeric(Copy(Tp, 1, 1));
1714 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1715 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1719 SetString(S, Tp, Sp - Tp);
1724 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1725 //[Cp^ + Sp^, Cp - PChar(AStr)])
1735 // on E:EConvertError do
1736 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1737 // [Cp^ + Sp^, Cp - PChar(AStr)])
1739 SetLength(Result, Rp - PChar(Result));
1743 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1744 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1745 \return
\8eæ
\93¾
\82µ
\82½ URL
1747 function TGikoSys.GetHRefText(s: string): string;
1757 Index := AnsiPos('href', LowerCase(s));
1760 s := Trim(Copy(s, Index + 4, Length(s)));
1761 s := Trim(Copy(s, 2, Length(s)));
1763 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1764 //if Copy(s, 1, 1) = '"' then begin
1765 if s[1] = '"' then begin
1766 s := Trim(Copy(s, 2, Length(s)));
1769 Index := AnsiPos('"', s);
1770 if Index <> 0 then begin
1771 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1772 s := Copy(s, 1, Index - 1);
1774 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1775 Index := AnsiPos(' ', s);
1776 Index2 := AnsiPos('>', s);
1779 if Index > Index2 then
1782 s := Copy(s, 1, Index - 1)
1784 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1791 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1792 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1793 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1795 function TGikoSys.Is2chHost(Host: string): Boolean;
1797 HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
1803 if RightStr( Host, 1 ) = '/' then
1804 Host := Copy( Host, 1, Length( Host ) - 1 );
1805 OutputDebugString(pchar(HOST_NAME[0]));
1806 for i := 0 to Length(HOST_NAME) - 1 do begin
1807 // Len := Length(HOST_NAME[i]);
1808 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1809 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1817 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1818 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1819 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1820 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1821 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1822 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1823 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1825 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1835 Index := AnsiPos(READ_PATH, path);
1836 if Index <> 0 then begin
1837 s := Copy(path, Index + Length(READ_PATH), Length(path));
1839 if (Length(s) > 0) and (s[1] = '/') then
1841 BBSID := GetTokenIndex(s, '/', 0);
1842 BBSKey := GetTokenIndex(s, '/', 1);
1845 Result := (BBSID <> '') or (BBSKey <> '');
1848 Index := AnsiPos(KAKO_PATH, path);
1849 if Index <> 0 then begin
1850 s := Copy(path, 2, Length(path));
1851 BBSID := GetTokenIndex(s, '/', 0);
1852 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1853 BBSID := GetTokenIndex(s, '/', 1);
1854 BBSKey := ChangeFileExt(Document, '');
1855 Result := (BBSID <> '') or (BBSKey <> '');
1858 Index := AnsiPos('read.cgi?', URL);
1859 if Index <> 0 then begin
1860 SList := TStringList.Create;
1863 // s := HTMLDecode(Document);
1864 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1865 BBSID := SList.Values['bbs'];
1866 BBSKey := SList.Values['key'];
1867 Result := (BBSID <> '') or (BBSKey <> '');
1879 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1880 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1881 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1882 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1884 http://2ch.net/
\92\86\97ª/32-50 \n
1885 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1887 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1894 URL := Trim(LowerCase(URL));
1895 if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
1899 buf := Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 );
1901 stRes := StrToInt64( buf );
1902 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1903 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
1905 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, Length( URL ) - AnsiPos('&to=', URL ) - 4 + 1 );
1908 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1909 buf := Copy( buf, 1, ps );
1913 endRes := StrToInt64(buf)
1920 if (stRes <> 0) and (endRes = 0) then
1921 endRes := stRes + MAX_POPUP_RES
1922 else if (stRes = 0) and (endRes <> 0) then begin
1923 stRes := endRes - MAX_POPUP_RES;
1927 GikoSys.GetBrowsableThreadURL( URL );
1928 end else if( AnsiPos('&res=', URL ) <> 0 ) then begin
1930 buf := Copy( URL, AnsiPos('&res=', URL ) + 5, Length( URL ) - AnsiPos('&res=', URL ) - 5 + 1 );
1933 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1934 buf := Copy( buf, 1, ps );
1937 stRes := StrToInt(buf)
1944 end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
1946 stRes := StrToInt64( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
1947 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1948 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, AnsiPos( '&nofirst=',URL) - AnsiPos('&end=', URL ) - 5);
1950 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, Length( URL ) - AnsiPos('&to=', URL ) - 5 + 1 );
1953 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1954 buf := Copy( buf, 1, ps );
1958 endRes := StrToInt64(buf);
1965 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
1966 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
1967 if Length(buf) > 0 then begin
1968 if AnsiPos('-', buf) = 1 then begin
1973 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1975 convBuf := Copy( buf, 1, ps );
1976 if convBuf <> '' then
1977 endRes := StrToInt64(convBuf)
1983 if endRes <> 0 then begin
1984 stRes := endRes - MAX_POPUP_RES;
1991 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1993 convBuf := Copy( buf, 1, ps );
1994 if convBuf <> '' then begin
1995 stRes := StrToInt64(convBuf);
1999 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2001 convBuf := Copy( buf, 1, ps );
2002 if convBuf <> '' then
2003 endRes := StrToInt64(convBuf)
2025 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2026 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2027 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2029 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2034 // convBuf : String;
2045 URL := Trim(LowerCase(URL));
2050 Result.FFirst := False;
2051 Result.FStBegin := False;
2052 Result.FToEnd := False;
2053 Result.FDone := False;
2054 Result.FNoParam := False;
2058 if URL[length(URL)] = '\' then
2060 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2061 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2062 s := Copy(URL, RStart + RLength - 1, Length(URL));
2064 //
\95W
\8f\80\8f\91\8e®
2065 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2066 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2067 FAWKStr.RegExp := '/test/read.cgi/.+/[0-9]+/?.*';
2068 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2069 s := Copy(s, 15, Length(s));
2071 SList := TStringList.Create;
2074 FAWKStr.RegExp := '/';
2075 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2076 Result.FBBS := SList[1];
2077 Result.FKey := SList[2];
2078 if SList.Count >= 4 then
2082 Result.FNoParam := true;
2088 FAWKStr.LineSeparator := mcls_CRLF;
2089 FAWKStr.RegExp := '-';
2090 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2091 Result.FFirst := True;
2093 FAWKStr.RegExp := 'l[0-9]+';
2094 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2095 Result.FFirst := True;
2097 for i := 0 to SList.Count - 1 do begin
2098 if Trim(SList[i]) = '' then begin
2100 Result.FStBegin := True;
2101 if i = (SList.Count - 1) then
2102 Result.FToEnd := True;
2103 end else if IsNumeric(SList[i]) then begin
2104 wkInt := StrToInt(SList[i]);
2105 wkMax := Max(wkMax, wkInt);
2109 wkMin := Min(wkMin, wkInt);
2110 end else if Trim(SList[i]) = 'n' then begin
2111 Result.FFirst := True;
2113 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2114 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2115 if Copy(SList[i], 1, 1) = 'n' then
2116 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2118 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2119 Result.FFirst := True;
2120 wkMax := Max(wkMax, wkInt);
2124 wkMin := Min(wkMin, wkInt);
2128 if Result.FStBegin and (not Result.FToEnd) then
2130 else if (not Result.FStBegin) and Result.FToEnd then
2132 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2133 Result.FSt := wkMin;
2134 Result.FTo := wkMax;
2136 //Result.FSt := wkMin;
2137 //Result.FTo := wkMax;
2143 Result.FDone := True;
2147 //
\90Vkako
\8f\91\8e®
2148 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2149 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2150 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2151 SList := TStringList.Create;
2154 FAWKStr.RegExp := '/';
2155 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2156 Result.FBBS := SList[1];
2157 Result.FKey := ChangeFileExt(SList[5], '');
2158 Result.FFirst := True;
2164 Result.FDone := True;
2168 //
\8b\8ckako
\8f\91\8e®
2169 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2170 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2171 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2172 SList := TStringList.Create;
2175 FAWKStr.RegExp := '/';
2176 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2177 Result.FBBS := SList[1];
2178 Result.FKey := ChangeFileExt(SList[4], '');
2179 Result.FFirst := True;
2185 Result.FDone := True;
2189 //log
\8by
\82Ñlog2
\8f\91\8e®
2190 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2191 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2192 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2193 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2194 SList := TStringList.Create;
2197 FAWKStr.RegExp := '/';
2198 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2199 Result.FBBS := SList[2];
2200 Result.FKey := ChangeFileExt(SList[5], '');
2201 Result.FFirst := True;
2207 Result.FDone := True;
2212 //
\8b\8cURL
\8f\91\8e®
2213 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2214 FAWKStr.RegExp := '/test/read\.cgi\?';
2215 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2216 s := Copy(s, 16, Length(s));
2217 SList := TStringList.Create;
2220 FAWKStr.RegExp := '&';
2221 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2222 Result.FFirst := True;
2223 for i := 0 to SList.Count - 1 do begin
2224 if Pos('bbs=', SList[i]) = 1 then begin
2225 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2226 end else if Pos('key=', SList[i]) = 1 then begin
2227 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2228 end else if Pos('st=', SList[i]) = 1 then begin
2229 wk := Copy(SList[i], 4, Length(SList[i]));
2230 if IsNumeric(wk) then
2231 Result.FSt := StrToInt(wk)
2232 else if wk = '' then
2233 Result.FStBegin := True;
2234 end else if Pos('to=', SList[i]) = 1 then begin
2235 wk := Copy(SList[i], 4, Length(SList[i]));
2236 if IsNumeric(wk) then
2237 Result.FTo := StrToInt(wk)
2238 else if wk = '' then
2239 Result.FToEnd := True;
2240 end else if Pos('nofirst=', SList[i]) = 1 then begin
2241 Result.FFirst := False;
2250 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2251 Result.FDone := True;
2259 \brief URI
\82ð
\95ª
\89ð
2260 \param URL
\95ª
\89ð
\82·
\82é URI
2261 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2262 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2263 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2264 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2265 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2266 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2268 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2278 URI := TIdURI.Create(URL);
2280 Protocol := URI.Protocol;
2283 Document := URI.Document;
2285 Bookmark := URI.Bookmark;
2292 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2293 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2295 function TGikoSys.GetVersionBuild: Integer;
2297 FixedFileInfo: PVSFixedFileInfo;
2298 VersionHandle, VersionSize: DWORD;
2299 pVersionInfo: Pointer;
2304 AppFile := Application.ExeName;
2305 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2306 if VersionSize = 0 then
2308 GetMem(pVersionInfo, VersionSize);
2310 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2311 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2312 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2314 FreeMem(pVersionInfo, VersionSize);
2319 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2320 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2321 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2323 \83X
\83\8c\83b
\83h URL
\82ð
\83M
\83R
\83i
\83r
\82Ì
\92\86\82Å
\88ê
\88Ó
\82È
\82à
\82Ì
\82É
\90³
\8bK
\89»
\82µ
\82Ü
\82·
\81B
2324 \88ê
\88Ó
\82È URL
\82É
\82·
\82é
\8e\96\82Å
\81AURL
\82©
\82ç
\83X
\83\8c\83b
\83h
\82ð
\93±
\82«
\8fo
\82·
\8dì
\8bÆ
\82ð
\8dÅ
\93K
\89»
\82µ
\82Ü
\82·
\81B\n
2325 \90³
\8bK
\89»
\82Ì
\95û
\90j
\82Æ
\82µ
\82Ä
\81A
\83T
\83C
\83g
\82ª
\90\84\8f§
\82·
\82é
\83f
\83t
\83H
\83\8b\83g
\82Ì URL
\82É
\82È
\82é
\82æ
\82¤
\82É
\90S
\82ª
\82¯
\82Ü
\82·
\81B
2326 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2328 \97á(
\90³
\8bK
\89»
\91O):\n
2329 http://
\92\86\97ª/ \n
2330 http://
\92\86\97ª/20-100
2332 (
\90³
\8bK
\89»
\8cã):\n
2333 http://
\92\86\97ª/l50
2335 function TGikoSys.GetBrowsableThreadURL(
2339 threadItem : TThreadItem;
2340 boardPlugIn : TBoardPlugIn;
2345 //=====
\83v
\83\89\83O
\83C
\83\93
2347 for i := Length( BoardGroups ) - 1 downto 1 do begin
2348 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2349 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2350 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2351 if board <> nil then begin
2352 boardPlugIn := BoardGroups[i].BoardPlugIn;
2353 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2354 Result := threadItem.URL;
2363 // exception
\82ª
\94
\90¶
\82µ
\82½
\8fê
\8d\87\82Í
\93à
\95\94\8f\88\97\9d\82É
\94C
\82¹
\82½
\82¢
\82Ì
\82Å
\82±
\82±
\82Å
\82Í
\89½
\82à
\82µ
\82È
\82¢
2366 if Length( Result ) = 0 then
2367 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2372 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2373 \param inURL
\83X
\83\8c\83b
\83h URL
2376 function TGikoSys.GetThreadURL2BoardURL(
2380 threadItem : TThreadItem;
2381 boardPlugIn : TBoardPlugIn;
2386 //=====
\83v
\83\89\83O
\83C
\83\93
2388 for i := Length( BoardGroups ) - 1 downto 1 do begin
2389 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2390 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2391 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2392 boardPlugIn := BoardGroups[i].BoardPlugIn;
2393 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2394 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2402 // exception
\82ª
\94
\90¶
\82µ
\82½
\8fê
\8d\87\82Í
\93à
\95\94\8f\88\97\9d\82É
\94C
\82¹
\82½
\82¢
\82Ì
\82Å
\82±
\82±
\82Å
\82Í
\89½
\82à
\82µ
\82È
\82¢
2405 if Length( Result ) = 0 then
2406 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2411 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2412 \param inURL
\83X
\83\8c\83b
\83h URL
2414 \see TGikoSys.GetThreadURL2BoardURL
2416 function TGikoSys.Get2chThreadURL2BoardURL(
2420 Protocol, Host, Path, Document, Port, Bookmark : string;
2421 BBSID, BBSKey : string;
2425 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2426 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2428 foundPos := Pos( '/test/read.cgi', inURL );
2429 if {(Is2chHost(Host)) and} (foundPos > 0) then
2430 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2432 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2437 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2438 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2439 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2440 \see TGikoSys.GetBrowsableThreadURL
2442 function TGikoSys.Get2chBrowsableThreadURL(
2446 Protocol, Host, Path, Document, Port, Bookmark : string;
2447 BBSID, BBSKey : string;
2451 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2454 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2455 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2456 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2458 if Is2chHost( Host ) then begin
2459 Result := Protocol + '://' + Host +
2460 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2462 if foundPos > 0 then
2463 Result := Copy( inURL, 1, foundPos ) +
2464 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2466 Result := Protocol + '://' + Host +
2467 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2474 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2475 \param inBoard
\94Â URL
2476 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2477 \return
\83X
\83\8c\83b
\83h URL
2479 function TGikoSys.Get2chBoard2ThreadURL(
2487 server := UrlToServer( inBoard.URL );
2488 //if Is2chHost( server ) then
2489 if inBoard.Is2ch then
2490 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2492 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2497 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2499 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2501 procedure TGikoSys.ListBoardFile;
2503 boardFileList : TStringList;
2508 for i := 0 to Length( BBSs ) - 1 do
2512 SetLength( BBSs, 0 );
2515 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2516 if FileExists( GikoSys.GetBoardFileName ) then begin
2517 SetLength( BBSs, l + 1 );
2518 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2519 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2523 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2524 SetLength( BBSs, l + 1 );
2525 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2526 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2530 // Board
\83t
\83H
\83\8b\83_
2531 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2532 BoardFileList := TStringList.Create;
2534 BoardFileList.BeginUpdate;
2535 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*', BoardFileList, True, True );
2536 BoardFileList.EndUpdate;
2537 for k := BoardFileList.Count - 1 downto 0 do begin
2538 if AnsiCompareText(ExtractFileExt(BoardFileList[ k ]), '.bak') = 0 then
2539 BoardFileList.Delete(k);
2541 SetLength( BBSs, l + BoardFileList.Count );
2542 for i := BoardFileList.Count - 1 downto 0 do begin
2543 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2544 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2554 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2555 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2557 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2562 boardFile : TStringList;
2563 CategoryList : TStringList;
2564 BoardList : TStringList;
2565 Category : TCategory;
2569 // RoundItem : TRoundItem;
2571 i, iBound : Integer;
2572 j, jBound : Integer;
2573 k, kBound : Integer;
2576 if not FileExists( bbs.FilePath ) then
2580 ini := TMemIniFile.Create('');
2581 boardFile := TStringList.Create;
2584 boardFile.LoadFromFile( bbs.FilePath );
2586 ini.SetStrings( boardFile );
2587 CategoryList := TStringList.Create;
2588 BoardList := TStringList.Create;
2590 ini.ReadSections( CategoryList );
2592 iBound := CategoryList.Count - 1;
2593 for i := 0 to iBound do begin
2594 ini.ReadSection( CategoryList[i], BoardList );
2595 Category := TCategory.Create;
2596 Category.No := i + 1;
2597 Category.Title := CategoryList[i];
2599 jBound := BoardList.Count - 1;
2600 for j := 0 to jBound do begin
2602 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2603 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2604 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2605 //=====
\83v
\83\89\83O
\83C
\83\93
2607 kBound := Length(BoardGroups) - 1;
2608 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2609 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2610 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2611 if not BoardGroups[k].Find(inistr, p) then begin
2612 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2613 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2614 if not BoardGroups[k].Find(tmpstring, p) then begin
2616 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2617 BoardGroups[k].AddObject(tmpstring, Board);
2618 Category.Add(Board);
2620 //
\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é
2624 Board := TBoard(BoardGroups[k].Objects[p]);
2625 if Board.ParentCategory <> Category then
2626 Category.Add(Board);
2630 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2631 BoardGroups[k].AddObject(tmpstring, Board);
2632 Category.Add(Board);
2634 //
\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é
2639 Board := TBoard(BoardGroups[k].Objects[p]);
2640 if Board.ParentCategory <> Category then
2641 Category.Add(Board);
2648 // 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¢
2651 if (Board = nil) then begin
2652 if not BoardGroups[0].Find(inistr,p) then begin
2653 Board := TBoard.Create( nil, inistr );
2654 BoardGroups[0].AddObject(inistr, Board);
2655 Category.Add(Board);
2657 Board := TBoard(BoardGroups[0].Objects[p]);
2658 if Board.ParentCategory <> Category then
2659 Category.Add(Board);
2663 if (Board.Multiplicity = 0) then begin
2666 Board.Multiplicity := 1;
2667 Board.Title := BoardList[j];
2668 Board.RoundDate := ZERO_DATE;
2673 Board.Multiplicity := Board.Multiplicity + 1;
2678 bbs.Add( Category );
2683 bbs.IsBoardFileRead := True;
2696 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2697 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2699 function TGikoSys.GetUnknownCategory : TCategory;
2701 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2704 if Length( BBSs ) < 2 then begin
2709 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2710 if Result = nil then begin
2711 Result := TCategory.Create;
2712 Result.Title := UNKNOWN_CATEGORY;
2713 BBSs[ 1 ].Add( Result );
2719 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2720 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2722 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2724 category : TCategory;
2726 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2729 category := GetUnknownCategory;
2730 if category = nil then begin
2733 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2734 if Result = nil then begin
2735 Result := TBoard.Create( inPlugIn, inURL );
2736 Result.Title := UNKNOWN_BOARD;
2737 category.Add( Result );
2744 function TGikoSys.GetSambaFileName : string;
2746 Result := Setting.GetSambaFileName;
2749 //! Samba.ini
\82ª
\96³
\82¯
\82ê
\82Î
\8dì
\90¬
2750 procedure TGikoSys.SambaFileExists();
2753 sambaStrList: TStringList;
2755 if not FileExists(GikoSys.GetSambaFileName) then begin
2756 sambaTmp := ChangeFileExt(GikoSys.GetSambaFileName, '.default');
2757 sambaStrList := TStringList.Create;
2759 if FileExists(sambaTmp) then begin
2760 sambaStrList.LoadFromFile(sambaTmp);
2761 sambaStrList.SaveToFile(GikoSys.GetSambaFileName);
2770 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83A
\83\93\83J
\81[
\82É
\82µ
\82Ä
\97ñ
\8b\93
2771 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2772 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2773 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç True
2774 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2775 \todo limited
\82ð Integer
\82É
\82·
\82é
\82©
\81A20
\82ð
\8aO
\82É
\8fo
\82·
2777 function TGikoSys.GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string;
2783 if (not IsNoValidID(AID)) and
2784 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2785 body := TStringList.Create;
2787 GetSameIDRes(AID, ThreadItem, body);
2788 if (limited) and (body.Count > 20) then begin
2789 for i := body.Count - 20 to body.Count - 1 do begin
2790 Result := Result + '>' + body[i] + ' ';
2793 for i := 0 to body.Count - 1 do begin
2794 Result := Result + '>' + body[i] + ' ';
2801 Result := HTMLCreater.ConvRes(
2803 ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''),
2804 'bbs', 'key', 'st', 'to', 'nofirst', 'true', false);
2809 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2810 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2811 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2812 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2814 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2817 ReadList: TStringList;
2819 boardPlugIn : TBoardPlugIn;
2821 if (not IsNoValidID(AID)) and
2822 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2823 //if ThreadItem.IsBoardPlugInAvailable then begin
2824 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2825 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2826 //boardPlugIn := ThreadItem.BoardPlugIn;
2827 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2829 for i := 0 to threadItem.Count - 1 do begin
2831 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2832 if(AnsiPos(AID, Res.FDateTime) > 0) then begin
2833 body.Add(IntToStr(i+1));
2837 ReadList := TStringList.Create;
2839 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2840 for i := 0 to ReadList.Count - 1 do begin
2841 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2842 if AnsiPos(AID, Res.FDateTime) > 0 then begin
2843 body.Add(IntToStr(i+1));
2854 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2855 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2856 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2857 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç True
2859 \todo limited
\82ð Integer
\82É
\82·
\82é
\82©
\81A20
\82ð
\8aO
\82É
\8fo
\82·
2861 function TGikoSys.GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string;
2867 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2868 body := TStringList.Create;
2870 GetSameIDRes(AIDNum, ThreadItem, body);
2871 if (limited) and (body.Count > 20) then begin
2872 for i := body.Count - 20 to body.Count - 1 do begin
2873 Result := Result + '>' + body[i] + ' ';
2876 for i := 0 to body.Count - 1 do begin
2877 Result := Result + '>' + body[i] + ' ';
2883 Result := HTMLCreater.ConvRes(
2884 Result, ThreadItem.ParentBoard.BBSID,
2885 ChangeFileExt(ThreadItem.FileName, ''),
2886 'bbs', 'key', 'st', 'to', 'nofirst', 'true',
2892 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2893 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2894 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2895 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2897 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2900 boardPlugIn : TBoardPlugIn;
2902 stList: TStringList;
2905 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2906 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2907 //if ThreadItem.IsBoardPlugInAvailable then begin
2908 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2909 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2910 //boardPlugIn := ThreadItem.BoardPlugIn;
2911 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2912 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2914 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2916 AID := Res.FDateTime;
2917 if AnsiPos('id', AnsiLowerCase(AID)) > 0 then begin
2918 AID := Copy(AID, AnsiPos('id', AnsiLowerCase(AID)) - 1, 11);
2919 if AnsiPos(' be:', AnsiLowerCase(AID)) > 0 then begin
2920 AID := Copy(AID, 1, AnsiPos(' BE:', AnsiLowerCase(AID)) - 1)
2923 stlist := TStringList.Create;
2925 stList.DelimitedText := AID;
2927 for i := 0 to stList.Count - 1 do
2928 if Length(WideString(stList[i])) = 8 then begin
2929 if NotDateorTimeString(stList[i]) then begin
2938 if not IsNoValidID(AID) then
2939 GetSameIDRes(AID, ThreadItem, body);
2944 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2945 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2946 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2947 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2949 function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer;
2954 if (not IsNoValidID(AID))
2955 and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2956 body := TStringList.Create;
2958 GetSameIDRes(AID, ThreadItem, body);
2959 Result := body.Count;
2968 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2969 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2970 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2971 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2973 function TGikoSys.GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer;
2978 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2979 body := TStringList.Create;
2981 GetSameIDRes(AIDNum, ThreadItem, body);
2982 Result := body.Count;
2990 \brief
\8e\9e\8d\8f\82ð
\8e¦
\82·
\95¶
\8e\9a\97ñ
\82Å
\82Í
\96³
\82¢
\82©
\82Ç
\82¤
\82©
2991 \param AStr
\92²
\82×
\82é
\95¶
\8e\9a\97ñ
2992 \return
\8e\9e\8d\8f\82Å
\82Í
\96³
\82¢
\82È
\82ç True
2993 \todo
\94Û
\92è
\8c`(Not)
\82æ
\82è
\8dm
\92è
\8cn(Is)
2995 function TGikoSys.NotDateorTimeString(const AStr : string): boolean;
3012 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
3013 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3014 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
3016 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
3019 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3020 Bayesian.CountWord( text, wordCount );
3025 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
3026 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3027 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
3028 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
3029 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
3030 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
3031 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
3033 \91S
\82Ä
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82·
\82é
\82í
\82¯
\82Å
\82Í
\82 \82è
\82Ü
\82¹
\82ñ
\81B\n
3034 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
3036 \8eå
\82É
\83X
\83p
\83\80\82Æ
\83n
\83\80\82ð
\90Ø
\82è
\91Ö
\82¦
\82é
\82½
\82ß
\82É Forget -> Learn
\82Ì
\8f\87\82Å
\8eg
\97p
\82µ
\82Ü
\82·
\81B
3038 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
3041 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3042 Bayesian.Forget( wordCount, isSpam );
3047 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3048 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3049 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3051 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3054 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3055 Bayesian.Learn( wordCount, isSpam );
3060 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3061 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3062 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é(SpamCountWord
\82Æ
\93¯
\93\99)
3063 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3065 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3068 case Setting.SpamFilterAlgorithm of
3069 gsfaNone: Result := 0;
3070 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3071 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3072 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3079 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3080 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3082 [
\83c
\81[
\83\8b]
\83\81\83j
\83\85\81[-[
\83I
\83v
\83V
\83\87\83\93]-[CSS
\82Æ
\83X
\83L
\83\93]
\83^
\83u
\82Ì
3083 [
\83t
\83H
\83\93\83g
\82ð
\8ew
\92è], [
\94w
\8ci
\90F
\82ð
\8ew
\92è]
\82É
\89\88\82Á
\82½ CSS
\82ð
\90¶
\90¬
\82µ
\82Ü
\82·
\81B
3085 function TGikoSys.SetUserOptionalStyle(): string;
3088 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3089 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3090 if GikoSys.Setting.BrowserFontSize <> 0 then
3091 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3092 if GikoSys.Setting.BrowserFontColor <> -1 then
3093 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3094 if GikoSys.Setting.BrowserBackColor <> -1 then
3095 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3096 case GikoSys.Setting.BrowserFontBold of
3097 -1: Result := Result + 'font-weight:normal;';
3098 1: Result := Result + 'font-weight:bold;';
3100 case GikoSys.Setting.BrowserFontItalic of
3101 -1: Result := Result + 'font-style:normal;';
3102 1: Result := Result + 'font-style:italic;';
3107 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3108 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3109 \param ANum
\83\8c\83X
\94Ô
3110 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3111 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3113 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3116 BNum, BMark : string;
3118 p := AnsiPos('BE:', AnsiUpperCase(AID));
3120 BNum := Copy(AID, p, Length(AID));
3121 AID := Copy(AID, 1, p - 1);
3122 p := AnsiPos('-', BNum);
3124 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3125 BNum := Copy(BNum, 1, p - 1);
3128 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3129 + '" target=_blank>' + BMark + '</a>';
3135 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3136 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3137 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3139 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3141 Translation = '\VarFileInfo\Translation';
3142 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3144 BufSize, HWnd: DWORD;
3145 VerInfoBuf: Pointer;
3147 VerDataLen: Longword;
3150 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3151 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3152 if BufSize <> 0 then begin
3153 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3154 GetMem(VerInfoBuf, BufSize);
3156 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3157 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3158 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3160 if not (VerDataLen > 0) then
3161 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3163 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3164 //
\81¨'\StringFileInfo\027382\FileDescription'
3165 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3166 [IntToHex(Integer(VerData^) and $FFFF, 4),
3167 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3168 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3170 if VerDataLen > 0 then begin
3171 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3173 SetLength(result, VerDataLen);
3174 StrLCopy(PChar(result), VerData, VerDataLen);
3178 FreeMem(VerInfoBuf);
3184 \brief Load
\82³
\82ê
\82Ä
\82¢
\82é
\83v
\83\89\83O
\83C
\83\93\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\97ñ
\8b\93
3185 \return 1
\8ds1plugin
3187 function TGikoSys.GetPluginsInfo(): String;
3190 major, minor, revision : Cardinal;
3191 agent, release : String;
3193 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3196 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3197 for i := 0 to Length(BoardGroups) - 1 do begin
3198 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3199 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3200 if BoardGroups[i].BoardPlugIn <> nil then begin
3201 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3204 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3206 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3212 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3213 function TGikoSys.GetIEVersion: string;
3217 R := TRegistry.Create;
3219 //
\93Ç
\82Ý
\8eæ
\82è
\90ê
\97p
\82É
\82µ
\82È
\82¢
\82Æ
\81A
\90§
\8cÀUSER
\82Æ
\82©
\82Ì
\8fê
\8d\87\81A
\8aJ
\82¯
\82È
\82¢
\82Ý
\82½
\82¢
3220 R.Access := KEY_EXECUTE;
3221 R.RootKey := HKEY_LOCAL_MACHINE;
3222 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3224 Result := R.ReadString('version');
3226 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3233 //! main
\83t
\83H
\81[
\83\80\82Ì
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ÌIni
\83t
\83@
\83C
\83\8b\96¼
3234 function TGikoSys.GetMainKeyFileName : String;
3236 Result := Setting.GetMainKeyFileName;
3238 //! Editor
\83t
\83H
\81[
\83\80\82Ì
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ÌIni
\83t
\83@
\83C
\83\8b\96¼
3239 function TGikoSys.GetEditorKeyFileName: String;
3241 Result := Setting.GetEditorKeyFileName;
3243 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3244 function TGikoSys.GetInputAssistFileName: String;
3246 Result := Setting.GetInputAssistFileName;
3248 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3249 procedure TGikoSys.SetGikoMessage;
3251 if FGikoMessage = nil then begin
3252 FGikoMessage := TGikoMessage.Create;
3257 if (Setting.GengoSupport) then begin
3259 if (FileExists(Setting.GetLanguageFileName)) then begin
3260 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3267 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3268 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3271 if FGikoMessage <> nil then begin
3272 Result := FGikoMessage.GetMessage(MesType);
3277 GikoSys := TGikoSys.Create;
3280 if GikoSys <> nil then begin