diff --git a/lib/microappplugin.php b/lib/microappplugin.php index 1dfc44634f..bd8558a35f 100644 --- a/lib/microappplugin.php +++ b/lib/microappplugin.php @@ -137,21 +137,6 @@ abstract class MicroAppPlugin extends Plugin */ abstract function activityObjectFromNotice($notice); - /** - * Custom HTML output for your special notice; called when a - * matching notice turns up in a NoticeListItem. - * - * All micro-app classes must override this method. - * - * @param Notice $notice - * @param HTMLOutputter $out - * - * @fixme WARNING WARNING WARNING base plugin stuff below tries to close - * a div that this function opens in the BookmarkPlugin child class. - * This is probably wrong. - */ - abstract function showNotice($notice, $out); - /** * When building the primary notice form, we'll fetch also some * alternate forms for specialized types -- that's you! @@ -281,6 +266,35 @@ abstract class MicroAppPlugin extends Plugin return true; } + $adapter = $this->adaptNoticeListItem($nli); + + if (!empty($adapter)) { + $adapter->showNotice(); + $adapter->showNoticeAttachments(); + $adapter->showNoticeInfo(); + $adapter->showNoticeOptions(); + } else { + $this->oldShowNotice($nli); + } + + return false; + } + + /** + * 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 null; + } + + function oldShowNotice($nli) + { $out = $nli->out; $notice = $nli->notice; @@ -303,8 +317,6 @@ abstract class MicroAppPlugin extends Plugin $out->elementEnd('div'); $nli->showNoticeOptions(); - - return false; } /** @@ -535,4 +547,9 @@ abstract class MicroAppPlugin extends Plugin return true; } + + function showNotice($notice, $out) + { + throw new ServerException("You must implement either adaptNoticeListItem() or showNotice()"); + } } diff --git a/lib/noticelistitemadapter.php b/lib/noticelistitemadapter.php new file mode 100644 index 0000000000..48530a9c1a --- /dev/null +++ b/lib/noticelistitemadapter.php @@ -0,0 +1,75 @@ +. + * + * @category Microapp + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * For use by microapps to customize NoticeListItem output + * + * @category Microapp + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class NoticeListItemAdapter +{ + protected $nli; + + /** + * Wrap a notice list item. + * + * @param NoticeListItem $nli item to wrap + */ + + function __construct($nli) + { + $this->nli = $nli; + } + + /** + * Delegate unimplemented methods to the notice list item attribute. + * + * @param string $name Name of the method + * @param array $arguments Arguments called + * + * @return mixed Return value of the method. + */ + function __call($name, $arguments) + { + return call_user_func_array(array($this->nli, $name), $arguments); + } +} diff --git a/plugins/Bookmark/BookmarkPlugin.php b/plugins/Bookmark/BookmarkPlugin.php index 9d92fd61a3..f8db77e2b7 100644 --- a/plugins/Bookmark/BookmarkPlugin.php +++ b/plugins/Bookmark/BookmarkPlugin.php @@ -159,6 +159,7 @@ class BookmarkPlugin extends MicroAppPlugin case 'Bookmark': include_once $dir.'/'.$cls.'.php'; return false; + case 'BookmarkListItem': case 'BookmarkForm': case 'InitialBookmarkForm': case 'DeliciousBackupImporter': @@ -512,128 +513,16 @@ 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 Notice $notice - * @param HTMLOutputter $out + * @param NoticeListItem $nli item to adapt + * + * @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. - // TRANS: Exception thrown when a bookmark has no attachments. - // TRANS: %1$s is a bookmark ID, %2$s is a notice ID (number). - throw new Exception(sprintf(_m('Bookmark %1$s (notice %2$d) has no attachments.'), - $nb->id, - $notice->id)); - } - - $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); - 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) { - $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) diff --git a/plugins/Bookmark/bookmark.css b/plugins/Bookmark/bookmark.css index 0e2f3df52f..966adbc66c 100644 --- a/plugins/Bookmark/bookmark.css +++ b/plugins/Bookmark/bookmark.css @@ -1,8 +1 @@ .bookmark-tags li { display: inline; } -.bookmark-mentions li { display: inline; } -.bookmark-avatar { float: left; } -.bookmark-notice-count { float: right; } -.bookmark-info { float: left; } -.bookmark-title { margin-left: 0px; } -#content .bookmark .entry-title { margin-left: 0px; } -#content .bookmark .entry-content { margin-left: 0px; } diff --git a/plugins/Bookmark/bookmarklistitem.php b/plugins/Bookmark/bookmarklistitem.php new file mode 100644 index 0000000000..65ebe50367 --- /dev/null +++ b/plugins/Bookmark/bookmarklistitem.php @@ -0,0 +1,132 @@ +. + * + * @category Bookmark + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * An adapter to show bookmarks in a nicer way + * + * @category Bookmark + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class BookmarkListItem extends NoticeListItemAdapter +{ + function showNotice() + { + $this->nli->out->elementStart('div', 'entry-title'); + $this->nli->showAuthor(); + $this->showContent(); + $this->nli->out->elementEnd('div'); + } + + function showContent() + { + $notice = $this->nli->notice; + $out = $this->nli->out; + + $out->elementStart('p', array('class' => 'entry-content')); + + $nb = Bookmark::getByNotice($notice); + + $profile = $notice->getProfile(); + + $atts = $notice->attachments(); + + if (count($atts) < 1) { + // Something wrong; let default code deal with it. + // TRANS: Exception thrown when a bookmark has no attachments. + // TRANS: %1$s is a bookmark ID, %2$s is a notice ID (number). + throw new Exception(sprintf(_m('Bookmark %1$s (notice %2$d) has no attachments.'), + $nb->id, + $notice->id)); + } + + $att = $atts[0]; + + $out->elementStart('h3'); + $out->element('a', + array('href' => $att->url, + 'class' => 'bookmark-title'), + $nb->title); + $out->elementEnd('h3'); + + // 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); + 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) { + $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); + } + + $out->elementEnd('p'); + } +} diff --git a/theme/neo/css/display.css b/theme/neo/css/display.css index 98e8131997..fd4046c7c1 100644 --- a/theme/neo/css/display.css +++ b/theme/neo/css/display.css @@ -1131,10 +1131,6 @@ padding-right:0; /* Bookmark specific styles */ -#content .bookmark .entry-title { - margin-left: 0px; -} - .bookmark h3 { margin: 0px 0px 8px 0px; float: left;