Revision 113 
  Date: 
  2011/08/17 12:23:35 
  Author: 
  ahitrov 
  Revision Log: 
  Image generation and saving transfered to File.pm and Object.pm 
  Files: 
  
    
   
 
  
    Legend: 
    
        Added 
        Removed 
        Modified 
     
       
     
      utf8/core/comps/contenido/components/set_image.msn 
      
        
           
        
          
              
           
         
                  
      
             21 
            21 
             
          
      
             22 
            22 
            if ($SETS->{$field}) {  
          
      
             23 
            23 
             
                      
      
             24 
                my @preview = exists $prop->{'preview'} && ref $prop->{'preview'} eq 'ARRAY' ? @{$prop->{'preview'}} : exists $prop->{'preview'} && $prop->{'preview'} ? ($prop->{'preview'}) : ();  
         
      
             25 
                my @crops = exists $prop->{'crop'} && ref $prop->{'crop'} eq 'ARRAY' ? @{$prop->{'crop'}} : exists $prop->{'crop'} && $prop->{'crop'} ? ($prop->{'crop'}) : ();  
         
      
             26 
                my @shrinks = exists $prop->{'shrink'} && ref $prop->{'shrink'} eq 'ARRAY' ? @{$prop->{'shrink'}} : exists $prop->{'shrink'} && $prop->{'shrink'} ? ($prop->{'shrink'}) : ();  
         
      
             27 
             
         
      
             28 
                if (ref $IMAGE eq 'HASH' && exists $IMAGE->{mini} && ref $IMAGE->{mini} eq 'HASH') {  
         
      
             29 
            	foreach my $val ( values %{$IMAGE->{mini}} ) {  
         
      
             30 
            		if ( ref $val && exists $val->{filename} && $val->{filename} ) {  
         
      
             31 
            			Contenido::File::remove($val->{'filename'});  
         
      
             32 
            		}  
         
      
             33 
            	}  
         
      
             34 
                }  
         
      
             35 
             
         
      
             36 
                my $filename = '/images/'.$object->get_file_name() || return;  
         
      
             37 
                my $filename_tmp = $state->{'tmp_dir'}.'/'.join('_', split('/', $filename));  
         
      
             38 
             
                     
      
             39 
            24 
                my $upload = $r->upload($field);  
          
      
             40 
            25 
                if ($upload) {  
                      
      
             41 
                    my $extension = $upload->filename() =~ /(jpe?g|gif|png)$/i ? lc $1 : 'bin';  
         
      
             42 
                    my $fh = $upload->fh();  
         
      
             43 
                    my $size = (stat $fh)[7];  
         
      
             44 
                  
         
      
             45 
            	my $fh_tmp = IO::File->new('>'.$filename_tmp.'.'.$extension) || die 'Can\'t open temporary file';  
         
      
             46 
                  
         
      
             47 
            	my $buffer;  
         
      
             48 
                  
         
      
             49 
            	sysread $fh, $buffer, $size;  
         
      
             50 
            	syswrite $fh_tmp, $buffer, $size;  
         
      
             51 
                  
         
      
             52 
            	undef $fh_tmp;  
         
      
             53 
                  
         
      
             54 
            	if (Contenido::File::store($filename.'.'.$extension, $filename_tmp.'.'.$extension)) {  
         
      
             55 
                        if (ref $IMAGE eq 'HASH' and $IMAGE->{'filename'}) {  
         
      
             56 
            		Contenido::File::remove($IMAGE->{'filename'});  
         
      
             57 
                        }  
         
      
             58 
                  
         
      
             59 
                        # hashref slice assigning - жжесть  
         
      
             60 
                        @{$IMAGE}{'filename', 'width', 'height'} = (  
         
      
             61 
            		$filename.'.'.$extension,  
         
      
             62 
            		Image::Size::imgsize($filename_tmp.'.'.$extension),  
         
      
             63 
                        );  
         
      
             64 
                        foreach my $suffix (@preview) {  
         
      
             65 
                              
         
      
             66 
                            my $c_line = $state->{'convert_binary'}.' -geometry \''.$suffix.'\' -quality 80 '.$filename_tmp.'.'.$extension.' '.$filename_tmp.'.'.$suffix.'.'.$extension;  
         
      
             67 
                            my $result = `$c_line`;  
         
      
             68 
                      
         
      
             69 
                            if (length $result > 0) {  
         
      
             70 
                                warn 'Contenido Error: При вызове "'.$c_line.'" произошла ошибка "'.$result.'" ('.$@.")\n";  
         
      
             71 
                                return undef;  
         
      
             72 
                            }  
         
      
             73 
            		@{$IMAGE->{'mini'}{$suffix}}{'filename', 'width', 'height'} = (  
         
      
             74 
            			$filename.'.'.$suffix.'.'.$extension,  
         
      
             75 
            			Image::Size::imgsize($filename_tmp.'.'.$suffix.'.'.$extension),  
         
      
             76 
            		);  
         
      
             77 
            		%{$IMAGE->{'resize'}{$suffix}} = %{$IMAGE->{'mini'}{$suffix}};  
         
      
             78 
            		Contenido::File::store($filename.'.'.$suffix.'.'.$extension, $filename_tmp.'.'.$suffix.'.'.$extension);  
         
      
             79 
            		unlink $filename_tmp.'.'.$suffix.'.'.$extension if -e $filename_tmp.'.'.$suffix.'.'.$extension;  
         
      
             80 
                        }  
         
      
             81 
            	    if ( @preview ) {  
         
      
             82 
            		@{$IMAGE->{'mini'}}{'filename', 'width', 'height'} = @{$IMAGE->{'mini'}{$preview[0]}}{'filename', 'width', 'height'};  
         
      
             83 
            		@{$IMAGE->{'resize'}}{'filename', 'width', 'height'} = @{$IMAGE->{'mini'}{$preview[0]}}{'filename', 'width', 'height'};  
         
      
             84 
            	    }  
                     
      
             85 
            26 
             
                      
      
             86 
            	    ########## CROPS  
         
      
             87 
                        foreach my $suffix (@crops) {  
         
      
             88 
                              
         
      
             89 
            		my $shave_string;  
         
      
             90 
            		my ($nwidth, $nheight) = $suffix =~ /(\d+)x(\d+)/i ? ($1, $2) : (0, 0);  
         
      
             91 
            		if ( ($IMAGE->{width} / $IMAGE->{height}) > ($nwidth / $nheight) ) {  
         
      
             92 
            			my $shave_pixels = (($IMAGE->{width} / $IMAGE->{height}) - ($nwidth / $nheight)) * $IMAGE->{height};  
         
      
             93 
            			$shave_string = ' -shave '.int($shave_pixels / 2).'x0';  
         
      
             94 
            		} elsif ( ($IMAGE->{height} / $IMAGE->{width}) > ($nheight / $nwidth) ) {  
         
      
             95 
            			my $shave_pixels = (($IMAGE->{height} / $IMAGE->{width}) - ($nheight / $nwidth)) * $IMAGE->{width};  
         
      
             96 
            			$shave_string = ' -shave 0x'.int($shave_pixels / 2);  
         
      
             97 
            		}  
         
      
             98 
            		if ( $shave_string ) {  
         
      
             99 
            			my $c_line = $state->{"convert_binary"}." $shave_string $filename_tmp.$extension $filename_tmp.shaved.$extension";  
         
      
             100 
            			my $result = `$c_line`;  
         
      
             101 
            			if (length $result  > 0) {  
         
      
             102 
            				print "Contenido Error: При вызове '$c_line' произошла ошибка '$result' ($@)\n";  
         
      
             103 
            			}  
         
      
             104 
            		} else {  
         
      
             105 
            			my $c_line = "cp $filename_tmp.$extension $filename_tmp.shaved.$extension";  
         
      
             106 
            			my $result = `$c_line`;  
         
      
             107 
            			if (length $result  > 0) {  
         
      
             108 
            				print "Contenido Error: При вызове '$c_line' произошла ошибка '$result' ($@)\n";  
         
      
             109 
            			}  
         
      
             110 
            		}  
                     
      
             27 
            	my $IMG = $object->_store_image( $upload, attr => $prop->{attr} );  
                     
      
             111 
            28 
             
                      
      
             112 
            		my $c_line = $state->{'convert_binary'}.' -geometry \''.$suffix.'!\' -quality 80 '.$filename_tmp.'.shaved.'.$extension.' '.$filename_tmp.'.'.$suffix.'.'.$extension;  
         
      
             113 
            		my $result = `$c_line`;  
         
      
             114 
                      
         
      
             115 
            		if (length $result > 0) {  
         
      
             116 
            			warn 'Contenido Error: При вызове "'.$c_line.'" произошла ошибка "'.$result.'" ('.$@.")\n";  
         
      
             117 
            			return undef;  
         
      
             118 
            		}  
         
      
             119 
            		@{$IMAGE->{'mini'}{$suffix}}{'filename', 'width', 'height'} = (  
         
      
             120 
            			$filename.'.'.$suffix.'.'.$extension,  
         
      
             121 
            			Image::Size::imgsize($filename_tmp.'.'.$suffix.'.'.$extension),  
         
      
             122 
            		);  
         
      
             123 
            		%{$IMAGE->{'crop'}{$suffix}} = %{$IMAGE->{'mini'}{$suffix}};  
         
      
             124 
            		Contenido::File::store($filename.'.'.$suffix.'.'.$extension, $filename_tmp.'.'.$suffix.'.'.$extension);  
         
      
             125 
            		unlink $filename_tmp.'.shaved.'.$extension	if -e $filename_tmp.'.shaved.'.$extension;  
         
      
             126 
            		unlink $filename_tmp.'.'.$suffix.'.'.$extension	if -e $filename_tmp.'.'.$suffix.'.'.$extension;  
         
      
             127 
                        }  
         
      
             128 
            	    if ( @crops ) {  
         
      
             129 
            		if ( !exists $IMAGE->{'mini'}{'filename'} ) {  
         
      
             130 
            			@{$IMAGE->{'mini'}}{'filename', 'width', 'height'} = @{$IMAGE->{'mini'}{$crops[0]}}{'filename', 'width', 'height'};  
         
      
             131 
            		}  
         
      
             132 
            		@{$IMAGE->{'crop'}}{'filename', 'width', 'height'} = @{$IMAGE->{'crop'}{$crops[0]}}{'filename', 'width', 'height'};  
         
      
             133 
            	    }  
                     
      
             29 
            	if ( ref $IMG eq 'HASH' && exists $IMG->{filename} ) {  
         
      
             30 
            		$object->_delete_image( $default );  
         
      
             31 
            		%$IMAGE = %$IMG;  
         
      
             32 
            	}  
                     
      
             134 
            33 
             
                      
      
             135 
            	    ########## SHRINKS  
         
      
             136 
                        foreach my $suffix (@shrinks) {  
         
      
             137 
                              
         
      
             138 
                            my $c_line = $state->{'convert_binary'}.' -geometry \''.$suffix.'!\' -quality 80 '.$filename_tmp.'.'.$extension.' '.$filename_tmp.'.'.$suffix.'.'.$extension;  
         
      
             139 
                            my $result = `$c_line`;  
         
      
             140 
                      
         
      
             141 
            		if (length $result > 0) {  
         
      
             142 
            			warn 'Contenido Error: При вызове "'.$c_line.'" произошла ошибка "'.$result.'" ('.$@.")\n";  
         
      
             143 
            			return undef;  
         
      
             144 
            		}  
         
      
             145 
            		@{$IMAGE->{'mini'}{$suffix}}{'filename', 'width', 'height'} = (  
         
      
             146 
            			$filename.'.'.$suffix.'.'.$extension,  
         
      
             147 
            			Image::Size::imgsize($filename_tmp.'.'.$suffix.'.'.$extension),  
         
      
             148 
            		);  
         
      
             149 
            		%{$IMAGE->{'shrink'}{$suffix}} = %{$IMAGE->{'mini'}{$suffix}};  
         
      
             150 
            		Contenido::File::store($filename.'.'.$suffix.'.'.$extension, $filename_tmp.'.'.$suffix.'.'.$extension);  
         
      
             151 
            		unlink $filename_tmp.'.'.$suffix.'.'.$extension if -e $filename_tmp.'.'.$suffix.'.'.$extension;  
         
      
             152 
                        }  
         
      
             153 
            	    if ( @shrinks && !exists $IMAGE->{'mini'}{'filename'} ) {  
         
      
             154 
            		if ( !exists $IMAGE->{'mini'}{'filename'} ) {  
         
      
             155 
            			@{$IMAGE->{'mini'}}{'filename', 'width', 'height'} = @{$IMAGE->{'mini'}{$shrinks[0]}}{'filename', 'width', 'height'};  
         
      
             156 
            		}  
         
      
             157 
            		@{$IMAGE->{'shrink'}}{'filename', 'width', 'height'} = @{$IMAGE->{'shrink'}{$shrinks[0]}}{'filename', 'width', 'height'};  
         
      
             158 
            	    }  
         
      
             159 
             
         
      
             160 
             
         
      
             161 
                    }  
         
      
             162 
                  
         
      
             163 
            	unlink $filename_tmp.'.'.$extension if -e $filename_tmp.'.'.$extension;  
                     
      
             164 
            34 
                } else {  
                      
      
             165 
                    warn 'ERROR in incoming POST form: "'.$field.' is not file upload (value: "'.$SETS->{$field}.'")';  
                     
      
             35 
            	warn 'ERROR in incoming POST form: "'.$field.' is not file upload (value: "'.$SETS->{$field}.'")';  
                     
      
             166 
            36 
                }  
          
      
             167 
            37 
            }  
          
      
             168 
            38 
             
                  
          
            … 
            … 
              
           
               
      
             172 
            42 
             
          
      
             173 
            43 
            foreach my $localfield (keys(%{ $SETS })) {  
          
      
             174 
            44 
                if ($localfield =~ /$pattern/) {  
                      
      
             175 
                    my $imagefield = $1;  
         
      
             176 
                    $IMAGE->{$imagefield} = $m->comp("/contenido/components/filter.msn", str => $SETS->{$localfield});  
                     
      
             45 
            	my $imagefield = $1;  
         
      
             46 
            	$IMAGE->{$imagefield} = $m->comp("/contenido/components/filter.msn", str => $SETS->{$localfield});  
                     
      
             177 
            47 
                }  
          
      
             178 
            48 
            }  
          
      
             179 
            49 
             
          
      
             180 
            50 
            return $IMAGE;  
                      
      
             51 
             
                     
      
             181 
            52 
            </%init>  
           
   
      utf8/core/comps/contenido/components/set_properties.msn 
      
        
           
        
          
              
           
         
                  
      
             34 
            34 
             
          
      
             35 
            35 
                        if ($SETS->{'_delete_image.'.$name} == 1)  
          
      
             36 
            36 
                        {  
                      
      
             37 
                            my $IMAGE = eval ('my '.$object->{ $name });  
         
      
             38 
                            Contenido::File::remove($IMAGE->{'filename'});  
         
      
             39 
                            Contenido::File::remove($IMAGE->{'mini'}{'filename'});  
         
      
             40 
                            foreach my $key (keys %{$IMAGE->{'mini'}}) {  
         
      
             41 
                                if (ref $IMAGE->{'mini'}{$key} && ref $IMAGE->{'mini'}{$key} eq 'HASH' && $IMAGE->{'mini'}{$key}->{'filename'}) {  
         
      
             42 
                                    Contenido::File::remove($IMAGE->{'mini'}{$key}->{'filename'}) if $IMAGE->{'mini'}{$key}->{'filename'} ne $IMAGE->{'mini'}{'filename'};  
         
      
             43 
                                }  
         
      
             44 
                            }  
         
      
             45 
                            $object->{$name} = '';  
                     
      
             37 
            		my $IMAGE = $object->get_image( $name );  
         
      
             38 
            		$object->_delete_image( $IMAGE );  
         
      
             39 
            		$object->$name('');  
                     
      
             46 
            40 
                        } else {  
                      
      
             47 
                            my $IMAGE = undef;  
         
      
             48 
                            if (length($object->{ $name }) > 8)  
         
      
             49 
                            {  
         
      
             50 
                                $IMAGE = eval ('my '.$object->{ $name });  
         
      
             51 
                                if (ref($IMAGE) ne 'HASH') {  $IMAGE = {} };  
                     
      
             41 
                            my $IMAGE = $object->get_image( $name );  
         
      
             42 
            		$IMAGE = ref $IMAGE ? $IMAGE : {};  
         
      
             43 
            		$IMAGE = $m->comp('/contenido/components/set_image.msn', default=>$IMAGE, field=>$name, SETS=>$SETS, object=>$object, prop => $prop);  
         
      
             44 
            		if ( exists $IMAGE->{filename} ) {  
         
      
             45 
            			local $Data::Dumper::Indent = 0;  
         
      
             46 
            			$object->$name( Data::Dumper::Dumper($IMAGE) );  
                     
      
             52 
            47 
                            }  
                      
      
             53 
                            $IMAGE = $m->comp('/contenido/components/set_image.msn', default=>$IMAGE, field=>$name, SETS=>$SETS, object=>$object, prop => $prop);  
         
      
             54 
                            if (exists($IMAGE->{filename}))  
         
      
             55 
                            {  
         
      
             56 
                                local $Data::Dumper::Indent = 0;  
         
      
             57 
                                $object->{$name} = Data::Dumper::Dumper($IMAGE);  
         
      
             58 
                            }  
                     
      
             59 
            48 
                        }  
          
      
             60 
            49 
             
          
      
             61 
            50 
            	} elsif ($prop->{type} =~ /^images/) {  
                      
      
             62 
            51 
                        # --------------------------------------------------------------------------------------  
          
      
             63 
            52 
                        # А вот это уже сложнее - составление блока из всех картинок...  
          
      
             64 
            53 
             
                      
      
             65 
                        my $IMAGES = {};  
         
      
             66 
                        if (length($object->{ $name }) > 10)  
         
      
             67 
                        {  
         
      
             68 
                            $IMAGES = eval ('my '.$object->{ $prop->{attr} });  
         
      
             69 
                            if (ref($IMAGES) ne 'HASH')  
         
      
             70 
                            {  
         
      
             71 
                                $IMAGES = {};  
         
      
             72 
                                $IMAGES->{maxnumber} = 0;  
         
      
             73 
                            };  
         
      
             74 
                        }  
                     
      
             54 
                        my $IMAGES = $object->get_image( $name );  
         
      
             55 
            	    if (ref($IMAGES) ne 'HASH') {  
         
      
             56 
            		$IMAGES = {};  
         
      
             57 
            		$IMAGES->{maxnumber} = 0;  
         
      
             58 
            	    };  
                     
      
             75 
            59 
             
                      
      
             76 
                        my $maxnumber_ = 0;  
         
      
             77 
             
                     
      
             78 
            60 
                        # Теперь надо просмотреть все аргументы - а вдруг это то, что нам нужно...  
          
      
             79 
            61 
                        foreach my $arg (keys(%{ $SETS }))  
          
      
             80 
            62 
                        {  
                      
      
             81 
                            # Разбиваем все на части, отделяем...  
         
      
             82 
                            my ($partname,undef) = split(/\./,$arg);  
         
      
             83 
                            $partname =~ /^(.+)_(\d+)$/;  
         
      
             84 
                            my ($localname,$number) = ($1, $2);  
         
      
             85 
                            if ( ($localname eq $prop->{attr}) && ($number > 0) && ( $arg eq $localname.'_'.$number ))  
         
      
             86 
                            {  
                     
      
             63 
            		# Разбиваем все на части, отделяем...  
         
      
             64 
            		my ($partname,undef) = split(/\./,$arg);  
         
      
             65 
            		$partname =~ /^(.+)_(\d+)$/;  
         
      
             66 
            		my ($localname,$number) = ($1, $2);  
         
      
             67 
            		if ( ($localname eq $prop->{attr}) && ($number > 0) && ( $arg eq $localname.'_'.$number )) {  
                     
      
             87 
            68 
                                # Ура! Нашли элемент!  
          
      
             88 
            69 
             
          
      
             89 
            70 
                                my $partname = $localname.'_'.$number;  
          
      
             90 
            71 
             
                      
      
             91 
                                if ($SETS->{'_delete_image.'.$partname} == 1)  
         
      
             92 
                                {  
         
      
             93 
                                    Contenido::File::remove($IMAGES->{'image_'.$number}{"filename"});  
         
      
             94 
                                    Contenido::File::remove($IMAGES->{'image_'.$number}{"mini"}{"filename"});  
         
      
             95 
                                    foreach my $key (keys %{$IMAGES->{'image_'.$number}{'mini'}}) {  
         
      
             96 
                                        if (ref $IMAGES->{'image_'.$number}{'mini'}{$key} && ref $IMAGES->{'image_'.$number}{'mini'}{$key} eq 'HASH' && $IMAGES->{'image_'.$number}{'mini'}{$key}->{'filename'}) {  
         
      
             97 
                                            Contenido::File::remove($IMAGES->{'image_'.$number}{'mini'}{$key}->{'filename'}) if $IMAGES->{'image_'.$number}{'mini'}{$key}->{'filename'} ne $IMAGES->{'image_'.$number}{'mini'}{'filename'};  
         
      
             98 
                                        }  
         
      
             99 
                                    }  
         
      
             100 
                                    delete $IMAGES->{'image_'.$number};  
         
      
             101 
                                }  
         
      
             102 
                                else  
         
      
             103 
                                {  
         
      
             104 
                                    my $IMAGE = undef;  
         
      
             105 
                                    if (exists($IMAGES->{'image_'.$number}))  
         
      
             106 
                                    {  
         
      
             107 
                                        $IMAGE = $IMAGES->{'image_'.$number};  
         
      
             108 
                                    };  
                     
      
             72 
                                if ($SETS->{'_delete_image.'.$partname} == 1) {  
         
      
             73 
            			$object->_delete_image( $IMAGES->{'image_'.$number} );  
         
      
             74 
            			delete $IMAGES->{'image_'.$number};  
         
      
             75 
            		    } else {  
         
      
             76 
            			my $IMAGE = undef;  
         
      
             77 
            			if (exists($IMAGES->{'image_'.$number})) {  
         
      
             78 
            				$IMAGE = $IMAGES->{'image_'.$number};  
         
      
             79 
            			};  
                     
      
             109 
            80 
                                    $IMAGE = $m->comp('/contenido/components/set_image.msn', default=>$IMAGE, field=>$partname, SETS=>$SETS, object=>$object, prop => $prop);  
                      
      
             110 
                                    if (exists($IMAGE->{filename}))  
         
      
             111 
                                    {  
         
      
             112 
                                        local $Data::Dumper::Indent = 0;  
         
      
             113 
                                        $IMAGE->{number} = $number;  
         
      
             114 
                                        $IMAGES->{'image_'.$number} = $IMAGE;  
         
      
             115 
                                        $IMAGES->{maxnumber} = $number        if ($number > $IMAGES->{maxnumber});  
         
      
             116 
                                    }  
         
      
             117 
                                }  
         
      
             118 
                            }  
                     
      
             81 
            			if (exists($IMAGE->{filename})) {  
         
      
             82 
            				local $Data::Dumper::Indent = 0;  
         
      
             83 
            				$IMAGE->{number} = $number;  
         
      
             84 
            				$IMAGES->{'image_'.$number} = $IMAGE;  
         
      
             85 
            				$IMAGES->{maxnumber} = $number		if ($number > $IMAGES->{maxnumber});  
         
      
             86 
            			}  
         
      
             87 
            		    }  
         
      
             88 
            		}  
         
      
             89 
            	    }  
                     
      
             119 
            90 
             
                      
      
             120 
                        }  
         
      
             121 
             
         
      
             122 
                        if ( scalar(keys(%{ $IMAGES })) > 0)  
         
      
             123 
                        {  
                     
      
             91 
            	    if ( scalar(keys(%{ $IMAGES })) > 0) {  
                     
      
             124 
            92 
            		my $maxnumber = 0;  
          
      
             125 
            93 
            		for ( 1..100 ) {  
          
      
             126 
            94 
            			$maxnumber = $_		if exists $IMAGES->{"image_$_"} && $_ > $maxnumber;  
          
      
             127 
            95 
            		}  
          
      
             128 
            96 
            		$IMAGES->{maxnumber} = $maxnumber;  
                      
      
             129 
                            local $Data::Dumper::Indent = 0;  
         
      
             130 
                            $object->{$name} = Data::Dumper::Dumper($IMAGES);  
         
      
             131 
                        }  
                     
      
             97 
            		local $Data::Dumper::Indent = 0;  
         
      
             98 
            		$object->$name( Data::Dumper::Dumper($IMAGES) );  
         
      
             99 
            	    }  
                     
      
             132 
            100 
             
          
      
             133 
            101 
            	} elsif ( $prop->{type} eq 'multimedia' ) {  
          
      
             134 
            102 
                        # --------------------------------------------------------------------------------------  
           
   
      utf8/core/lib/Contenido/File.pm 
      
        
           
        
          
              
           
         
                  
      
             112 
            112 
                if (not ref $input) {  
          
      
             113 
            113 
                    no strict "refs";  
          
      
             114 
            114 
                    $fh = &{"Contenido::File::Scheme::".uc(scheme($input))."::get_fh"}($input);  
                      
      
             115 
                } elsif ((ref $input eq "GLOB") or (ref $input eq 'Apache::Upload') or (ref $input eq 'IO::File')) {  
                     
      
             115 
                } elsif ( ref $input eq 'Apache::Upload' ) {  
         
      
             116 
                    $fh = $input->fh;  
         
      
             117 
                } elsif ((ref $input eq "GLOB") or (ref $input eq 'IO::File')) {  
                     
      
             116 
            118 
                    $fh = $input;  
          
      
             117 
            119 
                } elsif (ref $input eq "SCALAR") {  
          
      
             118 
            120 
                    $fh = IO::Scalar->new($input);  
                  
          
            … 
            … 
              
           
               
      
             153 
            155 
            #     return $dir;  
          
      
             154 
            156 
            # }  
          
      
             155 
            157 
             
                      
      
             158 
            sub store_image {  
         
      
             159 
                my $input = shift;  
         
      
             160 
                my (%opts) = @_;  
         
      
             161 
                my $object = delete $opts{object} || return;  
         
      
             162 
                my $attr = delete $opts{attr}  || return;  
         
      
             163 
             
         
      
             164 
                my ($prop) = grep { $_->{attr} eq $attr } $object->structure;  
         
      
             165 
                return	unless ref $prop;  
         
      
             166 
                my @preview = exists $prop->{'preview'} && ref $prop->{'preview'} eq 'ARRAY' ? @{$prop->{'preview'}} : exists $prop->{'preview'} && $prop->{'preview'} ? ($prop->{'preview'}) : ();  
         
      
             167 
                my @crops = exists $prop->{'crop'} && ref $prop->{'crop'} eq 'ARRAY' ? @{$prop->{'crop'}} : exists $prop->{'crop'} && $prop->{'crop'} ? ($prop->{'crop'}) : ();  
         
      
             168 
                my @shrinks = exists $prop->{'shrink'} && ref $prop->{'shrink'} eq 'ARRAY' ? @{$prop->{'shrink'}} : exists $prop->{'shrink'} && $prop->{'shrink'} ? ($prop->{'shrink'}) : ();  
         
      
             169 
             
         
      
             170 
                my $filename = '/images/'.$object->get_file_name() || return;  
         
      
             171 
                my $filename_tmp = $state->{'tmp_dir'}.'/'.join('_', split('/', $filename));  
         
      
             172 
             
         
      
             173 
                my $fh = get_fh($input);  
         
      
             174 
                return	unless ref $fh;  
         
      
             175 
             
         
      
             176 
                my $size = (stat $fh)[7];  
         
      
             177 
                my $ext;  
         
      
             178 
                if ( $opts{filename} ) {  
         
      
             179 
            	$ext = $opts{filename} =~ /(jpe?g|gif|png)$/i ? lc $1 : 'bin';  
         
      
             180 
                } elsif ( not ref $input ) {  
         
      
             181 
            	$ext = $input =~ /(jpe?g|gif|png)$/i ? lc $1 : 'bin';  
         
      
             182 
                } elsif ( ref $input eq 'Apache::Upload' ) {  
         
      
             183 
            	$ext = $input->filename() =~ /(jpe?g|gif|png)$/i ? lc $1 : 'bin';  
         
      
             184 
                }  
         
      
             185 
                $ext ||= 'bin';  
         
      
             186 
             
         
      
             187 
                my $fh_tmp = IO::File->new('>'.$filename_tmp.'.'.$ext) || return;  
         
      
             188 
                my $buffer;  
         
      
             189 
             
         
      
             190 
                sysread $fh, $buffer, $size;  
         
      
             191 
                syswrite $fh_tmp, $buffer, $size;  
         
      
             192 
             
         
      
             193 
                undef $fh_tmp;  
         
      
             194 
             
         
      
             195 
                my $IMAGE;  
         
      
             196 
                if ( store($filename.'.'.$ext, $filename_tmp.'.'.$ext) ) {  
         
      
             197 
            	$IMAGE = {};  
         
      
             198 
            	# hashref slice assigning - жжесть  
         
      
             199 
            	@{$IMAGE}{'filename', 'width', 'height'} = (  
         
      
             200 
            		$filename.'.'.$ext,  
         
      
             201 
            		Image::Size::imgsize($filename_tmp.'.'.$ext),  
         
      
             202 
            	);  
         
      
             203 
             
         
      
             204 
            	foreach my $suffix (@preview) {  
         
      
             205 
            		my $c_line = $state->{'convert_binary'}.' -geometry \''.$suffix.'\' -quality 80 '.$filename_tmp.'.'.$ext.' '.$filename_tmp.'.'.$suffix.'.'.$ext;  
         
      
             206 
            		my $result = `$c_line`;  
         
      
             207 
             
         
      
             208 
            		if (length $result > 0) {  
         
      
             209 
            			warn 'Contenido Error: При вызове "'.$c_line.'" произошла ошибка "'.$result.'" ('.$@.")\n";  
         
      
             210 
            			return undef;  
         
      
             211 
            		}  
         
      
             212 
            		@{$IMAGE->{'mini'}{$suffix}}{'filename', 'width', 'height'} = (  
         
      
             213 
            			$filename.'.'.$suffix.'.'.$ext,  
         
      
             214 
            			Image::Size::imgsize($filename_tmp.'.'.$suffix.'.'.$ext),  
         
      
             215 
            		);  
         
      
             216 
            		%{$IMAGE->{'resize'}{$suffix}} = %{$IMAGE->{'mini'}{$suffix}};  
         
      
             217 
            		store($filename.'.'.$suffix.'.'.$ext, $filename_tmp.'.'.$suffix.'.'.$ext);  
         
      
             218 
            		unlink $filename_tmp.'.'.$suffix.'.'.$ext	if -e $filename_tmp.'.'.$suffix.'.'.$ext;  
         
      
             219 
            	}  
         
      
             220 
            	if ( @preview ) {  
         
      
             221 
            		@{$IMAGE->{'mini'}}{'filename', 'width', 'height'} = @{$IMAGE->{'mini'}{$preview[0]}}{'filename', 'width', 'height'};  
         
      
             222 
            		@{$IMAGE->{'resize'}}{'filename', 'width', 'height'} = @{$IMAGE->{'mini'}{$preview[0]}}{'filename', 'width', 'height'};  
         
      
             223 
            	}  
         
      
             224 
             
         
      
             225 
            	########## CROPS  
         
      
             226 
            	foreach my $suffix (@crops) {  
         
      
             227 
             
         
      
             228 
            		my $shave_string;  
         
      
             229 
            		my ($nwidth, $nheight) = $suffix =~ /(\d+)x(\d+)/i ? ($1, $2) : (0, 0);  
         
      
             230 
            		if ( ($IMAGE->{width} / $IMAGE->{height}) > ($nwidth / $nheight) ) {  
         
      
             231 
            			my $shave_pixels = (($IMAGE->{width} / $IMAGE->{height}) - ($nwidth / $nheight)) * $IMAGE->{height};  
         
      
             232 
            			$shave_string = ' -shave '.int($shave_pixels / 2).'x0';  
         
      
             233 
            		} elsif ( ($IMAGE->{height} / $IMAGE->{width}) > ($nheight / $nwidth) ) {  
         
      
             234 
            			my $shave_pixels = (($IMAGE->{height} / $IMAGE->{width}) - ($nheight / $nwidth)) * $IMAGE->{width};  
         
      
             235 
            			$shave_string = ' -shave 0x'.int($shave_pixels / 2);  
         
      
             236 
            		}  
         
      
             237 
            		if ( $shave_string ) {  
         
      
             238 
            			my $c_line = $state->{"convert_binary"}." $shave_string $filename_tmp.$ext $filename_tmp.shaved.$ext";  
         
      
             239 
            			my $result = `$c_line`;  
         
      
             240 
            			if (length $result  > 0) {  
         
      
             241 
            				print "Contenido Error: При вызове '$c_line' произошла ошибка '$result' ($@)\n";  
         
      
             242 
            			}  
         
      
             243 
            		} else {  
         
      
             244 
            			my $c_line = "cp $filename_tmp.$ext $filename_tmp.shaved.$ext";  
         
      
             245 
            			my $result = `$c_line`;  
         
      
             246 
            			if (length $result  > 0) {  
         
      
             247 
            				print "Contenido Error: При вызове '$c_line' произошла ошибка '$result' ($@)\n";  
         
      
             248 
            			}  
         
      
             249 
            		}  
         
      
             250 
             
         
      
             251 
            		my $c_line = $state->{'convert_binary'}.' -geometry \''.$suffix.'!\' -quality 80 '.$filename_tmp.'.shaved.'.$ext.' '.$filename_tmp.'.'.$suffix.'.'.$ext;  
         
      
             252 
            		my $result = `$c_line`;  
         
      
             253 
             
         
      
             254 
            		if (length $result > 0) {  
         
      
             255 
            			warn 'Contenido Error: При вызове "'.$c_line.'" произошла ошибка "'.$result.'" ('.$@.")\n";  
         
      
             256 
            			return undef;  
         
      
             257 
            		}  
         
      
             258 
            		@{$IMAGE->{'mini'}{$suffix}}{'filename', 'width', 'height'} = (  
         
      
             259 
            			$filename.'.'.$suffix.'.'.$ext,  
         
      
             260 
            			Image::Size::imgsize($filename_tmp.'.'.$suffix.'.'.$ext),  
         
      
             261 
            		);  
         
      
             262 
            		%{$IMAGE->{'crop'}{$suffix}} = %{$IMAGE->{'mini'}{$suffix}};  
         
      
             263 
            		store($filename.'.'.$suffix.'.'.$ext, $filename_tmp.'.'.$suffix.'.'.$ext);  
         
      
             264 
            		unlink $filename_tmp.'.shaved.'.$ext      if -e $filename_tmp.'.shaved.'.$ext;  
         
      
             265 
            		unlink $filename_tmp.'.'.$suffix.'.'.$ext if -e $filename_tmp.'.'.$suffix.'.'.$ext;  
         
      
             266 
            	}  
         
      
             267 
            	if ( @crops ) {  
         
      
             268 
            		if ( !exists $IMAGE->{'mini'}{'filename'} ) {  
         
      
             269 
            			@{$IMAGE->{'mini'}}{'filename', 'width', 'height'} = @{$IMAGE->{'mini'}{$crops[0]}}{'filename', 'width', 'height'};  
         
      
             270 
            		}  
         
      
             271 
            		@{$IMAGE->{'crop'}}{'filename', 'width', 'height'} = @{$IMAGE->{'crop'}{$crops[0]}}{'filename', 'width', 'height'};  
         
      
             272 
            	}  
         
      
             273 
             
         
      
             274 
             
         
      
             275 
            	########## SHRINKS  
         
      
             276 
            	foreach my $suffix (@shrinks) {  
         
      
             277 
             
         
      
             278 
            		my $c_line = $state->{'convert_binary'}.' -geometry \''.$suffix.'!\' -quality 80 '.$filename_tmp.'.'.$ext.' '.$filename_tmp.'.'.$suffix.'.'.$ext;  
         
      
             279 
            		my $result = `$c_line`;  
         
      
             280 
             
         
      
             281 
            		if (length $result > 0) {  
         
      
             282 
            			warn 'Contenido Error: При вызове "'.$c_line.'" произошла ошибка "'.$result.'" ('.$@.")\n";  
         
      
             283 
            			return undef;  
         
      
             284 
            		}  
         
      
             285 
            		@{$IMAGE->{'mini'}{$suffix}}{'filename', 'width', 'height'} = (  
         
      
             286 
            			$filename.'.'.$suffix.'.'.$ext,  
         
      
             287 
            			Image::Size::imgsize($filename_tmp.'.'.$suffix.'.'.$ext),  
         
      
             288 
            		);  
         
      
             289 
            		%{$IMAGE->{'shrink'}{$suffix}} = %{$IMAGE->{'mini'}{$suffix}};  
         
      
             290 
            		store($filename.'.'.$suffix.'.'.$ext, $filename_tmp.'.'.$suffix.'.'.$ext);  
         
      
             291 
            		unlink $filename_tmp.'.'.$suffix.'.'.$ext if -e $filename_tmp.'.'.$suffix.'.'.$ext;  
         
      
             292 
            	}  
         
      
             293 
            	if ( @shrinks && !exists $IMAGE->{'mini'}{'filename'} ) {  
         
      
             294 
            		if ( !exists $IMAGE->{'mini'}{'filename'} ) {  
         
      
             295 
            			@{$IMAGE->{'mini'}}{'filename', 'width', 'height'} = @{$IMAGE->{'mini'}{$shrinks[0]}}{'filename', 'width', 'height'};  
         
      
             296 
            		}  
         
      
             297 
            		@{$IMAGE->{'shrink'}}{'filename', 'width', 'height'} = @{$IMAGE->{'shrink'}{$shrinks[0]}}{'filename', 'width', 'height'};  
         
      
             298 
            	}  
         
      
             299 
             
         
      
             300 
            	unlink $filename_tmp.'.'.$ext if -e $filename_tmp.'.'.$ext;  
         
      
             301 
                }  
         
      
             302 
             
         
      
             303 
                return $IMAGE;  
         
      
             304 
            }  
         
      
             305 
             
         
      
             306 
            sub remove_image {  
         
      
             307 
                my $IMAGE = shift;  
         
      
             308 
             
         
      
             309 
                if ( ref $IMAGE eq 'HASH' && exists $IMAGE->{filename} ) {  
         
      
             310 
            	remove($IMAGE->{'filename'}) || return;  
         
      
             311 
                }  
         
      
             312 
                if ( ref $IMAGE && exists $IMAGE->{mini} && ref $IMAGE->{mini} eq 'HASH' ) {  
         
      
             313 
            	foreach my $val ( values %{$IMAGE->{mini}} ) {  
         
      
             314 
            		if ( ref $val && exists $val->{filename} && $val->{filename} ) {  
         
      
             315 
            			remove($val->{'filename'}) || return;  
         
      
             316 
            		}  
         
      
             317 
            	}  
         
      
             318 
                }  
         
      
             319 
                1;  
         
      
             320 
            }  
         
      
             321 
             
         
      
             322 
             
                     
      
             156 
            323 
            1;  
           
   
      utf8/core/lib/Contenido/Object.pm 
      
        
           
        
          
              
           
         
                  
      
             18 
            18 
             
          
      
             19 
            19 
            use Utils;  
          
      
             20 
            20 
            use Contenido::Globals;  
                      
      
             21 
            use Contenido::File;  
                     
      
             21 
            22 
            use Data::Dumper;  
          
      
             22 
            23 
             
          
      
             23 
            24 
            use DBD::Pg;  
                  
          
            … 
            … 
              
           
               
      
             1130 
            1131 
                return $_[0]->keeper->state->memcached_object_expire;  
          
      
             1131 
            1132 
            }  
          
      
             1132 
            1133 
             
                      
      
             1134 
            # ----------------------------------------------------------------------------  
         
      
             1135 
            # Метод _image_store() генерит  сохраняет графику, привязанную к полю image или images   
         
      
             1136 
            #  
         
      
             1137 
            # Формат использования:  
         
      
             1138 
            #  $document->_image_store( INPUT, field => 'fieldname' )  
         
      
             1139 
            # ----------------------------------------------------------------------------  
         
      
             1140 
            sub _store_image {  
         
      
             1141 
                my $self = shift;  
         
      
             1142 
                do { $log->error("Метод delete() можно вызывать только у объектов, но не классов"); die } unless ref($self);  
         
      
             1143 
             
         
      
             1144 
                my $input = shift;  
         
      
             1145 
                my (%opts) = @_;  
         
      
             1146 
             
         
      
             1147 
                return Contenido::File::store_image( $input, object => $self, attr => $opts{attr} );  
         
      
             1148 
            }  
         
      
             1149 
             
         
      
             1150 
            sub _delete_image {  
         
      
             1151 
                my $self = shift;  
         
      
             1152 
                my $IMAGE = shift;  
         
      
             1153 
             
         
      
             1154 
                return Contenido::File::remove_image( $IMAGE );  
         
      
             1155 
            }  
         
      
             1156 
             
                     
      
             1133 
            1157 
            1;  
          
      
             1134 
            1158 
             
           
   
      utf8/core/lib/Contenido/Parser.pm 
      
        
           
        
          
              
           
         
                  
      
             55 
            55 
            			return $self;  
          
      
             56 
            56 
            		}  
          
      
             57 
            57 
            	}  
                      
      
             58 
                } elsif ((ref $input eq "GLOB") or (ref $input eq 'Apache::Upload') or (ref $input eq 'IO::File')) {  
                     
      
             58 
                } elsif ( ref $input eq 'Apache::Upload' ) {  
         
      
             59 
            	$fh = $input->fh;  
         
      
             60 
                } elsif ((ref $input eq "GLOB") or (ref $input eq 'IO::File')) {  
                     
      
             59 
            61 
            	$fh = $input;  
          
      
             60 
            62 
                } elsif (ref $input eq "SCALAR") {  
          
      
             61 
            63 
            	$fh = IO::Scalar->new($input);  
           
     
 
 
      
    
Небольшая справка по веткам 
cnddist  – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8  – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8  – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core  – исходники ядра; install  – скрипт установки инсталляции; plugins  – плагины; samples  – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.