mkfpdocproj.pp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. program mkfpdocproj;
  2. {$mode objfpc}{$H+}
  3. uses
  4. Classes, SysUtils, fpdocproj, fpdocxmlopts, CustApp;
  5. type
  6. { TManageFPDocProjectApplication }
  7. TManageFPDocProjectApplication = class(TCustomApplication)
  8. private
  9. procedure ParseOptions;
  10. protected
  11. FRecurse : boolean;
  12. FDirectory,
  13. FMask,
  14. FPackageName,
  15. FInputFileName,
  16. FOutputFileName : String;
  17. FProject : TFPDocProject;
  18. FPackage : TFPDocPackage;
  19. procedure ReadOptionFile(const AFileName: String);
  20. procedure Usage(AExitCode: Integer);
  21. procedure WriteOptionFile(const AFileName: String);
  22. procedure AddFilesFromDirectory(ADirectory, AMask: String; ARecurse: Boolean);
  23. procedure DoRun; override;
  24. public
  25. constructor Create(TheOwner: TComponent); override;
  26. end;
  27. { TManageFPDocProjectApplication }
  28. procedure TManageFPDocProjectApplication.Usage(AExitCode : Integer);
  29. begin
  30. // to be filled
  31. Halt(AExitCode);
  32. end;
  33. procedure TManageFPDocProjectApplication.ParseOptions;
  34. Var
  35. PN : String;
  36. begin
  37. FInputFileName:=GetOptionValue('i','input');
  38. FOutputFileName:=GetOptionValue('o','output');
  39. FPackageName:=GetOptionValue('p','package');
  40. if (FOutputFileName='') then
  41. FOutputFileName:=FInputFileName;
  42. FDirectory:=GetOptionValue('d','directory');
  43. FMask:=GetOptionValue('m','mask');
  44. FRecurse:=HasOption('r','recurse');
  45. if HasOption('h','help') then
  46. Usage(0);
  47. end;
  48. Procedure TManageFPDocProjectApplication.AddFilesFromDirectory(ADirectory,AMask : String; ARecurse : Boolean);
  49. Var
  50. Info : TSearchRec;
  51. D : String;
  52. begin
  53. if (AMask='') then
  54. AMask:='*.xml';
  55. D:=ADirectory;
  56. if (D<>'') then
  57. D:=includeTrailingPathDelimiter(D);
  58. If FindFirst(D+AMask,0,info)=0 then
  59. try
  60. Repeat
  61. if ((Info.Attr and faDirectory)=0) then
  62. FPackage.Descriptions.add(D+Info.Name);
  63. Until (FindNext(Info)<>0);
  64. finally
  65. FindClose(Info);
  66. end;
  67. If ARecurse and (FindFirst(ADirectory+AMask,0,info)=0) then
  68. try
  69. Repeat
  70. if ((Info.Attr and faDirectory)<>0) then
  71. AddFilesFromDirectory(IncludeTrailingPathDelimiter(D+Info.Name),AMask,ARecurse);
  72. Until (FindNext(Info)<>0);
  73. finally
  74. FindClose(Info);
  75. end;
  76. end;
  77. procedure TManageFPDocProjectApplication.ReadOptionFile(Const AFileName : String);
  78. begin
  79. With TXMLFPDocOptions.Create(Self) do
  80. try
  81. LoadOptionsFromFile(FProject,AFileName);
  82. finally
  83. Free;
  84. end;
  85. end;
  86. procedure TManageFPDocProjectApplication.WriteOptionFile(Const AFileName : String);
  87. begin
  88. With TXMLFPDocOptions.Create(Self) do
  89. try
  90. SaveOptionsToFile(FProject,AFileName);
  91. finally
  92. Free;
  93. end;
  94. end;
  95. procedure TManageFPDocProjectApplication.DoRun;
  96. begin
  97. ParseOptions;
  98. ReadOptionFile(FInputFileName);
  99. FPackage:=FProject.Packages.FindPackage(FPackageName);
  100. If (FDirectory<>'') or (FMask<>'') then
  101. AddFilesFromDirectory(FDirectory,FMask, FRecurse);
  102. WriteOptionFile(FOutputFileName);
  103. Terminate;
  104. end;
  105. constructor TManageFPDocProjectApplication.Create(TheOwner: TComponent);
  106. begin
  107. inherited Create(TheOwner);
  108. StopOnException:=True;
  109. FProject:=TFPDocProject.Create(Self);
  110. end;
  111. var
  112. Application: TManageFPDocProjectApplication;
  113. begin
  114. Application:=TManageFPDocProjectApplication.Create(nil);
  115. Application.Title:='Program to manipulate FPDoc project files';
  116. Application.Run;
  117. Application.Free;
  118. end.