NAME
Text::TemplateFill - Formatting of reports with templates from files, use for I18N
SYNOPSIS
use Text::TemplateFill;
my $tmpl = new Text::TemplateFill;
$tmpl->SetOpt('BaseDir' => "paras/$Country");
$tmpl->SetOpt('ErrorFunction' => \&LogMsg, 'LineTerminator' => "\r\n");
# Must read all the files before printing a paragraph
$tmpl->ReadPara('Header', "head");
$tmpl->ReadPara('FirstPage');
$tmpl->ReadPara('Footer');
$tmpl->ReadPara('Body');
$tmpl->SetOpt('StartPageTag' => 'Header');
my ($a, $b, $cn, $d) = ('a', 'letter b', 'ACME Inc', 4.92);
$tmpl->BindVars('NameOfA' => \$a, 'B' => \$b, 'CustomerName' => \$cn, 'VarD' => \$d);
print $tmpl->GeneratePara('FirstPage'); # Optional - since we want a specific 1st page
print $tmpl->GeneratePara('Body');
... $a = ...; $b = ...
print $tmpl->GeneratePara('Body');
print $tmpl->CompletePage;
DESCRIPTION
This module provides template-from-file driven report writing in a way that is as easy to use as perl's in-built write
verb. Major features are:
I18N formatting support, eg: decimal comma in France
I18N date support
Automatic page breaks
Variables are 'registered', not passed to each GeneratePara
Items of text (paragraphs) that are output are initially read from a text file.
Calculations may be defined as part of the paragraph definition in the file.
Optional use of your own Error reporting code
Variables can be formatted by the full power of printf
Automatic page/paragraph counting
Output is a string that may be then written anywhere
By putting the paragraph text in a file you separate style from substance (formatting from code), it is easy to have varients of the same reports, it is easy to generate the same report in different human languages.
BASIC CONCEPTS
A page is made up from a set of paragraphs; each paragraph is read from a file when the program starts; when a paragraph is generated the whole paragraph will be output on one page. A paragraph may be marked as a StartPage or an EndPage paragraph. The EndPage and StartPage paragraphs are automatically generated when needed. A group of paragraphs will be used in one template.
Paragraphs are given names called 'tags', these are used by the program when generating, and allow the paragraphs to refer to each other.
Program variables are bound by reference to names. This means that the generation function need not be called with a long list of values, as the variables change the new value is used when a paragraph is next generated. The bound variables must all be scalar variables.
PARAGRAPHS
Paragraphs are read in from files. The text that they contain is output verbatim with special sequences of the form ${ ... }
, these sequences are one of three types:
Variable substitution with optional formatting information
Option setting, eg language (L10N information/specification)
Calculations, eg summing the values of a variable
Comments
SAMPLE PARAGRAPH FILE
${#} The is a start of page paragraph
${Opt StartPage } This lines says so
${Opt Locale en_GB.ISO8859-1} Language.Characterset, see: man 7 locale
${#} Now and PageNo are automatically generated/maintained names
${Calc NumItems := Washers + Screws }
Date ${Now@time<%d %b %Y>} Report for ${CustomerName%-20.20s} Page ${PageNo%4.4d}
${#} end of paragraph file
PROGRAMMER USE
Create a new instance of a template, you should use one for each distinct output stream that you have; set any options, these are the same as the options that may be set with ${Opt ... }
, see below; read in the paragraphs; bind references to variables with names; generate paragraphs of output; optionally end the last page.
OPTIONS
Options may be set by use of the SetOpt
method, or by use of ${Opt Option Value}
in a paragraph's template file. If the option is in a template file the string ${Opt
must start the line, the entire line will then be discarded. If Value
is not present the value 1
is used. To specify the empty value use ${Opt Option ''}
.
Although all options can be set in the template file, it makes no sense to set some of them, eg ErrorFunction
.
- ErrorFunction
-
This is a function that accepts
printf
style arguments that will be called when an error is detected. If this is not specified the error will be sent tostderr
.A count of the number of errors is maintained in the method
Errors
, eg$tmpl->{Errors}
. - Locale
-
If this is set to something like
fr_FR.ISO8859-1
a switch will be made to the locale before the paragraph is generated, the (default) locale in effect before the use ofGeneratePara
will be reinstated after generation. Error messages will be printed in the default locale. TheLocale
setting is global to all paragraphs in a template, ie you only need to set it in one template file. You can use differentLocale
s in different templates. - BaseDir
-
This specifies the first part of the
path
that is used when a template file is read. The default is.
. - LineTerminator
-
This is the string that is output at the end of every line. The default is a single newline.
- EndPageSeq
-
This is a string that is output to end a page if there is no EndPage paragraph. You may want to set this to a string containing the form-feed character. If this is not set empty lines are used.
- PageLen
-
The length of the output page - number of lines.
- StartPage
-
If a paragraph contains this it will not be preceeded by a Start-Of-Page paragraph when it is generated. You may have several paragraphs marked with this option, for instance you might want the first page to start differently from subsequent pages.
The Start-Of-Page paragraph will be automatically generated when it is needed. A Start-Of-Page paragraph is located before the first paragraph is output, if there is more than one candidate the choice is random, if you want a specific paragraph, you should set it in the program with
SetOpt('StartPageTag' => tag_name)
or${Opt StartPageTag tag_name }
. - StartPageTag
-
Specify the tag of the paragraph that will be the default Start-Of-Page paragraph. This is only needed where there is more than one paragraph with the
StartPage
flag. Set this to the empty string to suppress a default start page:${Opt StartPageTag '' }
. - EndPage
-
A paragraph with this flag will be allowed to end a page. Before a paragraph is generated a check is made that the paragraph and any End-Of-Page paragraph will fit on what remains of the page, if not the end of page is generated followed by a start of page.
As with Start-Of-Page an End-Of-Page paragraph page will be determined before the first paragraph is output, you may specify when there is a choice with
SetOpt('EndPageTag' => tag_name)
. Empty lines will be used to ensure that the End-Of-Page paragraph ends on the last line of the page (seeBlanksAfter
), if there is no End-Of-Page paragraph,EndPageSeq
will be used if it is set. - BlanksAfter
-
Blank lines to ensure that the page is filled are to be generated after the paragraph, the default is before. This is only noticed on an EndPage.
- EndPageTag
-
Specify the tag of the paragraph that will be the default End-Of-Page paragraph. This is only needed where there is more than one paragraph with the
EndPage
flag. Set this to the empty string to suppress a default end page:${Opt EndPageTag '' }
. - PageLen
-
The number of lines on the page. A length of zero is taken to mean infinite.
COMMENTS
Comments are lines that start with ${#}
. The rest of line is ignored, the entire line is removed from input.
VARIABLE SUBSTITUTIONS
The basic syntax for a variable substitution within a template is ${variablename}
, where the name has been bound with BindVars
. The value will be printed using the minimum width.
You may specify printf
formatting after a %
, eg ${Counter%10d}
. You should refer to the perl documentation for full details of what you can specify. No check is made that the formatting code is appropriate for the variable type.
You can request special conversion, these are currently:
- time
-
The syntax is
${VariableName@time<format>}
. The variable value should be the number of seconds since the epoch. Theformat
is a string that will be passed tostrftime
, if this is missing%c
is used. - center
-
The variable is centered in the width specified, eg:
${Name@center<30>}
.
AUTOMATIC VARIABLES
Several variables are maintained by the package, these may be used in a variable substitution. All of these names will start with an upper case letter.
- PageNo
-
This is the current page number, it starts from 1 on the first page generated.
- PageLineNo
-
This is the line number on the current page.
- Now
-
This is the time at which the
new
method was invoked. - ParaOnPage
-
The number of times that the current paragraph has appeared on the current page. This might be used for item numbering.
- ParaTotal
-
The total number of times that the current paragraph has appeared.
It is possible for a page to refer to the automatic variables of another tag, by the syntax Tag.Name, eg ${Item.ParaTotal}
. The search path for a variable is: program variables, calculated variables, paragraph automatic variables; if a name is used more than once the last found is what is used.
CALCULATIONS
The syntax is ${Calc variable := expression }
. Calculations are done with the module Math::Expression
, see there for details. Calculations are performed before any lines of a paragraph are generated.
METHODS
- SetOpt
-
This may be used to set one or more options. The arguments are a set of option name/option value pairs.
- ReadPara
-
This reads a paragraph from a file. The two arguments are: the pargraph tag name, the file name. If the file name is not specified the tag name is used.
- BindVars
-
This is used to provide references to the variables that will be substituted when paragraphs are generated. The arguments are pairs of names and references. A warning is generated if a name is reused. The names must be alphanumeric. The variables bound must be scalar variables - ie no arrays or hashes.
- UnbindVars
-
This removes the binding to a variable. You may want to do this to rebind the name to a different variable.
- GeneratePara
-
This outputs a paragraph, the argument is the tag of the paragraph that you wish to output. The current values of any variables will be substituted. The result is a string that may be printed. If a
Locale
has been set, the locale will be selected before the paragraph is generated and reset afterwards. - CompletePage
-
This is used to end the current page. If a paragraph tag is specified that tag is used, otherwise the default end of page paragraph is used. If a tag is specified and it is not the default end page tag, a check will be made to see if the specified paragraph will fit on the page, if not a standard endpage is first done.
Nothing will be printed if the current page has not been started - should only happen if there has been no output at all.
- Reset
-
This resets all page and paragraph to zero. You would use this if you were to reuse a template to write to a new file.
AUTHOR
Alain D D Williams <addw@phcomp.co.uk>
Copyright and Version
Version "1.7", this is available as: $Text::TemplateFill::Version.
Copyright (c) 2003 Parliament Hill Computers Ltd/Alain D D Williams. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Please see the module source for the full copyright.