| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 | unit mgrfpdocproj;{$mode objfpc}{$H+}interfaceuses  Classes, SysUtils, fpdocproj, fpdocxmlopts;Type  { TFPDocProjectManager }  TFPDocProjectManager = Class(TComponent)  Private    FProject : TFPDocProject;    FPackage : TFPDocPackage;    FExpandMacros: Boolean;    FMacros: TStrings;    procedure SetMacros(AValue: TStrings);  protected    Procedure CheckPackage;    procedure GetItemsFromDirectory(AList: TStrings; ADirectory, AMask: String; ARecurse: Boolean);    procedure DoMacro(Sender: TObject; const TagString: String; TagParams: TStringList; out ReplaceText: String); virtual;    function ExpandMacrosInFile(AFileName: String): TStream; virtual;  Public    Constructor Create(AOwner : TComponent); override;    Destructor Destroy; override;    procedure AddDescrFilesFromDirectory(Const ADirectory, AMask : String; ARecurse: Boolean);    procedure AddInputFilesFromDirectory(Const ADirectory, AMask, AOptions: String; ARecurse: Boolean);    procedure AddInputFile(Const AFile : String; AOptions : String = '');    procedure AddImportFile(Const AFile,APrefix : String);    procedure AddDescrFile(Const AFile : String);    procedure RemoveInputFile(Const AFile : String);    procedure RemoveDescrFile(Const AFile : String);    procedure WriteOptionFile(const AFileName: String);    procedure ReadOptionFile(const AFileName: String);    Procedure Selectpackage(Const APackageName : String);    Procedure AddPackage (Const APackageName : String);    procedure SetOption(Const AOption : String; Enable : Boolean = True);    Property Project : TFPDocProject Read FProject;    Property SelectedPackage : TFPDocPackage Read FPackage;    Property Macros : TStrings Read FMacros Write SetMacros;    Property ExpandMacros : Boolean Read FExpandMacros Write FExpandMacros;  end;  EMgrFPDoc = Class(Exception);implementationuses dom,xmlread,fptemplate;procedure TFPDocProjectManager.SetMacros(AValue: TStrings);begin  if FMacros=AValue then Exit;  FMacros.Assign(AValue);end;procedure TFPDocProjectManager.DoMacro(Sender: TObject; const TagString: String;  TagParams: TStringList; out ReplaceText: String);begin  ReplaceText:=FMacros.Values[TagString];end;Procedure TFPDocProjectManager.GetItemsFromDirectory(AList : TStrings; ADirectory,AMask : String; ARecurse : Boolean);Var  D : String;  Info : TSearchRec;begin  D:=ADirectory;  if (D='.') then    D:='';  if (D<>'') then    D:=includeTrailingPathDelimiter(D);  If FindFirst(D+AMask,0,info)=0 then    try      Repeat      if ((Info.Attr and faDirectory)=0) then        AList.add(D+Info.Name);      Until (FindNext(Info)<>0);    finally      FindClose(Info);    end;  If ARecurse and (FindFirst(ADirectory+AMask,0,info)=0) then    try      Repeat      if ((Info.Attr and faDirectory)<>0) then        GetItemsFromDirectory(Alist,IncludeTrailingPathDelimiter(D+Info.Name),AMask,ARecurse);      Until (FindNext(Info)<>0);    finally      FindClose(Info);    end;end;constructor TFPDocProjectManager.Create(AOwner: TComponent);begin  inherited Create(AOwner);  FProject:=TFPDocProject.Create(Self);  FMacros:=TStringList.Create;end;destructor TFPDocProjectManager.Destroy;begin  FreeAndNil(FMacros);  FreeAndNil(FProject);  inherited Destroy;end;Function TFPDocProjectManager.ExpandMacrosInFile(AFileName : String) : TStream;Var  F : TFileStream;  T : TTemplateParser;begin  F:=TFileStream.Create(AFileName,fmOpenRead or fmShareDenyWrite);  try    Result:=TMemoryStream.Create;    try      T:=TTemplateParser.Create;      try        T.StartDelimiter:='$(';        T.EndDelimiter:=')';        T.AllowTagParams:=true;        T.OnReplaceTag:=@DoMacro;        T.ParseStream(F,Result);      finally        T.Free;      end;      Result.Position:=0;    except      FreeAndNil(Result);      Raise;    end;  finally    F.Free;  end;end;Procedure TFPDocProjectManager.AddDescrFilesFromDirectory(const ADirectory,AMask : String; ARecurse : Boolean);Var  L : TStringList;  M : String;begin  CheckPackage;  M:=AMask;  if (M='') then    M:='*.xml';  L:=TStringList.Create;  try    GetItemsFromDirectory(L,ADirectory,M,ARecurse);    FPackage.Descriptions.AddStrings(L);  finally    L.Free;  end;end;Procedure TFPDocProjectManager.AddInputFilesFromDirectory(Const ADirectory,AMask,AOptions : String; ARecurse : Boolean);Var  L : TStringList;  I : integer;  M : String;begin  CheckPackage;  M:=AMask;  if (M='') then    M:='*.pp';  L:=TStringList.Create;  try    GetItemsFromDirectory(L,ADirectory,M,ARecurse);    For I:=0 to L.Count-1 do      AddInputFile(L[i],AOPtions);  finally    L.Free;  end;end;procedure TFPDocProjectManager.AddInputFile(const AFile: String; AOptions : String = '');Var  S : String;begin  CheckPackage;  S:=AFile;  If (AOptions<>'') then    S:=AOptions+' '+S;  FPackage.Inputs.Add(S);end;procedure TFPDocProjectManager.AddImportFile(const AFile, APrefix: String);begin  CheckPackage;  FPackage.Imports.Add(AFile+','+APrefix);end;procedure TFPDocProjectManager.AddDescrFile(const AFile: String);begin  CheckPackage;  if FPackage.Descriptions.IndexOf(AFile)<>-1 then    Raise EMgrFPDoc.Createfmt('Duplicate description file : "%s"',[AFile]);  FPackage.Descriptions.Add(AFile);end;procedure TFPDocProjectManager.RemoveInputFile(const AFile: String);Var  I : Integer;begin  I:=FPackage.Inputs.IndexOf(AFile);  If (I<>-1) then    FPackage.Inputs.Delete(I);end;procedure TFPDocProjectManager.RemoveDescrFile(const AFile: String);Var  I : Integer;begin  I:=FPackage.Descriptions.IndexOf(AFile);  If (I<>-1) then    FPackage.Descriptions.Delete(I);end;procedure TFPDocProjectManager.ReadOptionFile(Const AFileName : String);Var  XML : TXMLDocument;  S : TStream;begin  With TXMLFPDocOptions.Create(Self) do    try      if not (ExpandMacros) then        LoadOptionsFromFile(FProject,AFileName)      else        begin        S:=ExpandMacrosInFile(AFileName);        try          ReadXMLFile(XML,S,AFileName);          try            LoadFromXml(FProject,XML)          finally            XML.Free;          end;        finally          S.Free;        end;        end;    finally      Free;    end;end;procedure TFPDocProjectManager.Selectpackage(const APackageName: String);begin  FPackage:=FProject.Packages.FindPackage(APackageName);  If (FPackage=Nil) then    Raise EMgrFPDoc.CreateFmt('Unknown package : "%s"',[APackageName]);end;procedure TFPDocProjectManager.AddPackage(const APackageName: String);begin  if FProject.Packages.FindPackage(APackageName)<>Nil then    Raise EMgrFPDoc.CreateFmt('Duplicate package : "%s"',[APackageName]);  FPackage:=FProject.Packages.Add as TFPDocPackage;  FPackage.Name:=APackageName;end;procedure TFPDocProjectManager.SetOption(const AOption: String;  Enable: Boolean = true);Var  O,V : String;  P : Integer;  EO : TEngineOptions;begin  V:=LowerCase(AOption);  P:=Pos('=',V);  If (P=0) then    P:=Length(V)+1;  O:=Copy(V,1,P-1);  Delete(V,1,P);  EO:=FProject.Options;  Case IndexOfString(o,OptionNames) of    0 : EO.HideProtected:=Enable;    1 : EO.WarnNoNode:=Enable;    2 : EO.ShowPrivate:=Enable;    3 : EO.StopOnParseError:=Enable;    4 : EO.ostarget:=v;    5 : EO.cputarget:=v;    6 : EO.MoDir:=V;    7 : EO.InterfaceOnly:=Not Enable;    8 : EO.Backend:=V;    9 : EO.Language:=v;    10 : EO.DefaultPackageName:=V;    11 : EO.DontTrim:=Enable;  else    EO.BackendOptions.add('--'+O);    EO.BackendOptions.add(v);  end;end;procedure TFPDocProjectManager.WriteOptionFile(Const AFileName : String);begin  With TXMLFPDocOptions.Create(Self) do    try      SaveOptionsToFile(FProject,AFileName);    finally      Free;    end;end;procedure TFPDocProjectManager.CheckPackage;begin  if (FPackage=Nil) then    Raise EMgrFPDoc.Create('Error: No package selected');end;end.
 |