Andy Wardley wrote:
> I can, but I'm just wondering why it doesn't re-use the code from 
> ttree which does the same thing.  

There's a new patch below which does the same thing re-using the ttree
code, or something similar.  Like ttree, it supports an rcfile (~/.tpagerc),
the -f option to load other configuration files, -h for help, and of course
all the other relevant TT options.

Please eyeball it, check it, confirm it works as expected, and I'll commit 
it to CVS.  We're still short of the appropriate documentation patch, if 
anyone feels so inclined....

And finally, thanks to Slaven for the original patch, and to Myk for the prod.

Cheers
A


Index: tpage
===================================================================
RCS file: /template-toolkit/Template2/bin/tpage,v
retrieving revision 2.63
diff -u -u -r2.63 tpage
--- tpage       2004/01/30 19:30:46     2.63
+++ tpage       2004/09/02 07:34:46
@@ -25,38 +25,154 @@
 
 use strict;
 use Template;
+use AppConfig;
 
-# look for -h or --help option, print usage and exit
-if (grep /^--?h(elp)?/, @ARGV) {
-    print "usage: tpage file [ file [...] ]\n";
-    exit 0;
-}
-my $vars = { };
-my ($var, $val);
+my $NAME     = "tpage";
+my $VERSION  = sprintf("%d.%02d", q$Revision: 0.00 $ =~ /(\d+)\.(\d+)/);
+my $HOME     = $ENV{ HOME } || '';
+my $RCFILE   = $ENV{"\U${NAME}rc"} || "$HOME/.${NAME}rc";
+my $TTMODULE = 'Template';
+
+# read .tpagerc file and any command line arguments
+my $config   = read_config($RCFILE);
+
+# unshift any perl5lib directories onto front of INC
+unshift(@INC, @{ $config->perl5lib });
 
-while ($ARGV[0] && $ARGV[0] =~ /^--?d(efine)?/) {
-    shift(@ARGV);
-    die "--define expect a 'variable=value' argument\n" 
-       unless defined ($var = shift(@ARGV));
-    ($var, $val) = split(/\s*=\s*/, $var, 2);
-    $vars->{ $var } = $val;
+# get all template_* options from the config and fold keys to UPPER CASE
+my %ttopts   = $config->varlist('^template_', 1);
+my $ttmodule = delete($ttopts{ module });
+my $ucttopts = {
+    map { my $v = $ttopts{ $_ }; defined $v ? (uc $_, $v) : () }
+    keys %ttopts,
+};
+
+# load custom template module 
+if ($ttmodule) {
+    my $ttpkg = $ttmodule;
+    $ttpkg =~ s[::][/]g;
+    $ttpkg .= '.pm';
+    require $ttpkg;
+}
+else {
+    $ttmodule = $TTMODULE;
 }
 
 # read from STDIN if no files specified
 push(@ARGV, '-') unless @ARGV;
 
-# create a template processor 
-my $template = Template->new({
-    ABSOLUTE => 1,
-    RELATIVE => 1,
-});
+my $template = $ttmodule->new($ucttopts)
+    || die $ttmodule->error();
 
 # process each input file 
 foreach my $file (@ARGV) {
     $file = \*STDIN if $file eq '-';
-    $template->process($file, $vars)
+    $template->process($file)
        || die $template->error();
 }
+
+
+sub read_config {
+    my $file = shift;
+
+    my $config = AppConfig->new(
+        { 
+            ERROR  => sub { die(@_, "\ntry `$NAME --help'\n") }
+        }, 
+        'help|h'      => { ACTION => \&help },
+        'template_absolute|absolute' => { DEFAULT => 1 },
+        'template_relative|relative' => { DEFAULT => 1 },
+        'template_module|module=s',
+        'template_anycase|anycase',
+        'template_eval_perl|eval_perl',
+        'template_load_perl|load_perl',
+        'template_interpolate|interpolate',
+        'template_pre_chomp|pre_chomp|prechomp',
+        'template_post_chomp|post_chomp|postchomp',
+        'template_trim|trim',
+        'template_variables|variables|define=s%',
+        'template_include_path|include_path|include|I=s@',
+        'template_pre_process|pre_process|preprocess=s@',
+        'template_post_process|post_process|postprocess=s@',
+        'template_process|process=s',
+        'template_wrapper|wrapper=s',
+        'template_recursion|recursion',
+        'template_expose_blocks|expose_blocks',
+        'template_default|default=s',
+        'template_error|error=s',
+        'template_debug|debug=s',
+        'template_start_tag|start_tag|starttag=s',
+        'template_end_tag|end_tag|endtag=s',
+        'template_tag_style|tag_style|tagstyle=s',
+        'template_compile_ext|compile_ext=s',
+        'template_compile_dir|compile_dir=s',
+        'template_plugin_base|plugin_base|pluginbase=s@',
+        'perl5lib|perllib=s@'
+    );
+
+    # add the 'file' option now that we have a $config object that we 
+    # can reference in a closure
+    $config->define(
+        'file|f=s@' => { 
+            EXPAND => AppConfig::EXPAND_ALL, 
+            ACTION => sub { 
+                my ($state, $item, $file) = @_;
+                $file = $state->cfg . "/$file" 
+                    unless $file =~ /^[\.\/]|(?:\w:)/;
+                $config->file($file) }  
+        }
+    );
+
+    # process main config file, then command line args
+    $config->file($file) if -f $file;
+    $config->args();
+    return $config;
+}
+
+
+sub help {
+    print<<END_OF_HELP;
+$NAME $VERSION (Template Toolkit version $Template::VERSION)
+
+usage: $NAME [options] [files]
+
+Options:
+   --define var=value       Define template variable
+   --interpolate            Interpolate '\$var' references in text
+   --anycase                Accept directive keywords in any case.
+   --pre_chomp              Chomp leading whitespace 
+   --post_chomp             Chomp trailing whitespace
+   --trim                   Trim blank lines around template blocks
+   --eval_perl              Evaluate [% PERL %] ... [% END %] code blocks
+   --load_perl              Load regular Perl modules via USE directive
+   --absolute               Allow ABSOLUTE directories (enabled by default)
+   --relative               Allow RELATIVE directories (enabled by default)
+   --include_path=DIR       Add directory to INCLUDE_PATH 
+   --pre_process=TEMPLATE   Process TEMPLATE before each main template
+   --post_process=TEMPLATE  Process TEMPLATE after each main template
+   --process=TEMPLATE       Process TEMPLATE instead of main template
+   --wrapper=TEMPLATE       Process TEMPLATE wrapper around main template
+   --default=TEMPLATE       Use TEMPLATE as default
+   --error=TEMPLATE         Use TEMPLATE to handle errors
+   --debug=STRING           Set TT DEBUG option to STRING
+   --start_tag=STRING       STRING defines start of directive tag
+   --end_tag=STRING         STRING defined end of directive tag
+   --tag_style=STYLE        Use pre-defined tag STYLE    
+   --plugin_base=PACKAGE    Base PACKAGE for plugins            
+   --compile_ext=STRING     File extension for compiled template files
+   --compile_dir=DIR        Directory for compiled template files
+   --perl5lib=DIR           Specify additional Perl library directories
+   --template_module=MODULE Specify alternate Template module
+
+See 'perldoc tpage' for further information.  
+
+END_OF_HELP
+
+    exit(0);
+}
+
+
+
 
 __END__
 

Reply via email to