Re: [Templates] tpage extension

[prev] [thread] [next] [Date index for 2004/09/02]

From: Andy Wardley
Subject: Re: [Templates] tpage extension
Date: 07:42 on 02 Sep 2004
--7JfCtLOvnd9MIVvH
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

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



--7JfCtLOvnd9MIVvH
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="tpage.patch"

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__
 

--7JfCtLOvnd9MIVvH--

_______________________________________________
templates mailing list
templates@xxxxxxxxxxxxxxxx.xxx
http://lists.template-toolkit.org/mailman/listinfo/templates

(message missing)

Re: [Templates] tpage extension
Myk Melez 14:00 on 29 Aug 2004

Re: [Templates] tpage extension
Johan Vromans 15:07 on 29 Aug 2004

Re: [Templates] tpage extension
Andy Wardley 07:03 on 02 Sep 2004

Re: [Templates] tpage extension
Andy Wardley 07:42 on 02 Sep 2004

Re: [Templates] tpage extension
slaven 08:37 on 02 Sep 2004

Re: [Templates] tpage extension
Dylan Hardison 13:06 on 03 Sep 2004

[Templates] correct usage of Dumper plugin
Jamie Echlin 16:04 on 02 Sep 2004

Re: [Templates] correct usage of Dumper plugin
Jamie Echlin 16:39 on 02 Sep 2004

Re: [Templates] correct usage of Dumper plugin
Darren Chamberlain 16:45 on 02 Sep 2004

Re: [Templates] correct usage of Dumper plugin
Jamie Echlin 17:33 on 02 Sep 2004

Generated at 08:56 on 15 Mar 2005 by mariachi v0.52