123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- program laz2fpreport;
- {$mode objfpc}{$H+}
- uses
- Classes, SysUtils, CustApp, fpjson, fpreport, fplazreport, fpreportstreamer;
- type
- { TLazToFPReport }
- TLazToFPReport = class(TCustomApplication)
- Private
- FLazReport : TFPLazReport;
- FInputFile,
- FOutputFile : String;
- FFormatOutput : Boolean;
- FVerbose : Boolean;
- procedure Convert;
- procedure DoVerbose(Sender: TOBject; const Msg: String);
- protected
- procedure DoRun; override;
- public
- constructor Create(TheOwner: TComponent); override;
- destructor Destroy; override;
- procedure WriteHelp(Const aMsg :String); virtual;
- end;
- { TLazToFPReport }
- procedure TLazToFPReport.DoRun;
- var
- ErrorMsg: String;
- begin
- // quick check parameters
- ErrorMsg:=CheckOptions('hi:o:vf', ['help','input:','output:','verbose','format']);
- if (ErrorMsg<>'') or HasOption('h','help') then
- WriteHelp(ErrorMsg);
- FInputFile:=GetOptionValue('i','input');
- if FInputFile='' then
- WriteHelp('No input file specified.');
- FOutputFile:=GetOptionValue('o','output');
- If FOutputFile='' then
- FOutputFile:=ChangeFileExt(FinputFile,'.json');
- FFormatOutput:=HasOption('f','format');
- FVerbose:=HasOption('v','verbose');
- if FVerbose then
- FLazReport.OnLog:=@DoVerbose;
- Convert;
- Terminate;
- end;
- procedure TLazToFPReport.Convert;
- Var
- S : TFPReportJSONStreamer;
- F : TFileStream;
- J : TJSONStringType;
- begin
- FLazReport.LoadFromFile(FInputFile);
- F:=Nil;
- S:=TFPReportJSONStreamer.Create(Self);
- try
- FLazReport.WriteElement(S);
- if FFormatOutput then
- J:=S.JSON.FormatJSON()
- else
- J:=S.JSON.AsJSON;
- F:=TFileStream.Create(FOutputFile,fmCreate);
- F.Write(J[1],Length(J)); // Single byte type.
- finally
- F.Free;
- S.Free;
- end;
- end;
- procedure TLazToFPReport.DoVerbose(Sender: TOBject; const Msg: String);
- begin
- if FVerbose then
- Writeln(StdErr,Msg);
- end;
- constructor TLazToFPReport.Create(TheOwner: TComponent);
- begin
- inherited Create(TheOwner);
- StopOnException:=True;
- FLazReport:=TFPLazReport.Create(Self);
- end;
- destructor TLazToFPReport.Destroy;
- begin
- FreeAndNil(FLazReport);
- inherited Destroy;
- end;
- procedure TLazToFPReport.WriteHelp(const aMsg: String);
- begin
- if (aMsg<>'') then
- Writeln('Error : ',aMsg);
- writeln('Usage: ', ExeName, ' [options] -i filename');
- Writeln('Where options are: ');
- Writeln('-f --format Write formatted JSON to output file');
- Writeln('-h --help This help message');
- Writeln('-i --input=filename input file name, must be a .lrf file, in XML format.');
- Writeln('-o --output=filename output file name.');
- Writeln(' If not specified, input file with extension changed to .json is used.');
- Writeln('-v --verbose Print some diagnostic information');
- Halt(Ord(aMsg<>''));
- end;
- var
- Application: TLazToFPReport;
- begin
- Application:=TLazToFPReport.Create(nil);
- Application.Title:='LazReport to FPReport Converter';
- Application.Run;
- Application.Free;
- end.
|