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 )