Changes

Jump to navigation Jump to search
676 bytes removed ,  00:03, 22 December 2013
Line 2: Line 2:  
== NAME ==
 
== NAME ==
 
  Text::Template - Expand template text with embedded Perl
 
  Text::Template - Expand template text with embedded Perl
 
+
In a root terminal you can do the command below if you want to display the up-to-date content
 +
perldoc Text::Template
 
== VERSION ==
 
== VERSION ==
   Line 9: Line 10:  
== SYNOPSIS ==
 
== SYNOPSIS ==
 
         use Text::Template;
 
         use Text::Template;
 
+
 
         $template = Text::Template->new(TYPE => ’FILE’,  SOURCE => ’filename.tmpl’);
 
         $template = Text::Template->new(TYPE => ’FILE’,  SOURCE => ’filename.tmpl’);
 
         $template = Text::Template->new(TYPE => ’ARRAY’, SOURCE => [ ... ] );
 
         $template = Text::Template->new(TYPE => ’ARRAY’, SOURCE => [ ... ] );
Line 15: Line 16:  
         $template = Text::Template->new(TYPE => ’STRING’, SOURCE => ’...’ );
 
         $template = Text::Template->new(TYPE => ’STRING’, SOURCE => ’...’ );
 
         $template = Text::Template->new(PREPEND => q{use strict;}, ...);
 
         $template = Text::Template->new(PREPEND => q{use strict;}, ...);
 
+
 
         # Use a different template file syntax:
 
         # Use a different template file syntax:
 
         $template = Text::Template->new(DELIMITERS => [$open, $close], ...);
 
         $template = Text::Template->new(DELIMITERS => [$open, $close], ...);
 
+
 
         $recipient = ’King’;
 
         $recipient = ’King’;
 
         $text = $template->fill_in();  # Replaces ‘{$recipient}’ with ‘King’
 
         $text = $template->fill_in();  # Replaces ‘{$recipient}’ with ‘King’
 
         print $text;
 
         print $text;
 
+
 
         $T::recipient = ’Josh’;
 
         $T::recipient = ’Josh’;
 
         $text = $template->fill_in(PACKAGE => T);
 
         $text = $template->fill_in(PACKAGE => T);
 
