OSDN Git Service

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