XML-RSS
view release on metacpan or search on metacpan
keep-out/rejects/append.pl view on Meta::CPAN
# This function was present in the lib/XML/RSS.pm sources for a long time
# and has been completely unused. Our guess was that it introduced to later
# serve in refactoring the module and was never used. It was not moved to
# this file, to possibly be used for future reference.
sub append {
my($self, $inside, $cdata) = @_;
my $ns = $self->namespace($self->current_element);
# If it's in the default RSS 1.0 namespace
if ($ns eq 'http://purl.org/rss/1.0/') {
#$self->{'items'}->[$self->{num_items}-1]->{$self->current_element} .= $cdata;
$inside->{$self->current_element} .= $cdata;
}
# If it's in another namespace
#$self->{'items'}->[$self->{num_items}-1]->{$ns}->{$self->current_element} .= $cdata;
$inside->{$ns}->{$self->current_element} .= $cdata;
# If it's in a module namespace, provide a friendlier prefix duplicate
$self->{modules}->{$ns} and $inside->{$self->{modules}->{$ns}}->{$self->current_element} .= $cdata;
return $inside;
}
lib/XML/RSS.pm view on Meta::CPAN
# RDF
&& ($ns ne "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
my $default_ref = sub { $is_array ? [] : {} };
return ($is_array, $default_ref);
}
sub _append_text_to_elem_struct {
my ($self, $struct, $cdata, $mapping_sub, $is_array_sub) = @_;
my $elem = $self->_current_element;
my ($ns, $verdict) = $self->_get_current_namespace;
# If it's in the default namespace
if ($verdict) {
$self->_append_struct(
$struct,
scalar($mapping_sub->($struct, $elem)),
scalar($is_array_sub->($struct, $elem)), $cdata
);
}
else {
my $prefix = $self->{modules}->{$ns};
my ($is_array, $default_ref) = $self->_get_ns_arrayity($ns);
$self->_append_struct(
($struct->{$ns} ||= $default_ref->()), $elem,
(defined($prefix) && $prefix eq "dc"), $cdata
);
# If it's in a module namespace, provide a friendlier prefix duplicate
if ($prefix) {
$self->_append_struct(($struct->{$prefix} ||= $default_ref->()),
$elem, ($prefix eq "dc"), $cdata);
}
}
return;
}
{
my @_ITEM_KEYS_ELEM_STACK = ("rss", "channel", "item", "link");
sub _should_skip_item_keys_in_custom_tags {
lib/XML/RSS.pm view on Meta::CPAN
}
}
}
}
return;
}
}
sub _append_struct {
my ($self, $struct, $key, $can_be_array, $cdata) = @_;
if (ref($struct) eq 'ARRAY') {
$struct->[-1]->{'val'} .= $cdata;
return;
}
elsif (defined $struct->{$key}) {
if (ref($struct->{$key}) eq 'HASH') {
$struct->{$key}->{content} .= $cdata;
return;
}
elsif ($can_be_array && ref($struct->{$key}) eq 'ARRAY') {
$struct->{$key}->[-1] .= $cdata;
return;
}
}
# Somewhat sympotamtic cure for item/link nested inside
# custom tags:
#
# https://github.com/shlomif/perl-XML-RSS/issues/7
#
# Thanks to @jkramer .
if ($self->_should_skip_item_keys_in_custom_tags($struct, $key)) {
return;
}
$struct->{$key} .= $cdata;
return;
}
sub _return_elem {
my ($struct, $elem) = @_;
return $elem;
}
sub _return_elem_is_array {
my ($struct, $elem) = @_;
# Always return false because no element should be an array.
return;
}
sub _append_text_to_elem {
my ($self, $ext_tag, $cdata) = @_;
return $self->_append_text_to_elem_struct($self->$ext_tag(),
$cdata, \&_return_elem, \&_return_elem_is_array,);
}
sub _within_topics {
my $self = shift;
my $parser = $self->_parser;
return $parser->within_element(
$parser->generate_ns_name("topics", 'http://purl.org/rss/1.0/modules/taxonomy/'));
}
lib/XML/RSS.pm view on Meta::CPAN
}
}
sub _return_item_elem_is_array {
my ($item, $elem) = @_;
return ($elem eq "category");
}
sub _append_text_to_item {
my ($self, $cdata) = @_;
if (@{$self->{'items'}} < $self->{num_items}) {
push @{$self->{items}}, {};
}
$self->_append_text_to_elem_struct($self->_last_item,
$cdata, \&_return_item_elem, \&_return_item_elem_is_array);
}
sub _append_to_array_elem {
my ($self, $category, $cdata) = @_;
if (!$self->_my_in_element($category)) {
return;
}
my $el = $self->_current_element;
if (ref($self->{$category}->{$el}) eq "ARRAY") {
$self->{$category}->{$el}->[-1] .= $cdata;
}
else {
$self->{$category}->{$el} .= $cdata;
}
return 1;
}
sub _handle_char {
my ($self, $cdata) = (@_);
# image element
if ($self->_my_in_element("image")) {
$self->_append_text_to_elem("image", $cdata);
}
# item element
elsif (defined($self->{_inside_item_elem})) {
return if $self->_within_topics;
$self->_append_text_to_item($cdata);
}
# textinput element
elsif ($self->_my_in_element("textinput") || $self->_my_in_element("textInput")) {
$self->_append_text_to_elem("textinput", $cdata);
}
# skipHours element
elsif ($self->_append_to_array_elem("skipHours", $cdata)) {
# Do nothing - already done in the predicate.
}
elsif ($self->_append_to_array_elem("skipDays", $cdata)) {
# Do nothing - already done in the predicate.
}
# channel element
elsif ($self->_my_in_element("channel")) {
if ($self->_within_topics() || $self->_my_in_element("items")) {
return;
}
if ($self->_current_element eq "category") {
$self->_append_to_array_elem("channel", $cdata);
}
else {
$self->_append_text_to_elem("channel", $cdata);
}
}
}
sub _handle_dec {
my ($self, $version, $encoding, $standalone) = (@_);
$self->{encoding} = $encoding;
#print "ENCODING: $encoding\n";
}
lib/XML/RSS.pm view on Meta::CPAN
sub _get_parser {
my $self = shift;
return XML::Parser->new(
Namespaces => 1,
NoExpand => 1,
ParseParamEnt => 0,
Handlers => {
Char => sub {
my ($parser, $cdata) = @_;
$self->_parser($parser);
$self->_handle_char($cdata);
# Detach the parser to avoid reference loops.
$self->_parser(undef);
},
XMLDecl => sub {
my $parser = shift;
$self->_parser($parser);
$self->_handle_dec(@_);
# Detach the parser to avoid reference loops.
( run in 0.541 second using v1.01-cache-2.11-cpan-454fe037f31 )