OSDN Git Service

・スレタイの特定ワードを非表示にする機能に「©bbspink.com」も追加
[gikonavigoeson/gikonavi.git] / ExternalThreadItem.pas
1 unit ExternalThreadItem;
2
3 interface
4
5 uses
6         Windows, Classes, SysUtils,
7         IdComponent,
8         ExternalBoardPlugInMain;
9
10 type
11         // TThreadItem \82Ì\83v\83\8d\83p\83e\83B\90Ý\92è\81^\8eæ\93¾ ID
12         TThreadItemProperty = (
13                 tipContext,                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
14                 tipNo,                                                                  // : Integer            // \94Ô\8d\86
15                 tipFileName,                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
16                 tipTitle,                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
17                 tipRoundDate,                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
18                 tipLastModified,                                // : TDateTime  // \83X\83\8c\83b\83h\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
19                 tipCount,                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
20                 tipAllResCount,                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
21                 tipNewResCount,                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
22                 tipSize,                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
23                 tipRound,                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
24                 tipRoundName,                                           // : string                     // \8f\84\89ñ\96¼
25                 tipIsLogFile,                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
26                 tipKokomade,                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
27                 tipNewReceive,                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
28                 tipNewArrival,                                  // : Boolean            // \90V\92\85
29                 tipUnRead,                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
30                 tipScrollTop,                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
31                 tipDownloadHost,                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
32                 tipAgeSage,                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
33                 tipURL,                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
34                 tipFilePath,                                                    // : string                     // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
35                 tipJumpAddress                                                  // : Integer            // JUMP\90æ\83\8c\83X\94Ô\8d\86
36         );
37
38         // *************************************************************************
39         // TThreadItem \82ª\90\90¬\82³\82ê\82½
40         // *************************************************************************
41         TThreadItemCreate = procedure(
42                 inInstance : DWORD
43         ); stdcall;
44
45         // *************************************************************************
46         // TThreadItem \82ª\94j\8aü\82³\82ê\82½
47         // *************************************************************************
48         TThreadItemDispose = procedure(
49                 inInstance : DWORD
50         ); stdcall;
51
52         // *************************************************************************
53         // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
54         // *************************************************************************
55         TThreadItemOnDownload = function(
56                 inInstance      : DWORD                                 // \83C\83\93\83X\83^\83\93\83X
57         ) : TDownloadState; stdcall;    // \83_\83E\83\93\83\8d\81[\83h\82ª\90¬\8c÷\82µ\82½\82©\82Ç\82¤\82©
58
59         // *************************************************************************
60         // \8f\91\82«\8d\9e\82Ý\82ð\8ew\8e¦
61         // *************************************************************************
62         TThreadItemOnWrite = function(
63                 inInstance      : DWORD;                                // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
64                 inName                  : PChar;                                // \96¼\91O(\83n\83\93\83h\83\8b)
65                 inMail                  : PChar;                                // \83\81\81[\83\8b\83A\83h\83\8c\83X
66                 inMessage               : PChar                                 // \96{\95
67         ) : TDownloadState; stdcall;    // \8f\91\82«\8d\9e\82Ý\82ª\90¬\8c÷\82µ\82½\82©\82Ç\82¤\82©
68
69         // *************************************************************************
70         // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é html \82ð\97v\8b\81
71         // *************************************************************************
72         TThreadItemOnGetRes = function(
73                 inInstance      : DWORD;                // \83C\83\93\83X\83^\83\93\83X
74                 inNo                            : DWORD                 // \95\\8e¦\82·\82é\83\8c\83X\94Ô\8d\86
75         ) : PChar; stdcall;                             // \95\\8e¦\82·\82é HTML
76
77         // *************************************************************************
78         // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é Dat \82ð\97v\8b\81
79         // *************************************************************************
80         TThreadItemOnGetDat = function(
81                 inInstance      : DWORD;                // \83C\83\93\83X\83^\83\93\83X
82                 inNo                            : DWORD                 // \95\\8e¦\82·\82é\83\8c\83X\94Ô\8d\86
83         ) : PChar; stdcall;                             // \82Q\82¿\82á\82ñ\82Ë\82é\8c`\8e®\82ÌDat
84
85         // *************************************************************************
86         // \83X\83\8c\83b\83h\82Ì\83w\83b\83_ html \82ð\97v\8b\81
87         // *************************************************************************
88         TThreadItemOnGetHeader = function(
89                 inInstance                              : DWORD;        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
90                 inOptionalHeader        : PChar         // \92Ç\89Á\82Ì\83w\83b\83_
91         ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
92
93         // *************************************************************************
94         // \83X\83\8c\83b\83h\82Ì\83t\83b\83^ html \82ð\97v\8b\81
95         // *************************************************************************
96         TThreadItemOnGetFooter = function(
97                 inInstance                              : DWORD;        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
98                 inOptionalFooter        : PChar         // \92Ç\89Á\82Ì\83t\83b\83^
99         ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
100
101         // *************************************************************************
102         // \82±\82Ì ThreadItem \82ª\91®\82·\82é\94Â\82Ì URL \82ð\97v\8b\81
103         // *************************************************************************
104         TThreadItemOnGetBoardURL = function(
105                 inInstance      : DWORD                                 // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
106         ) : PChar; stdcall;                                             // \94Â\82Ì URL
107
108 function ThreadItemDat2HTML(
109         inInstance      : DWORD;                // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
110         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
111         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
112         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
113 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
114
115 implementation
116
117 uses ExternalBoardManager, GikoSystem, BoardGroup, HTMLCreate, MojuUtils;
118
119 // *************************************************************************
120 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
121 // *************************************************************************
122 function ThreadItemGetLong(
123         instance                : DWORD;
124         propertyID      : TThreadItemProperty
125 ) : DWORD; stdcall;
126 var
127         threadItem : TThreadItem;
128 begin
129
130         threadItem := TThreadItem( instance );
131         case propertyID of
132                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
133                         Result := threadItem.Context;
134                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
135                         Result := threadItem.No;
136                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
137                         Result := DWORD( CreateResultString( threadItem.FileName ) );
138                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
139                         Result := DWORD( CreateResultString( threadItem.Title ) );
140                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
141                         Result := threadItem.Count;
142                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
143                         Result := threadItem.AllResCount;
144                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
145                         Result := threadItem.NewResCount;
146                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
147                         Result := threadItem.Size;
148                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
149                         Result := DWORD( threadItem.Round );
150                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
151                         Result := DWORD( CreateResultString( threadItem.RoundName ) );
152                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
153                         Result := DWORD( threadItem.IsLogFile );
154                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
155                         Result := threadItem.Kokomade;
156                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
157                         Result := threadItem.NewReceive;
158                 tipNewArrival:                                  // : Boolean            // \90V\92\85
159                         Result := DWORD( threadItem.NewArrival );
160                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
161                         Result := DWORD( threadItem.UnRead );
162                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
163                         Result := threadItem.ScrollTop;
164                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
165                         Result := DWORD( CreateResultString( threadItem.DownloadHost ) );
166                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
167                         Result := DWORD( threadItem.AgeSage );
168                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
169                         Result := DWORD( CreateResultString( threadItem.URL ) );
170                 tipFilePath:                                                                                                            // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
171                         Result := DWORD( CreateResultString( threadItem.FilePath ) );
172                 tipJumpAddress:
173                         Result := threadItem.JumpAddress;
174         else
175                 Result := 0;
176         end;
177 end;
178
179 // *************************************************************************
180 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
181 // *************************************************************************
182 procedure ThreadItemSetLong(
183         instance                : DWORD;
184         propertyID      : TThreadItemProperty;
185         param : DWORD
186 ); stdcall;
187 var
188         threadItem      : TThreadItem;
189 begin
190
191         threadItem := TThreadItem( instance );
192         case propertyID of
193                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
194                         threadItem.Context                      := param;
195                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
196                         threadItem.No                                           := param;
197                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
198                         threadItem.FileName                     := string( PChar( param ) );
199                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
200                         threadItem.Title                                := string( PChar( param ) );
201                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
202                         threadItem.Count                                := param;
203                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
204                         threadItem.AllResCount  := param;
205                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
206                         threadItem.NewResCount  := param;
207                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
208                         threadItem.Size                                 := param;
209                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
210                         threadItem.Round                                := Boolean( param );
211                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
212                         //threadItem.RoundName          := string( PChar( param ) );
213                         threadItem.RoundName            := PChar( param );
214                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
215                         threadItem.IsLogFile            := Boolean( param );
216                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
217                         threadItem.Kokomade                     := param;
218                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
219                         threadItem.NewReceive           := param;
220                 tipNewArrival:                                  // : Boolean            // \90V\92\85
221                         threadItem.NewArrival           := Boolean( param );
222                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
223                         threadItem.UnRead                               := Boolean( param );
224                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
225                         threadItem.ScrollTop             := param;
226                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
227                         threadItem.DownloadHost := string( PChar( param ) );
228                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
229                         threadItem.AgeSage                      := TGikoAgeSage( param );
230                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
231                         threadItem.URL                                  := string( PChar( param ) );
232                 //tipFilePath:                                          // : string                     // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
233                 //      threadItem.FilePath                     := string( PChar( param ) );
234                 tipJumpAddress:
235                         threadItem.JumpAddress          := param;
236         end;
237
238 end;
239
240 // *************************************************************************
241 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
242 // *************************************************************************
243 function ThreadItemGetDouble(
244         instance                : DWORD;
245         propertyID      : TThreadItemProperty
246 ) : Double; stdcall;
247 var
248         threadItem : TThreadItem;
249 begin
250
251         threadItem := TThreadItem( instance );
252         case propertyID of
253                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
254                         Result := threadItem.RoundDate;
255                 tipLastModified:                                // : TDateTime  // \83X\83\8c\83b\83h\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
256                         Result := threadItem.LastModified;
257         else
258                 Result := 0;
259         end;
260
261 end;
262
263 // *************************************************************************
264 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
265 // *************************************************************************
266 procedure ThreadItemSetDouble(
267         instance                : DWORD;
268         propertyID      : TThreadItemProperty;
269         param                           : Double
270 ); stdcall;
271 var
272         threadItem : TThreadItem;
273 begin
274
275         threadItem := TThreadItem( instance );
276         case propertyID of
277                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
278                         threadItem.RoundDate            := param;
279                 tipLastModified:                                // : TDateTime  // \83X\83\8c\83b\83h\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
280                         threadItem.LastModified := param;
281         end;
282
283 end;
284
285 // *************************************************************************
286 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e® 1 \8ds\82ð HTML \82É\95Ï\8a·\82·\82é
287 // *************************************************************************
288 function ThreadItemDat2HTML(
289         inInstance      : DWORD;                // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
290         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
291         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
292         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
293 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
294 var
295         threadItem : TThreadItem;
296         res : TResRec;
297         no : string;
298         resLink : TResLinkRec;
299 begin
300
301         threadItem      := TThreadItem( inInstance );
302         // \88ø\90\94\82ð\95ª\89ð
303         THTMLCreate.DivideStrLine( string( inDatRes ) , @res);
304         if AnsiCompareStr( string( inDatRes ) , '' ) <> 0 then begin
305                 res.FBody               := THTMLCreate.DeleteLink(res.FBody);
306                 resLink.FBbs    := threadItem.ParentBoard.BBSID;
307                 resLink.FKey    := ChangeFileExt( threadItem.FileName, '' );
308                 HTMLCreater.AddAnchorTag( @res );
309                 HTMLCreater.ConvRes( @res, @resLink );
310
311                 no                                      := IntToStr( inResNo );
312
313                 try
314                         if GikoSys.Setting.UseSkin then begin
315                                 // \83X\83L\83\93
316                                 if inIsNew then
317                                         Result := CreateResultString( HTMLCreater.SkinedRes(
318                                                 HTMLCreater.LoadFromSkin(
319                             GikoSys.GetSkinNewResFileName, threadItem, threadItem.Size
320                                                 ), @res, no
321                     ) )
322                 else
323                                         Result := CreateResultString( HTMLCreater.SkinedRes(
324                                                 HTMLCreater.LoadFromSkin(
325                             GikoSys.GetSkinResFileName, threadItem, threadItem.Size
326                         ), @res, no
327                     ) );
328             end else if GikoSys.Setting.UseCSS then begin
329                 // CSS
330                 if res.FName = '' then
331                     res.FName := '&nbsp;';
332                 if res.FMailTo = '' then
333                     Result := CreateResultString( '<a name="' + no + '"></a>'
334                                     + '<div class="header"><span class="no"><a href="menu:' + No + '">' + no + '</a></span> '
335                                     + '<span class="name_label">\96¼\91O\81F</span> '
336                                     + '<span class="name"><b>' + res.FName + '</b></span> '
337                                     + '<span class="date_label">\93\8a\8de\93ú\81F</span> '
338                                     + '<span class="date">' + res.FDateTime+ '</span></div>'
339                                     + '<div class="mes">' + res.FBody + ' </div>' )
340                 else if GikoSys.Setting.ShowMail then
341                     Result := CreateResultString( '<a name="' + no + '"></a>'
342                                     + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
343                                     + '<span class="name_label"> \96¼\91O\81F </span>'
344                                     + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
345                                     + '<b>' + res.FName + '</b></a><span class="mail"> [' + res.FMailTo + ']</span>'
346                                     + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
347                                     + '<span class="date"> ' + res.FDateTime+ '</span></div>'
348                                     + '<div class="mes">' + res.FBody + ' </div>' )
349                 else
350                     Result := CreateResultString( '<a name="' + no + '"></a>'
351                                     + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
352                                     + '<span class="name_label"> \96¼\91O\81F </span>'
353                                     + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
354                                     + '<b>' + res.FName + '</b></a>'
355                                     + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
356                                     + '<span class="date"> ' + res.FDateTime+ '</span></div>'
357                                     + '<div class="mes">' + res.FBody + ' </div>' );
358             end else begin
359                 // \83f\83t\83H\83\8b\83g
360                 if res.FMailTo = '' then
361                     Result := CreateResultString( '<a name="' + no + '"></a><dt><a href="menu:' + no + '">' + no + '</a> \96¼\91O\81F<font color="forestgreen"><b> ' + res.FName + ' </b></font> \93\8a\8de\93ú\81F ' + res.FDateTime+ '<br><dd>' + res.Fbody + ' <br><br><br>' )
362                 else if GikoSys.Setting.ShowMail then
363                     Result := CreateResultString( '<a name="' + no + '"></a><dt><a href="menu:' + no + '">' + no + '</a> \96¼\91O\81F<a href="mailto:' + res.FMailTo + '"><b> ' + res.FName + ' </B></a> [' + res.FMailTo + '] \93\8a\8de\93ú\81F ' + res.FDateTime+ '<br><dd>' + res.Fbody + ' <br><br><br>' )
364                 else
365                     Result := CreateResultString( '<a name="' + no + '"></a><dt><a href="menu:' + no + '">' + no + '</a> \96¼\91O\81F<a href="mailto:' + res.FMailTo + '"><b> ' + res.FName + ' </B></a> \93\8a\8de\93ú\81F ' + res.FDateTime+ '<br><dd>' + res.Fbody + ' <br><br><br>' );
366             end;
367         except
368             Result := nil;
369         end;
370     end else begin
371         Result := nil;
372     end;
373
374 end;
375
376 // *************************************************************************
377 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83w\83b\83_\82ð\8eæ\93¾\82·\82é
378 // *************************************************************************
379 function ThreadItemGetHeader(
380         inInstance                              : DWORD;        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
381         inOptionalHeader        : PChar         // \92Ç\89Á\82Ì\83w\83b\83_
382 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
383 var
384         threadItem                              : TThreadItem;
385         skinHeader                              : string;
386         optionalHeader          : string;
387 begin
388
389         {$IFDEF DEBUG}
390         Writeln('ExternalBoardManager.ThreadItemGetHeader');
391         {$ENDIF}
392         threadItem                      := TThreadItem( inInstance );
393         optionalHeader  := string( inOptionalHeader );
394
395         try
396                 if GikoSys.Setting.UseSkin then begin
397                         // \83X\83L\83\93
398                         skinHeader := HTMLCreater.LoadFromSkin( GikoSys.GetSkinHeaderFileName, threadItem, threadItem.Size );
399                         if Length( optionalHeader ) > 0 then
400                                 skinHeader :=
401                                         StringReplace( skinHeader, '</head>', optionalHeader + '</head><a name="top"></a>', [] );
402                 end else if GikoSys.Setting.UseCSS then begin
403                         // CSS
404                         skinHeader :=
405                                 '<html><head>' +
406                                 '<title>' + threadItem.Title + '</title>' +
407                                 '<link rel="stylesheet" href="'+ GikoSys.Setting.GetStyleSheetDir + GikoSys.Setting.CSSFileName +'" type="text/css">' +
408                                 optionalHeader +
409                                 '</head>' +
410                                 '<body>' +
411                                 '<a name="top"></a>' +
412                                 '<div class="title">' + threadItem.Title + '</div>';
413                 end else begin
414                         // \83f\83t\83H\83\8b\83g
415                         skinHeader :=
416                                 '<html><head>' +
417                                 '<title>' + threadItem.Title + '</title>' +
418                                 optionalHeader +
419                                 '</head>' +
420                                 '<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">' +
421                                 '<a name="top"></a>' +
422                                 '<font size=+1 color="#FF0000">' + threadItem.Title + '</font>' +
423                                 '<dl>';
424                 end;
425         except
426         end;
427
428         Result := CreateResultString( skinHeader );
429
430 end;
431
432 // *************************************************************************
433 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83t\83b\83^\82ð\8eæ\93¾\82·\82é
434 // *************************************************************************
435 function ThreadItemGetFooter(
436         inInstance                              : DWORD;        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
437         inOptionalFooter        : PChar         // \92Ç\89Á\82Ì\83t\83b\83^
438 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
439 var
440         threadItem                              : TThreadItem;
441         skinFooter                              : string;
442         optionalFooter          : string;
443 begin
444
445         {$IFDEF DEBUG}
446         Writeln('ExternalBoardManager.ThreadItemGetFooter');
447         {$ENDIF}
448         threadItem                      := TThreadItem( inInstance );
449         optionalFooter  := string( inOptionalFooter );
450
451         try
452                 if GikoSys.Setting.UseSkin then begin
453                         // \83X\83L\83\93
454                         skinFooter := HTMLCreater.LoadFromSkin( GikoSys.GetSkinFooterFileName, threadItem, threadItem.Size );
455                         if Length( optionalFooter ) > 0 then
456                                 skinFooter :=
457                                         StringReplace( skinFooter, '</body>', optionalFooter + '</body>', [] );
458                 end else if GikoSys.Setting.UseCSS then begin
459                         // CSS
460                         skinFooter :=
461                                 optionalFooter +
462                                 '</body></html>' +
463                                 '<a name="last"></a>' +
464                                 '</body></html>';
465                 end else begin
466                         // \83f\83t\83H\83\8b\83g
467                         skinFooter :=
468                                 '</dl>' +
469                                 optionalFooter +
470                                 '</body></html>' +
471                                 '<a name="last"></a>' +
472                                 '</body></html>';
473                 end;
474         except
475         end;
476
477         Result := CreateResultString( skinFooter );
478
479 end;
480
481 // *************************************************************************
482 // \83X\83\8c\83b\83h\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\90i\8ds\82µ\82½
483 // *************************************************************************
484 procedure ThreadItemWork(
485         inInstance      : DWORD;                        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
486         inWorkCount     : Integer                       // \8c»\8dÝ\82Ì\90i\95à\8fó\8bµ(\83J\83E\83\93\83g)
487 ); stdcall;
488 begin
489
490         if Assigned( OnWork ) then
491                 OnWork( TObject( inInstance ), wmRead, inWorkCount );
492
493 end;
494
495 // *************************************************************************
496 // \83X\83\8c\83b\83h\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\8en\82Ü\82Á\82½
497 // *************************************************************************
498 procedure ThreadItemWorkBegin(
499         inInstance                      : DWORD;        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
500         inWorkCountMax  : Integer       // \92Ê\90M\82Ì\8fI\82í\82è\82ð\8e¦\82·\83J\83E\83\93\83g
501 ); stdcall;
502 begin
503
504         if Assigned( OnWorkBegin ) then
505                 OnWorkBegin( TObject( inInstance ), wmRead, inWorkCountMax );
506
507 end;
508
509 // *************************************************************************
510 // \83X\83\8c\83b\83h\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\8fI\82í\82Á\82½
511 // *************************************************************************
512 procedure ThreadItemWorkEnd(
513         inInstance      : DWORD                         // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
514 ); stdcall;
515 begin
516
517         if Assigned( OnWorkEnd ) then
518                 OnWorkEnd( TObject( inInstance ), wmRead );
519
520 end;
521
522 exports
523         ThreadItemGetLong,
524         ThreadItemSetLong,
525         ThreadItemGetDouble,
526         ThreadItemSetDouble,
527         ThreadItemDat2HTML,
528         ThreadItemGetHeader,
529         ThreadItemGetFooter,
530         ThreadItemWork,
531         ThreadItemWorkBegin,
532         ThreadItemWorkEnd;
533
534 end.
535