summary refs log tree commit diff stats
path: root/lib/Crater/Gallery.rakumod
blob: 4fdfac8ba41db04eb8b1c6442db2a0002685cd0c (plain) (blame)
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
class Crater::Gallery {
    has IO $.directory is required;
    has Str $!title;

    submethod TWEAK() {
        my $title-file = $!directory.add(".crater/title");
        $!title = $title-file.slurp.chomp if $title-file.f;
    }

    #| Accessor for $!title.
    method title() { $!title }

    method list(:@sub-dir) {
        # This will be considered an attempt to attack. There is no
        # reason to check '.' I belive.
        if @sub-dir.grep('.'|'..').elems {
            die "[!!!] @sub-dir contains '..'/'.'";
        }

        my @gallery;
        my @paths = @sub-dir
                     ?? $!directory.add(@sub-dir.join("/")).dir
                     !! $!directory.dir;

        with $!title {
            push @gallery, %( :type<heading>, :text($_) );
        }

        # Add directories on top.
        for @paths.grep(*.d).sort {
            next if .ends-with(".crater");
            push @gallery, %( :type<directory>,
                              :text($_.relative($!directory)) );
        }

        for @paths.grep(*.f).sort(*.modified) {
            my Str $ext = .extension.lc;
            # For images get the original if thumbnail doesn't exist,
            # otherwise use the thumbnail.
            if $ext eq "jpg"|"png" {
                my $rel = $_.relative($!directory);
                my $alt = $rel;
                unless $!directory.add(".crater/thumbnails").add($rel).f {
                    $rel ~= "?original";
                }
                push @gallery, %( :type<img>, :src($rel), :$alt );
            } elsif $ext eq "0" {
                push @gallery, %( :type<heading>, :text($_.slurp.chomp) );
            } elsif $ext eq "txt" {
                push @gallery, %( :type<text>, :text($_.slurp.chomp) );
            } else {
                note "Unhandled file: $_";
            }
        }
        return @gallery;
    }
}