]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Utility classes for atom feeds
authorZach Copley <zach@status.net>
Wed, 10 Feb 2010 22:24:16 +0000 (14:24 -0800)
committerZach Copley <zach@status.net>
Thu, 11 Feb 2010 21:56:05 +0000 (13:56 -0800)
actions/apitimelineuser.php
lib/atom10entry.php [new file with mode: 0644]
lib/atom10feed.php [new file with mode: 0644]
lib/atomnoticefeed.php [new file with mode: 0644]

index ed9104905de1f316c1066df4a9fdbf3332e5836f..bcc48f59c1e4b2665bccc3ff1238fb3f60ec9424 100644 (file)
@@ -145,7 +145,26 @@ class ApiTimelineUserAction extends ApiBareAuthAction
             );
             break;
         case 'atom':
+
+            header('Content-Type: application/atom+xml; charset=utf-8');
+
+            $atom = new AtomNoticeFeed();
+
+            $atom->addLink(
+                common_local_url(
+                    'showstream',
+                    array('nickname' => $this->user->nickname)
+                )
+            );
+
+            $atom->setId($id);
+            $atom->setTitle($title);
+            $atom->setSubtitle($subtitle);
+            $atom->setLogo($logo);
+            $atom->setUpdated('now');
+
             $id = $this->arg('id');
+
             if ($id) {
                 $selfuri = common_root_url() .
                     'api/statuses/user_timeline/' .
@@ -154,10 +173,24 @@ class ApiTimelineUserAction extends ApiBareAuthAction
                 $selfuri = common_root_url() .
                     'api/statuses/user_timeline.atom';
             }
