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 MsgBox(Msg: string; Title: string; Flags: Longint): integer; overload;
131 // function MsgBox(Handle: THandle; Msg: string; Title: string; Flags: Longint): integer; overload;
132 function IsNumeric(s: string): boolean;
133 function IsFloat(s: string): boolean;
134 function DirectoryExistsEx(const Name: string): Boolean;
135 function ForceDirectoriesEx(Dir: string): Boolean;
136 // function GetVersion: string;
138 function GetBoardFileName: string;
139 function GetCustomBoardFileName: string;
140 function GetHtmlTempFileName: string;
141 function GetAppDir: string;
142 function GetTempFolder: string;
143 function GetSentFileName: string;
144 function GetConfigDir: string;
145 function GetSkinDir: string;
146 function GetSkinHeaderFileName: string;
147 function GetSkinFooterFileName: string;
148 function GetSkinResFileName: string;
149 function GetSkinNewResFileName: string;
150 function GetSkinBookmarkFileName: string;
151 function GetSkinNewmarkFileName: string;
152 function GetStyleSheetDir: string;
153 function GetOutBoxFileName: string;
154 function GetUserAgent: string;
155 function GetSambaFileName : string;
157 function GetMainKeyFileName : String;
158 function GetEditorKeyFileName: String;
159 function GetInputAssistFileName: String;
160 procedure ReadSubjectFile(Board: TBoard);
161 procedure CreateThreadDat(Board: TBoard);
162 procedure WriteThreadDat(Board: TBoard);
163 function ParseIndexLine(Line: string): TIndexRec;
164 procedure GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean); overload;
165 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¢
166 procedure GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
168 function DivideSubject(Line: string): TSubjectRec;
169 property Setting: TSetting read FSetting write FSetting;
170 property Dolib: TDolib read FDolib write FDolib;
172 function UrlToID(url: string): string;
173 function UrlToServer(url: string): string;
175 function StrTokFirst(const s:string; const sep:TStrTokSeparator; var Rec:TStrTokRec):string;
176 function StrTokNext(const sep:TStrTokSeparator; var Rec:TStrTokRec): string;
178 function GetFileSize(FileName : string) : longint;
179 function GetFileLineCount(FileName : string): longint;
180 function IntToDateTime(val: Int64): TDateTime;
181 function DateTimeToInt(ADate: TDateTime): Int64;
183 function ReadThreadFile(FileName: string; Line: Integer): string;
185 procedure MenuFont(Font: TFont);
187 function RemoveToken(var s:string; const delimiter:string):string;
188 function GetTokenIndex(s: string; delimiter: string; index: Integer): string;
190 function GetShortName(const LongName: string; ALength: integer): string;
191 function BoolToInt(b: Boolean): Integer;
192 function IntToBool(i: Integer): Boolean;
193 function GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
194 procedure LoadKeySetting(ActionList: TActionList; FileName: String);
195 procedure SaveKeySetting(ActionList: TActionList; FileName: String);
196 procedure CreateProcess(const AppPath: string; const Param: string);
197 procedure OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
198 function HTMLDecode(const AStr: String): String;
199 function GetHRefText(s: string): string;
200 function Is2chHost(Host: string): Boolean;
201 function Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
202 function Parse2chURL2(URL: string): TPathRec;
203 procedure ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
204 function GetVersionBuild: Integer;
205 function GetBrowsableThreadURL( inURL : string ) : string;
206 function GetThreadURL2BoardURL( inURL : string ) : string;
207 function Get2chThreadURL2BoardURL( inURL : string ) : string;
208 function Get2chBrowsableThreadURL( inURL : string ) : string;
209 function Get2chBoard2ThreadURL( inBoard : TBoard; inKey : string ) : string;
210 procedure ListBoardFile;
211 procedure ReadBoardFile( bbs : TBBS );
213 function GetUnknownCategory : TCategory;
214 function GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
216 procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
218 property Bayesian : TGikoBayesian read FBayesian write FBayesian;
219 function GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string; overload;
220 function GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string; overload;
221 procedure GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList); overload;
222 procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
223 function GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer; overload;
224 function GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer; overload;
227 procedure SpamCountWord( const text : string; wordCount : TWordCount );
228 //!
\8aw
\8fK
\83N
\83\8a\83A
229 procedure SpamForget( wordCount : TWordCount; isSpam : Boolean );
230 //!
\83X
\83p
\83\80\8aw
\8fK
231 procedure SpamLearn( wordCount : TWordCount; isSpam : Boolean );
232 //!
\83X
\83p
\83\80\93x
\90\94
233 function SpamParse( const text : string; wordCount : TWordCount ) : Extended;
234 //
\88ø
\90\94\82ª
\81A
\93ú
\95t
\82Å
\82à
\8e\9e\8d\8f\82Å
\82à
\82È
\82¢
\82±
\82Æ
\82ð
\92²
\82×
\82é
235 function NotDateorTimeString(const AStr : string): boolean;
237 //!
\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Á
238 function AddBeProfileLink(AID : string; ANum: Integer): string;
239 //!
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
240 function GetVersionInfo(KeyWord: TVerResourceKey): string;
241 //! Plugin
\82Ì
\8fî
\95ñ
\82Ì
\8eæ
\93¾
242 function GetPluginsInfo(): string;
243 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
244 function GetIEVersion: string;
245 function SetUserOptionalStyle(): string;
246 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
247 procedure SetGikoMessage;
248 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
249 function GetGikoMessage(MesType: TGikoMessageListType): String;
250 //! GMT
\82Ì
\8e\9e\8d\8f\82ðTDateTime
\82É
\95Ï
\8a·
\82·
\82é
251 function DateStrToDateTime(const DateStr: string): TDateTime;
257 //LENGTH_RESTITLE = 40;
258 ZERO_DATE: Integer = 25569;
259 BETA_VERSION_NAME_E = 'beta';
260 BETA_VERSION_NAME_J = 'ÊÞÀ';
262 BETA_VERSION_BUILD = ''; //!< debug
\94Å
\82È
\82Ç
263 APP_NAME = 'gikoNavi';
264 BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
270 Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils, Sort, YofUtils,
274 FOLDER_INDEX_VERSION = '1.01';
275 USER_AGENT = 'Monazilla';
276 DEFAULT_NGWORD_FILE_NAME : String = 'NGword.txt';
277 NGWORDs_DIR_NAME : String = 'NGwords';
279 READ_PATH: string = '/test/read.cgi/';
280 OLD_READ_PATH: string = '/test/read.cgi?';
281 KAKO_PATH: string = '/kako/';
283 KeyWordStr: array [TVerResourceKey] of String = (
297 // *************************************************************************
298 //! GikoSys
\83R
\83\93\83X
\83g
\83\89\83N
\83^
299 // *************************************************************************
300 constructor TGikoSys.Create;
302 FSetting := TSetting.Create;
303 FDolib := TDolib.Create;
304 FAWKStr := TAWKStr.Create(nil);
305 if DirectoryExists(GetConfigDir) = false then begin
306 CreateDir(GetConfigDir);
308 FAbon := TAbon.Create;
309 FAbon.IgnoreKana := FSetting.IgnoreKana;
310 FAbon.Setroot(GetConfigDir+NGWORDs_DIR_NAME);
312 FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
313 FAbon.SetNGResAnchor := FSetting.AddResAnchor;
314 FAbon.DeleteSyria := FSetting.DeleteSyria;
315 FAbon.Deleterlo := FSetting.AbonDeleterlo;
316 FAbon.Replaceul := FSetting.AbonReplaceul;
317 FAbon.AbonPopupRes := FSetting.PopUpAbon;
319 FSelectResFilter := TAbon.Create;
320 FSelectResFilter.IgnoreKana := True;
321 //
\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
322 FSelectResFilter.AbonString := '';
324 ResRange := FSetting.ResRange;
325 FVersion := Trim(GetVersionInfo(vrFileVersion));
326 FBayesian := TGikoBayesian.Create;
327 //FBoardURLList := TStringList.Create;
328 //
\83\81\83b
\83Z
\81[
\83W
\82Ì
\8dì
\90¬
329 FGikoMessage := TGikoMessage.Create;
332 // *************************************************************************
333 //! GikoSys
\83f
\83X
\83g
\83\89\83N
\83^
334 // *************************************************************************
335 destructor TGikoSys.Destroy;
338 FileList: TStringList;
340 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
349 FSelectResFilter.Free;
351 //FBoardURLList.Free;
352 //
\83e
\83\93\83|
\83\89\83\8aHTML
\82ð
\8dí
\8f\9c
353 FileList := TStringList.Create;
355 FileList.BeginUpdate;
356 GetFileList(GetTempFolder, '*.html', FileList, False, True);
358 for i := 0 to FileList.Count - 1 do begin
359 DeleteFile(FileList[i]);
368 \brief
\95¶
\8e\9a\97ñ
\90\94\8e\9a\83`
\83F
\83b
\83N
369 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
370 \return s
\82ª
\95\84\8d\86\95t
\82«
\90®
\90\94\82Æ
\82µ
\82Ä
\94F
\8e¯
\89Â
\94\
\82È
\82ç True
373 function TGikoSys.IsNumeric(s: string): boolean;
384 \brief
\95¶
\8e\9a\97ñ
\95\82\93®
\8f¬
\90\94\93_
\90\94\8e\9a\83`
\83F
\83b
\83N
385 \param s
\83`
\83F
\83b
\83N
\82·
\82é
\95¶
\8e\9a\97ñ
386 \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
388 function TGikoSys.IsFloat(s: string): boolean;
392 Result := TextToFloat(PChar(s), v, fvExtended);
395 // *************************************************************************
396 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
397 // *************************************************************************
398 function TGikoSys.GetBoardFileName: string;
400 Result := Setting.GetBoardFileName;
403 // *************************************************************************
404 //!
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
405 // *************************************************************************
406 function TGikoSys.GetCustomBoardFileName: string;
408 Result := Setting.GetCustomBoardFileName;
411 // *************************************************************************
412 //!
\83e
\83\93\83|
\83\89\83\8a\83t
\83H
\83\8b\83_
\81[
\96¼
\8eæ
\93¾
413 // *************************************************************************
414 function TGikoSys.GetHtmlTempFileName: string;
416 Result := Setting.GetHtmlTempFileName;
420 // *************************************************************************
421 //!
\8eÀ
\8ds
\83t
\83@
\83C
\83\8b\83t
\83H
\83\8b\83_
\8eæ
\93¾
422 // *************************************************************************
423 function TGikoSys.GetAppDir: string;
425 Result := Setting.GetAppDir;
428 // *************************************************************************
429 //! TempHtml
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
430 // *************************************************************************
431 function TGikoSys.GetTempFolder: string;
433 Result := Setting.GetTempFolder;
436 // *************************************************************************
437 //! sent.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
438 // *************************************************************************)
439 function TGikoSys.GetSentFileName: string;
441 Result := Setting.GetSentFileName;
444 // *************************************************************************
445 //! outbox.ini
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
446 // *************************************************************************
447 function TGikoSys.GetOutBoxFileName: string;
449 Result := Setting.GetOutBoxFileName;
452 // *************************************************************************
453 //! Config
\83t
\83H
\83\8b\83_
\8eæ
\93¾
454 // *************************************************************************
455 function TGikoSys.GetConfigDir: string;
457 Result := Setting.GetConfigDir;
460 //!
\83X
\83^
\83C
\83\8b\83V
\81[
\83g
\83t
\83H
\83\8b\83_
461 function TGikoSys.GetStyleSheetDir: string;
463 Result := Setting.GetStyleSheetDir;
466 //!
\83X
\83L
\83\93\83t
\83H
\83\8b\83_
467 function TGikoSys.GetSkinDir: string;
469 Result := Setting.GetSkinDir;
472 //! Skin:
\83w
\83b
\83_
\82Ì
\83t
\83@
\83C
\83\8b\96¼
473 function TGikoSys.GetSkinHeaderFileName: string;
475 Result := Setting.GetSkinHeaderFileName;
478 //! Skin:
\83t
\83b
\83^
\82Ì
\83t
\83@
\83C
\83\8b\96¼
479 function TGikoSys.GetSkinFooterFileName: string;
481 Result := Setting.GetSkinFooterFileName;
484 //! Skin:
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
485 function TGikoSys.GetSkinNewResFileName: string;
487 Result := Setting.GetSkinNewResFileName;
490 //! Skin:
\94ñ
\90V
\92\85\83\8c\83X
\82Ì
\83t
\83@
\83C
\83\8b\96¼
491 function TGikoSys.GetSkinResFileName: string;
493 Result := Setting.GetSkinResFileName;
496 //! Skin:
\82µ
\82¨
\82è(
\82±
\82±
\82Ü
\82Å
\93Ç
\82ñ
\82¾)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
497 function TGikoSys.GetSkinBookmarkFileName: string;
499 Result := Setting.GetSkinBookmarkFileName;
502 //! Skin:
\82µ
\82¨
\82è(
\90V
\92\85\83\8c\83X)
\82Ì
\83t
\83@
\83C
\83\8b\96¼
503 function TGikoSys.GetSkinNewmarkFileName: string;
505 Result := Setting.GetSkinNewmarkFileName;
508 //! UserAgent
\8eæ
\93¾
509 function TGikoSys.GetUserAgent: string;
511 if Dolib.Connected then begin
512 Result := Format('%s %s/%s%d/%s', [
519 Result := Format('%s/%s %s/%s%d/%s', [
530 \brief
\8co
\89ß
\95b
\82ð TDateTime
\82É
\95Ï
\8a·
531 \param val 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
532 \return val
\82ð
\8e¦
\82· TDateTime
534 function TGikoSys.IntToDateTime(val: Int64): TDateTime;
536 Result := ZERO_DATE + val / 86400.0;
540 \brief TDateTime
\82ð
\8co
\89ß
\95b
\82É
\95Ï
\8a·
541 \param ADate
\95Ï
\8a·
\82·
\82é
\8e\9e\8d\8f
542 \return 1970/1/1/ 00:00:00
\82©
\82ç
\82Ì
\8co
\89ß
\95b
544 function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
546 Result := Trunc((ADate - ZERO_DATE) * 86400);
551 \brief Subject
\83t
\83@
\83C
\83\8bRead
552 \param Board
\83X
\83\8c\88ê
\97\97\82ð
\8eæ
\93¾
\82·
\82é
\94Â
554 procedure TGikoSys.ReadSubjectFile(Board: TBoard);
556 ThreadItem: TThreadItem;
558 FileList: TStringList;
571 FavoThreadItem : TFavoriteThreadItem;
575 if Board.IsThreadDatRead then
579 usePlugIn := Board.IsBoardPlugInAvailable;
580 server := UrlToServer( Board.URL );
582 FileName := Board.GetFolderIndexFileName;
584 FileList := TStringList.Create;
585 FileList.Sorted := True;
586 FileList.BeginUpdate;
587 //IsLogFile
\97pDAT
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
588 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
591 //
\8fd
\95¡
\82ð
\96h
\82®
593 Board.Sorted := True;
595 sl := TStringList.Create;
597 if FileExists(FileName) then begin
598 sl.LoadFromFile(FileName);
599 //
\83X
\83\8c\83b
\83h
\82Å
\8b¤
\92Ê
\82ÌURL
\95\94
600 if Board.is2ch then begin
601 urlHead := server + 'test/read.cgi/' + Board.BBSID + '/';
603 urlHead := server + 'test/read.cgi?bbs=' + Board.BBSID + '&key=';
605 //
\82Q
\8ds
\96Ú
\82©
\82ç
\81i
\82P
\8ds
\96Ú
\82Í
\83o
\81[
\83W
\83\87\83\93\81j
606 for i := sl.Count - 1 downto 1 do begin
607 Rec := ParseIndexLine(sl[i]);
608 islog := FileList.Find( Rec.FFileName, Index );
610 ThreadItem := TThreadItem.Create(
613 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
615 if Board.is2ch then begin
616 ThreadItem := TThreadItem.Create(
619 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '/l50',
624 ThreadItem := TThreadItem.Create(
627 urlHead + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50',
634 ThreadItem.BeginUpdate;
636 FileList.Delete( Index );
638 ThreadItem.No := Rec.FNo;
639 ThreadItem.FileName := Rec.FFileName;
640 ThreadItem.Title := MojuUtils.UnSanitize(Rec.FTitle);
641 ThreadItem.Count := Rec.FCount;
642 ThreadItem.Size := Rec.FSize;
643 ThreadItem.RoundDate := Rec.FRoundDate;
644 ThreadItem.LastModified := Rec.FLastModified;
645 ThreadItem.Kokomade := Rec.FKokomade;
646 ThreadItem.NewReceive := Rec.FNewReceive;
647 ThreadItem.UnRead := Rec.FUnRead;
648 ThreadItem.ScrollTop := Rec.FScrollTop;
649 ThreadItem.AllResCount := Rec.FAllResCount;
650 ThreadItem.NewResCount := Rec.FNewResCount;
651 ThreadItem.AgeSage := Rec.FAgeSage;
652 ThreadItem.ParentBoard := Board;
653 {*
\82¨
\8bC
\82É
\93ü
\82è
\91å
\97Ê
\90¶
\90¬
\83R
\81[
\83h *}
655 FavoThreadItem := TFavoriteThreadItem.Create( ThreadItem.URL, ThreadItem.Title, ThreadItem );
656 Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
659 ThreadItem.EndUpdate;
660 Board.Add(ThreadItem);
662 if (ThreadItem.IsLogFile) and (ThreadItem.UnRead) then
667 if UnRead <> Board.UnRead then
668 Board.UnRead := UnRead;
670 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
671 //
\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
672 for i := 0 to FileList.Count - 1 do begin
673 FileName := Boardpath + FileList[i];
675 //ResRec := DivideStrLine(ReadThreadFile(FileName, 1));
676 if usePlugIn then begin
677 ThreadItem := TThreadItem.Create(
680 Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), FileList[i] ) );
681 THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
683 ThreadItem := TThreadItem.Create(
686 Get2chBoard2ThreadURL( Board, ChangeFileExt( FileList[i], '' ) ) );
687 THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
690 ThreadItem.BeginUpdate;
691 ThreadItem.FileName := FileList[i];
692 //ThreadItem.FilePath := FileName;
693 ThreadItem.No := Board.Count + 1;
694 ThreadItem.Title := ResRec.FTitle;
695 ThreadItem.Count := GetFileLineCount(FileName);
696 ThreadItem.AllResCount := ThreadItem.Count;
697 ThreadItem.NewResCount := ThreadItem.Count;
698 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é
699 ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) );
700 ThreadItem.LastModified := ThreadItem.RoundDate;
701 ThreadItem.Kokomade := -1;
702 ThreadItem.NewReceive := 0;
703 ThreadItem.ParentBoard := Board;
704 ThreadItem.IsLogFile := True;
705 ThreadItem.Round := False;
706 ThreadItem.UnRead := False;
707 ThreadItem.ScrollTop := 0;
708 ThreadItem.AgeSage := gasNone;
709 ThreadItem.EndUpdate;
710 Board.Add(ThreadItem);
714 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
715 RestoreThreadData( Board );
719 Board.Sorted := False;
721 Board.IsThreadDatRead := True;
725 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b(Folder.idx)
\8dì
\90¬
726 \param Board Folder.idx
\82ð
\8dì
\90¬
\82·
\82é
\94Â
728 procedure TGikoSys.CreateThreadDat(Board: TBoard);
732 SubjectList: TStringList;
738 if not FileExists(Board.GetSubjectFileName) then Exit;
739 FileName := Board.GetFolderIndexFileName;
741 SubjectList := TStringList.Create;
743 SubjectList.LoadFromFile(Board.GetSubjectFileName);
744 sl := TStringList.Create;
748 sl.Add(FOLDER_INDEX_VERSION);
749 for i := 0 to SubjectList.Count - 1 do begin
750 Rec := DivideSubject(SubjectList[i]);
752 if (Trim(Rec.FFileName) = '') or (Trim(Rec.FTitle) = '') then
755 {s := Format('%x', [cnt]) + #1 //
\94Ô
\8d\86
756 + Rec.FFileName + #1 //
\83t
\83@
\83C
\83\8b\96¼
757 + Rec.FTitle + #1 //
\83^
\83C
\83g
\83\8b
758 + Format('%x', [Rec.FCount]) + #1 //
\83J
\83E
\83\93\83g
759 + Format('%x', [0]) + #1 //size
760 + Format('%x', [0]) + #1 //RoundDate
761 + Format('%x', [0]) + #1 //LastModified
762 + Format('%x', [0]) + #1 //Kokomade
763 + Format('%x', [0]) + #1 //NewReceive
764 + '0' + #1 //
\96¢
\8eg
\97p
765 + Format('%x', [0]) + #1 //UnRead
766 + Format('%x', [0]) + #1 //ScrollTop
767 + Format('%x', [Rec.FCount]) + #1 //AllResCount
768 + Format('%x', [0]) + #1 //NewResCount
769 + Format('%x', [0]); //AgeSage
771 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
772 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
774 Rec.FFileName, //
\83t
\83@
\83C
\83\8b\96¼
775 MojuUtils.Sanitize(Rec.FTitle), //
\83^
\83C
\83g
\83\8b
776 Rec.FCount, //
\83J
\83E
\83\93\83g
785 Rec.FCount, //AllResCount
794 sl.SaveToFile(FileName);
804 \brief
\83X
\83\8c\83b
\83h
\83C
\83\93\83f
\83b
\83N
\83X(Thread.dat)
\8f\91\82«
\8d\9e\82Ý
805 \param Thread.dat
\82ð
\8dì
\90¬
\82·
\82é
\94Â
807 procedure TGikoSys.WriteThreadDat(Board: TBoard);
809 // Values: array[Boolean] of string = ('0', '1');
815 TmpFileList: TStringList;
817 if not Board.IsThreadDatRead then
819 FileName := Board.GetFolderIndexFileName;
820 ForceDirectoriesEx( ExtractFilePath( FileName ) );
822 sl := TStringList.Create;
823 TmpFileList := TStringList.Create;
824 TmpFileList.Sorted := true;
826 TmpFileList.BeginUpdate;
827 GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, false);
828 TmpFileList.EndUpdate;
830 sl.Add(FOLDER_INDEX_VERSION);
832 //
\83X
\83\8c\94Ô
\8d\86\95Û
\91¶
\82Ì
\82½
\82ß
\83\
\81[
\83g
833 Sort.SetSortNoFlag(true);
834 Sort.SetSortOrder(true);
835 Sort.SetSortIndex(0);
836 //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
837 Board.CustomSort(ThreadItemSortProc);
839 for i := 0 to Board.Count - 1 do begin
840 Board.Items[i].No := i + 1;
841 s := Format('%x'#1'%s'#1'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x'#1 +
842 '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
843 [Board.Items[i].No, //
\94Ô
\8d\86
844 Board.Items[i].FileName, //
\83t
\83@
\83C
\83\8b\96¼
845 MojuUtils.Sanitize(Board.Items[i].Title), //
\83^
\83C
\83g
\83\8b
846 Board.Items[i].Count, //
\83J
\83E
\83\93\83g
847 Board.Items[i].Size, //size
848 DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
849 DateTimeToInt(Board.Items[i].LastModified), //LastModified
850 Board.Items[i].Kokomade, //Kokomade
851 Board.Items[i].NewReceive, //NewReceive
853 BoolToInt(Board.Items[i].UnRead), //UnRead
854 Board.Items[i].ScrollTop, //ScrollTop
855 Board.Items[i].AllResCount, //AllResCount
856 Board.Items[i].NewResCount, //NewResCount
857 Ord(Board.Items[i].AgeSage)] //AgeSage
863 sl.SaveToFile(FileName);
865 for i := 0 to TmpFileList.Count - 1 do begin
866 DeleteFile(ExtractFilePath(Board.GetFolderIndexFileName) + TmpFileList[i]);
876 \brief Folder.idx
\82ð 1
\8ds
\89ð
\8eß
877 \param Line Folder.idx
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
878 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
880 function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
882 Result.FNo := StrToIntDef('$' + RemoveToken(Line, #1), 0);
883 Result.FFileName := RemoveToken(Line, #1);
884 Result.FTitle := MojuUtils.UnSanitize(RemoveToken(Line, #1));
885 Result.FCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
886 Result.FSize := StrToIntDef('$' + RemoveToken(Line, #1), 0);
887 Result.FRoundDate := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE));
888 Result.FLastModified := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE));
889 Result.FKokomade := StrToIntDef('$' + RemoveToken(Line, #1), -1);
890 Result.FNewReceive := StrToIntDef('$' + RemoveToken(Line, #1), 0);
891 RemoveToken(Line, #1);//9: ; //
\96¢
\8eg
\97p
892 Result.FUnRead := IntToBool(StrToIntDef('$' + RemoveToken(Line, #1), 0));
893 Result.FScrollTop := StrToIntDef('$' + RemoveToken(Line, #1), 0);
894 Result.FAllResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
895 Result.FNewResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
896 Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + RemoveToken(Line, #1), 0));
901 \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é
902 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
903 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
904 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
905 \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
906 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
908 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
909 \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
913 GetFileList('c:\', '*.txt', list, True, True);
916 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
919 SearchRec : TSearchRec;
922 Path := IncludeTrailingPathDelimiter(Path);
923 rc := FindFirst(Path + '*.*', faAnyfile, SearchRec);
925 while rc = 0 do begin
926 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
927 s := Path + SearchRec.Name;
929 if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then
933 List.Add(SearchRec.Name);
934 if SubDir and (SearchRec.Attr and faDirectory > 0) then
935 GetFileList(s, Mask, List, True, IsPathAdd);
937 rc := FindNext(SearchRec);
940 SysUtils.FindClose(SearchRec);
946 \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
947 \83T
\83u
\83t
\83H
\83\8b\83_
\82Í
\8c\9f\8dõ
\82µ
\82È
\82¢
948 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
949 \param Mask
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\83}
\83X
\83N
950 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\96¼
\88ê
\97\97\82ª
\95Ô
\82é
951 \param IsPathAdd
\83p
\83X
\95t
\82«
\82Å
\83\8a\83X
\83g
\83A
\83b
\83v
\82·
\82é
\8fê
\8d\87\82Í True
952 \note
\8dÄ
\8bN
\8ew
\92è
\89Â
\94\
\82È GetFileList()
\82ª
\82 \82é
\82Ì
\82Å
\82±
\82Ì
\8aÖ
\90\94\82Í
\95s
\97v?
955 GetFileList('c:\', '*.txt', list, True);
958 procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
961 SearchRec : TSearchRec;
963 Path := IncludeTrailingPathDelimiter(Path);
964 rc := FindFirst(Path + Mask, faAnyfile, SearchRec);
966 while rc = 0 do begin
967 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
968 if (SearchRec.Attr and faDirectory = 0) then begin
969 if IsPathAdd then begin
970 List.Add(Path + SearchRec.Name)
972 List.Add(SearchRec.Name);
976 rc := FindNext(SearchRec);
979 SysUtils.FindClose(SearchRec);
985 \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é
986 \param Path
\8bN
\93_
\82Æ
\82È
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
987 \param Mask
\83t
\83H
\83\8b\83_
\96¼
\82Ì
\83}
\83X
\83N
988 \param List OUT:
\8eæ
\93¾
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\96¼
\88ê
\97\97\82ª
\95Ô
\82é
989 \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
991 Mask
\82ð '*.txt'
\82Ì
\82æ
\82¤
\82É
\8ew
\92è
\82·
\82é
\82±
\82Æ
\82Å
\81A
992 \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
996 GetDirectoryList('c:\', '*.txt', list, True);
999 procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
1002 SearchRec : TSearchRec;
1005 Path := IncludeTrailingPathDelimiter(Path);
1006 rc := FindFirst(Path + '*.*', faDirectory, SearchRec);
1008 while rc = 0 do begin
1009 if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
1010 s := Path + SearchRec.Name;
1011 //if (SearchRec.Attr and faDirectory > 0) then
1012 // s := IncludeTrailingPathDelimiter(s)
1014 if (SearchRec.Attr and faDirectory > 0) and (MatchesMask(s, Mask)) then
1015 List.Add( IncludeTrailingPathDelimiter( s ) );
1016 if SubDir and (SearchRec.Attr and faDirectory > 0) then
1017 GetDirectoryList(s, Mask, List, True);
1019 rc := FindNext(SearchRec);
1022 SysUtils.FindClose(SearchRec);
1028 \brief Subject.txt
\88ê
\8ds
\82ð
\89ð
\8eß
1029 \param Line Subject.txt
\82ð
\8d\
\90¬
\82·
\82é 1
\8ds
1030 \return
\83X
\83\8c\83b
\83h
\8fî
\95ñ
1032 function TGikoSys.DivideSubject(Line: string): TSubjectRec;
1042 if AnsiPos('<>', Line) = 0 then
1046 Result.FFileName := RemoveToken(Line, Delim);
1047 Result.FTitle := Trim(RemoveToken(Line, Delim));
1049 ws := Result.FTitle;
1050 if Copy(ws, Length(ws), 1) = ')' then begin
1053 end else if Copy(ws, Length(ws)-1, 2) = '
\81j' then begin
1056 end else if Copy(ws, Length(ws), 1) = '>' then begin
1060 for i := Length(ws) - 1 downto 1 do begin
1061 if Copy(ws, i, Length(LeftK)) = LeftK then begin
1062 Result.FTitle := TrimRight(Copy(ws, 1, i - 1));
1063 ws := Copy(ws, i + Length(LeftK), Length(ws) - i - Length(RightK));
1064 if IsNumeric(ws) then
1065 Result.FCount := StrToInt(ws);
1066 //Delete(Result.FTitle, i, Length(LeftK) + Length(ws) + Length(RightK));
1073 \brief URL
\82©
\82çBBSID
\82ð
\8eæ
\93¾
1074 \param url BBSID
\82ð
\8eæ
\93¾
\82·
\82é URL
1077 function TGikoSys.UrlToID(url: string): string;
1084 if url = '' then Exit;
1086 url := Copy(url, 0, Length(url) - 1);
1087 for i := Length(url) downto 0 do begin
1088 if url[i] = '/' then begin
1089 Result := Copy(url, i + 1, Length(url));
1099 \brief URL
\82©
\82ç
\8dÅ
\8cã
\82Ì
\97v
\91f
\82ð
\8dí
\8f\9c
1100 \param url
\89ð
\8eß
\82·
\82é URL
1101 \return
\90Ø
\82è
\8eæ
\82ç
\82ê
\82½
\8cã
\82Ì URL
1103 URL
\82©
\82ç BBSID
\88È
\8aO
\82Ì
\95\94\95ª
\82ð
\8eæ
\93¾
\82·
\82é
\82Ì
\82É
\8eg
\97p
\82µ
\82Ü
\82·
\81B
1105 function TGikoSys.UrlToServer(url: string): string;
1112 wsURL := Trim(wsURL);
1114 if wsURL = '' then exit;
1116 if Copy(wsURL, Length(wsURL), 1) = '/' then
1117 wsURL := Copy(wsURL, 0, Length(wsURL) - 1);
1119 for i := Length(wsURL) downto 0 do begin
1120 if wsURL[i] = '/' then begin
1121 Result := Copy(wsURL, 0, i);
1128 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\83`
\83F
\83b
\83N
1129 \param Name
\91¶
\8dÝ
\82ð
\8am
\94F
\82·
\82é
\83t
\83H
\83\8b\83_
\83p
\83X
1130 \return
\83t
\83H
\83\8b\83_
\82ª
\91¶
\8dÝ
\82·
\82é
\82È
\82ç True
1132 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
1136 Code := GetFileAttributes(PChar(Name));
1137 Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
1141 \brief
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81i
\95¡
\90\94\8aK
\91w
\91Î
\89\9e\81j
1142 \param Dir
\8dì
\90¬
\82·
\82é
\83p
\83X
1143 \return
\8dì
\90¬
\82É
\90¬
\8c÷
\82µ
\82½
\8fê
\8d\87\82Í True
1145 function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
1148 if Length(Dir) = 0 then
1149 raise Exception.Create('
\83t
\83H
\83\8b\83_
\82ª
\8dì
\90¬
\8fo
\97\88\82Ü
\82¹
\82ñ');
1150 Dir := ExcludeTrailingPathDelimiter(Dir);
1151 if (Length(Dir) < 3) or DirectoryExistsEx(Dir)
1152 or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
1153 Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
1157 \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
1158 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1159 \param s
\8c³
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1160 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1161 \param Rec OUT:
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
\82ª
\95Ô
\82é
1162 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1163 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1165 function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1169 Result := StrTokNext(sep, Rec);
1173 \brief
\95¶
\8e\9a\97ñ
\82©
\82ç
\83g
\81[
\83N
\83\93\82Ì
\90Ø
\82è
\8fo
\82µ
1174 FDelphi
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1175 \param sep
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\83L
\83\83\83\89\83N
\83^
1176 \param Rec IN/OUT:StrTokFirst
\82Å
\8dì
\90¬
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
\91\96\8d¸
\8fî
\95ñ
1177 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1178 \todo Split, RemoveToken, GetTokenIndex, NthField
\8ds
\82«
1180 function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
1187 if Len >= Pos then begin
1188 while (Pos <= Len) and (Str[Pos] in sep) do begin
1192 while (Pos<= Len) and not (Str[Pos] in sep) do begin
1193 if IsDBCSLeadByte(Byte(Str[Pos])) then begin
1198 Result := Copy(Str, I, Pos - I);
1199 while (Pos <= Len) and (Str[Pos] in sep) do begin//
\82±
\82ê
\82Í
\82¨
\8dD
\82Ý
1207 \brief
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\8eæ
\93¾
1208 \param FileName
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y
\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1209 \return
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y(bytes)
1211 function TGikoSys.GetFileSize(FileName : string): longint;
1216 if not FileExists(FileName) then begin
1220 Assign(F, FileName);
1222 Result := FileSize(F);
1230 \brief
\83e
\83L
\83X
\83g
\83t
\83@
\83C
\83\8b\82Ì
\8ds
\90\94\82ð
\8eæ
\93¾
1231 \param FileName
\8ds
\90\94\82ð
\8eæ
\93¾
\82·
\82é
\83t
\83@
\83C
\83\8b\83p
\83X
1233 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1235 function TGikoSys.GetFileLineCount(FileName : string): longint;
1239 sl := TStringList.Create;
1242 sl.LoadFromFile(FileName);
1254 \brief
\83t
\83@
\83C
\83\8b\82©
\82ç
\8ew
\92è
\8ds
\82ð
\8eæ
\93¾
1255 \param FileName
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
1256 \param Line
\8ew
\92è
\8ds
1257 \return
\8ew
\92è
\82³
\82ê
\82½ 1
\8ds
1258 \todo
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\8ds
\82«
1260 function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
1262 fileTmp : TStringList;
1265 if FileExists(FileName) then begin
1266 fileTmp := TStringList.Create;
1269 fileTmp.LoadFromFile( FileName );
1270 if ( Line >= 1 ) and ( Line < fileTmp.Count + 1 ) then begin
1271 Result := fileTmp.Strings[ Line-1 ];
1274 //on EFOpenError do Result := '';
1283 \brief
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\83t
\83H
\83\93\83g
\82Ì
\91®
\90«
\82ð
\8eæ
\93¾
1284 \param Font OUT:
\8eæ
\93¾
\82µ
\82½
\83t
\83H
\83\93\83g
\91®
\90«
\82ª
\95Ô
\82é
1286 procedure TGikoSys.MenuFont(Font: TFont);
1289 nm: NONCLIENTMETRICS;
1291 nm.cbSize := sizeof(NONCLIENTMETRICS);
1293 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
1294 lf := nm.lfMenuFont;
1296 Font.Name := lf.lfFaceName;
1297 Font.Height := lf.lfHeight;
1299 if lf.lfWeight >= 700 then
1300 Font.Style := Font.Style + [fsBold];
1301 if lf.lfItalic = 1 then
1302 Font.Style := Font.Style + [fsItalic];
1306 \brief
\90æ
\93ª
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1307 \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ñ
1308 \param delimiter
\8bæ
\90Ø
\82è
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1309 \return
\90Ø
\82è
\8fo
\82µ
\82½
\95¶
\8e\9a\97ñ
1311 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1313 function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
1317 p := AnsiPos(delimiter, s);
1321 Result := Copy(s, 1, p - 1);
1322 Delete(s, 1, Length(Result) + Length(delimiter));
1327 \brief n
\8cÂ
\96Ú
\82Ì
\83g
\81[
\83N
\83\93\82ð
\90Ø
\82è
\8fo
\82µ
1328 \param s
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1329 \param index 0
\82©
\82ç
\8en
\82Ü
\82é
\83C
\83\93\83f
\83b
\83N
\83X(n
\8cÂ
\96Ú
\82Ì n)
1330 \return
\90Ø
\82è
\8fo
\82µ
\82½
\83g
\81[
\83N
\83\93
1332 \82Ç
\82±
\82©
\82Ì
\83T
\83C
\83g
\82©
\82ç
\82Ì
\83p
\83N
\83\8a
1334 function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
1339 for i := 0 to index do
1340 Result := RemoveToken(s, delimiter);
1344 //
\83C
\83\93\83f
\83b
\83N
\83X
\96¢
\8dX
\90V
\83o
\83b
\83t
\83@
\82ð
\83t
\83\89\83b
\83V
\83\85\81I
1345 {procedure TGikoSys.FlashExitWrite;
1349 //
\83X
\83\8c\83b
\83h
\83f
\81[
\83^
\83t
\83@
\83C
\83\8b\82ð
\8dX
\90V
1350 for i := 0 to FExitWrite.Count - 1 do
1351 WriteThreadDat(FExitWrite[i]);
1356 \brief
\83X
\83\8c\96¼
\82È
\82Ç
\82ð
\92Z
\82¢
\96¼
\91O
\82É
\95Ï
\8a·
\82·
\82é
1357 \param LongName
\8c³
\82É
\82È
\82é
\95¶
\8e\9a\97ñ
1358 \param ALength
\8eû
\82ß
\82é
\95¶
\8e\9a\97ñ
\92·(bytes)
1359 \return
\95Ï
\8a·
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1363 function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
1365 ERASECHAR : array [1..39] of string =
1366 ('
\81\99','
\81\9a','
\81¡','
\81 ','
\81\9f','
\81\9e','
\81Q','
\81\94','
\81£','
\81¥',
1367 '
\81¢','
\81¤','
\81\9c','
\81\9b','
\81\9d','
\81y','
\81z','
\81ô','
\81s','
\81t',
1368 '
\81g','
\81h','
\81k','
\81l','
\81e','
\81f','
\81\83','
\81\84','
\81á','
\81â',
1369 '
\81o','
\81p','
\81q','
\81r','
\81w','
\81x','
\81¬','
\81c', '
\81@');
1371 Chr : array [0..255] of char;
1375 s := Trim(LongName);
1376 if (Length(s) <= ALength) then begin
1380 for i := Low(ERASECHAR) to High(ERASECHAR) do begin
1381 S := CustomStringReplace(S, ERASECHAR[i], '');
1383 if (Length(S) <= ALength) then begin
1386 Windows.LCMapString(
1387 GetUserDefaultLCID(),
1395 S := Copy(S,1,ALength);
1397 if (ByteType(S, Length(S)) = mbLeadByte ) then begin
1398 S := Copy(S, 1, Length(S) - 1);
1409 \brief Boolean
\82ð Integer
\82É
\95Ï
\8a·
1410 \return False..0, True..1
1412 function TGikoSys.BoolToInt(b: Boolean): Integer;
1414 Result := IfThen(b, 1, 0);
1418 \brief Integer
\82ð Boolean
\82É
\95Ï
\8a·
1419 \return 1..True, other..False
1420 \todo 0..False, other..True
\82Ì
\95û
\82ª
\82¢
\82¢
\82Ì
\82Å
\82Í?
1421 (
\82±
\82Ì
\8ed
\97l
\82É
\88Ë
\91¶
\82µ
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82Å
\96¢
\8fC
\90³)
1423 function TGikoSys.IntToBool(i: Integer): Boolean;
1429 \brief gzip
\82Å
\88³
\8fk
\82³
\82ê
\82½
\82Ì
\82ð
\96ß
\82·
1430 \param ResStream
\93Ç
\82Ý
\8d\9e\82Þ
\83X
\83g
\83\8a\81[
\83\80
1431 \param ContentEncoding
\83G
\83\93\83R
\81[
\83f
\83B
\83\93\83O
1432 \return
\93W
\8aJ
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1434 function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
1438 GZipStream: TGzipDecompressStream;
1439 TextStream: TStringStream;
1440 buf: array[0..BUF_SIZE - 1] of Byte;
1446 TextStream := TStringStream.Create('');
1448 //
\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¢)
1449 // if LowerCase(Trim(ContentEncoding)) = 'gzip' then begin
1450 if AnsiPos('gzip', LowerCase(Trim(ContentEncoding))) > 0 then begin
1451 ResStream.Position := 0;
1452 GZipStream := TGzipDecompressStream.Create(TextStream);
1455 FillChar(buf, BUF_SIZE, 0);
1456 cnt := ResStream.Read(buf, BUF_SIZE);
1458 GZipStream.Write(buf, BUF_SIZE);
1464 ResStream.Position := 0;
1466 FillChar(buf, BUF_SIZE, 0);
1467 cnt := ResStream.Read(buf, BUF_SIZE);
1469 TextStream.Write(buf, BUF_SIZE);
1473 //NULL
\95¶
\8e\9a\82ð"*"
\82É
\82·
\82é
1474 s := TextStream.DataString;
1477 while (i > 0) and (s[i] = #0) do
1479 Delete(s, i + 1, ln - i);
1482 while i <> 0 do begin
1494 \brief
\83A
\83N
\83V
\83\87\83\93\82É
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83L
\81[
\82ð
\90Ý
\92è
1495 \param ActionList
\90Ý
\92è
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1496 \param FileName Ini
\83t
\83@
\83C
\83\8b\82Ì
\96¼
\91O
1498 procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
1500 STD_SEC = 'KeySetting';
1506 SecList: TStringList;
1507 Component: TComponent;
1509 if not FileExists(fileName) then
1511 SecList := TStringList.Create;
1512 ini := TMemIniFile.Create(fileName);
1514 ini.ReadSection(STD_SEC, SecList);
1515 for i := 0 to SecList.Count - 1 do begin
1516 ActionName := SecList[i];
1517 ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
1518 if ActionKey <> -1 then begin
1519 Component := ActionList.Owner.FindComponent(ActionName);
1520 if TObject(Component) is TAction then begin
1521 TAction(Component).ShortCut := ActionKey;
1532 \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¶
1533 \param ActionList
\95Û
\91¶
\82·
\82é
\83A
\83N
\83V
\83\87\83\93\88ê
\97\97
1534 \param FileName Ini
\83t
\83@
\83C
\83\8b\96¼
1536 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
1538 procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
1540 STD_SEC = 'KeySetting';
1545 ini := TMemIniFile.Create(GetConfigDir + FileName);
1547 for i := 0 to ActionList.ActionCount - 1 do begin
1548 if ActionList.Actions[i].Tag = -1 then
1550 ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
1560 \brief
\83v
\83\8d\83Z
\83X
\82Ì
\90¶
\90¬
1561 \param AppPath
\8bN
\93®
\82·
\82é
\83v
\83\8d\83Z
\83X
\82Ì
\83t
\83@
\83C
\83\8b\83p
\83X
1562 \param Param AppPath
\82É
\93n
\82·
\88ø
\90\94
1564 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
1566 PI: TProcessInformation;
1570 Path := '"' + AppPath + '"';
1572 Path := Path + ' ' + Param;
1574 SI.Cb := SizeOf(Si);
1575 SI.lpReserved := nil;
1576 SI.lpDesktop := nil;
1579 SI.cbReserved2 := 0;
1580 SI.lpReserved2 := nil;
1582 Windows.CreateProcess(nil,
1595 \brief Web
\83u
\83\89\83E
\83U
\82ð
\8bN
\93®
1596 \param URL Web
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é URL
1597 \param BrowserType
\83u
\83\89\83E
\83U
\82Ì
\83^
\83C
\83v(IE
\82©
\82Ç
\82¤
\82©)
1599 procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
1603 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1604 gbtUserApp, gbtAuto:
1605 if (Setting.URLApp) and (FileExists(Setting.URLAppFile)) then
1606 GikoSys.CreateProcess(Setting.URLAppFile, URL)
1608 HlinkNavigateString(nil, PWideChar(WideString(URL)));
1613 \brief
\95¶
\8e\9a\8eÀ
\91Ì
\8eQ
\8fÆ
\82ð
\83f
\83R
\81[
\83h
1614 \param AStr
\83f
\83R
\81[
\83h
\82·
\82é
\95¶
\8e\9a\97ñ
1615 \return
\83f
\83R
\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
1617 function TGikoSys.HTMLDecode(const AStr: String): String;
1619 Sp, Rp, Cp, Tp: PChar;
1624 SetLength(Result, Length(AStr));
1626 Rp := PChar(Result);
1629 while Sp^ <> #0 do begin
1635 'a': if AnsiStrPos(Sp, 'amp;') = Sp then
1641 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then
1645 while (Sp^ <> ';') and (Sp^ <> #0) do
1652 'q': if AnsiStrPos(Sp, 'quot;') = Sp then
1660 Num := IsNumeric(Copy(Tp, 1, 1));
1661 while (Sp^ <> ';') and (Sp^ <> #0) do begin
1662 if (Num) and (not IsNumeric(Copy(Sp, 1, 1))) then
1666 SetString(S, Tp, Sp - Tp);
1671 //raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1672 //[Cp^ + Sp^, Cp - PChar(AStr)])
1682 // on E:EConvertError do
1683 // raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
1684 // [Cp^ + Sp^, Cp - PChar(AStr)])
1686 SetLength(Result, Rp - PChar(Result));
1690 \brief HTML
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82©
\82ç URL
\82ð
\8eæ
\93¾
1691 \param s URL
\82ð
\8eæ
\93¾
\82·
\82é HTML
1692 \return
\8eæ
\93¾
\82µ
\82½ URL
1694 function TGikoSys.GetHRefText(s: string): string;
1704 Index := AnsiPos('href', LowerCase(s));
1707 s := Trim(Copy(s, Index + 4, Length(s)));
1708 s := Trim(Copy(s, 2, Length(s)));
1710 //
\8en
\82ß
\82Ì
\95¶
\8e\9a\82ª'"'
\82È
\82ç
\8eæ
\82è
\8f\9c\82
1711 //if Copy(s, 1, 1) = '"' then begin
1712 if s[1] = '"' then begin
1713 s := Trim(Copy(s, 2, Length(s)));
1716 Index := AnsiPos('"', s);
1717 if Index <> 0 then begin
1718 //'"'
\82Ü
\82ÅURL
\82Æ
\82·
\82é
1719 s := Copy(s, 1, Index - 1);
1721 //'"'
\82ª
\96³
\82¯
\82ê
\82Î
\83X
\83y
\81[
\83X
\82©">"
\82Ì
\91\81\82¢
\95û
\82Ü
\82Å
\82ðURL
\82Æ
\82·
\82é
1722 Index := AnsiPos(' ', s);
1723 Index2 := AnsiPos('>', s);
1726 if Index > Index2 then
1729 s := Copy(s, 1, Index - 1)
1731 //
\82±
\82ê
\88È
\8fã
\82à
\82¤
\92m
\82ç
\82ñ
\82Ê
1738 \brief
\83z
\83X
\83g
\96¼
\82ª
\82Q
\82\83\82\88\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
\82·
\82é
1739 \param Host
\83`
\83F
\83b
\83N
\82·
\82é
\83z
\83X
\83g
\96¼
1740 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83z
\83X
\83g
\96¼
\82È
\82ç True
1742 function TGikoSys.Is2chHost(Host: string): Boolean;
1744 HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
1750 if RightStr( Host, 1 ) = '/' then
1751 Host := Copy( Host, 1, Length( Host ) - 1 );
1752 OutputDebugString(pchar(HOST_NAME[0]));
1753 for i := 0 to Length(HOST_NAME) - 1 do begin
1754 // Len := Length(HOST_NAME[i]);
1755 if (AnsiPos(HOST_NAME[i], Host) > 0) and
1756 (AnsiPos(HOST_NAME[i], Host) = (Length(Host) - Length(HOST_NAME[i]) + 1)) then begin
1764 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1765 \param url 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1766 \param path test/read.cgi
\82È
\82Ç
\82Ì
\92\86\8aÔ
\83p
\83X(ParseURI
\82©
\82ç
\93¾
\82é)
1767 \param document index.html
\82È
\82Ç
\82Ì
\83h
\83L
\83\85\83\81\83\93\83g
\96¼(ParseURI
\82©
\82ç
\93¾
\82é)
1768 \param BBSID OUT:BBSID
\82ª
\95Ô
\82é(ex. giko)
1769 \param BBSKey OUT:
\83X
\83\8c\83b
\83h
\83L
\81[
\82ª
\95Ô
\82é(ex. 10000000000)
1770 \return 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì URL
\82Æ
\82µ
\82Ä
\95ª
\89ð
\82Å
\82«
\82½
\82È
\82ç True
1772 function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
1782 Index := AnsiPos(READ_PATH, path);
1783 if Index <> 0 then begin
1784 s := Copy(path, Index + Length(READ_PATH), Length(path));
1786 if (Length(s) > 0) and (s[1] = '/') then
1788 BBSID := GetTokenIndex(s, '/', 0);
1789 BBSKey := GetTokenIndex(s, '/', 1);
1792 Result := (BBSID <> '') or (BBSKey <> '');
1795 Index := AnsiPos(KAKO_PATH, path);
1796 if Index <> 0 then begin
1797 s := Copy(path, 2, Length(path));
1798 BBSID := GetTokenIndex(s, '/', 0);
1799 if (BBSID = 'log') and (GetTokenIndex(s, '/', 2) = 'kako') then
1800 BBSID := GetTokenIndex(s, '/', 1);
1801 BBSKey := ChangeFileExt(Document, '');
1802 Result := (BBSID <> '') or (BBSKey <> '');
1805 Index := AnsiPos('read.cgi?', URL);
1806 if Index <> 0 then begin
1807 SList := TStringList.Create;
1810 // s := HTMLDecode(Document);
1811 ExtractHTTPFields(['?', '&'], [], PChar(URL), SList, False);
1812 BBSID := SList.Values['bbs'];
1813 BBSKey := SList.Values['key'];
1814 Result := (BBSID <> '') or (BBSKey <> '');
1826 \brief 2ch
\8c`
\8e®
\82Ì URL
\82©
\82ç
\83\8c\83X
\94Ô
\82ð
\8eæ
\93¾
1827 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1828 \param stRes OUT:
\8aJ
\8en
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1829 \param endRes OUT:
\8fI
\97¹
\83\8c\83X
\94Ô
\82ª
\95Ô
\82é
1831 http://2ch.net/
\92\86\97ª/32-50 \n
1832 \82Ì
\8fê
\8d\87 stRef = 32, endRes = 50
\82É
\82È
\82é
1834 procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
1841 URL := Trim(LowerCase(URL));
1842 if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
1846 buf := Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 );
1848 stRes := StrToInt64( buf );
1849 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1850 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
1852 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, Length( URL ) - AnsiPos('&to=', URL ) - 4 + 1 );
1855 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1856 buf := Copy( buf, 1, ps );
1860 endRes := StrToInt64(buf)
1867 if (stRes <> 0) and (endRes = 0) then
1868 endRes := stRes + MAX_POPUP_RES
1869 else if (stRes = 0) and (endRes <> 0) then begin
1870 stRes := endRes - MAX_POPUP_RES;
1874 GikoSys.GetBrowsableThreadURL( URL );
1875 end else if( AnsiPos('&res=', URL ) <> 0 ) then begin
1877 buf := Copy( URL, AnsiPos('&res=', URL ) + 5, Length( URL ) - AnsiPos('&res=', URL ) - 5 + 1 );
1880 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1881 buf := Copy( buf, 1, ps );
1884 stRes := StrToInt(buf)
1891 end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
1893 stRes := StrToInt64( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
1894 if AnsiPos( '&nofirst=',URL) <> 0 then begin
1895 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, AnsiPos( '&nofirst=',URL) - AnsiPos('&end=', URL ) - 5);
1897 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, Length( URL ) - AnsiPos('&to=', URL ) - 5 + 1 );
1900 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1901 buf := Copy( buf, 1, ps );
1905 endRes := StrToInt64(buf);
1912 end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
1913 buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
1914 if Length(buf) > 0 then begin
1915 if AnsiPos('-', buf) = 1 then begin
1920 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1922 convBuf := Copy( buf, 1, ps );
1923 if convBuf <> '' then
1924 endRes := StrToInt64(convBuf)
1930 if endRes <> 0 then begin
1931 stRes := endRes - MAX_POPUP_RES;
1938 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1940 convBuf := Copy( buf, 1, ps );
1941 if convBuf <> '' then begin
1942 stRes := StrToInt64(convBuf);
1946 while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
1948 convBuf := Copy( buf, 1, ps );
1949 if convBuf <> '' then
1950 endRes := StrToInt64(convBuf)
1972 \brief 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
\82ð
\95ª
\89ð
1973 \param URL 2
\82¿
\82á
\82ñ
\82Ë
\82é
\8c`
\8e®
\82Ì URL
1974 \return
\95ª
\89ð
\82³
\82ê
\82½
\97v
\91f
1976 function TGikoSys.Parse2chURL2(URL: string): TPathRec;
1981 // convBuf : String;
1992 URL := Trim(LowerCase(URL));
1997 Result.FFirst := False;
1998 Result.FStBegin := False;
1999 Result.FToEnd := False;
2000 Result.FDone := False;
2001 Result.FNoParam := False;
2005 if URL[length(URL)] = '\' then
2007 FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
2008 if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
2009 s := Copy(URL, RStart + RLength - 1, Length(URL));
2011 //
\95W
\8f\80\8f\91\8e®
2012 //
\8dÅ
\8cã
\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n-
\82È
\82Ç
2013 //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
2014 FAWKStr.RegExp := '/test/read.cgi/.+/[0-9]+/?.*';
2015 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2016 s := Copy(s, 15, Length(s));
2018 SList := TStringList.Create;
2021 FAWKStr.RegExp := '/';
2022 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 3 then begin
2023 Result.FBBS := SList[1];
2024 Result.FKey := SList[2];
2025 if SList.Count >= 4 then
2029 Result.FNoParam := true;
2035 FAWKStr.LineSeparator := mcls_CRLF;
2036 FAWKStr.RegExp := '-';
2037 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) = 0 then begin
2038 Result.FFirst := True;
2040 FAWKStr.RegExp := 'l[0-9]+';
2041 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2042 Result.FFirst := True;
2044 for i := 0 to SList.Count - 1 do begin
2045 if Trim(SList[i]) = '' then begin
2047 Result.FStBegin := True;
2048 if i = (SList.Count - 1) then
2049 Result.FToEnd := True;
2050 end else if IsNumeric(SList[i]) then begin
2051 wkInt := StrToInt(SList[i]);
2052 wkMax := Max(wkMax, wkInt);
2056 wkMin := Min(wkMin, wkInt);
2057 end else if Trim(SList[i]) = 'n' then begin
2058 Result.FFirst := True;
2060 FAWKStr.RegExp := '^n[0-9]+$|^[0-9]+n$';
2061 if FAWKStr.Match(FAWKStr.ProcessEscSeq(SList[i]), RStart, RLength) > 0 then begin
2062 if Copy(SList[i], 1, 1) = 'n' then
2063 wkInt := StrToInt(Copy(SList[i], 2, Length(SList[i])))
2065 wkInt := StrToInt(Copy(SList[i], 1, Length(SList[i]) - 1));
2066 Result.FFirst := True;
2067 wkMax := Max(wkMax, wkInt);
2071 wkMin := Min(wkMin, wkInt);
2075 if Result.FStBegin and (not Result.FToEnd) then
2077 else if (not Result.FStBegin) and Result.FToEnd then
2079 else if (not Result.FStBegin) and (not Result.FToEnd) then begin
2080 Result.FSt := wkMin;
2081 Result.FTo := wkMax;
2083 //Result.FSt := wkMin;
2084 //Result.FTo := wkMax;
2090 Result.FDone := True;
2094 //
\90Vkako
\8f\91\8e®
2095 //http://server.2ch.net/ITA_NAME/kako/1000/10000/1000000000.html
2096 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+/[0-9]+\.html';
2097 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2098 SList := TStringList.Create;
2101 FAWKStr.RegExp := '/';
2102 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2103 Result.FBBS := SList[1];
2104 Result.FKey := ChangeFileExt(SList[5], '');
2105 Result.FFirst := True;
2111 Result.FDone := True;
2115 //
\8b\8ckako
\8f\91\8e®
2116 //http://server.2ch.net/ITA_NAME/kako/999/999999999.html
2117 FAWKStr.RegExp := '/.+/kako/[0-9]+/[0-9]+\.html';
2118 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2119 SList := TStringList.Create;
2122 FAWKStr.RegExp := '/';
2123 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 5 then begin
2124 Result.FBBS := SList[1];
2125 Result.FKey := ChangeFileExt(SList[4], '');
2126 Result.FFirst := True;
2132 Result.FDone := True;
2136 //log
\8by
\82Ñlog2
\8f\91\8e®
2137 //http://server.2ch.net/log/ITA_NAME/kako/999/999999999.html
2138 //http://server.2ch.net/log2/ITA_NAME/kako/999/999999999.html
2139 FAWKStr.RegExp := '/log2?/.+/kako/[0-9]+/[0-9]+\.html';
2140 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2141 SList := TStringList.Create;
2144 FAWKStr.RegExp := '/';
2145 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 6 then begin
2146 Result.FBBS := SList[2];
2147 Result.FKey := ChangeFileExt(SList[5], '');
2148 Result.FFirst := True;
2154 Result.FDone := True;
2159 //
\8b\8cURL
\8f\91\8e®
2160 //http://server.2ch.net/test/read.cgi?bbs=ITA_NAME&key=1000000000&st=1&to=5&nofirst=true
2161 FAWKStr.RegExp := '/test/read\.cgi\?';
2162 if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
2163 s := Copy(s, 16, Length(s));
2164 SList := TStringList.Create;
2167 FAWKStr.RegExp := '&';
2168 if FAWKStr.Split(FAWKStr.ProcessEscSeq(s), SList) >= 2 then begin
2169 Result.FFirst := True;
2170 for i := 0 to SList.Count - 1 do begin
2171 if Pos('bbs=', SList[i]) = 1 then begin
2172 Result.FBBS := Copy(SList[i], 5, Length(SList[i]));
2173 end else if Pos('key=', SList[i]) = 1 then begin
2174 Result.FKey := Copy(SList[i], 5, Length(SList[i]));
2175 end else if Pos('st=', SList[i]) = 1 then begin
2176 wk := Copy(SList[i], 4, Length(SList[i]));
2177 if IsNumeric(wk) then
2178 Result.FSt := StrToInt(wk)
2179 else if wk = '' then
2180 Result.FStBegin := True;
2181 end else if Pos('to=', SList[i]) = 1 then begin
2182 wk := Copy(SList[i], 4, Length(SList[i]));
2183 if IsNumeric(wk) then
2184 Result.FTo := StrToInt(wk)
2185 else if wk = '' then
2186 Result.FToEnd := True;
2187 end else if Pos('nofirst=', SList[i]) = 1 then begin
2188 Result.FFirst := False;
2197 if (Result.FBBS <> '') and (Result.FKey <> '') then begin
2198 Result.FDone := True;
2206 \brief URI
\82ð
\95ª
\89ð
2207 \param URL
\95ª
\89ð
\82·
\82é URI
2208 \param Protocol OUT:
\83v
\83\8d\83g
\83R
\83\8b\82ª
\95Ô
\82é(ex. http)
2209 \param Host OUT:
\83z
\83X
\83g
\82ª
\95Ô
\82é(ex. hoge.com)
2210 \param Path OUT:
\92\86\8aÔ
\83p
\83X
\82ª
\95Ô
\82é(ex. test/read.cgi)
2211 \param Document OUT:
\83h
\83L
\83\85\83\81\83\93\83g
\96¼
\82ª
\95Ô
\82é(ex. index.html)
2212 \param Port OUT:
\83|
\81[
\83g
\82ª
\95Ô
\82é(ex. 8080)
2213 \param Bookmark OUT:
\83u
\83b
\83N
\83}
\81[
\83N(?)
\82ª
\95Ô
\82é
2215 procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
2225 URI := TIdURI.Create(URL);
2227 Protocol := URI.Protocol;
2230 Document := URI.Document;
2232 Bookmark := URI.Bookmark;
2239 \brief
\83M
\83R
\83i
\83r
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
2240 \return
\83o
\81[
\83W
\83\87\83\93\82Ì
\89º 2
\8c\85(dwFileVersionLS)
2242 function TGikoSys.GetVersionBuild: Integer;
2244 FixedFileInfo: PVSFixedFileInfo;
2245 VersionHandle, VersionSize: DWORD;
2246 pVersionInfo: Pointer;
2251 AppFile := Application.ExeName;
2252 VersionSize := GetFileVersionInfoSize(pChar(AppFile), VersionHandle);
2253 if VersionSize = 0 then
2255 GetMem(pVersionInfo, VersionSize);
2257 if GetFileVersionInfo(PChar(AppFile),VersionHandle,VersionSize, pVersionInfo) then
2258 if VerQueryValue(pVersionInfo, '\', Pointer(FixedFileInfo), ItemLen) then
2259 Result := LOWORD(FixedFileInfo^.dwFileVersionLS);
2261 FreeMem(pVersionInfo, VersionSize);
2266 \brief
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2267 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2268 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2270 \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
2271 \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
2272 \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
2273 (1-1000
\82Ì
\82æ
\82¤
\82È
\95\89\89×
\82ð
\82©
\82¯
\82é
\82à
\82Ì
\82É
\82Í
\82µ
\82È
\82¢
\82±
\82Æ)
2275 \97á(
\90³
\8bK
\89»
\91O):\n
2276 http://
\92\86\97ª/ \n
2277 http://
\92\86\97ª/20-100
2279 (
\90³
\8bK
\89»
\8cã):\n
2280 http://
\92\86\97ª/l50
2282 function TGikoSys.GetBrowsableThreadURL(
2286 threadItem : TThreadItem;
2287 boardPlugIn : TBoardPlugIn;
2292 //=====
\83v
\83\89\83O
\83C
\83\93
2294 for i := Length( BoardGroups ) - 1 downto 1 do begin
2295 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2296 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2297 board := BBSsFindBoardFromURL( BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL) );
2298 if board <> nil then begin
2299 boardPlugIn := BoardGroups[i].BoardPlugIn;
2300 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2301 Result := threadItem.URL;
2310 // 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¢
2313 if Length( Result ) = 0 then
2314 Result := GikoSys.Get2chBrowsableThreadURL( inURL );
2319 \brief
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2320 \param inURL
\83X
\83\8c\83b
\83h URL
2323 function TGikoSys.GetThreadURL2BoardURL(
2327 threadItem : TThreadItem;
2328 boardPlugIn : TBoardPlugIn;
2333 //=====
\83v
\83\89\83O
\83C
\83\93
2335 for i := Length( BoardGroups ) - 1 downto 1 do begin
2336 if Assigned( Pointer( BoardGroups[i].BoardPlugIn.Module ) ) then begin
2337 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
2338 board := BBSsFindBoardFromURL(BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL));
2339 boardPlugIn := BoardGroups[i].BoardPlugIn;
2340 threadItem := TThreadItem.Create( boardPlugIn, board, inURL );
2341 Result := BoardGroups[i].BoardPlugIn.GetBoardURL( Longword( threadItem ) );
2349 // 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¢
2352 if Length( Result ) = 0 then
2353 Result := GikoSys.Get2chThreadURL2BoardURL( inURL );
2358 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82ð
\94Â URL
\82É
\95Ï
\8a·
2359 \param inURL
\83X
\83\8c\83b
\83h URL
2361 \see TGikoSys.GetThreadURL2BoardURL
2363 function TGikoSys.Get2chThreadURL2BoardURL(
2367 Protocol, Host, Path, Document, Port, Bookmark : string;
2368 BBSID, BBSKey : string;
2372 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2373 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2375 foundPos := Pos( '/test/read.cgi', inURL );
2376 if {(Is2chHost(Host)) and} (foundPos > 0) then
2377 Result := Copy( inURL, 1, foundPos ) + BBSID + '/'
2379 Result := Protocol + '://' + Host + '/' + BBSID + '/';
2384 \brief 2ch
\97p:
\83X
\83\8c\83b
\83h URL
\82Ì
\90³
\8bK
\89»
2385 \param inURL
\90³
\8bK
\89»
\82·
\82é
\83X
\83\8c\83b
\83h URL
2386 \return
\90³
\8bK
\89»
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h URL
2387 \see TGikoSys.GetBrowsableThreadURL
2389 function TGikoSys.Get2chBrowsableThreadURL(
2393 Protocol, Host, Path, Document, Port, Bookmark : string;
2394 BBSID, BBSKey : string;
2398 // if Pos( KAKO_PATH, inURL ) > 0 then begin
2401 ParseURI( inURL, Protocol, Host, Path, Document, Port, Bookmark );
2402 Parse2chURL( inURL, Path, Document, BBSID, BBSKey );
2403 foundPos := Pos( '/test/read.cgi', inURL ) - 1;
2405 if Is2chHost( Host ) then begin
2406 Result := Protocol + '://' + Host +
2407 READ_PATH + BBSID + '/' + BBSKey + '/l50';
2409 if foundPos > 0 then
2410 Result := Copy( inURL, 1, foundPos ) +
2411 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50'
2413 Result := Protocol + '://' + Host +
2414 OLD_READ_PATH + 'bbs=' + BBSID + '&key=' + BBSKey + '&ls=50';
2421 \brief 2ch
\97p:
\94Â URL
\82©
\82ç
\83X
\83\8c\83b
\83h URL
\82ð
\8dì
\90¬
2422 \param inBoard
\94Â URL
2423 \param inKey
\83X
\83\8c\83b
\83h
\83L
\81[(ex. 1000000000)
2424 \return
\83X
\83\8c\83b
\83h URL
2426 function TGikoSys.Get2chBoard2ThreadURL(
2434 server := UrlToServer( inBoard.URL );
2435 //if Is2chHost( server ) then
2436 if inBoard.Is2ch then
2437 Result := server + 'test/read.cgi/' + inBoard.BBSID + '/' + inKey + '/l50'
2439 Result := server + 'test/read.cgi?bbs=' + inBoard.BBSID + '&key=' + inKey + '&ls=50';
2444 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\97ñ
\8b\93
2446 \97ñ
\8b\93\82³
\82ê
\82½ BBS(
\83{
\81[
\83h)
\82Í BBSs
\82É
\93ü
\82è
\82Ü
\82·
\81B
2448 procedure TGikoSys.ListBoardFile;
2450 boardFileList : TStringList;
2455 for i := 0 to Length( BBSs ) - 1 do
2459 SetLength( BBSs, 0 );
2462 //
\94Â
\83\8a\83X
\83g
\82Ì
\97ñ
\8b\93
2463 if FileExists( GikoSys.GetBoardFileName ) then begin
2464 SetLength( BBSs, l + 1 );
2465 BBSs[ l ] := TBBS.Create( GikoSys.GetBoardFileName );
2466 BBSs[ l ].Title := '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
2470 if FileExists( GikoSys.GetCustomBoardFileName ) then begin
2471 SetLength( BBSs, l + 1 );
2472 BBSs[ l ] := TBBS.Create( GikoSys.GetCustomBoardFileName );
2473 BBSs[ l ].Title := '
\82»
\82Ì
\91¼';
2477 // Board
\83t
\83H
\83\8b\83_
2478 if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
2479 BoardFileList := TStringList.Create;
2481 BoardFileList.BeginUpdate;
2482 GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*.txt', BoardFileList, True, True );
2483 BoardFileList.EndUpdate;
2484 SetLength( BBSs, l + BoardFileList.Count );
2485 for i := BoardFileList.Count - 1 downto 0 do begin
2486 BBSs[ l ] := TBBS.Create( BoardFileList[ i ] );
2487 BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
2497 \brief
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\93Ç
\82Ý
\8d\9e\82Ý
2498 \param bbs
\83{
\81[
\83h
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82Þ BBS
2500 procedure TGikoSys.ReadBoardFile( bbs : TBBS );
2505 boardFile : TStringList;
2506 CategoryList : TStringList;
2507 BoardList : TStringList;
2508 Category : TCategory;
2512 // RoundItem : TRoundItem;
2514 i, iBound : Integer;
2515 j, jBound : Integer;
2516 k, kBound : Integer;
2519 if not FileExists( bbs.FilePath ) then
2523 ini := TMemIniFile.Create('');
2524 boardFile := TStringList.Create;
2527 boardFile.LoadFromFile( bbs.FilePath );
2529 ini.SetStrings( boardFile );
2530 CategoryList := TStringList.Create;
2531 BoardList := TStringList.Create;
2533 ini.ReadSections( CategoryList );
2535 iBound := CategoryList.Count - 1;
2536 for i := 0 to iBound do begin
2537 ini.ReadSection( CategoryList[i], BoardList );
2538 Category := TCategory.Create;
2539 Category.No := i + 1;
2540 Category.Title := CategoryList[i];
2542 jBound := BoardList.Count - 1;
2543 for j := 0 to jBound do begin
2545 inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
2546 //'http://'
\82ð
\8aÜ
\82Ü
\82È
\82¢
\95¶
\8e\9a\97ñ
\82Ì
\8e\9e\82Í
\96³
\8e\8b\82·
\82é
2547 if (AnsiPos('http://', AnsiLowerCase(inistr)) = 0) then Continue;
2548 //=====
\83v
\83\89\83O
\83C
\83\93
2550 kBound := Length(BoardGroups) - 1;
2551 for k := 1 to kBound do begin //0
\82Í
\81A2
\82¿
\82á
\82ñ
2552 if Assigned( Pointer( BoardGroups[k].BoardPlugIn.Module ) ) then begin
2553 if BoardGroups[k].BoardPlugIn.AcceptURL( inistr ) = atBoard then begin
2554 if not BoardGroups[k].Find(inistr, p) then begin
2555 tmpstring := BoardGroups[k].BoardPlugIn.ExtractBoardURL( inistr );
2556 if AnsiCompareStr(tmpString, inistr) <> 0 then begin
2557 if not BoardGroups[k].Find(tmpstring, p) then begin
2559 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2560 BoardGroups[k].AddObject(tmpstring, Board);
2561 Category.Add(Board);
2563 //
\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é
2567 Board := TBoard(BoardGroups[k].Objects[p]);
2568 if Board.ParentCategory <> Category then
2569 Category.Add(Board);
2573 Board := TBoard.Create( BoardGroups[k].BoardPlugIn, tmpstring );
2574 BoardGroups[k].AddObject(tmpstring, Board);
2575 Category.Add(Board);
2577 //
\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é
2582 Board := TBoard(BoardGroups[k].Objects[p]);
2583 if Board.ParentCategory <> Category then
2584 Category.Add(Board);
2591 // 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¢
2594 if (Board = nil) then begin
2595 if not BoardGroups[0].Find(inistr,p) then begin
2596 Board := TBoard.Create( nil, inistr );
2597 BoardGroups[0].AddObject(inistr, Board);
2598 Category.Add(Board);
2600 Board := TBoard(BoardGroups[0].Objects[p]);
2601 if Board.ParentCategory <> Category then
2602 Category.Add(Board);
2606 if (Board.Multiplicity = 0) then begin
2609 Board.Multiplicity := 1;
2610 Board.Title := BoardList[j];
2611 Board.RoundDate := ZERO_DATE;
2616 Board.Multiplicity := Board.Multiplicity + 1;
2621 bbs.Add( Category );
2626 bbs.IsBoardFileRead := True;
2639 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È
\83J
\83e
\83S
\83\8a\82Ì
\90¶
\90¬
2640 \return
\90¶
\90¬
\82³
\82ê
\82½
\83J
\83e
\83S
\83\8a
2642 function TGikoSys.GetUnknownCategory : TCategory;
2644 UNKNOWN_CATEGORY = '(
\96¼
\8fÌ
\95s
\96¾)';
2647 if Length( BBSs ) < 2 then begin
2652 Result := BBSs[ 1 ].FindCategoryFromTitle( UNKNOWN_CATEGORY );
2653 if Result = nil then begin
2654 Result := TCategory.Create;
2655 Result.Title := UNKNOWN_CATEGORY;
2656 BBSs[ 1 ].Add( Result );
2662 \brief
\96¼
\8fÌ
\82ª
\95s
\96¾
\82È BBS
\82Ì
\90¶
\90¬
2663 \return
\90¶
\90¬
\82³
\82ê
\82½ BBS
2665 function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
2667 category : TCategory;
2669 UNKNOWN_BOARD = '(
\96¼
\8fÌ
\95s
\96¾)';
2672 category := GetUnknownCategory;
2673 if category = nil then begin
2676 Result := category.FindBoardFromTitle( UNKNOWN_BOARD );
2677 if Result = nil then begin
2678 Result := TBoard.Create( inPlugIn, inURL );
2679 Result.Title := UNKNOWN_BOARD;
2680 category.Add( Result );
2687 function TGikoSys.GetSambaFileName : string;
2689 Result := Setting.GetSambaFileName;
2693 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83A
\83\93\83J
\81[
\82É
\82µ
\82Ä
\97ñ
\8b\93
2694 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2695 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2696 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç True
2697 \return
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\83A
\83\93\83J
\81[
2698 \todo limited
\82ð Integer
\82É
\82·
\82é
\82©
\81A20
\82ð
\8aO
\82É
\8fo
\82·
2700 function TGikoSys.GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string;
2705 ResLink : TResLinkRec;
2707 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2709 Res.FType := glt2chNew;
2712 if (not IsNoValidID(AID)) and
2713 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2714 body := TStringList.Create;
2716 GetSameIDRes(AID, ThreadItem, body);
2717 if (limited) and (body.Count > 20) then begin
2718 for i := body.Count - 20 to body.Count - 1 do begin
2719 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2722 for i := 0 to body.Count - 1 do begin
2723 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2729 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2730 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2731 HTMLCreater.ConvRes(@Res, @ResLink, false);
2732 Result := Res.FBody;
2737 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2738 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2739 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2740 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2742 procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
2745 ReadList: TStringList;
2747 boardPlugIn : TBoardPlugIn;
2749 if (not IsNoValidID(AID)) and
2750 (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2751 //if ThreadItem.IsBoardPlugInAvailable then begin
2752 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2753 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2754 //boardPlugIn := ThreadItem.BoardPlugIn;
2755 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2757 for i := 0 to threadItem.Count - 1 do begin
2759 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res);
2760 if(AnsiPos(AID, Res.FDateTime) > 0) then begin
2761 body.Add(IntToStr(i+1));
2765 ReadList := TStringList.Create;
2767 ReadList.LoadFromFile(ThreadItem.GetThreadFileName);
2768 for i := 0 to ReadList.Count - 1 do begin
2769 THTMLCreate.DivideStrLine(ReadList[i], @Res);
2770 if AnsiPos(AID, Res.FDateTime) > 0 then begin
2771 body.Add(IntToStr(i+1));
2782 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2783 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2784 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2785 \param limited
\97ñ
\8b\93\82·
\82é
\90\94\82ð
\90§
\8cÀ
\82·
\82é
\82È
\82ç True
2787 \todo limited
\82ð Integer
\82É
\82·
\82é
\82©
\81A20
\82ð
\8aO
\82É
\8fo
\82·
2789 function TGikoSys.GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string;
2794 ResLink : TResLinkRec;
2796 // body
\88È
\8aO
\82Í
\8eg
\97p
\82µ
\82È
\82¢
\82Ì
\82Å
\8f\89\8aú
\89»
\82µ
\82È
\82¢
2798 Res.FType := glt2chNew;
2801 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2802 body := TStringList.Create;
2804 GetSameIDRes(AIDNum, ThreadItem, body);
2805 if (limited) and (body.Count > 20) then begin
2806 for i := body.Count - 20 to body.Count - 1 do begin
2807 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2810 for i := 0 to body.Count - 1 do begin
2811 Res.FBody := Res.FBody + '>' + body[i] + ' ';
2817 ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
2818 ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
2819 HTMLCreater.ConvRes(@Res, @ResLink, false);
2820 Result := Res.FBody;
2825 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\97ñ
\8b\93
2826 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2827 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2828 \param body OUT:
\97ñ
\8b\93\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86\82ª
\95Ô
\82é
2830 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
2833 boardPlugIn : TBoardPlugIn;
2835 stList: TStringList;
2838 if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
2839 and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
2840 //if ThreadItem.IsBoardPlugInAvailable then begin
2841 if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
2842 //=====
\83v
\83\89\83O
\83C
\83\93\82É
\82æ
\82é
\95\
\8e¦
2843 //boardPlugIn := ThreadItem.BoardPlugIn;
2844 boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
2845 THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
2847 THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
2849 AID := Res.FDateTime;
2850 if AnsiPos('id', AnsiLowerCase(AID)) > 0 then begin
2851 AID := Copy(AID, AnsiPos('id', AnsiLowerCase(AID)) - 1, 11);
2852 if AnsiPos(' be:', AnsiLowerCase(AID)) > 0 then begin
2853 AID := Copy(AID, 1, AnsiPos(' BE:', AnsiLowerCase(AID)) - 1)
2856 stlist := TStringList.Create;
2858 stList.DelimitedText := AID;
2860 for i := 0 to stList.Count - 1 do
2861 if Length(WideString(stList[i])) = 8 then begin
2862 if NotDateorTimeString(stList[i]) then begin
2871 if not IsNoValidID(AID) then
2872 GetSameIDRes(AID, ThreadItem, body);
2877 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2878 \param AID
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2879 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2880 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2882 function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer;
2887 if (not IsNoValidID(AID))
2888 and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2889 body := TStringList.Create;
2891 GetSameIDRes(AID, ThreadItem, body);
2892 Result := body.Count;
2901 \brief
\93¯
\82¶
\93\8a\8de ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82ð
\83J
\83E
\83\93\83g
2902 \param AIDNum
\8cÂ
\90l
\82ð
\93Á
\92è
\82·
\82é
\93\8a\8de ID
2903 \param ThreadItem
\97ñ
\8b\93\82·
\82é
\83X
\83\8c\83b
\83h
2904 \return
\93¯
\82¶ ID
\82ð
\8e\9d\82Â
\83\8c\83X
\82Ì
\90\94
2906 function TGikoSys.GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer;
2911 if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
2912 body := TStringList.Create;
2914 GetSameIDRes(AIDNum, ThreadItem, body);
2915 Result := body.Count;
2923 \brief
\8e\9e\8d\8f\82ð
\8e¦
\82·
\95¶
\8e\9a\97ñ
\82Å
\82Í
\96³
\82¢
\82©
\82Ç
\82¤
\82©
2924 \param AStr
\92²
\82×
\82é
\95¶
\8e\9a\97ñ
2925 \return
\8e\9e\8d\8f\82Å
\82Í
\96³
\82¢
\82È
\82ç True
2926 \todo
\94Û
\92è
\8c`(Not)
\82æ
\82è
\8dm
\92è
\8cn(Is)
2928 function TGikoSys.NotDateorTimeString(const AStr : string): boolean;
2945 \brief
\83X
\83p
\83\80:
\8cê
\90\94\82ð
\83J
\83E
\83\93\83g
2946 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
2947 \param wordCount OUT:
\83J
\83E
\83\93\83g
\82³
\82ê
\82½
\92P
\8cê
\82Ì
\88ê
\97\97\82ª
\95Ô
\82é
2949 procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
2952 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
2953 Bayesian.CountWord( text, wordCount );
2958 \brief
\83X
\83p
\83\80:
\8aw
\8fK
\8c\8b\89Ê
\82ð
\95ú
\8aü
2959 \param wordCount
\95ú
\8aü
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
2960 \param isSpam wordCount
\82ª
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82³
\82ê
\82Ä
\82¢
\82½
\82È
\82ç True
2961 \warning
\8aw
\8fK
\8dÏ
\82Ý
\82Ì
\95¶
\8fÍ
\82©
\82Ç
\82¤
\82©
\82Í
\8am
\94F
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B\n
2962 Learn
\82µ
\82Ä
\82¢
\82È
\82¢
\95¶
\8fÍ
\82â isSpam
\82ð
\8aÔ
\88á
\82¦
\82Ä
\8ew
\92è
\82·
\82é
\82Æ
2963 \83f
\81[
\83^
\83x
\81[
\83X
\82ª
\94j
\91¹
\82µ
\82Ü
\82·
\81B\n
2964 \8aw
\8fK
\8dÏ
\82Ý
\82©
\82Ç
\82¤
\82©
\82Í
\93Æ
\8e©
\82É
\8aÇ
\97\9d\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
2966 \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
2967 wordCount
\82ð
\93¾
\82½
\95¶
\8fÍ
\82Ì
\8aw
\8fK
\8c\8b\89Ê
\82Ì
\82Ý
\83N
\83\8a\83A
\82µ
\82Ü
\82·
\81B
2969 \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
2971 procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
2974 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
2975 Bayesian.Forget( wordCount, isSpam );
2980 \brief
\83X
\83p
\83\80:
\8aw
\8fK
2981 \param wordCount
\8aw
\8fK
\82·
\82é
\92P
\8cê
\82Ì
\88ê
\97\97
2982 \param isSpam
\83X
\83p
\83\80\82Æ
\82µ
\82Ä
\8aw
\8fK
\82·
\82é
\82È
\82ç True
2984 procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
2987 if Setting.SpamFilterAlgorithm = gsfaNone then Exit;
2988 Bayesian.Learn( wordCount, isSpam );
2993 \brief
\83X
\83p
\83\80:
\95¶
\8fÍ
\82ð
\89ð
\90Í
\82µ
\81A
\83X
\83p
\83\80\93x
\90\94\82ð
\93¾
\82é
2994 \param text
\8c³
\82É
\82È
\82é
\95¶
\8fÍ
2995 \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)
2996 \return 0
\81`1
\82Ì
\83X
\83p
\83\80\93x
\90\94
2998 function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
3001 case Setting.SpamFilterAlgorithm of
3002 gsfaNone: Result := 0;
3003 gsfaPaulGraham: Result := Bayesian.Parse( text, wordCount, gbaPaulGraham );
3004 gsfaGaryRobinson: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinson );
3005 gsfaGaryRobinsonFisher: Result := Bayesian.Parse( text, wordCount, gbaGaryRobinsonFisher );
3012 \brief
\83\86\81[
\83U
\90Ý
\92è
\82Ì CSS
\82ð
\90¶
\90¬
3013 \return
\90¶
\90¬
\82³
\82ê
\82½ CSS
3015 [
\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Ì
3016 [
\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
3018 function TGikoSys.SetUserOptionalStyle(): string;
3021 if Length( GikoSys.Setting.BrowserFontName ) > 0 then
3022 Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
3023 if GikoSys.Setting.BrowserFontSize <> 0 then
3024 Result := Result + 'font-size:' + IntToStr( GikoSys.Setting.BrowserFontSize ) + 'pt;';
3025 if GikoSys.Setting.BrowserFontColor <> -1 then
3026 Result := Result + 'color:#' + IntToHex( GikoSys.Setting.BrowserFontColor, 6 ) + ';';
3027 if GikoSys.Setting.BrowserBackColor <> -1 then
3028 Result := Result + 'background-color:#' + IntToHex( GikoSys.Setting.BrowserBackColor, 6 ) + ';';
3029 case GikoSys.Setting.BrowserFontBold of
3030 -1: Result := Result + 'font-weight:normal;';
3031 1: Result := Result + 'font-weight:bold;';
3033 case GikoSys.Setting.BrowserFontItalic of
3034 -1: Result := Result + 'font-style:normal;';
3035 1: Result := Result + 'font-style:italic;';
3040 \brief Be
\83v
\83\8d\83t
\83@
\83C
\83\8b\82Ö
\82Ì
\83A
\83\93\83J
\81[
\83^
\83O
\82ð
\90¶
\90¬
3041 \param AID
\91Î
\8fÛ
\82Æ
\82È
\82é
\93ú
\95tID
\95¶
\8e\9a\97ñ
3042 \param ANum
\83\8c\83X
\94Ô
3043 \param AURL
\82»
\82Ì
\83X
\83\8c\83b
\83h
\82ÌURL
3044 \return
\90¶
\90¬
\82³
\82ê
\82½
\83A
\83\93\83J
\81[
\83^
\83O
3046 function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
3049 BNum, BMark : string;
3051 p := AnsiPos('BE:', AnsiUpperCase(AID));
3053 BNum := Copy(AID, p, Length(AID));
3054 AID := Copy(AID, 1, p - 1);
3055 p := AnsiPos('-', BNum);
3057 BMark := '?' + Trim(Copy(BNum, p + 1, Length(BNum)));
3058 BNum := Copy(BNum, 1, p - 1);
3061 Result := AID + ' <a href="' + BNum + '/' + IntToStr(ANum)
3062 + '" target=_blank>' + BMark + '</a>';
3068 \brief
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
3069 \param KeyWord
\8eæ
\93¾
\82·
\82é
\8d\80\96Ú
3070 \return
\83o
\81[
\83W
\83\87\83\93\95¶
\8e\9a\97ñ
3072 function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
3074 Translation = '\VarFileInfo\Translation';
3075 FileInfo = '\StringFileInfo\%0.4s%0.4s\';
3077 BufSize, HWnd: DWORD;
3078 VerInfoBuf: Pointer;
3080 VerDataLen: Longword;
3083 //
\95K
\97v
\82È
\83o
\83b
\83t
\83@
\82Ì
\83T
\83C
\83Y
\82ð
\8eæ
\93¾
3084 BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
3085 if BufSize <> 0 then begin
3086 //
\83\81\83\82\83\8a\82ð
\8am
\95Û
3087 GetMem(VerInfoBuf, BufSize);
3089 GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
3090 //
\95Ï
\90\94\8fî
\95ñ
\83u
\83\8d\83b
\83N
\93à
\82Ì
\95Ï
\8a·
\83e
\81[
\83u
\83\8b\82ð
\8ew
\92è
3091 VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
3093 if not (VerDataLen > 0) then
3094 raise Exception.Create('
\8fî
\95ñ
\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
3096 // 8
\8c\85\82Ì
\82P
\82U
\90i
\90\94\82É
\95Ï
\8a·
3097 //
\81¨'\StringFileInfo\027382\FileDescription'
3098 PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
3099 [IntToHex(Integer(VerData^) and $FFFF, 4),
3100 IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
3101 VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
3103 if VerDataLen > 0 then begin
3104 // VerData
\82Í
\83[
\83\8d\82Å
\8fI
\82í
\82é
\95¶
\8e\9a\97ñ
\82Å
\82Í
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
3106 SetLength(result, VerDataLen);
3107 StrLCopy(PChar(result), VerData, VerDataLen);
3111 FreeMem(VerInfoBuf);
3117 \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
3118 \return 1
\8ds1plugin
3120 function TGikoSys.GetPluginsInfo(): String;
3123 major, minor, revision : Cardinal;
3124 agent, release : String;
3126 //
\8c\8b\89Ê
\82ð
\83N
\83\8a\83A
\82µ
\82Ä
\82¨
\82
3129 //BoardGroups
\8co
\97R
\82ÅPlugin
\82É
\83A
\83N
\83Z
\83X
\82·
\82é
3130 for i := 0 to Length(BoardGroups) - 1 do begin
3131 //BoardGroups
\82Ì
\92\86\82É
\82Í
\81APlugin
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\82Ì
\81i2
\82¿
\82á
\82ñ
\81j
\82ª
3132 //
\82¢
\82é
\82Ì
\82Å
\82»
\82ê
\82ð
\8f\9c\82
3133 if BoardGroups[i].BoardPlugIn <> nil then begin
3134 BoardGroups[i].BoardPlugIn.VersionInfo(agent, major, minor, release, revision);
3137 //"Plugin
\82Ì
\96¼
\91O(major.minor.revision)"
3139 Format('%s(%d.%d.%d)', [agent, major, minor, revision]) + #13#10;
3145 //! IE
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
3146 function TGikoSys.GetIEVersion: string;
3150 R := TRegistry.Create;
3152 //
\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¢
3153 R.Access := KEY_EXECUTE;
3154 R.RootKey := HKEY_LOCAL_MACHINE;
3155 R.OpenKey('Software\Microsoft\Internet Explorer', False);
3157 Result := R.ReadString('version');
3159 Result := '
\83o
\81[
\83W
\83\87\83\93\82Ì
\8eæ
\93¾
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B';
3166 //! 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¼
3167 function TGikoSys.GetMainKeyFileName : String;
3169 Result := Setting.GetMainKeyFileName;
3171 //! 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¼
3172 function TGikoSys.GetEditorKeyFileName: String;
3174 Result := Setting.GetEditorKeyFileName;
3176 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\90Ý
\92è
\83t
\83@
\83C
\83\8b\96¼
3177 function TGikoSys.GetInputAssistFileName: String;
3179 Result := Setting.GetInputAssistFileName;
3181 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\90Ý
\92è
\82·
\82é
3182 procedure TGikoSys.SetGikoMessage;
3184 if FGikoMessage = nil then begin
3185 FGikoMessage := TGikoMessage.Create;
3190 if (Setting.GengoSupport) then begin
3192 if (FileExists(Setting.GetLanguageFileName)) then begin
3193 FGikoMessage.LoadFromFile(Setting.GetLanguageFileName);
3200 //!
\83M
\83R
\83i
\83r
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82ð
\8eæ
\93¾
\82·
\82é
3201 function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String;
3204 if FGikoMessage <> nil then begin
3205 Result := FGikoMessage.GetMessage(MesType);
3209 //Tue, 17 Dec 2002 12:18:07 GMT
\81¨ TDateTime
\82Ö
3210 //MonaUtils
\82©
\82ç
\88Ú
\93®
3211 function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime;
3212 function StrMonthToMonth(const s: string): integer;
3214 m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
3219 for i := Low(m) to High(m) do begin
3220 if (SameText(s, m[i])) then begin
3227 wDay, wMonth, wYear: word;
3228 wHour, wMinute, wSecond: word;
3232 wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0);
3233 wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2));
3234 wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0);
3235 sTime := ChooseString(DateStr, ' ', 4);
3236 wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0);
3237 wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0);
3238 wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0);
3239 d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0);
3242 //MonaUtils
\82©
\82ç
\88Ú
\93®
3243 //!
\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·
3244 function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string;
3250 for i := 0 to Index - 1 do begin
3251 if (AnsiPos(Separator, S) = 0) then S := ''
3252 else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S));
3254 p := AnsiPos(Separator, S);
3255 if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S;
3257 //!
\88ê
\8e\9e\83t
\83@
\83C
\83\8b\82©
\82ç
\82Ì
\95\9c\8b\8c
3258 procedure TGikoSys.RestoreThreadData(Board : TBoard);
3260 SECTION = 'Setting';
3262 TmpFileList : TStringList;
3265 ThreadItem : TThreadItem;
3266 Boardpath, tmpStr : string;
3268 Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
3270 TmpFileList := TStringList.Create;
3271 TmpFileList.Sorted := True;
3272 TmpFileList.BeginUpdate;
3274 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\97pTmp
\83t
\83@
\83C
\83\8b\83\8a\83X
\83g
3275 GetFileList(Boardpath, '*.tmp', TmpFileList, False);
3276 TmpFileList.EndUpdate;
3277 //
\91O
\89ñ
\88Ù
\8fí
\8fI
\97¹
\8e\9e\83`
\83F
\83b
\83N
3278 for i := TmpFileList.Count - 1 downto 0 do begin
3279 ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
3280 if ThreadItem <> nil then begin
3281 ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
3283 tmpStr := ini.ReadString(SECTION, 'RoundDate', DateTimeToStr(ZERO_DATE));
3284 ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
3286 tmpStr := ini.ReadString(SECTION, 'LastModified', DateTimeToStr(ZERO_DATE));
3287 ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
3288 ThreadItem.Count := ini.ReadInteger(SECTION, 'Count', 0);
3289 ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
3291 ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
3292 if(ThreadItem.Size = 0) and (FileExists(ThreadItem.GetThreadFileName)) then begin
3294 ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
3299 //
\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ã
3300 //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
3301 //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
3302 ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
3303 ThreadItem.ScrollTop := ini.ReadInteger(SECTION, 'ScrollTop', 0);
3304 ThreadItem.AllResCount := ini.ReadInteger(SECTION, 'AllResCount', ThreadItem.Count);
3305 ThreadItem.NewResCount := ini.ReadInteger(SECTION, 'NewResCount', 0);
3306 ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger(SECTION, 'AgeSage', Ord(gasNone)));
3310 DeleteFile(Boardpath + TmpFileList[i]);
3320 GikoSys := TGikoSys.Create;
3323 if GikoSys <> nil then begin