Line # Revision Author
1 8 ahitrov@rambler.ru <%once>
2
3 my @attypes = ( 'multimedia_new', 'image', 'images', 'audio' );
4
5 </%once>
6 <%args>
7
8 $object => undef
9 $source => undef
10
11 </%args>
12 <%init>
13
14 return unless ref $object;
15 return unless ref $source;
16
17 local $Data::Dumper::Indent = 0;
18 my @properties = $source->structure();
19 for (0..$#properties) {
20 my $prop = $properties[$_];
21 my $name = $prop->{attr};
22 my $type = $prop->{type};
23 next unless grep { $_ eq $type } @attypes;
24 my $attachment = $source->get_image( $name );
25 warn "\nClone: $type | $name\n" if $DEBUG;
26 if (ref $attachment) {
27 if ( $prop->{type} eq 'image' ) {
28 ## Отдельная картинка
29 ##############################################################
30 if ( exists $attachment->{filename} ) {
31 my $img;
32 my $source_name;
33 my $ext;
34 my $new_name = '/images/'.$object->get_file_name();
35 warn "Clone img put from: $source_name to $new_name.$ext\n" if $DEBUG;
36 my $stored = 0;
37 foreach my $source ( @{ $state->{files_dir} } ) {
38 $source_name = $source.$attachment->{filename};
39 $ext = $1 if $source_name =~ /\.(\w+)$/;
40 $stored = Contenido::File::store ($new_name.'.'.$ext, $source_name);
41 last if $stored;
42 }
43 if ( $stored ) {
44 $img = {
45 filename => $new_name.'.'.$ext,
46 width => $attachment->{width},
47 height => $attachment->{height},
48 alt => $attachment->{alt},
49 atext => $attachment->{atext} };
50 if ( exists $attachment->{mini} ) {
51 my $source_mini;
52 my $main_size = $attachment->{mini}{width}.'x'.$attachment->{mini}{height};
53 my $mini_name = $new_name.'.'.$main_size;
54 my $stored = 0;
55 foreach my $source ( @{ $state->{files_dir} } ) {
56 $source_mini = $source.$attachment->{mini}{filename};
57 $stored = Contenido::File::store ($mini_name.'.'.$ext, $source_mini);
58 last if $stored;
59 }
60 if ( $stored ) {
61 $img->{mini} = {
62 filename => $mini_name.'.'.$ext,
63 width => $attachment->{mini}{width},
64 height => $attachment->{mini}{height},
65 };
66 $img->{mini}->{$main_size} = {
67 filename => $mini_name.'.'.$ext,
68 width => $attachment->{mini}{width},
69 height => $attachment->{mini}{height},
70 };
71 }
72 foreach my $key ( keys %{ $attachment->{mini} } ) {
73 next if $key =~ /file|width|height/;
74 next if $key eq $main_size;
75 my $source_mini;
76 my $size = $attachment->{mini}{$key}{width}.'x'.$attachment->{mini}{$key}{height};
77 my $mini_name = $new_name.'.'.$size;
78 my $stored = 0;
79 foreach my $source ( @{ $state->{files_dir} } ) {
80 $source_mini = $source.$attachment->{mini}{$key}{filename};
81 $stored = Contenido::File::store ($mini_name.'.'.$ext, $source_mini);
82 last if $stored;
83 }
84 if ( $stored ) {
85 $img->{mini}->{$key} = {
86 filename => $mini_name.'.'.$ext,
87 width => $attachment->{mini}{$key}{width},
88 height => $attachment->{mini}{$key}{height},
89 };
90 }
91 }
92 }
93 }
94 $object->$name(Dumper($img));
95 warn "\nClone img complete: ".Dumper($img)."\n" if $DEBUG;
96 }
97 } elsif ( $prop->{type} eq 'images' ) {
98 ## Куча картинков
99 ##############################################################
100 my $PICTURE;
101 for ( 1 .. $attachment->{maxnumber} ) {
102 my $picture = 'image_'.$_;
103 if ( exists $attachment->{$picture}{filename} ) {
104 my $img;
105 my $source_name = $state->{files_dir}->[0].$attachment->{$picture}{filename};
106 my $ext = $1 if $source_name =~ /\.(\w+)$/;
107 my $new_name = '/images/'.$object->get_file_name();
108 warn "Clone pics put from: $source_name to $new_name.$ext\n" if $DEBUG;
109 if ( Contenido::File::store ($new_name.'.'.$ext, $source_name) ) {
110 $img = {
111 filename => $new_name.'.'.$ext,
112 width => $attachment->{$picture}{width},
113 height => $attachment->{$picture}{height},
114 alt => $attachment->{$picture}{alt},
115 atext => $attachment->{$picture}{atext} };
116 if ( exists $attachment->{$picture}{mini} ) {
117 my $source_mini = $state->{files_dir}->[0].$attachment->{$picture}{mini}{filename};
118 my $main_size = $attachment->{$picture}{mini}{width}.'x'.$attachment->{$picture}{mini}{height};
119 my $mini_name = $new_name.'.'.$main_size;
120 if ( Contenido::File::store ($mini_name.'.'.$ext, $source_mini) ) {
121 $img->{mini} = {
122 filename => $mini_name.'.'.$ext,
123 width => $attachment->{$picture}{mini}{width},
124 height => $attachment->{$picture}{mini}{height},
125 };
126 $img->{mini}->{$main_size} = {
127 filename => $mini_name.'.'.$ext,
128 width => $attachment->{$picture}{mini}{width},
129 height => $attachment->{$picture}{mini}{height},
130 };
131 }
132 foreach my $key ( keys %{ $attachment->{$picture}{mini} } ) {
133 next if $key =~ /file|width|height/;
134 next if $key eq $main_size;
135 my $source_mini = $state->{files_dir}->[0].$attachment->{$picture}{mini}{$key}{filename};
136 my $size = $attachment->{$picture}{mini}{$key}{width}.'x'.$attachment->{$picture}{mini}{$key}{height};
137 my $mini_name = $new_name.'.'.$size;
138 if ( Contenido::File::store ($mini_name.'.'.$ext, $source_mini) ) {
139 $img->{mini}->{$key} = {
140 filename => $mini_name.'.'.$ext,
141 width => $attachment->{$picture}{mini}{$key}{width},
142 height => $attachment->{$picture}{mini}{$key}{height},
143 };
144 }
145 }
146 }
147 }
148 $PICTURE->{$picture} = $img;
149 }
150
151 }
152 if ( $attachment->{maxnumber} ) {
153 $PICTURE->{maxnumber} = $attachment->{maxnumber};
154 $object->$name(Dumper($PICTURE));
155 }
156 warn "\nClone pics complete: ".Dumper($PICTURE)."\n" if $DEBUG;
157 } elsif ( $prop->{type} eq 'multimedia_new' ) {
158 ## Произвольный бинарник
159 ##############################################################
160 if ( exists $attachment->{filename} ) {
161 my $img;
162 my $source_name = $state->{files_dir}->[0].$attachment->{filename};
163 my $ext = $1 if $source_name =~ /\.(\w+)$/;
164 my $new_name = '/images/'.$object->get_file_name();
165 if ( Contenido::File::store ($new_name.'.'.$ext, $source_name) ) {
166 $img = {
167 filename => $new_name.'.'.$ext,
168 atext => $attachment->{atext}
169 };
170 }
171 $object->$name(Dumper($img));
172 warn "\nClone binary complete: ".Dumper($img)."\n" if $DEBUG;
173 }
174 }
175 }
176 }
177
178
179 </%init>

Небольшая справка по веткам

cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.

koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.

utf8 – актуальная ветка, заточенная под UTF-8.

Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.