Delphi-int.ru: портал программистов

Вход Регистрация | Забыли пароль?

Просмотр кода

Идентификатор: 8f8ddb58 Описание: BB Code delphi unit Код загружен: 10 июня 2011, 10:18 (mirt.steelwater)

  1. unit BBCode;
  2. {******************************************************************************}
  3. {* BB Code Unit *}
  4. {* Do not use this unit in commercial projects *}
  5. {* Revolutionary Confederation of Anarcho Syndicalists *}
  6. {* Written by: black.rabbit 2010 *}
  7. {******************************************************************************}
  8. interface
  9.  
  10. uses
  11. Windows, SysUtils, Classes,
  12. ComCtrls, RichEdit;
  13.  
  14. procedure InsertBBCode (anObject: TRichEdit; const aBBCode: String);
  15.  
  16. implementation
  17.  
  18. type
  19. TEditStreamCallBack = function (dwCookie: LongInt;
  20. pbBuff: PByte;
  21. cb: LongInt;
  22. var pcb: LongInt) : DWORD; stdcall;
  23. TEditStreamData = packed record
  24. dwCookie : LongInt;
  25. dwError : LongInt;
  26. pfnCallback : TEditStreamCallBack;
  27. end;
  28.  
  29. function EditStreamInCallback (dwCookie: Longint;
  30. pbBuff: PByte;
  31. cb: Longint;
  32. var pcb: Longint) : DWORD; stdcall;
  33. var
  34. Stream : TStream;
  35. dataAvail : LongInt;
  36. begin
  37. Result := UINT (E_FAIL);
  38. try
  39. Stream := TStream (dwCookie);
  40. if Assigned (Stream) then
  41. with Stream do
  42. begin
  43. dataAvail := Size - Position;
  44. Result := 0;
  45. if ( dataAvail <= cb ) then
  46. begin
  47. pcb := Read (pbBuff^,dataAvail);
  48. if ( pcb <> dataAvail ) then
  49. Result := UINT (E_FAIL);
  50. end
  51. else
  52. begin
  53. pcb := Read (pbBuff^,cb);
  54. if ( pcb <> cb ) then
  55. Result := UINT (E_FAIL);
  56. end;
  57. end;
  58. except
  59. Result := UINT (E_FAIL);
  60. end;
  61. end;
  62.  
  63. procedure PutRTFSelection (anObject: TRichEdit; aSourceStream: TStream);
  64. var
  65. Data : TEditStreamData;
  66. begin
  67. try
  68. if ( not Assigned (anObject) ) then
  69. raise Exception.CreateFmt ('Объект класса ''%s'' не инициализирован!',
  70. [anObject.ClassName]);
  71. with Data do
  72. begin
  73. dwCookie := LongInt (aSourceStream);
  74. dwError := 0;
  75. pfnCallback := EditStreamInCallBack;
  76. end;
  77. anObject.Perform ( EM_STREAMIN, SF_RTF or SFF_SELECTION, LongInt (@Data) );
  78. except on E: Exception do
  79. raise Exception.CreateFmt ('Ошибка инъекции данных!'#13#10'%s',
  80. [E.Message]);
  81. end;
  82. end;
  83.  
  84. function StrReplace (const Source, Search, Replace: String) : String;
  85. var
  86. Buf1 : String;
  87. Buf2 : String;
  88. Buffer : String;
  89. begin
  90. Result := Source;
  91. Buf1 := '';
  92. Buf2 := Source;
  93. Buffer := Source;
  94. while ( Pos (Search, Buf2) > 0 ) do
  95. begin
  96. Buf2 := Copy ( Buf2, Pos (Search, Buf2), ( Length (Buf2) - Pos (Search, Buf2) ) + 1 );
  97. Buf1 := Copy ( Buffer, 1, Length (Buffer) - Length (Buf2) ) + Replace;
  98. Delete ( Buf2, Pos (Search, Buf2), Length (Search) );
  99. Buffer := Buf1 + Buf2;
  100. end;
  101. Result := Buffer;
  102. end;
  103.  
  104. function GetColors (var aBBCode: String; var aPallete: WORD) : String;
  105. var
  106. Buf1 : String;
  107. Buf2 : String;
  108. Buf3 : String;
  109. Buffer : String;
  110. color : String;
  111. R : Byte;
  112. G : Byte;
  113. B : Byte;
  114. begin
  115. Result := '';
  116. Buf1 := '';
  117. Buf2 := aBBCode;
  118. Buf3 := '';
  119. Buffer := aBBCode;
  120. R := 0;
  121. G := 0;
  122. B := 0;
  123. while ( Pos ('[COLOR:#',Buf2) > 0 ) do
  124. begin
  125. Buf2 := Copy ( Buf2, Pos ('[COLOR:#', Buf2), ( Length (Buf2) - Pos ('[COLOR:#', Buf2) ) + 1 );
  126. Buf1 := Copy ( Buffer, 1, Length (Buffer) - Length (Buf2) );
  127. color := Copy ( Buf2, Pos ('[COLOR:#', Buf2) + Length ('[COLOR:#'), Length ('RRGGBB') );
  128. R := StrToInt ( Format ('$%s',[Copy (color,1,2)]) );
  129. G := StrToInt ( Format ('$%s',[Copy (color,3,2)]) );
  130. B := StrToInt ( Format ('$%s',[Copy (color,5,2)]) );
  131. Result := Format ('%s\red%d\green%d\blue%d;',[Result,R,G,B]);
  132. Inc (aPallete);
  133. Delete ( Buf2, Pos ('[COLOR:#', Buf2), Length ('[COLOR:#RRGGBB]') );
  134. Buf3 := Copy ( Buf2, 1, ( Pos ('[/COLOR]', Buf2) - 1 ) );
  135. Buf2 := Copy ( Buf2, Pos ('[/COLOR]', Buf2) + Length ('[/COLOR]'), ( Length (Buf2) - Pos ('[/COLOR]', Buf2) ) +
  136. 1 );
  137. Buffer := Format ('%s\cf%d %s\cf0 %s',[Buf1,aPallete,Buf3,Buf2]);
  138. end;
  139. aBBCode := Buffer;
  140. end;
  141.  
  142. function GetBackgrounds (var aBBCode: String; var aPallete: WORD) : String;
  143. var
  144. Buf1 : String;
  145. Buf2 : String;
  146. Buf3 : String;
  147. Buffer : String;
  148. color : String;
  149. R : Byte;
  150. G : Byte;
  151. B : Byte;
  152. begin
  153. Result := '';
  154. Buf1 := '';
  155. Buf2 := aBBCode;
  156. Buf3 := '';
  157. Buffer := aBBCode;
  158. R := 0;
  159. G := 0;
  160. B := 0;
  161. while ( Pos ('[BACKGROUND:#',Buf2) > 0 ) do
  162. begin
  163. Buf2 := Copy ( Buf2, Pos ('[BACKGROUND:#', Buf2), ( Length (Buf2) - Pos ('[BACKGROUND:#', Buf2) ) + 1 );
  164. Buf1 := Copy ( Buffer, 1, Length (Buffer) - Length (Buf2) );
  165. color := Copy ( Buf2, Pos ('[BACKGROUND:#', Buf2) + Length ('[BACKGROUND:#'), Length ('RRGGBB') );
  166. R := StrToInt ( Format ('$%s',[Copy (color,1,2)]) );
  167. G := StrToInt ( Format ('$%s',[Copy (color,3,2)]) );
  168. B := StrToInt ( Format ('$%s',[Copy (color,5,2)]) );
  169. Result := Format ('%s\red%d\green%d\blue%d;',[Result,R,G,B]);
  170. Inc (aPallete);
  171. Delete ( Buf2, Pos ('[BACKGROUND:#', Buf2), Length ('[BACKGROUND:#RRGGBB]') );
  172. Buf3 := Copy ( Buf2, 1, ( Pos ('[/BACKGROUND]', Buf2) - 1 ) );
  173. Buf2 := Copy ( Buf2, Pos ('[/BACKGROUND]', Buf2) + Length ('[/BACKGROUND]'), ( Length (Buf2) - Pos
  174. ('[/BACKGROUND]', Buf2) ) + 1 );
  175. Buffer := Format ('%s\highlight%d %s\highlight0 %s',[Buf1,aPallete,Buf3,Buf2]);
  176. end;
  177. aBBCode := Buffer;
  178. end;
  179.  
  180. procedure InsertBBCode (anObject: TRichEdit; const aBBCode: String);
  181. var
  182. Stream : TStringStream;
  183. s : String;
  184. colors : String;
  185. backgrouns : String;
  186. palette : WORD;
  187. begin
  188. s := aBBCode;
  189. s := StrReplace (s,'[B]','\b ');
  190. s := StrReplace (s,'[/B]','\b0');
  191. s := StrReplace (s,'[I]','\i ');
  192. s := StrReplace (s,'[/I]','\i0');
  193. s := StrReplace (s,'[U]','\ul ');
  194. s := StrReplace (s,'[/U]','\ulnone');
  195. s := StrReplace (s,'[S]','\strike ');
  196. s := StrReplace (s,'[/S]','\strike0');
  197. s := StrReplace (s,#13#10,'\par ');
  198. palette := 0;
  199. colors := GetColors (s,palette);
  200. backgrouns := GetBackGrounds (s,palette);
  201. Stream := TStringStream.Create ( Format ('{\rtf1{\colortbl ;%s%s}%s}',
  202. [colors,backgrouns,s]) );
  203. if Assigned (Stream) then
  204. try
  205. PutRTFSelection (anObject,Stream);
  206. finally
  207. FreeAndNil (Stream);
  208. end;
  209. end;
  210.  
  211. end.

Ссылка на данный код:

На главную страницу сервиса обмена кодом »