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;
115 //!
\82 \82é
\83Z
\83p
\83\8c\81[
\83^
\82Å
\8bæ
\90Ø
\82ç
\82ê
\82½
\95¶
\8e\9a\97ñ
\82©
\82ç
\82\8e\94Ô
\96Ú
\82Ì
\95¶
\8e\9a\97ñ
\82ð
\8eæ
\82è
\8fo
\82·
116 function ChooseString(const Text, Separator: string; Index: integer): string;
120 FSelectResFilter : TAbon;
121 //FBoardURLList: TStringList;
124 destructor Destroy; override;
125 property ResRange : Longint read FResRange write FResRange;
126 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
127 property Version : String read FVersion;
128 // function MsgBox(Msg: string; Title: string; Flags: Longint): integer; overload;
129 // function MsgBox(Handle: THandle; Msg: string; Title: string; Flags: Longint): integer; overload;
130 function IsNumeric(s: string): boolean;
131 function IsFloat(s: string): boolean;
132 function DirectoryExistsEx(const Name: string): Boolean;
133 function ForceDirectoriesEx(Dir: string): Boolean;
134 // function GetVersion: string;
136 function GetBoardFileName: string;
137 function GetCustomBoardFileName: string;
138 function GetHtmlTempFileName: string;
139 function GetAppDir: string;
140 function GetTempFolder: string;
141 function GetSentFileName: string;
142 function GetConfigDir: string;
143 function GetSkinDir: string;
144 function GetSkinHeaderFileName: string;
145 function GetSkinFooterFileName: string;
146 function GetSkinResFileName: string;
147 function GetSkinNewResFileName: string;
148 function GetSkinBookmarkFileName: string;
149 function GetSkinNewmarkFileName: string;
150 function GetStyleSheetDir: string;
151 function GetOutBoxFileName: string;
152 function GetUserAgent: string;
153 function GetSambaFileName : string;
155 function GetMainKeyFileName : String;
156 function GetEditorKeyFileName: String;
157 function GetInputAssistFileName: String;
158 procedure ReadSubjectFile(Board: TBoard);
159 procedure CreateThreadDat(Board: TBoard);
160 procedure WriteThreadDat(Board: TBoard);
161 function ParseIndexLine(Line: string): TIndexRec;
162 procedure GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean); overload;
163 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¢
164 procedure GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
166 function DivideSubject(Line: string): TSubjectRec;
167 property Setting: TSetting read FSetting write FSetting;
168 property Dolib: TDolib read FDolib write FDolib;
170 function UrlToID(url: string): string;
171 function UrlToServer(url: string): string;
173 function StrTokFirst(const s:string; const sep:TStrTokSeparator; var Rec:TStrTokRec):string;
174 function StrTokNext(const sep:TStrTokSeparator; var Rec:TStrTokRec): string;
176 function GetFileSize(FileName : string) : longint;
177 function GetFileLineCount(FileName : string): longint;
178 function IntToDateTime(val: Int64): TDateTime;
179 function DateTimeToInt(ADate: TDateTime): Int64;
181 function ReadThreadFile(FileName: string; Line: Integer): string;
183 procedure MenuFont(Font: TFont);
185 function RemoveToken(var s:string; const delimiter:string):string;
186 function GetTokenIndex(s: string; delimiter: string; index: Integer): string;
188 function GetShortName(const LongName: string; ALength: integer): string;
189 function BoolToInt(b: Boolean): Integer;
190 function IntToBool(i: Integer): Boolean;
191 function GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
192 procedure LoadKeySetting(ActionList: TActionList; FileName: String);
193 procedure SaveKeySetting(ActionList: TActionList; FileName: String);
194 procedure CreateProcess(const AppPath: string; const Param: string);
195 procedure OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
196 function HTMLDecode(const AStr: String): String;
197 function GetHRefText(s: string): string;
198 function Is2chHost(Host: string): Boolean;
199 function Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
200 function Parse2chURL2(URL: string): TPathRec;
201 procedure ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
202 function GetVersionBuild: Integer;
203 function GetBrowsableThreadURL( inURL : string ) : string;
204 function GetThreadURL2BoardURL( inURL : string ) : string;
205 function Get2chThreadURL2BoardURL( inURL : string ) : string;
206 function Get2chBrowsableThreadURL( inURL : string ) : string;
207 function Get2chBoard2ThreadURL( inBoard : TBoard; inKey : string ) : string;
208 procedure ListBoardFile;
209 procedure ReadBoardFile( bbs : TBBS );
211 function GetUnknownCategory : TCategory;
212 function GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
214 procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
216 //! 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é
217 procedure SambaFileExists();
219 property Bayesian : TGikoBayesian read FBayesian write FBayesian;
220 function GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string; overload;
221 function GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string; overload;
222 procedure GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList); overload;
223 procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
224 function GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer; overload;
225 function GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer; overload;
228 procedure SpamCountWord( const text : string; wordCount : TWordCount );
229 //!
\8aw
\8fK
\83N
\83\8a\83A
230 procedure SpamForget( wordCount : TWordCount; isSpam : Boolean );
231 //!
\83X
\83p
\83\80\8aw
\8fK
232 procedure SpamLearn( wordCount : TWordCount; isSpam : Boolean );
233 //!
\83X
\83p
\83\80\93x
\90\94
234 function SpamParse( const text : string; wordCount : TWordCount ) : Extended;
235 //
\88ø
\90\94\82ª
\81A
\93ú
\95t
\82Å
\82à
\8e\9e\8d\8f\82Å
\82à
\82È
\82¢
\82±
\82Æ
\82ð
\92²
\82×
\82é
236 function NotDateorTimeString(const AStr : string): boolean;
238 //!
\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Á
239 function AddBeProfileLink(AID : string; ANum: Integer): string;
240 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
241 function GetVersionInfo(KeyWord: TVerResourceKey): string;
242 //! Plugin
\82Ì
\8fî
\95ñ
\82Ì
\8eæ
\93¾
243 function GetPluginsInfo(): string;
244 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
245 function GetIEVersion: string;
246 function SetUserOptionalStyle(): string;
247 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
248 procedure SetGikoMessage;
249 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
250 function GetGikoMessage(MesType: TGikoMessageListType): String;
251 //! GMT
\82Ì
\8e\9e\8d\8f\82ðTDateTime
\82É
\95Ï
\8a·
\82·
\82é
252 function DateStrToDateTime(const DateStr: string): TDateTime;
258 //LENGTH_RESTITLE = 40;
259 ZERO_DATE: Integer = 25569;
260 BETA_VERSION_NAME_E = 'beta';
261 BETA_VERSION_NAME_J = 'ÊÞÀ';
263 BETA_VERSION_BUILD = ''; //!< debug
\94Å
\82È
\82Ç
264 APP_NAME = 'gikoNavi';
265 BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
271 Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils, Sort, YofUtils,
275 FOLDER_INDEX_VERSION = '1.01';
276 USER_AGENT = 'Monazilla';
277 DEFAULT_NGWORD_FILE_NAME : String = 'NGword.txt';
278 NGWORDs_DIR_NAME : String = 'NGwords';
280 READ_PATH: string = '/test/read.cgi/';
281 OLD_READ_PATH: string = '/test/read.cgi?';
282 KAKO_PATH: string = '/kako/';
284 KeyWordStr: array [TVerResourceKey] of String = (
298 // *************************************************************************
299 //! GikoSys
\83R
\83\93\83X
\83g
\83\89\83N
\83^
300 // *************************************************************************
301 constructor TGikoSys.Create;
303 FSetting := TSetting.Create;
304 FDolib := TDolib.Create;
305 FAWKStr := TAWKStr.Create(nil);
306 if DirectoryExists(GetConfigDir) = false then begin
307 CreateDir(GetConfigDir);
309 FAbon := TAbon.Create;
310 FAbon.IgnoreKana := FSetting.IgnoreKana;
311 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
313 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
314 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
315 FAbon.DeleteSyria := FSetting.DeleteSyria;
316 FAbon.Deleterlo := FSetting.AbonDeleterlo;
317 FAbon.Replaceul := FSetting.AbonReplaceul;
318 FAbon.AbonPopupRes := FSetting.PopUpAbon;
320 FSelectResFilter := TAbon.Create;
321 FSelectResFilter.IgnoreKana := True;
322 //
\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
323 FSelectResFilter.AbonString := '';
325 ResRange := FSetting.ResRange;
326 FVersion := Trim(GetVersionInfo(vrFileVersion));
327 FBayesian := TGikoBayesian.Create;
328 //FBoardURLList := TStringList.Create;
329 //
\83\81\83b
\83Z
\81[
\83W
\82Ì
\8dì
\90¬
330 FGikoMessage := TGikoMessage.Create;
333 // *************************************************************************
334 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
335 // *************************************************************************
336 destructor TGikoSys.Destroy;
339 FileList: TStringList;
341 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
350 FSelectResFilter.Free;
352 //FBoardURLList.Free;
353 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
354 FileList := TStringList.Create;
356 FileList.BeginUpdate;
357 GetFileList(GetTempFolder, '*.html', FileList, False, True);
359 for i := 0 to FileList.Count - 1 do begin
360 DeleteFile(FileList[i]);
369 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
370 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
371 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
374 function TGikoSys.IsNumeric(s: string): boolean;
385 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
386 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
387 \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
389 function TGikoSys.IsFloat(s: string): boolean;
393 Result := TextToFloat(PChar(s), v, fvExtended);
396 // *************************************************************************
397 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
398 // *************************************************************************
399 function TGikoSys.GetBoardFileName: string;
401 Result := Setting.GetBoardFileName;
404 // *************************************************************************
405 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
406 // *************************************************************************
407 function TGikoSys.GetCustomBoardFileName: string;
409 Result := Setting.GetCustomBoardFileName;
412 // *************************************************************************
413 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
414 // *************************************************************************
415 function TGikoSys.GetHtmlTempFileName: string;
417 Result := Setting.GetHtmlTempFileName;
421 // *************************************************************************
422 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
423 // *************************************************************************
424 function TGikoSys.GetAppDir: string;
426 Result := Setting.GetAppDir;
429 // *************************************************************************
430 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
431 // *************************************************************************
432 function TGikoSys.GetTempFolder: string;
434 Result := Setting.GetTempFolder;
437 // *************************************************************************
438 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
439 // *************************************************************************)
440 function TGikoSys.GetSentFileName: string;
442 Result := Setting.GetSentFileName;
445 // *************************************************************************
446 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
447 // *************************************************************************
448 function TGikoSys.GetOutBoxFileName: string;
450 Result := Setting.GetOutBoxFileName;
453 // *************************************************************************
454 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
455 // *************************************************************************
456 function TGikoSys.GetConfigDir: string;
458 Result := Setting.GetConfigDir;
461 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
462 function TGikoSys.GetStyleSheetDir: string;
464 Result := Setting.GetStyleSheetDir;
467 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
468 function TGikoSys.GetSkinDir: string;
470 Result := Setting.GetSkinDir;
473 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
474 function TGikoSys.GetSkinHeaderFileName: string;
476 Result := Setting.GetSkinHeaderFileName;
479 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
480 function TGikoSys.GetSkinFooterFileName: string;
482 Result := Setting.GetSkinFooterFileName;
485 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
486 function TGikoSys.GetSkinNewResFileName: string;
488 Result := Setting.GetSkinNewResFileName;
491 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
492 function TGikoSys.GetSkinResFileName: string;
494 Result := Setting.GetSkinResFileName;
497 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
498 function TGikoSys.GetSkinBookmarkFileName: string;
500 Result := Setting.GetSkinBookmarkFileName;
503 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
504 function TGikoSys.GetSkinNewmarkFileName: string;
506 Result := Setting.GetSkinNewmarkFileName;
509 //! UserAgent
\8eæ
\93¾
510 function TGikoSys.GetUserAgent: string;
512 if Dolib.Connected then begin
513 Result := Format('%s %s/%s%d/%s', [
520 Result := Format('%s/%s %s/%s%d/%s', [
531 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
532 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
533 \return val
\82ð
\8e¦
\82· TDateTime
535 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
537 Result := ZERO_DATE + val / 86400.0;
541 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
542 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
543 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
545 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
547 Result := Trunc((ADate - ZERO_DATE) * 86400);
552 \brief Subject
\83t
\83@
\83C
\83\8bRead
553 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
555 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
557 ThreadItem: TThreadItem;
559 FileList: TStringList;
560 TmpFileList: TStringList;
568 // RoundItem: TRoundItem;
575 //protocol, host, path, document, port, bookmark : string;
578 FavoThreadItem : TFavoriteThreadItem;
582 if Board.IsThreadDatRead then
587 usePlugIn := Board.IsBoardPlugInAvailable;
588 server := UrlToServer( Board.URL );
589 //is2ch := Is2chHost(server);
591 FileName := Board.GetFolderIndexFileName;
593 FileList := TStringList.Create;
594 FileList.Sorted := True;
595 FileList.BeginUpdate;
596 TmpFileList := TStringList.Create;
597 TmpFileList.Sorted := True;
598 TmpFileList.BeginUpdate;
599 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
600 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
602 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
603 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, False);
604 TmpFileList.EndUpdate;
606 //
\8fd
\95¡
\82ð
\96h
\82®
608 Board.Sorted := True;
610 sl := TStringList.Create;
612 if FileExists(FileName) then begin
613 sl.LoadFromFile(FileName);
615 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
616 for i := sl.Count - 1 downto 1 do begin
617 Rec := ParseIndexLine(sl[i]);
618 islog := FileList.Find( Rec.FFileName, Index );
620 ThreadItem := TThreadItem.Create(
623 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
625 if Board.is2ch then begin
626 ThreadItem := TThreadItem.Create(
629 server + 'test/read.cgi/' + Board.BBSID + '/' + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
634 ThreadItem := TThreadItem.Create(
637 server + 'test/read.cgi?bbs=' + Board.BBSID + '&key=' + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
644 ThreadItem.BeginUpdate;
646 FileList.Delete( Index );
648 ThreadItem.No := Rec.FNo;
649 ThreadItem.FileName := Rec.FFileName;
650 ThreadItem.Title := Rec.FTitle;
651 //ThreadItem.ShortTitle := CustomStringReplace(ZenToHan(ThreadItem.Title), ' ', '');
652 ThreadItem.Count := Rec.FCount;
653 ThreadItem.Size := Rec.FSize;
654 ThreadItem.RoundDate := Rec.FRoundDate;
655 ThreadItem.LastModified := Rec.FLastModified;
656 ThreadItem.Kokomade := Rec.FKokomade;
657 ThreadItem.NewReceive := Rec.FNewReceive;
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 ThreadItem.EndUpdate;
671 Board.Add(ThreadItem);
673 if (ThreadItem.IsLogFile) and (ThreadItem.UnRead) then
678 if UnRead <> Board.UnRead then
679 Board.UnRead := UnRead;
681 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
682 //
\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
683 for i := 0 to FileList.Count - 1 do begin
684 FileName := Boardpath + FileList[i];
686 //ResRec := DivideStrLine(ReadThreadFile(FileName, 1));
687 if usePlugIn then begin
688 ThreadItem := TThreadItem.Create(
691 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), FileList[i] ) );
692 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
694 ThreadItem := TThreadItem.Create(
697 Get2chBoard2ThreadURL( Board, ChangeFileExt( FileList[i], '' ) ) );
698 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
701 ThreadItem.BeginUpdate;
702 ThreadItem.FileName := FileList[i];
703 //ThreadItem.FilePath := FileName;
704 ThreadItem.No := Board.Count + 1;
705 ThreadItem.Title := ResRec.FTitle;
706 ThreadItem.Count := GetFileLineCount(FileName);
707 ThreadItem.AllResCount := ThreadItem.Count;
708 ThreadItem.NewResCount := ThreadItem.Count;
709 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é
710 ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) );
711 ThreadItem.LastModified := ThreadItem.RoundDate;
712 ThreadItem.Kokomade := -1;
713 ThreadItem.NewReceive := 0;
714 ThreadItem.ParentBoard := Board;
715 ThreadItem.IsLogFile := True;
716 ThreadItem.Round := False;
717 ThreadItem.UnRead := False;
718 ThreadItem.ScrollTop := 0;
719 ThreadItem.AgeSage := gasNone;
720 ThreadItem.EndUpdate;
721 Board.Add(ThreadItem);
725 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
726 for i := TmpFileList.Count - 1 downto 0 do begin
727 //if TmpFileList.Count <> 0 then begin
728 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
729 if ThreadItem <> nil then begin
730 //if TmpFileList.Find(ChangeFileExt(ThreadItem.FileName, '.tmp'), Index) then begin
731 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
733 tmpStr := ini.ReadString('Setting', 'RoundDate', DateTimeToStr(ZERO_DATE));
734 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
736 tmpStr := ini.ReadString('Setting', 'LastModified', DateTimeToStr(ZERO_DATE));
737 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
738 ThreadItem.Count := ini.ReadInteger('Setting', 'Count', 0);
739 ThreadItem.NewReceive := ini.ReadInteger('Setting', 'NewReceive', 0);
741 ThreadItem.Size := ini.ReadInteger('Setting', 'Size', 0);
742 if(ThreadItem.Size = 0) and (FileExists(ThreadItem.GetThreadFileName)) then begin
744 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
749 //
\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ã
750 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
751 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
752 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
753 ThreadItem.ScrollTop := ini.ReadInteger('Setting', 'ScrollTop', 0);
754 ThreadItem.AllResCount := ini.ReadInteger('Setting', 'AllResCount', ThreadItem.Count);
755 ThreadItem.NewResCount := ini.ReadInteger('Setting', 'NewResCount', 0);
756 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger('Setting', 'AgeSage', Ord(gasNone)));
760 DeleteFile(Boardpath + TmpFileList[i]);
768 Board.Sorted := False;
770 Board.IsThreadDatRead := True;
774 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
775 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
777 procedure TGikoSys.CreateThreadDat(Board: TBoard);
781 SubjectList: TStringList;
787 if not FileExists(Board.GetSubjectFileName) then Exit;
788 FileName := Board.GetFolderIndexFileName;
790 SubjectList := TStringList.Create;
792 SubjectList.LoadFromFile(Board.GetSubjectFileName);
793 sl := TStringList.Create;
797 sl.Add(FOLDER_INDEX_VERSION);
798 for i := 0 to SubjectList.Count - 1 do begin
799 Rec := DivideSubject(SubjectList[i]);
801 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
804 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
805 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
806 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
807 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
808 + Format('%x', [0]) + #1 //size
809 + Format('%x', [0]) + #1 //RoundDate
810 + Format('%x', [0]) + #1 //LastModified
811 + Format('%x', [0]) + #1 //Kokomade
812 + Format('%x', [0]) + #1 //NewReceive
813 + '0' + #1 //
\96¢
\8eg
\97p
814 + Format('%x', [0]) + #1 //UnRead
815 + Format('%x', [0]) + #1 //ScrollTop
816 + Format('%x', [Rec.FCount]) + #1 //AllResCount
817 + Format('%x', [0]) + #1 //NewResCount
818 + Format('%x', [0]); //AgeSage
820 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
821 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
823 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
824 Rec.FTitle, //
\83^
\83C
\83g
\83\8b
825 Rec.FCount, //
\83J
\83E
\83\93\83g
834 Rec.FCount, //AllResCount
843 sl.SaveToFile(FileName);
853 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
854 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
856 procedure TGikoSys.WriteThreadDat(Board: TBoard);
858 // Values: array[Boolean] of string = ('0', '1');
864 TmpFileList: TStringList;
866 if not Board.IsThreadDatRead then
868 FileName := Board.GetFolderIndexFileName;
869 ForceDirectoriesEx( ExtractFilePath( FileName ) );
871 sl := TStringList.Create;
872 TmpFileList := TStringList.Create;
873 TmpFileList.Sorted := true;
875 TmpFileList.BeginUpdate;
876 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
877 TmpFileList.EndUpdate;
879 sl.Add(FOLDER_INDEX_VERSION);
881 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
882 Sort.SetSortNoFlag(true);
883 Sort.SetSortOrder(true);
884 Sort.SetSortIndex(0);
885 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
886 Board.CustomSort(ThreadItemSortProc);
888 for i := 0 to Board.Count - 1 do begin
889 Board.Items[i].No := i + 1;
890 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
891 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
892 [Board.Items[i].No, //
\94Ô
\8d\86
893 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
894 Board.Items[i].Title, //
\83^
\83C
\83g
\83\8b
895 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
896 Board.Items[i].Size, //size
897 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
898 DateTimeToInt(Board.Items[i].LastModified), //LastModified
899 Board.Items[i].Kokomade, //Kokomade
900 Board.Items[i].NewReceive, //NewReceive
902 BoolToInt(Board.Items[i].UnRead), //UnRead
903 Board.Items[i].ScrollTop, //ScrollTop
904 Board.Items[i].AllResCount, //AllResCount
905 Board.Items[i].NewResCount, //NewResCount
906 Ord(Board.Items[i].AgeSage)] //AgeSage
912 sl.SaveToFile(FileName);
914 for i := 0 to TmpFileList.Count - 1 do begin
915 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
925 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
926 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
927 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
929 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
931 Result.FNo := StrToIntDef('$' + RemoveToken(Line, #1), 0);
932 Result.FFileName := RemoveToken(Line, #1);
933 Result.FTitle := RemoveToken(Line, #1);
934 Result.FCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
935 Result.FSize := StrToIntDef('$' + RemoveToken(Line, #1), 0);
936 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE));
937 Result.FLastModified := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE));
938 Result.FKokomade := StrToIntDef('$' + RemoveToken(Line, #1), -1);
939 Result.FNewReceive := StrToIntDef('$' + RemoveToken(Line, #1), 0);
940 RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
941 Result.FUnRead := IntToBool(StrToIntDef('$' + RemoveToken(Line, #1), 0));
942 Result.FScrollTop := StrToIntDef('$' + RemoveToken(Line, #1), 0);
943 Result.FAllResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
944 Result.FNewResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
945 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + RemoveToken(Line, #1), 0));
950 \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é
951 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
952 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
953 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
954 \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
955 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
957 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
958 \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
962 GetFileList('c:\', '*.txt', list, True, True);
965 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
968 SearchRec : TSearchRec;
972 //maskExt := Copy(Mask, 1, Length(Mask) - 1);
974 Path := IncludeTrailingPathDelimiter(Path);
975 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
977 while rc = 0 do begin
978 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
979 s := Path + SearchRec.Name;
980 //if (SearchRec.Attr and faDirectory > 0) then
981 // s := IncludeTrailingPathDelimiter(s)
983 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
987 List.Add(SearchRec.Name);
988 if SubDir and (SearchRec.Attr and faDirectory > 0) then
989 GetFileList(s, Mask, List, True, IsPathAdd);
991 rc := FindNext(SearchRec);
994 SysUtils.FindClose(SearchRec);
1000 \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
1001 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
1002 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1003 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
1004 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1005 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
1006 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
1009 GetFileList('c:\', '*.txt', list, True);
1012 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
1015 SearchRec : TSearchRec;
1018 Path := IncludeTrailingPathDelimiter(Path);
1019 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
1021 while rc = 0 do begin
1022 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1023 s := Path + SearchRec.Name;
1025 if (SearchRec.Attr and faDirectory = 0) then
1029 List.Add(SearchRec.Name);
1031 rc := FindNext(SearchRec);
1034 SysUtils.FindClose(SearchRec);
1040 \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é
1041 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1042 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1043 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1044 \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
1046 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1047 \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
1051 GetDirectoryList('c:\', '*.txt', list, True);
1054 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1057 SearchRec : TSearchRec;
1060 Path := IncludeTrailingPathDelimiter(Path);
1061 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1063 while rc = 0 do begin
1064 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1065 s := Path + SearchRec.Name;
1066 //if (SearchRec.Attr and faDirectory > 0) then
1067 // s := IncludeTrailingPathDelimiter(s)
1069 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1070 List.Add( IncludeTrailingPathDelimiter( s ) );
1071 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1072 GetDirectoryList(s, Mask, List, True);
1074 rc := FindNext(SearchRec);
1077 SysUtils.FindClose(SearchRec);
1083 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1084 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1085 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1087 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1097 if AnsiPos('<>', Line) = 0 then
1101 Result.FFileName := RemoveToken(Line, Delim);
1102 Result.FTitle := Trim(RemoveToken(Line, Delim));
1104 ws := Result.FTitle;
1105 if Copy(ws, Length(ws), 1) = ')' then begin
1108 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1111 end else if Copy(ws, Length(ws), 1) = '>' then begin
1115 for i := Length(ws) - 1 downto 1 do begin
1116 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1117 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1118 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1119 if IsNumeric(ws) then
1120 Result.FCount := StrToInt(ws);
1121 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1128 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1129 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1132 function TGikoSys.UrlToID(url: string): string;
1139 if url = '' then Exit;
1141 url := Copy(url, 0, Length(url) - 1);
1142 for i := Length(url) downto 0 do begin
1143 if url[i] = '/' then begin
1144 Result := Copy(url, i + 1, Length(url));
1154 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1155 \param url
\89ð
\8eß
\82·
\82é URL
1156 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1158 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1160 function TGikoSys.UrlToServer(url: string): string;
1167 wsURL := Trim(wsURL);
1169 if wsURL = '' then exit;
1171 if Copy(wsURL, Length(wsURL), 1) = '/' then
1172 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1174 for i := Length(wsURL) downto 0 do begin
1175 if wsURL[i] = '/' then begin
1176 Result := Copy(wsURL, 0, i);
1183 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1184 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1185 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1187 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1191 Code := GetFileAttributes(PChar(Name));
1192 Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1196 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1197 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1198 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1200 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1203 if Length(Dir) = 0 then
1204 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1205 Dir := ExcludeTrailingPathDelimiter(Dir);
1206 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1207 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1208 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1212 \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
1213 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1214 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1215 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1216 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1217 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1218 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1220 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1224 Result := StrTokNext(sep, Rec);
1228 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1229 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1230 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1231 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1232 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1233 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1235 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1242 if Len >= Pos then begin
1243 while (Pos <= Len) and (Str[Pos] in sep) do begin
1247 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1248 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1253 Result := Copy(Str, I, Pos - I);
1254 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1262 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1263 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1264 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1266 function TGikoSys.GetFileSize(FileName : string): longint;
1271 if not FileExists(FileName) then begin
1275 Assign(F, FileName);
1277 Result := FileSize(F);
1285 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1286 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1288 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1290 function TGikoSys.GetFileLineCount(FileName : string): longint;
1294 sl := TStringList.Create;
1297 sl.LoadFromFile(FileName);
1309 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1310 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1311 \param Line
\8ew
\92è
\8ds
1312 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1313 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1315 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1317 fileTmp : TStringList;
1320 if FileExists(FileName) then begin
1321 fileTmp := TStringList.Create;
1324 fileTmp.LoadFromFile( FileName );
1325 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1326 Result := fileTmp.Strings[ Line-1 ];
1329 //on EFOpenError do Result := '';
1338 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1339 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1341 procedure TGikoSys.MenuFont(Font: TFont);
1344 nm: NONCLIENTMETRICS;
1346 nm.cbSize := sizeof(NONCLIENTMETRICS);
1348 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1349 lf := nm.lfMenuFont;
1351 Font.Name := lf.lfFaceName;
1352 Font.Height := lf.lfHeight;
1354 if lf.lfWeight >= 700 then
1355 Font.Style := Font.Style + [fsBold];
1356 if lf.lfItalic = 1 then
1357 Font.Style := Font.Style + [fsItalic];
1361 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1362 \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ñ
1363 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1364 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1366 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1368 function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1372 p := AnsiPos(delimiter, s);
1376 Result := Copy(s, 1, p - 1);
1377 Delete(s, 1, Length(Result) + Length(delimiter));
1382 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1383 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1384 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1385 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1387 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1389 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1394 for i := 0 to index do
1395 Result := RemoveToken(s, delimiter);
1399 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1400 {procedure TGikoSys.FlashExitWrite;
1404 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1405 for i := 0 to FExitWrite.Count - 1 do
1406 WriteThreadDat(FExitWrite[i]);
1411 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1412 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1413 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1414 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1418 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1420 ERASECHAR : array [1..39] of string =
1421 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1422 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1423 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1424 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1426 Chr : array [0..255] of char;
1430 s := Trim(LongName);
1431 if (Length(s) <= ALength) then begin
1435 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1436 S := CustomStringReplace(S, ERASECHAR[i], '');
1438 if (Length(S) <= ALength) then begin
1441 Windows.LCMapString(
1442 GetUserDefaultLCID(),
1450 S := Copy(S,1,ALength);
1452 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1453 S := Copy(S, 1, Length(S) - 1);
1464 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1465 \return False..0, True..1
1467 function TGikoSys.BoolToInt(b: Boolean): Integer;
1469 Result := IfThen(b, 1, 0);
1473 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1474 \return 1..True, other..False
1475 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1476 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1478 function TGikoSys.IntToBool(i: Integer): Boolean;
1484 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1485 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1486 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1487 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1489 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1493 GZipStream: TGzipDecompressStream;
1494 TextStream: TStringStream;
1495 buf: array[0..BUF_SIZE - 1] of Byte;
1501 TextStream := TStringStream.Create('');
1503 //
\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¢)
1504 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1505 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1506 ResStream.Position := 0;
1507 GZipStream := TGzipDecompressStream.Create(TextStream);
1510 FillChar(buf, BUF_SIZE, 0);
1511 cnt := ResStream.Read(buf, BUF_SIZE);
1513 GZipStream.Write(buf, BUF_SIZE);
1519 ResStream.Position := 0;
1521 FillChar(buf, BUF_SIZE, 0);
1522 cnt := ResStream.Read(buf, BUF_SIZE);
1524 TextStream.Write(buf, BUF_SIZE);
1528 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1529 s := TextStream.DataString;
1532 while (i > 0) and (s[i] = #0) do
1534 Delete(s, i + 1, ln - i);
1537 while i <> 0 do begin
1549 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1550 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1551 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1553 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1555 STD_SEC = 'KeySetting';
1561 SecList: TStringList;
1562 Component: TComponent;
1564 if not FileExists(fileName) then
1566 SecList := TStringList.Create;
1567 ini := TMemIniFile.Create(fileName);
1569 ini.ReadSection(STD_SEC, SecList);
1570 for i := 0 to SecList.Count - 1 do begin
1571 ActionName := SecList[i];
1572 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1573 if ActionKey <> -1 then begin
1574 Component := ActionList.Owner.FindComponent(ActionName);
1575 if TObject(Component) is TAction then begin
1576 TAction(Component).ShortCut := ActionKey;
1587 \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¶
1588 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1589 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1591 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
1593 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1595 STD_SEC = 'KeySetting';
1600 ini := TMemIniFile.Create(GetConfigDir + FileName);
1602 for i := 0 to ActionList.ActionCount - 1 do begin
1603 if ActionList.Actions[i].Tag = -1 then
1605 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1615 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1616 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1617 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1619 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1621 PI: TProcessInformation;
1625 Path := '"' + AppPath + '"';
1627 Path := Path + ' ' + Param;
1629 SI.Cb := SizeOf(Si);
1630 SI.lpReserved := nil;
1631 SI.lpDesktop := nil;
1634 SI.cbReserved2 := 0;
1635 SI.lpReserved2 := nil;
1637 Windows.CreateProcess(nil,
1650 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1651 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1652 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1654 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1658 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1659 gbtUserApp, gbtAuto:
1660 if (Setting.URLApp) and (FileExists(Setting.URLAppFile)) then
1661 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1663 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1668 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1669 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1670 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1672 function TGikoSys.HTMLDecode(const AStr: String): String;
1674 Sp, Rp, Cp, Tp: PChar;
1679 SetLength(Result, Length(AStr));
1681 Rp := PChar(Result);
1684 while Sp^ <> #0 do begin
1690 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1696 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1700 while (Sp^ <> ';') and (Sp^ <> #0) do
1707 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1715 Num := IsNumeric(Copy(Tp, 1, 1));
1716 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1717 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1721 SetString(S, Tp, Sp - Tp);
1726 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1727 //[Cp^ + Sp^, Cp - PChar(AStr)])
1737 // on E:EConvertError do
1738 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1739 // [Cp^ + Sp^, Cp - PChar(AStr)])
1741 SetLength(Result, Rp - PChar(Result));
1745 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1746 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1747 \return
\8eæ
\93¾
\82µ
\82½ URL
1749 function TGikoSys.GetHRefText(s: string): string;
1759 Index := AnsiPos('href', LowerCase(s));
1762 s := Trim(Copy(s, Index + 4, Length(s)));
1763 s := Trim(Copy(s, 2, Length(s)));
1765 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1766 //if Copy(s, 1, 1) = '"' then begin
1767 if s[1] = '"' then begin
1768 s := Trim(Copy(s, 2, Length(s)));
1771 Index := AnsiPos('"', s);
1772 if Index <> 0 then begin
1773 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1774 s := Copy(s, 1, Index - 1);
1776 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1777 Index := AnsiPos(' ', s);
1778 Index2 := AnsiPos('>', s);
1781 if Index > Index2 then
1784 s := Copy(s, 1, Index - 1)
1786 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1793 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1794 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1795 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1797 function TGikoSys.Is2chHost(Host: string): Boolean;
1799 HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
1805 if RightStr( Host, 1 ) = '/' then
1806 Host := Copy( Host, 1, Length( Host ) - 1 );
1807 OutputDebugString(pchar(HOST_NAME[0]));
1808 for i := 0 to Length(HOST_NAME) - 1 do begin
1809 // Len := Length(HOST_NAME[i]);
1810 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1811 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1819 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1820 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1821 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1822 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1823 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1824 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1825 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1827 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1837 Index := AnsiPos(READ_PATH, path);
1838 if Index <> 0 then begin
1839 s := Copy(path, Index + Length(READ_PATH), Length(path));
1841 if (Length(s) > 0) and (s[1] = '/') then
1843 BBSID := GetTokenIndex(s, '/', 0);
1844 BBSKey := GetTokenIndex(s, '/', 1);
1847 Result := (BBSID <> '') or (BBSKey <> '');
1850 Index := AnsiPos(KAKO_PATH, path);
1851 if Index <> 0 then begin
1852 s := Copy(path, 2, Length(path));
1853 BBSID := GetTokenIndex(s, '/', 0);
1854 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1855 BBSID := GetTokenIndex(s, '/', 1);
1856 BBSKey := ChangeFileExt(Document, '');
1857 Result := (BBSID <> '') or (BBSKey <> '');
1860 Index := AnsiPos('read.cgi?', URL);
1861 if Index <> 0 then begin
1862 SList := TStringList.Create;
1865 // s := HTMLDecode(Document);
1866 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1867 BBSID := SList.Values['bbs'];
1868 BBSKey := SList.Values['key'];
1869 Result := (BBSID <> '') or (BBSKey <> '');
1881 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1882 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1883 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1884 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1886 http://2ch.net/
\92\86\97ª/32-50 \n
1887 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1889 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1896 URL := Trim(LowerCase(URL));
1897 if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
1901 buf := Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 );
1903 stRes := StrToInt64( buf );
1904 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1905 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
1907 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, Length( URL ) - AnsiPos('&to=', URL ) - 4 + 1 );
1910 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1911 buf := Copy( buf, 1, ps );
1915 endRes := StrToInt64(buf)
1922 if (stRes <> 0) and (endRes = 0) then
1923 endRes := stRes + MAX_POPUP_RES
1924 else if (stRes = 0) and (endRes <> 0) then begin
1925 stRes := endRes - MAX_POPUP_RES;
1929 GikoSys.GetBrowsableThreadURL( URL );
1930 end else if( AnsiPos('&res=', URL ) <> 0 ) then begin
1932 buf := Copy( URL, AnsiPos('&res=', URL ) + 5, Length( URL ) - AnsiPos('&res=', URL ) - 5 + 1 );
1935 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1936 buf := Copy( buf, 1, ps );
1939 stRes := StrToInt(buf)
1946 end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
1948 stRes := StrToInt64( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
1949 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1950 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, AnsiPos( '&nofirst=',URL) - AnsiPos('&end=', URL ) - 5);
1952 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, Length( URL ) - AnsiPos('&to=', URL ) - 5 + 1 );
1955 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1956 buf := Copy( buf, 1, ps );
1960 endRes := StrToInt64(buf);
1967 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
1968 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
1969 if Length(buf) > 0 then begin
1970 if AnsiPos('-', buf) = 1 then begin
1975 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1977 convBuf := Copy( buf, 1, ps );
1978 if convBuf <> '' then
1979 endRes := StrToInt64(convBuf)
1985 if endRes <> 0 then begin
1986 stRes := endRes - MAX_POPUP_RES;
1993 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1995 convBuf := Copy( buf, 1, ps );
1996 if convBuf <> '' then begin
1997 stRes := StrToInt64(convBuf);
2001 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2003 convBuf := Copy( buf, 1, ps );
2004 if convBuf <> '' then
2005 endRes := StrToInt64(convBuf)
2027 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2028 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2029 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2031 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2036 // convBuf : String;
2047 URL := Trim(LowerCase(URL));
2052 Result.FFirst := False;
2053 Result.FStBegin := False;
2054 Result.FToEnd := False;
2055 Result.FDone := False;
2056 Result.FNoParam := False;
2060 if URL[length(URL)] = '\' then
2062 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2063 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2064 s := Copy(URL, RStart + RLength - 1, Length(URL));
2066 //
\95W
\8f\80\8f\91\8e®
2067 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2068 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2069 FAWKStr.RegExp := '/test/read.cgi/.+/[0-9]+/?.*';
2070 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2071 s := Copy(s, 15, Length(s));
2073 SList := TStringList.Create;
2076 FAWKStr.RegExp := '/';
2077 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2078 Result.FBBS := SList[1];
2079 Result.FKey := SList[2];
2080 if SList.Count >= 4 then
2084 Result.FNoParam := true;
2090 FAWKStr.LineSeparator := mcls_CRLF;
2091 FAWKStr.RegExp := '-';
2092 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2093 Result.FFirst := True;
2095 FAWKStr.RegExp := 'l[0-9]+';
2096 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2097 Result.FFirst := True;
2099 for i := 0 to SList.Count - 1 do begin
2100 if Trim(SList[i]) = '' then begin
2102 Result.FStBegin := True;
2103 if i = (SList.Count - 1) then
2104 Result.FToEnd := True;
2105 end else if IsNumeric(SList[i]) then begin
2106 wkInt := StrToInt(SList[i]);
2107 wkMax := Max(wkMax, wkInt);
2111 wkMin := Min(wkMin, wkInt);
2112 end else if Trim(SList[i]) = 'n' then begin
2113 Result.FFirst := True;
2115 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2116 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2117 if Copy(SList[i], 1, 1) = 'n' then
2118 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2120 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2121 Result.FFirst := True;
2122 wkMax := Max(wkMax, wkInt);
2126 wkMin := Min(wkMin, wkInt);
2130 if Result.FStBegin and (not Result.FToEnd) then
2132 else if (not Result.FStBegin) and Result.FToEnd then
2134 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2135 Result.FSt := wkMin;
2136 Result.FTo := wkMax;
2138 //Result.FSt := wkMin;
2139 //Result.FTo := wkMax;
2145 Result.FDone := True;
2149 //
\90Vkako
\8f\91\8e®
2150 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2151 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2152 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2153 SList := TStringList.Create;
2156 FAWKStr.RegExp := '/';
2157 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2158 Result.FBBS := SList[1];
2159 Result.FKey := ChangeFileExt(SList[5], '');
2160 Result.FFirst := True;
2166 Result.FDone := True;
2170 //
\8b\8ckako
\8f\91\8e®
2171 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2172 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2173 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2174 SList := TStringList.Create;
2177 FAWKStr.RegExp := '/';
2178 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2179 Result.FBBS := SList[1];
2180 Result.FKey := ChangeFileExt(SList[4], '');
2181 Result.FFirst := True;
2187 Result.FDone := True;
2191 //log
\8by
\82Ñlog2
\8f\91\8e®
2192 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2193 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2194 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2195 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2196 SList := TStringList.Create;
2199 FAWKStr.RegExp := '/';
2200 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2201 Result.FBBS := SList[2];
2202 Result.FKey := ChangeFileExt(SList[5], '');
2203 Result.FFirst := True;
2209 Result.FDone := True;
2214 //
\8b\8cURL
\8f\91\8e®
2215 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2216 FAWKStr.RegExp := '/test/read\.cgi\?';
2217 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2218 s := Copy(s, 16, Length(s));
2219 SList := TStringList.Create;
2222 FAWKStr.RegExp := '&';
2223 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2224 Result.FFirst := True;
2225 for i := 0 to SList.Count - 1 do begin
2226 if Pos('bbs=', SList[i]) = 1 then begin
2227 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2228 end else if Pos('key=', SList[i]) = 1 then begin
2229 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2230 end else if Pos('st=', SList[i]) = 1 then begin
2231 wk := Copy(SList[i], 4, Length(SList[i]));
2232 if IsNumeric(wk) then
2233 Result.FSt := StrToInt(wk)
2234 else if wk = '' then
2235 Result.FStBegin := True;
2236 end else if Pos('to=', SList[i]) = 1 then begin
2237 wk := Copy(SList[i], 4, Length(SList[i]));
2238 if IsNumeric(wk) then
2239 Result.FTo := StrToInt(wk)
2240 else if wk = '' then
2241 Result.FToEnd := True;
2242 end else if Pos('nofirst=', SList[i]) = 1 then begin
2243 Result.FFirst := False;
2252 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2253 Result.FDone := True;
2261 \brief URI
\82ð
\95ª
\89ð
2262 \param URL
\95ª
\89ð
\82·
\82é URI
2263 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2264 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2265 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2266 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2267 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2268 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2270 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2280 URI := TIdURI.Create(URL);
2282 Protocol := URI.Protocol;
2285 Document := URI.Document;
2287 Bookmark := URI.Bookmark;
2294 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2295 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2297 function TGikoSys.GetVersionBuild: Integer;
2299 FixedFileInfo: PVSFixedFileInfo;
2300 VersionHandle, VersionSize: DWORD;
2301 pVersionInfo: Pointer;
2306 AppFile := Application.ExeName;
2307 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2308 if VersionSize = 0 then
2310 GetMem(pVersionInfo, VersionSize);
2312 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2313 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2314 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2316 FreeMem(pVersionInfo, VersionSize);
2321 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2322 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2323 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2325 \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
2326 \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
2327 \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
2328 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2330 \97á(
\90³
\8bK
\89»
\91O):\n
2331 http://
\92\86\97ª/ \n
2332 http://
\92\86\97ª/20-100
2334 (
\90³
\8bK
\89»
\8cã):\n
2335 http://
\92\86\97ª/l50
2337 function TGikoSys.GetBrowsableThreadURL(
2341 threadItem : TThreadItem;
2342 boardPlugIn : TBoardPlugIn;
2347 //=====
\83v
\83\89\83O
\83C
\83\93
2349 for i := Length( BoardGroups ) - 1 downto 1 do begin
2350 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2351 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2352 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2353 if board <> nil then begin
2354 boardPlugIn := BoardGroups[i].BoardPlugIn;
2355 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2356 Result := threadItem.URL;
2365 // 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¢
2368 if Length( Result ) = 0 then
2369 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2374 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2375 \param inURL
\83X
\83\8c\83b
\83h URL
2378 function TGikoSys.GetThreadURL2BoardURL(
2382 threadItem : TThreadItem;
2383 boardPlugIn : TBoardPlugIn;
2388 //=====
\83v
\83\89\83O
\83C
\83\93
2390 for i := Length( BoardGroups ) - 1 downto 1 do begin
2391 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2392 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2393 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2394 boardPlugIn := BoardGroups[i].BoardPlugIn;
2395 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2396 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2404 // 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¢
2407 if Length( Result ) = 0 then
2408 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2413 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2414 \param inURL
\83X
\83\8c\83b
\83h URL
2416 \see TGikoSys.GetThreadURL2BoardURL
2418 function TGikoSys.Get2chThreadURL2BoardURL(
2422 Protocol, Host, Path, Document, Port, Bookmark : string;
2423 BBSID, BBSKey : string;
2427 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2428 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2430 foundPos := Pos( '/test/read.cgi', inURL );
2431 if {(Is2chHost(Host)) and} (foundPos > 0) then
2432 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2434 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2439 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2440 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2441 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2442 \see TGikoSys.GetBrowsableThreadURL
2444 function TGikoSys.Get2chBrowsableThreadURL(
2448 Protocol, Host, Path, Document, Port, Bookmark : string;
2449 BBSID, BBSKey : string;
2453 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2456 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2457 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2458 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2460 if Is2chHost( Host ) then begin
2461 Result := Protocol + '://' + Host +
2462 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2464 if foundPos > 0 then
2465 Result := Copy( inURL, 1, foundPos ) +
2466 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2468 Result := Protocol + '://' + Host +
2469 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2476 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2477 \param inBoard
\94Â URL
2478 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2479 \return
\83X
\83\8c\83b
\83h URL
2481 function TGikoSys.Get2chBoard2ThreadURL(
2489 server := UrlToServer( inBoard.URL );
2490 //if Is2chHost( server ) then
2491 if inBoard.Is2ch then
2492 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2494 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2499 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2501 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2503 procedure TGikoSys.ListBoardFile;
2505 boardFileList : TStringList;
2510 for i := 0 to Length( BBSs ) - 1 do
2514 SetLength( BBSs, 0 );
2517 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2518 if FileExists( GikoSys.GetBoardFileName ) then begin
2519 SetLength( BBSs, l + 1 );
2520 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2521 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2525 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2526 SetLength( BBSs, l + 1 );
2527 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2528 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2532 // Board
\83t
\83H
\83\8b\83_
2533 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2534 BoardFileList := TStringList.Create;
2536 BoardFileList.BeginUpdate;
2537 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*', BoardFileList, True, True );
2538 BoardFileList.EndUpdate;
2539 for k := BoardFileList.Count - 1 downto 0 do begin
2540 if AnsiCompareText(ExtractFileExt(BoardFileList[ k ]), '.bak') = 0 then
2541 BoardFileList.Delete(k);
2543 SetLength( BBSs, l + BoardFileList.Count );
2544 for i := BoardFileList.Count - 1 downto 0 do begin
2545 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2546 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2556 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2557 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2559 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2564 boardFile : TStringList;
2565 CategoryList : TStringList;
2566 BoardList : TStringList;
2567 Category : TCategory;
2571 // RoundItem : TRoundItem;
2573 i, iBound : Integer;
2574 j, jBound : Integer;
2575 k, kBound : Integer;
2578 if not FileExists( bbs.FilePath ) then
2582 ini := TMemIniFile.Create('');
2583 boardFile := TStringList.Create;
2586 boardFile.LoadFromFile( bbs.FilePath );
2588 ini.SetStrings( boardFile );
2589 CategoryList := TStringList.Create;
2590 BoardList := TStringList.Create;
2592 ini.ReadSections( CategoryList );
2594 iBound := CategoryList.Count - 1;
2595 for i := 0 to iBound do begin
2596 ini.ReadSection( CategoryList[i], BoardList );
2597 Category := TCategory.Create;
2598 Category.No := i + 1;
2599 Category.Title := CategoryList[i];
2601 jBound := BoardList.Count - 1;
2602 for j := 0 to jBound do begin
2604 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2605 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2606 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2607 //=====
\83v
\83\89\83O
\83C
\83\93
2609 kBound := Length(BoardGroups) - 1;
2610 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2611 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2612 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2613 if not BoardGroups[k].Find(inistr, p) then begin
2614 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2615 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2616 if not BoardGroups[k].Find(tmpstring, p) then begin
2618 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2619 BoardGroups[k].AddObject(tmpstring, Board);
2620 Category.Add(Board);
2622 //
\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é
2626 Board := TBoard(BoardGroups[k].Objects[p]);
2627 if Board.ParentCategory <> Category then
2628 Category.Add(Board);
2632 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2633 BoardGroups[k].AddObject(tmpstring, Board);
2634 Category.Add(Board);
2636 //
\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é
2641 Board := TBoard(BoardGroups[k].Objects[p]);
2642 if Board.ParentCategory <> Category then
2643 Category.Add(Board);
2650 // 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¢
2653 if (Board = nil) then begin
2654 if not BoardGroups[0].Find(inistr,p) then begin
2655 Board := TBoard.Create( nil, inistr );
2656 BoardGroups[0].AddObject(inistr, Board);
2657 Category.Add(Board);
2659 Board := TBoard(BoardGroups[0].Objects[p]);
2660 if Board.ParentCategory <> Category then
2661 Category.Add(Board);
2665 if (Board.Multiplicity = 0) then begin
2668 Board.Multiplicity := 1;
2669 Board.Title := BoardList[j];
2670 Board.RoundDate := ZERO_DATE;
2675 Board.Multiplicity := Board.Multiplicity + 1;
2680 bbs.Add( Category );
2685 bbs.IsBoardFileRead := True;
2698 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2699 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2701 function TGikoSys.GetUnknownCategory : TCategory;
2703 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2706 if Length( BBSs ) < 2 then begin
2711 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2712 if Result = nil then begin
2713 Result := TCategory.Create;
2714 Result.Title := UNKNOWN_CATEGORY;
2715 BBSs[ 1 ].Add( Result );
2721 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2722 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2724 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2726 category : TCategory;
2728 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2731 category := GetUnknownCategory;
2732 if category = nil then begin
2735 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2736 if Result = nil then begin
2737 Result := TBoard.Create( inPlugIn, inURL );
2738 Result.Title := UNKNOWN_BOARD;
2739 category.Add( Result );
2746 function TGikoSys.GetSambaFileName : string;
2748 Result := Setting.GetSambaFileName;
2751 //! Samba.ini
\82ª
\96³
\82¯
\82ê
\82Î
\8dì
\90¬
2752 procedure TGikoSys.SambaFileExists();
2755 sambaStrList: TStringList;
2757 if not FileExists(GikoSys.GetSambaFileName) then begin
2758 sambaTmp := ChangeFileExt(GikoSys.GetSambaFileName, '.default');
2759 sambaStrList := TStringList.Create;
2761 if FileExists(sambaTmp) then begin
2762 sambaStrList.LoadFromFile(sambaTmp);
2763 sambaStrList.SaveToFile(GikoSys.GetSambaFileName);
2772 \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
2773 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2774 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2775 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç True
2776 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2777 \todo limited
\82ð Integer
\82É
\82·
\82é
\82©
\81A20
\82ð
\8aO
\82É
\8fo
\82·
2779 function TGikoSys.GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string;
2785 if (not IsNoValidID(AID)) and
2786 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2787 body := TStringList.Create;
2789 GetSameIDRes(AID, ThreadItem, body);
2790 if (limited) and (body.Count > 20) then begin
2791 for i := body.Count - 20 to body.Count - 1 do begin
2792 Result := Result + '>' + body[i] + ' ';
2795 for i := 0 to body.Count - 1 do begin
2796 Result := Result + '>' + body[i] + ' ';
2803 Result := HTMLCreater.ConvRes(
2805 ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''),
2806 'bbs', 'key', 'st', 'to', 'nofirst', 'true', false);
2811 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2812 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2813 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2814 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2816 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2819 ReadList: TStringList;
2821 boardPlugIn : TBoardPlugIn;
2823 if (not IsNoValidID(AID)) and
2824 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2825 //if ThreadItem.IsBoardPlugInAvailable then begin
2826 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2827 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2828 //boardPlugIn := ThreadItem.BoardPlugIn;
2829 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2831 for i := 0 to threadItem.Count - 1 do begin
2833 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2834 if(AnsiPos(AID, Res.FDateTime) > 0) then begin
2835 body.Add(IntToStr(i+1));
2839 ReadList := TStringList.Create;
2841 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2842 for i := 0 to ReadList.Count - 1 do begin
2843 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2844 if AnsiPos(AID, Res.FDateTime) > 0 then begin
2845 body.Add(IntToStr(i+1));
2856 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2857 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2858 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2859 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç True
2861 \todo limited
\82ð Integer
\82É
\82·
\82é
\82©
\81A20
\82ð
\8aO
\82É
\8fo
\82·
2863 function TGikoSys.GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string;
2869 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2870 body := TStringList.Create;
2872 GetSameIDRes(AIDNum, ThreadItem, body);
2873 if (limited) and (body.Count > 20) then begin
2874 for i := body.Count - 20 to body.Count - 1 do begin
2875 Result := Result + '>' + body[i] + ' ';
2878 for i := 0 to body.Count - 1 do begin
2879 Result := Result + '>' + body[i] + ' ';
2885 Result := HTMLCreater.ConvRes(
2886 Result, ThreadItem.ParentBoard.BBSID,
2887 ChangeFileExt(ThreadItem.FileName, ''),
2888 'bbs', 'key', 'st', 'to', 'nofirst', 'true',
2894 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2895 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2896 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2897 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2899 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2902 boardPlugIn : TBoardPlugIn;
2904 stList: TStringList;
2907 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2908 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2909 //if ThreadItem.IsBoardPlugInAvailable then begin
2910 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2911 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2912 //boardPlugIn := ThreadItem.BoardPlugIn;
2913 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2914 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2916 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2918 AID := Res.FDateTime;
2919 if AnsiPos('id', AnsiLowerCase(AID)) > 0 then begin
2920 AID := Copy(AID, AnsiPos('id', AnsiLowerCase(AID)) - 1, 11);
2921 if AnsiPos(' be:', AnsiLowerCase(AID)) > 0 then begin
2922 AID := Copy(AID, 1, AnsiPos(' BE:', AnsiLowerCase(AID)) - 1)
2925 stlist := TStringList.Create;
2927 stList.DelimitedText := AID;
2929 for i := 0 to stList.Count - 1 do
2930 if Length(WideString(stList[i])) = 8 then begin
2931 if NotDateorTimeString(stList[i]) then begin
2940 if not IsNoValidID(AID) then
2941 GetSameIDRes(AID, ThreadItem, body);
2946 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2947 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2948 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2949 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2951 function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer;
2956 if (not IsNoValidID(AID))
2957 and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2958 body := TStringList.Create;
2960 GetSameIDRes(AID, ThreadItem, body);
2961 Result := body.Count;
2970 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2971 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2972 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2973 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2975 function TGikoSys.GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer;
2980 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2981 body := TStringList.Create;
2983 GetSameIDRes(AIDNum, ThreadItem, body);
2984 Result := body.Count;
2992 \brief
\8e\9e\8d\8f\82ð
\8e¦
\82·
\95¶
\8e\9a\97ñ
\82Å
\82Í
\96³
\82¢
\82©
\82Ç
\82¤
\82©
2993 \param AStr
\92²
\82×
\82é
\95¶
\8e\9a\97ñ
2994 \return
\8e\9e\8d\8f\82Å
\82Í
\96³
\82¢
\82È
\82ç True
2995 \todo
\94Û
\92è
\8c`(Not)
\82æ
\82è
\8dm
\92è
\8cn(Is)
2997 function TGikoSys.NotDateorTimeString(const AStr : string): boolean;
3014 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
3015 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3016 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
3018 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
3021 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3022 Bayesian.CountWord( text, wordCount );
3027 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
3028 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3029 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
3030 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
3031 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
3032 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
3033 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
3035 \91S
\82Ä
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82·
\82é
\82í
\82¯
\82Å
\82Í
\82 \82è
\82Ü
\82¹
\82ñ
\81B\n
3036 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
3038 \8eå
\82É
\83X
\83p
\83\80\82Æ
\83n
\83\80\82ð
\90Ø
\82è
\91Ö
\82¦
\82é
\82½
\82ß
\82É Forget -> Learn
\82Ì
\8f\87\82Å
\8eg
\97p
\82µ
\82Ü
\82·
\81B
3040 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
3043 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3044 Bayesian.Forget( wordCount, isSpam );
3049 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3050 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3051 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3053 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3056 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3057 Bayesian.Learn( wordCount, isSpam );
3062 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3063 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3064 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é(SpamCountWord
\82Æ
\93¯
\93\99)
3065 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3067 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3070 case Setting.SpamFilterAlgorithm of
3071 gsfaNone: Result := 0;
3072 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3073 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3074 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3081 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3082 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3084 [
\83c
\81[
\83\8b]
\83\81\83j
\83\85\81[-[
\83I
\83v
\83V
\83\87\83\93]-[CSS
\82Æ
\83X
\83L
\83\93]
\83^
\83u
\82Ì
3085 [
\83t
\83H
\83\93\83g
\82ð
\8ew
\92è], [
\94w
\8ci
\90F
\82ð
\8ew
\92è]
\82É
\89\88\82Á
\82½ CSS
\82ð
\90¶
\90¬
\82µ
\82Ü
\82·
\81B
3087 function TGikoSys.SetUserOptionalStyle(): string;
3090 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3091 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3092 if GikoSys.Setting.BrowserFontSize <> 0 then
3093 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3094 if GikoSys.Setting.BrowserFontColor <> -1 then
3095 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3096 if GikoSys.Setting.BrowserBackColor <> -1 then
3097 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3098 case GikoSys.Setting.BrowserFontBold of
3099 -1: Result := Result + 'font-weight:normal;';
3100 1: Result := Result + 'font-weight:bold;';
3102 case GikoSys.Setting.BrowserFontItalic of
3103 -1: Result := Result + 'font-style:normal;';
3104 1: Result := Result + 'font-style:italic;';
3109 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3110 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3111 \param ANum
\83\8c\83X
\94Ô
3112 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3113 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3115 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3118 BNum, BMark : string;
3120 p := AnsiPos('BE:', AnsiUpperCase(AID));
3122 BNum := Copy(AID, p, Length(AID));
3123 AID := Copy(AID, 1, p - 1);
3124 p := AnsiPos('-', BNum);
3126 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3127 BNum := Copy(BNum, 1, p - 1);
3130 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3131 + '" target=_blank>' + BMark + '</a>';
3137 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3138 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3139 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3141 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3143 Translation = '\VarFileInfo\Translation';
3144 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3146 BufSize, HWnd: DWORD;
3147 VerInfoBuf: Pointer;
3149 VerDataLen: Longword;
3152 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3153 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3154 if BufSize <> 0 then begin
3155 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3156 GetMem(VerInfoBuf, BufSize);
3158 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3159 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3160 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3162 if not (VerDataLen > 0) then
3163 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3165 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3166 //
\81¨'\StringFileInfo\027382\FileDescription'
3167 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3168 [IntToHex(Integer(VerData^) and $FFFF, 4),
3169 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3170 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3172 if VerDataLen > 0 then begin
3173 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3175 SetLength(result, VerDataLen);
3176 StrLCopy(PChar(result), VerData, VerDataLen);
3180 FreeMem(VerInfoBuf);
3186 \brief Load
\82³
\82ê
\82Ä
\82¢
\82é
\83v
\83\89\83O
\83C
\83\93\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\97ñ
\8b\93
3187 \return 1
\8ds1plugin
3189 function TGikoSys.GetPluginsInfo(): String;
3192 major, minor, revision : Cardinal;
3193 agent, release : String;
3195 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3198 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3199 for i := 0 to Length(BoardGroups) - 1 do begin
3200 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3201 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3202 if BoardGroups[i].BoardPlugIn <> nil then begin
3203 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3206 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3208 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3214 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3215 function TGikoSys.GetIEVersion: string;
3219 R := TRegistry.Create;
3221 //
\93Ç
\82Ý
\8eæ
\82è
\90ê
\97p
\82É
\82µ
\82È
\82¢
\82Æ
\81A
\90§
\8cÀUSER
\82Æ
\82©
\82Ì
\8fê
\8d\87\81A
\8aJ
\82¯
\82È
\82¢
\82Ý
\82½
\82¢
3222 R.Access := KEY_EXECUTE;
3223 R.RootKey := HKEY_LOCAL_MACHINE;
3224 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3226 Result := R.ReadString('version');
3228 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3235 //! main
\83t
\83H
\81[
\83\80\82Ì
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ÌIni
\83t
\83@
\83C
\83\8b\96¼
3236 function TGikoSys.GetMainKeyFileName : String;
3238 Result := Setting.GetMainKeyFileName;
3240 //! Editor
\83t
\83H
\81[
\83\80\82Ì
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ÌIni
\83t
\83@
\83C
\83\8b\96¼
3241 function TGikoSys.GetEditorKeyFileName: String;
3243 Result := Setting.GetEditorKeyFileName;
3245 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3246 function TGikoSys.GetInputAssistFileName: String;
3248 Result := Setting.GetInputAssistFileName;
3250 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3251 procedure TGikoSys.SetGikoMessage;
3253 if FGikoMessage = nil then begin
3254 FGikoMessage := TGikoMessage.Create;
3259 if (Setting.GengoSupport) then begin
3261 if (FileExists(Setting.GetLanguageFileName)) then begin
3262 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3269 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3270 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3273 if FGikoMessage <> nil then begin
3274 Result := FGikoMessage.GetMessage(MesType);
3278 //Tue, 17 Dec 2002 12:18:07 GMT
\81¨ TDateTime
\82Ö
3279 //MonaUtils
\82©
\82ç
\88Ú
\93®
3280 function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime;
3281 function StrMonthToMonth(const s: string): integer;
3283 m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
3288 for i := Low(m) to High(m) do begin
3289 if (SameText(s, m[i])) then begin
3296 wDay, wMonth, wYear: word;
3297 wHour, wMinute, wSecond: word;
3301 wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0);
3302 wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2));
3303 wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0);
3304 sTime := ChooseString(DateStr, ' ', 4);
3305 wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0);
3306 wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0);
3307 wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0);
3308 d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0);
3311 //MonaUtils
\82©
\82ç
\88Ú
\93®
3312 //!
\82 \82é
\83Z
\83p
\83\8c\81[
\83^
\82Å
\8bæ
\90Ø
\82ç
\82ê
\82½
\95¶
\8e\9a\97ñ
\82©
\82ç
\82\8e\94Ô
\96Ú
\82Ì
\95¶
\8e\9a\97ñ
\82ð
\8eæ
\82è
\8fo
\82·
3313 function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string;
3319 for i := 0 to Index - 1 do begin
3320 if (AnsiPos(Separator, S) = 0) then S := ''
3321 else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S));
3323 p := AnsiPos(Separator, S);
3324 if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S;
3328 GikoSys := TGikoSys.Create;
3331 if GikoSys <> nil then begin