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;
117 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
118 procedure RestoreThreadData(Board: TBoard);
119 //!
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
120 procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList);
124 FSelectResFilter : TAbon;
125 //FBoardURLList: TStringList;
128 destructor Destroy; override;
129 property ResRange : Longint read FResRange write FResRange;
130 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
131 property Version : String read FVersion;
132 // function MsgBox(Msg: string; Title: string; Flags: Longint): integer; overload;
133 // function MsgBox(Handle: THandle; Msg: string; Title: string; Flags: Longint): integer; overload;
134 function IsNumeric(s: string): boolean;
135 function IsFloat(s: string): boolean;
136 function DirectoryExistsEx(const Name: string): Boolean;
137 function ForceDirectoriesEx(Dir: string): Boolean;
138 // function GetVersion: string;
140 function GetBoardFileName: string;
141 function GetCustomBoardFileName: string;
142 function GetHtmlTempFileName: string;
143 function GetAppDir: string;
144 function GetTempFolder: string;
145 function GetSentFileName: string;
146 function GetConfigDir: string;
147 function GetSkinDir: string;
148 function GetSkinHeaderFileName: string;
149 function GetSkinFooterFileName: string;
150 function GetSkinResFileName: string;
151 function GetSkinNewResFileName: string;
152 function GetSkinBookmarkFileName: string;
153 function GetSkinNewmarkFileName: string;
154 function GetStyleSheetDir: string;
155 function GetOutBoxFileName: string;
156 function GetUserAgent: string;
157 function GetSambaFileName : string;
159 function GetMainKeyFileName : String;
160 function GetEditorKeyFileName: String;
161 function GetInputAssistFileName: String;
162 procedure ReadSubjectFile(Board: TBoard);
163 procedure CreateThreadDat(Board: TBoard);
164 procedure WriteThreadDat(Board: TBoard);
165 function ParseIndexLine(Line: string): TIndexRec;
166 procedure GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean); overload;
167 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¢
168 procedure GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
170 function DivideSubject(Line: string): TSubjectRec;
171 property Setting: TSetting read FSetting write FSetting;
172 property Dolib: TDolib read FDolib write FDolib;
174 function UrlToID(url: string): string;
175 function UrlToServer(url: string): string;
177 function StrTokFirst(const s:string; const sep:TStrTokSeparator; var Rec:TStrTokRec):string;
178 function StrTokNext(const sep:TStrTokSeparator; var Rec:TStrTokRec): string;
180 function GetFileSize(FileName : string) : longint;
181 function GetFileLineCount(FileName : string): longint;
182 function IntToDateTime(val: Int64): TDateTime;
183 function DateTimeToInt(ADate: TDateTime): Int64;
185 function ReadThreadFile(FileName: string; Line: Integer): string;
187 procedure MenuFont(Font: TFont);
189 function RemoveToken(var s:string; const delimiter:string):string;
190 function GetTokenIndex(s: string; delimiter: string; index: Integer): string;
192 function GetShortName(const LongName: string; ALength: integer): string;
193 function BoolToInt(b: Boolean): Integer;
194 function IntToBool(i: Integer): Boolean;
195 function GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
196 procedure LoadKeySetting(ActionList: TActionList; FileName: String);
197 procedure SaveKeySetting(ActionList: TActionList; FileName: String);
198 procedure CreateProcess(const AppPath: string; const Param: string);
199 procedure OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
200 function HTMLDecode(const AStr: String): String;
201 function GetHRefText(s: string): string;
202 function Is2chHost(Host: string): Boolean;
203 function Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
204 function Parse2chURL2(URL: string): TPathRec;
205 procedure ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
206 function GetVersionBuild: Integer;
207 function GetBrowsableThreadURL( inURL : string ) : string;
208 function GetThreadURL2BoardURL( inURL : string ) : string;
209 function Get2chThreadURL2BoardURL( inURL : string ) : string;
210 function Get2chBrowsableThreadURL( inURL : string ) : string;
211 function Get2chBoard2ThreadURL( inBoard : TBoard; inKey : string ) : string;
212 procedure ListBoardFile;
213 procedure ReadBoardFile( bbs : TBBS );
215 function GetUnknownCategory : TCategory;
216 function GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
218 procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
220 property Bayesian : TGikoBayesian read FBayesian write FBayesian;
221 function GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: Integer):string; overload;
222 function GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: Integer):string; overload;
223 procedure GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList); overload;
224 procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
225 function GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer; overload;
226 function GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer; overload;
229 procedure SpamCountWord( const text : string; wordCount : TWordCount );
230 //!
\8aw
\8fK
\83N
\83\8a\83A
231 procedure SpamForget( wordCount : TWordCount; isSpam : Boolean );
232 //!
\83X
\83p
\83\80\8aw
\8fK
233 procedure SpamLearn( wordCount : TWordCount; isSpam : Boolean );
234 //!
\83X
\83p
\83\80\93x
\90\94
235 function SpamParse( const text : string; wordCount : TWordCount ) : Extended;
236 //
\88ø
\90\94\82ª
\81A
\93ú
\95t
\82Å
\82à
\8e\9e\8d\8f\82Å
\82à
\82È
\82¢
\82±
\82Æ
\82ð
\92²
\82×
\82é
237 function NotDateorTimeString(const AStr : string): boolean;
239 //!
\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Á
240 function AddBeProfileLink(AID : string; ANum: Integer): string;
241 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
242 function GetVersionInfo(KeyWord: TVerResourceKey): string;
243 //! Plugin
\82Ì
\8fî
\95ñ
\82Ì
\8eæ
\93¾
244 function GetPluginsInfo(): string;
245 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
246 function GetIEVersion: string;
247 function SetUserOptionalStyle(): string;
248 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
249 procedure SetGikoMessage;
250 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
251 function GetGikoMessage(MesType: TGikoMessageListType): String;
252 //! GMT
\82Ì
\8e\9e\8d\8f\82ðTDateTime
\82É
\95Ï
\8a·
\82·
\82é
253 function DateStrToDateTime(const DateStr: string): TDateTime;
254 //! User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
255 function CanUser32DLL: Boolean;
256 //! OE
\88ø
\97p
\95\84\8eæ
\93¾
257 function GetOEIndentChar : string;
258 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
259 function GetReplaceFileName: String;
265 //LENGTH_RESTITLE = 40;
266 ZERO_DATE: Integer = 25569;
267 BETA_VERSION_NAME_E = 'beta';
268 BETA_VERSION_NAME_J = 'ÊÞÀ';
270 BETA_VERSION_BUILD = ''; //!< debug
\94Å
\82È
\82Ç
271 APP_NAME = 'gikoNavi';
272 BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
278 Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils, Sort, YofUtils,
282 FOLDER_INDEX_VERSION = '1.01';
283 USER_AGENT = 'Monazilla';
284 DEFAULT_NGWORD_FILE_NAME : String = 'NGword.txt';
285 NGWORDs_DIR_NAME : String = 'NGwords';
287 READ_PATH: string = '/test/read.cgi/';
288 OLD_READ_PATH: string = '/test/read.cgi?';
289 KAKO_PATH: string = '/kako/';
291 KeyWordStr: array [TVerResourceKey] of String = (
305 // *************************************************************************
306 //! GikoSys
\83R
\83\93\83X
\83g
\83\89\83N
\83^
307 // *************************************************************************
308 constructor TGikoSys.Create;
310 FSetting := TSetting.Create;
311 FDolib := TDolib.Create;
312 FAWKStr := TAWKStr.Create(nil);
313 if DirectoryExists(GetConfigDir) = false then begin
314 CreateDir(GetConfigDir);
316 FAbon := TAbon.Create;
317 FAbon.IgnoreKana := FSetting.IgnoreKana;
318 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
320 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
321 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
322 FAbon.DeleteSyria := FSetting.DeleteSyria;
323 FAbon.Deleterlo := FSetting.AbonDeleterlo;
324 FAbon.Replaceul := FSetting.AbonReplaceul;
325 FAbon.AbonPopupRes := FSetting.PopUpAbon;
327 FSelectResFilter := TAbon.Create;
328 FSelectResFilter.IgnoreKana := True;
329 //
\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
330 FSelectResFilter.AbonString := '';
332 ResRange := FSetting.ResRange;
333 FVersion := Trim(GetVersionInfo(vrFileVersion));
334 FBayesian := TGikoBayesian.Create;
335 //FBoardURLList := TStringList.Create;
336 //
\83\81\83b
\83Z
\81[
\83W
\82Ì
\8dì
\90¬
337 FGikoMessage := TGikoMessage.Create;
340 // *************************************************************************
341 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
342 // *************************************************************************
343 destructor TGikoSys.Destroy;
346 FileList: TStringList;
348 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
357 FSelectResFilter.Free;
359 //FBoardURLList.Free;
360 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
361 FileList := TStringList.Create;
363 FileList.BeginUpdate;
364 GetFileList(GetTempFolder, '*.html', FileList, False, True);
366 for i := 0 to FileList.Count - 1 do begin
367 DeleteFile(FileList[i]);
376 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
377 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
378 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
381 function TGikoSys.IsNumeric(s: string): boolean;
392 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
393 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
394 \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
396 function TGikoSys.IsFloat(s: string): boolean;
400 Result := TextToFloat(PChar(s), v, fvExtended);
403 // *************************************************************************
404 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
405 // *************************************************************************
406 function TGikoSys.GetBoardFileName: string;
408 Result := Setting.GetBoardFileName;
411 // *************************************************************************
412 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
413 // *************************************************************************
414 function TGikoSys.GetCustomBoardFileName: string;
416 Result := Setting.GetCustomBoardFileName;
419 // *************************************************************************
420 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
421 // *************************************************************************
422 function TGikoSys.GetHtmlTempFileName: string;
424 Result := Setting.GetHtmlTempFileName;
428 // *************************************************************************
429 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
430 // *************************************************************************
431 function TGikoSys.GetAppDir: string;
433 Result := Setting.GetAppDir;
436 // *************************************************************************
437 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
438 // *************************************************************************
439 function TGikoSys.GetTempFolder: string;
441 Result := Setting.GetTempFolder;
444 // *************************************************************************
445 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
446 // *************************************************************************)
447 function TGikoSys.GetSentFileName: string;
449 Result := Setting.GetSentFileName;
452 // *************************************************************************
453 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
454 // *************************************************************************
455 function TGikoSys.GetOutBoxFileName: string;
457 Result := Setting.GetOutBoxFileName;
460 // *************************************************************************
461 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
462 // *************************************************************************
463 function TGikoSys.GetConfigDir: string;
465 Result := Setting.GetConfigDir;
468 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
469 function TGikoSys.GetStyleSheetDir: string;
471 Result := Setting.GetStyleSheetDir;
474 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
475 function TGikoSys.GetSkinDir: string;
477 Result := Setting.GetSkinDir;
480 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
481 function TGikoSys.GetSkinHeaderFileName: string;
483 Result := Setting.GetSkinHeaderFileName;
486 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
487 function TGikoSys.GetSkinFooterFileName: string;
489 Result := Setting.GetSkinFooterFileName;
492 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
493 function TGikoSys.GetSkinNewResFileName: string;
495 Result := Setting.GetSkinNewResFileName;
498 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
499 function TGikoSys.GetSkinResFileName: string;
501 Result := Setting.GetSkinResFileName;
504 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
505 function TGikoSys.GetSkinBookmarkFileName: string;
507 Result := Setting.GetSkinBookmarkFileName;
510 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
511 function TGikoSys.GetSkinNewmarkFileName: string;
513 Result := Setting.GetSkinNewmarkFileName;
516 //! UserAgent
\8eæ
\93¾
517 function TGikoSys.GetUserAgent: string;
519 if Dolib.Connected then begin
520 Result := Format('%s %s/%s%d/%s', [
527 Result := Format('%s/%s %s/%s%d/%s', [
538 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
539 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
540 \return val
\82ð
\8e¦
\82· TDateTime
542 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
544 Result := ZERO_DATE + val / 86400.0;
548 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
549 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
550 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
552 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
554 Result := Trunc((ADate - ZERO_DATE) * 86400);
559 \brief Subject
\83t
\83@
\83C
\83\8bRead
560 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
562 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
564 ThreadItem: TThreadItem;
566 FileList: TStringList;
576 FavoThreadItem : TFavoriteThreadItem;
580 if Board.IsThreadDatRead then
584 usePlugIn := Board.IsBoardPlugInAvailable;
585 //server := UrlToServer( Board.URL );
586 //
\83X
\83\8c\83b
\83h
\82Å
\8b¤
\92Ê
\82ÌURL
\95\94
587 if Board.is2ch then begin
588 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi/' + Board.BBSID + '/';
590 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi?bbs=' + Board.BBSID + '&key=';
593 FileName := Board.GetFolderIndexFileName;
595 FileList := TStringList.Create;
596 FileList.Sorted := True;
597 FileList.BeginUpdate;
598 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
599 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
602 //
\8fd
\95¡
\82ð
\96h
\82®
604 Board.Sorted := True;
605 sl := TStringList.Create;
607 if FileExists(FileName) then begin
608 sl.LoadFromFile(FileName);
609 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
610 for i := sl.Count - 1 downto 1 do begin
611 Rec := ParseIndexLine(sl[i]);
612 islog := FileList.Find( Rec.FFileName, Index );
614 ThreadItem := TThreadItem.Create(
617 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
619 if Board.is2ch then begin
620 ThreadItem := TThreadItem.Create(
623 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
628 ThreadItem := TThreadItem.Create(
631 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
638 ThreadItem.BeginUpdate;
640 FileList.Delete( Index );
642 ThreadItem.No := Rec.FNo;
643 ThreadItem.FileName := Rec.FFileName;
644 ThreadItem.Title := MojuUtils.UnSanitize(Rec.FTitle);
645 ThreadItem.Count := Rec.FCount;
646 ThreadItem.Size := Rec.FSize;
647 ThreadItem.RoundDate := Rec.FRoundDate;
648 ThreadItem.LastModified := Rec.FLastModified;
649 ThreadItem.Kokomade := Rec.FKokomade;
650 ThreadItem.NewReceive := Rec.FNewReceive;
651 ThreadItem.UnRead := Rec.FUnRead;
652 ThreadItem.ScrollTop := Rec.FScrollTop;
653 ThreadItem.AllResCount := Rec.FAllResCount;
654 ThreadItem.NewResCount := Rec.FNewResCount;
655 ThreadItem.AgeSage := Rec.FAgeSage;
656 ThreadItem.ParentBoard := Board;
657 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
659 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
660 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
663 ThreadItem.EndUpdate;
664 Board.Add(ThreadItem);
666 if (ThreadItem.UnRead) and (ThreadItem.IsLogFile) then
671 if UnRead <> Board.UnRead then
672 Board.UnRead := UnRead;
674 //
\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
675 AddOutofIndexDat(Board, FileList);
678 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
679 RestoreThreadData( Board );
683 Board.Sorted := False;
685 Board.IsThreadDatRead := True;
688 \brief
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
689 \param Board
\92Ç
\89Á
\82·
\82é
\94Â
690 \param DatList dat
\83t
\83@
\83C
\83\8b\96¼
692 procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList);
695 Boardpath,FileName : String;
697 ThreadItem: TThreadItem;
699 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
700 //
\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
701 for i := 0 to DatList.Count - 1 do begin
702 FileName := Boardpath + DatList[i];
704 //ResRec := DivideStrLine(ReadThreadFile(FileName, 1));
705 if Board.IsBoardPlugInAvailable then begin
706 ThreadItem := TThreadItem.Create(
709 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
710 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
712 ThreadItem := TThreadItem.Create(
715 Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
716 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
719 ThreadItem.BeginUpdate;
720 ThreadItem.FileName := DatList[i];
721 //ThreadItem.FilePath := FileName;
722 ThreadItem.No := Board.Count + 1;
723 ThreadItem.Title := ResRec.FTitle;
724 ThreadItem.Count := GetFileLineCount(FileName);
725 ThreadItem.AllResCount := ThreadItem.Count;
726 ThreadItem.NewResCount := ThreadItem.Count;
727 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é
728 ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) );
729 ThreadItem.LastModified := ThreadItem.RoundDate;
730 ThreadItem.Kokomade := -1;
731 ThreadItem.NewReceive := 0;
732 ThreadItem.ParentBoard := Board;
733 ThreadItem.IsLogFile := True;
734 ThreadItem.Round := False;
735 ThreadItem.UnRead := False;
736 ThreadItem.ScrollTop := 0;
737 ThreadItem.AgeSage := gasNone;
738 ThreadItem.EndUpdate;
739 Board.Add(ThreadItem);
743 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
744 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
746 procedure TGikoSys.CreateThreadDat(Board: TBoard);
750 SubjectList: TStringList;
756 if not FileExists(Board.GetSubjectFileName) then Exit;
757 FileName := Board.GetFolderIndexFileName;
759 SubjectList := TStringList.Create;
761 SubjectList.LoadFromFile(Board.GetSubjectFileName);
762 sl := TStringList.Create;
766 sl.Add(FOLDER_INDEX_VERSION);
767 for i := 0 to SubjectList.Count - 1 do begin
768 Rec := DivideSubject(SubjectList[i]);
770 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
773 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
774 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
775 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
776 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
777 + Format('%x', [0]) + #1 //size
778 + Format('%x', [0]) + #1 //RoundDate
779 + Format('%x', [0]) + #1 //LastModified
780 + Format('%x', [0]) + #1 //Kokomade
781 + Format('%x', [0]) + #1 //NewReceive
782 + '0' + #1 //
\96¢
\8eg
\97p
783 + Format('%x', [0]) + #1 //UnRead
784 + Format('%x', [0]) + #1 //ScrollTop
785 + Format('%x', [Rec.FCount]) + #1 //AllResCount
786 + Format('%x', [0]) + #1 //NewResCount
787 + Format('%x', [0]); //AgeSage
789 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
790 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
792 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
793 MojuUtils.Sanitize(Rec.FTitle), //
\83^
\83C
\83g
\83\8b
794 Rec.FCount, //
\83J
\83E
\83\93\83g
803 Rec.FCount, //AllResCount
812 sl.SaveToFile(FileName);
822 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
823 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
825 procedure TGikoSys.WriteThreadDat(Board: TBoard);
827 // Values: array[Boolean] of string = ('0', '1');
833 TmpFileList: TStringList;
835 if not Board.IsThreadDatRead then
837 FileName := Board.GetFolderIndexFileName;
838 ForceDirectoriesEx( ExtractFilePath( FileName ) );
840 sl := TStringList.Create;
841 TmpFileList := TStringList.Create;
842 TmpFileList.Sorted := true;
844 TmpFileList.BeginUpdate;
845 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
846 TmpFileList.EndUpdate;
848 sl.Add(FOLDER_INDEX_VERSION);
850 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
851 Sort.SetSortNoFlag(true);
852 Sort.SetSortOrder(true);
853 Sort.SetSortIndex(0);
854 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
855 Board.CustomSort(ThreadItemSortProc);
857 for i := 0 to Board.Count - 1 do begin
858 Board.Items[i].No := i + 1;
859 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
860 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
861 [Board.Items[i].No, //
\94Ô
\8d\86
862 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
863 MojuUtils.Sanitize(Board.Items[i].Title), //
\83^
\83C
\83g
\83\8b
864 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
865 Board.Items[i].Size, //size
866 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
867 DateTimeToInt(Board.Items[i].LastModified), //LastModified
868 Board.Items[i].Kokomade, //Kokomade
869 Board.Items[i].NewReceive, //NewReceive
871 BoolToInt(Board.Items[i].UnRead), //UnRead
872 Board.Items[i].ScrollTop, //ScrollTop
873 Board.Items[i].AllResCount, //AllResCount
874 Board.Items[i].NewResCount, //NewResCount
875 Ord(Board.Items[i].AgeSage)] //AgeSage
881 sl.SaveToFile(FileName);
883 for i := 0 to TmpFileList.Count - 1 do begin
884 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
894 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
895 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
896 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
898 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
900 Result.FNo := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
901 Result.FFileName := MojuUtils.RemoveToken(Line, #1);
902 Result.FTitle := MojuUtils.UnSanitize(MojuUtils.RemoveToken(Line, #1));
903 Result.FCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
904 Result.FSize := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
905 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
906 Result.FLastModified := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
907 Result.FKokomade := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), -1);
908 Result.FNewReceive := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
909 RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
910 Result.FUnRead := IntToBool(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
911 Result.FScrollTop := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
912 Result.FAllResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
913 Result.FNewResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
914 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
919 \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é
920 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
921 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
922 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
923 \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
924 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
926 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
927 \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
931 GetFileList('c:\', '*.txt', list, True, True);
934 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
937 SearchRec : TSearchRec;
940 Path := IncludeTrailingPathDelimiter(Path);
941 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
943 while rc = 0 do begin
944 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
945 s := Path + SearchRec.Name;
947 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
951 List.Add(SearchRec.Name);
952 if SubDir and (SearchRec.Attr and faDirectory > 0) then
953 GetFileList(s, Mask, List, True, IsPathAdd);
955 rc := FindNext(SearchRec);
958 SysUtils.FindClose(SearchRec);
964 \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
965 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
966 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
967 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
968 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
969 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
970 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
973 GetFileList('c:\', '*.txt', list, True);
976 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
979 SearchRec : TSearchRec;
981 Path := IncludeTrailingPathDelimiter(Path);
982 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
984 while rc = 0 do begin
985 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
986 if (SearchRec.Attr and faDirectory = 0) then begin
987 if IsPathAdd then begin
988 List.Add(Path + SearchRec.Name)
990 List.Add(SearchRec.Name);
994 rc := FindNext(SearchRec);
997 SysUtils.FindClose(SearchRec);
1003 \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é
1004 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1005 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1006 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1007 \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
1009 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1010 \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
1014 GetDirectoryList('c:\', '*.txt', list, True);
1017 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1020 SearchRec : TSearchRec;
1023 Path := IncludeTrailingPathDelimiter(Path);
1024 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1026 while rc = 0 do begin
1027 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1028 s := Path + SearchRec.Name;
1029 //if (SearchRec.Attr and faDirectory > 0) then
1030 // s := IncludeTrailingPathDelimiter(s)
1032 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1033 List.Add( IncludeTrailingPathDelimiter( s ) );
1034 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1035 GetDirectoryList(s, Mask, List, True);
1037 rc := FindNext(SearchRec);
1040 SysUtils.FindClose(SearchRec);
1046 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1047 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1048 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1050 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1060 if AnsiPos('<>', Line) = 0 then
1064 Result.FFileName := RemoveToken(Line, Delim);
1065 Result.FTitle := Trim(RemoveToken(Line, Delim));
1067 ws := Result.FTitle;
1068 if Copy(ws, Length(ws), 1) = ')' then begin
1071 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1074 end else if Copy(ws, Length(ws), 1) = '>' then begin
1078 for i := Length(ws) - 1 downto 1 do begin
1079 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1080 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1081 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1082 if IsNumeric(ws) then
1083 Result.FCount := StrToInt(ws);
1084 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1091 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1092 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1095 function TGikoSys.UrlToID(url: string): string;
1102 if url = '' then Exit;
1104 url := Copy(url, 0, Length(url) - 1);
1105 for i := Length(url) downto 0 do begin
1106 if url[i] = '/' then begin
1107 Result := Copy(url, i + 1, Length(url));
1117 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1118 \param url
\89ð
\8eß
\82·
\82é URL
1119 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1121 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1123 function TGikoSys.UrlToServer(url: string): string;
1130 wsURL := Trim(wsURL);
1132 if wsURL = '' then exit;
1134 if Copy(wsURL, Length(wsURL), 1) = '/' then
1135 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1137 for i := Length(wsURL) downto 0 do begin
1138 if wsURL[i] = '/' then begin
1139 Result := Copy(wsURL, 0, i);
1146 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1147 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1148 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1150 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1154 Code := GetFileAttributes(PChar(Name));
1155 Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1159 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1160 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1161 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1163 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1166 if Length(Dir) = 0 then
1167 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1168 Dir := ExcludeTrailingPathDelimiter(Dir);
1169 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1170 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1171 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1175 \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
1176 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1177 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1178 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1179 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1180 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1181 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1183 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1187 Result := StrTokNext(sep, Rec);
1191 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1192 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1193 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1194 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1195 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1196 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1198 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1205 if Len >= Pos then begin
1206 while (Pos <= Len) and (Str[Pos] in sep) do begin
1210 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1211 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1216 Result := Copy(Str, I, Pos - I);
1217 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1225 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1226 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1227 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1229 function TGikoSys.GetFileSize(FileName : string): longint;
1234 if not FileExists(FileName) then begin
1238 Assign(F, FileName);
1240 Result := FileSize(F);
1248 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1249 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1251 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1253 function TGikoSys.GetFileLineCount(FileName : string): longint;
1257 sl := TStringList.Create;
1260 sl.LoadFromFile(FileName);
1272 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1273 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1274 \param Line
\8ew
\92è
\8ds
1275 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1276 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1278 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1280 fileTmp : TStringList;
1283 if FileExists(FileName) then begin
1284 fileTmp := TStringList.Create;
1287 fileTmp.LoadFromFile( FileName );
1288 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1289 Result := fileTmp.Strings[ Line-1 ];
1292 //on EFOpenError do Result := '';
1301 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1302 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1304 procedure TGikoSys.MenuFont(Font: TFont);
1307 nm: NONCLIENTMETRICS;
1309 nm.cbSize := sizeof(NONCLIENTMETRICS);
1311 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1312 lf := nm.lfMenuFont;
1314 Font.Name := lf.lfFaceName;
1315 Font.Height := lf.lfHeight;
1317 if lf.lfWeight >= 700 then
1318 Font.Style := Font.Style + [fsBold];
1319 if lf.lfItalic = 1 then
1320 Font.Style := Font.Style + [fsItalic];
1324 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1325 \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ñ
1326 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1327 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1329 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1331 function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1335 p := AnsiPos(delimiter, s);
1339 Result := Copy(s, 1, p - 1);
1340 Delete(s, 1, Length(Result) + Length(delimiter));
1345 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1346 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1347 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1348 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1350 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1352 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1357 for i := 0 to index do
1358 Result := RemoveToken(s, delimiter);
1362 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1363 {procedure TGikoSys.FlashExitWrite;
1367 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1368 for i := 0 to FExitWrite.Count - 1 do
1369 WriteThreadDat(FExitWrite[i]);
1374 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1375 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1376 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1377 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1381 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1383 ERASECHAR : array [1..39] of string =
1384 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1385 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1386 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1387 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1389 Chr : array [0..255] of char;
1393 s := Trim(LongName);
1394 if (Length(s) <= ALength) then begin
1398 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1399 S := CustomStringReplace(S, ERASECHAR[i], '');
1401 if (Length(S) <= ALength) then begin
1404 Windows.LCMapString(
1405 GetUserDefaultLCID(),
1413 S := Copy(S,1,ALength);
1415 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1416 S := Copy(S, 1, Length(S) - 1);
1427 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1428 \return False..0, True..1
1430 function TGikoSys.BoolToInt(b: Boolean): Integer;
1432 Result := IfThen(b, 1, 0);
1436 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1437 \return 1..True, other..False
1438 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1439 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1441 function TGikoSys.IntToBool(i: Integer): Boolean;
1447 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1448 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1449 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1450 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1452 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1456 GZipStream: TGzipDecompressStream;
1457 TextStream: TStringStream;
1458 buf: array[0..BUF_SIZE - 1] of Byte;
1464 TextStream := TStringStream.Create('');
1466 //
\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¢)
1467 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1468 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1469 ResStream.Position := 0;
1470 GZipStream := TGzipDecompressStream.Create(TextStream);
1473 FillChar(buf, BUF_SIZE, 0);
1474 cnt := ResStream.Read(buf, BUF_SIZE);
1476 GZipStream.Write(buf, BUF_SIZE);
1482 ResStream.Position := 0;
1484 FillChar(buf, BUF_SIZE, 0);
1485 cnt := ResStream.Read(buf, BUF_SIZE);
1487 TextStream.Write(buf, BUF_SIZE);
1491 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1492 s := TextStream.DataString;
1495 while (i > 0) and (s[i] = #0) do
1497 Delete(s, i + 1, ln - i);
1500 while i <> 0 do begin
1512 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1513 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1514 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1516 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1518 STD_SEC = 'KeySetting';
1524 SecList: TStringList;
1525 Component: TComponent;
1527 if not FileExists(fileName) then
1529 SecList := TStringList.Create;
1530 ini := TMemIniFile.Create(fileName);
1532 ini.ReadSection(STD_SEC, SecList);
1533 for i := 0 to SecList.Count - 1 do begin
1534 ActionName := SecList[i];
1535 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1536 if ActionKey <> -1 then begin
1537 Component := ActionList.Owner.FindComponent(ActionName);
1538 if TObject(Component) is TAction then begin
1539 TAction(Component).ShortCut := ActionKey;
1550 \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¶
1551 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1552 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1554 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
1556 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1558 STD_SEC = 'KeySetting';
1563 ini := TMemIniFile.Create(GetConfigDir + FileName);
1565 for i := 0 to ActionList.ActionCount - 1 do begin
1566 if ActionList.Actions[i].Tag = -1 then
1568 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1578 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1579 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1580 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1582 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1584 PI: TProcessInformation;
1588 Path := '"' + AppPath + '"';
1590 Path := Path + ' ' + Param;
1592 SI.Cb := SizeOf(Si);
1593 SI.lpReserved := nil;
1594 SI.lpDesktop := nil;
1597 SI.cbReserved2 := 0;
1598 SI.lpReserved2 := nil;
1600 Windows.CreateProcess(nil,
1613 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1614 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1615 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1617 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1621 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1622 gbtUserApp, gbtAuto:
1623 if (Setting.URLApp) and (FileExists(Setting.URLAppFile)) then
1624 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1626 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1631 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1632 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1633 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1635 function TGikoSys.HTMLDecode(const AStr: String): String;
1637 Sp, Rp, Cp, Tp: PChar;
1642 SetLength(Result, Length(AStr));
1644 Rp := PChar(Result);
1647 while Sp^ <> #0 do begin
1653 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1659 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1663 while (Sp^ <> ';') and (Sp^ <> #0) do
1670 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1678 Num := IsNumeric(Copy(Tp, 1, 1));
1679 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1680 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1684 SetString(S, Tp, Sp - Tp);
1689 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1690 //[Cp^ + Sp^, Cp - PChar(AStr)])
1700 // on E:EConvertError do
1701 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1702 // [Cp^ + Sp^, Cp - PChar(AStr)])
1704 SetLength(Result, Rp - PChar(Result));
1708 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1709 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1710 \return
\8eæ
\93¾
\82µ
\82½ URL
1712 function TGikoSys.GetHRefText(s: string): string;
1722 Index := AnsiPos('href', LowerCase(s));
1725 s := Trim(Copy(s, Index + 4, Length(s)));
1726 s := Trim(Copy(s, 2, Length(s)));
1728 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1729 //if Copy(s, 1, 1) = '"' then begin
1730 if s[1] = '"' then begin
1731 s := Trim(Copy(s, 2, Length(s)));
1734 Index := AnsiPos('"', s);
1735 if Index <> 0 then begin
1736 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1737 s := Copy(s, 1, Index - 1);
1739 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1740 Index := AnsiPos(' ', s);
1741 Index2 := AnsiPos('>', s);
1744 if Index > Index2 then
1747 s := Copy(s, 1, Index - 1)
1749 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1756 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1757 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1758 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1760 function TGikoSys.Is2chHost(Host: string): Boolean;
1762 HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
1768 if RightStr( Host, 1 ) = '/' then
1769 Host := Copy( Host, 1, Length( Host ) - 1 );
1770 OutputDebugString(pchar(HOST_NAME[0]));
1771 for i := 0 to Length(HOST_NAME) - 1 do begin
1772 // Len := Length(HOST_NAME[i]);
1773 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1774 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1782 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1783 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1784 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1785 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1786 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1787 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1788 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1790 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1800 Index := AnsiPos(READ_PATH, path);
1801 if Index <> 0 then begin
1802 s := Copy(path, Index + Length(READ_PATH), Length(path));
1804 if (Length(s) > 0) and (s[1] = '/') then
1806 BBSID := GetTokenIndex(s, '/', 0);
1807 BBSKey := GetTokenIndex(s, '/', 1);
1810 Result := (BBSID <> '') or (BBSKey <> '');
1813 Index := AnsiPos(KAKO_PATH, path);
1814 if Index <> 0 then begin
1815 s := Copy(path, 2, Length(path));
1816 BBSID := GetTokenIndex(s, '/', 0);
1817 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1818 BBSID := GetTokenIndex(s, '/', 1);
1819 BBSKey := ChangeFileExt(Document, '');
1820 Result := (BBSID <> '') or (BBSKey <> '');
1823 Index := AnsiPos('read.cgi?', URL);
1824 if Index <> 0 then begin
1825 SList := TStringList.Create;
1828 // s := HTMLDecode(Document);
1829 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1830 BBSID := SList.Values['bbs'];
1831 BBSKey := SList.Values['key'];
1832 Result := (BBSID <> '') or (BBSKey <> '');
1844 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1845 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1846 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1847 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1849 http://2ch.net/
\92\86\97ª/32-50 \n
1850 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1852 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1859 URL := Trim(LowerCase(URL));
1860 if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
1864 buf := Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 );
1866 stRes := StrToInt64( buf );
1867 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1868 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
1870 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, Length( URL ) - AnsiPos('&to=', URL ) - 4 + 1 );
1873 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1874 buf := Copy( buf, 1, ps );
1878 endRes := StrToInt64(buf)
1885 if (stRes <> 0) and (endRes = 0) then
1886 endRes := stRes + MAX_POPUP_RES
1887 else if (stRes = 0) and (endRes <> 0) then begin
1888 stRes := endRes - MAX_POPUP_RES;
1892 GikoSys.GetBrowsableThreadURL( URL );
1893 end else if( AnsiPos('&res=', URL ) <> 0 ) then begin
1895 buf := Copy( URL, AnsiPos('&res=', URL ) + 5, Length( URL ) - AnsiPos('&res=', URL ) - 5 + 1 );
1898 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1899 buf := Copy( buf, 1, ps );
1902 stRes := StrToInt(buf)
1909 end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
1911 stRes := StrToInt64( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
1912 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1913 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, AnsiPos( '&nofirst=',URL) - AnsiPos('&end=', URL ) - 5);
1915 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, Length( URL ) - AnsiPos('&to=', URL ) - 5 + 1 );
1918 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1919 buf := Copy( buf, 1, ps );
1923 endRes := StrToInt64(buf);
1930 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
1931 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
1932 if Length(buf) > 0 then begin
1933 if AnsiPos('-', buf) = 1 then begin
1938 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1940 convBuf := Copy( buf, 1, ps );
1941 if convBuf <> '' then
1942 endRes := StrToInt64(convBuf)
1948 if endRes <> 0 then begin
1949 stRes := endRes - MAX_POPUP_RES;
1956 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1958 convBuf := Copy( buf, 1, ps );
1959 if convBuf <> '' then begin
1960 stRes := StrToInt64(convBuf);
1964 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1966 convBuf := Copy( buf, 1, ps );
1967 if convBuf <> '' then
1968 endRes := StrToInt64(convBuf)
1990 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1991 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1992 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
1994 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
1999 // convBuf : String;
2010 URL := Trim(LowerCase(URL));
2015 Result.FFirst := False;
2016 Result.FStBegin := False;
2017 Result.FToEnd := False;
2018 Result.FDone := False;
2019 Result.FNoParam := False;
2023 if URL[length(URL)] = '\' then
2025 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2026 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2027 s := Copy(URL, RStart + RLength - 1, Length(URL));
2029 //
\95W
\8f\80\8f\91\8e®
2030 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2031 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2032 FAWKStr.RegExp := '/test/read.cgi/.+/[0-9]+/?.*';
2033 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2034 s := Copy(s, 15, Length(s));
2036 SList := TStringList.Create;
2039 FAWKStr.RegExp := '/';
2040 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2041 Result.FBBS := SList[1];
2042 Result.FKey := SList[2];
2043 if SList.Count >= 4 then
2047 Result.FNoParam := true;
2053 FAWKStr.LineSeparator := mcls_CRLF;
2054 FAWKStr.RegExp := '-';
2055 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2056 Result.FFirst := True;
2058 FAWKStr.RegExp := 'l[0-9]+';
2059 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2060 Result.FFirst := True;
2062 for i := 0 to SList.Count - 1 do begin
2063 if Trim(SList[i]) = '' then begin
2065 Result.FStBegin := True;
2066 if i = (SList.Count - 1) then
2067 Result.FToEnd := True;
2068 end else if IsNumeric(SList[i]) then begin
2069 wkInt := StrToInt(SList[i]);
2070 wkMax := Max(wkMax, wkInt);
2074 wkMin := Min(wkMin, wkInt);
2075 end else if Trim(SList[i]) = 'n' then begin
2076 Result.FFirst := True;
2078 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2079 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2080 if Copy(SList[i], 1, 1) = 'n' then
2081 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2083 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2084 Result.FFirst := True;
2085 wkMax := Max(wkMax, wkInt);
2089 wkMin := Min(wkMin, wkInt);
2093 if Result.FStBegin and (not Result.FToEnd) then
2095 else if (not Result.FStBegin) and Result.FToEnd then
2097 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2098 Result.FSt := wkMin;
2099 Result.FTo := wkMax;
2101 //Result.FSt := wkMin;
2102 //Result.FTo := wkMax;
2108 Result.FDone := True;
2112 //
\90Vkako
\8f\91\8e®
2113 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2114 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2115 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2116 SList := TStringList.Create;
2119 FAWKStr.RegExp := '/';
2120 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2121 Result.FBBS := SList[1];
2122 Result.FKey := ChangeFileExt(SList[5], '');
2123 Result.FFirst := True;
2129 Result.FDone := True;
2133 //
\8b\8ckako
\8f\91\8e®
2134 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2135 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2136 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2137 SList := TStringList.Create;
2140 FAWKStr.RegExp := '/';
2141 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2142 Result.FBBS := SList[1];
2143 Result.FKey := ChangeFileExt(SList[4], '');
2144 Result.FFirst := True;
2150 Result.FDone := True;
2154 //log
\8by
\82Ñlog2
\8f\91\8e®
2155 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2156 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2157 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2158 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2159 SList := TStringList.Create;
2162 FAWKStr.RegExp := '/';
2163 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2164 Result.FBBS := SList[2];
2165 Result.FKey := ChangeFileExt(SList[5], '');
2166 Result.FFirst := True;
2172 Result.FDone := True;
2177 //
\8b\8cURL
\8f\91\8e®
2178 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2179 FAWKStr.RegExp := '/test/read\.cgi\?';
2180 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2181 s := Copy(s, 16, Length(s));
2182 SList := TStringList.Create;
2185 FAWKStr.RegExp := '&';
2186 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2187 Result.FFirst := True;
2188 for i := 0 to SList.Count - 1 do begin
2189 if Pos('bbs=', SList[i]) = 1 then begin
2190 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2191 end else if Pos('key=', SList[i]) = 1 then begin
2192 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2193 end else if Pos('st=', SList[i]) = 1 then begin
2194 wk := Copy(SList[i], 4, Length(SList[i]));
2195 if IsNumeric(wk) then
2196 Result.FSt := StrToInt(wk)
2197 else if wk = '' then
2198 Result.FStBegin := True;
2199 end else if Pos('to=', SList[i]) = 1 then begin
2200 wk := Copy(SList[i], 4, Length(SList[i]));
2201 if IsNumeric(wk) then
2202 Result.FTo := StrToInt(wk)
2203 else if wk = '' then
2204 Result.FToEnd := True;
2205 end else if Pos('nofirst=', SList[i]) = 1 then begin
2206 Result.FFirst := False;
2215 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2216 Result.FDone := True;
2224 \brief URI
\82ð
\95ª
\89ð
2225 \param URL
\95ª
\89ð
\82·
\82é URI
2226 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2227 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2228 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2229 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2230 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2231 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2233 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2243 URI := TIdURI.Create(URL);
2245 Protocol := URI.Protocol;
2248 Document := URI.Document;
2250 Bookmark := URI.Bookmark;
2257 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2258 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2260 function TGikoSys.GetVersionBuild: Integer;
2262 FixedFileInfo: PVSFixedFileInfo;
2263 VersionHandle, VersionSize: DWORD;
2264 pVersionInfo: Pointer;
2269 AppFile := Application.ExeName;
2270 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2271 if VersionSize = 0 then
2273 GetMem(pVersionInfo, VersionSize);
2275 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2276 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2277 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2279 FreeMem(pVersionInfo, VersionSize);
2284 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2285 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2286 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2288 \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
2289 \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
2290 \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
2291 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2293 \97á(
\90³
\8bK
\89»
\91O):\n
2294 http://
\92\86\97ª/ \n
2295 http://
\92\86\97ª/20-100
2297 (
\90³
\8bK
\89»
\8cã):\n
2298 http://
\92\86\97ª/l50
2300 function TGikoSys.GetBrowsableThreadURL(
2304 threadItem : TThreadItem;
2305 boardPlugIn : TBoardPlugIn;
2310 //=====
\83v
\83\89\83O
\83C
\83\93
2312 for i := Length( BoardGroups ) - 1 downto 1 do begin
2313 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2314 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2315 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2316 if board <> nil then begin
2317 boardPlugIn := BoardGroups[i].BoardPlugIn;
2318 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2319 Result := threadItem.URL;
2328 // 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¢
2331 if Length( Result ) = 0 then
2332 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2337 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2338 \param inURL
\83X
\83\8c\83b
\83h URL
2341 function TGikoSys.GetThreadURL2BoardURL(
2345 threadItem : TThreadItem;
2346 boardPlugIn : TBoardPlugIn;
2351 //=====
\83v
\83\89\83O
\83C
\83\93
2353 for i := Length( BoardGroups ) - 1 downto 1 do begin
2354 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2355 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2356 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2357 boardPlugIn := BoardGroups[i].BoardPlugIn;
2358 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2359 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2367 // 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¢
2370 if Length( Result ) = 0 then
2371 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2376 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2377 \param inURL
\83X
\83\8c\83b
\83h URL
2379 \see TGikoSys.GetThreadURL2BoardURL
2381 function TGikoSys.Get2chThreadURL2BoardURL(
2385 Protocol, Host, Path, Document, Port, Bookmark : string;
2386 BBSID, BBSKey : string;
2390 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2391 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2393 foundPos := Pos( '/test/read.cgi', inURL );
2394 if {(Is2chHost(Host)) and} (foundPos > 0) then
2395 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2397 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2402 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2403 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2404 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2405 \see TGikoSys.GetBrowsableThreadURL
2407 function TGikoSys.Get2chBrowsableThreadURL(
2411 Protocol, Host, Path, Document, Port, Bookmark : string;
2412 BBSID, BBSKey : string;
2416 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2419 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2420 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2421 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2423 if Is2chHost( Host ) then begin
2424 Result := Protocol + '://' + Host +
2425 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2427 if foundPos > 0 then
2428 Result := Copy( inURL, 1, foundPos ) +
2429 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2431 Result := Protocol + '://' + Host +
2432 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2439 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2440 \param inBoard
\94Â URL
2441 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2442 \return
\83X
\83\8c\83b
\83h URL
2444 function TGikoSys.Get2chBoard2ThreadURL(
2452 server := UrlToServer( inBoard.URL );
2453 //if Is2chHost( server ) then
2454 if inBoard.Is2ch then
2455 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2457 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2462 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2464 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2466 procedure TGikoSys.ListBoardFile;
2468 boardFileList : TStringList;
2473 for i := 0 to Length( BBSs ) - 1 do
2477 SetLength( BBSs, 0 );
2480 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2481 if FileExists( GikoSys.GetBoardFileName ) then begin
2482 SetLength( BBSs, l + 1 );
2483 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2484 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2488 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2489 SetLength( BBSs, l + 1 );
2490 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2491 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2495 // Board
\83t
\83H
\83\8b\83_
2496 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2497 BoardFileList := TStringList.Create;
2499 BoardFileList.BeginUpdate;
2500 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*.txt', BoardFileList, True, True );
2501 BoardFileList.EndUpdate;
2502 SetLength( BBSs, l + BoardFileList.Count );
2503 for i := BoardFileList.Count - 1 downto 0 do begin
2504 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2505 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2515 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2516 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2518 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2523 boardFile : TStringList;
2524 CategoryList : TStringList;
2525 BoardList : TStringList;
2526 Category : TCategory;
2530 // RoundItem : TRoundItem;
2532 i, iBound : Integer;
2533 j, jBound : Integer;
2534 k, kBound : Integer;
2537 if not FileExists( bbs.FilePath ) then
2541 ini := TMemIniFile.Create('');
2542 boardFile := TStringList.Create;
2545 boardFile.LoadFromFile( bbs.FilePath );
2547 ini.SetStrings( boardFile );
2548 CategoryList := TStringList.Create;
2549 BoardList := TStringList.Create;
2551 ini.ReadSections( CategoryList );
2553 iBound := CategoryList.Count - 1;
2554 for i := 0 to iBound do begin
2555 ini.ReadSection( CategoryList[i], BoardList );
2556 Category := TCategory.Create;
2557 Category.No := i + 1;
2558 Category.Title := CategoryList[i];
2560 jBound := BoardList.Count - 1;
2561 for j := 0 to jBound do begin
2563 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2564 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2565 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2566 //=====
\83v
\83\89\83O
\83C
\83\93
2568 kBound := Length(BoardGroups) - 1;
2569 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2570 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2571 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2572 if not BoardGroups[k].Find(inistr, p) then begin
2573 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2574 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2575 if not BoardGroups[k].Find(tmpstring, p) then begin
2577 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2578 BoardGroups[k].AddObject(tmpstring, Board);
2579 Category.Add(Board);
2581 //
\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é
2585 Board := TBoard(BoardGroups[k].Objects[p]);
2586 if Board.ParentCategory <> Category then
2587 Category.Add(Board);
2591 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2592 BoardGroups[k].AddObject(tmpstring, Board);
2593 Category.Add(Board);
2595 //
\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é
2600 Board := TBoard(BoardGroups[k].Objects[p]);
2601 if Board.ParentCategory <> Category then
2602 Category.Add(Board);
2609 // 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¢
2612 if (Board = nil) then begin
2613 if not BoardGroups[0].Find(inistr,p) then begin
2614 Board := TBoard.Create( nil, inistr );
2615 BoardGroups[0].AddObject(inistr, Board);
2616 Category.Add(Board);
2618 Board := TBoard(BoardGroups[0].Objects[p]);
2619 if Board.ParentCategory <> Category then
2620 Category.Add(Board);
2624 if (Board.Multiplicity = 0) then begin
2627 Board.Multiplicity := 1;
2628 Board.Title := BoardList[j];
2629 Board.RoundDate := ZERO_DATE;
2634 Board.Multiplicity := Board.Multiplicity + 1;
2639 bbs.Add( Category );
2644 bbs.IsBoardFileRead := True;
2657 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2658 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2660 function TGikoSys.GetUnknownCategory : TCategory;
2662 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2665 if Length( BBSs ) < 2 then begin
2670 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2671 if Result = nil then begin
2672 Result := TCategory.Create;
2673 Result.Title := UNKNOWN_CATEGORY;
2674 BBSs[ 1 ].Add( Result );
2680 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2681 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2683 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2685 category : TCategory;
2687 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2690 category := GetUnknownCategory;
2691 if category = nil then begin
2694 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2695 if Result = nil then begin
2696 Result := TBoard.Create( inPlugIn, inURL );
2697 Result.Title := UNKNOWN_BOARD;
2698 category.Add( Result );
2705 function TGikoSys.GetSambaFileName : string;
2707 Result := Setting.GetSambaFileName;
2711 \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
2712 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2713 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2714 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2715 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2717 function TGikoSys.GetSameIDResAnchor(
2718 const AID : string; ThreadItem: TThreadItem;
2719 limited: Integer):string;
2724 ResLink : TResLinkRec;
2726 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2728 Res.FType := glt2chNew;
2731 if (not IsNoValidID(AID)) and
2732 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2733 body := TStringList.Create;
2735 GetSameIDRes(AID, ThreadItem, body);
2736 if (limited > 0) and (body.Count > limited) then begin
2737 for i := body.Count - limited to body.Count - 1 do begin
2738 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2741 for i := 0 to body.Count - 1 do begin
2742 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2748 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2749 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2750 HTMLCreater.ConvRes(@Res, @ResLink, false);
2751 Result := Res.FBody;
2756 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2757 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2758 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2759 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2761 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2764 ReadList: TStringList;
2766 boardPlugIn : TBoardPlugIn;
2768 if (not IsNoValidID(AID)) and
2769 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2770 //if ThreadItem.IsBoardPlugInAvailable then begin
2771 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2772 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2773 //boardPlugIn := ThreadItem.BoardPlugIn;
2774 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2776 for i := 0 to threadItem.Count - 1 do begin
2778 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2779 if(AnsiPos(AID, Res.FDateTime) > 0) then begin
2780 body.Add(IntToStr(i+1));
2784 ReadList := TStringList.Create;
2786 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2787 for i := 0 to ReadList.Count - 1 do begin
2788 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2789 if AnsiPos(AID, Res.FDateTime) > 0 then begin
2790 body.Add(IntToStr(i+1));
2801 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2802 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2803 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2804 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2807 function TGikoSys.GetSameIDResAnchor(AIDNum : Integer;
2808 ThreadItem: TThreadItem;
2809 limited: Integer):string;
2814 ResLink : TResLinkRec;
2816 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2818 Res.FType := glt2chNew;
2821 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2822 body := TStringList.Create;
2824 GetSameIDRes(AIDNum, ThreadItem, body);
2825 if (limited > 0) and ( body.Count > limited) then begin
2826 for i := body.Count - 20 to body.Count - 1 do begin
2827 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2830 for i := 0 to body.Count - 1 do begin
2831 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2837 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2838 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2839 HTMLCreater.ConvRes(@Res, @ResLink, false);
2840 Result := Res.FBody;
2845 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2846 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2847 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2848 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2850 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2853 boardPlugIn : TBoardPlugIn;
2855 stList: TStringList;
2858 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2859 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2860 //if ThreadItem.IsBoardPlugInAvailable then begin
2861 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2862 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2863 //boardPlugIn := ThreadItem.BoardPlugIn;
2864 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2865 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2867 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2869 AID := Res.FDateTime;
2870 if AnsiPos('id', AnsiLowerCase(AID)) > 0 then begin
2871 AID := Copy(AID, AnsiPos('id', AnsiLowerCase(AID)) - 1, 11);
2872 if AnsiPos(' be:', AnsiLowerCase(AID)) > 0 then begin
2873 AID := Copy(AID, 1, AnsiPos(' BE:', AnsiLowerCase(AID)) - 1)
2876 stlist := TStringList.Create;
2878 stList.DelimitedText := AID;
2880 for i := 0 to stList.Count - 1 do
2881 if Length(WideString(stList[i])) = 8 then begin
2882 if NotDateorTimeString(stList[i]) then begin
2891 if not IsNoValidID(AID) then
2892 GetSameIDRes(AID, ThreadItem, body);
2897 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2898 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2899 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2900 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2902 function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer;
2907 if (not IsNoValidID(AID))
2908 and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2909 body := TStringList.Create;
2911 GetSameIDRes(AID, ThreadItem, body);
2912 Result := body.Count;
2921 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2922 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2923 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2924 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2926 function TGikoSys.GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer;
2931 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2932 body := TStringList.Create;
2934 GetSameIDRes(AIDNum, ThreadItem, body);
2935 Result := body.Count;
2943 \brief
\8e\9e\8d\8f\82ð
\8e¦
\82·
\95¶
\8e\9a\97ñ
\82Å
\82Í
\96³
\82¢
\82©
\82Ç
\82¤
\82©
2944 \param AStr
\92²
\82×
\82é
\95¶
\8e\9a\97ñ
2945 \return
\8e\9e\8d\8f\82Å
\82Í
\96³
\82¢
\82È
\82ç True
2946 \todo
\94Û
\92è
\8c`(Not)
\82æ
\82è
\8dm
\92è
\8cn(Is)
2948 function TGikoSys.NotDateorTimeString(const AStr : string): boolean;
2965 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
2966 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
2967 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
2969 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
2972 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
2973 Bayesian.CountWord( text, wordCount );
2978 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
2979 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
2980 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
2981 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
2982 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
2983 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
2984 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
2986 \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
2987 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
2989 \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
2991 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
2994 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
2995 Bayesian.Forget( wordCount, isSpam );
3000 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3001 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3002 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3004 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3007 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3008 Bayesian.Learn( wordCount, isSpam );
3013 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3014 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3015 \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)
3016 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3018 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3021 case Setting.SpamFilterAlgorithm of
3022 gsfaNone: Result := 0;
3023 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3024 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3025 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3032 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3033 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3035 [
\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Ì
3036 [
\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
3038 function TGikoSys.SetUserOptionalStyle(): string;
3041 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3042 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3043 if GikoSys.Setting.BrowserFontSize <> 0 then
3044 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3045 if GikoSys.Setting.BrowserFontColor <> -1 then
3046 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3047 if GikoSys.Setting.BrowserBackColor <> -1 then
3048 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3049 case GikoSys.Setting.BrowserFontBold of
3050 -1: Result := Result + 'font-weight:normal;';
3051 1: Result := Result + 'font-weight:bold;';
3053 case GikoSys.Setting.BrowserFontItalic of
3054 -1: Result := Result + 'font-style:normal;';
3055 1: Result := Result + 'font-style:italic;';
3060 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3061 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3062 \param ANum
\83\8c\83X
\94Ô
3063 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3064 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3066 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3069 BNum, BMark : string;
3071 p := AnsiPos('BE:', AnsiUpperCase(AID));
3073 BNum := Copy(AID, p, Length(AID));
3074 AID := Copy(AID, 1, p - 1);
3075 p := AnsiPos('-', BNum);
3077 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3078 BNum := Copy(BNum, 1, p - 1);
3081 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3082 + '" target=_blank>' + BMark + '</a>';
3088 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3089 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3090 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3092 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3094 Translation = '\VarFileInfo\Translation';
3095 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3097 BufSize, HWnd: DWORD;
3098 VerInfoBuf: Pointer;
3100 VerDataLen: Longword;
3103 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3104 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3105 if BufSize <> 0 then begin
3106 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3107 GetMem(VerInfoBuf, BufSize);
3109 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3110 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3111 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3113 if not (VerDataLen > 0) then
3114 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3116 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3117 //
\81¨'\StringFileInfo\027382\FileDescription'
3118 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3119 [IntToHex(Integer(VerData^) and $FFFF, 4),
3120 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3121 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3123 if VerDataLen > 0 then begin
3124 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3126 SetLength(result, VerDataLen);
3127 StrLCopy(PChar(result), VerData, VerDataLen);
3131 FreeMem(VerInfoBuf);
3137 \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
3138 \return 1
\8ds1plugin
3140 function TGikoSys.GetPluginsInfo(): String;
3143 major, minor, revision : Cardinal;
3144 agent, release : String;
3146 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3149 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3150 for i := 0 to Length(BoardGroups) - 1 do begin
3151 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3152 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3153 if BoardGroups[i].BoardPlugIn <> nil then begin
3154 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3157 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3159 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3165 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3166 function TGikoSys.GetIEVersion: string;
3170 R := TRegistry.Create;
3172 //
\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¢
3173 R.Access := KEY_EXECUTE;
3174 R.RootKey := HKEY_LOCAL_MACHINE;
3175 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3177 Result := R.ReadString('version');
3179 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3186 //! 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¼
3187 function TGikoSys.GetMainKeyFileName : String;
3189 Result := Setting.GetMainKeyFileName;
3191 //! 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¼
3192 function TGikoSys.GetEditorKeyFileName: String;
3194 Result := Setting.GetEditorKeyFileName;
3196 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3197 function TGikoSys.GetInputAssistFileName: String;
3199 Result := Setting.GetInputAssistFileName;
3201 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3202 procedure TGikoSys.SetGikoMessage;
3204 if FGikoMessage = nil then begin
3205 FGikoMessage := TGikoMessage.Create;
3210 if (Setting.GengoSupport) then begin
3212 if (FileExists(Setting.GetLanguageFileName)) then begin
3213 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3220 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3221 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3224 if FGikoMessage <> nil then begin
3225 Result := FGikoMessage.GetMessage(MesType);
3229 //Tue, 17 Dec 2002 12:18:07 GMT
\81¨ TDateTime
\82Ö
3230 //MonaUtils
\82©
\82ç
\88Ú
\93®
3231 function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime;
3232 function StrMonthToMonth(const s: string): integer;
3234 m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
3239 for i := Low(m) to High(m) do begin
3240 if (SameText(s, m[i])) then begin
3247 wDay, wMonth, wYear: word;
3248 wHour, wMinute, wSecond: word;
3252 wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0);
3253 wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2));
3254 wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0);
3255 sTime := ChooseString(DateStr, ' ', 4);
3256 wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0);
3257 wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0);
3258 wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0);
3259 d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0);
3262 //MonaUtils
\82©
\82ç
\88Ú
\93®
3263 //!
\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·
3264 function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string;
3270 for i := 0 to Index - 1 do begin
3271 if (AnsiPos(Separator, S) = 0) then S := ''
3272 else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S));
3274 p := AnsiPos(Separator, S);
3275 if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S;
3277 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
3278 procedure TGikoSys.RestoreThreadData(Board : TBoard);
3280 SECTION = 'Setting';
3282 TmpFileList : TStringList;
3285 ThreadItem : TThreadItem;
3286 Boardpath, tmpStr : string;
3288 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
3290 TmpFileList := TStringList.Create;
3291 TmpFileList.Sorted := True;
3292 TmpFileList.BeginUpdate;
3294 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
3295 GetFileList(Boardpath, '*.tmp', TmpFileList, False);
3296 TmpFileList.EndUpdate;
3297 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
3298 for i := TmpFileList.Count - 1 downto 0 do begin
3299 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
3300 if ThreadItem <> nil then begin
3301 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
3303 tmpStr := ini.ReadString(SECTION, 'RoundDate', DateTimeToStr(ZERO_DATE));
3304 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
3306 tmpStr := ini.ReadString(SECTION, 'LastModified', DateTimeToStr(ZERO_DATE));
3307 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
3308 ThreadItem.Count := ini.ReadInteger(SECTION, 'Count', 0);
3309 ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
3311 ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
3312 if(ThreadItem.Size = 0) and (FileExists(ThreadItem.GetThreadFileName)) then begin
3314 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
3319 //
\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ã
3320 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
3321 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
3322 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
3323 ThreadItem.ScrollTop := ini.ReadInteger(SECTION, 'ScrollTop', 0);
3324 ThreadItem.AllResCount := ini.ReadInteger(SECTION, 'AllResCount', ThreadItem.Count);
3325 ThreadItem.NewResCount := ini.ReadInteger(SECTION, 'NewResCount', 0);
3326 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger(SECTION, 'AgeSage', Ord(gasNone)));
3330 DeleteFile(Boardpath + TmpFileList[i]);
3339 \brief User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
3340 \return Boolean
\97\98\97p
\82Å
\82«
\82é
\8fê
\8d\87\82ÍTrue
3342 function TGikoSys.CanUser32DLL: Boolean;
3350 hUser32 := LoadLibrary('User32.dll');
3351 if hUser32 <> 0 then begin
3358 FreeLibrary(hUser32);
3362 \brief OE
\88ø
\97p
\95\84\8eæ
\93¾
3363 \return OE
\82Ì
\88ø
\97p
\95\84\81i
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87\82Í'>')
3365 function TGikoSys.GetOEIndentChar : string;
3368 Identities : string;
3371 DEFAULT_CHAR = '> ';
3372 OE_MAIL_PATH = '\Software\Microsoft\Outlook Express\5.0\Mail';
3373 INDENT_CHAR = 'Indent Char';
3376 Result := DEFAULT_CHAR;
3377 regKey := TRegistry.Create;
3380 regKey.RootKey := HKEY_CURRENT_USER;
3381 if not regKey.OpenKey( 'Identities', False ) then
3383 Identities := regKey.ReadString( 'Default User ID' );
3384 if Identities = '' then
3386 if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then
3388 IndentChar := regKey.ReadInteger( INDENT_CHAR );
3389 Result := Char( IndentChar ) + ' ';
3397 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3398 function TGikoSys.GetReplaceFileName: String;
3400 Result := Setting.GetReplaceFileName;
3404 GikoSys := TGikoSys.Create;
3407 if GikoSys <> nil then begin