Any-Template-ProcessDir
view release on metacpan or search on metacpan
lib/Any/Template/ProcessDir.pm view on Meta::CPAN
my $self = shift;
my $template_file_suffix = $self->template_file_suffix;
return
defined($template_file_suffix) ? qr/\Q$template_file_suffix\E$/ : qr/.|/;
}
sub process_dir {
my ($self) = @_;
my $source_dir = $self->source_dir;
my $dest_dir = $self->dest_dir;
if ( !$self->same_dir ) {
remove_tree($dest_dir);
die "could not remove '$dest_dir'" if -d $dest_dir;
}
my $ignore_files = $self->ignore_files;
my @source_files =
find_wanted( sub { -f && !$ignore_files->($File::Find::name) },
$source_dir );
my $template_file_suffix = $self->template_file_suffix;
foreach my $source_file (@source_files) {
$self->generate_dest_file($source_file);
}
if ( !$self->same_dir ) {
$self->generate_readme();
try { $self->generate_source_symlink() };
}
}
sub generate_dest_file {
my ( $self, $source_file ) = @_;
my $template_file_regex = $self->template_file_regex;
substr( ( my $dest_file = $source_file ), 0, length( $self->source_dir ) ) =
$self->dest_dir;
my $dest_text;
if ( $source_file =~ $template_file_regex ) {
$dest_file =
substr( $dest_file, 0,
-1 * length( $self->template_file_suffix || '' ) );
my $code = $self->process_file;
$dest_text = $code->( $source_file, $self );
}
elsif ( !$self->same_dir ) {
$dest_text = read_file($source_file);
}
else {
return;
}
if ( $self->same_dir ) {
unlink($dest_file);
}
else {
make_path( dirname($dest_file) );
chmod( $self->dir_create_mode(), dirname($dest_file) )
if defined( $self->dir_create_mode() );
}
write_file( $dest_file, $dest_text );
chmod( $self->file_create_mode(), $dest_file )
if defined( $self->file_create_mode() );
}
sub _build_process_file {
return sub {
my ( $file, $self ) = @_;
my $code = $self->process_text;
return $code->( read_file($file), $self );
}
}
sub _build_process_text {
return sub { die "must specify one of process_file or process_text" }
}
sub generate_readme {
my $self = shift;
if ( defined( $self->readme_filename ) ) {
my $readme_file = catfile( $self->dest_dir, $self->readme_filename );
unlink($readme_file);
write_file(
$readme_file,
"Files in this directory generated from "
. $self->source_dir . ".\n",
"Do not edit files here, as they will be overwritten. Edit the source instead!"
);
}
}
sub generate_source_symlink {
my $self = shift;
# Create symlink from dest dir back to source dir.
#
my $source_link = catdir( $self->dest_dir, "source" );
unlink($source_link) if -e $source_link;
symlink( $self->source_dir, $source_link );
}
1;
__END__
=pod
=head1 NAME
Any::Template::ProcessDir -- Process a directory of templates
=head1 VERSION
version 0.08
=head1 SYNOPSIS
use Any::Template::ProcessDir;
# Process templates and generate result files in a single directory
( run in 1.522 second using v1.01-cache-2.11-cpan-39bf76dae61 )