| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * widget for displaying a list of notice attachments | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  UI | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package   StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							|  |  |  |  * @author    Sarven Capadisli <csarven@status.net> | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @copyright 2008 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:16:46 -04:00
										 |  |  |  * @link      http://status.net/ | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 10:41:36 -04:00
										 |  |  | if (!defined('STATUSNET') && !defined('LACONICA')) { | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * widget for displaying a list of notice attachments | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * There are a number of actions that display a list of notices, in | 
					
						
							|  |  |  |  * reverse chronological order. This widget abstracts out most of the | 
					
						
							|  |  |  |  * code for UI for notice lists. It's overridden to hide some | 
					
						
							|  |  |  |  * data for e.g. the profile page. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category UI | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package  StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author   Evan Prodromou <evan@status.net> | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:16:46 -04:00
										 |  |  |  * @link     http://status.net/ | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |  * @see      Notice | 
					
						
							|  |  |  |  * @see      NoticeListItem | 
					
						
							|  |  |  |  * @see      ProfileNoticeList | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class AttachmentList extends Widget | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** the current stream of notices being displayed. */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var $notice = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * constructor | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Notice $notice stream of notices from DB_DataObject | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function __construct($notice, $out=null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         parent::__construct($out); | 
					
						
							|  |  |  |         $this->notice = $notice; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * show the list of notices | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * "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. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function show() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-05-26 21:20:04 -04:00
										 |  |  |         $atts = new File; | 
					
						
							|  |  |  |         $att = $atts->getAttachments($this->notice->id); | 
					
						
							|  |  |  |         if (empty($att)) return 0; | 
					
						
							| 
									
										
										
										
											2009-06-25 06:55:40 +00:00
										 |  |  |         $this->out->elementStart('dl', array('id' =>'attachments', | 
					
						
							|  |  |  |                                              'class' => 'entry-content')); | 
					
						
							| 
									
										
										
										
											2010-04-10 22:50:15 +02:00
										 |  |  |         // TRANS: DT element label in attachment list.
 | 
					
						
							| 
									
										
										
										
											2009-05-25 15:53:19 -04:00
										 |  |  |         $this->out->element('dt', null, _('Attachments')); | 
					
						
							|  |  |  |         $this->out->elementStart('dd'); | 
					
						
							| 
									
										
										
										
											2009-05-27 19:43:43 +00:00
										 |  |  |         $this->out->elementStart('ol', array('class' => 'attachments')); | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         foreach ($att as $n=>$attachment) { | 
					
						
							|  |  |  |             $item = $this->newListItem($attachment); | 
					
						
							|  |  |  |             $item->show(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-25 15:53:19 -04:00
										 |  |  |         $this->out->elementEnd('dd'); | 
					
						
							| 
									
										
										
										
											2009-05-27 19:43:43 +00:00
										 |  |  |         $this->out->elementEnd('ol'); | 
					
						
							| 
									
										
										
										
											2009-05-25 15:53:19 -04:00
										 |  |  |         $this->out->elementEnd('dl'); | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return count($att); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * returns a new list item for the current notice | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Recipe (factory?) method; overridden by sub-classes to give | 
					
						
							|  |  |  |      * a different list item class. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Notice $notice the current notice | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return NoticeListItem a list item for displaying the notice | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function newListItem($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 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package  StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author   Evan Prodromou <evan@status.net> | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:16:46 -04:00
										 |  |  |  * @link     http://status.net/ | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |  * @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() { | 
					
						
							| 
									
										
										
										
											2009-05-25 11:13:13 -04:00
										 |  |  |         return $this->title(); | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 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() { | 
					
						
							| 
									
										
										
										
											2009-05-24 04:43:34 -04:00
										 |  |  |         return array('class' => 'attachment', 'href' => $this->attachment->url, 'id' => 'attachment-' . $this->attachment->id); | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function showLink() { | 
					
						
							| 
									
										
										
										
											2009-05-25 15:53:19 -04:00
										 |  |  |         $this->out->elementStart('a', $this->linkAttr()); | 
					
						
							|  |  |  |         $this->out->element('span', null, $this->linkTitle()); | 
					
						
							| 
									
										
										
										
											2009-05-25 15:38:50 -04:00
										 |  |  |         $this->showRepresentation(); | 
					
						
							|  |  |  |         $this->out->elementEnd('a'); | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function showNoticeAttachment() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->showLink(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function showRepresentation() { | 
					
						
							|  |  |  |         $thumbnail = File_thumbnail::staticGet('file_id', $this->attachment->id); | 
					
						
							|  |  |  |         if (!empty($thumbnail)) { | 
					
						
							| 
									
										
										
										
											2009-06-18 18:48:19 +00:00
										 |  |  |             $this->out->element('img', array('alt' => '', 'src' => $thumbnail->url, 'width' => $thumbnail->width, 'height' => $thumbnail->height)); | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 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'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Attachment extends AttachmentListItem | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-06-18 06:02:12 -04:00
										 |  |  |     function showLink() { | 
					
						
							| 
									
										
										
										
											2009-06-18 18:48:19 +00:00
										 |  |  |         $this->out->elementStart('div', array('id' => 'attachment_view', | 
					
						
							|  |  |  |                                               'class' => 'hentry')); | 
					
						
							|  |  |  |         $this->out->elementStart('div', 'entry-title'); | 
					
						
							| 
									
										
										
										
											2010-03-14 15:01:24 -04:00
										 |  |  |         $this->out->element('a', $this->linkAttr(), $this->linkTitle()); | 
					
						
							| 
									
										
										
										
											2009-06-25 00:49:54 +00:00
										 |  |  |         $this->out->elementEnd('div'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->out->elementStart('div', 'entry-content'); | 
					
						
							| 
									
										
										
										
											2009-06-25 00:25:22 +00:00
										 |  |  |         $this->showRepresentation(); | 
					
						
							| 
									
										
										
										
											2009-06-18 18:48:19 +00:00
										 |  |  |         $this->out->elementEnd('div'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-18 19:03:44 +00:00
										 |  |  |         if (!empty($this->oembed->author_name) || !empty($this->oembed->provider)) { | 
					
						
							| 
									
										
										
										
											2010-09-29 00:39:45 +02:00
										 |  |  |             $this->out->elementStart('div', array('id' => 'oembed_info', | 
					
						
							| 
									
										
										
										
											2009-06-18 18:48:19 +00:00
										 |  |  |                                                   'class' => 'entry-content')); | 
					
						
							|  |  |  |             if (!empty($this->oembed->author_name)) { | 
					
						
							|  |  |  |                 $this->out->elementStart('dl', 'vcard author'); | 
					
						
							| 
									
										
										
										
											2010-04-10 22:50:15 +02:00
										 |  |  |                 // TRANS: DT element label in attachment list item.
 | 
					
						
							| 
									
										
										
										
											2009-06-18 18:48:19 +00:00
										 |  |  |                 $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'); | 
					
						
							| 
									
										
										
										
											2009-06-18 06:02:12 -04:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-06-18 18:48:19 +00:00
										 |  |  |             if (!empty($this->oembed->provider)) { | 
					
						
							|  |  |  |                 $this->out->elementStart('dl', 'vcard'); | 
					
						
							| 
									
										
										
										
											2010-04-10 22:50:15 +02:00
										 |  |  |                 // TRANS: DT element label in attachment list item.
 | 
					
						
							| 
									
										
										
										
											2009-06-18 18:48:19 +00:00
										 |  |  |                 $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'); | 
					
						
							| 
									
										
										
										
											2009-06-18 06:02:12 -04:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-06-18 18:48:19 +00:00
										 |  |  |             $this->out->elementEnd('div'); | 
					
						
							| 
									
										
										
										
											2009-06-18 06:02:12 -04:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-06-18 18:48:19 +00:00
										 |  |  |         $this->out->elementEnd('div'); | 
					
						
							| 
									
										
										
										
											2009-06-18 06:02:12 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |     function show() { | 
					
						
							|  |  |  |         $this->showNoticeAttachment(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function linkAttr() { | 
					
						
							| 
									
										
										
										
											2010-03-14 15:01:24 -04:00
										 |  |  |         return array('rel' => 'external', 'href' => $this->attachment->url); | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function linkTitle() { | 
					
						
							| 
									
										
										
										
											2009-05-25 11:13:13 -04:00
										 |  |  |         return $this->attachment->url; | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function showRepresentation() { | 
					
						
							|  |  |  |         if (empty($this->oembed->type)) { | 
					
						
							|  |  |  |             if (empty($this->attachment->mimetype)) { | 
					
						
							| 
									
										
										
										
											2010-03-22 10:35:54 -07:00
										 |  |  |                 $this->showFallback(); | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |             } 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; | 
					
						
							| 
									
										
										
										
											2009-06-01 14:02:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 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; | 
					
						
							| 
									
										
										
										
											2010-03-25 14:31:22 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 case 'text/html': | 
					
						
							|  |  |  |                     if ($this->attachment->filename) { | 
					
						
							|  |  |  |                         // Locally-uploaded HTML. Scrub and display inline.
 | 
					
						
							|  |  |  |                         $this->showHtmlFile($this->attachment); | 
					
						
							|  |  |  |                         break; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     // Fall through to default.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-22 10:35:54 -07:00
										 |  |  |                 default: | 
					
						
							|  |  |  |                     $this->showFallback(); | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             switch ($this->oembed->type) { | 
					
						
							|  |  |  |             case 'rich': | 
					
						
							|  |  |  |             case 'video': | 
					
						
							|  |  |  |             case 'link': | 
					
						
							|  |  |  |                 if (!empty($this->oembed->html)) { | 
					
						
							| 
									
										
										
										
											2009-07-27 13:42:03 -04:00
										 |  |  |                     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);
 | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             case 'photo': | 
					
						
							|  |  |  |                 $this->out->element('img', array('src' => $this->oembed->url, 'width' => $this->oembed->width, 'height' => $this->oembed->height, 'alt' => 'alt')); | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             default: | 
					
						
							| 
									
										
										
										
											2010-03-22 10:35:54 -07:00
										 |  |  |                 $this->showFallback(); | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-03-22 10:35:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-25 14:15:54 -07:00
										 |  |  |     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 <script>s or htmlawed will dump their contents into output!
 | 
					
						
							|  |  |  |         // Note: removing child nodes while iterating seems to mess things up,
 | 
					
						
							|  |  |  |         // hence the double loop.
 | 
					
						
							|  |  |  |         $scripts = array(); | 
					
						
							|  |  |  |         foreach ($dom->getElementsByTagName('script') as $script) { | 
					
						
							|  |  |  |             $scripts[] = $script; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         foreach ($scripts as $script) { | 
					
						
							|  |  |  |             common_log(LOG_DEBUG, $script->textContent); | 
					
						
							|  |  |  |             $script->parentNode->removeChild($script); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Trim out everything outside the body...
 | 
					
						
							|  |  |  |         $body = $dom->saveHTML(); | 
					
						
							|  |  |  |         $body = preg_replace('/^.*<body[^>]*>/is', '', $body); | 
					
						
							|  |  |  |         $body = preg_replace('/<\/body[^>]*>.*$/is', '', $body); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; | 
					
						
							|  |  |  |         $config = array('safe' => 1, | 
					
						
							|  |  |  |                         'deny_attribute' => 'id,style,on*', | 
					
						
							|  |  |  |                         'comment' => 1); // remove comments
 | 
					
						
							|  |  |  |         $scrubbed = htmLawed($body, $config); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $scrubbed; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-22 10:35:54 -07:00
										 |  |  |     function showFallback() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // If we don't know how to display an attachment inline, we probably
 | 
					
						
							|  |  |  |         // shouldn't have gotten to this point.
 | 
					
						
							|  |  |  |         //
 | 
					
						
							|  |  |  |         // But, here we are... displaying details on a file or remote URL
 | 
					
						
							|  |  |  |         // either on the main view or in an ajax-loaded lightbox. As a lesser
 | 
					
						
							|  |  |  |         // of several evils, we'll try redirecting to the actual target via
 | 
					
						
							|  |  |  |         // client-side JS.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         common_log(LOG_ERR, "Empty or unknown type for file id {$this->attachment->id}; falling back to client-side redirect."); | 
					
						
							|  |  |  |         $this->out->raw('<script>window.location = ' . json_encode($this->attachment->url) . ';</script>'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  | } |