mgrfpdocproj.pp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. unit mgrfpdocproj;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpdocproj, fpdocxmlopts;
  6. Type
  7. { TFPDocProjectManager }
  8. TFPDocProjectManager = Class(TComponent)
  9. Private
  10. FProject : TFPDocProject;
  11. FPackage : TFPDocPackage;
  12. FExpandMacros: Boolean;
  13. FMacros: TStrings;
  14. procedure SetMacros(AValue: TStrings);
  15. protected
  16. Procedure CheckPackage;
  17. procedure GetItemsFromDirectory(AList: TStrings; ADirectory, AMask: String; ARecurse: Boolean);
  18. procedure DoMacro(Sender: TObject; const TagString: String; TagParams: TStringList; out ReplaceText: String); virtual;
  19. function ExpandMacrosInFile(AFileName: String): TStream; virtual;
  20. Public
  21. Constructor Create(AOwner : TComponent); override;
  22. Destructor Destroy; override;
  23. procedure AddDescrFilesFromDirectory(Const ADirectory, AMask : String; ARecurse: Boolean);
  24. procedure AddInputFilesFromDirectory(Const ADirectory, AMask, AOptions: String; ARecurse: Boolean);
  25. procedure AddInputFile(Const AFile : String; AOptions : String = '');
  26. procedure AddImportFile(Const AFile,APrefix : String);
  27. procedure AddDescrFile(Const AFile : String);
  28. procedure RemoveInputFile(Const AFile : String);
  29. procedure RemoveDescrFile(Const AFile : String);
  30. procedure WriteOptionFile(const AFileName: String);
  31. procedure ReadOptionFile(const AFileName: String);
  32. Procedure Selectpackage(Const APackageName : String);
  33. Procedure AddPackage (Const APackageName : String);
  34. procedure SetOption(Const AOption : String; Enable : Boolean = True);
  35. Property Project : TFPDocProject Read FProject;
  36. Property SelectedPackage : TFPDocPackage Read FPackage;
  37. Property Macros : TStrings Read FMacros Write SetMacros;
  38. Property ExpandMacros : Boolean Read FExpandMacros Write FExpandMacros;
  39. end;
  40. EMgrFPDoc = Class(Exception);
  41. implementation
  42. uses dom,xmlread,fptemplate;
  43. procedure TFPDocProjectManager.SetMacros(AValue: TStrings);
  44. begin
  45. if FMacros=AValue then Exit;
  46. FMacros.Assign(AValue);
  47. end;
  48. procedure TFPDocProjectManager.DoMacro(Sender: TObject; const TagString: String;
  49. TagParams: TStringList; out ReplaceText: String);
  50. begin
  51. ReplaceText:=FMacros.Values[TagString];
  52. end;
  53. Procedure TFPDocProjectManager.GetItemsFromDirectory(AList : TStrings; ADirectory,AMask : String; ARecurse : Boolean);
  54. Var
  55. D : String;
  56. Info : TSearchRec;
  57. begin
  58. D:=ADirectory;
  59. if (D='.') then
  60. D:='';
  61. if (D<>'') then
  62. D:=includeTrailingPathDelimiter(D);
  63. If FindFirst(D+AMask,0,info)=0 then
  64. try
  65. Repeat
  66. if ((Info.Attr and faDirectory)=0) then
  67. AList.add(D+Info.Name);
  68. Until (FindNext(Info)<>0);
  69. finally
  70. FindClose(Info);
  71. end;
  72. If ARecurse and (FindFirst(ADirectory+AMask,0,info)=0) then
  73. try
  74. Repeat
  75. if ((Info.Attr and faDirectory)<>0) then
  76. GetItemsFromDirectory(Alist,IncludeTrailingPathDelimiter(D+Info.Name),AMask,ARecurse);
  77. Until (FindNext(Info)<>0);
  78. finally
  79. FindClose(Info);
  80. end;
  81. end;
  82. constructor TFPDocProjectManager.Create(AOwner: TComponent);
  83. begin
  84. inherited Create(AOwner);
  85. FProject:=TFPDocProject.Create(Self);
  86. FMacros:=TStringList.Create;
  87. end;
  88. destructor TFPDocProjectManager.Destroy;
  89. begin
  90. FreeAndNil(FMacros);
  91. FreeAndNil(FProject);
  92. inherited Destroy;
  93. end;
  94. Function TFPDocProjectManager.ExpandMacrosInFile(AFileName : String) : TStream;
  95. Var
  96. F : TFileStream;
  97. T : TTemplateParser;
  98. begin
  99. F:=TFileStream.Create(AFileName,fmOpenRead or fmShareDenyWrite);
  100. try
  101. Result:=TMemoryStream.Create;
  102. try
  103. T:=TTemplateParser.Create;
  104. try
  105. T.StartDelimiter:='$(';
  106. T.EndDelimiter:=')';
  107. T.AllowTagParams:=true;
  108. T.OnReplaceTag:=@DoMacro;
  109. T.ParseStream(F,Result);
  110. finally
  111. T.Free;
  112. end;
  113. Result.Position:=0;
  114. except
  115. FreeAndNil(Result);
  116. Raise;
  117. end;
  118. finally
  119. F.Free;
  120. end;
  121. end;
  122. Procedure TFPDocProjectManager.AddDescrFilesFromDirectory(const ADirectory,AMask : String; ARecurse : Boolean);
  123. Var
  124. L : TStringList;
  125. M : String;
  126. begin
  127. CheckPackage;
  128. M:=AMask;
  129. if (M='') then
  130. M:='*.xml';
  131. L:=TStringList.Create;
  132. try
  133. GetItemsFromDirectory(L,ADirectory,M,ARecurse);
  134. FPackage.Descriptions.AddStrings(L);
  135. finally
  136. L.Free;
  137. end;
  138. end;
  139. Procedure TFPDocProjectManager.AddInputFilesFromDirectory(Const ADirectory,AMask,AOptions : String; ARecurse : Boolean);
  140. Var
  141. L : TStringList;
  142. I : integer;
  143. M : String;
  144. begin
  145. CheckPackage;
  146. M:=AMask;
  147. if (M='') then
  148. M:='*.pp';
  149. L:=TStringList.Create;
  150. try
  151. GetItemsFromDirectory(L,ADirectory,M,ARecurse);
  152. For I:=0 to L.Count-1 do
  153. AddInputFile(L[i],AOPtions);
  154. finally
  155. L.Free;
  156. end;
  157. end;
  158. procedure TFPDocProjectManager.AddInputFile(const AFile: String; AOptions : String = '');
  159. Var
  160. S : String;
  161. begin
  162. CheckPackage;
  163. S:=AFile;
  164. If (AOptions<>'') then
  165. S:=AOptions+' '+S;
  166. FPackage.Inputs.Add(S);
  167. end;
  168. procedure TFPDocProjectManager.AddImportFile(const AFile, APrefix: String);
  169. begin
  170. CheckPackage;
  171. FPackage.Imports.Add(AFile+','+APrefix);
  172. end;
  173. procedure TFPDocProjectManager.AddDescrFile(const AFile: String);
  174. begin
  175. CheckPackage;
  176. if FPackage.Descriptions.IndexOf(AFile)<>-1 then
  177. Raise EMgrFPDoc.Createfmt('Duplicate description file : "%s"',[AFile]);
  178. FPackage.Descriptions.Add(AFile);
  179. end;
  180. procedure TFPDocProjectManager.RemoveInputFile(const AFile: String);
  181. Var
  182. I : Integer;
  183. begin
  184. I:=FPackage.Inputs.IndexOf(AFile);
  185. If (I<>-1) then
  186. FPackage.Inputs.Delete(I);
  187. end;
  188. procedure TFPDocProjectManager.RemoveDescrFile(const AFile: String);
  189. Var
  190. I : Integer;
  191. begin
  192. I:=FPackage.Descriptions.IndexOf(AFile);
  193. If (I<>-1) then
  194. FPackage.Descriptions.Delete(I);
  195. end;
  196. procedure TFPDocProjectManager.ReadOptionFile(Const AFileName : String);
  197. Var
  198. XML : TXMLDocument;
  199. S : TStream;
  200. begin
  201. With TXMLFPDocOptions.Create(Self) do
  202. try
  203. if not (ExpandMacros) then
  204. LoadOptionsFromFile(FProject,AFileName)
  205. else
  206. begin
  207. S:=ExpandMacrosInFile(AFileName);
  208. try
  209. ReadXMLFile(XML,S,AFileName);
  210. try
  211. LoadFromXml(FProject,XML)
  212. finally
  213. XML.Free;
  214. end;
  215. finally
  216. S.Free;
  217. end;
  218. end;
  219. finally
  220. Free;
  221. end;
  222. end;
  223. procedure TFPDocProjectManager.Selectpackage(const APackageName: String);
  224. begin
  225. FPackage:=FProject.Packages.FindPackage(APackageName);
  226. If (FPackage=Nil) then
  227. Raise EMgrFPDoc.CreateFmt('Unknown package : "%s"',[APackageName]);
  228. end;
  229. procedure TFPDocProjectManager.AddPackage(const APackageName: String);
  230. begin
  231. if FProject.Packages.FindPackage(APackageName)<>Nil then
  232. Raise EMgrFPDoc.CreateFmt('Duplicate package : "%s"',[APackageName]);
  233. FPackage:=FProject.Packages.Add as TFPDocPackage;
  234. FPackage.Name:=APackageName;
  235. end;
  236. procedure TFPDocProjectManager.SetOption(const AOption: String;
  237. Enable: Boolean = true);
  238. Var
  239. O,V : String;
  240. P : Integer;
  241. EO : TEngineOptions;
  242. begin
  243. V:=LowerCase(AOption);
  244. P:=Pos('=',V);
  245. If (P=0) then
  246. P:=Length(V)+1;
  247. O:=Copy(V,1,P-1);
  248. Delete(V,1,P);
  249. EO:=FProject.Options;
  250. Case IndexOfString(o,OptionNames) of
  251. 0 : EO.HideProtected:=Enable;
  252. 1 : EO.WarnNoNode:=Enable;
  253. 2 : EO.ShowPrivate:=Enable;
  254. 3 : EO.StopOnParseError:=Enable;
  255. 4 : EO.ostarget:=v;
  256. 5 : EO.cputarget:=v;
  257. 6 : EO.MoDir:=V;
  258. 7 : EO.InterfaceOnly:=Not Enable;
  259. 8 : EO.Backend:=V;
  260. 9 : EO.Language:=v;
  261. 10 : EO.DefaultPackageName:=V;
  262. 11 : EO.DontTrim:=Enable;
  263. else
  264. EO.BackendOptions.add('--'+O);
  265. EO.BackendOptions.add(v);
  266. end;
  267. end;
  268. procedure TFPDocProjectManager.WriteOptionFile(Const AFileName : String);
  269. begin
  270. With TXMLFPDocOptions.Create(Self) do
  271. try
  272. SaveOptionsToFile(FProject,AFileName);
  273. finally
  274. Free;
  275. end;
  276. end;
  277. procedure TFPDocProjectManager.CheckPackage;
  278. begin
  279. if (FPackage=Nil) then
  280. Raise EMgrFPDoc.Create('Error: No package selected');
  281. end;
  282. end.