]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Rewriting code for notice representation
authorMikael Nordfeldth <mmn@hethane.se>
Fri, 4 Jul 2014 12:14:49 +0000 (14:14 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Fri, 4 Jul 2014 12:14:49 +0000 (14:14 +0200)
Getting rid of NoticeListItemAdapter, putting more into ActivityHandlerPlugin
and relying on plugins to handle rendering code of the content. This gives us
a lot more structure and consistency in notice structure and allows activity
plugins to stop rendering certain kinds of notices more easily.

There should also be a property for an ActivityHandlerPlugin class to avoid
rendering notices in the ordinary stream, so we don't have to overload stuff.

12 files changed:
classes/Notice.php
lib/activityhandlerplugin.php
lib/microappplugin.php
lib/noticelistitem.php
plugins/Bookmark/BookmarkPlugin.php
plugins/Bookmark/lib/bookmarklistitem.php
plugins/Event/EventPlugin.php
plugins/Favorite/FavoritePlugin.php
plugins/GNUsocialPhoto/GNUsocialPhotoPlugin.php
plugins/GNUsocialVideo/GNUsocialVideoPlugin.php
plugins/Poll/PollPlugin.php
plugins/QnA/QnAPlugin.php

index 4bd117b8375fbff470bf5405a837fe2e1aafeaf4..258652639af3836997bb550e64b538d1539c3def 100644 (file)
@@ -268,6 +268,11 @@ class Notice extends Managed_DataObject
         }
         return $title;
     }
+    
+    public function getContent()
+    {
+        return $this->content;
+    }
 
     /*
      * Get the original representation URL of this notice.
index b94385b4472e0920ca9a3c79f75b96e6cd49003c..a6c5117f4e6b68a01d67bd126d702ef7ca61fdbe 100644 (file)
@@ -31,6 +31,15 @@ if (!defined('GNUSOCIAL')) { exit(1); }
  */
 abstract class ActivityHandlerPlugin extends Plugin
 {
+    /** 
+     * Returns a key string which represents this activity in HTML classes,
+     * ids etc, as when offering selection of what type of post to make. 
+     * In MicroAppPlugin, this is paired with the user-visible localizable appTitle(). 
+     *
+     * @return string (compatible with HTML classes)
+     */ 
+    abstract function tag();
+
     /**
      * Return a list of ActivityStreams object type IRIs
      * which this micro-app handles. Default implementations
@@ -40,8 +49,6 @@ abstract class ActivityHandlerPlugin extends Plugin
      *
      * An empty list means any type is ok. (Favorite verb etc.)
      *
-     * All micro-app classes must override this method.
-     *
      * @return array of strings
      */
     abstract function types();
@@ -57,7 +64,7 @@ abstract class ActivityHandlerPlugin extends Plugin
      *
      * @return array of strings
      */
-    function verbs() {
+    public function verbs() {
         return array(ActivityVerb::POST);
     }
 
@@ -496,4 +503,88 @@ abstract class ActivityHandlerPlugin extends Plugin
         }
         return true;
     }
