Line # Revision Author
1 8 ahitrov@rambler.ru <%once>
2
3 my %translit = (
4 'а' => 'a',
5 'б' => 'b',
6 'в' => 'v',
7 'г' => 'g',
8 'д' => 'd',
9 'е' => 'e',
10 'ё' => 'e',
11 'ж' => 'zh',
12 'з' => 'z',
13 'и' => 'i',
14 'й' => 'y',
15 'к' => 'k',
16 'л' => 'l',
17 'м' => 'm',
18 'н' => 'n',
19 'о' => 'o',
20 'п' => 'p',
21 'р' => 'r',
22 'с' => 's',
23 'т' => 't',
24 'у' => 'u',
25 'ф' => 'f',
26 'х' => 'h',
27 'ц' => 'ts',
28 'ч' => '4',
29 'ш' => 'sh',
30 'щ' => 'sch',
31 'ъ' => 'y',
32 'ы' => 'i',
33 'ь' => 'y',
34 'э' => 'e',
35 'ю' => 'u',
36 'я' => 'a',
37 'А' => 'A',
38 'Б' => 'B',
39 'В' => 'V',
40 'Г' => 'G',
41 'Д' => 'D',
42 'Е' => 'E',
43 'Ё' => 'E',
44 'Ж' => 'ZH',
45 'З' => 'Z',
46 'И' => 'I',
47 'Й' => 'Y',
48 'К' => 'K',
49 'Л' => 'L',
50 'М' => 'M',
51 'Н' => 'N',
52 'О' => 'O',
53 'П' => 'P',
54 'Р' => 'R',
55 'С' => 'S',
56 'Т' => 'T',
57 'У' => 'U',
58 'Ф' => 'F',
59 'Х' => 'H',
60 'Ц' => 'TS',
61 'Ч' => '4',
62 'Ш' => 'SH',
63 'Щ' => 'SCH',
64 'Ъ' => 'Y',
65 'Ы' => 'I',
66 'Ь' => 'Y',
67 'Э' => 'E',
68 'Ю' => 'U',
69 'Я' => 'YA',
70 );
71
72 </%once>
73 <%args>
74
75 $SETS => undef
76 $field => undef
77 $default=> undef
78 $object => undef
79 $prop => undef
80
81 </%args>
82 <%init>
83
84 use IO::File;
85
86 return undef unless defined $SETS and defined $field;
87 #use vars qw($keeper);
88
89 # --------------------------------------------------------------------------------------
90 # Добавление одной картинки
91
92 my $BINARY = $default;
93
94 if ($SETS->{$field}) {
95 my $filename = "/binary/".$object->get_file_name() || return;
96 my $upload = $r->upload($field);
97 if ( $prop->{softrename} ) {
98 my $oid = $object->id || int(rand(10000));
99 my $orig_name = $upload->filename();
100 if ( $orig_name =~ /\\([^\\]+)$/ ) {
101 $orig_name = $1;
102 } elsif ( $orig_name =~ /\/([^\/]+)$/ ) {
103 $orig_name = $1;
104 }
105 $orig_name =~ s/[\ \t]/_/g;
106 $orig_name = $oid.'_'.$orig_name;
107 $filename =~ s/\/([^\/]+)$//;
108 my $fname = $1;
109 unless ( $orig_name =~ /^[a-zA-Z_\d\.\-\,]+$/ ) {
110 $orig_name = $m->comp('.translit', str => $orig_name);
111 }
112 warn "\n\n\n\n\nNew Name: [$orig_name]\n\n\n\n\n";
113 unless ( $orig_name =~ /^[a-zA-Z_\d\.\-\,]+$/ ) {
114 $orig_name = $fname;
115 }
116 $filename .= '/'.$orig_name;
117 $filename =~ s/\.([^\.]+)$//;
118 }
119 my $filename_tmp = $state->{"tmp_dir"}."/".join("_", split("/", $filename));
120
121 my $suffix = $upload->filename() =~ /\.([^\.]+)$/ ? lc($1) : 'bin';
122 my $fh = $upload->fh();
123 my $size = (stat $fh)[7];
124
125 my $fh_tmp = IO::File->new(">".$filename_tmp.".".$suffix) || die "Can't open temporary file";
126
127 my $buffer;
128
129 $size = sysread $fh, $buffer, $size;
130 syswrite $fh_tmp, $buffer, $size;
131
132 undef $fh_tmp;
133
134 if (Contenido::File::store($filename.".".$suffix, $filename_tmp.".".$suffix)) {
135 if (ref $BINARY eq "HASH" and $BINARY->{"filename"}) {
136 Contenido::File::remove($BINARY->{"filename"});
137 }
138
139 @{$BINARY}{"filename", "ext", "size"} = (
140 $filename.".".$suffix,
141 $suffix,
142 $size
143 );
144 }
145
146 unlink $filename_tmp.".".$suffix if -e $filename_tmp.".".$suffix;
147 if ( $suffix =~ /(rar|7z|zip|arc|lha|arj|cab)/ ) {
148 $BINARY->{type} = 'archive';
149 } elsif ( $suffix =~ /(doc|rtf)/ ) {
150 $BINARY->{type} = 'doc';
151 } elsif ( $suffix eq 'xls' ) {
152 $BINARY->{type} = 'xls';
153 } elsif ( $suffix =~ /(mdb|ppt)/ ) {
154 $BINARY->{type} = 'msoffice';
155 } elsif ( $suffix =~ /(pdf)/ ) {
156 $BINARY->{type} = 'ebook';
157 } elsif ( $suffix eq 'psd' ) {
158 $BINARY->{type} = 'psd';
159 } elsif ( $suffix =~ /(exe|msi|cab)/ ) {
160 $BINARY->{type} = 'executable';
161 } else {
162 $BINARY->{type} = 'unknown';
163 }
164 }
165
166 # Дополнительные поля - берем все, что найдем...
167
168 my $pattern = "^".$field.q|\.(.*)$|;
169
170 foreach my $localfield (keys(%{ $SETS })) {
171 if ($localfield =~ /$pattern/) {
172 my $imagefield = $1;
173 $BINARY->{$imagefield} = $m->comp("/contenido/components/filter.msn", str => $SETS->{$localfield});
174 }
175 }
176
177 return $BINARY;
178
179 </%init>
180
181
182 <%def .translit>
183 <%args>
184 $str => undef
185 </%args>
186 <%init>
187
188 my @str = split (//, $str);
189 my $res = '';
190 while ( scalar @str ) {
191 my $alpha = shift @str;
192 if ( exists $translit{$alpha} ) {
193 $res .= $translit{$alpha};
194 } else {
195 $res .= $alpha;
196 }
197 }
198 return $res;
199
200 </%init>
201 </%def>