X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FBookmark%2FBookmarkPlugin.php;h=ff68917bcca36a683f5651f47eed337b3461e13c;hb=59043dca7fb6f974b11797c4d0f20e5b78b0611d;hp=bc8985e907b8821d992252c1eb8890f45bb5e7b4;hpb=7cf12f093ed48849ec901038b4cfd44595343c06;p=quix0rs-gnu-social.git diff --git a/plugins/Bookmark/BookmarkPlugin.php b/plugins/Bookmark/BookmarkPlugin.php index bc8985e907..ff68917bcc 100644 --- a/plugins/Bookmark/BookmarkPlugin.php +++ b/plugins/Bookmark/BookmarkPlugin.php @@ -43,7 +43,6 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ - class BookmarkPlugin extends MicroAppPlugin { const VERSION = '0.1'; @@ -60,7 +59,6 @@ class BookmarkPlugin extends MicroAppPlugin * * @return boolean hook value */ - function onUserRightsCheck($profile, $right, &$result) { if ($right == self::IMPORTDELICIOUS) { @@ -78,7 +76,6 @@ class BookmarkPlugin extends MicroAppPlugin * * @return boolean hook value; true means continue processing, false means stop. */ - function onCheckSchema() { $schema = Schema::get(); @@ -127,13 +124,17 @@ class BookmarkPlugin extends MicroAppPlugin * * @return boolean hook value */ - function onEndShowStyles($action) { $action->cssLink($this->path('bookmark.css')); return true; } + function onEndShowScripts($action) + { + $action->script($this->path('js/bookmark.js')); + return true; + } /** * Load related modules when needed * @@ -141,7 +142,6 @@ class BookmarkPlugin extends MicroAppPlugin * * @return boolean hook value; true means continue processing, false means stop. */ - function onAutoload($cls) { $dir = dirname(__FILE__); @@ -152,13 +152,16 @@ class BookmarkPlugin extends MicroAppPlugin case 'NewbookmarkAction': case 'BookmarkpopupAction': case 'NoticebyurlAction': + case 'BookmarkforurlAction': case 'ImportdeliciousAction': include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; return false; case 'Bookmark': include_once $dir.'/'.$cls.'.php'; return false; + case 'BookmarkListItem': case 'BookmarkForm': + case 'InitialBookmarkForm': case 'DeliciousBackupImporter': case 'DeliciousBookmarkImporter': include_once $dir.'/'.strtolower($cls).'.php'; @@ -175,7 +178,6 @@ class BookmarkPlugin extends MicroAppPlugin * * @return boolean hook value; true means continue processing, false means stop. */ - function onRouterInitialized($m) { $m->connect('main/bookmark/new', @@ -188,6 +190,9 @@ class BookmarkPlugin extends MicroAppPlugin $m->connect('main/bookmark/import', array('action' => 'importdelicious')); + $m->connect('main/bookmark/forurl', + array('action' => 'bookmarkforurl')); + $m->connect('bookmark/:id', array('action' => 'showbookmark'), array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')); @@ -204,10 +209,9 @@ class BookmarkPlugin extends MicroAppPlugin * Add our two queue handlers to the queue manager * * @param QueueManager $qm current queue manager - * + * * @return boolean hook value */ - function onEndInitializeQueueManager($qm) { $qm->connect('dlcsback', 'DeliciousBackupImporter'); @@ -219,17 +223,17 @@ class BookmarkPlugin extends MicroAppPlugin * Plugin version data * * @param array &$versions array of version data - * + * * @return value */ - function onPluginVersion(&$versions) { - $versions[] = array('name' => 'Sample', + $versions[] = array('name' => 'Bookmark', 'version' => self::VERSION, 'author' => 'Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:Bookmark', - 'rawdescription' => + 'description' => + // TRANS: Plugin description. _m('Simple extension for supporting bookmarks.')); return true; } @@ -242,7 +246,6 @@ class BookmarkPlugin extends MicroAppPlugin * * @return boolean hook value */ - function onStartLoadDoc(&$title, &$output) { if ($title == 'bookmarklet') { @@ -256,8 +259,6 @@ class BookmarkPlugin extends MicroAppPlugin return true; } - - /** * Show a link to our delicious import page on profile settings form * @@ -265,16 +266,16 @@ class BookmarkPlugin extends MicroAppPlugin * * @return boolean hook value */ - function onEndProfileSettingsActions($action) { $user = common_current_user(); - + if (!empty($user) && $user->hasRight(self::IMPORTDELICIOUS)) { $action->elementStart('li'); $action->element('a', array('href' => common_local_url('importdelicious')), - _('Import del.icio.us bookmarks')); + // TRANS: Link text in proile leading to import form. + _m('Import del.icio.us bookmarks')); $action->elementEnd('li'); } @@ -291,15 +292,27 @@ class BookmarkPlugin extends MicroAppPlugin function onStartOpenNoticeListItemElement($nli) { + if (!$this->isMyNotice($nli->notice)) { + return true; + } + $nb = Bookmark::getByNotice($nli->notice); - if (!empty($nb)) { - $id = (empty($nli->repeat)) ? $nli->notice->id : $nli->repeat->id; - $nli->out->elementStart('li', array('class' => 'hentry notice bookmark', - 'id' => 'notice-' . $id)); - Event::handle('EndOpenNoticeListItemElement', array($nli)); - return false; + + if (empty($nb)) { + $this->log(LOG_INFO, "Notice {$nli->notice->id} has bookmark class but no matching Bookmark record."); + return true; } - 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; } /** @@ -310,7 +323,6 @@ class BookmarkPlugin extends MicroAppPlugin * * @return Notice resulting notice. */ - static private function _postRemoteBookmark(Ostatus_profile $author, Activity $activity) { @@ -318,9 +330,9 @@ class BookmarkPlugin extends MicroAppPlugin $options = array('uri' => $bookmark->id, 'url' => $bookmark->link, - 'is_local' => Notice::REMOTE_OMB, + 'is_local' => Notice::REMOTE, 'source' => 'ostatus'); - + return self::_postBookmark($author->localProfile(), $activity, $options); } @@ -331,7 +343,6 @@ class BookmarkPlugin extends MicroAppPlugin * * @return true if it's a Post of a Bookmark, else false */ - static private function _isPostBookmark($activity) { return ($activity->verb == ActivityVerb::POST && @@ -347,18 +358,20 @@ class BookmarkPlugin extends MicroAppPlugin * When a notice is deleted, delete the related Bookmark * * @param Notice $notice Notice being deleted - * + * * @return boolean hook value */ - function deleteRelated($notice) { - $nb = Bookmark::getByNotice($notice); - - if (!empty($nb)) { - $nb->delete(); - } - + if ($this->isMyNotice($notice)) { + + $nb = Bookmark::getByNotice($notice); + + if (!empty($nb)) { + $nb->delete(); + } + } + return true; } @@ -371,7 +384,6 @@ class BookmarkPlugin extends MicroAppPlugin * * @return Notice resulting notice */ - function saveNoticeFromActivity($activity, $profile, $options=array()) { $bookmark = $activity->objects[0]; @@ -379,7 +391,8 @@ class BookmarkPlugin extends MicroAppPlugin $relLinkEls = ActivityUtils::getLinks($bookmark->element, 'related'); if (count($relLinkEls) < 1) { - throw new ClientException(_('Expected exactly 1 link '. + // TRANS: Client exception thrown when a bookmark is formatted incorrectly. + throw new ClientException(_m('Expected exactly 1 link '. 'rel=related in a Bookmark.')); } @@ -459,6 +472,7 @@ class BookmarkPlugin extends MicroAppPlugin "Formatting notice {$notice->uri} as a bookmark."); $object = new ActivityObject(); + $nb = Bookmark::getByNotice($notice); $object->id = $notice->uri; $object->type = ActivityObject::BOOKMARK; @@ -471,7 +485,8 @@ class BookmarkPlugin extends MicroAppPlugin $attachments = $notice->attachments(); if (count($attachments) != 1) { - throw new ServerException(_('Bookmark notice with the '. + // TRANS: Server exception thrown when a bookmark has multiple attachments. + throw new ServerException(_m('Bookmark notice with the '. 'wrong number of attachments.')); } @@ -485,7 +500,7 @@ class BookmarkPlugin extends MicroAppPlugin } $object->extra[] = array('link', $attrs, null); - + // Attributes of the thumbnail, if any $thumbnail = $target->getThumbnail(); @@ -509,127 +524,21 @@ class BookmarkPlugin extends MicroAppPlugin } /** - * @fixme WARNING WARNING WARNING this opens a 'div' that is apparently closed by MicroAppPlugin - * @fixme that's probably wrong? + * Given a notice list item, returns an adapter specific + * to this plugin. + * + * @param NoticeListItem $nli item to adapt * - * @param Notice $notice - * @param HTMLOutputter $out + * @return NoticeListItemAdapter adapter or null */ - function showNotice($notice, $out) + function adaptNoticeListItem($nli) { - $nb = Bookmark::getByNotice($notice); - - $profile = $notice->getProfile(); - - $atts = $notice->attachments(); - - if (count($atts) < 1) { - // Something wrong; let default code deal with it. - throw new Exception("That can't be right."); - } - - $att = $atts[0]; - - // XXX: only show the bookmark URL for non-single-page stuff - - if ($out instanceof ShowbookmarkAction) { - } else { - $out->elementStart('h3'); - $out->element('a', - array('href' => $att->url, - 'class' => 'bookmark-title entry-title'), - $nb->title); - $out->elementEnd('h3'); - - $countUrl = common_local_url('noticebyurl', - array('id' => $att->id)); - - $out->element('a', array('class' => 'bookmark-notice-count', - 'href' => $countUrl), - $att->noticeCount()); - } - - // Replies look like "for:" tags - - $replies = $notice->getReplies(); - $tags = $notice->getTags(); - - if (!empty($replies) || !empty($tags)) { - - $out->elementStart('ul', array('class' => 'bookmark-tags')); - - foreach ($replies as $reply) { - $other = Profile::staticGet('id', $reply); - $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) { - $out->elementStart('li'); - $out->element('a', - array('rel' => 'tag', - 'href' => Notice_tag::url($tag)), - $tag); - $out->elementEnd('li'); - $out->text(' '); - } - - $out->elementEnd('ul'); - } - - if (!empty($nb->description)) { - $out->element('p', - array('class' => 'bookmark-description'), - $nb->description); - } - - if (common_config('attachments', 'show_thumbs')) { - $haveThumbs = false; - foreach ($atts as $check) { - $thumbnail = File_thumbnail::staticGet('file_id', $check->id); - if (!empty($thumbnail)) { - $haveThumbs = true; - break; - } - } - if ($haveThumbs) { - $al = new InlineAttachmentList($notice, $out); - $al->show(); - } - } - - $out->elementStart('div', array('class' => 'bookmark-info entry-content')); - - $avatar = $profile->getAvatar(AVATAR_MINI_SIZE); - - $out->element('img', - array('src' => ($avatar) ? - $avatar->displayUrl() : - Avatar::defaultImage(AVATAR_MINI_SIZE), - 'class' => 'avatar photo bookmark-avatar', - 'width' => AVATAR_MINI_SIZE, - 'height' => AVATAR_MINI_SIZE, - 'alt' => $profile->getBestName())); - - $out->raw(' '); // avoid   for AJAX XML compatibility - - $out->elementStart('span', 'vcard author'); // hack for belongsOnTimeline; JS needs to be able to find the author - $out->element('a', - array('class' => 'url', - 'href' => $profile->profileurl, - 'title' => $profile->getBestName()), - $profile->nickname); - $out->elementEnd('span'); + return new BookmarkListItem($nli); } function entryForm($out) { - return new BookmarkForm($out); + return new InitialBookmarkForm($out); } function tag() @@ -639,6 +548,28 @@ class BookmarkPlugin extends MicroAppPlugin function appTitle() { - return _m('Bookmark'); + // TRANS: Application title. + return _m('TITLE','Bookmark'); + } + + function onEndUpgrade() + { + // Version 0.9.x of the plugin didn't stamp notices + // with verb and object-type (for obvious reasons). Update + // those notices here. + + $notice = new Notice(); + + $notice->whereAdd('exists (select uri from bookmark where bookmark.uri = notice.uri)'); + $notice->whereAdd('((object_type is null) or (object_type = "' .ActivityObject::NOTE.'"))'); + + $notice->find(); + + while ($notice->fetch()) { + $original = clone($notice); + $notice->verb = ActivityVerb::POST; + $notice->object_type = ActivityObject::BOOKMARK; + $notice->update($original); + } } }