# -*- mode: perl6 -*- use File::Temp; use JSON::Fast; use WebCoso::File; use WebCoso::FileSet; 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{$dir}{$basename}{$ext} // {}; return WebCoso::FileSet.new(files-hash=>%ret); } method save-deps($dir,$basename,$ext,$new-deps) { my %deps = try { from-json($.srcdir.child('deps.json').IO.slurp) } // {}; %deps{$dir}{$basename}{$ext} = $new-deps.export-hash; $.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 @filesets = (gather { for $.srcdir,$!tmpdir -> $base { take WebCoso::FileSet.new( path => ( $dir ?? $base.child($dir) !! $base ), :$basename, :$ext, ); } }).values; say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-src-files($dir,$basename,$ext) files = {@filesets».files}"; return @filesets.reduce({$^a.merged-with($^b)}); } 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 $src.merged-with($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 } }