49
+ − 1 use strict;
+ − 2 package DOM::Gallery;
+ − 3 use Common;
+ − 4 our @ISA = qw(Object);
+ − 5
+ − 6 BEGIN {
+ − 7 DeclareProperty(Id => ACCESS_READ);
+ − 8 DeclareProperty(Name => ACCESS_READ);
+ − 9 DeclareProperty(Description => ACCESS_READ);
+ − 10 DeclareProperty(Images => ACCESS_READ);
+ − 11 DeclareProperty(CurrentImage => ACCESS_READ);
+ − 12 DeclareProperty(NextImage => ACCESS_READ);
+ − 13 DeclareProperty(PrevImage => ACCESS_READ);
+ − 14 }
+ − 15
+ − 16 sub CTOR {
+ − 17 my ($this,%args) = @_;
+ − 18
+ − 19 $this->{$Id} = $args{'Id'};
+ − 20 $this->{$Name} = $args{'Name'};
+ − 21 $this->{$Description} = $args{'Description'};
+ − 22 }
+ − 23
+ − 24 sub GroupList {
+ − 25 my ($this,$GroupCount, $option) = @_;
+ − 26
+ − 27 my @images = map { $this->{$Images}->{$_} } sort keys %{$this->{$Images}};
+ − 28
+ − 29 my @listGroups;
+ − 30 my $group;
+ − 31 for (my $i = 0; $i < $GroupCount; $i++ ) {
+ − 32 #last unless scalar(@images) or $option =~ /align/i;
+ − 33 push (@$group, shift(@images));
+ − 34 if ($i == $GroupCount - 1) {
+ − 35 push @listGroups, $group;
+ − 36 undef $group;
+ − 37 $i = -1;
+ − 38 last if not scalar(@images);
+ − 39 }
+ − 40 }
+ − 41
+ − 42 return \@listGroups;
+ − 43 }
+ − 44
+ − 45 sub SelectImage {
+ − 46 my ($this,$imageId) = @_;
+ − 47
+ − 48 my @images = sort keys %{$this->{$Images}};
+ − 49
+ − 50 for (my $i=0; $i <= @images; $i++) {
+ − 51 if ($images[$i] eq $imageId) {
+ − 52 $this->{$CurrentImage} = $this->{$Images}->{$images[$i]};
+ − 53 $this->{$PrevImage} = $i-1 >= 0 ? $this->{$Images}->{$images[$i-1]} : undef;
+ − 54 $this->{$NextImage} = $i+1 < @images ? $this->{$Images}->{$images[$i+1]} : undef;
+ − 55 return 1;
+ − 56 }
+ − 57 }
+ − 58 die new Exception("An image '$imageId' not found in the gallery '$this->{$Id}'");
+ − 59 }
+ − 60
+ − 61 sub AddImage {
+ − 62 my ($this,$image) = @_;
+ − 63
+ − 64 $this->{$Images}->{$image->Id()} = $image;
+ − 65 }
+ − 66
+ − 67 package DOM::Gallery::Image;
+ − 68 use Common;
+ − 69 our @ISA = qw(Object);
+ − 70 BEGIN {
+ − 71 DeclareProperty(Id => ACCESS_READ);
+ − 72 DeclareProperty(Name => ACCESS_READ);
+ − 73 DeclareProperty(Gallery => ACCESS_READ);
+ − 74 DeclareProperty(URL => ACCESS_READ);
+ − 75 DeclareProperty(ThumbURL => ACCESS_READ);
+ − 76 }
+ − 77
+ − 78 sub CTOR {
+ − 79 my ($this,%args) = @_;
+ − 80
+ − 81 $this->{$Id} = $args{'Id'} or die new Exception ('An Id should be specified for an image');
+ − 82 $this->{$Name} = $args{'Name'};
+ − 83 $this->{$Gallery} = $args{'Gallery'} or die new Exception('An Gallery should be specified for an image');
+ − 84 $this->{$URL} = $args{'URL'};
+ − 85 $this->{$ThumbURL} = $args{'ThumbURL'};
+ − 86 }
+ − 87
+ − 88 package DOM::Providers::Gallery;
+ − 89 use Common;
+ − 90 our @ISA = qw(Object);
+ − 91
+ − 92 our $RepoPath;
+ − 93 our $ImagesURL;
+ − 94 our $Encoding;
+ − 95
+ − 96 BEGIN {
+ − 97 DeclareProperty(GalleryCache => ACCESS_NONE);
+ − 98 DeclareProperty(Repository => ACCESS_NONE);
+ − 99 }
+ − 100
+ − 101 sub CTOR {
+ − 102 my ($this,%args) = @_;
+ − 103
+ − 104 $this->{$Repository} = $args {'Repository'} or die new Exception('A path to an galleries repository should be specified');
+ − 105 }
+ − 106
+ − 107 sub GetProviderInfo() {
+ − 108 return {
+ − 109 Name => 'Gallery',
+ − 110 Host => 'DOM::Site',
+ − 111 Methods => {
+ − 112 LoadGallery => \&SiteLoadGallery #($this,$site,$galleryId)
+ − 113 }
+ − 114 };
+ − 115 }
+ − 116
+ − 117 sub SiteLoadGallery {
+ − 118 my ($this,$site,$galleryId) = @_;
+ − 119
+ − 120 my $gallery = $this->LoadGallery($galleryId);
+ − 121
+ − 122 $site->RegisterObject('Gallery',$gallery);
+ − 123
+ − 124 return $gallery;
+ − 125 }
+ − 126
+ − 127 sub LoadGallery {
+ − 128 my ($this,$galleryId) = @_;
+ − 129
+ − 130 die new Exception("Invalid Gallery Id: $galleryId") if $galleryId =~ /\\|\//;
+ − 131
+ − 132 my $galleryIdPath = $galleryId;
+ − 133 $galleryIdPath =~ s/\./\//g;
+ − 134
+ − 135 my $GalleryPath = $this->{$Repository} . $galleryIdPath .'/';
+ − 136
+ − 137 die new Exception("A gallery '$galleryId' isn't found",$GalleryPath) if not -d $GalleryPath;
+ − 138
+ − 139 open my $hDesc, "<:encoding($Encoding)", $GalleryPath.'index.htm' or die new Exception("Invalid gallery: $galleryId","Failed to open ${GalleryPath}index.htm: $!");
+ − 140
+ − 141 my $GalleryName;
+ − 142 while (<$hDesc>) {
+ − 143 if (/<title>(.+?)<\/title>/i) {
+ − 144 $GalleryName = $1;
+ − 145 last;
+ − 146 }
+ − 147 }
+ − 148 undef $hDesc;
+ − 149
+ − 150 my $ImagesPath = $GalleryPath.'images/';
+ − 151 my $ThumbsPath = $GalleryPath.'thumbnails/';
+ − 152
+ − 153 opendir my $hImages, $ImagesPath or die new Exception("Invalid gallery: $galleryId","Can't open images repository: $!");
+ − 154
+ − 155 my @imageIds = grep { -f $ImagesPath.$_ } readdir $hImages;
+ − 156
+ − 157 my %imageNames;
+ − 158
+ − 159 if (-f $GalleryPath.'description.txt') {
+ − 160 local $/="\n";
+ − 161 if (open my $hfile,"<:encoding($Encoding)",$GalleryPath.'description.txt') {
+ − 162 while (<$hfile>) {
+ − 163 chomp;
+ − 164 my ($id,$name) = split /\s*=\s*/;
+ − 165 $imageNames{$id} = $name;
+ − 166 }
+ − 167 }
+ − 168 }
+ − 169
+ − 170 undef $hImages;
+ − 171
+ − 172 if ($Common::Debug) {
+ − 173 foreach (@imageIds) {
+ − 174 warn "A tumb isn't found for an image: $_" if not -f $ThumbsPath.$_;
+ − 175 }
+ − 176 }
+ − 177
+ − 178 my $gallery = new DOM::Gallery(Id => $galleryId, Name => $GalleryName);
+ − 179
+ − 180 foreach my $imageId (@imageIds) {
+ − 181 $gallery->AddImage(new DOM::Gallery::Image(
+ − 182 Id => $imageId,
+ − 183 URL => $ImagesURL.$galleryIdPath.'/images/'.$imageId,
+ − 184 ThumbURL => $ImagesURL.$galleryIdPath.'/thumbnails/'.$imageId,
+ − 185 Gallery => $gallery,
+ − 186 Name => $imageNames{$imageId}
+ − 187 )
+ − 188 );
+ − 189 }
+ − 190
+ − 191 return $gallery;
+ − 192 }
+ − 193
+ − 194 sub construct {
+ − 195 my $self = shift;
+ − 196
+ − 197 return new DOM::Providers::Gallery( Repository => $RepoPath);
+ − 198 }
+ − 199
+ − 200 1;