summaryrefslogtreecommitdiff
path: root/lib/WebCoso.pm
blob: d734bd80cb168ff5e52ee39f635c9e3cc082f5d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# -*- 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
    }
}