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);
122 FSelectResFilter : TAbon;
123 //FBoardURLList: TStringList;
126 destructor Destroy; override;
127 property ResRange : Longint read FResRange write FResRange;
128 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
129 property Version : String read FVersion;
130 function IsNumeric(s: string): boolean;
131 function IsFloat(s: string): boolean;
132 function DirectoryExistsEx(const Name: string): Boolean;
133 function ForceDirectoriesEx(Dir: string): Boolean;
135 function GetBoardFileName: string;
136 function GetCustomBoardFileName: string;
137 function GetHtmlTempFileName: string;
138 function GetAppDir: string;
139 function GetTempFolder: string;
140 function GetSentFileName: string;
141 function GetConfigDir: string;
142 function GetSkinDir: string;
143 function GetSkinHeaderFileName: string;
144 function GetSkinFooterFileName: string;
145 function GetSkinResFileName: string;
146 function GetSkinNewResFileName: string;
147 function GetSkinBookmarkFileName: string;
148 function GetSkinNewmarkFileName: string;
149 function GetStyleSheetDir: string;
150 function GetOutBoxFileName: string;
151 function GetUserAgent: string;
152 function GetSambaFileName : string;
154 function GetMainKeyFileName : String;
155 function GetEditorKeyFileName: String;
156 function GetInputAssistFileName: String;
157 procedure ReadSubjectFile(Board: TBoard);
158 procedure CreateThreadDat(Board: TBoard);
159 procedure WriteThreadDat(Board: TBoard);
160 function ParseIndexLine(Line: string): TIndexRec;
161 procedure GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean); overload;
162 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¢
163 procedure GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
165 function DivideSubject(Line: string): TSubjectRec;
166 property Setting: TSetting read FSetting write FSetting;
167 property Dolib: TDolib read FDolib write FDolib;
169 function UrlToID(url: string): string;
170 function UrlToServer(url: string): string;
172 function StrTokFirst(const s:string; const sep:TStrTokSeparator; var Rec:TStrTokRec):string;
173 function StrTokNext(const sep:TStrTokSeparator; var Rec:TStrTokRec): string;
175 function GetFileSize(FileName : string) : longint;
176 function GetFileLineCount(FileName : string): longint;
177 function IntToDateTime(val: Int64): TDateTime;
178 function DateTimeToInt(ADate: TDateTime): Int64;
180 function ReadThreadFile(FileName: string; Line: Integer): string;
182 procedure MenuFont(Font: TFont);
184 function RemoveToken(var s:string; const delimiter:string):string;
185 function GetTokenIndex(s: string; delimiter: string; index: Integer): string;
187 function GetShortName(const LongName: string; ALength: integer): string;
188 function BoolToInt(b: Boolean): Integer;
189 function IntToBool(i: Integer): Boolean;
190 function GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
191 procedure LoadKeySetting(ActionList: TActionList; FileName: String);
192 procedure SaveKeySetting(ActionList: TActionList; FileName: String);
193 procedure CreateProcess(const AppPath: string; const Param: string);
194 procedure OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
195 function HTMLDecode(const AStr: String): String;
196 function GetHRefText(s: string): string;
197 function Is2chHost(Host: string): Boolean;
198 function Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
199 function Parse2chURL2(URL: string): TPathRec;
200 procedure ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
201 function GetVersionBuild: Integer;
202 function GetBrowsableThreadURL( inURL : string ) : string;
203 function GetThreadURL2BoardURL( inURL : string ) : string;
204 function Get2chThreadURL2BoardURL( inURL : string ) : string;
205 function Get2chBrowsableThreadURL( inURL : string ) : string;
206 function Get2chBoard2ThreadURL( inBoard : TBoard; inKey : string ) : string;
207 procedure ListBoardFile;
208 procedure ReadBoardFile( bbs : TBBS );
210 function GetUnknownCategory : TCategory;
211 function GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
213 procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
215 property Bayesian : TGikoBayesian read FBayesian write FBayesian;
216 function CreateSameIDResAnchor(var Numbers: TStringList; ThreadItem: TThreadItem; limited: Integer):string;
217 procedure GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList); overload;
218 procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
219 function GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
221 procedure SpamCountWord( const text : string; wordCount : TWordCount );
222 //!
\8aw
\8fK
\83N
\83\8a\83A
223 procedure SpamForget( wordCount : TWordCount; isSpam : Boolean );
224 //!
\83X
\83p
\83\80\8aw
\8fK
225 procedure SpamLearn( wordCount : TWordCount; isSpam : Boolean );
226 //!
\83X
\83p
\83\80\93x
\90\94
227 function SpamParse( const text : string; wordCount : TWordCount ) : Extended;
228 //
\88ø
\90\94\82ª
\81A
\93ú
\95t
\82Å
\82à
\8e\9e\8d\8f\82Å
\82à
\82È
\82¢
\82±
\82Æ
\82ð
\92²
\82×
\82é
229 function NotDateorTimeString(const AStr : string): boolean;
231 //!
\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Á
232 function AddBeProfileLink(AID : string; ANum: Integer): string;
233 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
234 function GetVersionInfo(KeyWord: TVerResourceKey): string;
235 //! Plugin
\82Ì
\8fî
\95ñ
\82Ì
\8eæ
\93¾
236 function GetPluginsInfo(): string;
237 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
238 function GetIEVersion: string;
239 function SetUserOptionalStyle(): string;
240 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
241 procedure SetGikoMessage;
242 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
243 function GetGikoMessage(MesType: TGikoMessageListType): String;
244 //! GMT
\82Ì
\8e\9e\8d\8f\82ðTDateTime
\82É
\95Ï
\8a·
\82·
\82é
245 function DateStrToDateTime(const DateStr: string): TDateTime;
246 //! User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
247 function CanUser32DLL: Boolean;
248 //! OE
\88ø
\97p
\95\84\8eæ
\93¾
249 function GetOEIndentChar : string;
250 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
251 function GetReplaceFileName: String;
252 //!
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
253 procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: boolean = True);
254 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
255 function GetCreateDateFromName(FileName: String): TDateTime;
256 function GetExtpreviewFileName: String;
258 procedure ShowRefCount(msg: String; unk: IUnknown);
264 //LENGTH_RESTITLE = 40;
265 ZERO_DATE: Integer = 25569;
266 BETA_VERSION_NAME_E = 'beta';
267 BETA_VERSION_NAME_J = 'ÊÞÀ';
269 BETA_VERSION_BUILD = ''; //!< debug
\94Å
\82È
\82Ç
270 APP_NAME = 'gikoNavi';
271 BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
277 Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils, Sort, YofUtils,
278 IniFiles, DateUtils, SkinFiles;
281 FOLDER_INDEX_VERSION = '1.01';
282 USER_AGENT = 'Monazilla';
283 DEFAULT_NGWORD_FILE_NAME : String = 'NGword.txt';
284 NGWORDs_DIR_NAME : String = 'NGwords';
286 READ_PATH: string = '/test/read.cgi/';
287 HTML_READ_PATH: string = '/test/read.html/';
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;
311 FSetting := TSetting.Create;
312 FDolib := TDolib.Create;
313 FAWKStr := TAWKStr.Create(nil);
314 if DirectoryExists(GetConfigDir) = false then begin
315 CreateDir(GetConfigDir);
317 FAbon := TAbon.Create;
318 FAbon.IgnoreKana := FSetting.IgnoreKana;
319 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
321 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
322 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
323 FAbon.DeleteSyria := FSetting.DeleteSyria;
324 FAbon.Deleterlo := FSetting.AbonDeleterlo;
325 FAbon.Replaceul := FSetting.AbonReplaceul;
326 FAbon.AbonPopupRes := FSetting.PopUpAbon;
328 FSelectResFilter := TAbon.Create;
329 FSelectResFilter.IgnoreKana := True;
330 //
\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
331 FSelectResFilter.AbonString := '';
333 ResRange := FSetting.ResRange;
334 FVersion := Trim(GetVersionInfo(vrFileVersion));
335 FBayesian := TGikoBayesian.Create;
336 //FBoardURLList := TStringList.Create;
337 //
\83\81\83b
\83Z
\81[
\83W
\82Ì
\8dì
\90¬
338 FGikoMessage := TGikoMessage.Create;
341 // *************************************************************************
342 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
343 // *************************************************************************
344 destructor TGikoSys.Destroy;
347 FileList: TStringList;
349 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
350 FileList := TStringList.Create;
352 FileList.BeginUpdate;
353 GetFileList(GetTempFolder, '*.html', FileList, False, True);
355 for i := 0 to FileList.Count - 1 do begin
356 DeleteFile(FileList[i]);
361 FreeAndNil(FGikoMessage);
362 FreeAndNil(FBayesian);
363 FreeAndNil(FSelectResFilter);
367 FreeAndNil(FSetting);
372 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
373 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
374 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
377 function TGikoSys.IsNumeric(s: string): boolean;
388 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
389 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
390 \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
392 function TGikoSys.IsFloat(s: string): boolean;
396 Result := TextToFloat(PChar(s), v, fvExtended);
399 // *************************************************************************
400 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
401 // *************************************************************************
402 function TGikoSys.GetBoardFileName: string;
404 Result := Setting.GetBoardFileName;
407 // *************************************************************************
408 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
409 // *************************************************************************
410 function TGikoSys.GetCustomBoardFileName: string;
412 Result := Setting.GetCustomBoardFileName;
415 // *************************************************************************
416 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
417 // *************************************************************************
418 function TGikoSys.GetHtmlTempFileName: string;
420 Result := Setting.GetHtmlTempFileName;
424 // *************************************************************************
425 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
426 // *************************************************************************
427 function TGikoSys.GetAppDir: string;
429 Result := Setting.GetAppDir;
432 // *************************************************************************
433 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
434 // *************************************************************************
435 function TGikoSys.GetTempFolder: string;
437 Result := Setting.GetTempFolder;
440 // *************************************************************************
441 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
442 // *************************************************************************)
443 function TGikoSys.GetSentFileName: string;
445 Result := Setting.GetSentFileName;
448 // *************************************************************************
449 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
450 // *************************************************************************
451 function TGikoSys.GetOutBoxFileName: string;
453 Result := Setting.GetOutBoxFileName;
456 // *************************************************************************
457 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
458 // *************************************************************************
459 function TGikoSys.GetConfigDir: string;
461 Result := Setting.GetConfigDir;
464 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
465 function TGikoSys.GetStyleSheetDir: string;
467 Result := Setting.GetStyleSheetDir;
470 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
471 function TGikoSys.GetSkinDir: string;
473 Result := Setting.GetSkinDir;
476 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
477 function TGikoSys.GetSkinHeaderFileName: string;
479 Result := Setting.SkinFiles.GetSkinHeaderFileName;
482 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
483 function TGikoSys.GetSkinFooterFileName: string;
485 Result := Setting.SkinFiles.GetSkinFooterFileName;
488 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
489 function TGikoSys.GetSkinNewResFileName: string;
491 Result := Setting.SkinFiles.GetSkinNewResFileName;
494 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
495 function TGikoSys.GetSkinResFileName: string;
497 Result := Setting.SkinFiles.GetSkinResFileName;
500 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
501 function TGikoSys.GetSkinBookmarkFileName: string;
503 Result := Setting.SkinFiles.GetSkinBookmarkFileName;
506 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
507 function TGikoSys.GetSkinNewmarkFileName: string;
509 Result := Setting.SkinFiles.GetSkinNewmarkFileName;
512 //! UserAgent
\8eæ
\93¾
513 function TGikoSys.GetUserAgent: string;
515 if Dolib.Connected then begin
516 Result := Format('%s %s/%s%d/%s', [
523 Result := Format('%s/%s %s/%s%d/%s', [
534 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
535 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
536 \return val
\82ð
\8e¦
\82· TDateTime
538 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
540 Result := ZERO_DATE + val / 86400.0;
544 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
545 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
546 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
548 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
550 Result := Trunc((ADate - ZERO_DATE) * 86400);
555 \brief Subject
\83t
\83@
\83C
\83\8bRead
556 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
558 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
560 ThreadItem: TThreadItem;
562 FileList: TStringList;
571 datFileCheck: Boolean;
573 FavoThreadItem : TFavoriteThreadItem;
583 if Board.IsThreadDatRead then
587 usePlugIn := Board.IsBoardPlugInAvailable;
588 //server := UrlToServer( Board.URL );
589 //
\83X
\83\8c\83b
\83h
\82Å
\8b¤
\92Ê
\82ÌURL
\95\94
590 if Board.is2ch then begin
591 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi/' + Board.BBSID + '/';
593 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi?bbs=' + Board.BBSID + '&key=';
596 FileName := Board.GetFolderIndexFileName;
599 datFileCheck := (Setting.CheckDatFile) or (not FileExists(FileName));
600 if (datFileCheck) then begin
601 FileList := TStringList.Create;
602 FileList.Sorted := True;
603 FileList.BeginUpdate;
604 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
605 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
609 //
\8fd
\95¡
\82ð
\96h
\82®
611 Board.Sorted := True;
612 sl := TStringList.Create;
614 if FileExists(FileName) then begin
615 sl.LoadFromFile(FileName);
616 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
617 for i := sl.Count - 1 downto 1 do begin
618 Rec := ParseIndexLine(sl[i]);
619 if (datFileCheck) then begin
620 islog := FileList.Find( Rec.FFileName, Index );
622 islog := (Rec.FSize <> 0) and (Rec.FCount <> 0);
625 ThreadItem := TThreadItem.Create(
628 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
630 if Board.is2ch then begin
631 ThreadItem := TThreadItem.Create(
634 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
639 ThreadItem := TThreadItem.Create(
642 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
649 ThreadItem.BeginUpdate;
650 if (datFileCheck) and (islog) then
651 FileList.Delete( Index );
653 ThreadItem.No := Rec.FNo;
654 ThreadItem.FileName := Rec.FFileName;
655 ThreadItem.Title := MojuUtils.UnSanitize(Rec.FTitle);
656 ThreadItem.Count := Rec.FCount;
657 ThreadItem.Size := Rec.FSize;
658 ThreadItem.RoundDate := Rec.FRoundDate;
659 ThreadItem.LastModified := Rec.FLastModified;
660 ThreadItem.Kokomade := Rec.FKokomade;
661 ThreadItem.NewReceive := Rec.FNewReceive;
662 ThreadItem.UnRead := Rec.FUnRead;
663 ThreadItem.ScrollTop := Rec.FScrollTop;
664 ThreadItem.AllResCount := Rec.FAllResCount;
665 ThreadItem.NewResCount := Rec.FNewResCount;
666 ThreadItem.AgeSage := Rec.FAgeSage;
667 ThreadItem.ParentBoard := Board;
668 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
670 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
671 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
674 ThreadItem.EndUpdate;
675 Board.Add(ThreadItem);
677 if (ThreadItem.UnRead) and (ThreadItem.IsLogFile) then
682 if UnRead <> Board.UnRead then
683 Board.UnRead := UnRead;
685 if (datFileCheck) then begin
686 //
\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
687 AddOutofIndexDat(Board, FileList);
691 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
692 RestoreThreadData( Board );
695 if (datFileCheck) then begin
698 Board.Sorted := False;
700 Board.IsThreadDatRead := True;
702 rt := GetTickCount - st;
703 Writeln('Read Done.' + IntToStr(rt) + ' ms');
707 \brief
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
708 \param Board
\92Ç
\89Á
\82·
\82é
\94Â
709 \param DatList dat
\83t
\83@
\83C
\83\8b\96¼
711 procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: Boolean = True);
714 Boardpath,FileName : String;
716 ThreadItem: TThreadItem;
720 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
721 //
\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
722 for i := 0 to DatList.Count - 1 do begin
723 FileName := Boardpath + DatList[i];
725 if (not AllCreate) then begin
727 ThreadItem := Board.FindThreadFromFileName(DatList[i]);
728 if (ThreadItem = nil) then begin
731 if Board.IsBoardPlugInAvailable then begin
732 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
734 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
738 if (ThreadItem = nil) then begin
739 if Board.IsBoardPlugInAvailable then begin
740 ThreadItem := TThreadItem.Create(
743 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
744 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
746 ThreadItem := TThreadItem.Create(
749 Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
750 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
755 ThreadItem.BeginUpdate;
756 ThreadItem.FileName := DatList[i];
757 //ThreadItem.FilePath := FileName;
758 ThreadItem.No := Board.Count + 1;
759 ThreadItem.Title := ResRec.FTitle;
760 ThreadItem.Count := GetFileLineCount(FileName);
761 ThreadItem.AllResCount := ThreadItem.Count;
762 ThreadItem.NewResCount := ThreadItem.Count;
763 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é
764 ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) );
765 ThreadItem.LastModified := ThreadItem.RoundDate;
766 ThreadItem.Kokomade := -1;
767 ThreadItem.NewReceive := 0;
768 ThreadItem.ParentBoard := Board;
769 ThreadItem.IsLogFile := True;
770 ThreadItem.Round := False;
771 ThreadItem.UnRead := False;
772 ThreadItem.ScrollTop := 0;
773 ThreadItem.AgeSage := gasNone;
774 ThreadItem.EndUpdate;
775 if (AllCreate) or (create) then begin
776 Board.Add(ThreadItem);
781 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
782 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
784 procedure TGikoSys.CreateThreadDat(Board: TBoard);
788 SubjectList: TStringList;
794 if not FileExists(Board.GetSubjectFileName) then Exit;
795 FileName := Board.GetFolderIndexFileName;
797 SubjectList := TStringList.Create;
799 SubjectList.LoadFromFile(Board.GetSubjectFileName);
800 sl := TStringList.Create;
804 sl.Add(FOLDER_INDEX_VERSION);
805 for i := 0 to SubjectList.Count - 1 do begin
806 Rec := DivideSubject(SubjectList[i]);
808 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
811 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
812 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
813 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
814 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
815 + Format('%x', [0]) + #1 //size
816 + Format('%x', [0]) + #1 //RoundDate
817 + Format('%x', [0]) + #1 //LastModified
818 + Format('%x', [0]) + #1 //Kokomade
819 + Format('%x', [0]) + #1 //NewReceive
820 + '0' + #1 //
\96¢
\8eg
\97p
821 + Format('%x', [0]) + #1 //UnRead
822 + Format('%x', [0]) + #1 //ScrollTop
823 + Format('%x', [Rec.FCount]) + #1 //AllResCount
824 + Format('%x', [0]) + #1 //NewResCount
825 + Format('%x', [0]); //AgeSage
827 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
828 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
830 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
831 MojuUtils.Sanitize(Rec.FTitle), //
\83^
\83C
\83g
\83\8b
832 Rec.FCount, //
\83J
\83E
\83\93\83g
841 Rec.FCount, //AllResCount
850 sl.SaveToFile(FileName);
860 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
861 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
863 procedure TGikoSys.WriteThreadDat(Board: TBoard);
865 // Values: array[Boolean] of string = ('0', '1');
871 TmpFileList: TStringList;
873 if not Board.IsThreadDatRead then
875 FileName := Board.GetFolderIndexFileName;
876 ForceDirectoriesEx( ExtractFilePath( FileName ) );
878 sl := TStringList.Create;
879 TmpFileList := TStringList.Create;
880 TmpFileList.Sorted := true;
882 TmpFileList.BeginUpdate;
883 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
884 TmpFileList.EndUpdate;
886 sl.Add(FOLDER_INDEX_VERSION);
888 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
889 Sort.SetSortNoFlag(true);
890 Sort.SetSortOrder(true);
891 Sort.SetSortIndex(0);
892 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
893 Board.CustomSort(ThreadItemSortProc);
895 for i := 0 to Board.Count - 1 do begin
896 Board.Items[i].No := i + 1;
897 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
898 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
899 [Board.Items[i].No, //
\94Ô
\8d\86
900 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
901 MojuUtils.Sanitize(Board.Items[i].Title), //
\83^
\83C
\83g
\83\8b
902 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
903 Board.Items[i].Size, //size
904 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
905 DateTimeToInt(Board.Items[i].LastModified), //LastModified
906 Board.Items[i].Kokomade, //Kokomade
907 Board.Items[i].NewReceive, //NewReceive
909 BoolToInt(Board.Items[i].UnRead), //UnRead
910 Board.Items[i].ScrollTop, //ScrollTop
911 Board.Items[i].AllResCount, //AllResCount
912 Board.Items[i].NewResCount, //NewResCount
913 Ord(Board.Items[i].AgeSage)] //AgeSage
919 sl.SaveToFile(FileName);
921 for i := 0 to TmpFileList.Count - 1 do begin
922 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
932 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
933 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
934 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
936 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
938 Result.FNo := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
939 Result.FFileName := MojuUtils.RemoveToken(Line, #1);
940 Result.FTitle := MojuUtils.UnSanitize(MojuUtils.RemoveToken(Line, #1));
941 Result.FCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
942 Result.FSize := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
943 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
944 Result.FLastModified := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
945 Result.FKokomade := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), -1);
946 Result.FNewReceive := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
947 RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
948 Result.FUnRead := IntToBool(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
949 Result.FScrollTop := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
950 Result.FAllResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
951 Result.FNewResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
952 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
957 \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é
958 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
959 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
960 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
961 \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
962 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
964 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
965 \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
969 GetFileList('c:\', '*.txt', list, True, True);
972 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
975 SearchRec : TSearchRec;
978 Path := IncludeTrailingPathDelimiter(Path);
979 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
981 while rc = 0 do begin
982 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
983 s := Path + SearchRec.Name;
985 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
989 List.Add(SearchRec.Name);
990 if SubDir and (SearchRec.Attr and faDirectory > 0) then
991 GetFileList(s, Mask, List, True, IsPathAdd);
993 rc := FindNext(SearchRec);
996 SysUtils.FindClose(SearchRec);
1002 \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
1003 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
1004 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1005 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
1006 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1007 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
1008 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
1011 GetFileList('c:\', '*.txt', list, True);
1014 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
1017 SearchRec : TSearchRec;
1019 Path := IncludeTrailingPathDelimiter(Path);
1020 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
1022 while rc = 0 do begin
1023 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1024 if (SearchRec.Attr and faDirectory = 0) then begin
1025 if IsPathAdd then begin
1026 List.Add(Path + SearchRec.Name)
1028 List.Add(SearchRec.Name);
1032 rc := FindNext(SearchRec);
1035 SysUtils.FindClose(SearchRec);
1041 \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é
1042 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1043 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1044 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1045 \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
1047 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1048 \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
1052 GetDirectoryList('c:\', '*.txt', list, True);
1055 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1058 SearchRec : TSearchRec;
1061 Path := IncludeTrailingPathDelimiter(Path);
1062 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1064 while rc = 0 do begin
1065 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1066 s := Path + SearchRec.Name;
1067 //if (SearchRec.Attr and faDirectory > 0) then
1068 // s := IncludeTrailingPathDelimiter(s)
1070 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1071 List.Add( IncludeTrailingPathDelimiter( s ) );
1072 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1073 GetDirectoryList(s, Mask, List, True);
1075 rc := FindNext(SearchRec);
1078 SysUtils.FindClose(SearchRec);
1084 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1085 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1086 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1088 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1098 if AnsiPos('<>', Line) = 0 then
1102 Result.FFileName := RemoveToken(Line, Delim);
1103 Result.FTitle := Trim(RemoveToken(Line, Delim));
1105 ws := Result.FTitle;
1106 if Copy(ws, Length(ws), 1) = ')' then begin
1109 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1112 end else if Copy(ws, Length(ws), 1) = '>' then begin
1116 for i := Length(ws) - 1 downto 1 do begin
1117 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1118 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1119 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1120 if IsNumeric(ws) then
1121 Result.FCount := StrToInt(ws);
1122 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1129 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1130 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1133 function TGikoSys.UrlToID(url: string): string;
1140 if url = '' then Exit;
1142 url := Copy(url, 0, Length(url) - 1);
1143 for i := Length(url) downto 0 do begin
1144 if url[i] = '/' then begin
1145 Result := Copy(url, i + 1, Length(url));
1155 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1156 \param url
\89ð
\8eß
\82·
\82é URL
1157 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1159 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1161 function TGikoSys.UrlToServer(url: string): string;
1168 wsURL := Trim(wsURL);
1170 if wsURL = '' then exit;
1172 if Copy(wsURL, Length(wsURL), 1) = '/' then
1173 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1175 for i := Length(wsURL) downto 0 do begin
1176 if wsURL[i] = '/' then begin
1177 Result := Copy(wsURL, 0, i);
1184 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1185 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1186 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1188 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1192 Code := GetFileAttributes(PChar(Name));
1193 Result := (Code <> Cardinal(-1)) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1197 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1198 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1199 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1201 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1204 if Length(Dir) = 0 then
1205 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1206 Dir := ExcludeTrailingPathDelimiter(Dir);
1207 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1208 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1209 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1213 \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
1214 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1215 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1216 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1217 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1218 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1219 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1221 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1225 Result := StrTokNext(sep, Rec);
1229 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1230 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1231 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1232 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1233 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1234 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1236 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1243 if Len >= Pos then begin
1244 while (Pos <= Len) and (Str[Pos] in sep) do begin
1248 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1249 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1254 Result := Copy(Str, I, Pos - I);
1255 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1263 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1264 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1265 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1267 function TGikoSys.GetFileSize(FileName : string): longint;
1272 if not FileExists(FileName) then begin
1276 Assign(F, FileName);
1278 Result := FileSize(F);
1286 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1287 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1289 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1291 function TGikoSys.GetFileLineCount(FileName : string): longint;
1295 sl := TStringList.Create;
1298 sl.LoadFromFile(FileName);
1310 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1311 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1312 \param Line
\8ew
\92è
\8ds
1313 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1314 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1316 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1318 fileTmp : TStringList;
1321 if FileExists(FileName) then begin
1322 fileTmp := TStringList.Create;
1325 fileTmp.LoadFromFile( FileName );
1326 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1327 Result := fileTmp.Strings[ Line-1 ];
1330 //on EFOpenError do Result := '';
1339 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1340 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1342 procedure TGikoSys.MenuFont(Font: TFont);
1345 nm: NONCLIENTMETRICS;
1347 nm.cbSize := sizeof(NONCLIENTMETRICS);
1348 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1349 lf := nm.lfMenuFont;
1350 Font.Name := lf.lfFaceName;
1351 Font.Height := lf.lfHeight;
1353 if lf.lfWeight >= 700 then
1354 Font.Style := Font.Style + [fsBold];
1355 if lf.lfItalic = 1 then
1356 Font.Style := Font.Style + [fsItalic];
1360 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1361 \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ñ
1362 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1363 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1365 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1367 function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1371 p := AnsiPos(delimiter, s);
1375 Result := Copy(s, 1, p - 1);
1376 Delete(s, 1, Length(Result) + Length(delimiter));
1381 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1382 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1383 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1384 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1386 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1388 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1393 for i := 0 to index do
1394 Result := RemoveToken(s, delimiter);
1398 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1399 {procedure TGikoSys.FlashExitWrite;
1403 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1404 for i := 0 to FExitWrite.Count - 1 do
1405 WriteThreadDat(FExitWrite[i]);
1410 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1411 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1412 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1413 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1417 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1419 ERASECHAR : array [1..39] of string =
1420 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1421 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1422 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1423 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1425 Chr : array [0..255] of char;
1429 s := Trim(LongName);
1430 if (Length(s) <= ALength) then begin
1434 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1435 S := CustomStringReplace(S, ERASECHAR[i], '');
1437 if (Length(S) <= ALength) then begin
1440 Windows.LCMapString(
1441 GetUserDefaultLCID(),
1449 S := Copy(S,1,ALength);
1451 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1452 S := Copy(S, 1, Length(S) - 1);
1463 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1464 \return False..0, True..1
1466 function TGikoSys.BoolToInt(b: Boolean): Integer;
1468 Result := IfThen(b, 1, 0);
1472 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1473 \return 1..True, other..False
1474 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1475 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1477 function TGikoSys.IntToBool(i: Integer): Boolean;
1483 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1484 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1485 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1486 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1488 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1492 GZipStream: TGzipDecompressStream;
1493 TextStream: TStringStream;
1494 buf: array[0..BUF_SIZE - 1] of Byte;
1500 TextStream := TStringStream.Create('');
1502 //
\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¢)
1503 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1504 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1505 ResStream.Position := 0;
1506 GZipStream := TGzipDecompressStream.Create(TextStream);
1509 FillChar(buf, BUF_SIZE, 0);
1510 cnt := ResStream.Read(buf, BUF_SIZE);
1512 GZipStream.Write(buf, BUF_SIZE);
1518 ResStream.Position := 0;
1520 FillChar(buf, BUF_SIZE, 0);
1521 cnt := ResStream.Read(buf, BUF_SIZE);
1523 TextStream.Write(buf, BUF_SIZE);
1527 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1528 s := TextStream.DataString;
1531 while (i > 0) and (s[i] = #0) do
1533 Delete(s, i + 1, ln - i);
1536 while i <> 0 do begin
1548 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1549 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1550 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1552 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1554 STD_SEC = 'KeySetting';
1560 SecList: TStringList;
1561 Component: TComponent;
1563 if not FileExists(fileName) then
1565 SecList := TStringList.Create;
1566 ini := TMemIniFile.Create(fileName);
1568 ini.ReadSection(STD_SEC, SecList);
1569 for i := 0 to SecList.Count - 1 do begin
1570 ActionName := SecList[i];
1571 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1572 if ActionKey <> -1 then begin
1573 Component := ActionList.Owner.FindComponent(ActionName);
1574 if TObject(Component) is TAction then begin
1575 TAction(Component).ShortCut := ActionKey;
1586 \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¶
1587 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1588 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1590 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
1592 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1594 STD_SEC = 'KeySetting';
1599 ini := TMemIniFile.Create(GetConfigDir + FileName);
1601 for i := 0 to ActionList.ActionCount - 1 do begin
1602 if ActionList.Actions[i].Tag = -1 then
1604 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1614 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1615 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1616 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1618 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1620 PI: TProcessInformation;
1624 Path := '"' + AppPath + '"';
1626 Path := Path + ' ' + Param;
1628 SI.Cb := SizeOf(Si);
1629 SI.lpReserved := nil;
1630 SI.lpDesktop := nil;
1633 SI.cbReserved2 := 0;
1634 SI.lpReserved2 := nil;
1636 Windows.CreateProcess(nil,
1649 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1650 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1651 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1653 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1657 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1658 gbtUserApp, gbtAuto:
1659 if (Setting.URLApp) and (FileExists(Setting.URLAppFile)) then
1660 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1662 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1667 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1668 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1669 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1671 function TGikoSys.HTMLDecode(const AStr: String): String;
1673 Sp, Rp, Cp, Tp: PChar;
1678 SetLength(Result, Length(AStr));
1680 Rp := PChar(Result);
1683 while Sp^ <> #0 do begin
1689 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1695 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1699 while (Sp^ <> ';') and (Sp^ <> #0) do
1706 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1714 Num := IsNumeric(Copy(Tp, 1, 1));
1715 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1716 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1720 SetString(S, Tp, Sp - Tp);
1725 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1726 //[Cp^ + Sp^, Cp - PChar(AStr)])
1736 // on E:EConvertError do
1737 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1738 // [Cp^ + Sp^, Cp - PChar(AStr)])
1740 SetLength(Result, Rp - PChar(Result));
1744 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1745 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1746 \return
\8eæ
\93¾
\82µ
\82½ URL
1748 function TGikoSys.GetHRefText(s: string): string;
1758 Index := AnsiPos('href', LowerCase(s));
1761 s := Trim(Copy(s, Index + 4, Length(s)));
1762 s := Trim(Copy(s, 2, Length(s)));
1764 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1765 //if Copy(s, 1, 1) = '"' then begin
1766 if s[1] = '"' then begin
1767 s := Trim(Copy(s, 2, Length(s)));
1770 Index := AnsiPos('"', s);
1771 if Index <> 0 then begin
1772 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1773 s := Copy(s, 1, Index - 1);
1775 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1776 Index := AnsiPos(' ', s);
1777 Index2 := AnsiPos('>', s);
1780 if Index > Index2 then
1783 s := Copy(s, 1, Index - 1)
1785 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1792 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1793 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1794 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1796 function TGikoSys.Is2chHost(Host: string): Boolean;
1798 HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
1804 if RightStr( Host, 1 ) = '/' then
1805 Host := Copy( Host, 1, Length( Host ) - 1 );
1806 OutputDebugString(pchar(HOST_NAME[0]));
1807 for i := 0 to Length(HOST_NAME) - 1 do begin
1808 // Len := Length(HOST_NAME[i]);
1809 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1810 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1818 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1819 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1820 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1821 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1822 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1823 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1824 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1826 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1836 Index := AnsiPos(READ_PATH, path);
1837 if Index <> 0 then begin
1838 s := Copy(path, Index + Length(READ_PATH), Length(path));
1840 Index := AnsiPos(HTML_READ_PATH, path);
1841 if Index <> 0 then begin
1842 s := Copy(path, Index + Length(HTML_READ_PATH), Length(path));
1845 if Index <> 0 then begin
1846 if (Length(s) > 0) and (s[1] = '/') then
1848 BBSID := GetTokenIndex(s, '/', 0);
1849 BBSKey := GetTokenIndex(s, '/', 1);
1852 Result := (BBSID <> '') or (BBSKey <> '');
1855 Index := AnsiPos(KAKO_PATH, path);
1856 if Index <> 0 then begin
1857 s := Copy(path, 2, Length(path));
1858 BBSID := GetTokenIndex(s, '/', 0);
1859 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1860 BBSID := GetTokenIndex(s, '/', 1);
1861 BBSKey := ChangeFileExt(Document, '');
1862 Result := (BBSID <> '') or (BBSKey <> '');
1865 Index := AnsiPos('read.cgi?', URL);
1866 if Index <> 0 then begin
1867 SList := TStringList.Create;
1870 // s := HTMLDecode(Document);
1871 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1872 BBSID := SList.Values['bbs'];
1873 BBSKey := SList.Values['key'];
1874 Result := (BBSID <> '') or (BBSKey <> '');
1886 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1887 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1888 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1889 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1891 http://2ch.net/
\92\86\97ª/32-50 \n
1892 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1894 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1901 URL := Trim(LowerCase(URL));
1902 if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
1906 buf := Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 );
1908 stRes := StrToInt64( buf );
1909 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1910 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
1912 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, Length( URL ) - AnsiPos('&to=', URL ) - 4 + 1 );
1915 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1916 buf := Copy( buf, 1, ps );
1920 endRes := StrToInt64(buf)
1927 if (stRes <> 0) and (endRes = 0) then
1928 endRes := stRes + MAX_POPUP_RES
1929 else if (stRes = 0) and (endRes <> 0) then begin
1930 stRes := endRes - MAX_POPUP_RES;
1934 GikoSys.GetBrowsableThreadURL( URL );
1935 end else if( AnsiPos('&res=', URL ) <> 0 ) then begin
1937 buf := Copy( URL, AnsiPos('&res=', URL ) + 5, Length( URL ) - AnsiPos('&res=', URL ) - 5 + 1 );
1940 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1941 buf := Copy( buf, 1, ps );
1944 stRes := StrToInt(buf)
1951 end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
1953 stRes := StrToInt64( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
1954 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1955 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, AnsiPos( '&nofirst=',URL) - AnsiPos('&end=', URL ) - 5);
1957 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, Length( URL ) - AnsiPos('&to=', URL ) - 5 + 1 );
1960 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1961 buf := Copy( buf, 1, ps );
1965 endRes := StrToInt64(buf);
1972 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
1973 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
1974 if Length(buf) > 0 then begin
1975 if AnsiPos('-', buf) = 1 then begin
1980 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1982 convBuf := Copy( buf, 1, ps );
1983 if convBuf <> '' then
1984 endRes := StrToInt64(convBuf)
1990 if endRes <> 0 then begin
1991 stRes := endRes - MAX_POPUP_RES;
1998 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2000 convBuf := Copy( buf, 1, ps );
2001 if convBuf <> '' then begin
2002 stRes := StrToInt64(convBuf);
2006 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2008 convBuf := Copy( buf, 1, ps );
2009 if convBuf <> '' then
2010 endRes := StrToInt64(convBuf)
2032 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2033 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2034 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2036 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2041 // convBuf : String;
2052 URL := Trim(LowerCase(URL));
2057 Result.FFirst := False;
2058 Result.FStBegin := False;
2059 Result.FToEnd := False;
2060 Result.FDone := False;
2061 Result.FNoParam := False;
2065 if URL[length(URL)] = '\' then
2067 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2068 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2069 s := Copy(URL, RStart + RLength - 1, Length(URL));
2071 //
\95W
\8f\80\8f\91\8e®
2072 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2073 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2074 FAWKStr.RegExp := '/test/read.(cgi|html)/.+/[0-9]+/?.*';
2075 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2076 s := Copy(s, 15, Length(s));
2078 SList := TStringList.Create;
2081 FAWKStr.RegExp := '/';
2082 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2083 Result.FBBS := SList[1];
2084 Result.FKey := SList[2];
2085 if SList.Count >= 4 then
2089 Result.FNoParam := true;
2095 FAWKStr.LineSeparator := mcls_CRLF;
2096 FAWKStr.RegExp := '-';
2097 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2098 Result.FFirst := True;
2100 FAWKStr.RegExp := 'l[0-9]+';
2101 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2102 Result.FFirst := True;
2104 for i := 0 to SList.Count - 1 do begin
2105 if Trim(SList[i]) = '' then begin
2107 Result.FStBegin := True;
2108 if i = (SList.Count - 1) then
2109 Result.FToEnd := True;
2110 end else if IsNumeric(SList[i]) then begin
2111 wkInt := StrToInt(SList[i]);
2112 wkMax := Max(wkMax, wkInt);
2116 wkMin := Min(wkMin, wkInt);
2117 end else if Trim(SList[i]) = 'n' then begin
2118 Result.FFirst := True;
2120 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2121 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2122 if Copy(SList[i], 1, 1) = 'n' then
2123 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2125 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2126 Result.FFirst := True;
2127 wkMax := Max(wkMax, wkInt);
2131 wkMin := Min(wkMin, wkInt);
2135 if Result.FStBegin and (not Result.FToEnd) then
2137 else if (not Result.FStBegin) and Result.FToEnd then
2139 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2140 Result.FSt := wkMin;
2141 Result.FTo := wkMax;
2143 //Result.FSt := wkMin;
2144 //Result.FTo := wkMax;
2150 Result.FDone := True;
2154 //
\90Vkako
\8f\91\8e®
2155 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2156 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2157 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2158 SList := TStringList.Create;
2161 FAWKStr.RegExp := '/';
2162 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2163 Result.FBBS := SList[1];
2164 Result.FKey := ChangeFileExt(SList[5], '');
2165 Result.FFirst := True;
2171 Result.FDone := True;
2175 //
\8b\8ckako
\8f\91\8e®
2176 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2177 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2178 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2179 SList := TStringList.Create;
2182 FAWKStr.RegExp := '/';
2183 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2184 Result.FBBS := SList[1];
2185 Result.FKey := ChangeFileExt(SList[4], '');
2186 Result.FFirst := True;
2192 Result.FDone := True;
2196 //log
\8by
\82Ñlog2
\8f\91\8e®
2197 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2198 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2199 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2200 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2201 SList := TStringList.Create;
2204 FAWKStr.RegExp := '/';
2205 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2206 Result.FBBS := SList[2];
2207 Result.FKey := ChangeFileExt(SList[5], '');
2208 Result.FFirst := True;
2214 Result.FDone := True;
2219 //
\8b\8cURL
\8f\91\8e®
2220 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2221 FAWKStr.RegExp := '/test/read\.cgi\?';
2222 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2223 s := Copy(s, 16, Length(s));
2224 SList := TStringList.Create;
2227 FAWKStr.RegExp := '&';
2228 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2229 Result.FFirst := True;
2230 for i := 0 to SList.Count - 1 do begin
2231 if Pos('bbs=', SList[i]) = 1 then begin
2232 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2233 end else if Pos('key=', SList[i]) = 1 then begin
2234 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2235 end else if Pos('st=', SList[i]) = 1 then begin
2236 wk := Copy(SList[i], 4, Length(SList[i]));
2237 if IsNumeric(wk) then
2238 Result.FSt := StrToInt(wk)
2239 else if wk = '' then
2240 Result.FStBegin := True;
2241 end else if Pos('to=', SList[i]) = 1 then begin
2242 wk := Copy(SList[i], 4, Length(SList[i]));
2243 if IsNumeric(wk) then
2244 Result.FTo := StrToInt(wk)
2245 else if wk = '' then
2246 Result.FToEnd := True;
2247 end else if Pos('nofirst=', SList[i]) = 1 then begin
2248 Result.FFirst := False;
2257 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2258 Result.FDone := True;
2266 \brief URI
\82ð
\95ª
\89ð
2267 \param URL
\95ª
\89ð
\82·
\82é URI
2268 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2269 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2270 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2271 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2272 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2273 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2275 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2285 URI := TIdURI.Create(URL);
2287 Protocol := URI.Protocol;
2290 Document := URI.Document;
2292 Bookmark := URI.Bookmark;
2299 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2300 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2302 function TGikoSys.GetVersionBuild: Integer;
2304 FixedFileInfo: PVSFixedFileInfo;
2305 VersionHandle, VersionSize: DWORD;
2306 pVersionInfo: Pointer;
2311 AppFile := Application.ExeName;
2312 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2313 if VersionSize = 0 then
2315 GetMem(pVersionInfo, VersionSize);
2317 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2318 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2319 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2321 FreeMem(pVersionInfo, VersionSize);
2326 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2327 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2328 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2330 \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
2331 \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
2332 \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
2333 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2335 \97á(
\90³
\8bK
\89»
\91O):\n
2336 http://
\92\86\97ª/ \n
2337 http://
\92\86\97ª/20-100
2339 (
\90³
\8bK
\89»
\8cã):\n
2340 http://
\92\86\97ª/l50
2342 function TGikoSys.GetBrowsableThreadURL(
2346 threadItem : TThreadItem;
2347 boardPlugIn : TBoardPlugIn;
2352 //=====
\83v
\83\89\83O
\83C
\83\93
2354 for i := Length( BoardGroups ) - 1 downto 1 do begin
2355 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2356 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2357 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2358 if board <> nil then begin
2359 boardPlugIn := BoardGroups[i].BoardPlugIn;
2360 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2361 Result := threadItem.URL;
2370 // 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¢
2373 if Length( Result ) = 0 then
2374 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2379 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2380 \param inURL
\83X
\83\8c\83b
\83h URL
2383 function TGikoSys.GetThreadURL2BoardURL(
2387 threadItem : TThreadItem;
2388 boardPlugIn : TBoardPlugIn;
2393 //=====
\83v
\83\89\83O
\83C
\83\93
2395 for i := Length( BoardGroups ) - 1 downto 1 do begin
2396 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2397 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2398 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2399 boardPlugIn := BoardGroups[i].BoardPlugIn;
2400 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2401 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2409 // 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¢
2412 if Length( Result ) = 0 then
2413 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2418 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2419 \param inURL
\83X
\83\8c\83b
\83h URL
2421 \see TGikoSys.GetThreadURL2BoardURL
2423 function TGikoSys.Get2chThreadURL2BoardURL(
2427 Protocol, Host, Path, Document, Port, Bookmark : string;
2428 BBSID, BBSKey : string;
2432 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2433 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2435 foundPos := Pos( '/test/read.cgi', inURL );
2436 if {(Is2chHost(Host)) and} (foundPos > 0) then
2437 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2439 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2444 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2445 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2446 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2447 \see TGikoSys.GetBrowsableThreadURL
2449 function TGikoSys.Get2chBrowsableThreadURL(
2453 Protocol, Host, Path, Document, Port, Bookmark : string;
2454 BBSID, BBSKey : string;
2458 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2461 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2462 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2463 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2465 if Is2chHost( Host ) then begin
2466 Result := Protocol + '://' + Host +
2467 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2469 if foundPos > 0 then
2470 Result := Copy( inURL, 1, foundPos ) +
2471 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2473 Result := Protocol + '://' + Host +
2474 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2481 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2482 \param inBoard
\94Â URL
2483 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2484 \return
\83X
\83\8c\83b
\83h URL
2486 function TGikoSys.Get2chBoard2ThreadURL(
2494 server := UrlToServer( inBoard.URL );
2495 //if Is2chHost( server ) then
2496 if inBoard.Is2ch then
2497 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2499 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2504 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2506 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2508 procedure TGikoSys.ListBoardFile;
2510 boardFileList : TStringList;
2512 sCategory : TCategory;
2516 for i := 0 to Length( BBSs ) - 1 do
2520 SetLength( BBSs, 0 );
2523 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2524 if FileExists( GikoSys.GetBoardFileName ) then begin
2525 SetLength( BBSs, l + 1 );
2526 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2527 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2531 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2532 SetLength( BBSs, l + 1 );
2533 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2534 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2538 // Board
\83t
\83H
\83\8b\83_
2539 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2540 BoardFileList := TStringList.Create;
2542 BoardFileList.BeginUpdate;
2543 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*.txt', BoardFileList, True, True );
2544 BoardFileList.EndUpdate;
2545 SetLength( BBSs, l + BoardFileList.Count );
2546 for i := BoardFileList.Count - 1 downto 0 do begin
2547 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2548 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2556 //
\93Á
\8eê
\97p
\93rBBS
\90¶
\90¬
2557 //
\8aù
\82É
\91¶
\8dÝ
\82·
\82é
\8fê
\8d\87\82Í
\8dí
\8f\9c\82·
\82é
2558 DestorySpecialBBS(BoardGroup.SpecialBBS);
2559 SpecialBBS := TBBS.Create('');
2560 SpecialBBS.Title := '
\93Á
\8eê
\97p
\93r(
\94ñ
\95\
\8e¦)';
2561 sCategory := TCategory.Create;
2563 sCategory.Title := '
\93Á
\8eê
\97p
\93r(
\94ñ
\95\
\8e¦)';
2564 SpecialBBS.Add(sCategory);
2565 BoardGroup.SpecialBoard := TSpecialBoard.Create(nil, 'http://localhost/gikonavi/special/index.html');
2566 BoardGroup.SpecialBoard.Title := '
\83^
\83u
\88ê
\97\97';
2567 BoardGroup.SpecialBoard.IsThreadDatRead := True;
2568 sCategory.Add(BoardGroup.SpecialBoard);
2572 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2573 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2575 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2580 boardFile : TStringList;
2581 CategoryList : TStringList;
2582 BoardList : TStringList;
2583 Category : TCategory;
2587 // RoundItem : TRoundItem;
2589 i, iBound : Integer;
2590 j, jBound : Integer;
2591 k, kBound : Integer;
2594 if not FileExists( bbs.FilePath ) then
2598 ini := TMemIniFile.Create('');
2599 boardFile := TStringList.Create;
2602 boardFile.LoadFromFile( bbs.FilePath );
2604 ini.SetStrings( boardFile );
2605 CategoryList := TStringList.Create;
2606 BoardList := TStringList.Create;
2608 ini.ReadSections( CategoryList );
2610 iBound := CategoryList.Count - 1;
2611 for i := 0 to iBound do begin
2612 ini.ReadSection( CategoryList[i], BoardList );
2613 Category := TCategory.Create;
2614 Category.No := i + 1;
2615 Category.Title := CategoryList[i];
2617 jBound := BoardList.Count - 1;
2618 for j := 0 to jBound do begin
2620 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2621 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2622 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2623 //=====
\83v
\83\89\83O
\83C
\83\93
2625 kBound := Length(BoardGroups) - 1;
2626 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2627 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2628 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2629 if not BoardGroups[k].Find(inistr, p) then begin
2630 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2631 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2632 if not BoardGroups[k].Find(tmpstring, p) then begin
2634 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2635 BoardGroups[k].AddObject(tmpstring, Board);
2636 Category.Add(Board);
2638 //
\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é
2642 Board := TBoard(BoardGroups[k].Objects[p]);
2643 if Board.ParentCategory <> Category then
2644 Category.Add(Board);
2648 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2649 BoardGroups[k].AddObject(tmpstring, Board);
2650 Category.Add(Board);
2652 //
\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é
2657 Board := TBoard(BoardGroups[k].Objects[p]);
2658 if Board.ParentCategory <> Category then
2659 Category.Add(Board);
2666 // 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¢
2669 if (Board = nil) then begin
2670 if not BoardGroups[0].Find(inistr,p) then begin
2671 Board := TBoard.Create( nil, inistr );
2672 BoardGroups[0].AddObject(inistr, Board);
2673 Category.Add(Board);
2675 Board := TBoard(BoardGroups[0].Objects[p]);
2676 if Board.ParentCategory <> Category then
2677 Category.Add(Board);
2681 if (Board.Multiplicity = 0) then begin
2684 Board.Multiplicity := 1;
2685 Board.Title := BoardList[j];
2686 Board.RoundDate := ZERO_DATE;
2691 Board.Multiplicity := Board.Multiplicity + 1;
2696 bbs.Add( Category );
2701 bbs.IsBoardFileRead := True;
2714 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2715 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2717 function TGikoSys.GetUnknownCategory : TCategory;
2719 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2722 if Length( BBSs ) < 2 then begin
2727 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2728 if Result = nil then begin
2729 Result := TCategory.Create;
2730 Result.Title := UNKNOWN_CATEGORY;
2731 BBSs[ 1 ].Add( Result );
2737 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2738 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2740 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2742 category : TCategory;
2744 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2747 category := GetUnknownCategory;
2748 if category = nil then begin
2751 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2752 if Result = nil then begin
2753 Result := TBoard.Create( inPlugIn, inURL );
2754 Result.Title := UNKNOWN_BOARD;
2755 category.Add( Result );
2762 function TGikoSys.GetSambaFileName : string;
2764 Result := Setting.GetSambaFileName;
2767 \brief
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82Ö
\82Ì
\83A
\83\93\83J
\81[
\97pHTML
\8dì
\90¬
2768 \param Numbers
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86
2769 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2770 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2771 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2773 function TGikoSys.CreateSameIDResAnchor(
2774 var Numbers: TStringList; ThreadItem: TThreadItem;
2775 limited: Integer):string;
2779 ResLink : TResLinkRec;
2781 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2783 Res.FType := glt2chNew;
2786 if (Numbers <> nil) and (Numbers.Count > 0) then begin
2787 if (limited > 0) and (Numbers.Count > limited) then begin
2788 for i := Numbers.Count - limited to Numbers.Count - 1 do begin
2789 Res.FBody := Res.FBody + '>' + Numbers[i] + ' ';
2792 for i := 0 to Numbers.Count - 1 do begin
2793 Res.FBody := Res.FBody + '>' + Numbers[i] + ' ';
2796 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2797 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2798 HTMLCreater.ConvRes(@Res, @ResLink, false);
2799 Result := Res.FBody;
2804 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2805 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2806 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2807 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2809 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2812 ReadList: TStringList;
2814 boardPlugIn : TBoardPlugIn;
2816 procedure CheckSameID(const AID:String; const Target: String; no: Integer);
2820 pos := AnsiPos('id:', LowerCase(Target));
2821 if (pos > 0) then begin
2822 if(AnsiPos(AID, Copy(Target, pos-1, Length(Target))) > 0) then begin
2823 body.Add(IntToStr(no));
2826 if(AnsiPos(AID, Target) > 0) then begin
2827 body.Add(IntToStr(no));
2832 if (not IsNoValidID(AID)) and
2833 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2834 //if ThreadItem.IsBoardPlugInAvailable then begin
2835 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2836 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2837 //boardPlugIn := ThreadItem.BoardPlugIn;
2838 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2840 for i := 0 to threadItem.Count - 1 do begin
2842 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2843 CheckSameID(AID, Res.FDateTime, i+1);
2846 ReadList := TStringList.Create;
2848 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2849 for i := 0 to ReadList.Count - 1 do begin
2850 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2851 CheckSameID(AID, Res.FDateTime, i+1);
2861 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2862 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2863 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2864 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2866 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2870 AID := GetResID(AIDNum, ThreadItem);
2871 if not IsNoValidID(AID) then begin
2872 GetSameIDRes(AID, ThreadItem, body);
2876 \brief
\93\8a\8de ID
\8eæ
\93¾
2877 \param AIDNum
\93\8a\8de
\83\8c\83X
\94Ô
\8d\86
2878 \param ThreadItem
\93\8a\8de
\83X
\83\8c\83b
\83h
2879 \param body OUT:
\93\8a\8deID
2881 function TGikoSys.GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
2884 boardPlugIn : TBoardPlugIn;
2885 stList: TStringList;
2889 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2890 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2891 //if ThreadItem.IsBoardPlugInAvailable then begin
2892 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2893 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2894 //boardPlugIn := ThreadItem.BoardPlugIn;
2895 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2896 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2898 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2900 Result := Res.FDateTime;
2901 if AnsiPos('id', AnsiLowerCase(Result)) > 0 then begin
2902 Result := Copy(Result, AnsiPos('id', AnsiLowerCase(Result)) - 1, 11);
2903 if AnsiPos(' be:', AnsiLowerCase(Result)) > 0 then begin
2904 Result := Copy(Result, 1, AnsiPos(' BE:', AnsiLowerCase(Result)) - 1)
2907 stlist := TStringList.Create;
2909 stList.DelimitedText := Result;
2911 for i := 0 to stList.Count - 1 do
2912 if Length(WideString(stList[i])) = 8 then begin
2913 if NotDateorTimeString(stList[i]) then begin
2914 Result := stList[i];
2926 \brief
\8e\9e\8d\8f\82ð
\8e¦
\82·
\95¶
\8e\9a\97ñ
\82Å
\82Í
\96³
\82¢
\82©
\82Ç
\82¤
\82©
2927 \param AStr
\92²
\82×
\82é
\95¶
\8e\9a\97ñ
2928 \return
\8e\9e\8d\8f\82Å
\82Í
\96³
\82¢
\82È
\82ç True
2929 \todo
\94Û
\92è
\8c`(Not)
\82æ
\82è
\8dm
\92è
\8cn(Is)
2931 function TGikoSys.NotDateorTimeString(const AStr : string): boolean;
2948 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
2949 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
2950 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
2952 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
2955 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
2956 Bayesian.CountWord( text, wordCount );
2961 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
2962 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
2963 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
2964 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
2965 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
2966 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
2967 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
2969 \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
2970 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
2972 \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
2974 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
2977 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
2978 Bayesian.Forget( wordCount, isSpam );
2983 \brief
\83X
\83p
\83\80:
\8aw
\8fK
2984 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
2985 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
2987 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
2990 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
2991 Bayesian.Learn( wordCount, isSpam );
2996 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
2997 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
2998 \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)
2999 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3001 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3004 case Setting.SpamFilterAlgorithm of
3005 gsfaNone: Result := 0;
3006 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3007 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3008 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3015 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3016 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3018 [
\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Ì
3019 [
\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
3021 function TGikoSys.SetUserOptionalStyle(): string;
3024 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3025 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3026 if GikoSys.Setting.BrowserFontSize <> 0 then
3027 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3028 if GikoSys.Setting.BrowserFontColor <> -1 then
3029 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3030 if GikoSys.Setting.BrowserBackColor <> -1 then
3031 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3032 case GikoSys.Setting.BrowserFontBold of
3033 -1: Result := Result + 'font-weight:normal;';
3034 1: Result := Result + 'font-weight:bold;';
3036 case GikoSys.Setting.BrowserFontItalic of
3037 -1: Result := Result + 'font-style:normal;';
3038 1: Result := Result + 'font-style:italic;';
3043 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3044 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3045 \param ANum
\83\8c\83X
\94Ô
3046 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3047 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3049 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3052 BNum, BMark : string;
3054 p := AnsiPos('BE:', AnsiUpperCase(AID));
3056 BNum := Copy(AID, p, Length(AID));
3057 AID := Copy(AID, 1, p - 1);
3058 p := AnsiPos('-', BNum);
3060 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3061 BNum := Copy(BNum, 1, p - 1);
3064 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3065 + '" target=_blank>' + BMark + '</a>';
3071 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3072 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3073 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3075 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3077 Translation = '\VarFileInfo\Translation';
3078 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3080 BufSize, HWnd: DWORD;
3081 VerInfoBuf: Pointer;
3083 VerDataLen: Longword;
3086 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3087 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3088 if BufSize <> 0 then begin
3089 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3090 GetMem(VerInfoBuf, BufSize);
3092 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3093 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3094 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3096 if not (VerDataLen > 0) then
3097 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3099 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3100 //
\81¨'\StringFileInfo\027382\FileDescription'
3101 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3102 [IntToHex(Integer(VerData^) and $FFFF, 4),
3103 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3104 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3106 if VerDataLen > 0 then begin
3107 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3109 SetLength(result, VerDataLen);
3110 StrLCopy(PChar(result), VerData, VerDataLen);
3114 FreeMem(VerInfoBuf);
3120 \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
3121 \return 1
\8ds1plugin
3123 function TGikoSys.GetPluginsInfo(): String;
3126 major, minor, revision : Cardinal;
3127 agent, release : String;
3129 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3132 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3133 for i := 0 to Length(BoardGroups) - 1 do begin
3134 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3135 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3136 if BoardGroups[i].BoardPlugIn <> nil then begin
3137 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3140 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3142 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3148 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3149 function TGikoSys.GetIEVersion: string;
3153 R := TRegistry.Create;
3155 //
\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¢
3156 R.Access := KEY_EXECUTE;
3157 R.RootKey := HKEY_LOCAL_MACHINE;
3158 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3160 Result := R.ReadString('version');
3162 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3169 //! 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¼
3170 function TGikoSys.GetMainKeyFileName : String;
3172 Result := Setting.GetMainKeyFileName;
3174 //! 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¼
3175 function TGikoSys.GetEditorKeyFileName: String;
3177 Result := Setting.GetEditorKeyFileName;
3179 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3180 function TGikoSys.GetInputAssistFileName: String;
3182 Result := Setting.GetInputAssistFileName;
3184 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3185 procedure TGikoSys.SetGikoMessage;
3187 if FGikoMessage = nil then begin
3188 FGikoMessage := TGikoMessage.Create;
3193 if (Setting.GengoSupport) then begin
3195 if (FileExists(Setting.GetLanguageFileName)) then begin
3196 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3203 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3204 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3207 if FGikoMessage <> nil then begin
3208 Result := FGikoMessage.GetMessage(MesType);
3212 //Tue, 17 Dec 2002 12:18:07 GMT
\81¨ TDateTime
\82Ö
3213 //MonaUtils
\82©
\82ç
\88Ú
\93®
3214 function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime;
3215 function StrMonthToMonth(const s: string): integer;
3217 m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
3222 for i := Low(m) to High(m) do begin
3223 if (SameText(s, m[i])) then begin
3230 wDay, wMonth, wYear: word;
3231 wHour, wMinute, wSecond: word;
3235 wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0);
3236 wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2));
3237 wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0);
3238 sTime := ChooseString(DateStr, ' ', 4);
3239 wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0);
3240 wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0);
3241 wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0);
3242 d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0);
3245 //MonaUtils
\82©
\82ç
\88Ú
\93®
3246 //!
\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·
3247 function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string;
3253 for i := 0 to Index - 1 do begin
3254 if (AnsiPos(Separator, S) = 0) then S := ''
3255 else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S));
3257 p := AnsiPos(Separator, S);
3258 if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S;
3260 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
3261 procedure TGikoSys.RestoreThreadData(Board : TBoard);
3263 SECTION = 'Setting';
3265 TmpFileList : TStringList;
3268 ThreadItem : TThreadItem;
3269 Boardpath, tmpStr : string;
3271 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
3273 TmpFileList := TStringList.Create;
3274 TmpFileList.Sorted := True;
3275 TmpFileList.BeginUpdate;
3277 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
3278 GetFileList(Boardpath, '*.tmp', TmpFileList, False);
3279 TmpFileList.EndUpdate;
3280 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
3281 for i := TmpFileList.Count - 1 downto 0 do begin
3282 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
3283 if ThreadItem <> nil then begin
3284 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
3286 tmpStr := ini.ReadString(SECTION, 'RoundDate', DateTimeToStr(ZERO_DATE));
3287 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
3289 tmpStr := ini.ReadString(SECTION, 'LastModified', DateTimeToStr(ZERO_DATE));
3290 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
3291 ThreadItem.Count := ini.ReadInteger(SECTION, 'Count', 0);
3292 ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
3294 ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
3295 ThreadItem.IsLogFile := FileExists(ThreadItem.GetThreadFileName);
3296 if(ThreadItem.Size = 0) and (ThreadItem.IsLogFile) then begin
3298 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
3303 //
\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ã
3304 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
3305 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
3306 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
3307 ThreadItem.ScrollTop := ini.ReadInteger(SECTION, 'ScrollTop', 0);
3308 ThreadItem.AllResCount := ini.ReadInteger(SECTION, 'AllResCount', ThreadItem.Count);
3309 ThreadItem.NewResCount := ini.ReadInteger(SECTION, 'NewResCount', 0);
3310 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger(SECTION, 'AgeSage', Ord(gasNone)));
3314 DeleteFile(Boardpath + TmpFileList[i]);
3323 \brief User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
3324 \return Boolean
\97\98\97p
\82Å
\82«
\82é
\8fê
\8d\87\82ÍTrue
3326 function TGikoSys.CanUser32DLL: Boolean;
3334 hUser32 := LoadLibrary('User32.dll');
3335 if hUser32 <> 0 then begin
3342 FreeLibrary(hUser32);
3346 \brief OE
\88ø
\97p
\95\84\8eæ
\93¾
3347 \return OE
\82Ì
\88ø
\97p
\95\84\81i
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87\82Í'>')
3349 function TGikoSys.GetOEIndentChar : string;
3352 Identities : string;
3355 DEFAULT_CHAR = '> ';
3356 OE_MAIL_PATH = '\Software\Microsoft\Outlook Express\5.0\Mail';
3357 INDENT_CHAR = 'Indent Char';
3360 Result := DEFAULT_CHAR;
3361 regKey := TRegistry.Create;
3364 regKey.RootKey := HKEY_CURRENT_USER;
3365 if not regKey.OpenKey( 'Identities', False ) then
3367 Identities := regKey.ReadString( 'Default User ID' );
3368 if Identities = '' then
3370 if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then
3372 IndentChar := regKey.ReadInteger( INDENT_CHAR );
3373 Result := Char( IndentChar ) + ' ';
3381 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3382 function TGikoSys.GetReplaceFileName: String;
3384 Result := Setting.GetReplaceFileName;
3386 //!
\83v
\83\8c\83r
\83\85\81[
\8ag
\92£
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3387 function TGikoSys.GetExtpreviewFileName: String;
3389 Result := Setting.GetExtprevieFileName;
3392 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
3393 function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime;
3398 //
\83\8d\83O
\83t
\83@
\83C
\83\8b\82Ì
\8ag
\92£
\8eq
\82ð
\82Í
\82¸
\82µ
\82½
\82à
\82Ì
\82ª
\83X
\83\8c\8dì
\90¬
\93ú
\8e\9e
3399 tmp := ChangeFileExt(FileName, '');
3400 if AnsiPos('_', tmp) <> 0 then
3401 if AnsiPos('_', tmp) > 9 then
3402 tmp := Copy(tmp, 1, AnsiPos('_', tmp)-1)
3404 Delete(tmp, AnsiPos('_', tmp), 1);
3406 if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
3407 Insert('1', tmp, 1);
3409 unixtime := StrToInt64Def(tmp, ZERO_DATE);
3410 Result := UnixToDateTime(unixtime) + OffsetFromUTC;
3413 procedure TGikoSys.ShowRefCount(msg: String; unk: IUnknown);
3419 if not Assigned(unk) then
3425 count := unk._Release;
3427 Writeln(msg + ' RefCount=' + IntToStr(count));
3429 Writeln(msg + ' RefCount=exception!!');
3435 GikoSys := TGikoSys.Create;
3438 if GikoSys <> nil then begin
3439 FreeAndNil(GikoSys);