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 )