]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/Bookmark/BookmarkPlugin.php
Post verb default type is 'note'
[quix0rs-gnu-social.git] / plugins / Bookmark / BookmarkPlugin.php
index befc4f22910990f5d5583c14470f5111ecf3df21..547efa2370104187891241cfbd7ba90d7ad689c8 100644 (file)
@@ -48,6 +48,8 @@ class BookmarkPlugin extends MicroAppPlugin
     const VERSION         = '0.1';
     const IMPORTDELICIOUS = 'BookmarkPlugin:IMPORTDELICIOUS';
 
+    var $oldSaveNew = true;
+
     /**
      * Authorization for importing delicious bookmarks
      *
@@ -94,7 +96,7 @@ class BookmarkPlugin extends MicroAppPlugin
      */
     function onEndShowStyles($action)
     {
-        $action->cssLink($this->path('bookmark.css'));
+        $action->cssLink($this->path('css/bookmark.css'));
         return true;
     }
 
@@ -107,11 +109,11 @@ class BookmarkPlugin extends MicroAppPlugin
     /**
      * Map URLs to actions
      *
-     * @param Net_URL_Mapper $m path-to-action mapper
+     * @param URLMapper $m path-to-action mapper
      *
      * @return boolean hook value; true means continue processing, false means stop.
      */
