. * * @category Widget * @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); } /** * A single item in a message list * * @category Widget * @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/ */ abstract class MessageListItem extends Widget { var $message; /** * Constructor * * @param HTMLOutputter $out Output context * @param Message $message Message to show */ function __construct($out, $message) { parent::__construct($out); $this->message = $message; } /** * Show the widget * * @return void */ function show() { $this->out->elementStart('li', array('class' => 'h-entry notice', 'id' => 'message-' . $this->message->id)); $profile = $this->getMessageProfile(); $this->out->elementStart('a', array('href' => $profile->profileurl, 'class' => 'p-author')); $avatarUrl = $profile->avatarUrl(AVATAR_STREAM_SIZE); $this->out->element('img', array('src' => $avatarUrl, 'class' => 'avatar u-photo', 'width' => AVATAR_STREAM_SIZE, 'height' => AVATAR_STREAM_SIZE, 'alt' => $profile->getBestName())); $this->out->element('span', array('class' => 'nickname fn'), $profile->getNickname()); $this->out->elementEnd('a'); // FIXME: URL, image, video, audio $this->out->elementStart('div', array('class' => 'e-content')); $this->out->raw($this->message->rendered); $this->out->elementEnd('div'); $messageurl = common_local_url('showmessage', array('message' => $this->message->id)); // XXX: we need to figure this out better. Is this right? if (strcmp($this->message->uri, $messageurl) != 0 && preg_match('/^http/', $this->message->uri)) { $messageurl = $this->message->uri; } $this->out->elementStart('div', 'entry-metadata'); $this->out->elementStart('a', array('rel' => 'bookmark', 'class' => 'timestamp', 'href' => $messageurl)); $dt = common_date_iso8601($this->message->created); $this->out->element('time', array('class' => 'dt-published', 'datetime' => common_date_iso8601($this->message->created), // TRANS: Timestamp title (tooltip text) for NoticeListItem 'title' => common_exact_date($this->message->created)), common_date_string($this->message->created)); $this->out->elementEnd('a'); if ($this->message->source) { $this->out->elementStart('span', 'source'); // FIXME: bad i18n. Device should be a parameter (from %s). // TRANS: Followed by notice source (usually the client used to send the notice). $this->out->text(_('from')); $this->showSource($this->message->source); $this->out->elementEnd('span'); } $this->out->elementEnd('div'); $this->out->elementEnd('li'); } /** * Dummy method. Serves no other purpose than to make strings available used * in self::showSource() through xgettext. * * @return void */ function messageListItemDummyMessages() { // A dummy array with messages. These will get extracted by xgettext and // are used in self::showSource(). $dummy_messages = array( // TRANS: A possible notice source (web interface). _m('SOURCE','web'), // TRANS: A possible notice source (XMPP). _m('SOURCE','xmpp'), // TRANS: A possible notice source (e-mail). _m('SOURCE','mail'), // TRANS: A possible notice source (OpenMicroBlogging). _m('SOURCE','omb'), // TRANS: A possible notice source (Application Programming Interface). _m('SOURCE','api'), ); } /** * Show the source of the message * * Returns either the name (and link) of the API client that posted the notice, * or one of other other channels. * * @param string $source the source of the message * * @return void */ function showSource($source) { $source_name = _m('SOURCE',$source); switch ($source) { case 'web': case 'xmpp': case 'mail': case 'omb': case 'api': $this->out->element('span', 'device', $source_name); break; default: $ns = Notice_source::getKV($source); if ($ns) { $this->out->elementStart('span', 'device'); $this->out->element('a', array('href' => $ns->url, 'rel' => 'external'), $ns->name); $this->out->elementEnd('span'); } else { $this->out->element('span', 'device', $source_name); } break; } return; } /** * Return the profile to show in the message item * * Overridden in sub-classes to show sender, receiver, or whatever * * @return Profile profile to show avatar and name of */ abstract function getMessageProfile(); }