CTKlib
view release on metacpan or search on metacpan
lib/CTK/Skel.pm view on Meta::CPAN
# Get skels list
my @skels = $self->skels;
unless ($name && grep {$_ eq $name} @skels) {
carp("Incorrect scope name. Allowed: ".join(", ",@skels));
return 0;
}
$rplc = {} unless ref($rplc) eq 'HASH';
# Directories normalize
$self->dirs() if $self->can('dirs');
# Pools normalize
$self->pool() if $self->can('pool');
# To next build() in modules
my $ret = $self->maybe::next::method();
return 0 unless $ret;
#
# Building
#
my $_rplc = $self->{rplc};
for (keys %$_rplc) { $rplc->{$_} = $_rplc->{$_} }
# Post-processing: directories
my $subdirs = $self->{subdirs} || {};
my $vd = $subdirs->{$name};
foreach my $d (@$vd) {
my @ds = split(/\//,_ff($d->{path}, $rplc));
my $path = $root ? File::Spec->catdir($root, @ds) : File::Spec->catdir(@ds);
my $mode = defined $d->{mode} ? $d->{mode} : DIRMODE;
if (preparedir($path, $mode)) {
$self->_debug(_yep("%s", $path));
} else {
$self->_debug(_nope("Can't create directory \"%s\" [%o]", $path, $mode));
}
}
# Post-processing: files
my $pools = $self->{pools} || {};
my $vp = $pools->{$name};
foreach my $p (@$vp) {
next if $p->{type} && !isostype($p->{type}); # Type check
my $b64 = ($p->{encode} && $p->{encode} eq 'base64') ? 1 : 0;
my $fname = $p->{name} || 'noname';
unless ($p->{file}) {
$self->_debug(_skip("Skip %s file: path not defined!", $fname));
next;
}
my @ds = split(/\//,_ff($p->{file}, $rplc));
my $file = File::Spec->catfile($root, @ds);
if (-e $file) {
$self->_debug(_skip("%s", $file));
next;
}
my $mode = $p->{mode};
my $st = 0;
if ($b64) { $st = bsave($file, decode_base64( $p->{data} )) }
else { $st = bsave($file, CTK::Util::lf_normalize(_ff($p->{data}, $rplc)), 1) }
if ($st && -e $file) {
chmod($mode, $file) if defined($mode);
$self->_debug(_yep("%s", $file));
} else {
$self->_debug(_nope("Can't create file \"%s\" [%o]", $file, $mode // 0));
return 0;
}
}
return 1;
}
sub dirs {
my $self = shift;
$self->maybe::next::method();
my $dirs = $self->{subdirs} || {};
foreach my $kd (keys %$dirs) {
if (ref($dirs->{$kd}) eq 'HASH') {
$dirs->{$kd} = [$dirs->{$kd}];
} elsif (ref($dirs->{$kd}) eq 'ARRAY') {
# OK;
} else {
carp "Directory incorrect. Array or hash expected!" if $dirs->{$kd};
}
}
return 1;
}
sub pool {
my $self = shift;
$self->maybe::next::method();
my $boundary = $self->{boundary};
my $pools = $self->{pools} || {};
foreach my $kd (keys %$pools) {
my $buff = $pools->{$kd};
my @pool;
$buff =~ s/$boundary/_bcut($1,\@pool)/ge;
foreach my $r (@pool) {
my $name = ($r =~ /^\s*name\s*\:\s*(.+?)\s*$/mi) ? $1 : '';
my $file = ($r =~ /^\s*file\s*\:\s*(.+?)\s*$/mi) ? $1 : '';
my $mode = ($r =~ /^\s*mode\s*\:\s*(.+?)\s*$/mi) ? $1 : '';
my $type = ($r =~ /^\s*type\s*\:\s*(.+?)\s*$/mi) ? $1 : '';
my $enc = ($r =~ /^\s*encode\s*\:\s*(.+?)\s*$/mi) ? $1 : '';
my $data = ($r =~ /\s*\r?\n\s*\r?\n(.+)/s) ? $1 : '';
$mode = undef unless $mode =~ /^[0-9]{1,3}$/;
$r = {
name => $name,
file => $file,
data => lf_normalize($data), # CRLF correct
mode => defined($mode) ? oct($mode) : undef,
type => $type,
encode => $enc,
};
}
$pools->{$kd} = [@pool];
}
return 1;
}
# Methods
sub _load {
my $self = shift;
my $module = shift;
( run in 3.328 seconds using v1.01-cache-2.11-cpan-483215c6ad5 )