Revision 3 (by ahitrov@rambler.ru, 2010/03/24 15:19:32) The CORE
<%once>

   my %translit = (
	'�'	=> 'a',
	'�'	=> 'b',
	'�'	=> 'v',
	'�'	=> 'g',
	'�'	=> 'd',
	'�'	=> 'e',
	'�'	=> 'e',
	'�'	=> 'zh',
	'�'	=> 'z',
	'�'	=> 'i',
	'�'	=> 'y',
	'�'	=> 'k',
	'�'	=> 'l',
	'�'	=> 'm',
	'�'	=> 'n',
	'�'	=> 'o',
	'�'	=> 'p',
	'�'	=> 'r',
	'�'	=> 's',
	'�'	=> 't',
	'�'	=> 'u',
	'�'	=> 'f',
	'�'	=> 'h',
	'�'	=> 'ts',
	'�'	=> '4',
	'�'	=> 'sh',
	'�'	=> 'sch',
	'�'	=> 'y',
	'�'	=> 'i',
	'�'	=> 'y',
	'�'	=> 'e',
	'�'	=> 'u',
	'�'	=> 'a',
	'�'	=> 'A',
	'�'	=> 'B',
	'�'	=> 'V',
	'�'	=> 'G',
	'�'	=> 'D',
	'�'	=> 'E',
	'�'	=> 'E',
	'�'	=> 'ZH',
	'�'	=> 'Z',
	'�'	=> 'I',
	'�'	=> 'Y',
	'�'	=> 'K',
	'�'	=> 'L',
	'�'	=> 'M',
	'�'	=> 'N',
	'�'	=> 'O',
	'�'	=> 'P',
	'�'	=> 'R',
	'�'	=> 'S',
	'�'	=> 'T',
	'�'	=> 'U',
	'�'	=> 'F',
	'�'	=> 'H',
	'�'	=> 'TS',
	'�'	=> '4',
	'�'	=> 'SH',
	'�'	=> 'SCH',
	'�'	=> 'Y',
	'�'	=> 'I',
	'�'	=> 'Y',
	'�'	=> 'E',
	'�'	=> 'U',
	'�'	=> 'YA',
   );

</%once>
<%args>

	$SETS	=> undef
	$field	=> undef
	$default=> undef
	$object	=> undef
	$prop	=> undef

</%args>
<%init>

use IO::File;

return undef unless defined $SETS and defined $field;
#use vars qw($keeper);

# --------------------------------------------------------------------------------------
# ���������� ����� ��������

my $BINARY = $default;

if ($SETS->{$field}) {
    my $filename = "/binary/".$object->get_file_name() || return;
    my $upload = $r->upload($field);
    if ( $prop->{softrename} ) {
	my $oid = $object->id || int(rand(10000));
	my $orig_name = $upload->filename();
	if ( $orig_name =~ /\\([^\\]+)$/ ) {
		$orig_name = $1;
	} elsif ( $orig_name =~ /\/([^\/]+)$/ ) {
		$orig_name = $1;
	}
	$orig_name =~ s/[\ \t]/_/g;
	$orig_name = $oid.'_'.$orig_name;
	$filename =~ s/\/([^\/]+)$//;
	my $fname = $1;
	unless ( $orig_name =~ /^[a-zA-Z_\d\.\-\,]+$/ ) {
		$orig_name = $m->comp('.translit', str => $orig_name);
	}
	warn "\n\n\n\n\nNew Name: [$orig_name]\n\n\n\n\n";
	unless ( $orig_name =~ /^[a-zA-Z_\d\.\-\,]+$/ ) {
		$orig_name = $fname;
	}
	$filename .= '/'.$orig_name;
	$filename =~ s/\.([^\.]+)$//;
    }
    my $filename_tmp = $state->{"tmp_dir"}."/".join("_", split("/", $filename));

    my $suffix = $upload->filename() =~ /\.([^\.]+)$/ ? lc($1) : 'bin';
    my $fh = $upload->fh();
    my $size = (stat $fh)[7];

    my $fh_tmp = IO::File->new(">".$filename_tmp.".".$suffix) || die "Can't open temporary file";

    my $buffer;

    $size = sysread $fh, $buffer, $size;
    syswrite $fh_tmp, $buffer, $size;

    undef $fh_tmp;

    if (Contenido::File::store($filename.".".$suffix, $filename_tmp.".".$suffix)) {
        if (ref $BINARY eq "HASH" and $BINARY->{"filename"}) {
            Contenido::File::remove($BINARY->{"filename"});
        }

        @{$BINARY}{"filename", "ext", "size"} = (
            $filename.".".$suffix,
        $suffix,
        $size
        );
    }

    unlink $filename_tmp.".".$suffix if -e $filename_tmp.".".$suffix;
    if ( $suffix =~ /(rar|7z|zip|arc|lha|arj|cab)/ ) {
	$BINARY->{type} = 'archive';
    } elsif ( $suffix =~ /(doc|rtf)/ ) {
	$BINARY->{type} = 'doc';
    } elsif ( $suffix eq 'xls' ) {
	$BINARY->{type} = 'xls';
    } elsif ( $suffix =~ /(mdb|ppt)/ ) {
	$BINARY->{type} = 'msoffice';
    } elsif ( $suffix =~ /(pdf)/ ) {
	$BINARY->{type} = 'ebook';
    } elsif ( $suffix eq 'psd' ) {
	$BINARY->{type} = 'psd';
    } elsif ( $suffix =~ /(exe|msi|cab)/ ) {
	$BINARY->{type} = 'executable';
    } else {
	$BINARY->{type} = 'unknown';
    }
}

# �������������� ���� - ����� ���, ��� ������...

my $pattern = "^".$field.q|\.(.*)$|;

foreach my $localfield (keys(%{ $SETS })) {
    if ($localfield =~ /$pattern/) {
        my $imagefield = $1;
        $BINARY->{$imagefield} = $m->comp("/contenido/components/filter.msn", str => $SETS->{$localfield});
    }
}

return $BINARY;

</%init>


<%def .translit>
<%args>
	$str	=> undef
</%args>
<%init>

   my @str = split (//, $str);
   my $res = '';
   while ( scalar @str ) {
	my $alpha = shift @str;
	if ( exists $translit{$alpha} ) {
		$res .= $translit{$alpha};
	} else {
		$res .= $alpha;
	}
   }
   return $res;

</%init>
</%def>