-            $this->showAtomTimeline(
-                $this->notices, $title, $id, $link,
-                $subtitle, $suplink, $selfuri, $logo
+
+            $atom->addLink(
+                $selfuri,
+                array('rel' => 'self', 'type' => 'application/atom+xml')
+            );
+
+            $atom->addLink(
+                $suplink,
+                array(
+                    'rel' => 'http://api.friendfeed.com/2008/03#sup',
+                    'type' => 'application/json'
+                )
             );
+
+            $atom->addEntryFromNotices($this->notices);
+
+            print $atom->getString();
+
             break;
         case 'json':
             $this->showJsonTimeline($this->notices);
diff --git a/lib/atom10entry.php b/lib/atom10entry.php
new file mode 100644 (file)
index 0000000..1b79ce7
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+
+class Atom10EntryException extends Exception
+{
+}
+
+class Atom10Entry extends XMLStringer
+{
+    private $namespaces;
+    private $categories;
+    private $content;
+    private $contributors;
+    private $id;
+    private $links;
+    private $published;
+    private $rights;
+    private $source;
+    private $summary;
+    private $title;
+
+    function __construct($indent = true) {
+        parent::__construct($indent);
+        $this->namespaces = array();
+    }
+
+    function addNamespace($namespace, $uri)
+    {
+        $ns = array($namespace => $uri);
+        $this->namespaces = array_merge($this->namespaces, $ns);
+    }
+
+    function initEntry()
+    {
+
+    }
+
+    function endEntry()
+    {
+
+    }
+
+    function validate
+    {
+
+    }
+
+    function getString()
+    {
+        $this->validate();
+
+        $this->initEntry();
+        $this->renderEntries();
+        $this->endEntry();
+
+        return $this->xw->outputMemory();
+    }
+
+}
\ No newline at end of file
diff --git a/lib/atom10feed.php b/lib/atom10feed.php
new file mode 100644 (file)
index 0000000..9dd8ebc
--- /dev/null
@@ -0,0 +1,177 @@
+<?php
+
+class Atom10FeedException extends Exception
+{
+}
+
+class Atom10Feed extends XMLStringer
+{
+    public  $xw;
+    private $namespaces;
+    private $authors;
+    private $categories;
+    private $contributors;
+    private $generator;
+    private $icon;
+    private $links;
+    private $logo;
+    private $rights;
+    private $subtitle;
+    private $title;
+    private $published;
+    private $updated;
+    private $entries;
+
+    /**
+     * undocumented function
+     *
+     * @param array $entries an array of FeedItems
+     *
+     * @return void
+     *
+     */
+    function __construct($indent = true) {
+        parent::__construct($indent);
+        $this->namespaces = array();
+        $this->links      = array();
+        $this->entries    = array();
+        $this->addNamespace('xmlns', 'http://www.w3.org/2005/Atom');
+    }
+
+    function addNamespace($namespace, $uri)
+    {
+        $ns = array($namespace => $uri);
+        $this->namespaces = array_merge($this->namespaces, $ns);
+    }
+
+    function getNamespaces()
+    {
+        return $this->namespaces;
+    }
+
+    function initFeed()
+    {
+        $this->xw->startDocument('1.0', 'UTF-8');
+        $commonAttrs = array('xml:lang' => 'en-US');
+        $commonAttrs = array_merge($commonAttrs, $this->namespaces);
+        $this->elementStart('feed', $commonAttrs);
+
+        $this->element('id', null, $this->id);
+        $this->element('title', null, $this->title);
+        $this->element('subtitle', null, $this->subtitle);
+        $this->element('logo', null, $this->logo);
+        $this->element('updated', null, $this->updated);
+
+        $this->renderLinks();
+    }
+
+    /**
+     * Check that all required elements have been set, etc.
+     * Throws an Atom10FeedException if something's missing.
+     *
+     * @return void
+     */
+    function validate()
+    {
+    }
+
+    function renderLinks()
+    {
+        foreach ($this->links as $attrs)
+        {
+            $this->element('link', $attrs, null);
+        }
+    }
+
+    function addEntryRaw($entry)
+    {
+        array_push($this->entries, $entry);
+    }
+
+    function addEntry($entry)
+    {
+        array_push($this->entries, $entry->getString());
+    }
+
+    function renderEntries()
+    {
+        foreach ($this->entries as $entry) {
+            $this->raw($entry);
+        }
+    }
+
+    function endFeed()
+    {
+        $this->elementEnd('feed');
+        $this->xw->endDocument();
+    }
+
+    function getString()
+    {
+        $this->validate();
+
+        $this->initFeed();
+        $this->renderEntries();
+        $this->endFeed();
+
+        return $this->xw->outputMemory();
+    }
+
+    function setId($id)
+    {
+        $this->id = $id;
+    }
+
+    function setTitle($title)
+    {
+        $this->title = $title;
+    }
+
+    function setSubtitle($subtitle)
+    {
+        $this->subtitle = $subtitle;
+    }
+
+    function setLogo($logo)
+    {
+        $this->logo = $logo;
+    }
+
+    function setUpdated($dt)
+    {
+        $this->updated = common_date_iso8601($dt);
+    }
+
+    function setPublished($dt)
+    {
+        $this->published = common_date_iso8601($dt);
+    }
+
+    /**
+     * Adds a link element into the Atom document
+     *
+     * Assumes you want rel="alternate" and type="text/html" unless
+     * you send in $otherAttrs.
+     *
+     * @param string $uri            the uri the href need to point to
+     * @param array  $otherAttrs     other attributes to stick in
+     *
+     * @return void
+     */
+    function addLink($uri, $otherAttrs = null) {
+        $attrs = array('href' => $uri);
+
+        if (is_null($otherAttrs)) {
+            $attrs['rel']  = 'alternate';
+            $attrs['type'] = 'text/html';
+        } else {
+            $attrs = array_merge($attrs, $otherAttrs);
+        }
+
+        array_push($this->links, $attrs);
+    }
+
+}
+
+
+
diff --git a/lib/atomnoticefeed.php b/lib/atomnoticefeed.php
new file mode 100644 (file)
index 0000000..a28c9cd
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+class AtomNoticeFeed extends Atom10Feed
+{
+    function __construct($indent = true) {
+        parent::__construct($indent);
+
+        // Feeds containing notice info use the Atom Threading Extensions
+
+        $this->addNamespace(
+            'xmlns:thr',
+            'http://purl.org/syndication/thread/1.0'
+        );
+    }
+
+    function addEntryFromNotices($notices)
+    {
+        if (is_array($notices)) {
+            foreach ($notices as $notice) {
+                $this->addEntryFromNotice($notice);
+            }
+        } else {
+            while ($notices->fetch()) {
+                $this->addEntryFromNotice($notice);
+            }
+        }
+    }
+
+    function addEntryFromNotice($notice)
+    {
+        $this->addEntryRaw($notice->asAtomEntry());
+    }
+
+}
\ No newline at end of file