=head1 NAME XAO::Templates - templates caching and retrieving module =head1 SYNOPSIS XXX =head1 DESCRIPTION XXX Templates retriever. Uses persistent cache to store once retrieved templates. Cache top level keys are site names, for system templates '/' is used as a site name. =cut ############################################################################### package XAO::Templates; use strict; use XAO::Base qw($homedir $projectsdir); use XAO::Utils; use XAO::Projects qw(get_current_project_name); use vars qw($VERSION); $VERSION=(0+sprintf('%u.%03u',(q$Id: Templates.pm,v 2.1 2005/01/14 01:39:56 am Exp $ =~ /\s(\d+)\.(\d+)\s/))) || die "Bad VERSION"; ## # Cache for templates. # use vars qw(%cache); ## # Getting the text of given template. # sub get (%) { my %args=@_; my $path=$args{path}; my $sitename=get_current_project_name(); if($path =~ /\.\.\//) { eprint "Bad template path -- sitename=",$sitename,", path=$path"; return undef; } ## # Checking in the memory cache. If there is a record, but it's # 'undef' then the template does not exist in that site's local # tree. # if(!defined $sitename) { return $cache{'/'}->{$path} if exists($cache{'/'}) && exists($cache{'/'}->{$path}); } elsif(exists $cache{$sitename} && exists $cache{$sitename}->{$path}) { my $template=$cache{$sitename}->{$path}; return $template if defined $template; ## # Otherwise we know we already tried, but failed and it's safe # to return the one from the system cache. # return $cache{'/'}->{$path} if exists($cache{'/'}) && exists($cache{'/'}->{$path}); } ## # Retrieving from disk. We only get here if cache was a miss. # my $system; my $tpath; if(defined $sitename) { $tpath="$projectsdir/$sitename/templates/$path"; $system=0; } if(! $tpath || ! -r $tpath) { $tpath="$homedir/templates/$path"; $system=1; } local *F; my $text; if(open(F,$tpath)) { local $/; $text=; close(F); } ## # Storing into cache. # if(!defined $text) { $cache{'/'}->{$path}=undef; $cache{$sitename}->{$path}=undef if defined $sitename; } elsif(length($text) < 100000) { if($system) { $cache{'/'}->{$path}=$text; $cache{$sitename}->{$path}=undef if defined $sitename; } else { $cache{$sitename}->{$path}=$text; } } return $text; } ############################################################################### =item filename ($;$) Checks if given path (first argument) exists and returns template's filename if it does and 'undef' if there is no template. Optional second argument refers to a sitename (project name), by default the current active project name is used. =cut sub filename ($;$) { my ($path,$sitename)=@_; $sitename||=get_current_project_name(); if($path =~ /\.\.\//) { eprint "Bad template path -- sitename=",$sitename,", path=$path"; return 0; } return undef if !defined($path) || $path eq ''; if(defined $sitename) { my $tn="$projectsdir/$sitename/templates/$path"; return $tn if -f $tn && -r _; } my $tn="$homedir/templates/$path"; return $tn if -f $tn && -r _; return undef; } ############################################################################### =item check (%) Deprecated method, do not use. =cut sub check (%) { my %args=@_; dprint "XAO::Templates::check - deprecated, use filename() instead"; return filename($args{path}) ? 1 : 0; } ############################################################################### # Complete list of all available templates in random order. # # Returns list in array context and array reference in scalar context. sub list (%) { eprint "XAO::Templates::list - is not supported any more"; my %args=@_; my $tpath; my $sitename=get_current_project_name(); if(defined $sitename) { $tpath="$projectsdir/$sitename/templates/"; } if(! $tpath || ! -r $tpath) { $tpath="$homedir/templates/"; } if(! $tpath || ! -r $tpath) { eprint "Templates::list - can't get list"; return wantarray ? () : undef; } local *F; if(!open(F,"/usr/bin/find $tpath -type f |")) { eprint "Templates::list - can't get list: $!\n"; return wantarray ? () : undef; } my @list=map { chomp; s/^$tpath//; $_ } ; close(F); wantarray ? @list : (@list ? \@list : undef); } ############################################################################### 1; __END__ =head1 AUTHOR Copyright (c) 2005 Andrew Maltsev Copyright (c) 2001-2004 Andrew Maltsev, XAO Inc. -- http://ejelta.com/xao/