File Coverage

blib/lib/XML/Atom/Syndication/Content.pm
Criterion Covered Total %
statement 51 81 62.9
branch 17 34 50.0
condition 11 15 73.3
subroutine 7 7 100.0
pod 2 3 66.6
total 88 140 62.8


line stmt bran cond sub pod time code
1             package XML::Atom::Syndication::Content;
2 2     2   385 use strict;
  2         1  
  2         55  
3              
4 2     2   6 use base qw( XML::Atom::Syndication::Object );
  2         3  
  2         111  
5              
6 2     2   501 use Encode;
  2         8146  
  2         180  
7 2     2   809 use MIME::Base64 qw( encode_base64 decode_base64 );
  2         1102  
  2         1314  
8              
9             XML::Atom::Syndication::Content->mk_accessors('attribute', 'type', 'src');
10             XML::Atom::Syndication::Content->mk_accessors('attribute', 'mode')
11             ; # deprecated 0.3 accessors
12              
13             sub init {
14 11     11 0 11 my $content = shift;
15 11 50       41 my %param = @_ == 1 ? (Body => $_[0]) : @_; # escaped text is assumed.
16 11         41 $content->SUPER::init(%param);
17 11         25 my $e = $content->elem;
18 11 50       25 if ($param{Body}) {
19 0         0 $content->body($param{Body});
20             }
21 11 50       18 if ($param{Type}) {
22 0         0 $content->type($param{Type});
23             }
24 11         28 $content;
25             }
26              
27 11     11 1 28 sub element_name { 'content' }
28              
29             sub body {
30 9     9 1 3679 my $content = shift;
31 9         26 my $elem = $content->elem;
32 9         25 my $type = $elem->attributes->{'{}type'};
33 9         45 my $mode;
34 9 100 100     121 if (!defined $type || $type eq 'text' || $type eq 'html') {
    100 100        
    50 66        
      66        
35 4         6 $mode = 'escaped';
36             } elsif ( $type eq 'xhtml'
37             || $type =~
38             m{^(text/xml|application/xml|text/xml-external-parsed-entity)$}
39             || $type =~ m{[\+/]xml$}) {
40 3         6 $mode = 'xml';
41             } elsif ($type =~ m{text/.+}) {
42 0         0 $mode = 'escaped';
43             } else {
44 2         3 $mode = 'base64';
45             }
46 9 50       19 if (@_) { # set
47 0         0 my $data = shift;
48 0 0       0 if ($mode eq 'base64') { # is binary
    0          
49 0         0 Encode::_utf8_off($data);
50 0         0 require XML::Elemental::Characters;
51 0         0 my $b = XML::Elemental::Characters->new;
52 0         0 $b->data(encode_base64($data, ''));
53 0         0 $b->parent($elem);
54 0         0 $elem->contents([$b]);
55             } elsif ($mode eq 'xml') { # is xml
56 0         0 my $node = $data;
57 0 0       0 unless (ref $node) {
58 0         0 my $copy =
59             '
' . $data
60             . '';
61 0         0 eval {
62 0         0 require XML::Elemental;
63 0         0 my $parser = XML::Elemental->parser;
64 0         0 my $xml = $parser->parse_string($copy);
65 0         0 $node = $xml->contents->[0];
66             };
67 0 0       0 return $content->error(
68             "Error parsing content body string as XML: $@")
69             if $@;
70             }
71 0         0 $node->parent($elem);
72 0         0 $elem->contents([$node]);
73             } else { # is text
74 0         0 my $text = XML::Elemental::Characters->new;
75 0         0 $text->data($data);
76 0         0 $text->parent($elem);
77 0         0 $elem->contents([$text]);
78             }
79 0         0 $content->{__body} = undef;
80 0         0 1;
81             } else { # get
82 9 50       30 unless (defined $content->{__body}) {
83 9 100       20 if ($mode eq 'xml') {
    100          
84             my @children =
85 3         23 grep { ref($_) eq 'XML::Elemental::Element' }
86 3         5 @{$elem->contents};
  3         9  
87 3 50       5 if (@children) {
88 3         7 my ($local) =
89             $children[0]->name =~ /{.*}(.+)/; # process name
90 3 50 33     50 @children = @{$children[0]->contents}
  3         9  
91             if (@children == 1 && $local eq 'div');
92 3         15 $content->{__body} = '
';
93 3         20 my $w = XML::Atom::Syndication::Writer->new;
94 3         11 $w->set_prefix('', 'http://www.w3.org/1999/xhtml');
95 3         3 map { $content->{__body} .= $w->as_xml($_) } @children;
  5         16  
96 3         23 $content->{__body} .= '';
97             } else {
98 0         0 $content->{__body} = $elem->text_content;
99             }
100 3 50       9 if ($] >= 5.008) {
101 3         13 Encode::_utf8_on($content->{__body});
102 3         8 $content->{__body} =~ s/&#x(\w{4});/chr(hex($1))/eg;
  0         0  
103 3         7 Encode::_utf8_off($content->{__body});
104             }
105             } elsif ($mode eq 'base64') {
106 2         7 $content->{__body} = decode_base64($elem->text_content);
107             } else { # escaped
108 4         14 $content->{__body} = $elem->text_content;
109             }
110             }
111 9         141 $content->{__body};
112             }
113             }
114              
115             1;
116              
117             __END__