]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Unify feeds definition in actions
authorEvan Prodromou <evan@controlyourself.ca>
Wed, 11 Feb 2009 16:37:50 +0000 (11:37 -0500)
committerEvan Prodromou <evan@controlyourself.ca>
Wed, 11 Feb 2009 16:37:50 +0000 (11:37 -0500)
I got a little sick of trying to keep the export data and <head> links
synched in actions, so I made a common method, getFeeds(), which gets
the feeds for both. It returns an array of Feed objects, which know
about what their mime type is, title, location, all that jazz.

I changed the FeedList class so it handles the new Feed objects
instead of the old array of data.

I changed all the actions that show feeds (I think...) so that they
now use getFeeds() for all their feed needs.

actions/all.php
actions/noticesearch.php
actions/public.php
actions/replies.php
actions/showfavorites.php
actions/showgroup.php
actions/showstream.php
actions/tag.php
lib/action.php
lib/feed.php [new file with mode: 0644]
lib/feedlist.php

index d75d1b94612b8f6adc42cd5f22c61490fed98a6f..08dcccbddb711c12ff7578e165d99c72b1068545 100644 (file)
@@ -42,9 +42,9 @@ class AllAction extends Action
         if (!$this->page) {
             $this->page = 1;
         }
-        
+
         common_set_returnto($this->selfUrl());
-        
+
         return true;
     }
 
@@ -69,13 +69,22 @@ class AllAction extends Action
         }
     }
 
-    function showFeeds()
+    function getFeeds()
     {
-        $this->element('link', array('rel' => 'alternate',
-                                     'href' => common_local_url('allrss', array('nickname' =>
-                                                                                $this->user->nickname)),
-                                     'type' => 'application/rss+xml',
-                                     'title' => sprintf(_('Feed for friends of %s'), $this->user->nickname)));
+        return array(new Feed(Feed::RSS1,
+                              common_local_url('allrss', array('nickname' =>
+                                                               $this->user->nickname)),
+                              sprintf(_('Feed for friends of %s (RSS 1.0)'), $this->user->nickname)),
+                     new Feed(Feed::RSS2,
+                              common_local_url('api', array('apiaction' => 'statuses',
+                                                            'method' => 'friends',
+                                                            'argument' => $this->user->nickname.'.rss')),
+                              sprintf(_('Feed for friends of %s (RSS 2.0)'), $this->user->nickname)),
+                     new Feed(Feed::ATOM,
+                              common_local_url('api', array('apiaction' => 'statuses',
+                                                            'method' => 'friends',
+                                                            'argument' => $this->user->nickname.'.atom')),
+                              sprintf(_('Feed for friends of %s (Atom)'), $this->user->nickname)));
     }
 
     function showLocalNav()
@@ -84,15 +93,6 @@ class AllAction extends Action
         $nav->show();
     }
 
-    function showExportData()
-    {
-        $fl = new FeedList($this);
-        $fl->show(array(0=>array('href'=>common_local_url('allrss', array('nickname' => $this->user->nickname)),
-                                 'type' => 'rss',
-                                 'version' => 'RSS 1.0',
-                                 'item' => 'allrss')));
-    }
-
     function showContent()
     {
         $notice = $this->user->noticesWithFriends(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
@@ -110,7 +110,7 @@ class AllAction extends Action
         $user =& common_current_user();
         if ($user && ($user->id == $this->user->id)) {
             $this->element('h1', NULL, _("You and friends"));
-        } else { 
+        } else {
             $this->element('h1', NULL, sprintf(_('%s and friends'), $this->user->nickname));
         }
     }
index 2d94a7906fea3095832a5cef20570583084a61da..dc58d7528ae315c61c4f58a26bc841d9dc3a4772 100644 (file)
@@ -57,11 +57,11 @@ class NoticesearchAction extends SearchAction
 
         return true;
     }
