diff options
author | Evan Prodromou <evan@prodromou.name> | 2008-05-21 10:33:51 -0400 |
---|---|---|
committer | Evan Prodromou <evan@prodromou.name> | 2008-05-21 10:33:51 -0400 |
commit | cb45529d8d773690c86f0274cd3a560f066b0a05 (patch) | |
tree | 34b78c995973dc6b939e452ccb770f7406a8d6a9 | |
parent | b86a51ec8afff2181867823f8330a8bf3e267cf7 (diff) |
rss feed plus
Added an action for creating an RSS 1.0 (RDF) feed. To make this work,
added a couple of helper functions to util, and changed the HTML stuff
to use the helper functions.
Also, changed a bit of formatting in the profile. Yeah, not a clean
changeset.
darcs-hash:20080521143351-84dde-d191761c399d7f014b990585c21e916e887b3401.gz
-rw-r--r-- | actions/rss10.php | 130 | ||||
-rw-r--r-- | actions/showstream.php | 7 | ||||
-rw-r--r-- | lib/util.php | 29 |
3 files changed, 155 insertions, 11 deletions
diff --git a/actions/rss10.php b/actions/rss10.php new file mode 100644 index 000000000..f717f17cf --- /dev/null +++ b/actions/rss10.php @@ -0,0 +1,130 @@ +<?php +/* + * Laconica - a distributed open-source microblogging tool + * Copyright (C) 2008, Controlez-Vous, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +if (!defined('LACONICA')) { exit(1); } + +class Rss10Action extends Action { + + function handle($args) { + parent::handle($args); + + $nickname = $this->trimmed('nickname'); + + if (!$nickname) { + common_user_error(_t('No nickname provided.')); + } + + $user = User::staticGet('nickname', $nickname); + + if (!$user) { + common_user_error(_t('No such nickname.')); + } + + $limit = (int) $this->trimmed('limit'); + + $this->show_rss($user, $limit); + } + + function show_rss($user, $limit=0) { + + global $config; + + header('Content-Type: application/rdf+xml'); + + common_start_xml(); + common_element_start('rdf:RDF', array('xmlns:rdf' => + 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + 'xmlns' => 'http://purl.org/rss/1.0/')); + + $notices = $this->get_notices($user, $limit); + $this->show_channel($user, $notices); + + foreach ($notices as $n) { + $this->show_item($n); + } + + common_element_end('rdf:RDF'); + } + + function get_notices($user, $limit=0) { + $notices = array(); + + $notice = DB_DataObject::factory('notice'); + $notice->profile_id = $user->id; # user id === profile id + $notice->orderBy('created DESC'); + if ($limit != 0) { + $notice->limit(0, $limit); + } + $notice->find(); + + while ($notice->fetch()) { + $notices[] = clone($notice); + } + + return $notices; + } + + function show_channel($user, $notices) { + + # XXX: this is kind of indirect, eh? + $profile = $user->getProfile(); + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + + common_element_start('channel', array('rdf:about' => + common_local_url('rss10', + array('nickname' => + $user->nickname)))); + common_element('title', NULL, $user->nickname); + common_element('link', NULL, $profile->profileurl); + common_element('description', NULL, _t('Microblog by ') . $user->nickname); + + if ($avatar) { + common_element('image', array('rdf:resource' => $avatar->url)); + } + + common_element_start('items'); + common_element_start('rdf:Seq'); + foreach ($notices as $n) { + common_element('rdf:li', array('rdf:resource' => + common_local_url('shownotice', + array('notice' => $n->id)))); + } + + common_element_end('rdf:Seq'); + common_element_end('items'); + common_element_end('channel'); + + if ($avatar) { + common_element_start('image', array('rdf:about' => $avatar->url)); + common_element('title', NULL, $user->nickname); + common_element('link', NULL, $profile->profileurl); + common_element('url', NULL, $avatar->url); + common_element_end('image'); + } + } + + function show_item($notice) { + $nurl = common_local_url('shownotice', array('notice' => $n->id)); + common_element_start('item', array('rdf:about' => $nurl)); + common_element('title', NULL, $notice->created); + common_element('link', NULL, $nurl); + common_element('description', NULL, common_render_content($notice->content)); + common_element_end('item'); + } +}
\ No newline at end of file diff --git a/actions/showstream.php b/actions/showstream.php index b4844aabd..7e887a9d9 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -101,13 +101,14 @@ class ShowstreamAction extends StreamAction { 'alt' => $profile->nickname)); } if ($profile->fullname) { + common_element_start('div', 'fullname'); if ($profile->homepage) { - common_element('a', array('href' => $profile->homepage, - 'class' => 'fullname'), + common_element('a', array('href' => $profile->homepage), $profile->fullname); } else { - common_element('div', 'fullname', $profile->fullname); + common_text($profile->fullname); } + common_element_end('div'); } if ($profile->location) { common_element('div', 'location', $profile->location); diff --git a/lib/util.php b/lib/util.php index e4699bf1a..8b013c645 100644 --- a/lib/util.php +++ b/lib/util.php @@ -65,17 +65,31 @@ function common_element($tag, $attrs=NULL, $content=NULL) { common_element_end($tag); } +function common_start_xml($doc=NULL, $public=NULL, $system=NULL) { + global $xw; + $xw = new XMLWriter(); + $xw->openURI('php://output'); + $xw->setIndent(true); + $xw->startDocument('1.0', 'UTF-8'); + if ($doc) { + $xw->writeDTD($doc, $public, $system); + } +} + +function common_end_xml() { + global $xw; + $xw->endDocument(); + $xw->flush(); +} + function common_show_header($pagetitle) { global $config, $xw; header('Content-Type: application/xhtml+xml'); - $xw = new XMLWriter(); - $xw->openURI('php://output'); - $xw->setIndent(true); - $xw->startDocument('1.0', 'UTF-8'); - $xw->writeDTD('html', '-//W3C//DTD XHTML 1.0 Strict//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); + common_start_xml('html', + '-//W3C//DTD XHTML 1.0 Strict//EN', + 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); # FIXME: correct language for interface @@ -121,8 +135,7 @@ function common_show_footer() { common_element_end('div'); common_element_end('body'); common_element_end('html'); - $xw->endDocument(); - $xw->flush(); + common_end_xml(); } function common_text($txt) { |