+
+    public function onStartOpenNoticeListItemElement(NoticeListItem $nli)
+    {   
+        if (!$this->isMyNotice($nli->notice)) {
+            return true;
+        }
+
+        $this->openNoticeListItemElement($nli);
+
+        Event::handle('EndOpenNoticeListItemElement', array($nli));
+        return false;
+    }
+
+    public function onStartCloseNoticeListItemElement(NoticeListItem $nli)
+    {   
+        if (!$this->isMyNotice($nli->notice)) {
+            return true;
+        }
+
+        $this->closeNoticeListItemElement($nli);
+
+        Event::handle('EndCloseNoticeListItemElement', array($nli));
+        return false;
+    }
+
+    protected function openNoticeListItemElement(NoticeListItem $nli)
+    {
+        $id = (empty($nli->repeat)) ? $nli->notice->id : $nli->repeat->id;
+        $class = 'h-entry notice ' . $this->tag();
+        if ($nli->notice->scope != 0 && $nli->notice->scope != 1) {
+            $class .= ' limited-scope';
+        }
+        $nli->out->elementStart('li', array('class' => $class,
+                                            'id' => 'notice-' . $id));
+    }
+
+    protected function closeNoticeListItemElement(NoticeListItem $nli)
+    {
+        $nli->out->elementEnd('li');
+    }
+
+
+    // FIXME: This is overriden in MicroAppPlugin but shouldn't have to be
+    public function onStartShowNoticeItem(NoticeListItem $nli)
+    {   
+        if (!$this->isMyNotice($nli->notice)) {
+            return true;
+        }
+
+        try {
+            $this->showNoticeListItem($nli);
+        } catch (Exception $e) {
+            $nli->out->element('p', 'error', 'Error showing notice: '.htmlspecialchars($e->getMessage()));
+        }
+
+        Event::handle('EndShowNoticeItem', array($nli));
+        return false;
+    }
+
+    protected function showNoticeListItem(NoticeListItem $nli)
+    {
+        $nli->showNotice();
+        $nli->showNoticeAttachments();
+        $nli->showNoticeInfo();
+        $nli->showNoticeOptions();
+
+        $nli->showNoticeLink();
+        $nli->showNoticeSource();
+        $nli->showNoticeLocation();
+        $nli->showContext();
+        $nli->showRepeat();
+
+        $nli->showNoticeOptions();
+    }
+
+    public function onStartShowNoticeContent(Notice $stored, HTMLOutputter $out, Profile $scoped=null)
+    {
+        if (!$this->isMyNotice($stored)) {
+            return true;
+        }
+
+        $out->text($stored->getContent());
+        return false;
+    }
 }
index c6cf4554ddd01de43bd088fd604ff7aa234e87c8..e034bb9b31fbbd37530dcd0d2d137b26f44969a9 100644 (file)
@@ -61,15 +61,6 @@ abstract class MicroAppPlugin extends ActivityHandlerPlugin
      */
     abstract function appTitle();
 
-    /**
-     * Returns a key string which represents this micro-app in HTML
-     * ids etc, as when offering selection of what type of post to make.
-     * This is paired with the user-visible localizable $this->appTitle().
-     *
-     * All micro-app classes must override this method.
-     */
-    abstract function tag();
-
     /**
      * When building the primary notice form, we'll fetch also some
      * alternate forms for specialized types -- that's you!
@@ -99,10 +90,8 @@ abstract class MicroAppPlugin extends ActivityHandlerPlugin
      * @param NoticeListItem $nli The list item being shown.
      *
      * @return boolean hook value
-     *
-     * @fixme WARNING WARNING WARNING this closes a 'div' that is implicitly opened in BookmarkPlugin's showNotice implementation
      */
