App-Mowyw
view release on metacpan or search on metacpan
lib/App/Mowyw.pm view on Meta::CPAN
or confess "Can't open file '$fn' for reading: $!";
my $str = do { local $/; <$fh> };
# print $str;
parse_str($str, $meta);
}
sub parse_str {
my ($str, $meta) = @_;
my @tokens = lex_string($str);
# print Data::Dumper->Dump(\@tokens);
return parse_tokens(\@tokens, $meta);
}
sub get_meta_data {
my $fn = shift;
my $meta = {
ITEMS => [],
FILES => [],
CURRENT_ITEM => undef,
OPTIONS => {},
VARS => {},
};
my $global_include_fn = get_include_filename('include', 'global', $fn);
if (-e $global_include_fn ){
# warn "Reading global include file '$global_include_fn'\n";
$meta->{FILES} = [$global_include_fn];
# use parse_file for its side effects on meta
my $g = parse_file($global_include_fn, $meta);
}
# replace call stack
# otherwise all files seem to be included from the globl include file,
# which is somewhat ugly
$meta->{FILES} = [];
return $meta;
}
sub process_file {
my ($fn, $config) = @_;
my $new_fn = get_online_fn($fn);
# process file at all?
my $process = 0;
# use Data::Dumper;
# print Dumper $App::Mowyw::config{file_filter};
for my $f(@{$App::Mowyw::config{file_filter}}){
my ($include, undef, $re) = @$f;
if ($fn =~ m/$re/){
$process = $include;
last;
}
}
# print +($process ? '' : 'not '), "processing file $fn\n";
if ($process){
if ($config{make_behaviour} and -e $new_fn and (stat($fn))[9] < (stat($new_fn))[9]){
return;
}
print STDERR "Processing File '$fn'..." unless $config{quiet};
my $metadata = get_meta_data($fn);
push @{$metadata->{FILES}}, $fn;
my $str = parse_file($fn, $metadata);
# print Data::Dumper->Dump([$metadata]);
my $header = "";
my $footer = "";
# warn $str;
unless (exists $metadata->{OPTIONS}{'no-header'}){
my $m = my_dclone($metadata);
my $header_fn = get_include_filename('include', 'header', $fn);
unshift @{$m->{FILES}}, $header_fn;
$header = parse_file($header_fn, $m);
}
unless (exists $metadata->{OPTIONS}{'no-footer'}){
my $m = my_dclone($metadata);
my $footer_fn = get_include_filename('include', 'footer', $fn);
unshift @{$m->{FILES}}, $footer_fn;
$footer = parse_file($footer_fn, $metadata);
}
my ($tmp_fh, $tmp_name) = tempfile( UNLINK => 1);
binmode $tmp_fh, ":encoding($config{encoding})";
print $tmp_fh $header, $str, $footer;
close $tmp_fh;
if (compare($new_fn, $tmp_name) == 0){
print STDERR " not changed\n" unless $config{quiet};
} else {
copy($tmp_name, $new_fn);
print STDERR " done\n" unless $config{quiet};
}
} else {
if (compare($fn, $new_fn) == 0){
# do nothing
} else {
copy($fn, $new_fn);
print "Updated file $new_fn (not processed)\n";
}
}
}
sub get_online_fn {
my $fn = shift;
my $new_fn = $fn;
$new_fn =~ s{^$config{default}{source}}{};
{
my $found = 0;
for ( keys %{$config{per_fn}} ){
if ( $new_fn =~ m/$_/ ){
$found = 1;
$new_fn = $config{per_fn}{$_}{online} . $new_fn;
last
}
}
if ($found == 0){
$new_fn = $config{default}{online} . $new_fn;
( run in 3.620 seconds using v1.01-cache-2.11-cpan-ceb78f64989 )