summaryrefslogtreecommitdiff
path: root/lib/WebCoso.pm
blob: dbbfda4cf539c0adc966f124673844615bf2b67b (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
83
84
85
86
87
88
89
90
# -*- 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
    }
}