Kwiki-Atom
view release on metacpan or search on metacpan
lib/Kwiki/Atom.pm view on Meta::CPAN
my $link_edit = XML::Atom::Link->new;
$link_edit->type(ATOM_TYPE);
$link_edit->rel('service.edit');
$link_edit->href("$url?action=atom_edit;page_name=".$page->uri);
$link_edit->title('');
my $entry = XML::Atom::Entry->new;
$entry->title($page->title);
my $content = XML::Atom::Content->new;
my $elem = $content->elem;
my $text = ($content->LIBXML) ? 'XML::LibXML::Text'
: 'XML::XPath::Node::Text';
if ($flavor and $flavor eq 'html') {
$content->type('text/html');
my $data = $page->to_html;
my $copy = qq(<div xmlns="http://www.w3.org/1999/xhtml">$data</div>);
my $node;
local $@;
eval {
if ($content->LIBXML) {
require XML::LibXML;
my $parser = XML::LibXML->new;
my $tree = $parser->parse_string($copy);
$node = $tree->getDocumentElement;
} else {
require XML::XPath;
my $xp = XML::XPath->new(xml => $copy);
$node = (($xp->find('/')->get_nodelist)[0]->getChildNodes)[0]
if $xp;
}
};
if (!$@ && $node) {
$elem->appendChild($node);
$elem->setAttribute('mode', 'xml');
} else {
$elem->appendChild($text->new($data));
$elem->setAttribute('mode', 'escaped');
}
}
else {
$content->type('text/plain');
$elem->appendChild($text->new($page->content));
$elem->setAttribute('mode', 'escaped');
}
$entry->content($content);
$entry->summary('');
$entry->issued( DateTime->from_epoch( epoch => $page->io->ctime || time )->iso8601 . 'Z' );
$entry->modified( DateTime->from_epoch( epoch => $page->io->mtime || time )->iso8601 . 'Z' );
$entry->id("$url?".$page->uri);
$entry->author($author);
$entry->add_link($link_html);
$entry->add_link($link_edit);
return $entry;
}
sub update_page {
my $page = shift;
my $method = $self->server->request_method;
my $entry = eval { $self->server->atom_body };
if (!$entry) {
print "Status: 400\n\n";
$self->fill_header( -status => 400 );
return;
}
if (!$page) {
my $title = $entry->title;
if ($entry->content->type =~ /\bx?html\b/i) {
require HTML::Entities;
HTML::Entities::decode_entities($title);
}
$page = $self->pages->new_page($title);
if ($page->exists and $method eq 'POST') {
$self->server->response_code(409);
$self->server->{_error} = 'This page already exists';
$self->fill_header(
-status => 409,
-type => 'text/plain',
-warning => 'This page already exists',
);
return undef;
}
}
$self->hub->users->current->name(
eval { $self->server->get_auth_info->{Username} }
|| $self->hub->config->user_default_name
);
my $body = $entry->content->body;
if ($entry->content->type =~ /\bx?html\b/i) {
$body =~ s/<[^>]+>//g;
require HTML::Entities;
HTML::Entities::decode_entities($body);
}
$page->content($body);
$page->update->store;
return $page;
}
sub atom_list {
my $url = $self->server->uri;
my $link_feed = XML::Atom::Link->new;
$link_feed->type(ATOM_TYPE);
$link_feed->rel('service.feed');
$link_feed->title($self->config->site_title);
$link_feed->href("$url?action=atom_feed");
my $link_post = XML::Atom::Link->new;
$link_post->type(ATOM_TYPE);
$link_post->rel('service.post');
$link_post->title($self->config->site_title);
$link_post->href("$url?action=atom_post");
( run in 0.770 second using v1.01-cache-2.11-cpan-7fcb06a456a )