X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fattachmentlist.php;h=a784066fdadf78b413051a53682e82e1b11062c5;hb=dd61ae8fbeee64c85f8186672292335592be1ff5;hp=7e536925bfffeee2f9cb69a251f539b1dfb2cefd;hpb=6455461c196fcb8e7c0047870d480e4a97986709;p=quix0rs-gnu-social.git diff --git a/lib/attachmentlist.php b/lib/attachmentlist.php index 7e536925bf..a784066fda 100644 --- a/lib/attachmentlist.php +++ b/lib/attachmentlist.php @@ -28,9 +28,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * widget for displaying a list of notice attachments @@ -67,394 +65,58 @@ class AttachmentList extends Widget } /** - * show the list of notices + * show the list of attachments * * "Uses up" the stream by looping through it. So, probably can't * be called twice on the same list. * - * @return int count of notices listed. + * @return int count of items listed. */ function show() { - $atts = new File; - $att = $atts->getAttachments($this->notice->id); - if (empty($att)) return 0; + $attachments = $this->notice->attachments(); + $representable = false; + foreach ($attachments as $key=>$att) { + // Only show attachments representable with a title + if ($att->getTitle() === null) { + unset($attachments[$key]); + } + } + if (!count($attachments)) { + return 0; + } + $this->showListStart(); - foreach ($att as $n=>$attachment) { - $item = $this->newListItem($attachment); + foreach ($attachments as $att) { + $item = $this->newListItem($att); $item->show(); } $this->showListEnd(); - return count($att); + return count($attachments); } function showListStart() { - $this->out->elementStart('dl', array('id' =>'attachments', - 'class' => 'entry-content')); - // TRANS: DT element label in attachment list. - $this->out->element('dt', null, _('Attachments')); - $this->out->elementStart('dd'); - $this->out->elementStart('ol', array('class' => 'attachments')); + $this->out->elementStart('div', array('class' => 'attachments')); } function showListEnd() { - $this->out->elementEnd('dd'); - $this->out->elementEnd('ol'); - $this->out->elementEnd('dl'); + $this->out->elementEnd('div'); } /** - * returns a new list item for the current notice + * returns a new list item for the current attachment * - * Recipe (factory?) method; overridden by sub-classes to give - * a different list item class. + * @param File $attachment the current attachment * - * @param Notice $notice the current notice - * - * @return NoticeListItem a list item for displaying the notice + * @return AttachmentListItem a list item for displaying the attachment */ - function newListItem($attachment) + function newListItem(File $attachment) { return new AttachmentListItem($attachment, $this->out); } } - -/** - * widget for displaying a single notice - * - * This widget has the core smarts for showing a single notice: what to display, - * where, and under which circumstances. Its key method is show(); this is a recipe - * that calls all the other show*() methods to build up a single notice. The - * ProfileNoticeListItem subclass, for example, overrides showAuthor() to skip - * author info (since that's implicit by the data in the page). - * - * @category UI - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - * @see NoticeList - * @see ProfileNoticeListItem - */ -class AttachmentListItem extends Widget -{ - /** The attachment this item will show. */ - - var $attachment = null; - - var $oembed = null; - - /** - * constructor - * - * Also initializes the profile attribute. - * - * @param Notice $notice The notice we'll display - */ - function __construct($attachment, $out=null) - { - parent::__construct($out); - $this->attachment = $attachment; - $this->oembed = File_oembed::staticGet('file_id', $this->attachment->id); - } - - function title() { - if (empty($this->attachment->title)) { - if (empty($this->oembed->title)) { - $title = $this->attachment->url; - } else { - $title = $this->oembed->title; - } - } else { - $title = $this->attachment->title; - } - - return $title; - } - - function linkTitle() { - return $this->title(); - } - - /** - * recipe function for displaying a single notice. - * - * This uses all the other methods to correctly display a notice. Override - * it or one of the others to fine-tune the output. - * - * @return void - */ - function show() - { - $this->showStart(); - $this->showNoticeAttachment(); - $this->showEnd(); - } - - function linkAttr() { - return array('class' => 'attachment', - 'href' => $this->attachment->url, - 'id' => 'attachment-' . $this->attachment->id, - 'title' => $this->title()); - } - - function showLink() { - $this->out->elementStart('a', $this->linkAttr()); - $this->out->element('span', null, $this->linkTitle()); - $this->showRepresentation(); - $this->out->elementEnd('a'); - } - - function showNoticeAttachment() - { - $this->showLink(); - } - - function showRepresentation() { - $thumb = $this->getThumbInfo(); - if ($thumb) { - $this->out->element('img', array('alt' => '', 'src' => $thumb->url, 'width' => $thumb->width, 'height' => $thumb->height)); - } - } - - /** - * Pull a thumbnail image reference for the given file, and if necessary - * resize it to match currently thumbnail size settings. - * - * @return File_Thumbnail or false/null - */ - function getThumbInfo() - { - $thumbnail = File_thumbnail::staticGet('file_id', $this->attachment->id); - if ($thumbnail) { - $maxWidth = common_config('attachments', 'thumb_width'); - $maxHeight = common_config('attachments', 'thumb_height'); - if ($thumbnail->width > $maxWidth) { - $thumb = clone($thumbnail); - $thumb->width = $maxWidth; - $thumb->height = intval($thumbnail->height * $maxWidth / $thumbnail->width); - return $thumb; - } - } - return $thumbnail; - } - - /** - * start a single notice. - * - * @return void - */ - function showStart() - { - // XXX: RDFa - // TODO: add notice_type class e.g., notice_video, notice_image - $this->out->elementStart('li'); - } - - /** - * finish the notice - * - * Close the last elements in the notice list item - * - * @return void - */ - function showEnd() - { - $this->out->elementEnd('li'); - } -} - -/** - * used for one-off attachment action - */ -class Attachment extends AttachmentListItem -{ - function showLink() { - $this->out->elementStart('div', array('id' => 'attachment_view', - 'class' => 'hentry')); - $this->out->elementStart('div', 'entry-title'); - $this->out->element('a', $this->linkAttr(), $this->linkTitle()); - $this->out->elementEnd('div'); - - $this->out->elementStart('div', 'entry-content'); - $this->showRepresentation(); - $this->out->elementEnd('div'); - - if (!empty($this->oembed->author_name) || !empty($this->oembed->provider)) { - $this->out->elementStart('div', array('id' => 'oembed_info', - 'class' => 'entry-content')); - if (!empty($this->oembed->author_name)) { - $this->out->elementStart('dl', 'vcard author'); - // TRANS: DT element label in attachment list item. - $this->out->element('dt', null, _('Author')); - $this->out->elementStart('dd', 'fn'); - if (empty($this->oembed->author_url)) { - $this->out->text($this->oembed->author_name); - } else { - $this->out->element('a', array('href' => $this->oembed->author_url, - 'class' => 'url'), $this->oembed->author_name); - } - $this->out->elementEnd('dd'); - $this->out->elementEnd('dl'); - } - if (!empty($this->oembed->provider)) { - $this->out->elementStart('dl', 'vcard'); - // TRANS: DT element label in attachment list item. - $this->out->element('dt', null, _('Provider')); - $this->out->elementStart('dd', 'fn'); - if (empty($this->oembed->provider_url)) { - $this->out->text($this->oembed->provider); - } else { - $this->out->element('a', array('href' => $this->oembed->provider_url, - 'class' => 'url'), $this->oembed->provider); - } - $this->out->elementEnd('dd'); - $this->out->elementEnd('dl'); - } - $this->out->elementEnd('div'); - } - $this->out->elementEnd('div'); - } - - function show() { - $this->showNoticeAttachment(); - } - - function linkAttr() { - return array('rel' => 'external', 'href' => $this->attachment->url); - } - - function linkTitle() { - return $this->attachment->url; - } - - function showRepresentation() { - if (empty($this->oembed->type)) { - if (empty($this->attachment->mimetype)) { - $this->showFallback(); - } else { - switch ($this->attachment->mimetype) { - case 'image/gif': - case 'image/png': - case 'image/jpg': - case 'image/jpeg': - $this->out->element('img', array('src' => $this->attachment->url, 'alt' => 'alt')); - break; - - case 'application/ogg': - case 'audio/x-speex': - case 'video/mpeg': - case 'audio/mpeg': - case 'video/mp4': - case 'video/quicktime': - $arr = array('type' => $this->attachment->mimetype, - 'data' => $this->attachment->url, - 'width' => 320, - 'height' => 240 - ); - $this->out->elementStart('object', $arr); - $this->out->element('param', array('name' => 'src', 'value' => $this->attachment->url)); - $this->out->element('param', array('name' => 'autoStart', 'value' => 1)); - $this->out->elementEnd('object'); - break; - - case 'text/html': - if ($this->attachment->filename) { - // Locally-uploaded HTML. Scrub and display inline. - $this->showHtmlFile($this->attachment); - break; - } - // Fall through to default. - - default: - $this->showFallback(); - } - } - } else { - switch ($this->oembed->type) { - case 'rich': - case 'video': - case 'link': - if (!empty($this->oembed->html)) { - require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; - $config = array( - 'safe'=>1, - 'elements'=>'*+object+embed'); - $this->out->raw(htmLawed($this->oembed->html,$config)); - //$this->out->raw($this->oembed->html); - } - break; - - case 'photo': - $this->out->element('img', array('src' => $this->oembed->url, 'width' => $this->oembed->width, 'height' => $this->oembed->height, 'alt' => 'alt')); - break; - - default: - $this->showFallback(); - } - } - } - - protected function showHtmlFile(File $attachment) - { - $body = $this->scrubHtmlFile($attachment); - if ($body) { - $this->out->raw($body); - } - } - - /** - * @return mixed false on failure, HTML fragment string on success - */ - protected function scrubHtmlFile(File $attachment) - { - $path = File::path($attachment->filename); - if (!file_exists($path) || !is_readable($path)) { - common_log(LOG_ERR, "Missing local HTML attachment $path"); - return false; - } - $raw = file_get_contents($path); - - // Normalize... - $dom = new DOMDocument(); - if(!$dom->loadHTML($raw)) { - common_log(LOG_ERR, "Bad HTML in local HTML attachment $path"); - return false; - } - - // Remove