use File::Temp;
use JSON::Fast;
use WebCoso::File;
use WebCoso::Doc::Page;
use WebCoso::Doc::Feed;
class WebCoso {
has $.srcdir;
has $.destdir;
has $!tmpdir = tempdir.IO;
has %!docs;
method load-deps($dir,$basename,$ext) {
my %deps = try { from-json($.srcdir.child('deps.json').IO.slurp) } // {};
my $ret = %deps{$basename}{$ext} // {};
for $ret.values -> $f is rw { $f = WebCoso::File.new($f) };
return $ret;
}
method save-deps($dir,$basename,$ext,%new-deps is copy) {
my %deps = try { from-json($.srcdir.child('deps.json').IO.slurp) } // {};
%new-deps.values».=path;
%deps{$basename}{$ext} = %new-deps;
$.srcdir.child('deps.json').IO.spurt(to-json(%deps));
}
method get-src-files($dir,$basename,$ext) {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-src-files($dir,$basename,$ext)";
my @files = gather {
for $.srcdir,$!tmpdir -> $base {
take $_ for try {
CATCH { when X::IO { } }
( $dir ?? $base.child($dir) !! $base ).dir(
test => /$basename \. .+? \. $ext/,
)
} // ();
}
}
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-src-files($dir,$basename,$ext) files = {@files.perl}";
return (
map {
my $lang = (.basename ~~ /$basename \. (.+?) \. $ext/)[0].Str;
$lang => WebCoso::File.new(:$lang,path=>$_)
}, @files
).values;
}
method get-file($dir,$path) {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-file($dir,$path)";
return WebCoso::File.new($.srcdir.child($dir).child($path));
}
method get-made-files($dir,$basename,$ext) {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-made-files($dir,$basename,$ext)";
if %!docs{$dir}{$basename} -> $doc {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-made-files($dir,$basename,$ext) at $doc";
return $doc.make-by-ext($ext)
}
return ();
}
method get-files($dir,$basename,$ext,:$make=True) {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-files($dir,$basename,$ext,$make)";
my %src = self.get-src-files($dir,$basename,$ext);
my %made = ( $make ?? self.get-made-files($dir,$basename,$ext) !! () );
return flat %src,%made;
}
method put-file($dir,$basename,$lang,$ext,$contents) {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::put-file($dir,$basename,$lang,$ext)";
my $t = ($dir ?? $!tmpdir.child($dir) !! $!tmpdir);
$t.mkdir;
my $f = WebCoso::File.new(:$lang,path=>$t.child("{$basename}.{$lang}.{$ext}"));
$f.contents($contents);
return $f;
}
method new-page($dir) {
%!docs{$dir}{WebCoso::Doc::Page.basename}
= WebCoso::Doc::Page.new(:$dir,wc=>self);
}
method new-feed($dir) {
%!docs{$dir}{WebCoso::Doc::Feed.basename}
= WebCoso::Doc::Feed.new(:$dir,wc=>self);
}
method run() {
.make() for %!docs.values».values.flat
}
}