Index: lib/TWiki/Templates.pm =================================================================== --- lib/TWiki/Templates.pm (revision 12188) +++ lib/TWiki/Templates.pm (working copy) @@ -207,10 +207,47 @@ =cut +sub saveTemplateToCache { + my( $this, $name, $skins, $web, $tmplText ) = @_; + $skins = '' unless (defined($skins)); + $web = '' unless (defined($web)); + + my $tmpl_cachedir = $TWiki::cfg{TemplateDir}.'_cache'; + mkdir($tmpl_cachedir) unless (-e $tmpl_cachedir); + my $filename = TWiki::Sandbox::untaintUnchecked($tmpl_cachedir.'/'.$name.'__'.$skins.'__'.$web.'.tmpl'); + + unless ( open( FILE, ">$filename" ) ) { + die "Can't create file $filename - $!\n"; + } + print FILE $tmplText; + close( FILE); +} +sub getTemplateFromCache { + my( $this, $name, $skins, $web ) = @_; + $skins = '' unless (defined($skins)); + $web = '' unless (defined($web)); + + my $tmpl_cachedir = $TWiki::cfg{TemplateDir}.'_cache'; + mkdir($tmpl_cachedir) unless (-e $tmpl_cachedir); + my $filename = TWiki::Sandbox::untaintUnchecked($tmpl_cachedir.'/'.$name.'__'.$skins.'__'.$web.'.tmpl'); + + if (-e $filename) { + open( IN_FILE, "<$filename" ) || return; + local $/ = undef; # set to read to EOF + my $data = ; + close( IN_FILE ); + return $data; + } +} + sub readTemplate { my( $this, $name, $skins, $web ) = @_; ASSERT($this->isa( 'TWiki::Templates')) if DEBUG; + my $cache = $this->getTemplateFromCache($name, $skins, $web); + return $cache if($cache); + print STDERR "template file cache miss - recreating ($name, $skins, $web)"; + $this->{files} = (); # recursively read template file(s) @@ -226,6 +263,7 @@ if( ! ( $text =~ /%TMPL\:/s ) ) { # no template processing $text =~ s|^(( {3})+)|"\t" x (length($1)/3)|geom; # leading spaces to tabs + $this->saveTemplateToCache($name, $skins, $web, $text); return $text; } @@ -263,6 +301,9 @@ $result =~ s/(%TMPL\:P{.*?}%)/$this->_expandTrivialTemplate($1)/geo; $result =~ s|^(( {3})+)|"\t" x (length($1)/3)|geom; # leading spaces to tabs + + $this->saveTemplateToCache($name, $skins, $web, $result); + return $result; }