return;
}
- $.fn.jOverlay.options = {
- method : 'GET',
- data : '',
- url : '',
- color : '#000',
- opacity : '0.6',
- zIndex : 9999,
- center : false,
- imgLoading : $('address .url')[0].href+'theme/base/images/illustrations/illu_progress_loading-01.gif',
- bgClickToClose : true,
- success : function() {
- $('#jOverlayContent').append('<button class="close">×</button>');
- $('#jOverlayContent button').click($.closeOverlay);
- },
- timeout : 0,
- autoHide : true,
- css : {'max-width':'542px', 'top':'5%', 'left':'32.5%'}
- };
-
- notice.find('a.attachment').click(function() {
- var attachId = ($(this).attr('id').substring('attachment'.length + 1));
- if (attachId) {
- $().jOverlay({url: $('address .url')[0].href+'attachment/' + attachId + '/ajax'});
- return false;
- }
- });
+ var attachment_more = notice.find('.attachment.more');
+ if (attachment_more.length > 0) {
+ attachment_more.click(function() {
+ $.get($(this).attr('href')+'/ajax', null, function(data) {
+ notice.find('.entry-title .entry-content').html($(data).find('#attachment_view .entry-content').html());
+ });
- if ($('#shownotice').length == 0) {
- var t;
- notice.find('a.thumbnail').hover(
- function() {
- var anchor = $(this);
- $('a.thumbnail').children('img').hide();
- anchor.closest(".entry-title").addClass('ov');
-
- if (anchor.children('img').length === 0) {
- t = setTimeout(function() {
- $.get($('address .url')[0].href+'attachment/' + (anchor.attr('id').substring('attachment'.length + 1)) + '/thumbnail', null, function(data) {
- anchor.append(data);
- });
- }, 500);
- }
- else {
- anchor.children('img').show();
- }
+ return false;
+ });
+ }
+ else {
+ $.fn.jOverlay.options = {
+ method : 'GET',
+ data : '',
+ url : '',
+ color : '#000',
+ opacity : '0.6',
+ zIndex : 9999,
+ center : false,
+ imgLoading : $('address .url')[0].href+'theme/base/images/illustrations/illu_progress_loading-01.gif',
+ bgClickToClose : true,
+ success : function() {
+ $('#jOverlayContent').append('<button class="close">×</button>');
+ $('#jOverlayContent button').click($.closeOverlay);
},
- function() {
- clearTimeout(t);
- $('a.thumbnail').children('img').hide();
- $(this).closest('.entry-title').removeClass('ov');
+ timeout : 0,
+ autoHide : true,
+ css : {'max-width':'542px', 'top':'5%', 'left':'32.5%'}
+ };
+
+ notice.find('a.attachment').click(function() {
+ var attachId = ($(this).attr('id').substring('attachment'.length + 1));
+ if (attachId) {
+ $().jOverlay({url: $('address .url')[0].href+'attachment/' + attachId + '/ajax'});
+ return false;
}
- );
+ });
+
+ if ($('#shownotice').length == 0) {
+ var t;
+ notice.find('a.thumbnail').hover(
+ function() {
+ var anchor = $(this);
+ $('a.thumbnail').children('img').hide();
+ anchor.closest(".entry-title").addClass('ov');
+
+ if (anchor.children('img').length === 0) {
+ t = setTimeout(function() {
+ $.get($('address .url')[0].href+'attachment/' + (anchor.attr('id').substring('attachment'.length + 1)) + '/thumbnail', null, function(data) {
+ anchor.append(data);
+ });
+ }, 500);
+ }
+ else {
+ anchor.children('img').show();
+ }
+ },
+ function() {
+ clearTimeout(t);
+ $('a.thumbnail').children('img').hide();
+ $(this).closest('.entry-title').removeClass('ov');
+ }
+ );
+ }
}
},
}
}
+ 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;
+ }
+
function showFallback()
{
// If we don't know how to display an attachment inline, we probably
$shortSummary = substr($shortSummary,
0,
Notice::maxContent() - (mb_strlen($url) + 2));
- $shortSummary .= '… ' . $url;
- $content = $shortSummary;
- $rendered = common_render_text($content);
+ $shortSummary .= '…';
+ $content = $shortSummary . ' ' . $url;
+
+ // We mark up the attachment link specially for the HTML output
+ // so we can fold-out the full version inline.
+ $attachUrl = common_local_url('attachment',
+ array('attachment' => $attachment->id));
+ $rendered = common_render_text($shortSummary) .
+ ' ' .
+ '<a href="' .
+ htmlspecialchars($attachUrl) .
+ '" class="attachment more">' .
+ // TRANS: expansion link for too-long remote messages
+ htmlspecialchars(_m('more')) .
+ '</a>';
}
}
position:relative;
padding-left:16px;
}
-#attachments .attachment {
+#attachments .attachment,
+.notice .attachment.more {
padding-left:0;
}
+.notice .attachment.more:before {
+content:'( ';
+}
+.notice .attachment.more:after {
+content:' )';
+}
.notice .attachment img {
position:absolute;
top:18px;
.notice .attachment {
background-position:0 -394px;
}
-#attachments .attachment {
+#attachments .attachment,
+.notice .attachment.more {
background:none;
}
.notice-options .notice_reply {
.notice .attachment {
background-position:0 -394px;
}
-#attachments .attachment {
+#attachments .attachment,
+.notice .attachment.more {
background:none;
}
.notice-options .notice_reply {