AxKit2
view release on metacpan or search on metacpan
plugins/demo/gallery view on Meta::CPAN
$uri =~ s/^\///; # Trim the leading '/'
$uri = "<full><e>$uri</e><u>" . uri_decode($uri) . "</u></full>\n" .
"<path><e>$uri_path</e><u>" . uri_decode($uri_path) . "</u></path>\n" .
join("\n",
map { "<component><e>$_</e><u>" . uri_decode($_) . "</u></component>" } split(/\//, $uri));
my $xml = <<EOXML;
<?xml version="1.0"?>
<imagesheet>
<config>
<perl-vars>
EOXML
foreach my $var (qw(ProofsheetColumns ImagesPerProofsheet
GalleryCache GalleryThumbQuality))
{
no warnings 'uninitialized';
$xml .= "<var name='$var'>" . $self->get_cfg($var) . "</var>\n";
}
my $size = $self->client->param('size') || '';
# Make sure the specified size is one we're configured to
# support. If it isn't then use the default size
my $sizelist = $self->get_cfg('GallerySizes');
$sizelist = $DEFAULT_SIZE unless defined $sizelist;
my @sizes = split(/\s+/, $sizelist);
if ($size eq 'thumb') {
$size = $sizes[0];
}
else {
$size = $sizes[1] unless grep { $_ eq $size } @sizes;
}
$xml .= <<EOXML;
<GallerySizes>
<size type="thumb">$sizes[0]</size>
EOXML
foreach (@sizes[1..$#sizes]) {
if($_ eq $size) {
$xml .= "<size type=\"default\">$_</size>\n";
} else {
$xml .= "<size>$_</size>\n";
}
}
$xml .= "</GallerySizes>";
# add image data
$xml .= <<EOXML;
</perl-vars>
</config>
<image>
<filename>$file</filename>
<filesize>$filesize</filesize>
<size>$size</size>
<modified>$mod</modified>
<uri>$uri</uri>
<dirpath>$path</dirpath>
<content-type>$ct</content-type>
</image>
</imagesheet>
EOXML
$input->dom($xml);
my $rdf = $self->get_exif_rdf("$path/$file");
if ($rdf) {
my ($image_node) = $input->dom->findnodes('/imagesheet/image');
$image_node->appendWellBalancedChunk($rdf);
}
my $out = $input->transform(
XSLT($self->config->docroot . '/.stylesheets/imagesheet2html.xsl',
$prev ? ('prev' => uri_encode($prev)) : (),
$next ? ('next' => uri_encode($next)) : (),
)
);
return OK, $out;
}
## here we extract the EXIF data and convert it to RDF.
sub get_exif_rdf {
my ($self, $filename) = @_;
my $cache = $self->cache;
my $rdf = $cache->get("${filename}+rdf");
if (!$rdf) {
$rdf = '';
my $info = {};
$info->{imageinfo} = ImageInfo($filename);
if(! $info->{error}) {
# Work out the width/height ratio, and calculate
# what the generated thumbnail dimensions will be
my($w, $h) = ($info->{imageinfo}{ImageWidth},
$info->{imageinfo}{ImageHeight});
my $larger = $w > $h ? $w : $h;
$info->{thumbs}{thumb} = [];
my $sizelist = $self->get_cfg('GallerySizes');
$sizelist = $DEFAULT_SIZE unless defined $sizelist;
foreach my $size (split(/ +/, $sizelist)) {
next if $size eq 'full';
my $sf = $size / $larger;
push @{$info->{thumbs}{thumb}},
{ filename => "$size.jpg",
width => int($w * $sf),
height => int($h * $sf),
size => $size,
};
}
# Sanitise the data in $info->{imageinfo}
foreach (keys %{$info->{imageinfo}}) {
plugins/demo/gallery view on Meta::CPAN
# Now we have the full proofsheet, we need to trim it down to just the
# images we want for this "page". We use Data::Page to tell us which
# images those are.
$dom = $out->dom;
my $per_page = $self->get_cfg('ImagesPerProofsheet');
my $cur_page = $self->client->param('cur_page');
$cur_page = 1 if ! defined $cur_page;
$cur_page = 1 if $cur_page !~ /\d+/;
my @images = $dom->findnodes('/proofsheet/images/image/filename/text()');
my $page = Data::Page->new();
$page->total_entries(scalar(@images));
$page->entries_per_page($per_page);
$page->current_page($cur_page);
my $first = $page->first;
my $last = $page->last;
my $xpath = "//images/image[position() < $first or position() > $last]";
for my $node ($dom->findnodes($xpath)) {
$node->parentNode->removeChild($node);
}
# Now add in some XML for the page navigation
my $pages_xml = '<pages>';
for ($page->first_page .. $page->last_page) {
$pages_xml .= "<page number='$_'";
$pages_xml .= ' current=\'yes\'' if $_ == $cur_page;
$pages_xml .= '/>';
}
$pages_xml .= '</pages>';
$dom->documentElement->appendWellBalancedChunk($pages_xml);
# Add in some info about the URL and each image
my $uri = $self->client->headers_in->request_uri;
$uri =~ s/^\///;
$uri = join("\n",
map {
"<component><e>$_</e><u>" . uri_decode($_) . "</u></component>"
} split(/\//, $uri));
my $dirpath = $self->client->headers_in->filename();
my $mm = File::MMagic->new;
$self->log(LOGINFO, "Augmenting images info");
for my $node ($dom->findnodes('//images/image'), $dom->findnodes('//albums/album'))
{
my $filename = $node->findnodes('./filename/text()');
my $fullpath = catfile($dirpath, "$filename");
my $ct = $mm->checktype_filename($fullpath);
$node->appendWellBalancedChunk(<<EOXML);
<dirpath>$dirpath</dirpath>
<content-type>$ct</content-type>
EOXML
}
# Finally we add in the config info
$self->log(LOGINFO, "Augmenting config info");
my @variables = qw(ProofsheetColumns ImagesPerProofsheet
GalleryCache GalleryThumbQuality);
my $config_xml = "<perl-vars>\n";
foreach my $variable (@variables) {
$config_xml .= "<var name='$variable'>" . ($self->get_cfg($variable) || '') . "</var>\n";
}
my $sizelist = $self->get_cfg('GallerySizes');
$sizelist = $DEFAULT_SIZE unless defined $sizelist;
my @sizes = split(/\s+/, $sizelist);
$config_xml .= "</perl-vars>\n<GallerySizes>\n <size type=\"thumb\">$sizes[0]</size>\n";
foreach (@sizes[1..$#sizes]) {
$config_xml .= "<size>$_</size>\n";
}
$config_xml .= "</GallerySizes>\n";
my $hostname = $self->client->headers_in->header('Host') || 'localhost';
$hostname =~ s/:\d+$//;
my $site = "http://$hostname";
my $port = $self->config->port;
$config_xml .= <<EOXML;
<server>
<site>$site</site>
<hostname>$hostname</hostname>
<port>$port</port>
</server>
EOXML
$dom->documentElement->firstChild->appendWellBalancedChunk($config_xml);
$dom->documentElement->appendWellBalancedChunk("<uri>$uri</uri>");
XML::LibXSLT->register_function("urn:ax-app-gallery", "epoch-to-date",
sub { my $epoch = shift; my @p=gmtime($epoch); $p[4]++; $p[5]+=1900; return
"$p[5]-$p[4]-$p[3]"; });
$out = $out->transform(
XSLT($self->config->docroot . '/.stylesheets/proofsheet2html.xsl')
);
return OK, $out;
}
( run in 1.948 second using v1.01-cache-2.11-cpan-524268b4103 )