-    
+
     /**
      * Get instructions
-     * 
-     * @return string instruction text 
+     *
+     * @return string instruction text
      */
     function getInstructions()
     {
@@ -70,7 +70,7 @@ class NoticesearchAction extends SearchAction
 
     /**
      * Get title
-     * 
+     *
      * @return string title
      */
     function title()
@@ -78,62 +78,20 @@ class NoticesearchAction extends SearchAction
         return _('Text search');
     }
 
-
-    function showExportData()
+    function getFeeds()
     {
         $q = $this->trimmed('q');
-        if (!$q) {
-            return;
-        }
-        $fl = new FeedList($this);
-        $fl->show(array(0 => array('href' => common_local_url('noticesearchrss', array('q' => $q)),
-                                   'type' => 'rss',
-                                   'version' => 'RSS 1.0',
-                                   'item' => 'noticesearchrss')));
-    }
 
-
-
-    function showFeeds()
-    {  
-        $q = $this->trimmed('q');
         if (!$q) {
-            return;
+            return null;
         }
 
-       $this->element('link', array('rel' => 'alternate',
-                                         'href' => common_local_url('noticesearchrss',
-                                                                    array('q' => $q)),
-                                         'type' => 'application/rss+xml',
-                                         'title' => _('Search Stream Feed')));
+        return array(new Feed(Feed::RSS1, common_local_url('noticesearchrss',
+                                                           array('q' => $q)),
+                              sprintf(_('Search results for "%s" on %s'),
+                                      $q, common_config('site', 'name'))));
     }
 
-
-    /**
-     * Show header
-     *
-     * @param array $arr array containing the query
-     *
-     * @return void
-     */
-
-    function extraHead2()
-    {
-        $q = $this->trimmed('q');
-        if ($q) {
-            $this->element('link', array('rel' => 'alternate',
-                                         'href' => common_local_url('noticesearchrss',
-                                                                    array('q' => $q)),
-                                         'type' => 'application/rss+xml',
-                                         'title' => _('Search Stream Feed')));
-        }
-    }
-
-
-
-
-
-
     /**
      * Show results
      *
index 1137bd8768dbd6d629d69c5455dec1e0a0a81d02..a20ae40321ca17b36ae28313f4a87eac90d69f92 100644 (file)
@@ -119,24 +119,20 @@ class PublicAction extends Action
      * @return void
      */
 
-    function showFeeds()
+    function getFeeds()
     {
-        $this->element('link', array('rel' => 'alternate',
-                                     'href' => common_local_url('publicrss'),
-                                     'type' => 'application/rdf+xml',
-                                     'title' => _('Public Stream Feed (RSS 1.0)')));
-        $this->element('link', array('rel' => 'alternate',
-                                     'href' => common_local_url('api',
-                                                                array('apiaction' => 'statuses',
-                                                                      'method' => 'public_timeline.rss')),
-                                     'type' => 'application/rss+xml',
-                                     'title' => _('Public Stream Feed (RSS 2.0)')));
-        $this->element('link', array('rel' => 'alternate',
-                                     'href' => common_local_url('api',
-                                                                array('apiaction' => 'statuses',
-                                                                      'method' => 'public_timeline.atom')),
-                                     'type' => 'application/atom+xml',
-                                     'title' => _('Public Stream Feed (Atom)')));
+        return array(new Feed(Feed::RSS1, common_local_url('publicrss'),
+                              _('Public Stream Feed (RSS 1.0)')),
+                     new Feed(Feed::RSS2,
+                              common_local_url('api',
+                                               array('apiaction' => 'statuses',
+                                                     'method' => 'public_timeline.rss')),
+                              _('Public Stream Feed (RSS 2.0)')),
+                     new Feed(Feed::ATOM,
+                              common_local_url('api',
+                                               array('apiaction' => 'statuses',
+                                                     'method' => 'public_timeline.atom')),
+                              _('Public Stream Feed (Atom)')));
     }
 
     /**
@@ -197,29 +193,6 @@ class PublicAction extends Action
                           $this->page, 'public');
     }
 
-    /**
-     * Makes a list of exported feeds for this page
-     *
-     * @return void
-     *
-     * @todo I18N
-     */
-
-    function showExportData()
-    {
-        $fl = new FeedList($this);
-        $fl->show(array(0 => array('href' => common_local_url('publicrss'),
-                                   'type' => 'rss',
-                                   'version' => 'RSS 1.0',
-                                   'item' => 'publicrss'),
-                        1 => array('href' => common_local_url('api',
-                                                              array('apiaction' => 'statuses',
-                                                                    'method' => 'public_timeline.atom')),
-                                   'type' => 'atom',
-                                   'version' => 'Atom 1.0',
-                                   'item' => 'publicatom')));
-    }
-
     function showSections()
     {
         // $top = new TopPostersSection($this);
index 7eff74a6691e34505ceda2aa6dccbf9bc979bf33..4ab9b14ed26be98187ee0949c0a2a4b3fac352c6 100644 (file)
@@ -84,7 +84,7 @@ class RepliesAction extends Action
         $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
 
         common_set_returnto($this->selfUrl());
-        
+
         return true;
     }
 
