# -*- mode: perl6 -*- 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 } }