-    function onStartShowNoticeItem($nli)
+    function onStartShowNoticeItem(NoticeListItem $nli)
     {
         if (!$this->isMyNotice($nli->notice)) {
             return true;
@@ -110,15 +99,15 @@ abstract class MicroAppPlugin extends ActivityHandlerPlugin
 
         $adapter = $this->adaptNoticeListItem($nli);
 
-        if (!empty($adapter)) {
-            $adapter->showNotice();
-            $adapter->showNoticeAttachments();
-            $adapter->showNoticeInfo();
-            $adapter->showNoticeOptions();
-        } else {
-            $this->oldShowNotice($nli);
+        if (empty($adapter)) {
+            throw new ServerException('Could not adapt NoticeListItem');
         }
 
+        $adapter->showNotice();
+        $adapter->showNoticeAttachments();
+        $adapter->showNoticeInfo();
+        $adapter->showNoticeOptions();
+
         return false;
     }
 
@@ -135,32 +124,6 @@ abstract class MicroAppPlugin extends ActivityHandlerPlugin
       return null;
     }
 
-    function oldShowNotice($nli)
-    {
-        $out = $nli->out;
-        $notice = $nli->notice;
-
-        try {
-            $this->showNotice($notice, $out);
-        } catch (Exception $e) {
-            common_log(LOG_ERR, $e->getMessage());
-            // try to fall back
-            $out->elementStart('div');
-            $nli->showAuthor();
-            $nli->showContent();
-        }
-
-        $nli->showNoticeLink();
-        $nli->showNoticeSource();
-        $nli->showNoticeLocation();
-        $nli->showContext();
-        $nli->showRepeat();
-
-        $out->elementEnd('div');
-
-        $nli->showNoticeOptions();
-    }
-
     function onStartShowEntryForms(&$tabs)
     {
         $tabs[$this->tag()] = array('title' => $this->appTitle(),
@@ -178,10 +141,4 @@ abstract class MicroAppPlugin extends ActivityHandlerPlugin
 
         return true;
     }
-
-    function showNotice($notice, $out)
-    {
-        // TRANS: Server exception thrown when a micro app plugin developer has not done his job too well.
-        throw new ServerException(_('You must implement either adaptNoticeListItem() or showNotice().'));
-    }
 }
index 485dd149458e099130a88d5a275d13eed86a21c7..0527f0bf0c1ab6ee25e323f05effefe3f0dd82da 100644 (file)
@@ -273,13 +273,16 @@ class NoticeListItem extends Widget
     {
         // FIXME: URL, image, video, audio
         $this->out->elementStart('div', array('class' => 'e-content'));
-        if ($this->notice->rendered) {
-            $this->out->raw($this->notice->rendered);
-        } else {
-            // XXX: may be some uncooked notices in the DB,
-            // we cook them right now. This should probably disappear in future
-            // versions (>> 0.4.x)
-            $this->out->raw(common_render_content($this->notice->content, $this->notice));
+        if (Event::handle('StartShowNoticeContent', array($this->notice, $this->out, $this->out->getScoped()))) {
+            if ($this->notice->rendered) {
+                $this->out->raw($this->notice->rendered);
+            } else {
+                // XXX: may be some uncooked notices in the DB,
+                // we cook them right now. This should probably disappear in future
+                // versions (>> 0.4.x)
+                $this->out->raw(common_render_content($this->notice->content, $this->notice));
+            }
+            Event::handle('EndShowNoticeContent', array($this->notice, $this->out, $this->out->getScoped()));
         }
         $this->out->elementEnd('div');
     }
index 0e3db1ed829c15fc161867eea069db59ab2ccde8..fdd3c359b866fa7d3a8289680af26e470788590a 100644 (file)
@@ -239,39 +239,6 @@ class BookmarkPlugin extends MicroAppPlugin
         return true;
     }
 
-    /**
-     * Output our CSS class for bookmark notice list elements
-     *
-     * @param NoticeListItem $nli The item being shown
-     *
-     * @return boolean hook value
-     */
-
-    function onStartOpenNoticeListItemElement($nli)
-    {
-       if (!$this->isMyNotice($nli->notice)) {
-               return true;
-       }
-       
-        $nb = Bookmark::getByNotice($nli->notice);
-        
-        if (empty($nb)) {
-               $this->log(LOG_INFO, "Notice {$nli->notice->id} has bookmark class but no matching Bookmark record.");
-               return true;
-        }
-               
-           $id = (empty($nli->repeat)) ? $nli->notice->id : $nli->repeat->id;
-           $class = 'h-entry notice bookmark';
-           if ($nli->notice->scope != 0 && $nli->notice->scope != 1) {
-               $class .= ' limited-scope';
-           }
-           $nli->out->elementStart('li', array('class' => $class,
-                                               'id' => 'notice-' . $id));
-                                               
-           Event::handle('EndOpenNoticeListItemElement', array($nli));
-           return false;
-    }
-
     /**
      * Modify the default menu to link to our custom action
      *
index 3421829a42d0354c1f6cdcee24fde2bf7235bcd2..118800ad99503b935c32684aaf1112b8466b9eda 100644 (file)
@@ -74,7 +74,7 @@ class BookmarkListItem extends NoticeListItemAdapter
 
         $profile = $notice->getProfile();
 
-        $out->elementStart('p', array('class' => 'e-content'));
+        $out->elementStart('div', array('class' => 'e-content'));
 
         // Whether to nofollow
 
@@ -139,6 +139,6 @@ class BookmarkListItem extends NoticeListItemAdapter
                           $nb->description);
         }
 
-        $out->elementEnd('p');
+        $out->elementEnd('div');
     }
 }
index c4272785550498e066f66422ed46f268d92345d0..9ec709af9a63db0324cff3eef07f21b4ef8b7fca 100644 (file)
@@ -44,7 +44,7 @@ if (!defined('STATUSNET')) {
  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
  * @link      http://status.net/
  */
-class EventPlugin extends MicroappPlugin
+class EventPlugin extends MicroAppPlugin
 {
     /**
      * Set up our tables (event and rsvp)
index 3d27d24a7f0a7d32e8070f601bbeac36ccb2a564..4a0dd806cada698c8e180eaf42f932db919bc628 100644 (file)
@@ -289,6 +289,19 @@ class FavoritePlugin extends ActivityHandlerPlugin
         }
     }
 
+    public function showNoticeListItem(NoticeListItem $nli)
+    {
+        // pass
+    }
+    public function openNoticeListItemElement(NoticeListItem $nli)
+    {
+        // pass
+    }
+    public function closeNoticeListItemElement(NoticeListItem $nli)
+    {
+        // pass
+    }
+
     public function onAppendUserActivityStreamObjects(UserActivityStream $uas, array &$objs)
     {
         $faves = array();
index 4f4f4af827486f76b30528bc43d9fd731bb37172..44a6e3fe346ebc895e1fa469ba20d7a11058bd7c 100644 (file)
@@ -119,7 +119,7 @@ class GNUsocialPhotoPlugin extends MicroAppPlugin
         
     }
 
-    function showNotice($notice, $out)
+    function showNoticeContent(Notice $notice, HTMLOutputter $out)
     {
         $photo = Photo::getByNotice($notice);
         if ($photo) {
index b78ed84c42e29ce6472b0c433e7cdcdd0db29b8d..3310712ba76da6b470a6ea6383fd3eb7212044d2 100644 (file)
@@ -112,7 +112,7 @@ class GNUsocialVideoPlugin extends MicroAppPlugin
         
     }
 
-    function showNotice($notice, $out)
+    function showNotice(Notice $notice, HTMLOutputter $out)
     {
         $vid = Video::getByNotice($notice);
         if ($vid) {
index d52e69aabe6899a7076d77a9d1fc128e206073c0..2a5805015cee8f74fb30881fe9bf534cb3248a40 100644 (file)
@@ -376,12 +376,7 @@ class PollPlugin extends MicroAppPlugin
     }
 
 
-    /**
-     * @fixme WARNING WARNING WARNING parent class closes the final div that we
-     * open here, but we probably shouldn't open it here. Check parent class
-     * and Bookmark plugin for if that's right.
-     */
-    function showNotice(Notice $notice, $out)
+    function showNoticeContent(Notice $notice, HTMLOutputter $out)
     {
         switch ($notice->object_type) {
         case self::POLL_OBJECT:
index 6542e95f98f08b8ab72d7485e1378501b86b4a3a..ec1b16b872c5c3871c0f46efa7241f91b1a94a29 100644 (file)
@@ -322,7 +322,7 @@ class QnAPlugin extends MicroAppPlugin
      * @param Notice $notice
      * @param HTMLOutputter $out
      */
-    function showNotice(Notice $notice, $out)
+    function showNoticeContent(Notice $notice, $out)
     {
         switch ($notice->object_type) {
         case QnA_Question::OBJECT_TYPE: