}
function title() {
- return $this->attachment->getTitle();
+ return $this->attachment->getTitle() ?: _('Untitled attachment');
}
function linkTitle() {
}
function linkAttr() {
- return array('class' => 'attachment',
- 'href' => $this->attachment->getUrl(),
- 'id' => 'attachment-' . $this->attachment->id,
+ return array(
+ 'class' => 'u-url',
+ 'href' => $this->attachment->getAttachmentUrl(),
'title' => $this->linkTitle());
}
- 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();
+ $this->showRepresentation();
}
function showRepresentation() {
+ $enclosure = $this->attachment->getEnclosure();
+
if (Event::handle('StartShowAttachmentRepresentation', array($this->out, $this->attachment))) {
- if (!empty($this->attachment->mimetype)) {
- switch ($this->attachment->mimetype) {
- case 'image/gif':
- case 'image/png':
- case 'image/jpg':
- case 'image/jpeg':
- try {
- // Tell getThumbnail that we can show an animated image if it has one (4th arg, "force_still")
- $thumb = $this->attachment->getThumbnail(null, null, false, false);
- $this->out->element('img', array('class'=>'u-photo', 'src' => $thumb->getUrl(), 'alt' => ''));
- } catch (UseFileAsThumbnailException $e) {
- $this->out->element('img', array('class'=>'u-photo', 'src' => $e->file->getUrl(), 'alt' => $e->file->title));
- } catch (UnsupportedMediaException $e) {
- // FIXME: Show a good representation of unsupported/unshowable images
- }
- break;
- case 'application/ogg':
- $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');
+ $this->out->elementStart('label');
+ $this->out->element('a', $this->linkAttr(), $this->title());
+ $this->out->elementEnd('label');
+
+ if (!empty($enclosure->mimetype)) {
+ // First, prepare a thumbnail if it exists.
+ $thumb = null;
+ try {
+ // Tell getThumbnail that we can show an animated image if it has one (4th arg, "force_still")
+ $thumb = $this->attachment->getThumbnail(null, null, false, false);
+ } catch (UseFileAsThumbnailException $e) {
+ $thumb = null;
+ } catch (UnsupportedMediaException $e) {
+ // FIXME: Show a good representation of unsupported/unshowable images
+ $thumb = null;
+ }
+
+ // Then get the kind of mediatype we're dealing with
+ $mediatype = common_get_mime_media($enclosure->mimetype);
+
+ // FIXME: Get proper mime recognition of Ogg files! If system has 'mediainfo', this should do it:
+ // $ mediainfo --inform='General;%InternetMediaType%'
+ if ($this->attachment->mimetype === 'application/ogg') {
+ $mediatype = 'video'; // because this element can handle Ogg/Vorbis etc. on its own
+ }
+
+ // Ugly hack to show text/html links which have a thumbnail (such as from oEmbed/OpenGraph image URLs)
+ if (!in_array($mediatype, ['image','audio','video']) && $thumb instanceof File_thumbnail) {
+ $mediatype = 'image';
+ }
+
+ switch ($mediatype) {
+ // Anything we understand as an image, if we need special treatment, do it in StartShowAttachmentRepresentation
+ case 'image':
+ if ($thumb instanceof File_thumbnail) {
+ $this->out->element('img', $thumb->getHtmlAttrs(['class'=>'u-photo', 'alt' => '']));
+ } else {
+ try {
+ // getUrl(true) because we don't want to hotlink, could be made configurable
+ $this->out->element('img', ['class'=>'u-photo', 'src'=>$this->attachment->getUrl(true), 'alt' => $this->attachment->getTitle()]);
+ } catch (FileNotStoredLocallyException $e) {
+ $url = $e->file->getUrl(false);
+ $this->out->element('a', ['href'=>$url, 'rel'=>'external'], $url);
+ }
+ }
+ unset($thumb); // there's no need carrying this along after this
break;
- case 'audio/ogg':
- case 'audio/x-speex':
- case 'video/mpeg':
- case 'audio/mpeg':
- case 'video/mp4':
- case 'video/ogg':
- case 'video/quicktime':
- case 'video/webm':
- $mediatype = common_get_mime_media($this->attachment->mimetype);
- try {
- $thumb = $this->attachment->getThumbnail();
+ // HTML5 media elements
+ case 'audio':
+ case 'video':
+ if ($thumb instanceof File_thumbnail) {
$poster = $thumb->getUrl();
- unset ($thumb);
- } catch (Exception $e) {
+ unset($thumb); // there's no need carrying this along after this
+ } else {
$poster = null;
}
+
$this->out->elementStart($mediatype,
array('class'=>"attachment_player u-{$mediatype}",
'poster'=>$poster,
'controls'=>'controls'));
$this->out->element('source',
- array('src'=>$this->attachment->url,
+ array('src'=>$this->attachment->getUrl(),
'type'=>$this->attachment->mimetype));
$this->out->elementEnd($mediatype);
break;
- case 'text/html':
- if (!empty($this->attachment->filename)
- && (GNUsocial::isAjax() || common_config('attachments', 'show_html'))) {
- // Locally-uploaded HTML. Scrub and display inline.
- $this->showHtmlFile($this->attachment);
+ default:
+ unset($thumb); // there's no need carrying this along
+ switch (common_bare_mime($this->attachment->mimetype)) {
+ case 'text/plain':
+ $this->element('div', ['class'=>'e-content plaintext'], file_get_contents($this->attachment->getPath()));
break;
+ case 'text/html':
+ if (!empty($this->attachment->filename)
+ && (GNUsocial::isAjax() || common_config('attachments', 'show_html'))) {
+ // Locally-uploaded HTML. Scrub and display inline.
+ $this->showHtmlFile($this->attachment);
+ break;
+ }
+ // Fall through to default if it wasn't a _local_ text/html File object
+ default:
+ Event::handle('ShowUnsupportedAttachmentRepresentation', array($this->out, $this->attachment));
}
- // Fall through to default.
-
- default:
- Event::handle('ShowUnsupportedAttachmentRepresentation', array($this->out, $this->attachment));
}
} else {
Event::handle('ShowUnsupportedAttachmentRepresentation', array($this->out, $this->attachment));
*/
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;
- }
+ $path = $attachment->getPath();
$raw = file_get_contents($path);
// Normalize...
$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;
+ require_once INSTALLDIR.'/extlib/HTMLPurifier/HTMLPurifier.auto.php';
+ $purifier = new HTMLPurifier();
+ return $purifier->purify($body);
}
/**