-    function onRouterInitialized($m)
+    public function onRouterInitialized(URLMapper $m)
     {
         if (common_config('singleuser', 'enabled')) {
             $nickname = User::singleUserNickname();
@@ -179,7 +181,7 @@ class BookmarkPlugin extends MicroAppPlugin
      *
      * @return value
      */
-    function onPluginVersion(&$versions)
+    function onPluginVersion(array &$versions)
     {
         $versions[] = array('name' => 'Bookmark',
                             'version' => self::VERSION,
@@ -237,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 = 'hentry 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
      *
@@ -287,16 +256,9 @@ class BookmarkPlugin extends MicroAppPlugin
      *
      * @see Action
      */
-    function onEndPersonalGroupNav($action)
+    function onEndPersonalGroupNav(Menu $menu, Profile $target, Profile $scoped=null)
     {
-        $this->user = common_current_user();
-
-        if (!$this->user) {
-            // TRANS: Client error displayed when trying to display bookmarks for a non-existing user.
-            $this->clientError(_('No such user.'));
-        }
-
-        $action->menuItem(common_local_url('bookmarks', array('nickname' => $this->user->nickname)),
+        $menu->menuItem(common_local_url('bookmarks', array('nickname' => $target->getNickname())),
                           // TRANS: Menu item in sample plugin.
                           _m('Bookmarks'),
                           // TRANS: Menu item title in sample plugin.
@@ -304,40 +266,6 @@ class BookmarkPlugin extends MicroAppPlugin
         return true;
     }
 
-    /**
-     * Save a remote bookmark (from Salmon or PuSH)
-     *
-     * @param Ostatus_profile $author   Author of the bookmark
-     * @param Activity        $activity Activity to save
-     *
-     * @return Notice resulting notice.
-     */
-    static private function _postRemoteBookmark(Ostatus_profile $author,
-                                                Activity $activity)
-    {
-        $bookmark = $activity->objects[0];
-
-        $options = array('uri' => $bookmark->id,
-                         'url' => $bookmark->link,
-                         'is_local' => Notice::REMOTE,
-                         'source' => 'ostatus');
-
-        return self::_postBookmark($author->localProfile(), $activity, $options);
-    }
-
-    /**
-     * Test if an activity represents posting a bookmark
-     *
-     * @param Activity $activity Activity to test
-     *
-     * @return true if it's a Post of a Bookmark, else false
-     */
-    static private function _isPostBookmark($activity)
-    {
-        return ($activity->verb == ActivityVerb::POST &&
-                $activity->objects[0]->type == ActivityObject::BOOKMARK);
-    }
-
     function types()
     {
         return array(ActivityObject::BOOKMARK);
@@ -350,7 +278,7 @@ class BookmarkPlugin extends MicroAppPlugin
      *
      * @return boolean hook value
      */
-    function deleteRelated($notice)
+    function deleteRelated(Notice $notice)
     {
        if ($this->isMyNotice($notice)) {
                
@@ -368,12 +296,12 @@ class BookmarkPlugin extends MicroAppPlugin
      * Save a bookmark from an activity
      *
      * @param Activity $activity Activity to save
-     * @param Profile  $profile  Profile to use as author
+     * @param Profile  $actor    Profile to use as author
      * @param array    $options  Options to pass to bookmark-saving code
      *
      * @return Notice resulting notice
      */
-    function saveNoticeFromActivity($activity, $profile, $options=array())
+    function saveNoticeFromActivity(Activity $activity, Profile $actor, array $options=array())
     {
         $bookmark = $activity->objects[0];
 
@@ -421,16 +349,15 @@ class BookmarkPlugin extends MicroAppPlugin
         $options['replies'] = array();  // TODO: context->attention
 
         foreach ($activity->context->attention as $attnUrl=>$type) {
-            $other = Profile::fromURI($attnUrl);
-            if ($other instanceof Profile) {
-                $options['replies'][] = $attnUrl;
-            } else {
-                // Maybe we can get rid of this since every User_group got a Profile?
-                // TODO: Make sure the above replies get sorted properly for groups (or handled afterwards)
-                $group = User_group::getKV('uri', $attnUrl);
-                if ($group instanceof User_group) {
-                    $options['groups'][] = $attnUrl;
+            try {
+                $other = Profile::fromUri($attnUrl);
+                if ($other->isGroup()) {
+                    $options['groups'][] = $other->id;
+                } else {
+                    $options['replies'][] = $attnUrl;
                 }
+            } catch (UnknownUriException $e) {
+                // We simply don't know this URI, despite lookup attempts.
             }
         }
 
@@ -445,7 +372,7 @@ class BookmarkPlugin extends MicroAppPlugin
             }
         }
 
-        return Bookmark::saveNew($profile,
+        return Bookmark::saveNew($actor,
                                  $bookmark->title,
                                  $url,
                                  $tags,
@@ -453,7 +380,7 @@ class BookmarkPlugin extends MicroAppPlugin
                                  $options);
     }
 
-    function activityObjectFromNotice($notice)
+    function activityObjectFromNotice(Notice $notice)
     {
         assert($this->isMyNotice($notice));
 
@@ -467,7 +394,7 @@ class BookmarkPlugin extends MicroAppPlugin
         $object->type    = ActivityObject::BOOKMARK;
         $object->title   = $nb->title;
         $object->summary = $nb->description;
-        $object->link    = $notice->bestUrl();
+        $object->link    = $notice->getUrl();
 
         // Attributes of the URL
 
@@ -482,7 +409,7 @@ class BookmarkPlugin extends MicroAppPlugin
         $target = $attachments[0];
 
         $attrs = array('rel' => 'related',
-                       'href' => $target->url);
+                       'href' => $target->getUrl());
 
         if (!empty($target->title)) {
             $attrs['title'] = $target->title;
@@ -495,7 +422,7 @@ class BookmarkPlugin extends MicroAppPlugin
         try {
             $thumbnail = $target->getThumbnail();
             $tattrs = array('rel' => 'preview',
-                            'href' => $thumbnail->url);
+                            'href' => $thumbnail->getUrl());
 
             if (!empty($thumbnail->width)) {
                 $tattrs['media:width'] = $thumbnail->width;
@@ -513,19 +440,6 @@ class BookmarkPlugin extends MicroAppPlugin
         return $object;
     }
 
-    /**
-     * Given a notice list item, returns an adapter specific
-     * to this plugin.
-     *
-     * @param NoticeListItem $nli item to adapt
-     *
-     * @return NoticeListItemAdapter adapter or null
-     */
-    function adaptNoticeListItem($nli)
-    {
-        return new BookmarkListItem($nli);
-    }
-
     function entryForm($out)
     {
         return new InitialBookmarkForm($out);
@@ -578,4 +492,88 @@ class BookmarkPlugin extends MicroAppPlugin
 
         return true;
     }
+
+    protected function showNoticeItemNotice(NoticeListItem $nli)
+    {
+        $nli->out->elementStart('div', 'entry-title');
+        $nli->showAuthor();
+        $nli->showContent();
+        $nli->out->elementEnd('div');
+    }
+
+    protected function showNoticeContent(Notice $stored, HTMLOutputter $out, Profile $scoped=null)
+    {
+        $nb = Bookmark::getByNotice($stored);
+
+        if (empty($nb)) {
+            common_log(LOG_ERR, "No bookmark for notice {$stored->id}");
+            parent::showContent();
+            return;
+        } else if (empty($nb->url)) {
+            common_log(LOG_ERR, "No url for bookmark {$nb->id} for notice {$stored->id}");
+            parent::showContent();
+            return;
+        }
+
+        $profile = $stored->getProfile();
+
+        // Whether to nofollow
+        $attrs = array('href' => $nb->url, 'class' => 'bookmark-title');
+
+        $nf = common_config('nofollow', 'external');
+
+        if ($nf == 'never' || ($nf == 'sometimes' and $out instanceof ShowstreamAction)) {
+            $attrs['rel'] = 'external';
+        } else {
+            $attrs['rel'] = 'nofollow external';
+        }
+
+        $out->elementStart('h3');
+        $out->element('a', $attrs, $nb->title);
+        $out->elementEnd('h3');
+
+        // Replies look like "for:" tags
+        $replies = $stored->getReplies();
+        $tags = $stored->getTags();
+
+        if (!empty($nb->description)) {
+            $out->element('p',
+                          array('class' => 'bookmark-description'),
+                          $nb->description);
+        }
+
+        if (!empty($replies) || !empty($tags)) {
+
+            $out->elementStart('ul', array('class' => 'bookmark-tags'));
+
+            foreach ($replies as $reply) {
+                $other = Profile::getKV('id', $reply);
+                if (!empty($other)) {
+                    $out->elementStart('li');
+                    $out->element('a', array('rel' => 'tag',
+                                             'href' => $other->profileurl,
+                                             'title' => $other->getBestName()),
+                                  sprintf('for:%s', $other->nickname));
+                    $out->elementEnd('li');
+                    $out->text(' ');
+                }
+            }
+
+            foreach ($tags as $tag) {
+                $tag = trim($tag);
+                if (!empty($tag)) {
+                    $out->elementStart('li');
+                    $out->element('a',
+                                  array('rel' => 'tag',
+                                        'href' => Notice_tag::url($tag)),
+                                  $tag);
+                    $out->elementEnd('li');
+                    $out->text(' ');
+                }
+            }
+
+            $out->elementEnd('ul');
+        }
+
+    }
 }