package RSSReader::Parser; use strict; use Data::Dumper; use base qw( RSSReader::Logger ); our $_parsers_registred; sub register { my $s = shift; my %a = @_; return unless ($a{id} && $a{package}); $_parsers_registred->{$a{id}} = $a{package}; $s->log_error("Got a parser register : $a{id} ($a{package})"); } sub get_parser { my $c = shift; my $id = shift; $c->log_debug("parser $id was requested (".$_parsers_registred->{$id}.")"); if (exists($_parsers_registred->{$id}) && defined($_parsers_registred->{$id}) ) { my $_not; eval { $_not = ($_parsers_registred->{$id})->new() }; if ($@) { __PACKAGE__->log_warn("Could not load parser $id: $@"); return undef; } return $_not; } return undef } sub get_parsers { my @to_ret = (); foreach ( keys %$_parsers_registred ) { push @to_ret, __PACKAGE__->get_parser($_); } return wantarray ? @to_ret : \@to_ret; } sub _convert_item { my $c = shift; my $item = shift; use Text::Iconv; my $converter = Text::Iconv->new('UTF-8', 'ISO8859-1'); foreach my $k (keys %$item ) { next if ref($item->{$k}); my $prev = $item->{$k}; $item->{$k} = $converter->convert($item->{$k}); if (! $item->{$k} ) { $item->{$k} = $prev; } } return $item; } sub _parse_date { my $c = shift; my $date = shift; my $alt_date = shift; if (! $date ) { $alt_date = time if not $alt_date; my $year = (localtime($alt_date))[5]+1900; my $month = sprintf("%02d", (localtime($alt_date))[4]+1); my $day = sprintf("%02d", (localtime($alt_date))[3]); my $hour = sprintf("%02d", (localtime($alt_date))[2]); my $min = sprintf("%02d", (localtime($alt_date))[1]); my $sec = sprintf("%02d", (localtime($alt_date))[0]); return "$year-$month-$day $hour:$min:$sec"; } if ($date =~ /^\s*(\d+-\d+-\d+)T(\d+:\d+:\d+)/ ) { return "$1 $2"; } #Mon, 12 Apr 2004 16:58:09 GMT if ($date =~ /\w+,\s+(\d+\s\w+?\s\d+?\s\d+?:\d+?:\d+?)\s\w+/){ $date = $1; } eval { require Date::Manip; }; if (!$@) { my $d; eval { $d = &ParseDate($date); }; if ($d) { return &UnixDate($d, "%Y-%m-%d %H:%M:%S"); } } return $date; } #Auto discover my $myname = __PACKAGE__; my $me = $myname; $me =~ s/\:\:/\//g; foreach my $d (@INC) { chomp $d; if (-d "$d/$me/") { local(*F_DIR); opendir(*F_DIR, "$d/$me/"); while ( my $b = readdir(*F_DIR)) { next unless $b =~ /^(.*)\.pm$/; __PACKAGE__->log_debug("Found parser $1"); my $package_name = __PACKAGE__."::$1"; eval "require $package_name"; } } } 1;