@@ -129,16 +129,13 @@ class RepliesAction extends Action
      * @return void
      */
 
-    function showFeeds()
+    function getFeeds()
     {
         $rssurl   = common_local_url('repliesrss',
                                      array('nickname' => $this->user->nickname));
         $rsstitle = sprintf(_('Feed for replies to %s'), $this->user->nickname);
 
-        $this->element('link', array('rel' => 'alternate',
-                                     'href' => $rssurl,
-                                     'type' => 'application/rss+xml',
-                                     'title' => $rsstitle));
+        return array(new Feed(Feed::RSS1, $rssurl, $rsstitle));
     }
 
     /**
@@ -153,25 +150,6 @@ class RepliesAction extends Action
         $nav->show();
     }
 
-    /**
-     * Show the replies feed links
-     *
-     * @return void
-     */
-
-    function showExportData()
-    {
-        $fl = new FeedList($this);
-
-        $rssurl = common_local_url('repliesrss',
-                                   array('nickname' => $this->user->nickname));
-
-        $fl->show(array(0=>array('href'=> $rssurl,
-                                 'type' => 'rss',
-                                 'version' => 'RSS 1.0',
-                                 'item' => 'repliesrss')));
-    }
-
     /**
      * Show the content
      *
index 31479e1a7891d0933e63cb8bc5735ccc99d59345..d1c9283f0f47bff1a6811039a891760898de3f87 100644 (file)
@@ -113,7 +113,7 @@ class ShowfavoritesAction extends Action
         }
 
         common_set_returnto($this->selfUrl());
-        
+
         return true;
     }
 
@@ -136,10 +136,10 @@ class ShowfavoritesAction extends Action
     /**
      * Feeds for the <head> section
      *
-     * @return void
+     * @return array Feed objects to show
      */
 