+
 
         # Pass many variables explicitly
 
         # Pass many variables explicitly
 
         $hash = { recipient => ’Abed-Nego’,
 
         $hash = { recipient => ’Abed-Nego’,
Line 36: Line 37:  
         # @friends is ( ’me’, ’you’ ),
 
         # @friends is ( ’me’, ’you’ ),
 
         # %enemies is ( loathsome => ..., fearsome => ... )
 
         # %enemies is ( loathsome => ..., fearsome => ... )
 
+
 
         # Call &callback in case of programming errors in template
 
         # Call &callback in case of programming errors in template
 
         $text = $template->fill_in(BROKEN => \&callback, BROKEN_ARG => $ref, ...);
 
         $text = $template->fill_in(BROKEN => \&callback, BROKEN_ARG => $ref, ...);
 
+
 
         # Evaluate program fragments in Safe compartment with restricted permissions
 
         # Evaluate program fragments in Safe compartment with restricted permissions
 
         $text = $template->fill_in(SAFE => $compartment, ...);
 
         $text = $template->fill_in(SAFE => $compartment, ...);
 
+
 
         # Print result text instead of returning it
 
         # Print result text instead of returning it
 
         $success = $template->fill_in(OUTPUT => \*FILEHANDLE, ...);
 
         $success = $template->fill_in(OUTPUT => \*FILEHANDLE, ...);
 
+
 
Parse template with different template file syntax:
 
Parse template with different template file syntax:
 
         $text = $template->fill_in(DELIMITERS => [$open, $close], ...);
 
         $text = $template->fill_in(DELIMITERS => [$open, $close], ...);
 
         # Note that this is *faster* than using the default delimiters
 
         # Note that this is *faster* than using the default delimiters
 
+
 
         # Prepend specified perl code to each fragment before evaluating:
 
         # Prepend specified perl code to each fragment before evaluating:
 
         $text = $template->fill_in(PREPEND => q{use strict ’vars’;}, ...);
 
         $text = $template->fill_in(PREPEND => q{use strict ’vars’;}, ...);
 
+
 
         use Text::Template ’fill_in_string’;
 
         use Text::Template ’fill_in_string’;
 
         $text = fill_in_string( <<EOM, PACKAGE => ’T’, ...);
 
         $text = fill_in_string( <<EOM, PACKAGE => ’T’, ...);
Line 59: Line 60:  
               Love,
 
               Love,
 
                 G.V.
 
                 G.V.
EOM
+
    EOM
 
+
 
         use Text::Template ’fill_in_file’;
 
         use Text::Template ’fill_in_file’;
 
         $text = fill_in_file($filename, ...);
 
         $text = fill_in_file($filename, ...);
 
+
 
         # All templates will always have ‘use strict vars’ attached to all fragments
 
         # All templates will always have ‘use strict vars’ attached to all fragments
 
         Text::Template->always_prepend(q{use strict ’vars’;});
 
         Text::Template->always_prepend(q{use strict ’vars’;});
Line 77: Line 78:     
               Dear {$title} {$lastname},
 
               Dear {$title} {$lastname},
 
+
 
               It has come to our attention that you are delinquent in your
 
               It has come to our attention that you are delinquent in your
 
               {$monthname[$last_paid_month]} payment.  Please remit
 
               {$monthname[$last_paid_month]} payment.  Please remit
 
               ${sprintf("%.2f", $amount)} immediately, or your patellae may
 
               ${sprintf("%.2f", $amount)} immediately, or your patellae may
 
               be needlessly endangered.
 
               be needlessly endangered.
 
+
 
                               Love,
 
                               Love,
 
+
 
                               Mark "Vizopteryx" Dominus
 
                               Mark "Vizopteryx" Dominus
   Line 90: Line 91:     
               Dear Mr. Gates,
 
               Dear Mr. Gates,
 
+
 
               It has come to our attention that you are delinquent in your
 
               It has come to our attention that you are delinquent in your
 
               February payment.  Please remit
 
               February payment.  Please remit
 
               $392.12 immediately, or your patellae may
 
               $392.12 immediately, or your patellae may
 
               be needlessly endangered.
 
               be needlessly endangered.
 
+
 
                               Love,
 
                               Love,
 
+
 
                               Mark "Vizopteryx" Dominus
 
                               Mark "Vizopteryx" Dominus
   Line 103: Line 104:     
               use Text::Template;
 
               use Text::Template;
 
+
 
               my $template = Text::Template->new(SOURCE => ’formletter.tmpl’)
 
               my $template = Text::Template->new(SOURCE => ’formletter.tmpl’)
 
                 or die "Couldn’t construct template: $Text::Template::ERROR";
 
                 or die "Couldn’t construct template: $Text::Template::ERROR";
 
+
 
               my @monthname = qw(January February March April May June
 
               my @monthname = qw(January February March April May June
 
                                   July August September October November December);
 
                                   July August September October November December);
Line 116: Line 117:  
                           monthname => \@monthname,
 
                           monthname => \@monthname,
 
                           );
 
                           );
 
+
 
               my $result = $template->fill_in(HASH => \%vars);
 
               my $result = $template->fill_in(HASH => \%vars);
 
+
 
               if (defined $result) { print $result }
 
               if (defined $result) { print $result }
 
               else { die "Couldn’t fill in template: $Text::Template::ERROR" }
 
               else { die "Couldn’t fill in template: $Text::Template::ERROR" }
Line 124: Line 125:  
=== Philosophy ===
 
=== Philosophy ===
   −
When people make a template module like this one, they almost always start by inventing a special syntax for substitutions.  For example, they build it so that a string like "%%VAR%%" is replaced with the value of $VAR.  Then they realize the need extra formatting, so they put in some special syntax for formatting.  Then they need a loop, so they invent a loop syntax.  Pretty soon they have a new little template language.
+
When people make a template module like this one, they almost always start by inventing a special syntax for substitutions.  For example, they build it so that a string like "%%VAR%%" is replaced with the value of $VAR.  Then they realize the need extra formatting, so they put in some special syntax for formatting.  Then they need a loop, so they invent a loop syntax.  Pretty soon they have a new little template language.<br />
This approach has two problems: First, their little language is crippled. If you need to do something the author hasn’t thought of, you lose.  Second: Who wants to learn another language?  You already know Perl, so why not use it?
+
 
 +
This approach has two problems: First, their little language is crippled. If you need to do something the author hasn’t thought of, you lose.  Second: Who wants to learn another language?  You already know Perl, so why not use it?<br />
 +
 
    
