[Bast-commits] r6449 - in ironman/plagger/lib: . XML XML/Atom
szbalint at dev.catalyst.perl.org
szbalint at dev.catalyst.perl.org
Thu May 28 15:55:57 GMT 2009
Author: szbalint
Date: 2009-05-28 15:55:57 +0000 (Thu, 28 May 2009)
New Revision: 6449
Added:
ironman/plagger/lib/XML/
ironman/plagger/lib/XML/Atom/
ironman/plagger/lib/XML/Atom/Content.pm
Log:
Adding upstream copy of XML::Atom::Content
Added: ironman/plagger/lib/XML/Atom/Content.pm
===================================================================
--- ironman/plagger/lib/XML/Atom/Content.pm (rev 0)
+++ ironman/plagger/lib/XML/Atom/Content.pm 2009-05-28 15:55:57 UTC (rev 6449)
@@ -0,0 +1,153 @@
+# $Id$
+
+package XML::Atom::Content;
+use strict;
+use base qw( XML::Atom::Base );
+
+__PACKAGE__->mk_attr_accessors(qw( type mode ));
+__PACKAGE__->mk_xml_attr_accessors(qw( lang base ));
+
+use Encode;
+use XML::Atom;
+use MIME::Base64 qw( encode_base64 decode_base64 );
+
+sub element_name { 'content' }
+
+sub init {
+ my $content = shift;
+ my %param = @_ == 1 ? (Body => $_[0]) : @_;
+ $content->SUPER::init(%param);
+ if ($param{Body}) {
+ $content->body($param{Body});
+ }
+ if ($param{Type}) {
+ $content->type($param{Type});
+ }
+ return $content;
+}
+
+sub body {
+ my $content = shift;
+ my $elem = $content->elem;
+ if (@_) {
+ my $data = shift;
+ if (LIBXML) {
+ $elem->removeChildNodes;
+ } else {
+ $elem->removeChild($_) for $elem->getChildNodes;
+ }
+ if (!_is_printable($data)) {
+ Encode::_utf8_off($data);
+ if (LIBXML) {
+ $elem->appendChild(XML::LibXML::Text->new(encode_base64($data, '')));
+ } else {
+ $elem->appendChild(XML::XPath::Node::Text->new(encode_base64($data, '')));
+ }
+
+ if ($content->version == 0.3) {
+ $content->mode('base64');
+ }
+ } else {
+ my $copy = '<div xmlns="http://www.w3.org/1999/xhtml">' .
+ $data .
+ '</div>';
+ my $node;
+ eval {
+ if (LIBXML) {
+ my $parser = XML::LibXML->new;
+ my $tree = $parser->parse_string($copy);
+ $node = $tree->getDocumentElement;
+ } else {
+ my $xp = XML::XPath->new(xml => $copy);
+ $node = (($xp->find('/')->get_nodelist)[0]->getChildNodes)[0]
+ if $xp;
+ }
+ };
+ if (!$@ && $node) {
+ $elem->appendChild($node);
+ if ($content->version == 0.3) {
+ $content->mode('xml');
+ } else {
+ $content->type('xhtml');
+ }
+ } else {
+ if (LIBXML) {
+ $elem->appendChild(XML::LibXML::Text->new($data));
+ } else {
+ $elem->appendChild(XML::XPath::Node::Text->new($data));
+ }
+
+ if ($content->version == 0.3) {
+ $content->mode('escaped');
+ } else {
+ $content->type($data =~ /^\s*</ ? 'html' : 'text');
+ }
+ }
+ }
+ } else {
+ unless (exists $content->{__body}) {
+ my $mode;
+
+ if ($content->version == 0.3) {
+ $mode = $content->mode || 'xml';
+ } else {
+ $mode =
+ $content->type eq 'xhtml' ? 'xml'
+ : $content->type =~ m![/\+]xml$! ? 'xml'
+ : $content->type eq 'html' ? 'escaped'
+ : $content->type eq 'text' ? 'escaped'
+ : $content->type =~ m!^text/! ? 'escaped'
+ : 'base64';
+ }
+
+ if ($mode eq 'xml') {
+ my @children = grep ref($_) =~ /Element/,
+ LIBXML ? $elem->childNodes : $elem->getChildNodes;
+ if (@children) {
+ if (@children == 1 && $children[0]->getLocalName eq 'div') {
+ @children =
+ LIBXML ? $children[0]->childNodes :
+ $children[0]->getChildNodes
+ }
+ $content->{__body} = '';
+ for my $n (@children) {
+ $content->{__body} .= $n->toString(LIBXML ? 1 : 0);
+ }
+ } else {
+ $content->{__body} = LIBXML ? $elem->textContent : $elem->string_value;
+ }
+ if ($] >= 5.008) {
+ Encode::_utf8_off($content->{__body}) unless $XML::Atom::ForceUnicode;
+ }
+ } elsif ($mode eq 'base64') {
+ my $raw = decode_base64(LIBXML ? $elem->textContent : $elem->string_value);
+ if ($content->type && $content->type =~ m!^text/!) {
+ $content->{__body} = eval { Encode::decode("utf-8", $raw) } || $raw;
+ Encode::_utf8_off($content->{__body}) unless $XML::Atom::ForceUnicode;
+ } else {
+ $content->{__body} = $raw;
+ }
+ } elsif ($mode eq 'escaped') {
+ $content->{__body} = LIBXML ? $elem->textContent : $elem->string_value;
+ } else {
+ $content->{__body} = undef;
+ }
+ }
+ }
+ $content->{__body};
+}
+
+sub _is_printable {
+ my $data = shift;
+
+ local $@;
+ # try decoding this $data with UTF-8
+ my $decoded =
+ ( Encode::is_utf8($data)
+ ? $data
+ : eval { Encode::decode("utf-8", $data, Encode::FB_CROAK) } );
+
+ return ! $@ && $decoded =~ /^\p{IsPrint}*$/;
+}
+
+1;
More information about the Bast-commits
mailing list