-    function showFeeds()
+    function getFeeds()
     {
         $feedurl   = common_local_url('favoritesrss',
                                       array('nickname' =>
@@ -147,10 +147,7 @@ class ShowfavoritesAction extends Action
         $feedtitle = sprintf(_('Feed for favorites of %s'),
                              $this->user->nickname);
 
-        $this->element('link', array('rel' => 'alternate',
-                                     'href' => $feedurl,
-                                     'type' => 'application/rss+xml',
-                                     'title' => $feedtitle));
+        return array(new Feed(Feed::RSS1, $feedurl, $feedtitle));
     }
 
     /**
@@ -165,28 +162,6 @@ class ShowfavoritesAction extends Action
         $nav->show();
     }
 
-    /**
-     * Show the replies feed links
-     *
-     * @return void
-     */
-
-    function showExportData()
-    {
-        $feedurl = common_local_url('favoritesrss',
-                                    array('nickname' =>
-                                          $this->user->nickname));
-
-        $fl = new FeedList($this);
-
-        // XXX: I18N
-
-        $fl->show(array(0=>array('href'=> $feedurl,
-                                 'type' => 'rss',
-                                 'version' => 'RSS 1.0',
-                                 'item' => 'Favorites')));
-    }
-
     /**
      * Show the content
      *
index 7bc68fbc64a151ac377c414a4ace0e0d52997d26..340e1833300a2615e38bba46ace3ad8151572ba9 100644 (file)
@@ -292,37 +292,18 @@ class ShowgroupAction extends Action
     }
 
     /**
-     * Show a list of links to feeds this page produces
+     * Get a list of the feeds for this page
      *
      * @return void
      */
 
-    function showExportData()
-    {
-        $fl = new FeedList($this);
-        $fl->show(array(0=>array('href'=>common_local_url('grouprss',
-                                                          array('nickname' => $this->group->nickname)),
-                                 'type' => 'rss',
-                                 'version' => 'RSS 1.0',
-                                 'item' => 'notices')));
-    }
-
-    /**
-     * Show a list of links to feeds this page produces
-     *
-     * @return void
-     */
-
-    function showFeeds()
+    function getFeeds()
     {
         $url =
           common_local_url('grouprss',
                            array('nickname' => $this->group->nickname));
 
-        $this->element('link', array('rel' => 'alternate',
-                                     'href' => $url,
-                                     'type' => 'application/rss+xml',
-                                     'title' => sprintf(_('Notice feed for %s group'),
+        return array(new Feed(Feed::RSS1, $url, sprintf(_('Notice feed for %s group'),
                                                         $this->group->nickname)));
     }
 
index 962f4b4524f499be25b7e1e403709e7b6ba543b9..0ee5d769e1f84336258f9f02ab7fc6014818c2c0 100644 (file)
@@ -155,54 +155,35 @@ class ShowstreamAction extends Action
         return;
     }
 
-    function showExportData()
+    function getFeeds()
     {
-        $fl = new FeedList($this);
-        $fl->show(array(0=>array('href'=>common_local_url('userrss',
-                                                          array('nickname' => $this->user->nickname)),
-                                 'type' => 'rss',
-                                 'version' => 'RSS 1.0',
-                                 'item' => 'notices'),
-                        1=>array('href'=>common_local_url('usertimeline',
-                                                          array('nickname' => $this->user->nickname)),
-                                 'type' => 'atom',
-                                 'version' => 'Atom 1.0',
-                                 'item' => 'usertimeline'),
-                        2=>array('href'=>common_local_url('foaf',
-                                                          array('nickname' => $this->user->nickname)),
-                                 'type' => 'rdf',
-                                 'version' => 'FOAF',
-                                 'item' => 'foaf')));
-    }
-
-    function showFeeds()
-    {
-        $this->element('link', array('rel' => 'alternate',
-                                     'type' => 'application/rss+xml',
-                                     'href' => common_local_url('userrss',
-                                                                array('nickname' => $this->user->nickname)),
-                                     'title' => sprintf(_('Notice feed for %s (RSS)'),
-                                                        $this->user->nickname)));
-
-        $this->element('link',
-                       array('rel' => 'alternate',
-                             'href' => common_local_url('api',
-                                                        array('apiaction' => 'statuses',
-                                                              'method' => 'user_timeline.atom',
-                                                              'argument' => $this->user->nickname)),
-                             'type' => 'application/atom+xml',
-                             'title' => sprintf(_('Notice feed for %s (Atom)'),
-                                                $this->user->nickname)));
+        return array(new Feed(Feed::RSS1,
+                              common_local_url('userrss',
+                                               array('nickname' => $this->user->nickname)),
+                              sprintf(_('Notice feed for %s (RSS 1.0)'),
+                                      $this->user->nickname)),
+                     new Feed(Feed::RSS2,
+                              common_local_url('api',
+                                               array('apiaction' => 'statuses',
+                                                     'method' => 'user_timeline',
+                                                     'argument' => $this->user->nickname.'.rss')),
+                              sprintf(_('Notice feed for %s (RSS 2.0)'),
+                                      $this->user->nickname)),
+                     new Feed(Feed::ATOM,
+                              common_local_url('api',
+                                               array('apiaction' => 'statuses',
+                                                     'method' => 'user_timeline',
+                                                     'argument' => $this->user->nickname.'.atom')),
+                              sprintf(_('Notice feed for %s (Atom)'),
+                                      $this->user->nickname)),
+                     new Feed(Feed::FOAF,
+                              common_local_url('foaf', array('nickname' =>
+                                                             $this->user->nickname)),
+                              sprintf(_('FOAF for %s'), $this->user->nickname)));
     }
 
     function extraHead()
     {
-        // FOAF
-        $this->element('link', array('rel' => 'meta',
-                                     'href' => common_local_url('foaf', array('nickname' =>
-                                                                              $this->user->nickname)),
-                                     'type' => 'application/rdf+xml',
-                                     'title' => 'FOAF'));
         // for remote subscriptions etc.
         $this->element('meta', array('http-equiv' => 'X-XRDS-Location',
                                      'content' => common_local_url('xrds', array('nickname' =>
index 4401f892a94603df41e2b06748bba5cca35bcb05..231f2c299280580842099f251541fbc9d2619204 100644 (file)
@@ -37,9 +37,9 @@ class TagAction extends Action
         }
 
         $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
-        
+
         common_set_returnto($this->selfUrl());
-        
+
         return true;
     }
 
@@ -61,12 +61,11 @@ class TagAction extends Action
         $this->showPage();
     }
 
-    function showFeeds()
+    function getFeeds()
     {
-        $this->element('link', array('rel' => 'alternate',
-                                     'href' => common_local_url('tagrss', array('tag' => $this->tag)),
-                                     'type' => 'application/rss+xml',
-                                     'title' => sprintf(_('Feed for tag %s'), $this->tag)));
+        return array(new Feed(Feed::RSS1,
+                              common_local_url('tagrss', array('tag' => $this->tag)),
+                              sprintf(_('Feed for tag %s'), $this->tag)));
     }
 
     function showPageNotice()
@@ -74,15 +73,6 @@ class TagAction extends Action
         return sprintf(_('Messages tagged "%s", most recent first'), $this->tag);
     }
 
-    function showExportData()
-    {
-        $fl = new FeedList($this);
-        $fl->show(array(0=>array('href'=>common_local_url('tagrss', array('tag' => $this->tag)),
-                                 'type' => 'rss',
-                                 'version' => 'RSS 1.0',
-                                 'item' => 'tagrss')));
-    }
-
     function showContent()
     {
         $notice = Notice_tag::getStream($this->tag, (($this->page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
index ce92addf5c1305424525604726b358b6ebb11b85..bd38bf79ccbf8dd6a55a08a9a753f49d0ec1dd1f 100644 (file)
@@ -225,9 +225,19 @@ class Action extends HTMLOutputter // lawsuit
      *
      * @return nothing
      */
+
     function showFeeds()
     {
-        // does nothing by default
+        $feeds = $this->getFeeds();
+
+        if ($feeds) {
+            foreach ($feeds as $feed) {
+                $this->element('link', array('rel' => $feed->rel(),
+                                             'href' => $feed->url,
+                                             'type' => $feed->mimeType(),
+                                             'title' => $feed->title));
+            }
+        }
     }
 
     /**
@@ -540,15 +550,16 @@ class Action extends HTMLOutputter // lawsuit
     /**
      * Show export data feeds.
      *
-     * MAY overload if there are feeds
-     *
-     * @return nothing
+     * @return void
      */
+
     function showExportData()
     {
-        // is there structure to this?
-        // list of (visible!) feed links
-        // can we reuse list of feeds from showFeeds() ?
+        $feeds = $this->getFeeds();
+        if ($feeds) {
+            $fl = new FeedList($this);
+            $fl->show($feeds);
+        }
     }
 
     /**
@@ -924,4 +935,17 @@ class Action extends HTMLOutputter // lawsuit
             $this->elementEnd('div');
         }
     }
+
+    /**
+     * An array of feeds for this action.
+     *
+     * Returns an array of potential feeds for this action.
+     *
+     * @return array Feed object to show in head and links
+     */
+
+    function getFeeds()
+    {
+        return null;
+    }
 }
diff --git a/lib/feed.php b/lib/feed.php
new file mode 100644 (file)
index 0000000..4669268
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * Data structure for info about syndication feeds (RSS 1.0, RSS 2.0, Atom)
+ *
+ * PHP version 5
+ *
+ * LICENCE: 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/>.
+ *
+ * @category  Feed
+ * @package   Laconica
+ * @author    Evan Prodromou <evan@controlyourself.ca>
+ * @copyright 2009 Control Yourself, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://laconi.ca/
+ */
+
+if (!defined('LACONICA')) {
+    exit(1);
+}
+
+/**
+ * Data structure for feeds
+ *
+ * This structure is a helpful container for shipping around information about syndication feeds.
+ *
+ * @category Feed
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @author   Sarven Capadisli <csarven@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://laconi.ca/
+ */
+
+class Feed
+{
+    const RSS1 = 1;
+    const RSS2 = 2;
+    const ATOM = 3;
+    const FOAF = 4;
+
+    var $type = null;
+    var $url = null;
+    var $title = null;
+
+    function __construct($type, $url, $title)
+    {
+        $this->type  = $type;
+        $this->url   = $url;
+        $this->title = $title;
+    }
+
+    function mimeType()
+    {
+        switch ($this->type) {
+         case Feed::RSS1:
+            return 'application/rdf+xml';
+         case Feed::RSS2:
+            return 'application/rss+xml';
+         case Feed::ATOM:
+            return 'application/atom+xml';
+         case Feed::FOAF:
+            return 'application/rdf+xml';
+         default:
+            return null;
+        }
+    }
+
+    function typeName()
+    {
+        switch ($this->type) {
+         case Feed::RSS1:
+            return _('RSS 1.0');
+         case Feed::RSS2:
+            return _('RSS 2.0');
+         case Feed::ATOM:
+            return _('Atom');
+         case Feed::FOAF:
+            return _('FOAF');
+         default:
+            return null;
+        }
+    }
+
+    function rel()
+    {
+        switch ($this->type) {
+         case Feed::RSS1:
+         case Feed::RSS2:
+         case Feed::ATOM:
+            return 'alternate';
+         case Feed::FOAF:
+            return 'meta';
+         default:
+            return null;
+        }
+    }
+}
index 8bfcb9c5ab37bd53f174efbc0cdcee13620d282b..927e43c330fda3c0ee1754f12d30038a7271b5d2 100644 (file)
@@ -50,7 +50,7 @@ if (!defined('LACONICA')) {
 class FeedList extends Widget
 {
     var $action = null;
-    
+
     function __construct($action=null)
     {
        parent::__construct($action);
@@ -64,8 +64,8 @@ class FeedList extends Widget
         $this->out->element('h2', null, _('Export data'));
         $this->out->elementStart('ul', array('class' => 'xoxo'));
 
-        foreach ($feeds as $key => $value) {
-            $this->feedItem($feeds[$key]);
+        foreach ($feeds as $feed) {
+            $this->feedItem($feed);
         }
 
         $this->out->elementEnd('ul');
@@ -74,92 +74,27 @@ class FeedList extends Widget
 
     function feedItem($feed)
     {
-        $nickname = $this->action->trimmed('nickname');
-
-        switch($feed['item']) {
-         case 'notices': default:
-            $feed_classname = $feed['type'];
-            $feed_mimetype = "application/".$feed['type']."+xml";
-            $feed_title = "$nickname's ".$feed['version']." notice feed";
-            $feed['textContent'] = "RSS";
-            break;
-
-         case 'allrss':
-            $feed_classname = $feed['type'];
-            $feed_mimetype = "application/".$feed['type']."+xml";
-            $feed_title = $feed['version']." feed for $nickname and friends";
-            $feed['textContent'] = "RSS";
-            break;
-
-         case 'repliesrss':
-            $feed_classname = $feed['type'];
-            $feed_mimetype = "application/".$feed['type']."+xml";
-            $feed_title = $feed['version']." feed for replies to $nickname";
-            $feed['textContent'] = "RSS";
-            break;
-
-         case 'publicrss':
-            $feed_classname = $feed['type'];
-            $feed_mimetype = "application/".$feed['type']."+xml";
-            $feed_title = "Public timeline ".$feed['version']." feed";
-            $feed['textContent'] = "RSS";
-            break;
-
-         case 'publicatom':
-            $feed_classname = "atom";
-            $feed_mimetype = "application/".$feed['type']."+xml";
-            $feed_title = "Public timeline ".$feed['version']." feed";
-            $feed['textContent'] = "Atom";
-            break;
-
-         case 'noticesearchrss':
-            $feed_classname = $feed['type'];
-            $feed_mimetype = "application/".$feed['type']."+xml";
-            $feed_title = $feed['version']." feed for this notice search";
-            $feed['textContent'] = "RSS";
-            break;
-
-         case 'tagrss':
-            $feed_classname = $feed['type'];
-            $feed_mimetype = "application/".$feed['type']."+xml";
-            $feed_title = $feed['version']." feed for this tag";
-            $feed['textContent'] = "RSS";
-            break;
+        $classname = null;
 
-         case 'favoritedrss':
-            $feed_classname = $feed['type'];
-            $feed_mimetype = "application/".$feed['type']."+xml";
-            $feed_title = "Favorited ".$feed['version']." feed";
-            $feed['textContent'] = "RSS";
+        switch ($feed->type) {
+         case Feed::RSS1:
+         case Feed::RSS2:
+            $classname = 'rss';
             break;
-
-         case 'foaf':
-            $feed_classname = "foaf";
-            $feed_mimetype = "application/".$feed['type']."+xml";
-            $feed_title = "$nickname's FOAF file";
-            $feed['textContent'] = "FOAF";
+         case Feed::ATOM:
+            $classname = 'atom';
             break;
-
-         case 'favoritesrss':
-            $feed_classname = "favorites";
-            $feed_mimetype = "application/".$feed['type']."+xml";
-            $feed_title = "Feed for favorites of $nickname";
-            $feed['textContent'] = "RSS";
-            break;
-
-         case 'usertimeline':
-            $feed_classname = "atom";
-            $feed_mimetype = "application/".$feed['type']."+xml";
-            $feed_title = "$nickname's ".$feed['version']." notice feed";
-            $feed['textContent'] = "Atom";
+         case Feed::FOAF:
+            $classname = 'foaf';
             break;
         }
+
         $this->out->elementStart('li');
-        $this->out->element('a', array('href' => $feed['href'],
-                                  'class' => $feed_classname,
-                                  'type' => $feed_mimetype,
-                                  'title' => $feed_title),
-                       $feed['textContent']);
+        $this->out->element('a', array('href' => $feed->url,
+                                       'class' => $classname,
+                                       'type' => $feed->mimeType(),
+                                       'title' => $feed->title),
+                            $feed->typeName());
         $this->out->elementEnd('li');
     }
 }