[fpc-pascal] Generating templates with FPTemplate

michael.vancanneyt at wisa.be michael.vancanneyt at wisa.be
Fri Jul 27 13:43:14 CEST 2012



On Fri, 27 Jul 2012, luciano de souza wrote:

> Hello all,
>
> I am trying to create an example with the FPTemplate unit. Firstly, I
> wrote a hypothetical unit template.

[snip]

>
> I am not successful in filling up the template. If I do
> writeln(source.template), the answer is an empty string. If I do
> writeln(source.GetContent), the answer is the template without the
> needed replacements.
>
> So I ask: what is wrong? How can I get a file, to replace tags and to
> get a replaced string?

1. You need only one of the two classes, never both at the same time. 
2. You need to set the correct delimiters. Default are { and }

If you want to have fixed values for parameters, the easiest is
TTemplateParser. TFPCustomTemplate (or TFPTemplate) does not have 
fixed values, everything is event driven.

So, the following will do what you want:

program e30;

{$mode objfpc}{$H+}

uses
   fptemplate, classes;

var
   T : TTemplateParser;
   Fin,Fout : TFileStream;

BEGIN
   T := TTemplateParser.create;
   try
     T.StartDelimiter:='<#';
     T.EndDelimiter:='>';
     T.values['name'] := 'freevox';
     T.values['modules'] := 'sysutils, classes';
     T.AllowTagParams:=False;
     Fin:=TFileStream.Create('e30.txt',fmOpenRead);
     try
       Fout:=TFileStream.Create('freevox.pas',fmCreate);
       try
         T.ParseStream(fin,fout);
       finally
         Fout.Free;
       end;
     finally
       Fin.Free;
     end;
   finally
     T.free;
   end;
end.

Running this produces the file you want:

fsb: >e30
fsb: >cat freevox.pas
unit freevox;
{$mode objfpc}{$H+}

interface
uses
sysutils, classes

implementation

end.

That's it.

In revision 21977, I added a ParseFiles call, which makes the program even
easier:

program e30;

{$mode objfpc}{$H+}

uses
   fptemplate, classes;

var
   T : TTemplateParser;

BEGIN
   T := TTemplateParser.create;
   try
     T.StartDelimiter:='<#';
     T.EndDelimiter:='>';
     T.values['name'] := 'freevox';
     T.values['modules'] := 'sysutils, classes';
     T.AllowTagParams:=False;
     T.ParseFiles('e30.txt','freevox.pas');
   finally
     T.free;
   end;
end.

Michael.



More information about the fpc-pascal mailing list