blob: 373231a5dca5f339ef4bcc6b2f8b89d6c505647e (
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) {
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;
}
}
|