Revision 147
Date:
2011/10/06 11:02:33
Author:
ahitrov
Revision Log:
New param transform => ['crop','WxH'] in image field description
HTML parser now can understand <a href="some.image.jpg"><img src="small.image.jpg"></a> structures
HTML parser don't cut <a>-tags without 'strip_html' param
Files:
Legend:
Added
Removed
Modified
utf8/core/lib/Contenido/File.pm
214
214
if ( ref $image_info && $image_info->{file_ext} ne $ext ) {
215
215
rename $filename_tmp.'.'.$ext, $filename_tmp.'.'.$image_info->{file_ext};
216
216
$ext = $image_info->{file_ext};
217
} elsif ( !ref $image_info ) {
218
unlink $filename_tmp.'.'.$ext;
219
return undef;
217
220
}
221
my $transformed;
222
if ( exists $prop->{transform} && ref $prop->{transform} eq 'ARRAY' && scalar @{$prop->{transform}} == 2 && $prop->{transform}[0] =~ /(crop|resize|shrink)/ ) {
223
my $c_line;
224
if ( $prop->{transform}[0] eq 'resize' ) {
225
$c_line = $state->{'convert_binary'}.' -resize \''.$prop->{transform}[1].'\' -quality 80 '.$filename_tmp.'.'.$ext.' '.$filename_tmp.'.transformed.'.$ext;
226
} elsif ( $prop->{transform}[0] eq 'crop' ) {
227
my $shave_string;
228
my ($nwidth, $nheight) = $prop->{transform}[1] =~ /(\d+)x(\d+)/i ? ($1, $2) : (0, 0);
229
if ( ($image_info->{width} / $image_info->{height}) > ($nwidth / $nheight) ) {
230
my $shave_pixels = (($image_info->{width} / $image_info->{height}) - ($nwidth / $nheight)) * $image_info->{height};
231
$shave_string = ' -shave '.int($shave_pixels / 2).'x0';
232
} elsif ( ($image_info->{height} / $image_info->{width}) > ($nheight / $nwidth) ) {
233
my $shave_pixels = (($image_info->{height} / $image_info->{width}) - ($nheight / $nwidth)) * $image_info->{width};
234
$shave_string = ' -shave 0x'.int($shave_pixels / 2);
235
}
236
if ( $shave_string ) {
237
my $c_line = $state->{"convert_binary"}." $shave_string $filename_tmp.$ext $filename_tmp.shaved.$ext";
238
my $result = `$c_line`;
239
if (length $result > 0) {
240
print "Contenido Error: При вызове '$c_line' произошла ошибка '$result' ($@)\n";
241
return undef;
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
return undef;
249
}
250
}
251
$c_line = $state->{'convert_binary'}.' -geometry \''.$prop->{transform}[1].'!\' -quality 80 '.$filename_tmp.'.shaved.'.$ext.' '.$filename_tmp.'.transformed.'.$ext;
252
} elsif ( $prop->{transform}[0] eq 'shrink' ) {
253
$c_line = $state->{'convert_binary'}.' -geometry \''.$prop->{transform}[1].'!\' -quality 80 '.$filename_tmp.'.'.$ext.' '.$filename_tmp.'.transformed.'.$ext;
254
}
255
my $result = `$c_line`;
256
$transformed = 1;
257
unlink $filename_tmp.'.shaved.'.$ext if -e $filename_tmp.'.shaved.'.$ext;
258
}
218
259
219
260
my $IMAGE;
220
if ( store($filename.'.'.$ext, $filename_tmp.'.'.$ext) ) {
261
my $stored = $transformed ? store($filename.'.'.$ext, $filename_tmp.'.transformed.'.$ext) : store($filename.'.'.$ext, $filename_tmp.'.'.$ext);
262
if ( $stored ) {
221
263
$IMAGE = {};
222
# hashref slice assigning - жжесть
223
@{$IMAGE}{'filename', 'width', 'height'} = (
224
$filename.'.'.$ext,
225
Image::Size::imgsize($filename_tmp.'.'.$ext),
226
);
264
if ( $transformed && -e $filename_tmp.'.transformed.'.$ext ) {
265
# hashref slice assigning - жжесть
266
@{$IMAGE}{'filename', 'width', 'height'} = (
267
$filename.'.transformed.'.$ext,
268
Image::Size::imgsize($filename_tmp.'.'.$ext),
269
);
270
unlink $filename_tmp.'.transformed.'.$ext;
271
} else {
272
# hashref slice assigning - жжесть
273
@{$IMAGE}{'filename', 'width', 'height'} = (
274
$filename.'.'.$ext,
275
Image::Size::imgsize($filename_tmp.'.'.$ext),
276
);
277
}
227
278
228
279
foreach my $suffix (@preview) {
229
280
my $c_line = $state->{'convert_binary'}.' -geometry \''.$suffix.'\' -quality 80 '.$filename_tmp.'.'.$ext.' '.$filename_tmp.'.'.$suffix.'.'.$ext;
utf8/core/lib/Contenido/Parser/HTML.pm
79
79
my $post_rools = $self->__parse_rools (delete $opts{parser_end});
80
80
warn Dumper ($post_rools) if $debug;
81
81
82
# warn "Experimental. Debug!!!\n" if $debug;
82
##### Experimental things sometimes transform to things for everyday use
83
#########################################################################
83
84
if ( ref $pre_rools eq 'ARRAY' ) {
84
85
my @sets = grep { $_->{command} eq 'set' } @$pre_rools;
85
86
foreach my $set ( @sets ) {
…
…
114
115
$self->__extract_headers ($shortcuts, $header, $debug);
115
116
warn "Getting big texts (min=$minimum)...\n" if $debug;
116
117
my $chosen = $self->__dig_big_texts (
117
structure => $shortcuts,
118
min => $minimum,
118
structure => $shortcuts,
119
min => $minimum,
119
120
ref $parse_rools eq 'ARRAY' && @$parse_rools ? (rools => $parse_rools) : (),
120
debug => $debug );
121
strip_html => $strip_html,
122
debug => $debug );
121
123
unless ( ref $chosen eq 'ARRAY' && @$chosen ) {
122
124
$self->{error_message} = 'Nothing was found at all!!! Check your MINIMUM value';
123
125
return $self->is_success(0) unless $gui;
…
…
600
602
return unless ref $structure eq 'HASH';
601
603
602
604
foreach my $tag ( grep { ref $_ && $_->{type} eq 'text' && $_->{text} } values %$structure ) {
603
while ( $tag->{text} =~ /<img (.*?)\/?>/sgi ) {
605
while ( $tag->{text} =~ /<img[\ \t](.*?)\/?>/sgi ) {
604
606
# warn "Image for extract_img found [$1]. Tag ID: $tag->{id}\n";
605
607
my $params = $1;
606
608
my $img = $self->parse_html_tag('img '.$params);
607
609
if ( exists $img->{src} && $img->{src} ) {
608
610
my %img = ( src => $img->{src} );
609
611
$img{url} = $img{src} =~ /^http[s]?:/ ? $img{src} : $base_url.($img{src} =~ m|^/| ? '' : '/').$img{src};
612
$img{type} = 'inner';
610
613
$img{w} = $img->{width} if $img->{width};
611
614
$img{h} = $img->{height} if $img->{height};
612
615
$img{alt} = $img->{alt} if $img->{alt};
…
…
614
617
$tag->{images} = [] unless ref $tag->{images} eq 'ARRAY';
615
618
push @{ $tag->{images} }, \%img;
616
619
}
617
# if ( $params =~ /src\x20*?=\x20*?["'](.*?)["']/ || $params =~ /src=([^\x20]+)/ ) {
618
# $img->{url} = $1;
619
# $img->{url} =~ s/[\r\t\n\ ]+$//;
620
# $img->{url} =~ s/^[\r\t\n\ ]+//;
621
# $img->{url} = $base_url.'/'.$img->{url} unless $img->{url} =~ /^http:/;
622
# $img->{url} =~ s/\/+/\//sgi;
623
# $img->{url} =~ s/http:\//http:\/\//sgi;
624
# $img->{w} = $1 if $params =~ /width[\D]+(\d+)/;
625
# $img->{h} = $1 if $params =~ /height[\D]+(\d+)/;
626
# $img->{alt} = $1 if $params =~ /alt\x20*?=\x20*?["'](.*?)["']/;
627
# $tag->{images} = [] unless ref $tag->{images} eq 'ARRAY';
628
# push @{ $tag->{images} }, $img;
629
# warn "Image for extract_img stored [$img->{url}]. Tag ID: $tag->{id}\n";
630
# }
631
620
}
621
while ( $tag->{text} =~ /<a[\ \t](.*?)\/?>/sgi ) {
622
my $params = $1;
623
my $anc = $self->parse_html_tag('a '.$params);
624
if ( exists $anc->{href} && $anc->{href} && $anc->{href} =~ /\.(jpe?g|gif|png|bmp|tiff?)$/ ) {
625
my %img = ( src => $anc->{href} );
626
$img{url} = $img{src} =~ /^http[s]?:/ ? $img{src} : $base_url.($img{src} =~ m|^/| ? '' : '/').$img{src};
627
$img{type} = 'external';
628
$img{title} = $anc->{title} if $anc->{title};
629
$tag->{images} = [] unless ref $tag->{images} eq 'ARRAY';
630
push @{ $tag->{images} }, \%img;
631
}
632
}
633
while ( $tag->{text} =~ /<a[\ \t](.*?)\/?><img[\ \t](.*?)\/?>/sgi ) {
634
my $aparams = $1;
635
my $iparams = $1;
636
my $anc = $self->parse_html_tag('a '.$aparams);
637
my $img = $self->parse_html_tag('img '.$iparams);
638
if ( exists $anc->{href} && $anc->{href} && $anc->{href} =~ /\.(jpe?g|gif|png|bmp|tiff?)$/ ) {
639
my @images = grep { $_->{src} eq $img->{src} } @{ $tag->{images} };
640
map {
641
$_->{ext_src} = $anc->{href};
642
$_->{ext_url} = $anc->{href} =~ /^http[s]?:/ ? $anc->{href} : $base_url.($anc->{href} =~ m|^/| ? '' : '/').$anc->{href};
643
} @images;
644
}
645
}
632
646
$tag->{text} =~ s/<img (.*?)>//sgi if $strip_html;
633
647
$tag->{count} = length ($tag->{text});
634
648
}
…
…
658
672
my $minimum = exists $opts{min} ? $opts{min} : undef;
659
673
my $debug = exists $opts{debug} ? $opts{debug} : undef;
660
674
my $rools = exists $opts{rools} ? $opts{rools} : undef;
675
my $strip_html = exists $opts{strip_html} ? $opts{strip_html} : undef;
661
676
return unless ref $structure eq 'HASH';
662
677
663
678
my @rools;
…
…
699
714
$text = Contenido::Parser::Util::strip_html($text);
700
715
$tag->{text_weight} = length($text);
701
716
if ( length($text) >= $minimum ) {
702
for ( $tag->{text} ) {
717
for ( $tag->{text} && $strip_html ) {
703
718
s/<a.*?>//sgi;
704
719
s/<\/a.*?>//sgi;
705
720
}
…
…
720
735
$tag->{text_weight} = length($text);
721
736
if ( length($text) >= $minimum ) {
722
737
for ( $tag->{text} ) {
723
s/<a.*?>//sgi;
724
s/<\/a.*?>//sgi;
738
if ( $strip_html ) {
739
s/<a.*?>//sgi;
740
s/<\/a.*?>//sgi;
741
}
725
742
s/\&\\x(\d+)//sgi;
726
743
}
727
744
push @ret, $tag;
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.