fpdocxmlopts.pas 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. unit fpdocxmlopts;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpdocproj, dom;
  6. Type
  7. { TXMLFPocOptions }
  8. { TXMLFPDocOptions }
  9. TXMLFPDocOptions = Class(TComponent)
  10. Protected
  11. Procedure Error(Const Msg : String);
  12. Procedure Error(Const Fmt : String; Args : Array of Const);
  13. Procedure LoadPackage(APackage : TFPDocPackage; E : TDOMElement); virtual;
  14. Procedure LoadPackages(Packages : TFPDocPackages; E : TDOMElement);
  15. Procedure LoadEngineOptions(Options : TEngineOptions; E : TDOMElement); virtual;
  16. Public
  17. Procedure LoadOptionsFromFile(AProject : TFPDocProject; Const AFileName : String);
  18. Procedure LoadFromXML(AProject : TFPDocProject; XML : TXMLDocument); virtual;
  19. end;
  20. EXMLFPdoc = Class(Exception);
  21. implementation
  22. Uses XMLRead;
  23. Resourcestring
  24. SErrInvalidRootNode = 'Invalid options root node: Got "%s", expected "docproject"';
  25. SErrNoPackagesNode = 'No "packages" node found in docproject';
  26. SErrNoInputFile = 'unit tag without file attribute found';
  27. SErrNoDescrFile = 'description tag without file attribute';
  28. { TXMLFPDocOptions }
  29. Function IndexOfString(S : String; List : Array of string) : Integer;
  30. begin
  31. S:=UpperCase(S);
  32. Result:=High(List);
  33. While (Result>=0) and (S<>UpperCase(List[Result])) do
  34. Dec(Result);
  35. end;
  36. procedure TXMLFPDocOptions.Error(Const Msg: String);
  37. begin
  38. Raise EXMLFPDoc.Create(Msg);
  39. end;
  40. procedure TXMLFPDocOptions.Error(const Fmt: String; Args: array of const);
  41. begin
  42. Raise EXMLFPDoc.CreateFmt(Fmt,Args);
  43. end;
  44. procedure TXMLFPDocOptions.LoadPackage(APackage: TFPDocPackage; E: TDOMElement);
  45. Function LoadInput(I : TDOMElement) : String;
  46. Var
  47. S : String;
  48. begin
  49. Result:=I['file'];
  50. If (Result='') then
  51. Error(SErrNoInputFile);
  52. S:=I['options'];
  53. if (S<>'') then
  54. Result:=S+' '+Result;
  55. end;
  56. Function LoadDescription(I : TDOMElement) : String;
  57. Var
  58. S : String;
  59. begin
  60. Result:=I['file'];
  61. If (Result='') then
  62. Error(SErrNoDescrFile);
  63. end;
  64. Const
  65. OpCount = 0;
  66. OpNames : Array[0..OpCount] of string
  67. = ('');
  68. Var
  69. N,S : TDOMNode;
  70. O : TDomElement;
  71. begin
  72. APackage.Name:=E['name'];
  73. APackage.output:=E['output'];
  74. APackage.ContentFile:=E['contentfile'];
  75. N:=E.FirstChild;
  76. While (N<>Nil) do
  77. begin
  78. If (N.NodeType=ELEMENT_NODE) then
  79. begin
  80. O:=N as TDOMElement;
  81. If (O.NodeName='units') then
  82. begin
  83. S:=O.FirstChild;
  84. While (S<>Nil) do
  85. begin
  86. If (S.NodeType=Element_Node) and (S.NodeName='unit') then
  87. APackage.Inputs.add(LoadInput(S as TDomElement));
  88. S:=S.NextSibling;
  89. end;
  90. end
  91. else If (O.NodeName='descriptions') then
  92. begin
  93. S:=O.FirstChild;
  94. While (S<>Nil) do
  95. begin
  96. If (S.NodeType=Element_Node) and (S.NodeName='description') then
  97. APackage.Descriptions.add(LoadDescription(S as TDomElement));
  98. S:=S.NextSibling;
  99. end;
  100. end
  101. end;
  102. N:=N.NextSibling;
  103. end;
  104. end;
  105. procedure TXMLFPDocOptions.LoadPackages(Packages: TFPDocPackages; E: TDOMElement
  106. );
  107. Var
  108. N : TDOMNode;
  109. begin
  110. N:=E.FirstChild;
  111. While (N<>Nil) do
  112. begin
  113. If (N.NodeName='package') and (N.NodeType=ELEMENT_NODE) then
  114. LoadPackage(Packages.Add as TFPDocPackage, N as TDOMElement);
  115. N:=N.NextSibling;
  116. end;
  117. end;
  118. procedure TXMLFPDocOptions.LoadEngineOptions(Options: TEngineOptions;
  119. E: TDOMElement);
  120. Function TrueValue(V : String) : Boolean;
  121. begin
  122. V:=LowerCase(V);
  123. Result:=(v='true') or (v='1') or (v='yes');
  124. end;
  125. Const
  126. NCount = 10;
  127. ONames : Array[0..NCount] of string
  128. = ('hide-protected','warn-no-node','show-private',
  129. 'stop-on-parser-error', 'ostarget','cputarget',
  130. 'mo-dir','parse-impl','format', 'language',
  131. 'package');
  132. Var
  133. O : TDOMnode;
  134. N,V : String;
  135. begin
  136. O:=E.FirstChild;
  137. While (O<>Nil) do
  138. begin
  139. If (O.NodeType=Element_NODE) and (O.NodeName='option') then
  140. begin
  141. N:=LowerCase(TDOMElement(o)['name']);
  142. V:=TDOMElement(o)['value'];
  143. Case IndexOfString(N,ONames) of
  144. 0 : Options.HideProtected:=TrueValue(v);
  145. 1 : Options.WarnNoNode:=TrueValue(v);
  146. 2 : Options.ShowPrivate:=TrueValue(v);
  147. 3 : Options.StopOnParseError:=TrueValue(v);
  148. 4 : Options.ostarget:=v;
  149. 5 : Options.cputarget:=v;
  150. 6 : Options.MoDir:=V;
  151. 7 : Options.InterfaceOnly:=Not TrueValue(V);
  152. 8 : Options.Backend:=V;
  153. 9 : Options.Language:=v;
  154. 10 : Options.DefaultPackageName:=V;
  155. else
  156. Options.BackendOptions.add('--'+n);
  157. Options.BackendOptions.add(v);
  158. end;
  159. end;
  160. O:=O.NextSibling
  161. end;
  162. end;
  163. procedure TXMLFPDocOptions.LoadOptionsFromFile(AProject: TFPDocProject;
  164. const AFileName: String);
  165. Var
  166. XML : TXMLDocument;
  167. begin
  168. XMLRead.ReadXMLFile(XML,AFileName);
  169. try
  170. LoadFromXML(AProject,XML);
  171. finally
  172. FreeAndNil(XML);
  173. end;
  174. end;
  175. procedure TXMLFPDocOptions.LoadFromXML(AProject: TFPDocProject;
  176. XML: TXMLDocument);
  177. Var
  178. E : TDOMElement;
  179. N : TDomNode;
  180. begin
  181. E:=XML.DocumentElement;
  182. if (E.NodeName<>'docproject') then
  183. Error(SErrInvalidRootNode,[E.NodeName]);
  184. N:=E.FindNode('packages');
  185. If (N=Nil) or (N.NodeType<>ELEMENT_NODE) then
  186. Error(SErrNoPackagesNode);
  187. LoadPackages(AProject.Packages,N as TDomElement);
  188. N:=E.FindNode('options');
  189. If (N<>Nil) and (N.NodeType=ELEMENT_NODE) then
  190. LoadEngineOptions(AProject.Options,N as TDOMElement);
  191. end;
  192. end.