"Text::Template" templates are programmed in Perl.  You embed Perl code in your template, with "{" at the beginning and "}" at the end.  If you want a variable interpolated, you write it the way you would in Perl. If you need to make a loop, you can use any of the Perl loop constructions.  All the Perl built-in functions are available.
 
"Text::Template" templates are programmed in Perl.  You embed Perl code in your template, with "{" at the beginning and "}" at the end.  If you want a variable interpolated, you write it the way you would in Perl. If you need to make a loop, you can use any of the Perl loop constructions.  All the Perl built-in functions are available.
Line 168: Line 171:  
               The Lord High Chamberlain has gotten 42
 
               The Lord High Chamberlain has gotten 42
 
               things for me this year.
 
               things for me this year.
 
+
 
               That is 25 more than he gave me last year.
 
               That is 25 more than he gave me last year.
   Line 219: Line 222:  
               new Text::Template ( TYPE => ’FILE’, SOURCE => $filename );
 
               new Text::Template ( TYPE => ’FILE’, SOURCE => $filename );
   −
This reads the template from the specified file.  The filename is opened with the Perl "open" command, so it can be a pipe or anything else that makes sense with "open". The "TYPE" can also be "STRING", in which case the "SOURCE" should be a
+
This reads the template from the specified file.  The filename is opened with the Perl "open" command, so it can be a pipe or anything else that makes sense with "open". The "TYPE" can also be "STRING", in which case the "SOURCE" should be a string:
      string:
      
               new Text::Template ( TYPE => ’STRING’,
 
               new Text::Template ( TYPE => ’STRING’,
Line 303: Line 305:     
                   Your Royal Highness,
 
                   Your Royal Highness,
 
+
 
                   Enclosed please find a list of things I have gotten
 
                   Enclosed please find a list of things I have gotten
 
                   for you since 1907:
 
                   for you since 1907:
 
+
 
                   { foreach $item (@items) {
 
                   { foreach $item (@items) {
 
                       $item_no++;
 
                       $item_no++;
Line 312: Line 314:  
                     }
 
                     }
 
                   }
 
                   }
 
+
 
                   Signed,
 
                   Signed,
 
                   Lord High Chamberlain
 
                   Lord High Chamberlain
 
+
 
We want to pass in an array which will be assigned to the array @items.  Here’s how to do that:
 
We want to pass in an array which will be assigned to the array @items.  Here’s how to do that:
   Line 422: Line 424:  
The "BROKEN" function could also use the "BROKEN_ARG" as a reference to store an error message or some other information that it wants to communicate back to the caller.  For example:
 
The "BROKEN" function could also use the "BROKEN_ARG" as a reference to store an error message or some other information that it wants to communicate back to the caller.  For example:
 
                 $error = ’’;
 
                 $error = ’’;
 
+
 
                   sub my_broken {
 
                   sub my_broken {
 
                       my %args = @_;
 
                       my %args = @_;
Line 430: Line 432:  
                       return undef;
 
                       return undef;
 
                   }
 
                   }
 
+
 
                   $template->fill_in(BROKEN => \&my_broken,
 
                   $template->fill_in(BROKEN => \&my_broken,
 
                                       BROKEN_ARG => \$error,
 
                                       BROKEN_ARG => \$error,
 
                                     );
 
                                     );
 
+
 
                   if ($error) {
 
                   if ($error) {
 
                     die "It didn’t work: $error";
 
                     die "It didn’t work: $error";
Line 477: Line 479:  
               $Q::amount = 141.61;
 
               $Q::amount = 141.61;
 
               $Q::part = ’hyoid bone’;
 
               $Q::part = ’hyoid bone’;
 
+
 
               $text = Text::Template->fill_this_in( <<’EOM’, PACKAGE => Q);
 
               $text = Text::Template->fill_this_in( <<’EOM’, PACKAGE => Q);
 
               Dear {$name},
 
               Dear {$name},
Line 489: Line 491:     
"fill_this_in" is a deprecated feature.  It is only here for backwards compatibility, and may be removed in some far-future version in "Text::Template".  You should use "fill_in_string" instead.  It is described in the next section.
 
"fill_this_in" is a deprecated feature.  It is only here for backwards compatibility, and may be removed in some far-future version in "Text::Template".  You should use "fill_in_string" instead.  It is described in the next section.
 +
 
===== "fill_in_string" =====
 
===== "fill_in_string" =====
   Line 620: Line 623:  
                 ...
 
                 ...
 
               }
 
               }
 
+
 
 
               ...
 
               ...
 
+
 
               { # we forgot to put ‘use strict’ here
 
               { # we forgot to put ‘use strict’ here
 
                 my $result = $boo + 12;    # $boo is misspelled and should be $foo
 
                 my $result = $boo + 12;    # $boo is misspelled and should be $foo
Line 646: Line 649:  
                 ...
 
                 ...
 
               }
 
               }
 
+
 
               ...
 
               ...
 
+
 
               { my $result = $boo + 12;    # $boo is misspelled and should be $foo
 
               { my $result = $boo + 12;    # $boo is misspelled and should be $foo
 
                 ...
 
                 ...
Line 687: Line 690:     
===== JavaScript =====
 
===== JavaScript =====
 
+
Jennifer D. St Clair asks:
      Jennifer D. St Clair asks:
      
               > Most of my pages contain JavaScript and Stylesheets.
 
               > Most of my pages contain JavaScript and Stylesheets.
 
               > How do I change the template identifier?
 
               > How do I change the template identifier?
   −
      Jennifer is worried about the braces in the JavaScript being taken as
+
Jennifer is worried about the braces in the JavaScript being taken as the delimiters of the Perl program fragments.  Of course, disaster will ensue when perl tries to evaluate these as if they were Perl programs. The best choice is to find some unambiguous delimiter strings that you can use in your template instead of curly braces, and then use the "DELIMITERS" option.  However, if you can’t do this for some reason, there are  two easy workarounds:
      the delimiters of the Perl program fragments.  Of course, disaster will
  −
      ensue when perl tries to evaluate these as if they were Perl programs.
  −
      The best choice is to find some unambiguous delimiter strings that you
  −
      can use in your template instead of curly braces, and then use the
  −
      "DELIMITERS" option.  However, if you can’t do this for some reason,
  −
      there are  two easy workarounds:
     −
      1. You can put "\" in front of "{", "}", or "\" to remove its special
+
You can put "\" in front of "{", "}", or "\" to remove its special meaning.  So, for example, instead of
      meaning.  So, for example, instead of
      
                   if (br== "n3") {
 
                   if (br== "n3") {
Line 708: Line 703:  
                   }
 
                   }
   −
      you can put
+
you can put
    
                   if (br== "n3") \{
 
                   if (br== "n3") \{
Line 714: Line 709:  
                   \}
 
                   \}
   −
      and it’ll come out of the template engine the way you want.
+
and it’ll come out of the template engine the way you want.
   −
      But here is another method that is probably better.  To see how it
+
But here is another method that is probably better.  To see how it works, first consider what happens if you put this into a template:
      works, first consider what happens if you put this into a template:
      
                   { ’foo’ }
 
                   { ’foo’ }
   −
      Since it’s in braces, it gets evaluated, and obviously, this is going
+
Since it’s in braces, it gets evaluated, and obviously, this is going to turn into
      to turn into
      
                   foo
 
                   foo
   −
      So now here’s the trick: In Perl, "q{...}" is the same as '...'.  So if
+
So now here’s the trick: In Perl, "q{...}" is the same as '...'.  So if we wrote
      we wrote
      
                   {q{foo}}
 
                   {q{foo}}
   −
      it would turn into
+
it would turn into
    
                   foo
 
                   foo
   −
      So for your JavaScript, just write
+
So for your JavaScript, just write
    
                   {q{if (br== "n3") {
 
                   {q{if (br== "n3") {
Line 742: Line 734:  
                   }
 
                   }
   −
      and it’ll come out as
+
and it’ll come out as
    
                     if (br== "n3") {
 
                     if (br== "n3") {
Line 748: Line 740:  
                     }
 
                     }
   −
      which is what you want.
+
which is what you want.
   −
      Shut Up!
+
===== Shut Up! =====
   −
      People sometimes try to put an initialization section at the top of
+
People sometimes try to put an initialization section at the top of their templates, like this:
      their templates, like this:
      
               { ...
 
               { ...
Line 759: Line 750:  
               }
 
               }
   −
      Then they complain because there is a 17 at the top of the output that
+
Then they complain because there is a 17 at the top of the output that they didn’t want to have there.
      they didn’t want to have there.
     −
      Remember that a program fragment is replaced with its own return value,
+
Remember that a program fragment is replaced with its own return value, and that in Perl the return value of a code block is the value of the last expression that was evaluated, which in this case is 17.  If it didn’t do that, you wouldn’t be able to write "{$recipient}" and have the recipient filled in.
      and that in Perl the return value of a code block is the value of the
  −
      last expression that was evaluated, which in this case is 17.  If it
  −
      didn’t do that, you wouldn’t be able to write "{$recipient}" and have
  −
      the recipient filled in.
     −
      To prevent the 17 from appearing in the output is very simple:
+
To prevent the 17 from appearing in the output is very simple:
    
               { ...
 
               { ...
Line 775: Line 761:  
               }
 
               }
   −
      Now the last expression evaluated yields the empty string, which is
+
Now the last expression evaluated yields the empty string, which is invisible.  If you don’t like the way this looks, use
      invisible.  If you don’t like the way this looks, use
      
               { ...
 
               { ...
Line 783: Line 768:  
               }
 
               }
   −
      instead.  Presumably, $SILENTLY has no value, so nothing will be inter-
+
instead.  Presumably, $SILENTLY has no value, so nothing will be interpolated.  This is what is known as a ‘trick’.
      polated.  This is what is known as a ‘trick’.
     −
      Compatibility
+
===== Compatibility =====
   −
      Every effort has been made to make this module compatible with older
+
Every effort has been made to make this module compatible with older versions.  The only known exceptions follow:
      versions.  The only known exceptions follow:
     −
      The output format of the default "BROKEN" subroutine has changed twice,
+
The output format of the default "BROKEN" subroutine has changed twice, most recently between versions 1.31 and 1.40.
      most recently between versions 1.31 and 1.40.
     −
      Starting in version 1.10, the $OUT variable is arrogated for a special
+
Starting in version 1.10, the $OUT variable is arrogated for a special meaning.  If you had templates before version 1.10 that happened to use a variable named $OUT, you will have to change them to use some other variable or all sorts of strangeness will result.
      meaning.  If you had templates before version 1.10 that happened to use
  −
      a variable named $OUT, you will have to change them to use some other
  −
      variable or all sorts of strangeness will result.
     −
      Between versions 0.1b and 1.00 the behavior of the \ metacharacter
+
Between versions 0.1b and 1.00 the behavior of the \ metacharacter changed.  In 0.1b, \\ was special everywhere, and the template processor always replaced it with a single backslash before passing the code to Perl for evaluation.  The rule now is more complicated but probably more convenient.  See the section on backslash processing, below, for a full discussion.
      changed.  In 0.1b, \\ was special everywhere, and the template proces-
  −
      sor always replaced it with a single backslash before passing the code
  −
      to Perl for evaluation.  The rule now is more complicated but probably
  −
      more convenient.  See the section on backslash processing, below, for a
  −
      full discussion.
     −
      Backslash Processing
+
===== Backslash Processing =====
   −
      In "Text::Template" beta versions, the backslash was special whenever
+
In "Text::Template" beta versions, the backslash was special whenever it appeared before a brace or another backslash.  That meant that while "{"\n"}" did indeed generate a newline, "{"\\"}" did not generate a backslash, because the code passed to Perl for evaluation was "\" which is a syntax error.  If you wanted a backslash, you would have had to write "{"\\\\"}".
      it appeared before a brace or another backslash.  That meant that while
  −
      "{"\n"}" did indeed generate a newline, "{"\\"}" did not generate a
  −
      backslash, because the code passed to Perl for evaluation was "\" which
  −
      is a syntax error.  If you wanted a backslash, you would have had to
  −
      write "{"\\\\"}".
     −
      In "Text::Template" versions 1.00 through 1.10, there was a bug: Back-
+
In "Text::Template" versions 1.00 through 1.10, there was a bug: Backslash was special everywhere.  In these versions, "{"\n"}" generated the letter "n".
      slash was special everywhere.  In these versions, "{"\n"}" generated
  −
      the letter "n".
     −
      The bug has been corrected in version 1.11, but I did not go back to
+
The bug has been corrected in version 1.11, but I did not go back to exactly the old rule, because I did not like the idea of having to write "{"\\\\"}" to get one backslash.  The rule is now more complicated to remember, but probably easier to use.  The rule is now: Backslashes are always passed to Perl unchanged unless they occur as part of a sequence like "\\\\\\{" or "\\\\\\}".  In these contexts, they are special; "\\" is replaced with "\", and "\{" and "\}" signal a literal brace.
      exactly the old rule, because I did not like the idea of having to
  −
      write "{"\\\\"}" to get one backslash.  The rule is now more compli-
  −
      cated to remember, but probably easier to use.  The rule is now: Back-
  −
      slashes are always passed to Perl unchanged unless they occur as part
  −
      of a sequence like "\\\\\\{" or "\\\\\\}".  In these contexts, they are
  −
      special; "\\" is replaced with "\", and "\{" and "\}" signal a literal
  −
      brace.
     −
      Examples:
+
Examples:
    
               \{ foo \}
 
               \{ foo \}
   −
      is not evaluated, because the "\" before the braces signals that they
+
is not evaluated, because the "\" before the braces signals that they should be taken literally.  The result in the output looks like this:
      should be taken literally.  The result in the output looks like this:
      
               { foo }
 
               { foo }
   −
      This is a syntax error:
+
This is a syntax error:
    
               { "foo}" }
 
               { "foo}" }
   −
      because "Text::Template" thinks that the code ends at the first "}",
+
because "Text::Template" thinks that the code ends at the first "}", and then gets upset when it sees the second one.  To make this work correctly, use
      and then gets upset when it sees the second one.  To make this work
  −
      correctly, use
      
               { "foo\}" }
 
               { "foo\}" }
   −
      This passes "foo}" to Perl for evaluation.  Note there’s no "\" in the
+
This passes "foo}" to Perl for evaluation.  Note there’s no "\" in the evaluated code.  If you really want a "\" in the evaluated code, use
      evaluated code.  If you really want a "\" in the evaluated code, use
      
               { "foo\\\}" }
 
               { "foo\\\}" }
   −
      This passes "foo\}" to Perl for evaluation.
+
This passes "foo\}" to Perl for evaluation.
   −
      Starting with "Text::Template" version 1.20, backslash processing is
+
Starting with "Text::Template" version 1.20, backslash processing is disabled if you use the "DELIMITERS" option to specify alternative delimiter strings.
      disabled if you use the "DELIMITERS" option to specify alternative
  −
      delimiter strings.
     −
      A short note about $Text::Template::ERROR
+
===== A short note about $Text::Template::ERROR =====
   −
      In the past some people have fretted about ‘violating the package
+
In the past some people have fretted about ‘violating the package boundary’ by examining a variable inside the "Text::Template" package. Don’t feel this way.  $Text::Template::ERROR is part of the published, official interface to this package.  It is perfectly OK to inspect this variable.  The interface is not going to change.
      boundary’ by examining a variable inside the "Text::Template" package.
  −
      Don’t feel this way.  $Text::Template::ERROR is part of the published,
  −
      official interface to this package.  It is perfectly OK to inspect this
  −
      variable.  The interface is not going to change.
     −
      If it really, really bothers you, you can import a function called
+
If it really, really bothers you, you can import a function called "TTerror" that returns the current value of the $ERROR variable.  So you can say:
      "TTerror" that returns the current value of the $ERROR variable.  So
  −
      you can say:
      
               use Text::Template ’TTerror’;
 
               use Text::Template ’TTerror’;
 
+
 
               my $template = new Text::Template (SOURCE => $filename);
 
               my $template = new Text::Template (SOURCE => $filename);
 
               unless ($template) {
 
               unless ($template) {
Line 878: Line 826:  
               }
 
               }
   −
      I don’t see what benefit this has over just doing this:
+
I don’t see what benefit this has over just doing this:
    
               use Text::Template;
 
               use Text::Template;
 
+
 
 
               my $template = new Text::Template (SOURCE => $filename)
 
               my $template = new Text::Template (SOURCE => $filename)
 
                 or die "Couldn’t make template: $Text::Template::ERROR; aborting";
 
                 or die "Couldn’t make template: $Text::Template::ERROR; aborting";
   −
      But if it makes you happy to do it that way, go ahead.
+
But if it makes you happy to do it that way, go ahead.
   −
      Sticky Widgets in Template Files
+
===== Sticky Widgets in Template Files =====
   −
      The "CGI" module provides functions for ‘sticky widgets’, which are
+
The "CGI" module provides functions for ‘sticky widgets’, which are form input controls that retain their values from one page to the next. Sometimes people want to know how to include these widgets into their template output.
      form input controls that retain their values from one page to the next.
  −
      Sometimes people want to know how to include these widgets into their
  −
      template output.
     −
      It’s totally straightforward.  Just call the "CGI" functions from
+
It’s totally straightforward.  Just call the "CGI" functions from inside the template:
      inside the template:
      
               { $q->checkbox_group(NAME => ’toppings’,
 
               { $q->checkbox_group(NAME => ’toppings’,
Line 904: Line 848:  
               }
 
               }
   −
      Automatic preprocessing of program fragments
+
===== Automatic preprocessing of program fragments =====
   −
      It may be useful to preprocess the program fragments before they are
+
It may be useful to preprocess the program fragments before they are evaluated.  See "Text::Template::Preprocess" for more details.
      evaluated.  See "Text::Template::Preprocess" for more details.
     −
      Author
+
===== Author =====
   −
      Mark-Jason Dominus, Plover Systems
+
Mark-Jason Dominus, Plover Systems
   −
      Please send questions and other remarks about this software to
+
Please send questions and other remarks about this software to "mjd-perl-template+@plover.com"
      "mjd-perl-template+@plover.com"
     −
      You can join a very low-volume (<10 messages per year) mailing list for
+
You can join a very low-volume (<10 messages per year) mailing list for announcements about this package.  Send an empty note to "mjd-perl-tem-plate-request@plover.com" to join.
      announcements about this package.  Send an empty note to "mjd-perl-tem-
  −
      plate-request@plover.com" to join.
     −
      For updates, visit "http://www.plover.com/~mjd/perl/Template/".
+
For updates, visit "http://www.plover.com/~mjd/perl/Template/".
   −
      Support?
+
===== Support? =====
   −
      This software is version 1.45.  It may have bugs.  Suggestions and bug
+
This software is version 1.45.  It may have bugs.  Suggestions and bug reports are always welcome.  Send them to "mjd-perl-tem-plate+@plover.com".  (That is my address, not the address of the mailing list.  The mailing list address is a secret.)
      reports are always welcome.  Send them to "mjd-perl-tem-
  −
      plate+@plover.com".  (That is my address, not the address of the mail-
  −
      ing list.  The mailing list address is a secret.)
      
== LICENSE ==
 
== LICENSE ==
          Text::Template version 1.45
+
Text::Template version 1.45
          Copyright (C) 2008 Mark Jason Dominus
+
Copyright (C) 2008 Mark Jason Dominus
   −
          This program is free software; you can redistribute it and/or
+
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.  You may also can redistribute it and/or modify it under the terms of the Perl Artistic License.
          modify it under the terms of the GNU General Public License as
  −
          published by the Free Software Foundation; either version 2 of the
  −
          License, or (at your option) any later version.  You may also can
  −
          redistribute it and/or modify it under the terms of the Perl
  −
          Artistic License.
     −
          This program is distributed in the hope that it will be useful,
+
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
          but WITHOUT ANY WARRANTY; without even the implied warranty of
  −
          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  −
          GNU General Public License for more details.
     −
          You should have received copies of the GNU General Public License
+
You should have received copies of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
          along with this program; if not, write to the Free Software
  −
          Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
      
== THANKS ==
 
== THANKS ==
      Many thanks to the following people for offering support, encourage-
+
Many thanks to the following people for offering support, encouragement, advice, bug reports, and all the other good stuff.
      ment, advice, bug reports, and all the other good stuff.
+
 
 +
David H. Adler / Joel Appelbaum / Klaus Arnhold / Antonio Araga~o / Kevin Atteson / Chris.Brezil / Mike Brodhead / Tom Brown / Dr. Frank Bucolo / Tim Bunce / Juan E. Camacho / Itamar Almeida de Carvalho / Joseph Cheek / Gene Damon / San Deng / Bob Dougherty / Marek Grac / Dan Franklin / gary at dls.net / Todd A. Green / Donald L. Greer Jr. / Michelangelo Grigni / Zac Hansen / Tom Henry / Jarko Hietaniemi / Matt X. Hunter / Robert M. Ioffe / Daniel LaLiberte / Reuven M. Lerner / Trip Lilley / Yannis Livassof / Val Luck / Kevin Madsen / David Marshall / James Mastros / Joel Meulenberg / Jason Moore / Sergey Myasnikov / Chris Nandor / Bek Oberin / Steve Palincsar / Ron Pero / Hans Persson / Sean Roehnelt / Jonathan Roy / Shabbir J. Safdar / Jennifer D. St Clair / Uwe Schneider / Randal L. Schwartz / Michael G Schwern / Yonat Sharon / Brian C. Shensky / Niklas Skoglund / Tom Snee / Fred Steinberg / Hans Stoop / Michael J. Suzio / Dennis Taylor / James H.Thompson / Shad Todd / Lieven Tomme / Lorenzo Valdettaro / Larry Virden / Andy Wardley / Archie Warnock / Chris Wesley / Matt Womer / Andrew G Wood / Daini Xie / Michaely Yeung
 +
 
 +
==== Special thanks to: ====
 +
 
 +
===== Jonathan Roy =====
 +
for telling me how to do the "Safe" support (I spent two years worrying about it, and then Jonathan pointed out that it was trivial.)
   −
      David H. Adler / Joel Appelbaum / Klaus Arnhold / Antonio Araga~o /
+
===== Ranjit Bhatnagar =====
      Kevin Atteson / Chris.Brezil / Mike Brodhead / Tom Brown / Dr. Frank
+
for demanding less verbose fragments like they have in ASP, for helping me figure out the Right Thing, and, especially, for talking me out of adding any new syntax. These discussions resulted in the $OUT feature.
      Bucolo / Tim Bunce / Juan E. Camacho / Itamar Almeida de Carvalho /
  −
      Joseph Cheek / Gene Damon / San Deng / Bob Dougherty / Marek Grac / Dan
  −
      Franklin / gary at dls.net / Todd A. Green / Donald L. Greer Jr. /
  −
      Michelangelo Grigni / Zac Hansen / Tom Henry / Jarko Hietaniemi / Matt
  −
      X. Hunter / Robert M. Ioffe / Daniel LaLiberte / Reuven M. Lerner /
  −
      Trip Lilley / Yannis Livassof / Val Luck / Kevin Madsen / David Mar-
  −
      shall / James Mastros / Joel Meulenberg / Jason Moore / Sergey Myas-
  −
      nikov / Chris Nandor / Bek Oberin / Steve Palincsar / Ron Pero / Hans
  −
      Persson / Sean Roehnelt / Jonathan Roy / Shabbir J. Safdar / Jennifer
  −
      D. St Clair / Uwe Schneider / Randal L. Schwartz / Michael G Schwern /
  −
      Yonat Sharon / Brian C. Shensky / Niklas Skoglund / Tom Snee / Fred
  −
      Steinberg / Hans Stoop / Michael J. Suzio / Dennis Taylor / James H.
  −
      Thompson / Shad Todd / Lieven Tomme / Lorenzo Valdettaro / Larry Virden
  −
      / Andy Wardley / Archie Warnock / Chris Wesley / Matt Womer / Andrew G
  −
      Wood / Daini Xie / Michaely Yeung
     −
      Special thanks to:
+
==== Bugs and Caveats ====
   −
      Jonathan Roy
+
"my" variables in "fill_in" are still susceptible to being clobbered by template evaluation.  They all begin with "fi_", so avoid those names in your templates.
        for telling me how to do the "Safe" support (I spent two years worry-
  −
        ing about it, and then Jonathan pointed out that it was trivial.)
     −
      Ranjit Bhatnagar
+
The line number information will be wrong if the template’s lines are not terminated by "\n".  You should let me know if this is a problem. If you do, I will fix it.
        for demanding less verbose fragments like they have in ASP, for help-
  −
        ing me figure out the Right Thing, and, especially, for talking me
  −
        out of adding any new syntax. These discussions resulted in the $OUT
  −
        feature.
     −
      Bugs and Caveats
+
The $OUT variable has a special meaning in templates, so you cannot use it as if it were a regular variable.
   −
      "my" variables in "fill_in" are still susceptible to being clobbered by
+
There are not quite enough tests in the test suite.
      template evaluation.  They all begin with "fi_", so avoid those names
  −
      in your templates.
     −
      The line number information will be wrong if the template’s lines are
+
=== SEE ALSO ===
      not terminated by "\n".  You should let me know if this is a problem.
+
[[SME_Server:Documentation:Developers_Manual#Configuration_file_templates| Templated Configuration System]]<br />
      If you do, I will fix it.
     −
      The $OUT variable has a special meaning in templates, so you cannot use
+
[http://wiki.contribs.org/Esmith::templates Esmith::templates]
      it as if it were a regular variable.
     −
      There are not quite enough tests in the test suite.
+
[[Category:SME Server Development Framework]]
 +
[[Category:Development Tools]]
 +
[[Category:SME9-Development]]

Navigation menu