App-LinkSite
view release on metacpan or search on metacpan
lib/App/LinkSite.pm view on Meta::CPAN
field $file :reader :param = 'links.json';
# Where to look for the templates.
# If we've been installed from CPAN, then File::Share::dist_name
# gives us the correct directory. Otherwise, just look in the local
# src directory. Note that dist_name() dies if the directory is not
# found - hence the use of eval.
field $src :reader :param = eval { dist_dir("App-LinkSite") } || "$Bin/../src";
field $out :reader :param = 'docs';
field $ga4 :reader :param = undef;
field $site :reader :param = undef;
field $tt;
ADJUST {
my $json = path($file)->slurp;
my $data = JSON->new->decode($json);
$ga4 = $data->{ga4} // '';
$tt = Template->new({
# Templates in the CPAN distro directory
INCLUDE_PATH => $src,
# Output in the data directory
OUTPUT_PATH => $out,
VARIABLES => {
ga4 => $ga4,
version => $VERSION,
}
});
my $socials = [ map {
$_->{handle} //= $data->{handle};
App::LinkSite::Social->new(%$_)
} $data->{social}->@* ];
my $links = [ map { App::LinkSite::Link->new(%$_) } $data->{links}->@* ];
my $sections = [];
if ($data->{sections}) {
$sections = [ map {
my $section_links = [ map { App::LinkSite::Link->new(%$_) } $_->{links}->@* ];
App::LinkSite::Section->new(
title => $_->{title},
links => $section_links,
)
} $data->{sections}->@* ];
}
$site = App::LinkSite::Site->new(
name => $data->{name},
handle => $data->{handle},
image => $data->{image},
desc => $data->{desc},
og_image => $data->{og_image},
site_url => $data->{site_url},
socials => $socials,
links => $links,
sections => $sections,
$data->{text_color} ? (text_color => $data->{text_color}) : (),
$data->{background_color} ? (background_color => $data->{background_color} ) : (),
);
}
=head1 METHODS
=head2 run
The main driver method for the process.
=cut
method run {
debug("src is: $src");
debug("out is: $out");
path($out)->mkdir;
find( { wanted => sub { $self->do_this }, no_chdir => 1 }, $src);
if ($site->image or $site->og_image) {
path("$out/img")->mkdir;
debug("Copy images");
for my $img ($site->image, $site->og_image) {
next unless $img;
path("img/$img")->copy("$out/img");
}
}
if (-f './CNAME') {
debug("Copy CNAME");
path('./CNAME')->copy("$out/CNAME");
}
debug("Copy input JSON file");
path($file)->copy($out);
}
=head2 do_this
A method is called for each file that is found in the `src` directory.
=cut
method do_this {
if ($File::Find::name eq $src or $File::Find::name eq "$src/") {
debug("Skipping $File::Find::name");
return;
}
my $path = $File::Find::name =~ s|^$src/||r;
if (/\.tt$/) {
debug("Process $path to", basename($path, '.tt'));
$tt->process($path, { site => $self->site }, basename($path, '.tt'))
or die $tt->error;
} else {
if (-d) {
debug("Make directory $path");
path("$out/$path")->mkdir;
} elsif (-f) {
debug("Copy $path");
path("$src/$path")->copy("$out/$path");
( run in 3.354 seconds using v1.01-cache-2.11-cpan-d8267643d1d )