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 CreateResAnchor(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;
220 function ExtructResID(ADateStr: String): String;
222 procedure SpamCountWord( const text : string; wordCount : TWordCount );
223 //!
\8aw
\8fK
\83N
\83\8a\83A
224 procedure SpamForget( wordCount : TWordCount; isSpam : Boolean );
225 //!
\83X
\83p
\83\80\8aw
\8fK
226 procedure SpamLearn( wordCount : TWordCount; isSpam : Boolean );
227 //!
\83X
\83p
\83\80\93x
\90\94
228 function SpamParse( const text : string; wordCount : TWordCount ) : Extended;
230 //!
\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Á
231 function AddBeProfileLink(AID : string; ANum: Integer): string;
232 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
233 function GetVersionInfo(KeyWord: TVerResourceKey): string;
234 //! Plugin
\82Ì
\8fî
\95ñ
\82Ì
\8eæ
\93¾
235 function GetPluginsInfo(): string;
236 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
237 function GetIEVersion: string;
238 function SetUserOptionalStyle(): string;
239 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
240 procedure SetGikoMessage;
241 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
242 function GetGikoMessage(MesType: TGikoMessageListType): String;
243 //! GMT
\82Ì
\8e\9e\8d\8f\82ðTDateTime
\82É
\95Ï
\8a·
\82·
\82é
244 function DateStrToDateTime(const DateStr: string): TDateTime;
245 //! User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
246 function CanUser32DLL: Boolean;
247 //! OE
\88ø
\97p
\95\84\8eæ
\93¾
248 function GetOEIndentChar : string;
249 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
250 function GetReplaceFileName: String;
251 //!
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
252 procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: boolean = True);
253 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
254 function GetCreateDateFromName(FileName: String): TDateTime;
255 function GetExtpreviewFileName: String;
257 procedure ShowRefCount(msg: String; unk: IUnknown);
263 //LENGTH_RESTITLE = 40;
264 ZERO_DATE: Integer = 25569;
265 BETA_VERSION_NAME_E = 'beta';
266 BETA_VERSION_NAME_J = 'ÊÞÀ';
268 BETA_VERSION_BUILD = ''; //!< debug
\94Å
\82È
\82Ç
269 APP_NAME = 'gikoNavi';
270 BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
276 Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils, Sort, YofUtils,
277 IniFiles, DateUtils, SkinFiles;
280 FOLDER_INDEX_VERSION = '1.01';
281 USER_AGENT = 'Monazilla';
282 DEFAULT_NGWORD_FILE_NAME : String = 'NGword.txt';
283 NGWORDs_DIR_NAME : String = 'NGwords';
285 READ_PATH: string = '/test/read.cgi/';
286 HTML_READ_PATH: string = '/test/read.html/';
287 OLD_READ_PATH: string = '/test/read.cgi?';
288 KAKO_PATH: string = '/kako/';
290 KeyWordStr: array [TVerResourceKey] of String = (
304 // *************************************************************************
305 //! GikoSys
\83R
\83\93\83X
\83g
\83\89\83N
\83^
306 // *************************************************************************
307 constructor TGikoSys.Create;
310 FSetting := TSetting.Create;
311 FDolib := TDolib.Create;
312 FAWKStr := TAWKStr.Create(nil);
313 if DirectoryExists(GetConfigDir) = false then begin
314 CreateDir(GetConfigDir);
316 FAbon := TAbon.Create;
317 FAbon.IgnoreKana := FSetting.IgnoreKana;
318 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
320 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
321 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
322 FAbon.DeleteSyria := FSetting.DeleteSyria;
323 FAbon.Deleterlo := FSetting.AbonDeleterlo;
324 FAbon.Replaceul := FSetting.AbonReplaceul;
325 FAbon.AbonPopupRes := FSetting.PopUpAbon;
327 FSelectResFilter := TAbon.Create;
328 FSelectResFilter.IgnoreKana := True;
329 //
\8di
\82è
\8d\9e\82Þ
\82Æ
\82«
\82Í
\8bÉ
\97Í
\88ê
\97\97\82ª
\8c©
\82ç
\82ê
\82é
\82Ù
\82¤
\82ª
\82¢
\82¢
\82Ì
\82Å
\91¼
\82Í
\8a®
\91S
\82É
\8dí
\8f\9c
330 FSelectResFilter.AbonString := '';
332 ResRange := FSetting.ResRange;
333 FVersion := Trim(GetVersionInfo(vrFileVersion));
334 FBayesian := TGikoBayesian.Create;
335 //FBoardURLList := TStringList.Create;
336 //
\83\81\83b
\83Z
\81[
\83W
\82Ì
\8dì
\90¬
337 FGikoMessage := TGikoMessage.Create;
340 // *************************************************************************
341 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
342 // *************************************************************************
343 destructor TGikoSys.Destroy;
346 FileList: TStringList;
348 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
349 FileList := TStringList.Create;
351 FileList.BeginUpdate;
352 GetFileList(GetTempFolder, '*.html', FileList, False, True);
354 for i := 0 to FileList.Count - 1 do begin
355 DeleteFile(FileList[i]);
360 FreeAndNil(FGikoMessage);
361 FreeAndNil(FBayesian);
362 FreeAndNil(FSelectResFilter);
366 FreeAndNil(FSetting);
371 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
372 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
373 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
376 function TGikoSys.IsNumeric(s: string): boolean;
387 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
388 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
389 \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
391 function TGikoSys.IsFloat(s: string): boolean;
395 Result := TextToFloat(PChar(s), v, fvExtended);
398 // *************************************************************************
399 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
400 // *************************************************************************
401 function TGikoSys.GetBoardFileName: string;
403 Result := Setting.GetBoardFileName;
406 // *************************************************************************
407 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
408 // *************************************************************************
409 function TGikoSys.GetCustomBoardFileName: string;
411 Result := Setting.GetCustomBoardFileName;
414 // *************************************************************************
415 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
416 // *************************************************************************
417 function TGikoSys.GetHtmlTempFileName: string;
419 Result := Setting.GetHtmlTempFileName;
423 // *************************************************************************
424 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
425 // *************************************************************************
426 function TGikoSys.GetAppDir: string;
428 Result := Setting.GetAppDir;
431 // *************************************************************************
432 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
433 // *************************************************************************
434 function TGikoSys.GetTempFolder: string;
436 Result := Setting.GetTempFolder;
439 // *************************************************************************
440 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
441 // *************************************************************************)
442 function TGikoSys.GetSentFileName: string;
444 Result := Setting.GetSentFileName;
447 // *************************************************************************
448 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
449 // *************************************************************************
450 function TGikoSys.GetOutBoxFileName: string;
452 Result := Setting.GetOutBoxFileName;
455 // *************************************************************************
456 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
457 // *************************************************************************
458 function TGikoSys.GetConfigDir: string;
460 Result := Setting.GetConfigDir;
463 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
464 function TGikoSys.GetStyleSheetDir: string;
466 Result := Setting.GetStyleSheetDir;
469 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
470 function TGikoSys.GetSkinDir: string;
472 Result := Setting.GetSkinDir;
475 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
476 function TGikoSys.GetSkinHeaderFileName: string;
478 Result := Setting.SkinFiles.GetSkinHeaderFileName;
481 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
482 function TGikoSys.GetSkinFooterFileName: string;
484 Result := Setting.SkinFiles.GetSkinFooterFileName;
487 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
488 function TGikoSys.GetSkinNewResFileName: string;
490 Result := Setting.SkinFiles.GetSkinNewResFileName;
493 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
494 function TGikoSys.GetSkinResFileName: string;
496 Result := Setting.SkinFiles.GetSkinResFileName;
499 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
500 function TGikoSys.GetSkinBookmarkFileName: string;
502 Result := Setting.SkinFiles.GetSkinBookmarkFileName;
505 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
506 function TGikoSys.GetSkinNewmarkFileName: string;
508 Result := Setting.SkinFiles.GetSkinNewmarkFileName;
511 //! UserAgent
\8eæ
\93¾
512 function TGikoSys.GetUserAgent: string;
514 if Dolib.Connected then begin
515 Result := Format('%s %s/%s%d/%s', [
522 Result := Format('%s/%s %s/%s%d/%s', [
533 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
534 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
535 \return val
\82ð
\8e¦
\82· TDateTime
537 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
539 Result := ZERO_DATE + val / 86400.0;
543 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
544 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
545 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
547 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
549 Result := Trunc((ADate - ZERO_DATE) * 86400);
554 \brief Subject
\83t
\83@
\83C
\83\8bRead
555 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
557 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
559 ThreadItem: TThreadItem;
561 FileList: TStringList;
570 datFileCheck: Boolean;
572 FavoThreadItem : TFavoriteThreadItem;
582 if Board.IsThreadDatRead then
586 usePlugIn := Board.IsBoardPlugInAvailable;
587 //server := UrlToServer( Board.URL );
588 //
\83X
\83\8c\83b
\83h
\82Å
\8b¤
\92Ê
\82ÌURL
\95\94
589 if Board.is2ch then begin
590 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi/' + Board.BBSID + '/';
592 urlHead := UrlToServer( Board.URL ) + 'test/read.cgi?bbs=' + Board.BBSID + '&key=';
595 FileName := Board.GetFolderIndexFileName;
598 datFileCheck := (Setting.CheckDatFile) or (not FileExists(FileName));
599 if (datFileCheck) then begin
600 FileList := TStringList.Create;
601 FileList.Sorted := True;
602 FileList.BeginUpdate;
603 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
604 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
608 //
\8fd
\95¡
\82ð
\96h
\82®
610 Board.Sorted := True;
611 sl := TStringList.Create;
613 if FileExists(FileName) then begin
614 sl.LoadFromFile(FileName);
615 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
616 for i := sl.Count - 1 downto 1 do begin
617 Rec := ParseIndexLine(sl[i]);
618 if (datFileCheck) then begin
619 islog := FileList.Find( Rec.FFileName, Index );
621 islog := (Rec.FSize <> 0) and (Rec.FCount <> 0);
624 ThreadItem := TThreadItem.Create(
627 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
629 if Board.is2ch then begin
630 ThreadItem := TThreadItem.Create(
633 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
638 ThreadItem := TThreadItem.Create(
641 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
648 //ThreadItem.BeginUpdate;
649 if (datFileCheck) and (islog) then
650 FileList.Delete( Index );
652 ThreadItem.No := Rec.FNo;
653 ThreadItem.FileName := Rec.FFileName;
654 ThreadItem.Title := MojuUtils.UnSanitize(Rec.FTitle);
655 ThreadItem.Count := Rec.FCount;
656 ThreadItem.Size := Rec.FSize;
657 ThreadItem.RoundDate := Rec.FRoundDate;
658 ThreadItem.LastModified := Rec.FLastModified;
659 ThreadItem.Kokomade := Rec.FKokomade;
660 ThreadItem.NewReceive := Rec.FNewReceive;
661 ThreadItem.UnRead := Rec.FUnRead;
662 ThreadItem.ScrollTop := Rec.FScrollTop;
663 ThreadItem.AllResCount := Rec.FAllResCount;
664 ThreadItem.NewResCount := Rec.FNewResCount;
665 ThreadItem.AgeSage := Rec.FAgeSage;
666 ThreadItem.ParentBoard := Board;
667 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
669 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
670 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
673 //ThreadItem.EndUpdate;
674 Board.Add(ThreadItem);
676 if (ThreadItem.UnRead) and (ThreadItem.IsLogFile) then
681 if UnRead <> Board.UnRead then
682 Board.UnRead := UnRead;
684 if (datFileCheck) then begin
685 //
\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
686 AddOutofIndexDat(Board, FileList);
690 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
691 RestoreThreadData( Board );
694 if (datFileCheck) then begin
697 Board.Sorted := False;
699 Board.IsThreadDatRead := True;
701 rt := GetTickCount - st;
702 Writeln('Read Done.' + Board.Title + ':' + IntToStr(rt) + ' ms');
706 \brief
\83C
\83\93\83f
\83b
\83N
\83X
\82É
\82È
\82¢dat
\81i
\82Í
\82®
\82êdat
\81j
\82Ì
\92Ç
\89Á
707 \param Board
\92Ç
\89Á
\82·
\82é
\94Â
708 \param DatList dat
\83t
\83@
\83C
\83\8b\96¼
710 procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: Boolean = True);
713 Boardpath,FileName : String;
715 ThreadItem: TThreadItem;
719 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
720 //
\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
721 for i := 0 to DatList.Count - 1 do begin
722 FileName := Boardpath + DatList[i];
724 if (not AllCreate) then begin
726 ThreadItem := Board.FindThreadFromFileName(DatList[i]);
727 if (ThreadItem = nil) then begin
730 if Board.IsBoardPlugInAvailable then begin
731 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
733 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
737 if (ThreadItem = nil) then begin
738 if Board.IsBoardPlugInAvailable then begin
739 ThreadItem := TThreadItem.Create(
742 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
743 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
745 ThreadItem := TThreadItem.Create(
748 Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
749 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
754 ThreadItem.BeginUpdate;
755 ThreadItem.FileName := DatList[i];
756 //ThreadItem.FilePath := FileName;
757 ThreadItem.No := Board.Count + 1;
758 ThreadItem.Title := ResRec.FTitle;
759 ThreadItem.Count := GetFileLineCount(FileName);
760 ThreadItem.AllResCount := ThreadItem.Count;
761 ThreadItem.NewResCount := ThreadItem.Count;
762 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é
763 ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) );
764 ThreadItem.LastModified := ThreadItem.RoundDate;
765 ThreadItem.Kokomade := -1;
766 ThreadItem.NewReceive := 0;
767 ThreadItem.ParentBoard := Board;
768 ThreadItem.IsLogFile := True;
769 ThreadItem.Round := False;
770 ThreadItem.UnRead := False;
771 ThreadItem.ScrollTop := 0;
772 ThreadItem.AgeSage := gasNone;
773 ThreadItem.EndUpdate;
774 if (AllCreate) or (create) then begin
775 Board.Add(ThreadItem);
780 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
781 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
783 procedure TGikoSys.CreateThreadDat(Board: TBoard);
787 SubjectList: TStringList;
793 if not FileExists(Board.GetSubjectFileName) then Exit;
794 FileName := Board.GetFolderIndexFileName;
796 SubjectList := TStringList.Create;
798 SubjectList.LoadFromFile(Board.GetSubjectFileName);
799 sl := TStringList.Create;
803 sl.Add(FOLDER_INDEX_VERSION);
804 for i := 0 to SubjectList.Count - 1 do begin
805 Rec := DivideSubject(SubjectList[i]);
807 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
810 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
811 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
812 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
813 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
814 + Format('%x', [0]) + #1 //size
815 + Format('%x', [0]) + #1 //RoundDate
816 + Format('%x', [0]) + #1 //LastModified
817 + Format('%x', [0]) + #1 //Kokomade
818 + Format('%x', [0]) + #1 //NewReceive
819 + '0' + #1 //
\96¢
\8eg
\97p
820 + Format('%x', [0]) + #1 //UnRead
821 + Format('%x', [0]) + #1 //ScrollTop
822 + Format('%x', [Rec.FCount]) + #1 //AllResCount
823 + Format('%x', [0]) + #1 //NewResCount
824 + Format('%x', [0]); //AgeSage
826 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
827 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
829 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
830 MojuUtils.Sanitize(Rec.FTitle), //
\83^
\83C
\83g
\83\8b
831 Rec.FCount, //
\83J
\83E
\83\93\83g
840 Rec.FCount, //AllResCount
849 sl.SaveToFile(FileName);
859 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
860 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
862 procedure TGikoSys.WriteThreadDat(Board: TBoard);
864 // Values: array[Boolean] of string = ('0', '1');
870 TmpFileList: TStringList;
872 if not Board.IsThreadDatRead then
874 FileName := Board.GetFolderIndexFileName;
875 ForceDirectoriesEx( ExtractFilePath( FileName ) );
877 sl := TStringList.Create;
878 TmpFileList := TStringList.Create;
879 TmpFileList.Sorted := true;
881 TmpFileList.BeginUpdate;
882 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
883 TmpFileList.EndUpdate;
885 sl.Add(FOLDER_INDEX_VERSION);
887 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
888 Sort.SetSortNoFlag(true);
889 Sort.SetSortOrder(true);
890 Sort.SetSortIndex(0);
891 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
892 Board.CustomSort(ThreadItemSortProc);
894 for i := 0 to Board.Count - 1 do begin
895 Board.Items[i].No := i + 1;
896 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
897 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
898 [Board.Items[i].No, //
\94Ô
\8d\86
899 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
900 MojuUtils.Sanitize(Board.Items[i].Title), //
\83^
\83C
\83g
\83\8b
901 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
902 Board.Items[i].Size, //size
903 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
904 DateTimeToInt(Board.Items[i].LastModified), //LastModified
905 Board.Items[i].Kokomade, //Kokomade
906 Board.Items[i].NewReceive, //NewReceive
908 BoolToInt(Board.Items[i].UnRead), //UnRead
909 Board.Items[i].ScrollTop, //ScrollTop
910 Board.Items[i].AllResCount, //AllResCount
911 Board.Items[i].NewResCount, //NewResCount
912 Ord(Board.Items[i].AgeSage)] //AgeSage
918 sl.SaveToFile(FileName);
920 for i := 0 to TmpFileList.Count - 1 do begin
921 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
931 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
932 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
933 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
935 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
937 Result.FNo := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
938 Result.FFileName := MojuUtils.RemoveToken(Line, #1);
939 Result.FTitle := MojuUtils.UnSanitize(MojuUtils.RemoveToken(Line, #1));
940 Result.FCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
941 Result.FSize := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
942 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
943 Result.FLastModified := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE));
944 Result.FKokomade := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), -1);
945 Result.FNewReceive := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
946 MojuUtils.RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
947 Result.FUnRead := IntToBool(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
948 Result.FScrollTop := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
949 Result.FAllResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
950 Result.FNewResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0);
951 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0));
956 \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é
957 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
958 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
959 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
960 \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
961 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
963 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
964 \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
968 GetFileList('c:\', '*.txt', list, True, True);
971 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
974 SearchRec : TSearchRec;
977 Path := IncludeTrailingPathDelimiter(Path);
978 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
980 while rc = 0 do begin
981 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
982 s := Path + SearchRec.Name;
984 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
988 List.Add(SearchRec.Name);
989 if SubDir and (SearchRec.Attr and faDirectory > 0) then
990 GetFileList(s, Mask, List, True, IsPathAdd);
992 rc := FindNext(SearchRec);
995 SysUtils.FindClose(SearchRec);
1001 \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
1002 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
1003 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1004 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
1005 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1006 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
1007 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
1010 GetFileList('c:\', '*.txt', list, True);
1013 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
1016 SearchRec : TSearchRec;
1018 Path := IncludeTrailingPathDelimiter(Path);
1019 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
1021 while rc = 0 do begin
1022 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1023 if (SearchRec.Attr and faDirectory = 0) then begin
1024 if IsPathAdd then begin
1025 List.Add(Path + SearchRec.Name)
1027 List.Add(SearchRec.Name);
1031 rc := FindNext(SearchRec);
1034 SysUtils.FindClose(SearchRec);
1040 \brief
\8ew
\92è
\83t
\83H
\83\8b\83_
\93à
\82Ì
\83f
\83B
\83\8c\83N
\83g
\83\8a\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
1041 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1042 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
1043 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
1044 \param SubDir
\92\86\82Ì
\83t
\83H
\83\8b\83_
\82Ü
\82Å
\8dÄ
\8bA
\93I
\82É
\83\8a\83X
\83g
\82·
\82é
\8fê
\8d\87\82Í True
1046 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
1047 \93Á
\92è
\82Ì
\83t
\83@
\83C
\83\8b\96¼
\82â
\93Á
\92è
\82Ì
\8ag
\92£
\8eq
\82É
\8di
\82Á
\82½
\83\8a\83X
\83g
\83A
\83b
\83v
\82ª
\89Â
\94\
\82Å
\82·
\81B
1051 GetDirectoryList('c:\', '*.txt', list, True);
1054 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1057 SearchRec : TSearchRec;
1060 Path := IncludeTrailingPathDelimiter(Path);
1061 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1063 while rc = 0 do begin
1064 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1065 s := Path + SearchRec.Name;
1066 //if (SearchRec.Attr and faDirectory > 0) then
1067 // s := IncludeTrailingPathDelimiter(s)
1069 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1070 List.Add( IncludeTrailingPathDelimiter( s ) );
1071 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1072 GetDirectoryList(s, Mask, List, True);
1074 rc := FindNext(SearchRec);
1077 SysUtils.FindClose(SearchRec);
1083 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1084 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1085 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1087 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1097 if AnsiPos('<>', Line) = 0 then
1101 Result.FFileName := MojuUtils.RemoveToken(Line, Delim);
1102 Result.FTitle := Trim(MojuUtils.RemoveToken(Line, Delim));
1104 ws := Result.FTitle;
1105 if Copy(ws, Length(ws), 1) = ')' then begin
1108 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1111 end else if Copy(ws, Length(ws), 1) = '>' then begin
1115 for i := Length(ws) - 1 downto 1 do begin
1116 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1117 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1118 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1119 if IsNumeric(ws) then
1120 Result.FCount := StrToInt(ws);
1121 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1128 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1129 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1132 function TGikoSys.UrlToID(url: string): string;
1139 if url = '' then Exit;
1141 url := Copy(url, 0, Length(url) - 1);
1142 for i := Length(url) downto 0 do begin
1143 if url[i] = '/' then begin
1144 Result := Copy(url, i + 1, Length(url));
1154 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1155 \param url
\89ð
\8eß
\82·
\82é URL
1156 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1158 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1160 function TGikoSys.UrlToServer(url: string): string;
1167 wsURL := Trim(wsURL);
1169 if wsURL = '' then exit;
1171 if Copy(wsURL, Length(wsURL), 1) = '/' then
1172 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1174 for i := Length(wsURL) downto 0 do begin
1175 if wsURL[i] = '/' then begin
1176 Result := Copy(wsURL, 0, i);
1183 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1184 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1185 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1187 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1191 Code := GetFileAttributes(PChar(Name));
1192 Result := (Code <> Cardinal(-1)) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1196 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1197 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1198 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1200 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1203 if Length(Dir) = 0 then
1204 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1205 Dir := ExcludeTrailingPathDelimiter(Dir);
1206 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1207 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1208 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1212 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
\81i
\8f\89\8aú
\8f\88\97\9d\81j
1213 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1214 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1215 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1216 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1217 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1218 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1220 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1224 Result := StrTokNext(sep, Rec);
1228 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1229 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1230 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1231 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1232 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1233 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1235 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1242 if Len >= Pos then begin
1243 while (Pos <= Len) and (Str[Pos] in sep) do begin
1247 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1248 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1253 Result := Copy(Str, I, Pos - I);
1254 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1262 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1263 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1264 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1266 function TGikoSys.GetFileSize(FileName : string): longint;
1271 if not FileExists(FileName) then begin
1275 Assign(F, FileName);
1277 Result := FileSize(F);
1285 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1286 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1288 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1290 function TGikoSys.GetFileLineCount(FileName : string): longint;
1294 sl := TStringList.Create;
1297 sl.LoadFromFile(FileName);
1309 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1310 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1311 \param Line
\8ew
\92è
\8ds
1312 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1313 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1315 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1317 fileTmp : TStringList;
1320 if FileExists(FileName) then begin
1321 fileTmp := TStringList.Create;
1324 fileTmp.LoadFromFile( FileName );
1325 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1326 Result := fileTmp.Strings[ Line-1 ];
1329 //on EFOpenError do Result := '';
1338 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1339 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1341 procedure TGikoSys.MenuFont(Font: TFont);
1344 nm: NONCLIENTMETRICS;
1346 nm.cbSize := sizeof(NONCLIENTMETRICS);
1347 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1348 lf := nm.lfMenuFont;
1349 Font.Name := lf.lfFaceName;
1350 Font.Height := lf.lfHeight;
1352 if lf.lfWeight >= 700 then
1353 Font.Style := Font.Style + [fsBold];
1354 if lf.lfItalic = 1 then
1355 Font.Style := Font.Style + [fsItalic];
1359 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1360 \param s IN/OUT:
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
\81A
\90Ø
\82è
\8fo
\82µ
\82½
\8cã
\82Ì
\8ec
\82è
\82Ì
\95¶
\8e\9a\97ñ
1361 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1362 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1364 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1366 {function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1370 p := AnsiPos(delimiter, s);
1374 Result := Copy(s, 1, p - 1);
1375 Delete(s, 1, Length(Result) + Length(delimiter));
1380 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1381 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1382 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1383 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1385 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1387 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1392 for i := 0 to index do
1393 Result := MojuUtils.RemoveToken(s, delimiter);
1397 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1398 {procedure TGikoSys.FlashExitWrite;
1402 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1403 for i := 0 to FExitWrite.Count - 1 do
1404 WriteThreadDat(FExitWrite[i]);
1409 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1410 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1411 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1412 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1416 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1418 ERASECHAR : array [1..39] of string =
1419 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1420 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1421 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1422 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1424 Chr : array [0..255] of char;
1428 s := Trim(LongName);
1429 if (Length(s) <= ALength) then begin
1433 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1434 S := CustomStringReplace(S, ERASECHAR[i], '');
1436 if (Length(S) <= ALength) then begin
1439 Windows.LCMapString(
1440 GetUserDefaultLCID(),
1448 S := Copy(S,1,ALength);
1450 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1451 S := Copy(S, 1, Length(S) - 1);
1462 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1463 \return False..0, True..1
1465 function TGikoSys.BoolToInt(b: Boolean): Integer;
1467 Result := IfThen(b, 1, 0);
1471 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1472 \return 1..True, other..False
1473 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1474 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1476 function TGikoSys.IntToBool(i: Integer): Boolean;
1482 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1483 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1484 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1485 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1487 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1491 GZipStream: TGzipDecompressStream;
1492 TextStream: TStringStream;
1493 buf: array[0..BUF_SIZE - 1] of Byte;
1499 TextStream := TStringStream.Create('');
1501 //
\83m
\81[
\83g
\83\93\83E
\83\93\83`
\83E
\83B
\83\8b\83X2003
\91Î
\8dô(x-gzip
\82Æ
\82©
\82É
\82È
\82é
\82Ý
\82½
\82¢)
1502 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1503 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1504 ResStream.Position := 0;
1505 GZipStream := TGzipDecompressStream.Create(TextStream);
1508 FillChar(buf, BUF_SIZE, 0);
1509 cnt := ResStream.Read(buf, BUF_SIZE);
1511 GZipStream.Write(buf, BUF_SIZE);
1517 ResStream.Position := 0;
1519 FillChar(buf, BUF_SIZE, 0);
1520 cnt := ResStream.Read(buf, BUF_SIZE);
1522 TextStream.Write(buf, BUF_SIZE);
1526 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1527 s := TextStream.DataString;
1530 while (i > 0) and (s[i] = #0) do
1532 Delete(s, i + 1, ln - i);
1535 while i <> 0 do begin
1547 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1548 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1549 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1551 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1553 STD_SEC = 'KeySetting';
1559 SecList: TStringList;
1560 Component: TComponent;
1562 if not FileExists(fileName) then
1564 SecList := TStringList.Create;
1565 ini := TMemIniFile.Create(fileName);
1567 ini.ReadSection(STD_SEC, SecList);
1568 for i := 0 to SecList.Count - 1 do begin
1569 ActionName := SecList[i];
1570 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1571 if ActionKey <> -1 then begin
1572 Component := ActionList.Owner.FindComponent(ActionName);
1573 if TObject(Component) is TAction then begin
1574 TAction(Component).ShortCut := ActionKey;
1585 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82é
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\83t
\83@
\83C
\83\8b\82É
\95Û
\91¶
1586 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1587 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1589 ActionList
\82É
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82é
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð FileName
\82É
\95Û
\91¶
\82µ
\82Ü
\82·
\81B
1591 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1593 STD_SEC = 'KeySetting';
1598 ini := TMemIniFile.Create(GetConfigDir + FileName);
1600 for i := 0 to ActionList.ActionCount - 1 do begin
1601 if ActionList.Actions[i].Tag = -1 then
1603 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1613 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1614 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1615 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1617 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1619 PI: TProcessInformation;
1623 Path := '"' + AppPath + '"';
1625 Path := Path + ' ' + Param;
1627 SI.Cb := SizeOf(Si);
1628 SI.lpReserved := nil;
1629 SI.lpDesktop := nil;
1632 SI.cbReserved2 := 0;
1633 SI.lpReserved2 := nil;
1635 if Windows.CreateProcess(nil,
1646 CloseHandle(PI.hProcess);
1652 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1653 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1654 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1656 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1660 params : TStringList;
1664 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1665 gbtUserApp, gbtAuto:
1666 if (Setting.URLApp) then begin
1667 if (FileExists(Setting.URLAppFile)) then begin
1668 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1670 //
\8bN
\93®
\83p
\83\89\83\81\81[
\83^
\95t
\82«
\91Î
\8dô
1672 params := TStringList.Create;
1674 params.Delimiter := ' ';
1675 params.DelimitedText := Setting.URLAppFile;
1676 for i := 0 to params.Count - 1 do begin
1677 path := TrimLeft(path + ' ' + params[i]);
1678 if (FileExists(path)) then begin
1680 for j := i + 1 to params.Count - 1 do begin
1681 arg := arg + ' ' + params[j];
1686 if i < params.Count then begin
1687 GikoSys.CreateProcess(path, arg + ' ' + URL);
1689 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1696 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1701 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1702 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1703 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1705 function TGikoSys.HTMLDecode(const AStr: String): String;
1707 Sp, Rp, Cp, Tp: PChar;
1712 SetLength(Result, Length(AStr));
1714 Rp := PChar(Result);
1717 while Sp^ <> #0 do begin
1723 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1729 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1733 while (Sp^ <> ';') and (Sp^ <> #0) do
1740 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1748 Num := IsNumeric(Copy(Tp, 1, 1));
1749 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1750 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1754 SetString(S, Tp, Sp - Tp);
1759 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1760 //[Cp^ + Sp^, Cp - PChar(AStr)])
1770 // on E:EConvertError do
1771 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1772 // [Cp^ + Sp^, Cp - PChar(AStr)])
1774 SetLength(Result, Rp - PChar(Result));
1778 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1779 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1780 \return
\8eæ
\93¾
\82µ
\82½ URL
1782 function TGikoSys.GetHRefText(s: string): string;
1792 Index := AnsiPos('href', LowerCase(s));
1795 s := Trim(Copy(s, Index + 4, Length(s)));
1796 s := Trim(Copy(s, 2, Length(s)));
1798 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1799 //if Copy(s, 1, 1) = '"' then begin
1800 if s[1] = '"' then begin
1801 s := Trim(Copy(s, 2, Length(s)));
1804 Index := AnsiPos('"', s);
1805 if Index <> 0 then begin
1806 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1807 s := Copy(s, 1, Index - 1);
1809 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1810 Index := AnsiPos(' ', s);
1811 Index2 := AnsiPos('>', s);
1814 if Index > Index2 then
1817 s := Copy(s, 1, Index - 1)
1819 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1826 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1827 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1828 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1830 function TGikoSys.Is2chHost(Host: string): Boolean;
1832 HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
1838 if RightStr( Host, 1 ) = '/' then
1839 Host := Copy( Host, 1, Length( Host ) - 1 );
1840 OutputDebugString(pchar(HOST_NAME[0]));
1841 for i := 0 to Length(HOST_NAME) - 1 do begin
1842 // Len := Length(HOST_NAME[i]);
1843 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1844 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1852 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1853 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1854 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1855 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1856 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1857 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1858 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1860 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1870 Index := AnsiPos(READ_PATH, path);
1871 if Index <> 0 then begin
1872 s := Copy(path, Index + Length(READ_PATH), Length(path));
1874 Index := AnsiPos(HTML_READ_PATH, path);
1875 if Index <> 0 then begin
1876 s := Copy(path, Index + Length(HTML_READ_PATH), Length(path));
1879 if Index <> 0 then begin
1880 if (Length(s) > 0) and (s[1] = '/') then
1882 BBSID := GetTokenIndex(s, '/', 0);
1883 BBSKey := GetTokenIndex(s, '/', 1);
1886 Result := (BBSID <> '') or (BBSKey <> '');
1889 Index := AnsiPos(KAKO_PATH, path);
1890 if Index <> 0 then begin
1891 s := Copy(path, 2, Length(path));
1892 BBSID := GetTokenIndex(s, '/', 0);
1893 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1894 BBSID := GetTokenIndex(s, '/', 1);
1895 BBSKey := ChangeFileExt(Document, '');
1896 Result := (BBSID <> '') or (BBSKey <> '');
1899 Index := AnsiPos('read.cgi?', URL);
1900 if Index <> 0 then begin
1901 SList := TStringList.Create;
1904 // s := HTMLDecode(Document);
1905 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1906 BBSID := SList.Values['bbs'];
1907 BBSKey := SList.Values['key'];
1908 Result := (BBSID <> '') or (BBSKey <> '');
1920 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1921 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1922 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1923 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1925 http://2ch.net/
\92\86\97ª/32-50 \n
1926 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1928 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1930 START_NAME : array[0..1] of String = ('st=', 'start=');
1931 END_NAME : array[0..1] of String = ('to=', 'end=');
1932 RES_NAME : array[0..0] of String = ('res=');
1938 bufList : TStringList;
1939 i, j, idx : Integer;
1941 URL := Trim(LowerCase(URL));
1942 for i := 0 to Length(START_NAME) -1 do begin
1943 idx := AnsiPos(START_NAME[i], URL);
1944 if (idx <> 0) then begin
1947 idx := AnsiPos(END_NAME[i], URL);
1948 if (idx <> 0) then begin
1954 if (idx <> 0) then begin
1955 idx := AnsiPos('?', URL);
1956 if (idx = 0) then begin
1957 idx := LastDelimiter('/', URL);
1961 bufList := TStringList.Create();
1963 bufList.Delimiter := '&';
1964 bufList.DelimitedText := Copy(URL, idx + 1, Length(URL));
1965 for i := 0 to bufList.Count - 1 do begin
1967 //
\8aJ
\8en
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
1968 if (stRes = 0) then begin
1969 for j := 0 to Length(START_NAME) - 1 do begin
1970 idx := AnsiPos(START_NAME[j], bufList[i]);
1971 if (idx = 1) then begin
1972 convBuf := Copy(bufList[i], idx + Length(START_NAME[j]), Length(bufList[i]));
1973 stRes := StrToInt64Def( convBuf, 0 );
1978 //
\8fI
\97¹
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
1979 if (convBuf = '') and (endRes = 0) then begin
1980 for j := 0 to Length(END_NAME) - 1 do begin
1981 idx := AnsiPos(END_NAME[j], bufList[i]);
1982 if (idx = 1) then begin
1983 convBuf := Copy(bufList[i], idx + Length(END_NAME[j]), Length(bufList[i]));
1984 endRes := StrToInt64Def( convBuf, 0 );
1989 //
\83\8c\83X
\94Ô
\82Ì
\8c\9f\8dõ
1990 if ((stRes = 0) and (endRes = 0) and (convBuf = '')) then begin
1991 for j := 0 to Length(RES_NAME) - 1 do begin
1992 idx := AnsiPos(RES_NAME[j], bufList[i]);
1993 if (idx = 1) then begin
1994 convBuf := Copy(bufList[i], idx + Length(RES_NAME[j]), Length(bufList[i]));
1995 stRes := StrToInt64Def( convBuf, 0 );
2003 if (stRes <> 0) and (endRes = 0) then begin
2004 endRes := stRes + MAX_POPUP_RES;
2005 end else if (stRes = 0) and (endRes <> 0) then begin
2006 stRes := endRes - MAX_POPUP_RES;
2007 if stRes < 1 then begin
2015 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
2016 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
2017 if Length(buf) > 0 then begin
2018 if AnsiPos('-', buf) = 1 then begin
2023 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2024 convBuf := Copy( buf, 1, ps );
2025 if convBuf <> '' then begin
2026 endRes := StrToInt64Def(convBuf, 0);
2028 if endRes <> 0 then begin
2029 stRes := endRes - MAX_POPUP_RES;
2036 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2038 convBuf := Copy( buf, 1, ps );
2039 if convBuf <> '' then begin
2040 stRes := StrToInt64(convBuf);
2044 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
2045 convBuf := Copy( buf, 1, ps );
2046 if convBuf <> '' then begin
2047 endRes := StrToInt64Def(convBuf, 0);
2062 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
2063 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
2064 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
2066 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
2071 // convBuf : String;
2082 URL := Trim(LowerCase(URL));
2087 Result.FFirst := False;
2088 Result.FStBegin := False;
2089 Result.FToEnd := False;
2090 Result.FDone := False;
2091 Result.FNoParam := False;
2095 if URL[length(URL)] = '\' then
2097 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2098 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2099 s := Copy(URL, RStart + RLength - 1, Length(URL));
2101 //
\95W
\8f\80\8f\91\8e®
2102 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2103 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2104 FAWKStr.RegExp := '/test/read.(cgi|html)/.+/[0-9]+/?.*';
2105 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2106 s := Copy(s, 15, Length(s));
2108 SList := TStringList.Create;
2111 FAWKStr.RegExp := '/';
2112 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2113 Result.FBBS := SList[1];
2114 Result.FKey := SList[2];
2115 if SList.Count >= 4 then
2119 Result.FNoParam := true;
2125 FAWKStr.LineSeparator := mcls_CRLF;
2126 FAWKStr.RegExp := '-';
2127 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2128 Result.FFirst := True;
2130 FAWKStr.RegExp := 'l[0-9]+';
2131 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2132 Result.FFirst := True;
2134 for i := 0 to SList.Count - 1 do begin
2135 if Trim(SList[i]) = '' then begin
2137 Result.FStBegin := True;
2138 if i = (SList.Count - 1) then
2139 Result.FToEnd := True;
2140 end else if IsNumeric(SList[i]) then begin
2141 wkInt := StrToInt(SList[i]);
2142 wkMax := Max(wkMax, wkInt);
2146 wkMin := Min(wkMin, wkInt);
2147 end else if Trim(SList[i]) = 'n' then begin
2148 Result.FFirst := True;
2150 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2151 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2152 if Copy(SList[i], 1, 1) = 'n' then
2153 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2155 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2156 Result.FFirst := True;
2157 wkMax := Max(wkMax, wkInt);
2161 wkMin := Min(wkMin, wkInt);
2165 if Result.FStBegin and (not Result.FToEnd) then
2167 else if (not Result.FStBegin) and Result.FToEnd then
2169 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2170 Result.FSt := wkMin;
2171 Result.FTo := wkMax;
2173 //Result.FSt := wkMin;
2174 //Result.FTo := wkMax;
2180 Result.FDone := True;
2184 //
\90Vkako
\8f\91\8e®
2185 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2186 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2187 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2188 SList := TStringList.Create;
2191 FAWKStr.RegExp := '/';
2192 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2193 Result.FBBS := SList[1];
2194 Result.FKey := ChangeFileExt(SList[5], '');
2195 Result.FFirst := True;
2201 Result.FDone := True;
2205 //
\8b\8ckako
\8f\91\8e®
2206 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2207 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2208 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2209 SList := TStringList.Create;
2212 FAWKStr.RegExp := '/';
2213 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2214 Result.FBBS := SList[1];
2215 Result.FKey := ChangeFileExt(SList[4], '');
2216 Result.FFirst := True;
2222 Result.FDone := True;
2226 //log
\8by
\82Ñlog2
\8f\91\8e®
2227 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2228 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2229 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2230 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2231 SList := TStringList.Create;
2234 FAWKStr.RegExp := '/';
2235 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2236 Result.FBBS := SList[2];
2237 Result.FKey := ChangeFileExt(SList[5], '');
2238 Result.FFirst := True;
2244 Result.FDone := True;
2249 //
\8b\8cURL
\8f\91\8e®
2250 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2251 FAWKStr.RegExp := '/test/read\.cgi\?';
2252 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2253 s := Copy(s, 16, Length(s));
2254 SList := TStringList.Create;
2257 FAWKStr.RegExp := '&';
2258 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2259 Result.FFirst := True;
2260 for i := 0 to SList.Count - 1 do begin
2261 if Pos('bbs=', SList[i]) = 1 then begin
2262 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2263 end else if Pos('key=', SList[i]) = 1 then begin
2264 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2265 end else if Pos('st=', SList[i]) = 1 then begin
2266 wk := Copy(SList[i], 4, Length(SList[i]));
2267 if IsNumeric(wk) then
2268 Result.FSt := StrToInt(wk)
2269 else if wk = '' then
2270 Result.FStBegin := True;
2271 end else if Pos('to=', SList[i]) = 1 then begin
2272 wk := Copy(SList[i], 4, Length(SList[i]));
2273 if IsNumeric(wk) then
2274 Result.FTo := StrToInt(wk)
2275 else if wk = '' then
2276 Result.FToEnd := True;
2277 end else if Pos('nofirst=', SList[i]) = 1 then begin
2278 Result.FFirst := False;
2287 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2288 Result.FDone := True;
2296 \brief URI
\82ð
\95ª
\89ð
2297 \param URL
\95ª
\89ð
\82·
\82é URI
2298 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2299 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2300 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2301 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2302 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2303 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2305 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2315 URI := TIdURI.Create(URL);
2317 Protocol := URI.Protocol;
2320 Document := URI.Document;
2322 Bookmark := URI.Bookmark;
2329 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2330 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2332 function TGikoSys.GetVersionBuild: Integer;
2334 FixedFileInfo: PVSFixedFileInfo;
2335 VersionHandle, VersionSize: DWORD;
2336 pVersionInfo: Pointer;
2341 AppFile := Application.ExeName;
2342 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2343 if VersionSize = 0 then
2345 GetMem(pVersionInfo, VersionSize);
2347 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2348 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2349 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2351 FreeMem(pVersionInfo, VersionSize);
2356 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2357 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2358 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2360 \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
2361 \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
2362 \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
2363 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2365 \97á(
\90³
\8bK
\89»
\91O):\n
2366 http://
\92\86\97ª/ \n
2367 http://
\92\86\97ª/20-100
2369 (
\90³
\8bK
\89»
\8cã):\n
2370 http://
\92\86\97ª/l50
2372 function TGikoSys.GetBrowsableThreadURL(
2376 threadItem : TThreadItem;
2377 boardPlugIn : TBoardPlugIn;
2382 //=====
\83v
\83\89\83O
\83C
\83\93
2384 for i := Length( BoardGroups ) - 1 downto 1 do begin
2385 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2386 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2387 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2388 if board <> nil then begin
2389 boardPlugIn := BoardGroups[i].BoardPlugIn;
2390 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2391 Result := threadItem.URL;
2400 // 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¢
2403 if Length( Result ) = 0 then
2404 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2409 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2410 \param inURL
\83X
\83\8c\83b
\83h URL
2413 function TGikoSys.GetThreadURL2BoardURL(
2417 threadItem : TThreadItem;
2418 boardPlugIn : TBoardPlugIn;
2423 //=====
\83v
\83\89\83O
\83C
\83\93
2425 for i := Length( BoardGroups ) - 1 downto 1 do begin
2426 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2427 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2428 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2429 boardPlugIn := BoardGroups[i].BoardPlugIn;
2430 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2431 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2439 // 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¢
2442 if Length( Result ) = 0 then
2443 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2448 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2449 \param inURL
\83X
\83\8c\83b
\83h URL
2451 \see TGikoSys.GetThreadURL2BoardURL
2453 function TGikoSys.Get2chThreadURL2BoardURL(
2457 Protocol, Host, Path, Document, Port, Bookmark : string;
2458 BBSID, BBSKey : string;
2462 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2463 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2465 foundPos := Pos( '/test/read.cgi', inURL );
2466 if {(Is2chHost(Host)) and} (foundPos > 0) then
2467 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2469 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2474 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2475 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2476 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2477 \see TGikoSys.GetBrowsableThreadURL
2479 function TGikoSys.Get2chBrowsableThreadURL(
2483 Protocol, Host, Path, Document, Port, Bookmark : string;
2484 BBSID, BBSKey : string;
2488 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2491 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2492 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2493 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2495 if Is2chHost( Host ) then begin
2496 Result := Protocol + '://' + Host +
2497 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2499 if foundPos > 0 then
2500 Result := Copy( inURL, 1, foundPos ) +
2501 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2503 Result := Protocol + '://' + Host +
2504 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2511 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2512 \param inBoard
\94Â URL
2513 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2514 \return
\83X
\83\8c\83b
\83h URL
2516 function TGikoSys.Get2chBoard2ThreadURL(
2524 server := UrlToServer( inBoard.URL );
2525 //if Is2chHost( server ) then
2526 if inBoard.Is2ch then
2527 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2529 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2534 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2536 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2538 procedure TGikoSys.ListBoardFile;
2540 boardFileList : TStringList;
2542 sCategory : TCategory;
2546 for i := 0 to Length( BBSs ) - 1 do
2550 SetLength( BBSs, 0 );
2553 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2554 if FileExists( GikoSys.GetBoardFileName ) then begin
2555 SetLength( BBSs, l + 1 );
2556 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2557 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2561 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2562 SetLength( BBSs, l + 1 );
2563 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2564 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2568 // Board
\83t
\83H
\83\8b\83_
2569 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2570 BoardFileList := TStringList.Create;
2572 BoardFileList.BeginUpdate;
2573 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*.txt', BoardFileList, True, True );
2574 BoardFileList.EndUpdate;
2575 SetLength( BBSs, l + BoardFileList.Count );
2576 for i := BoardFileList.Count - 1 downto 0 do begin
2577 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2578 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2586 //
\93Á
\8eê
\97p
\93rBBS
\90¶
\90¬
2587 //
\8aù
\82É
\91¶
\8dÝ
\82·
\82é
\8fê
\8d\87\82Í
\8dí
\8f\9c\82·
\82é
2588 DestorySpecialBBS(BoardGroup.SpecialBBS);
2589 SpecialBBS := TBBS.Create('');
2590 SpecialBBS.Title := '
\93Á
\8eê
\97p
\93r(
\94ñ
\95\
\8e¦)';
2591 sCategory := TCategory.Create;
2593 sCategory.Title := '
\93Á
\8eê
\97p
\93r(
\94ñ
\95\
\8e¦)';
2594 SpecialBBS.Add(sCategory);
2595 BoardGroup.SpecialBoard := TSpecialBoard.Create(nil, 'http://localhost/gikonavi/special/index.html');
2596 BoardGroup.SpecialBoard.Title := '
\83^
\83u
\88ê
\97\97';
2597 BoardGroup.SpecialBoard.IsThreadDatRead := True;
2598 sCategory.Add(BoardGroup.SpecialBoard);
2602 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2603 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2605 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2610 boardFile : TStringList;
2611 CategoryList : TStringList;
2612 BoardList : TStringList;
2613 Category : TCategory;
2617 // RoundItem : TRoundItem;
2619 i, iBound : Integer;
2620 j, jBound : Integer;
2621 k, kBound : Integer;
2624 if not FileExists( bbs.FilePath ) then
2628 ini := TMemIniFile.Create('');
2629 boardFile := TStringList.Create;
2632 boardFile.LoadFromFile( bbs.FilePath );
2634 ini.SetStrings( boardFile );
2635 CategoryList := TStringList.Create;
2636 BoardList := TStringList.Create;
2638 ini.ReadSections( CategoryList );
2640 iBound := CategoryList.Count - 1;
2641 for i := 0 to iBound do begin
2642 ini.ReadSection( CategoryList[i], BoardList );
2643 Category := TCategory.Create;
2644 Category.No := i + 1;
2645 Category.Title := CategoryList[i];
2647 jBound := BoardList.Count - 1;
2648 for j := 0 to jBound do begin
2650 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2651 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2652 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2653 //=====
\83v
\83\89\83O
\83C
\83\93
2655 kBound := Length(BoardGroups) - 1;
2656 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2657 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2658 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2659 if not BoardGroups[k].Find(inistr, p) then begin
2660 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2661 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2662 if not BoardGroups[k].Find(tmpstring, p) then begin
2664 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2665 BoardGroups[k].AddObject(tmpstring, Board);
2666 Category.Add(Board);
2668 //
\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é
2672 Board := TBoard(BoardGroups[k].Objects[p]);
2673 if Board.ParentCategory <> Category then
2674 Category.Add(Board);
2678 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2679 BoardGroups[k].AddObject(tmpstring, Board);
2680 Category.Add(Board);
2682 //
\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é
2687 Board := TBoard(BoardGroups[k].Objects[p]);
2688 if Board.ParentCategory <> Category then
2689 Category.Add(Board);
2696 // 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¢
2699 if (Board = nil) then begin
2700 if not BoardGroups[0].Find(inistr,p) then begin
2701 Board := TBoard.Create( nil, inistr );
2702 BoardGroups[0].AddObject(inistr, Board);
2703 Category.Add(Board);
2705 Board := TBoard(BoardGroups[0].Objects[p]);
2706 if Board.ParentCategory <> Category then
2707 Category.Add(Board);
2711 if (Board.Multiplicity = 0) then begin
2714 Board.Multiplicity := 1;
2715 Board.Title := BoardList[j];
2716 Board.RoundDate := ZERO_DATE;
2721 Board.Multiplicity := Board.Multiplicity + 1;
2726 bbs.Add( Category );
2731 bbs.IsBoardFileRead := True;
2744 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2745 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2747 function TGikoSys.GetUnknownCategory : TCategory;
2749 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2752 if Length( BBSs ) < 2 then begin
2757 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2758 if Result = nil then begin
2759 Result := TCategory.Create;
2760 Result.Title := UNKNOWN_CATEGORY;
2761 BBSs[ 1 ].Add( Result );
2767 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2768 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2770 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2772 category : TCategory;
2774 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2777 category := GetUnknownCategory;
2778 if category = nil then begin
2781 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2782 if Result = nil then begin
2783 Result := TBoard.Create( inPlugIn, inURL );
2784 Result.Title := UNKNOWN_BOARD;
2785 category.Add( Result );
2792 function TGikoSys.GetSambaFileName : string;
2794 Result := Setting.GetSambaFileName;
2797 \brief
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82Ö
\82Ì
\83A
\83\93\83J
\81[
\97pHTML
\8dì
\90¬
2798 \param Numbers
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86
2799 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2800 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç1
\88È
\8fã
2801 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2803 function TGikoSys.CreateResAnchor(
2804 var Numbers: TStringList; ThreadItem: TThreadItem;
2805 limited: Integer):string;
2809 ResLink : TResLinkRec;
2811 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2813 Res.FType := glt2chNew;
2816 if (Numbers <> nil) and (Numbers.Count > 0) then begin
2817 if (limited > 0) and (Numbers.Count > limited) then begin
2818 for i := Numbers.Count - limited to Numbers.Count - 1 do begin
2819 Res.FBody := Res.FBody + '>' + Numbers[i] + ' ';
2822 for i := 0 to Numbers.Count - 1 do begin
2823 Res.FBody := Res.FBody + '>' + Numbers[i] + ' ';
2826 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2827 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2828 HTMLCreater.ConvRes(@Res, @ResLink, false);
2829 Result := Res.FBody;
2834 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2835 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2836 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2837 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2839 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2842 ReadList: TStringList;
2844 boardPlugIn : TBoardPlugIn;
2846 procedure CheckSameID(const AID:String; const Target: String; no: Integer);
2850 pos := AnsiPos('id:', LowerCase(Target));
2851 if (pos > 0) then begin
2852 if(AnsiPos(AID, Copy(Target, pos-1, Length(Target))) > 0) then begin
2853 body.Add(IntToStr(no));
2856 if(AnsiPos(AID, Target) > 0) then begin
2857 body.Add(IntToStr(no));
2862 if (not IsNoValidID(AID)) and
2863 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2864 //if ThreadItem.IsBoardPlugInAvailable then begin
2865 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2866 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2867 //boardPlugIn := ThreadItem.BoardPlugIn;
2868 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2870 for i := 0 to threadItem.Count - 1 do begin
2872 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2873 CheckSameID(AID, Res.FDateTime, i+1);
2876 ReadList := TStringList.Create;
2878 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2879 for i := 0 to ReadList.Count - 1 do begin
2880 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2881 CheckSameID(AID, Res.FDateTime, i+1);
2891 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2892 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2893 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2894 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2896 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2900 AID := GetResID(AIDNum, ThreadItem);
2901 if not IsNoValidID(AID) then begin
2902 GetSameIDRes(AID, ThreadItem, body);
2906 \brief
\93\8a\8de ID
\8eæ
\93¾
2907 \param AIDNum
\93\8a\8de
\83\8c\83X
\94Ô
\8d\86
2908 \param ThreadItem
\93\8a\8de
\83X
\83\8c\83b
\83h
2909 \param body OUT:
\93\8a\8deID
2911 function TGikoSys.GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
2914 boardPlugIn : TBoardPlugIn;
2917 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2918 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2919 //if ThreadItem.IsBoardPlugInAvailable then begin
2920 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2921 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2922 //boardPlugIn := ThreadItem.BoardPlugIn;
2923 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2924 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2926 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2928 Result := ExtructResID(Res.FDateTime);
2932 \brief
\83\8c\83X
\82Ì
\8e\9e\8d\8f\95\94\82©
\82çID
\82ð
\92\8a\8fo
\82·
\82é
2933 \param ADateStr
\8e\9e\8d\8f\95\94\82Ì
\95¶
\8e\9a\97ñ
2934 \return ID(ID
\82Æ
\82Ý
\82È
\82¹
\82é
\95\94\95ª
\82ª
\82È
\82¢
\82Æ
\82«
\82Í
\8bó
\95¶
\8e\9a\97ñ)
2936 function TGikoSys.ExtructResID(ADateStr: String): String;
2938 stlist : TStringList;
2941 if AnsiPos('id', AnsiLowerCase(ADateStr)) > 0 then begin
2942 Result := Copy(ADateStr, AnsiPos('id', AnsiLowerCase(ADateStr)), Length(ADateStr));
2943 if AnsiPos(' ', Result) > 0 then begin
2944 Result := Copy(Result, 1, AnsiPos(' ', Result) - 1);
2946 Result := ' ' + Result;
2948 stlist := TStringList.Create;
2950 stList.Delimiter := ' ';
2951 stList.DelimitedText := ADateStr;
2952 //
\93ú
\95t
\8e\9e\8d\8f ID
\91¼
\81@
\82Æ
\8cÅ
\92è
\82Å
\8dl
\82¦
\82é
2953 if (stList.Count >= 3) then begin
2954 if Length(stList[3 - 1]) >= 7 then begin
2955 Result := stList[3 - 1];
2965 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
2966 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
2967 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
2969 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
2972 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
2973 Bayesian.CountWord( text, wordCount );
2978 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
2979 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
2980 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
2981 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
2982 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
2983 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
2984 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
2986 \91S
\82Ä
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82·
\82é
\82í
\82¯
\82Å
\82Í
\82 \82è
\82Ü
\82¹
\82ñ
\81B\n
2987 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
2989 \8eå
\82É
\83X
\83p
\83\80\82Æ
\83n
\83\80\82ð
\90Ø
\82è
\91Ö
\82¦
\82é
\82½
\82ß
\82É Forget -> Learn
\82Ì
\8f\87\82Å
\8eg
\97p
\82µ
\82Ü
\82·
\81B
2991 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
2994 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
2995 Bayesian.Forget( wordCount, isSpam );
3000 \brief
\83X
\83p
\83\80:
\8aw
\8fK
3001 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
3002 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
3004 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
3007 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
3008 Bayesian.Learn( wordCount, isSpam );
3013 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
3014 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
3015 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é(SpamCountWord
\82Æ
\93¯
\93\99)
3016 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
3018 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3021 case Setting.SpamFilterAlgorithm of
3022 gsfaNone: Result := 0;
3023 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3024 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3025 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3032 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3033 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3035 [
\83c
\81[
\83\8b]
\83\81\83j
\83\85\81[-[
\83I
\83v
\83V
\83\87\83\93]-[CSS
\82Æ
\83X
\83L
\83\93]
\83^
\83u
\82Ì
3036 [
\83t
\83H
\83\93\83g
\82ð
\8ew
\92è], [
\94w
\8ci
\90F
\82ð
\8ew
\92è]
\82É
\89\88\82Á
\82½ CSS
\82ð
\90¶
\90¬
\82µ
\82Ü
\82·
\81B
3038 function TGikoSys.SetUserOptionalStyle(): string;
3041 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3042 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3043 if GikoSys.Setting.BrowserFontSize <> 0 then
3044 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3045 if GikoSys.Setting.BrowserFontColor <> -1 then
3046 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3047 if GikoSys.Setting.BrowserBackColor <> -1 then
3048 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3049 case GikoSys.Setting.BrowserFontBold of
3050 -1: Result := Result + 'font-weight:normal;';
3051 1: Result := Result + 'font-weight:bold;';
3053 case GikoSys.Setting.BrowserFontItalic of
3054 -1: Result := Result + 'font-style:normal;';
3055 1: Result := Result + 'font-style:italic;';
3060 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3061 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3062 \param ANum
\83\8c\83X
\94Ô
3063 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3064 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3066 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3069 BNum, BMark : string;
3071 p := AnsiPos('BE:', AnsiUpperCase(AID));
3073 BNum := Copy(AID, p, Length(AID));
3074 AID := Copy(AID, 1, p - 1);
3075 p := AnsiPos('-', BNum);
3077 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3078 BNum := Copy(BNum, 1, p - 1);
3081 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3082 + '" target=_blank>' + BMark + '</a>';
3088 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3089 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3090 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3092 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3094 Translation = '\VarFileInfo\Translation';
3095 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3097 BufSize, HWnd: DWORD;
3098 VerInfoBuf: Pointer;
3100 VerDataLen: Longword;
3103 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3104 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3105 if BufSize <> 0 then begin
3106 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3107 GetMem(VerInfoBuf, BufSize);
3109 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3110 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3111 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3113 if not (VerDataLen > 0) then
3114 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3116 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3117 //
\81¨'\StringFileInfo\027382\FileDescription'
3118 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3119 [IntToHex(Integer(VerData^) and $FFFF, 4),
3120 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3121 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3123 if VerDataLen > 0 then begin
3124 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3126 SetLength(result, VerDataLen);
3127 StrLCopy(PChar(result), VerData, VerDataLen);
3131 FreeMem(VerInfoBuf);
3137 \brief Load
\82³
\82ê
\82Ä
\82¢
\82é
\83v
\83\89\83O
\83C
\83\93\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\97ñ
\8b\93
3138 \return 1
\8ds1plugin
3140 function TGikoSys.GetPluginsInfo(): String;
3143 major, minor, revision : Cardinal;
3144 agent, release : String;
3146 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3149 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3150 for i := 0 to Length(BoardGroups) - 1 do begin
3151 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3152 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3153 if BoardGroups[i].BoardPlugIn <> nil then begin
3154 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3157 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3159 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3165 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3166 function TGikoSys.GetIEVersion: string;
3170 R := TRegistry.Create;
3172 //
\93Ç
\82Ý
\8eæ
\82è
\90ê
\97p
\82É
\82µ
\82È
\82¢
\82Æ
\81A
\90§
\8cÀUSER
\82Æ
\82©
\82Ì
\8fê
\8d\87\81A
\8aJ
\82¯
\82È
\82¢
\82Ý
\82½
\82¢
3173 R.Access := KEY_EXECUTE;
3174 R.RootKey := HKEY_LOCAL_MACHINE;
3175 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3177 Result := R.ReadString('version');
3179 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3186 //! main
\83t
\83H
\81[
\83\80\82Ì
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ÌIni
\83t
\83@
\83C
\83\8b\96¼
3187 function TGikoSys.GetMainKeyFileName : String;
3189 Result := Setting.GetMainKeyFileName;
3191 //! Editor
\83t
\83H
\81[
\83\80\82Ì
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ÌIni
\83t
\83@
\83C
\83\8b\96¼
3192 function TGikoSys.GetEditorKeyFileName: String;
3194 Result := Setting.GetEditorKeyFileName;
3196 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3197 function TGikoSys.GetInputAssistFileName: String;
3199 Result := Setting.GetInputAssistFileName;
3201 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3202 procedure TGikoSys.SetGikoMessage;
3204 if FGikoMessage = nil then begin
3205 FGikoMessage := TGikoMessage.Create;
3210 if (Setting.GengoSupport) then begin
3212 if (FileExists(Setting.GetLanguageFileName)) then begin
3213 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3220 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3221 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3224 if FGikoMessage <> nil then begin
3225 Result := FGikoMessage.GetMessage(MesType);
3229 //Tue, 17 Dec 2002 12:18:07 GMT
\81¨ TDateTime
\82Ö
3230 //MonaUtils
\82©
\82ç
\88Ú
\93®
3231 function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime;
3232 function StrMonthToMonth(const s: string): integer;
3234 m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
3239 for i := Low(m) to High(m) do begin
3240 if (SameText(s, m[i])) then begin
3247 wDay, wMonth, wYear: word;
3248 wHour, wMinute, wSecond: word;
3252 wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0);
3253 wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2));
3254 wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0);
3255 sTime := ChooseString(DateStr, ' ', 4);
3256 wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0);
3257 wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0);
3258 wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0);
3259 d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0);
3262 //MonaUtils
\82©
\82ç
\88Ú
\93®
3263 //!
\82 \82é
\83Z
\83p
\83\8c\81[
\83^
\82Å
\8bæ
\90Ø
\82ç
\82ê
\82½
\95¶
\8e\9a\97ñ
\82©
\82ç
\82\8e\94Ô
\96Ú
\82Ì
\95¶
\8e\9a\97ñ
\82ð
\8eæ
\82è
\8fo
\82·
3264 function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string;
3270 for i := 0 to Index - 1 do begin
3271 if (AnsiPos(Separator, S) = 0) then S := ''
3272 else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S));
3274 p := AnsiPos(Separator, S);
3275 if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S;
3277 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
3278 procedure TGikoSys.RestoreThreadData(Board : TBoard);
3280 SECTION = 'Setting';
3282 TmpFileList : TStringList;
3285 ThreadItem : TThreadItem;
3286 Boardpath, tmpStr : string;
3288 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
3290 TmpFileList := TStringList.Create;
3291 TmpFileList.Sorted := True;
3292 TmpFileList.BeginUpdate;
3294 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
3295 GetFileList(Boardpath, '*.tmp', TmpFileList, False);
3296 TmpFileList.EndUpdate;
3297 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
3298 for i := TmpFileList.Count - 1 downto 0 do begin
3299 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
3300 if ThreadItem <> nil then begin
3301 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
3303 tmpStr := ini.ReadString(SECTION, 'RoundDate', DateTimeToStr(ZERO_DATE));
3304 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
3306 tmpStr := ini.ReadString(SECTION, 'LastModified', DateTimeToStr(ZERO_DATE));
3307 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
3308 ThreadItem.Count := ini.ReadInteger(SECTION, 'Count', 0);
3309 ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
3311 ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
3312 ThreadItem.IsLogFile := FileExists(ThreadItem.GetThreadFileName);
3313 if(ThreadItem.Size = 0) and (ThreadItem.IsLogFile) then begin
3315 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
3320 //
\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ã
3321 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
3322 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
3323 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
3324 ThreadItem.ScrollTop := ini.ReadInteger(SECTION, 'ScrollTop', 0);
3325 ThreadItem.AllResCount := ini.ReadInteger(SECTION, 'AllResCount', ThreadItem.Count);
3326 ThreadItem.NewResCount := ini.ReadInteger(SECTION, 'NewResCount', 0);
3327 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger(SECTION, 'AgeSage', Ord(gasNone)));
3331 DeleteFile(Boardpath + TmpFileList[i]);
3340 \brief User32.dll
\82ª
\97\98\97p
\82Å
\82«
\82é
\82©
3341 \return Boolean
\97\98\97p
\82Å
\82«
\82é
\8fê
\8d\87\82ÍTrue
3343 function TGikoSys.CanUser32DLL: Boolean;
3351 hUser32 := LoadLibrary('User32.dll');
3352 if hUser32 <> 0 then begin
3359 FreeLibrary(hUser32);
3363 \brief OE
\88ø
\97p
\95\84\8eæ
\93¾
3364 \return OE
\82Ì
\88ø
\97p
\95\84\81i
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87\82Í'>')
3366 function TGikoSys.GetOEIndentChar : string;
3369 Identities : string;
3372 DEFAULT_CHAR = '> ';
3373 OE_MAIL_PATH = '\Software\Microsoft\Outlook Express\5.0\Mail';
3374 INDENT_CHAR = 'Indent Char';
3377 Result := DEFAULT_CHAR;
3378 regKey := TRegistry.Create;
3381 regKey.RootKey := HKEY_CURRENT_USER;
3382 if not regKey.OpenKey( 'Identities', False ) then
3384 Identities := regKey.ReadString( 'Default User ID' );
3385 if Identities = '' then
3387 if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then
3389 IndentChar := regKey.ReadInteger( INDENT_CHAR );
3390 Result := Char( IndentChar ) + ' ';
3398 //!
\92u
\8a·
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3399 function TGikoSys.GetReplaceFileName: String;
3401 Result := Setting.GetReplaceFileName;
3403 //!
\83v
\83\8c\83r
\83\85\81[
\8ag
\92£
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\8eæ
\93¾
3404 function TGikoSys.GetExtpreviewFileName: String;
3406 Result := Setting.GetExtprevieFileName;
3409 //!
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\82Ì
\83X
\83\8c\83b
\83h
\8dì
\90¬
\93ú
\82Ì
\8eæ
\93¾
3410 function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime;
3415 //
\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
3416 tmp := ChangeFileExt(FileName, '');
3417 if AnsiPos('_', tmp) <> 0 then
3418 if AnsiPos('_', tmp) > 9 then
3419 tmp := Copy(tmp, 1, AnsiPos('_', tmp)-1)
3421 Delete(tmp, AnsiPos('_', tmp), 1);
3423 if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
3424 Insert('1', tmp, 1);
3426 unixtime := StrToInt64Def(tmp, ZERO_DATE);
3427 Result := UnixToDateTime(unixtime) + OffsetFromUTC;
3430 procedure TGikoSys.ShowRefCount(msg: String; unk: IUnknown);
3436 if not Assigned(unk) then
3442 count := unk._Release;
3444 Writeln(msg + ' RefCount=' + IntToStr(count));
3446 Writeln(msg + ' RefCount=exception!!');
3452 GikoSys := TGikoSys.Create;
3455 if GikoSys <> nil then begin
3456 FreeAndNil(GikoSys);