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.RoundNo := Rec.FRoundNo;
653 ThreadItem.RoundDate := Rec.FRoundDate;
654 ThreadItem.LastModified := Rec.FLastModified;
655 ThreadItem.Kokomade := Rec.FKokomade;
656 ThreadItem.NewReceive := Rec.FNewReceive;
657 // ThreadItem.Round := Rec.FRound;
658 ThreadItem.UnRead := Rec.FUnRead;
659 ThreadItem.ScrollTop := Rec.FScrollTop;
660 ThreadItem.AllResCount := Rec.FAllResCount;
661 ThreadItem.NewResCount := Rec.FNewResCount;
662 ThreadItem.AgeSage := Rec.FAgeSage;
663 ThreadItem.ParentBoard := Board;
664 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
666 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
667 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
670 {//
\8f\84\89ñ
\83\8a\83X
\83g
\82É
\91¶
\8dÝ
\82µ
\82½
\82ç
\8f\84\89ñ
\83t
\83\89\83O
\83Z
\83b
\83g
671 if ThreadItem.IsLogFile then begin
672 idx := RoundList.Find(ThreadItem);
673 if idx <> -1 then begin
674 RoundItem := RoundList.Items[idx, grtItem];
675 ThreadItem.RoundName := RoundItem.RoundName;
676 ThreadItem.Round := True;
681 ThreadItem.EndUpdate;
682 Board.Add(ThreadItem);
684 if (ThreadItem.IsLogFile) and (ThreadItem.UnRead) then
689 if UnRead <> Board.UnRead then
690 Board.UnRead := UnRead;
692 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
693 //
\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
694 for i := 0 to FileList.Count - 1 do begin
695 FileName := Boardpath + FileList[i];
697 //ResRec := DivideStrLine(ReadThreadFile(FileName, 1));
698 if usePlugIn then begin
699 ThreadItem := TThreadItem.Create(
702 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), FileList[i] ) );
703 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
705 ThreadItem := TThreadItem.Create(
708 Get2chBoard2ThreadURL( Board, ChangeFileExt( FileList[i], '' ) ) );
709 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
712 ThreadItem.BeginUpdate;
713 ThreadItem.FileName := FileList[i];
714 //ThreadItem.FilePath := FileName;
715 ThreadItem.No := Board.Count + 1;
716 ThreadItem.Title := ResRec.FTitle;
717 ThreadItem.Count := GetFileLineCount(FileName);
718 ThreadItem.AllResCount := ThreadItem.Count;
719 ThreadItem.NewResCount := ThreadItem.Count;
720 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é
721 ThreadItem.RoundDate := ZERO_DATE;
722 ThreadItem.LastModified := ZERO_DATE;
723 ThreadItem.Kokomade := -1;
724 ThreadItem.NewReceive := 0;
725 ThreadItem.ParentBoard := Board;
726 ThreadItem.IsLogFile := True;
727 ThreadItem.Round := False;
728 ThreadItem.UnRead := False;
729 ThreadItem.ScrollTop := 0;
730 ThreadItem.AgeSage := gasNone;
731 ThreadItem.EndUpdate;
732 Board.Add(ThreadItem);
736 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
737 for i := TmpFileList.Count - 1 downto 0 do begin
738 //if TmpFileList.Count <> 0 then begin
739 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
740 if ThreadItem <> nil then begin
741 //if TmpFileList.Find(ChangeFileExt(ThreadItem.FileName, '.tmp'), Index) then begin
742 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
744 tmpStr := ini.ReadString('Setting', 'RoundDate', DateTimeToStr(ZERO_DATE));
745 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
747 tmpStr := ini.ReadString('Setting', 'LastModified', DateTimeToStr(ZERO_DATE));
748 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
749 ThreadItem.Count := ini.ReadInteger('Setting', 'Count', 0);
750 ThreadItem.NewReceive := ini.ReadInteger('Setting', 'NewReceive', 0);
752 ThreadItem.Size := ini.ReadInteger('Setting', 'Size', 0);
753 if(ThreadItem.Size = 0) and (FileExists(ThreadItem.GetThreadFileName)) then begin
755 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
760 //
\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ã
761 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
762 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
763 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
764 ThreadItem.ScrollTop := ini.ReadInteger('Setting', 'ScrollTop', 0);
765 ThreadItem.AllResCount := ini.ReadInteger('Setting', 'AllResCount', ThreadItem.Count);
766 ThreadItem.NewResCount := ini.ReadInteger('Setting', 'NewResCount', 0);
767 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger('Setting', 'AgeSage', Ord(gasNone)));
771 DeleteFile(Boardpath + TmpFileList[i]);
779 Board.Sorted := False;
781 Board.IsThreadDatRead := True;
785 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
786 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
788 procedure TGikoSys.CreateThreadDat(Board: TBoard);
792 SubjectList: TStringList;
798 if not FileExists(Board.GetSubjectFileName) then Exit;
799 FileName := Board.GetFolderIndexFileName;
801 SubjectList := TStringList.Create;
803 SubjectList.LoadFromFile(Board.GetSubjectFileName);
804 sl := TStringList.Create;
808 sl.Add(FOLDER_INDEX_VERSION);
809 for i := 0 to SubjectList.Count - 1 do begin
810 Rec := DivideSubject(SubjectList[i]);
812 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
815 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
816 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
817 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
818 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
819 + Format('%x', [0]) + #1 //size
820 + Format('%x', [0]) + #1 //RoundDate
821 + Format('%x', [0]) + #1 //LastModified
822 + Format('%x', [0]) + #1 //Kokomade
823 + Format('%x', [0]) + #1 //NewReceive
824 + '0' + #1 //
\96¢
\8eg
\97p
825 + Format('%x', [0]) + #1 //UnRead
826 + Format('%x', [0]) + #1 //ScrollTop
827 + Format('%x', [Rec.FCount]) + #1 //AllResCount
828 + Format('%x', [0]) + #1 //NewResCount
829 + Format('%x', [0]); //AgeSage
831 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
832 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
834 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
835 Rec.FTitle, //
\83^
\83C
\83g
\83\8b
836 Rec.FCount, //
\83J
\83E
\83\93\83g
845 Rec.FCount, //AllResCount
854 sl.SaveToFile(FileName);
864 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
865 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
867 procedure TGikoSys.WriteThreadDat(Board: TBoard);
869 // Values: array[Boolean] of string = ('0', '1');
875 TmpFileList: TStringList;
877 if not Board.IsThreadDatRead then
879 FileName := Board.GetFolderIndexFileName;
880 ForceDirectoriesEx( ExtractFilePath( FileName ) );
882 sl := TStringList.Create;
883 TmpFileList := TStringList.Create;
884 TmpFileList.Sorted := true;
886 TmpFileList.BeginUpdate;
887 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
888 TmpFileList.EndUpdate;
890 sl.Add(FOLDER_INDEX_VERSION);
892 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
893 Sort.SortNoFlag := true;
894 Sort.SortOrder := true;
896 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
897 Board.CustomSort(ThreadItemSortProc);
899 for i := 0 to Board.Count - 1 do begin
900 Board.Items[i].No := i + 1;
901 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
902 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
903 [Board.Items[i].No, //
\94Ô
\8d\86
904 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
905 Board.Items[i].Title, //
\83^
\83C
\83g
\83\8b
906 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
907 Board.Items[i].Size, //size
908 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
909 DateTimeToInt(Board.Items[i].LastModified), //LastModified
910 Board.Items[i].Kokomade, //Kokomade
911 Board.Items[i].NewReceive, //NewReceive
913 BoolToInt(Board.Items[i].UnRead), //UnRead
914 Board.Items[i].ScrollTop, //ScrollTop
915 Board.Items[i].AllResCount, //AllResCount
916 Board.Items[i].NewResCount, //NewResCount
917 Ord(Board.Items[i].AgeSage)] //AgeSage
923 sl.SaveToFile(FileName);
925 for i := 0 to TmpFileList.Count - 1 do begin
926 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
936 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
937 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
938 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
940 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
942 Result.FNo := StrToIntDef('$' + RemoveToken(Line, #1), 0);
943 Result.FFileName := RemoveToken(Line, #1);
944 Result.FTitle := RemoveToken(Line, #1);
945 Result.FCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
946 Result.FSize := StrToIntDef('$' + RemoveToken(Line, #1), 0);
947 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE));
948 Result.FLastModified := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE));
949 Result.FKokomade := StrToIntDef('$' + RemoveToken(Line, #1), -1);
950 Result.FNewReceive := StrToIntDef('$' + RemoveToken(Line, #1), 0);
951 RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
952 Result.FUnRead := IntToBool(StrToIntDef('$' + RemoveToken(Line, #1), 0));
953 Result.FScrollTop := StrToIntDef('$' + RemoveToken(Line, #1), 0);
954 Result.FAllResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
955 Result.FNewResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
956 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + RemoveToken(Line, #1), 0));
961 \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é
962 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
963 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
964 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
965 \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
966 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
968 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
969 \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
973 GetFileList('c:\', '*.txt', list, True, True);
976 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
979 SearchRec : TSearchRec;
983 //maskExt := Copy(Mask, 1, Length(Mask) - 1);
985 Path := IncludeTrailingPathDelimiter(Path);
986 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
988 while rc = 0 do begin
989 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
990 s := Path + SearchRec.Name;
991 //if (SearchRec.Attr and faDirectory > 0) then
992 // s := IncludeTrailingPathDelimiter(s)
994 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
998 List.Add(SearchRec.Name);
999 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1000 GetFileList(s, Mask, List, True, IsPathAdd);
1002 rc := FindNext(SearchRec);
1005 SysUtils.FindClose(SearchRec);
1011 \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
1012 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
1013 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1014 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
1015 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1016 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
1017 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
1020 GetFileList('c:\', '*.txt', list, True);
1023 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
1026 SearchRec : TSearchRec;
1029 Path := IncludeTrailingPathDelimiter(Path);
1030 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
1032 while rc = 0 do begin
1033 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1034 s := Path + SearchRec.Name;
1036 if (SearchRec.Attr and faDirectory = 0) then
1040 List.Add(SearchRec.Name);
1042 rc := FindNext(SearchRec);
1045 SysUtils.FindClose(SearchRec);
1051 \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é
1052 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1053 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1054 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1055 \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
1057 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1058 \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
1062 GetDirectoryList('c:\', '*.txt', list, True);
1065 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1068 SearchRec : TSearchRec;
1071 Path := IncludeTrailingPathDelimiter(Path);
1072 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1074 while rc = 0 do begin
1075 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1076 s := Path + SearchRec.Name;
1077 //if (SearchRec.Attr and faDirectory > 0) then
1078 // s := IncludeTrailingPathDelimiter(s)
1080 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1081 List.Add( IncludeTrailingPathDelimiter( s ) );
1082 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1083 GetDirectoryList(s, Mask, List, True);
1085 rc := FindNext(SearchRec);
1088 SysUtils.FindClose(SearchRec);
1094 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1095 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1096 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1098 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1108 if AnsiPos('<>', Line) = 0 then
1112 Result.FFileName := RemoveToken(Line, Delim);
1113 Result.FTitle := Trim(RemoveToken(Line, Delim));
1115 ws := Result.FTitle;
1116 if Copy(ws, Length(ws), 1) = ')' then begin
1119 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1122 end else if Copy(ws, Length(ws), 1) = '>' then begin
1126 for i := Length(ws) - 1 downto 1 do begin
1127 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1128 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1129 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1130 if IsNumeric(ws) then
1131 Result.FCount := StrToInt(ws);
1132 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1139 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1140 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1143 function TGikoSys.UrlToID(url: string): string;
1150 if url = '' then Exit;
1152 url := Copy(url, 0, Length(url) - 1);
1153 for i := Length(url) downto 0 do begin
1154 if url[i] = '/' then begin
1155 Result := Copy(url, i + 1, Length(url));
1165 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1166 \param url
\89ð
\8eß
\82·
\82é URL
1167 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1169 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1171 function TGikoSys.UrlToServer(url: string): string;
1178 wsURL := Trim(wsURL);
1180 if wsURL = '' then exit;
1182 if Copy(wsURL, Length(wsURL), 1) = '/' then
1183 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1185 for i := Length(wsURL) downto 0 do begin
1186 if wsURL[i] = '/' then begin
1187 Result := Copy(wsURL, 0, i);
1194 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1195 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1196 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1198 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1202 Code := GetFileAttributes(PChar(Name));
1203 Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1207 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1208 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1209 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1211 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1214 if Length(Dir) = 0 then
1215 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1216 Dir := ExcludeTrailingPathDelimiter(Dir);
1217 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1218 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1219 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1223 \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
1224 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1225 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1226 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1227 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1228 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1229 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1231 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1235 Result := StrTokNext(sep, Rec);
1239 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1240 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1241 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1242 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1243 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1244 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1246 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1253 if Len >= Pos then begin
1254 while (Pos <= Len) and (Str[Pos] in sep) do begin
1258 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1259 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1264 Result := Copy(Str, I, Pos - I);
1265 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1273 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1274 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1275 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1277 function TGikoSys.GetFileSize(FileName : string): longint;
1282 if not FileExists(FileName) then begin
1286 Assign(F, FileName);
1288 Result := FileSize(F);
1296 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1297 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1299 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1301 function TGikoSys.GetFileLineCount(FileName : string): longint;
1305 sl := TStringList.Create;
1308 sl.LoadFromFile(FileName);
1320 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1321 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1322 \param Line
\8ew
\92è
\8ds
1323 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1324 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1326 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1328 fileTmp : TStringList;
1331 if FileExists(FileName) then begin
1332 fileTmp := TStringList.Create;
1335 fileTmp.LoadFromFile( FileName );
1336 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1337 Result := fileTmp.Strings[ Line-1 ];
1340 //on EFOpenError do Result := '';
1349 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1350 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1352 procedure TGikoSys.MenuFont(Font: TFont);
1355 nm: NONCLIENTMETRICS;
1357 nm.cbSize := sizeof(NONCLIENTMETRICS);
1359 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1360 lf := nm.lfMenuFont;
1362 Font.Name := lf.lfFaceName;
1363 Font.Height := lf.lfHeight;
1365 if lf.lfWeight >= 700 then
1366 Font.Style := Font.Style + [fsBold];
1367 if lf.lfItalic = 1 then
1368 Font.Style := Font.Style + [fsItalic];
1372 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1373 \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ñ
1374 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1375 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1377 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1379 function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1383 p := AnsiPos(delimiter, s);
1387 Result := Copy(s, 1, p - 1);
1388 Delete(s, 1, Length(Result) + Length(delimiter));
1393 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1394 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1395 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1396 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1398 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1400 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1405 for i := 0 to index do
1406 Result := RemoveToken(s, delimiter);
1410 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1411 {procedure TGikoSys.FlashExitWrite;
1415 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1416 for i := 0 to FExitWrite.Count - 1 do
1417 WriteThreadDat(FExitWrite[i]);
1422 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1423 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1424 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1425 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1429 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1431 ERASECHAR : array [1..39] of string =
1432 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1433 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1434 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1435 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1437 Chr : array [0..255] of char;
1441 s := Trim(LongName);
1442 if (Length(s) <= ALength) then begin
1446 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1447 S := CustomStringReplace(S, ERASECHAR[i], '');
1449 if (Length(S) <= ALength) then begin
1452 Windows.LCMapString(
1453 GetUserDefaultLCID(),
1461 S := Copy(S,1,ALength);
1463 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1464 S := Copy(S, 1, Length(S) - 1);
1475 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1476 \return False..0, True..1
1478 function TGikoSys.BoolToInt(b: Boolean): Integer;
1480 Result := IfThen(b, 1, 0);
1484 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1485 \return 1..True, other..False
1486 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1487 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1489 function TGikoSys.IntToBool(i: Integer): Boolean;
1495 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1496 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1497 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1498 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1500 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1504 GZipStream: TGzipDecompressStream;
1505 TextStream: TStringStream;
1506 buf: array[0..BUF_SIZE - 1] of Byte;
1512 TextStream := TStringStream.Create('');
1514 //
\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¢)
1515 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1516 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1517 ResStream.Position := 0;
1518 GZipStream := TGzipDecompressStream.Create(TextStream);
1521 FillChar(buf, BUF_SIZE, 0);
1522 cnt := ResStream.Read(buf, BUF_SIZE);
1524 GZipStream.Write(buf, BUF_SIZE);
1530 ResStream.Position := 0;
1532 FillChar(buf, BUF_SIZE, 0);
1533 cnt := ResStream.Read(buf, BUF_SIZE);
1535 TextStream.Write(buf, BUF_SIZE);
1539 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1540 s := TextStream.DataString;
1543 while (i > 0) and (s[i] = #0) do
1545 Delete(s, i + 1, ln - i);
1547 s := MojuUtils.CustomStringReplace(s, #0, '*');
1556 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1557 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1558 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1560 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1562 STD_SEC = 'KeySetting';
1568 SecList: TStringList;
1569 Component: TComponent;
1571 if not FileExists(fileName) then
1573 SecList := TStringList.Create;
1574 ini := TMemIniFile.Create(fileName);
1576 ini.ReadSection(STD_SEC, SecList);
1577 for i := 0 to SecList.Count - 1 do begin
1578 ActionName := SecList[i];
1579 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1580 if ActionKey <> -1 then begin
1581 Component := ActionList.Owner.FindComponent(ActionName);
1582 if TObject(Component) is TAction then begin
1583 TAction(Component).ShortCut := ActionKey;
1594 \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¶
1595 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1596 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1598 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
1600 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1602 STD_SEC = 'KeySetting';
1607 ini := TMemIniFile.Create(GetConfigDir + FileName);
1609 for i := 0 to ActionList.ActionCount - 1 do begin
1610 if ActionList.Actions[i].Tag = -1 then
1612 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1622 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1623 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1624 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1626 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1628 PI: TProcessInformation;
1632 Path := '"' + AppPath + '"';
1634 Path := Path + ' ' + Param;
1636 SI.Cb := SizeOf(Si);
1637 SI.lpReserved := nil;
1638 SI.lpDesktop := nil;
1641 SI.cbReserved2 := 0;
1642 SI.lpReserved2 := nil;
1644 Windows.CreateProcess(nil,
1657 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1658 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1659 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1661 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1665 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1666 gbtUserApp, gbtAuto:
1667 if (Setting.URLApp) and (FileExists(Setting.URLAppFile)) then
1668 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1670 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1675 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1676 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1677 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1679 function TGikoSys.HTMLDecode(const AStr: String): String;
1681 Sp, Rp, Cp, Tp: PChar;
1686 SetLength(Result, Length(AStr));
1688 Rp := PChar(Result);
1691 while Sp^ <> #0 do begin
1697 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1703 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1707 while (Sp^ <> ';') and (Sp^ <> #0) do
1714 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1722 Num := IsNumeric(Copy(Tp, 1, 1));
1723 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1724 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1728 SetString(S, Tp, Sp - Tp);
1733 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1734 //[Cp^ + Sp^, Cp - PChar(AStr)])
1744 // on E:EConvertError do
1745 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1746 // [Cp^ + Sp^, Cp - PChar(AStr)])
1748 SetLength(Result, Rp - PChar(Result));
1752 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1753 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1754 \return
\8eæ
\93¾
\82µ
\82½ URL
1756 function TGikoSys.GetHRefText(s: string): string;
1766 Index := AnsiPos('href', LowerCase(s));
1769 s := Trim(Copy(s, Index + 4, Length(s)));
1770 s := Trim(Copy(s, 2, Length(s)));
1772 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1773 //if Copy(s, 1, 1) = '"' then begin
1774 if s[1] = '"' then begin
1775 s := Trim(Copy(s, 2, Length(s)));
1778 Index := AnsiPos('"', s);
1779 if Index <> 0 then begin
1780 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1781 s := Copy(s, 1, Index - 1);
1783 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1784 Index := AnsiPos(' ', s);
1785 Index2 := AnsiPos('>', s);
1788 if Index > Index2 then
1791 s := Copy(s, 1, Index - 1)
1793 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1800 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1801 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1802 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1804 function TGikoSys.Is2chHost(Host: string): Boolean;
1806 HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
1812 if RightStr( Host, 1 ) = '/' then
1813 Host := Copy( Host, 1, Length( Host ) - 1 );
1814 OutputDebugString(pchar(HOST_NAME[0]));
1815 for i := 0 to Length(HOST_NAME) - 1 do begin
1816 // Len := Length(HOST_NAME[i]);
1817 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1818 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1826 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1827 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1828 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1829 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1830 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1831 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1832 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1834 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1844 Index := AnsiPos(READ_PATH, path);
1845 if Index <> 0 then begin
1846 s := Copy(path, Index + Length(READ_PATH), Length(path));
1848 if (Length(s) > 0) and (s[1] = '/') then
1850 BBSID := GetTokenIndex(s, '/', 0);
1851 BBSKey := GetTokenIndex(s, '/', 1);
1854 Result := (BBSID <> '') or (BBSKey <> '');
1857 Index := AnsiPos(KAKO_PATH, path);
1858 if Index <> 0 then begin
1859 s := Copy(path, 2, Length(path));
1860 BBSID := GetTokenIndex(s, '/', 0);
1861 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1862 BBSID := GetTokenIndex(s, '/', 1);
1863 BBSKey := ChangeFileExt(Document, '');
1864 Result := (BBSID <> '') or (BBSKey <> '');
1867 Index := AnsiPos('read.cgi?', URL);
1868 if Index <> 0 then begin
1869 SList := TStringList.Create;
1872 // s := HTMLDecode(Document);
1873 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1874 BBSID := SList.Values['bbs'];
1875 BBSKey := SList.Values['key'];
1876 Result := (BBSID <> '') or (BBSKey <> '');
1888 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1889 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1890 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1891 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1893 http://2ch.net/
\92\86\97ª/32-50 \n
1894 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1896 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1903 URL := Trim(LowerCase(URL));
1904 if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
1908 buf := Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 );
1910 stRes := StrToInt64( buf );
1911 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1912 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
1914 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, Length( URL ) - AnsiPos('&to=', URL ) - 4 + 1 );
1917 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1918 buf := Copy( buf, 1, ps );
1922 endRes := StrToInt64(buf)
1929 if (stRes <> 0) and (endRes = 0) then
1930 endRes := stRes + MAX_POPUP_RES
1931 else if (stRes = 0) and (endRes <> 0) then begin
1932 stRes := endRes - MAX_POPUP_RES;
1936 GikoSys.GetBrowsableThreadURL( URL );
1937 end else if( AnsiPos('&res=', URL ) <> 0 ) then begin
1939 buf := Copy( URL, AnsiPos('&res=', URL ) + 5, Length( URL ) - AnsiPos('&res=', URL ) - 5 + 1 );
1942 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1943 buf := Copy( buf, 1, ps );
1946 stRes := StrToInt(buf)
1953 end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
1955 stRes := StrToInt64( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
1956 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1957 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, AnsiPos( '&nofirst=',URL) - AnsiPos('&end=', URL ) - 5);
1959 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, Length( URL ) - AnsiPos('&to=', URL ) - 5 + 1 );
1962 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1963 buf := Copy( buf, 1, ps );
1967 endRes := StrToInt64(buf);
1974 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
1975 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
1976 if Length(buf) > 0 then begin
1977 if AnsiPos('-', buf) = 1 then begin
1982 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1984 convBuf := Copy( buf, 1, ps );
1985 if convBuf <> '' then
1986 endRes := StrToInt64(convBuf)
1992 if endRes <> 0 then begin
1993 stRes := endRes - MAX_POPUP_RES;
2000 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2002 convBuf := Copy( buf, 1, ps );
2003 if convBuf <> '' then begin
2004 stRes := StrToInt64(convBuf);
2008 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2010 convBuf := Copy( buf, 1, ps );
2011 if convBuf <> '' then
2012 endRes := StrToInt64(convBuf)
2034 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2035 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2036 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2038 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2043 // convBuf : String;
2054 URL := Trim(LowerCase(URL));
2059 Result.FFirst := False;
2060 Result.FStBegin := False;
2061 Result.FToEnd := False;
2062 Result.FDone := False;
2063 Result.FNoParam := False;
2067 if URL[length(URL)] = '\' then
2069 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2070 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2071 s := Copy(URL, RStart + RLength - 1, Length(URL));
2073 //
\95W
\8f\80\8f\91\8e®
2074 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2075 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2076 FAWKStr.RegExp := '/test/read.cgi/.+/[0-9]+/?.*';
2077 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2078 s := Copy(s, 15, Length(s));
2080 SList := TStringList.Create;
2083 FAWKStr.RegExp := '/';
2084 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2085 Result.FBBS := SList[1];
2086 Result.FKey := SList[2];
2087 if SList.Count >= 4 then
2091 Result.FNoParam := true;
2097 FAWKStr.LineSeparator := mcls_CRLF;
2098 FAWKStr.RegExp := '-';
2099 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2100 Result.FFirst := True;
2102 FAWKStr.RegExp := 'l[0-9]+';
2103 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2104 Result.FFirst := True;
2106 for i := 0 to SList.Count - 1 do begin
2107 if Trim(SList[i]) = '' then begin
2109 Result.FStBegin := True;
2110 if i = (SList.Count - 1) then
2111 Result.FToEnd := True;
2112 end else if IsNumeric(SList[i]) then begin
2113 wkInt := StrToInt(SList[i]);
2114 wkMax := Max(wkMax, wkInt);
2118 wkMin := Min(wkMin, wkInt);
2119 end else if Trim(SList[i]) = 'n' then begin
2120 Result.FFirst := True;
2122 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2123 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2124 if Copy(SList[i], 1, 1) = 'n' then
2125 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2127 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2128 Result.FFirst := True;
2129 wkMax := Max(wkMax, wkInt);
2133 wkMin := Min(wkMin, wkInt);
2137 if Result.FStBegin and (not Result.FToEnd) then
2139 else if (not Result.FStBegin) and Result.FToEnd then
2141 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2142 Result.FSt := wkMin;
2143 Result.FTo := wkMax;
2145 //Result.FSt := wkMin;
2146 //Result.FTo := wkMax;
2152 Result.FDone := True;
2156 //
\90Vkako
\8f\91\8e®
2157 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2158 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2159 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2160 SList := TStringList.Create;
2163 FAWKStr.RegExp := '/';
2164 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2165 Result.FBBS := SList[1];
2166 Result.FKey := ChangeFileExt(SList[5], '');
2167 Result.FFirst := True;
2173 Result.FDone := True;
2177 //
\8b\8ckako
\8f\91\8e®
2178 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2179 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2180 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2181 SList := TStringList.Create;
2184 FAWKStr.RegExp := '/';
2185 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2186 Result.FBBS := SList[1];
2187 Result.FKey := ChangeFileExt(SList[4], '');
2188 Result.FFirst := True;
2194 Result.FDone := True;
2198 //log
\8by
\82Ñlog2
\8f\91\8e®
2199 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2200 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2201 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2202 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2203 SList := TStringList.Create;
2206 FAWKStr.RegExp := '/';
2207 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2208 Result.FBBS := SList[2];
2209 Result.FKey := ChangeFileExt(SList[5], '');
2210 Result.FFirst := True;
2216 Result.FDone := True;
2221 //
\8b\8cURL
\8f\91\8e®
2222 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2223 FAWKStr.RegExp := '/test/read\.cgi\?';
2224 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2225 s := Copy(s, 16, Length(s));
2226 SList := TStringList.Create;
2229 FAWKStr.RegExp := '&';
2230 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2231 Result.FFirst := True;
2232 for i := 0 to SList.Count - 1 do begin
2233 if Pos('bbs=', SList[i]) = 1 then begin
2234 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2235 end else if Pos('key=', SList[i]) = 1 then begin
2236 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2237 end else if Pos('st=', SList[i]) = 1 then begin
2238 wk := Copy(SList[i], 4, Length(SList[i]));
2239 if IsNumeric(wk) then
2240 Result.FSt := StrToInt(wk)
2241 else if wk = '' then
2242 Result.FStBegin := True;
2243 end else if Pos('to=', SList[i]) = 1 then begin
2244 wk := Copy(SList[i], 4, Length(SList[i]));
2245 if IsNumeric(wk) then
2246 Result.FTo := StrToInt(wk)
2247 else if wk = '' then
2248 Result.FToEnd := True;
2249 end else if Pos('nofirst=', SList[i]) = 1 then begin
2250 Result.FFirst := False;
2259 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2260 Result.FDone := True;
2268 \brief URI
\82ð
\95ª
\89ð
2269 \param URL
\95ª
\89ð
\82·
\82é URI
2270 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2271 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2272 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2273 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2274 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2275 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2277 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2287 URI := TIdURI.Create(URL);
2289 Protocol := URI.Protocol;
2292 Document := URI.Document;
2294 Bookmark := URI.Bookmark;
2301 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2302 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2304 function TGikoSys.GetVersionBuild: Integer;
2306 FixedFileInfo: PVSFixedFileInfo;
2307 VersionHandle, VersionSize: DWORD;
2308 pVersionInfo: Pointer;
2313 AppFile := Application.ExeName;
2314 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2315 if VersionSize = 0 then
2317 GetMem(pVersionInfo, VersionSize);
2319 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2320 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2321 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2323 FreeMem(pVersionInfo, VersionSize);
2328 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2329 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2330 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2332 \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
2333 \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
2334 \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
2335 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2337 \97á(
\90³
\8bK
\89»
\91O):\n
2338 http://
\92\86\97ª/ \n
2339 http://
\92\86\97ª/20-100
2341 (
\90³
\8bK
\89»
\8cã):\n
2342 http://
\92\86\97ª/l50
2344 function TGikoSys.GetBrowsableThreadURL(
2348 threadItem : TThreadItem;
2349 boardPlugIn : TBoardPlugIn;
2354 //=====
\83v
\83\89\83O
\83C
\83\93
2356 for i := Length( BoardGroups ) - 1 downto 1 do begin
2357 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2358 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2359 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2360 if board <> nil then begin
2361 boardPlugIn := BoardGroups[i].BoardPlugIn;
2362 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2363 Result := threadItem.URL;
2372 // 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¢
2375 if Length( Result ) = 0 then
2376 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2381 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2382 \param inURL
\83X
\83\8c\83b
\83h URL
2385 function TGikoSys.GetThreadURL2BoardURL(
2389 threadItem : TThreadItem;
2390 boardPlugIn : TBoardPlugIn;
2395 //=====
\83v
\83\89\83O
\83C
\83\93
2397 for i := Length( BoardGroups ) - 1 downto 1 do begin
2398 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2399 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2400 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2401 boardPlugIn := BoardGroups[i].BoardPlugIn;
2402 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2403 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2411 // 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¢
2414 if Length( Result ) = 0 then
2415 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2420 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2421 \param inURL
\83X
\83\8c\83b
\83h URL
2423 \see TGikoSys.GetThreadURL2BoardURL
2425 function TGikoSys.Get2chThreadURL2BoardURL(
2429 Protocol, Host, Path, Document, Port, Bookmark : string;
2430 BBSID, BBSKey : string;
2434 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2435 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2437 foundPos := Pos( '/test/read.cgi', inURL );
2438 if {(Is2chHost(Host)) and} (foundPos > 0) then
2439 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2441 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2446 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2447 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2448 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2449 \see TGikoSys.GetBrowsableThreadURL
2451 function TGikoSys.Get2chBrowsableThreadURL(
2455 Protocol, Host, Path, Document, Port, Bookmark : string;
2456 BBSID, BBSKey : string;
2460 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2463 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2464 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2465 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2467 if Is2chHost( Host ) then begin
2468 Result := Protocol + '://' + Host +
2469 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2471 if foundPos > 0 then
2472 Result := Copy( inURL, 1, foundPos ) +
2473 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2475 Result := Protocol + '://' + Host +
2476 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2483 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2484 \param inBoard
\94Â URL
2485 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2486 \return
\83X
\83\8c\83b
\83h URL
2488 function TGikoSys.Get2chBoard2ThreadURL(
2496 server := UrlToServer( inBoard.URL );
2497 //if Is2chHost( server ) then
2498 if inBoard.Is2ch then
2499 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2501 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2506 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2508 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2510 procedure TGikoSys.ListBoardFile;
2512 boardFileList : TStringList;
2517 for i := 0 to Length( BBSs ) - 1 do
2521 SetLength( BBSs, 0 );
2524 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2525 if FileExists( GikoSys.GetBoardFileName ) then begin
2526 SetLength( BBSs, l + 1 );
2527 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2528 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2532 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2533 SetLength( BBSs, l + 1 );
2534 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2535 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2539 // Board
\83t
\83H
\83\8b\83_
2540 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2541 BoardFileList := TStringList.Create;
2543 BoardFileList.BeginUpdate;
2544 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*', BoardFileList, True, True );
2545 BoardFileList.EndUpdate;
2546 for k := BoardFileList.Count - 1 downto 0 do begin
2547 if AnsiCompareText(ExtractFileExt(BoardFileList[ k ]), '.bak') = 0 then
2548 BoardFileList.Delete(k);
2550 SetLength( BBSs, l + BoardFileList.Count );
2551 for i := BoardFileList.Count - 1 downto 0 do begin
2552 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2553 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2563 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2564 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2566 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2571 boardFile : TStringList;
2572 CategoryList : TStringList;
2573 BoardList : TStringList;
2574 Category : TCategory;
2578 // RoundItem : TRoundItem;
2580 i, iBound : Integer;
2581 j, jBound : Integer;
2582 k, kBound : Integer;
2585 if not FileExists( bbs.FilePath ) then
2589 ini := TMemIniFile.Create('');
2590 boardFile := TStringList.Create;
2593 boardFile.LoadFromFile( bbs.FilePath );
2595 ini.SetStrings( boardFile );
2596 CategoryList := TStringList.Create;
2597 BoardList := TStringList.Create;
2599 ini.ReadSections( CategoryList );
2601 iBound := CategoryList.Count - 1;
2602 for i := 0 to iBound do begin
2603 ini.ReadSection( CategoryList[i], BoardList );
2604 Category := TCategory.Create;
2605 Category.No := i + 1;
2606 Category.Title := CategoryList[i];
2608 jBound := BoardList.Count - 1;
2609 for j := 0 to jBound do begin
2611 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2612 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2613 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2614 //=====
\83v
\83\89\83O
\83C
\83\93
2616 kBound := Length(BoardGroups) - 1;
2617 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2618 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2619 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2620 if not BoardGroups[k].Find(inistr, p) then begin
2621 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2622 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2623 if not BoardGroups[k].Find(tmpstring, p) then begin
2625 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2626 BoardGroups[k].AddObject(tmpstring, Board);
2627 Category.Add(Board);
2629 //
\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é
2633 Board := TBoard(BoardGroups[k].Objects[p]);
2634 if Board.ParentCategory <> Category then
2635 Category.Add(Board);
2639 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2640 BoardGroups[k].AddObject(tmpstring, Board);
2641 Category.Add(Board);
2643 //
\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é
2648 Board := TBoard(BoardGroups[k].Objects[p]);
2649 if Board.ParentCategory <> Category then
2650 Category.Add(Board);
2657 // 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¢
2660 if (Board = nil) then begin
2661 if not BoardGroups[0].Find(inistr,p) then begin
2662 Board := TBoard.Create( nil, inistr );
2663 BoardGroups[0].AddObject(inistr, Board);
2664 Category.Add(Board);
2666 Board := TBoard(BoardGroups[0].Objects[p]);
2667 if Board.ParentCategory <> Category then
2668 Category.Add(Board);
2672 if (Board.Multiplicity = 0) then begin
2675 Board.Multiplicity := 1;
2676 Board.Title := BoardList[j];
2677 Board.RoundDate := ZERO_DATE;
2682 Board.Multiplicity := Board.Multiplicity + 1;
2687 bbs.Add( Category );
2692 bbs.IsBoardFileRead := True;
2705 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2706 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2708 function TGikoSys.GetUnknownCategory : TCategory;
2710 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2713 if Length( BBSs ) < 2 then begin
2718 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2719 if Result = nil then begin
2720 Result := TCategory.Create;
2721 Result.Title := UNKNOWN_CATEGORY;
2722 BBSs[ 1 ].Add( Result );
2728 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2729 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2731 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2733 category : TCategory;
2735 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2738 category := GetUnknownCategory;
2739 if category = nil then begin
2742 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2743 if Result = nil then begin
2744 Result := TBoard.Create( inPlugIn, inURL );
2745 Result.Title := UNKNOWN_BOARD;
2746 category.Add( Result );
2753 function TGikoSys.GetSambaFileName : string;
2755 Result := Setting.GetSambaFileName;
2758 //! Samba.ini
\82ª
\96³
\82¯
\82ê
\82Î
\8dì
\90¬
2759 procedure TGikoSys.SambaFileExists();
2762 sambaStrList: TStringList;
2764 if not FileExists(GikoSys.GetSambaFileName) then begin
2765 sambaTmp := ChangeFileExt(GikoSys.GetSambaFileName, '.default');
2766 sambaStrList := TStringList.Create;
2768 if FileExists(sambaTmp) then begin
2769 sambaStrList.LoadFromFile(sambaTmp);
2770 sambaStrList.SaveToFile(GikoSys.GetSambaFileName);
2779 \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
2780 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2781 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2782 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç True
2783 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2784 \todo limited
\82ð Integer
\82É
\82·
\82é
\82©
\81A20
\82ð
\8aO
\82É
\8fo
\82·
2786 function TGikoSys.GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string;
2792 if (not IsNoValidID(AID)) and
2793 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2794 body := TStringList.Create;
2796 GetSameIDRes(AID, ThreadItem, body);
2797 if (limited) and (body.Count > 20) then begin
2798 for i := body.Count - 20 to body.Count - 1 do begin
2799 Result := Result + '>' + body[i] + ' ';
2802 for i := 0 to body.Count - 1 do begin
2803 Result := Result + '>' + body[i] + ' ';
2810 Result := HTMLCreater.ConvRes(
2812 ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''),
2813 'bbs', 'key', 'st', 'to', 'nofirst', 'true', false);
2818 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2819 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2820 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2821 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2823 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2826 ReadList: TStringList;
2828 boardPlugIn : TBoardPlugIn;
2830 if (not IsNoValidID(AID)) and
2831 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2832 //if ThreadItem.IsBoardPlugInAvailable then begin
2833 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2834 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2835 //boardPlugIn := ThreadItem.BoardPlugIn;
2836 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2838 for i := 0 to threadItem.Count - 1 do begin
2840 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2841 if(AnsiPos(AID, Res.FDateTime) > 0) then begin
2842 body.Add(IntToStr(i+1));
2846 ReadList := TStringList.Create;
2848 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2849 for i := 0 to ReadList.Count - 1 do begin
2850 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2851 if AnsiPos(AID, Res.FDateTime) > 0 then begin
2852 body.Add(IntToStr(i+1));
2863 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2864 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2865 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2866 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç True
2868 \todo limited
\82ð Integer
\82É
\82·
\82é
\82©
\81A20
\82ð
\8aO
\82É
\8fo
\82·
2870 function TGikoSys.GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string;
2876 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2877 body := TStringList.Create;
2879 GetSameIDRes(AIDNum, ThreadItem, body);
2880 if (limited) and (body.Count > 20) then begin
2881 for i := body.Count - 20 to body.Count - 1 do begin
2882 Result := Result + '>' + body[i] + ' ';
2885 for i := 0 to body.Count - 1 do begin
2886 Result := Result + '>' + body[i] + ' ';
2892 Result := HTMLCreater.ConvRes(
2893 Result, ThreadItem.ParentBoard.BBSID,
2894 ChangeFileExt(ThreadItem.FileName, ''),
2895 'bbs', 'key', 'st', 'to', 'nofirst', 'true',
2901 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2902 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2903 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2904 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2906 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2909 boardPlugIn : TBoardPlugIn;
2911 stList: TStringList;
2914 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2915 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) 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;
2921 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2923 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2925 AID := Res.FDateTime;
2926 if AnsiPos('id', AnsiLowerCase(AID)) > 0 then begin
2927 AID := Copy(AID, AnsiPos('id', AnsiLowerCase(AID)) - 1, 11);
2928 if AnsiPos(' be:', AnsiLowerCase(AID)) > 0 then begin
2929 AID := Copy(AID, 1, AnsiPos(' BE:', AnsiLowerCase(AID)) - 1)
2932 stlist := TStringList.Create;
2934 stList.DelimitedText := AID;
2936 for i := 0 to stList.Count - 1 do
2937 if Length(WideString(stList[i])) = 8 then begin
2938 if NotDateorTimeString(stList[i]) then begin
2947 if not IsNoValidID(AID) then
2948 GetSameIDRes(AID, ThreadItem, body);
2953 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2954 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2955 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2956 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2958 function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer;
2963 if (not IsNoValidID(AID))
2964 and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2965 body := TStringList.Create;
2967 GetSameIDRes(AID, ThreadItem, body);
2968 Result := body.Count;
2977 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2978 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2979 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2980 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2982 function TGikoSys.GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer;
2987 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2988 body := TStringList.Create;
2990 GetSameIDRes(AIDNum, ThreadItem, body);
2991 Result := body.Count;
2999 \brief
\8e\9e\8d\8f\82ð
\8e¦
\82·
\95¶
\8e\9a\97ñ
\82Å
\82Í
\96³
\82¢
\82©
\82Ç
\82¤
\82©
3000 \param AStr
\92²
\82×
\82é
\95¶
\8e\9a\97ñ
3001 \return
\8e\9e\8d\8f\82Å
\82Í
\96³
\82¢
\82È
\82ç True
3002 \todo
\94Û
\92è
\8c`(Not)
\82æ
\82è
\8dm
\92è
\8cn(Is)
3004 function TGikoSys.NotDateorTimeString(const AStr : string): boolean;
3021 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
3022 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3023 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
3025 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
3028 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3029 Bayesian.CountWord( text, wordCount );
3034 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
3035 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3036 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
3037 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
3038 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
3039 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
3040 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
3042 \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
3043 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
3045 \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
3047 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
3050 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3051 Bayesian.Forget( wordCount, isSpam );
3056 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3057 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3058 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3060 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3063 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3064 Bayesian.Learn( wordCount, isSpam );
3069 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3070 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3071 \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)
3072 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3074 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3077 case Setting.SpamFilterAlgorithm of
3078 gsfaNone: Result := 0;
3079 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3080 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3081 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3088 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3089 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3091 [
\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Ì
3092 [
\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
3094 function TGikoSys.SetUserOptionalStyle(): string;
3097 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3098 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3099 if GikoSys.Setting.BrowserFontSize <> 0 then
3100 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3101 if GikoSys.Setting.BrowserFontColor <> -1 then
3102 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3103 if GikoSys.Setting.BrowserBackColor <> -1 then
3104 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3105 case GikoSys.Setting.BrowserFontBold of
3106 -1: Result := Result + 'font-weight:normal;';
3107 1: Result := Result + 'font-weight:bold;';
3109 case GikoSys.Setting.BrowserFontItalic of
3110 -1: Result := Result + 'font-style:normal;';
3111 1: Result := Result + 'font-style:italic;';
3116 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3117 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3118 \param ANum
\83\8c\83X
\94Ô
3119 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3120 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3122 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3125 BNum, BMark : string;
3127 p := AnsiPos('BE:', AnsiUpperCase(AID));
3129 BNum := Copy(AID, p, Length(AID));
3130 AID := Copy(AID, 1, p - 1);
3131 p := AnsiPos('-', BNum);
3133 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3134 BNum := Copy(BNum, 1, p - 1);
3137 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3138 + '" target=_blank>' + BMark + '</a>';
3144 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3145 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3146 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3148 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3150 Translation = '\VarFileInfo\Translation';
3151 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3153 BufSize, HWnd: DWORD;
3154 VerInfoBuf: Pointer;
3156 VerDataLen: Longword;
3159 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3160 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3161 if BufSize <> 0 then begin
3162 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3163 GetMem(VerInfoBuf, BufSize);
3165 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3166 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3167 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3169 if not (VerDataLen > 0) then
3170 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3172 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3173 //
\81¨'\StringFileInfo\027382\FileDescription'
3174 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3175 [IntToHex(Integer(VerData^) and $FFFF, 4),
3176 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3177 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3179 if VerDataLen > 0 then begin
3180 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3182 SetLength(result, VerDataLen);
3183 StrLCopy(PChar(result), VerData, VerDataLen);
3187 FreeMem(VerInfoBuf);
3193 \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
3194 \return 1
\8ds1plugin
3196 function TGikoSys.GetPluginsInfo(): String;
3199 major, minor, revision : Cardinal;
3200 agent, release : String;
3202 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3205 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3206 for i := 0 to Length(BoardGroups) - 1 do begin
3207 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3208 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3209 if BoardGroups[i].BoardPlugIn <> nil then begin
3210 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3213 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3215 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3221 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3222 function TGikoSys.GetIEVersion: string;
3226 R := TRegistry.Create;
3228 //
\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¢
3229 R.Access := KEY_EXECUTE;
3230 R.RootKey := HKEY_LOCAL_MACHINE;
3231 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3233 Result := R.ReadString('version');
3235 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3242 //! 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¼
3243 function TGikoSys.GetMainKeyFileName : String;
3245 Result := Setting.GetMainKeyFileName;
3247 //! 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¼
3248 function TGikoSys.GetEditorKeyFileName: String;
3250 Result := Setting.GetEditorKeyFileName;
3252 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3253 function TGikoSys.GetInputAssistFileName: String;
3255 Result := Setting.GetInputAssistFileName;
3257 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3258 procedure TGikoSys.SetGikoMessage;
3260 if FGikoMessage = nil then begin
3261 FGikoMessage := TGikoMessage.Create;
3266 if (Setting.GengoSupport) then begin
3268 if (FileExists(Setting.GetLanguageFileName)) then begin
3269 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3276 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3277 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3280 if FGikoMessage <> nil then begin
3281 Result := FGikoMessage.GetMessage(MesType);
3286 GikoSys := TGikoSys.Create;
3289 if GikoSys <> nil then begin