Fixed RSS multiple category with XML::RSS::LibXML
[catagits/XML-Feed.git] / lib / XML / Feed / Format / RSS.pm
index 3d43c33..248debd 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: RSS.pm 1934 2006-04-22 05:13:55Z btrott $
+# $Id$
 
 package XML::Feed::Format::RSS;
 use strict;
@@ -9,6 +9,14 @@ use DateTime::Format::W3CDTF;
 
 our $PREFERRED_PARSER = "XML::RSS";
 
+
+sub identify {
+    my $class   = shift;
+    my $xml     = shift;
+    my $tag     = $class->_get_first_tag($xml);
+    return ($tag eq 'rss' || $tag eq 'RDF');
+}
+
 sub init_empty {
     my ($feed, %args) = @_;
     $args{'version'} ||= '2.0';
@@ -26,7 +34,7 @@ sub init_string {
     my($str) = @_;
     $feed->init_empty;
     if ($str) {
-        $feed->{rss}->parse($$str);
+        $feed->{rss}->parse($$str, { hashrefs_instead_of_strings => 1 } );
     }
     $feed;
 }
@@ -134,6 +142,7 @@ sub entries {
     my @entries;
     for my $item (@{ $rss->{items} }) {
         push @entries, XML::Feed::Entry::Format::RSS->wrap($item);
+               $entries[-1]->{_version} = $rss->{'version'};           
     }
     @entries;
 }
@@ -150,6 +159,8 @@ sub as_xml { $_[0]->{rss}->as_string }
 package XML::Feed::Entry::Format::RSS;
 use strict;
 
+sub format { 'RSS ' . $_[0]->{'_version'} }
+
 use XML::Feed::Content;
 
 use base qw( XML::Feed::Entry );
@@ -234,11 +245,16 @@ sub content {
 }
 
 sub category {
-    my $item = shift->{entry};
+    my $entry = shift;
+    my $item  = $entry->{entry};
     if (@_) {
-        $item->{category} = $item->{dc}{subject} = $_[0];
+        my @tmp = ($entry->category, @_);
+        $item->{category}    = [@tmp];
+        $item->{dc}{subject} = [@tmp];
     } else {
-        $item->{category} || $item->{dc}{subject};
+        my $r = $item->{category} || $item->{dc}{subject};
+        my @r = ref($r) eq 'ARRAY' ? @$r : defined $r? ($r) : ();
+        return wantarray? @r : $r[0];
     }
 }
 
@@ -298,18 +314,18 @@ sub modified {
 sub lat {
     my $item = shift->{entry};
     if (@_) {
-   $item->{geo}{lat} = $_[0];
+        $item->{geo}{lat} = $_[0];
     } else {
-   return $item->{geo}{lat};
+        return $item->{geo}{lat};
     }
 }
 
 sub long {
     my $item = shift->{entry};
     if (@_) {
-   $item->{geo}{long} = $_[0];
+        $item->{geo}{long} = $_[0];
     } else {
-   return $item->{geo}{long};
+         return $item->{geo}{long};
     }
 }