Text::MicroMason::TemplateDir - Use Base Directory and Relative Paths


Text-MicroMason documentation Contained in the Text-MicroMason distribution.

Index


Code Index:

NAME

Top

Text::MicroMason::TemplateDir - Use Base Directory and Relative Paths

SYNOPSIS

Top

Instead of using this class directly, pass its name to be mixed in:

    use Text::MicroMason;
    my $mason = Text::MicroMason->new( -TemplateDir, template_root=>'/foo' );

Use the standard compile and execute methods to parse and evalute templates:

  print $mason->compile( file=>$filepath )->( 'name'=>'Dave' );
  print $mason->execute( file=>$filepath, 'name'=>'Dave' );

Templates stored in files are looked up relative to the template root:

    print $mason->execute( file=>"includes/greeting.msn", 'name'=>'Charles');

When including other files into a template you can use relative paths:

    <& ../includes/greeting.msn, name => 'Alice' &>




DESCRIPTION

Top

This module changes the resolution of files passed to compile() and execute() to be relative to a base directory path or to the currently executing template.

Supported Attributes

template_root

Base directory from which to find templates.

strict_root

Optional directory beyond which not to read files. If set to 1, uses template_root, Causes read_file to croak if any filename outside of the root is provided. (Note that this is not a chroot jail and only affects attempts to load a file as a template; for greater security see the chroot() builtin and Text::MicroMason::Safe.)

Private Methods

prepare

Intercepts uses of file templates and applies the base-path adjustment.

read_file

Intercepts file access to check for strict_root.

EXCEPTIONS

The following additional exceptions are generated by Text::MicroMason::TemplateDir when appropriate:

SEE ALSO

Top

For an overview of this templating framework, see Text::MicroMason.

This is a mixin class intended for use with Text::MicroMason::Base.

For distribution, installation, support, copyright and license information, see Text::MicroMason::Docs::ReadMe.


Text-MicroMason documentation Contained in the Text-MicroMason distribution.

package Text::MicroMason::TemplateDir;

use strict;
use File::Spec;
use Cwd;

######################################################################

sub prepare {
    my ( $self, $src_type, $src_data ) = @_;
    
    return $self->NEXT('prepare', $src_type, $src_data ) 
        unless $src_type eq 'file';
    
    my $path = $self->resolve_path($src_data);
    return $self->NEXT('prepare', 'file' => $path, source_file => $path );
}

sub resolve_path {
    my ($self, $src_data) = @_;

    my $current = $self->{source_file};
    my $rootdir = $self->template_root();
    
    my $base = File::Spec->file_name_is_absolute($src_data) || 
        ! $current ? $rootdir : ( File::Spec->splitpath( $current ) )[1];

    return File::Spec->catfile( $base, $src_data );
}

sub template_root {
    my $self = shift;
    return $self->{template_root} || '.' unless @_;
    
    $self->{template_root} = shift;
}

sub cache_key {
    my $self = shift;
    my ($src_type, $src_data, %options) = @_;
    return $self->NEXT('cache_key', @_) unless $src_type eq 'file';
    return  $self->resolve_path($src_data);
}


# $contents = $mason->read_file( $filename );
sub read_file {
    my ( $self, $file ) = @_;
    
    if ( my $root = $self->{strict_root} ) {
        $root = $self->template_root if $root eq '1';
        my $path = Cwd::abs_path($file);
        my $root_path = Cwd::abs_path($root)
            or $self->croak_msg("Text::MicroMason::TemplateDir: Strict root '$root' doesn't seem to exist"); 
        # warn "Checking for '$root_path' in '$path' (file $file)\n";
        ( $path =~ /\A\Q$root_path\E/)
            or $self->croak_msg("Text::MicroMason::TemplateDir: Template '$path' not in required base path '$root_path'");
    }
    
    return $self->NEXT('read_file', $file );
}

######################################################################

1;

######################################################################