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 )