Revision 146

Date:
2011/10/05 08:24:53
Author:
ahitrov
Revision Log:
Parser functions and HTML Parser image search and replace
Files:

Legend:

 
Added
 
Removed
 
Modified
  • utf8/core/lib/Contenido/Parser.pm

     
    54 54 $content = $res->decoded_content( charset => 'none' );
    55 55 # warn "Charset: ".$res->content_charset."\n";
    56 56 } else {
    57 warn $res->status_line." \n";
    57 warn $res->status_line." \n" if $DEBUG;
    58 58 $self->{success} = 0;
    59 59 $self->{reason} = $res->status_line;
    60 60 return $self;
     
    207 207 return \@tags;
    208 208 }
    209 209
    210 ### Имеет дело с "ободранным" тегом,
    211 # в котором отстутсвуют < и >
    212 ########################################
    213 sub parse_html_tag {
    214 my $self = shift;
    215 my $tagstr = shift;
    216
    217 my %struct;
    218 for ( $tagstr ) {
    219 s/\ *=\ */=/g;
    220 $_ = __encode_quotes($_);
    221 }
    222 my @tag = split /\ +/, $tagstr;
    223 $struct{tag} = lc(shift @tag);
    224
    225 foreach my $str ( @tag ) {
    226 if ( $str =~ /^(.*?)=(.*)$/ ) {
    227 my $attr = lc($1);
    228 my $val = $2;
    229 for ( $val ) {
    230 s/^"//;
    231 s/"$//;
    232 s/&nbsp;/\ /sg;
    233 }
    234 $struct{$attr} = $val;
    235 }
    236 }
    237 return \%struct;
    238 }
    239
    240
    210 241 sub __encode_quotes {
    211 242 my $str = shift;
    212 243 my @in = split //, $str;
     
    230 261 return $out;
    231 262 }
    232 263
    264
    265 sub image_replace {
    266 my ($self, $img_params, $replace_struct) = @_;
    267
    268 my $img = $self->parse_html_tag('img '.$img_params);
    269 if ( exists $replace_struct->{$img->{src}} ) {
    270 my $new_image = $replace_struct->{$img->{src}};
    271 if ( ref $new_image && exists $new_image->{filename} ) {
    272 $img->{src} = $new_image->{filename};
    273 } else {
    274 $img->{src} = $new_image;
    275 }
    276 return '<img '.join(' ', map { $_.'="'.$img->{$_}.'"' } grep { $_ ne 'tag' } keys %$img).'>';
    277 } else {
    278 return '';
    279 }
    280 }
    281
    233 282 sub scheme {
    234 283 my $uri = shift;
    235 284 my $scheme;
  • utf8/core/lib/Contenido/Parser/HTML.pm

     
    110 110 warn "Make tree...\n" if $debug;
    111 111 my ($tree, $shortcuts) = $self->__make_tree (\$content, $parse_rools, $debug);
    112 112
    113 $self->__extract_img ($shortcuts, $base_url, $debug);
    113 $self->__extract_img ($shortcuts, $base_url, $strip_html, $debug);
    114 114 $self->__extract_headers ($shortcuts, $header, $debug);
    115 115 warn "Getting big texts (min=$minimum)...\n" if $debug;
    116 116 my $chosen = $self->__dig_big_texts (
     
    141 141 chosen => $chosen,
    142 142 header => $header,
    143 143 ref $post_rools eq 'ARRAY' && @$post_rools ? (rools => $post_rools) : (),
    144 debug => $debug
    144 debug => $debug,
    145 strip_html => $strip_html,
    145 146 );
    146 147 if ( ref $parse_rools eq 'ARRAY' ) {
    147 148 my ($glue) = grep { $_->{command} eq 'glue' } @$parse_rools;
     
    595 596
    596 597
    597 598 sub __extract_img {
    598 my ($self, $structure, $base_url, $debug) = @_;
    599 my ($self, $structure, $base_url, $strip_html, $debug) = @_;
    599 600 return unless ref $structure eq 'HASH';
    600 601
    601 602 foreach my $tag ( grep { ref $_ && $_->{type} eq 'text' && $_->{text} } values %$structure ) {
    602 my $text = $tag->{text};
    603 while ( $text =~ /<img (.*?)>/sgi ) {
    603 while ( $tag->{text} =~ /<img (.*?)\/?>/sgi ) {
    604 604 # warn "Image for extract_img found [$1]. Tag ID: $tag->{id}\n";
    605 605 my $params = $1;
    606 my $img = {};
    607 if ( $params =~ /src\x20*?=\x20*?["'](.*?)["']/ || $params =~ /src=([^\x20]+)/ ) {
    608 $img->{url} = $1;
    609 $img->{url} =~ s/[\r\t\n\ ]+$//;
    610 $img->{url} =~ s/^[\r\t\n\ ]+//;
    611 $img->{url} = $base_url.'/'.$img->{url} unless $img->{url} =~ /^http:/;
    612 $img->{url} =~ s/\/+/\//sgi;
    613 $img->{url} =~ s/http:\//http:\/\//sgi;
    614 $img->{w} = $1 if $params =~ /width[\D]+(\d+)/;
    615 $img->{h} = $1 if $params =~ /height[\D]+(\d+)/;
    616 $img->{alt} = $1 if $params =~ /alt\x20*?=\x20*?["'](.*?)["']/;
    606 my $img = $self->parse_html_tag('img '.$params);
    607 if ( exists $img->{src} && $img->{src} ) {
    608 my %img = ( src => $img->{src} );
    609 $img{url} = $img{src} =~ /^http[s]?:/ ? $img{src} : $base_url.($img{src} =~ m|^/| ? '' : '/').$img{src};
    610 $img{w} = $img->{width} if $img->{width};
    611 $img{h} = $img->{height} if $img->{height};
    612 $img{alt} = $img->{alt} if $img->{alt};
    613 $img{title} = $img->{title} if $img->{title};
    617 614 $tag->{images} = [] unless ref $tag->{images} eq 'ARRAY';
    618 push @{ $tag->{images} }, $img;
    615 push @{ $tag->{images} }, \%img;
    616 }
    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;
    619 629 # warn "Image for extract_img stored [$img->{url}]. Tag ID: $tag->{id}\n";
    620 }
    630 # }
    621 631 }
    622 $text =~ s/<img (.*?)>//sgi;
    623 $tag->{text} = $text;
    624 $tag->{count} = length ($text);
    632 $tag->{text} =~ s/<img (.*?)>//sgi if $strip_html;
    633 $tag->{count} = length ($tag->{text});
    625 634 }
    626 635 }
    627 636
     
    716 725 s/\&\\x(\d+)//sgi;
    717 726 }
    718 727 push @ret, $tag;
    728 # $self->log_elem($tag);
    719 729 }
    720 730 }
    721 731 }
     
    815 825
    816 826 my $chosen = $opts{chosen};
    817 827 my $rooles = $opts{rools};
    818 my $header = $opts{header};
    828 my $header = $opts{header} || '';
    829 my $strip_html = $opts{strip_html};
    819 830
    820 831 foreach my $unit ( @$chosen ) {
    821 832 my %tags;
     
    861 872 s/^(\d+):(\d+)//si;
    862 873 s/^[\ \t\r\n]+//si;
    863 874 }
    864 if ( lc(substr ($unit->{text}, 0, length($header) )) eq lc($header) ) {
    875 if ( $header && lc(substr ($unit->{text}, 0, length($header) )) eq lc($header) ) {
    865 876 substr $unit->{text}, 0, length($header), '';
    866 877 $unit->{text} =~ s/^[\.\ \t\r\n]+//sgi;
    867 878 }
     
    1195 1206 }
    1196 1207
    1197 1208
    1209 sub log_elem {
    1210 my $self = shift;
    1211 my $elem = shift;
    1212 return unless ref $elem eq 'HASH';
    1213
    1214 my %elem;
    1215 map { $elem{$_} = $elem->{$_} } grep { $_ ne 'parent' } keys %$elem;
    1216 warn Dumper \%elem;
    1217 }
    1218
    1219
    1198 1220 1;
  • utf8/core/ports/all/libwww/GNUmakefile

     
    5 5
    6 6 #include ../../etc/perl.mk
    7 7
    8 PORTVERSION = 5.805
    8 PORTVERSION = 5.836
    9 9 DISTFILE = ${PORTNAME}-perl-${PORTVERSION}.tar.gz
    10 10 PERL_MAKEMAKER = yes
    11 11 MASTER_CPAN_SUBDIR = LWP

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

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

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

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

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