v1.18.x
Julian Lam 9 years ago
parent a7415a8db0
commit 5858d914bf

@ -230,7 +230,6 @@ define('forum/topic/posts', [
utils.addCommasToNumbers(posts.find('.formatted-number')); utils.addCommasToNumbers(posts.find('.formatted-number'));
utils.makeNumbersHumanReadable(posts.find('.human-readable-number')); utils.makeNumbersHumanReadable(posts.find('.human-readable-number'));
posts.find('.timeago').timeago(); posts.find('.timeago').timeago();
Posts.wrapImagesInLinks(posts);
addBlockquoteEllipses(posts.find('[component="post/content"] > blockquote > blockquote')); addBlockquoteEllipses(posts.find('[component="post/content"] > blockquote > blockquote'));
hidePostToolsForDeletedPosts(posts); hidePostToolsForDeletedPosts(posts);
@ -265,6 +264,9 @@ define('forum/topic/posts', [
visible = images.filter(function() { visible = images.filter(function() {
return config.delayImageLoading ? utils.isElementInViewport(this) : true; return config.delayImageLoading ? utils.isElementInViewport(this) : true;
}), }),
posts = $.unique(visible.map(function() {
return $(this).parents('[component="post"]').get(0);
})),
scrollTop = $(window).scrollTop(), scrollTop = $(window).scrollTop(),
adjusting = false, adjusting = false,
adjustQueue = [], adjustQueue = [],
@ -286,6 +288,9 @@ define('forum/topic/posts', [
adjustQueue.pop()(); adjustQueue.pop()();
} else { } else {
adjusting = false; adjusting = false;
Posts.wrapImagesInLinks(posts);
posts.length = 0;
} }
}, },
oldHeight, newHeight; oldHeight, newHeight;
@ -304,9 +309,6 @@ define('forum/topic/posts', [
}); });
image.attr('src', image.attr('data-src')); image.attr('src', image.attr('data-src'));
if (image.parent().attr('href') === 'about:blank') {
image.parent().attr('href', image.attr('data-src'));
}
image.removeAttr('data-src'); image.removeAttr('data-src');
}); });
}, 250); }, 250);
@ -314,9 +316,16 @@ define('forum/topic/posts', [
Posts.wrapImagesInLinks = function(posts) { Posts.wrapImagesInLinks = function(posts) {
posts.find('[component="post/content"] img:not(.emoji)').each(function() { posts.find('[component="post/content"] img:not(.emoji)').each(function() {
var $this = $(this); var $this = $(this),
src = $this.attr('src'),
suffixRegex = /-resized(\.[\w]+)$/;
if (utils.isRelativeUrl(src) && suffixRegex.test(src)) {
src = src.replace(suffixRegex, '$1');
}
if (!$this.parent().is('a')) { if (!$this.parent().is('a')) {
$this.wrap('<a href="' + $this.attr('src') + '" target="_blank">'); $this.wrap('<a href="' + src + '" target="_blank">');
} }
}); });
}; };

@ -14,7 +14,7 @@ var image = require('../image');
var uploadsController = {}; var uploadsController = {};
uploadsController.upload = function(req, res, filesIterator, next) { uploadsController.upload = function(req, res, filesIterator) {
var files = req.files.files; var files = req.files.files;
if (!req.user && meta.config.allowGuestUploads !== '1') { if (!req.user && meta.config.allowGuestUploads !== '1') {
@ -63,6 +63,30 @@ uploadsController.uploadPost = function(req, res, next) {
return next(new Error('[[error:uploads-are-disabled]]')); return next(new Error('[[error:uploads-are-disabled]]'));
} }
uploadFile(req.uid, uploadedFile, next); uploadFile(req.uid, uploadedFile, next);
},
function(fileObj, next) {
if (!isImage || parseInt(meta.config.maximumImageWidth, 10) === 0) {
// Not an image, or resizing disabled. No need to resize.
return next(null, fileObj);
}
var fullPath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), '..', fileObj.url),
parsedPath = path.parse(fullPath);
image.resizeImage({
path: fullPath,
target: path.join(parsedPath.dir, parsedPath.name + '-resized' + parsedPath.ext),
extension: parsedPath.ext,
width: parseInt(meta.config.maximumImageWidth, 10) || 760
}, function(err) {
// Return the resized version to the composer/postData
var parsedUrl = path.parse(fileObj.url);
delete parsedUrl.base;
parsedUrl.name = parsedUrl.name + '-resized';
fileObj.url = path.format(parsedUrl);
next(err, fileObj);
});
} }
], next); ], next);
}, next); }, next);

@ -11,6 +11,7 @@ image.resizeImage = function(data, callback) {
if (plugins.hasListeners('filter:image.resize')) { if (plugins.hasListeners('filter:image.resize')) {
plugins.fireHook('filter:image.resize', { plugins.fireHook('filter:image.resize', {
path: data.path, path: data.path,
target: data.target,
extension: data.extension, extension: data.extension,
width: data.width, width: data.width,
height: data.height height: data.height
@ -26,28 +27,42 @@ image.resizeImage = function(data, callback) {
var w = image.bitmap.width, var w = image.bitmap.width,
h = image.bitmap.height, h = image.bitmap.height,
origRatio = w/h, origRatio = w/h,
desiredRatio = data.width/data.height, desiredRatio = data.width && data.height ? data.width/data.height : origRatio,
x = 0, x = 0,
y = 0, y = 0,
crop; crop;
if (desiredRatio > origRatio) { if (origRatio !== desiredRatio) {
desiredRatio = 1/desiredRatio; if (desiredRatio > origRatio) {
} desiredRatio = 1/desiredRatio;
if (origRatio >= 1) { }
y = 0; // height is the smaller dimension here if (origRatio >= 1) {
x = Math.floor((w/2) - (h * desiredRatio / 2)); y = 0; // height is the smaller dimension here
crop = async.apply(image.crop.bind(image), x, y, h * desiredRatio, h); x = Math.floor((w/2) - (h * desiredRatio / 2));
crop = async.apply(image.crop.bind(image), x, y, h * desiredRatio, h);
} else {
x = 0; // width is the smaller dimension here
y = Math.floor(h/2 - (w * desiredRatio / 2));
crop = async.apply(image.crop.bind(image), x, y, w, w * desiredRatio);
}
} else { } else {
x = 0; // width is the smaller dimension here // Simple resize given either width, height, or both
y = Math.floor(h/2 - (w * desiredRatio / 2)); crop = async.apply(setImmediate);
crop = async.apply(image.crop.bind(image), x, y, w, w * desiredRatio);
} }
async.waterfall([ async.waterfall([
crop, crop,
function(image, next) { function(_image, next) {
image.resize(data.width, data.height, next); if (typeof _image === 'function' && !next) {
next = _image;
_image = image;
}
if ((data.width && data.height) || (w > data.width) || (h > data.height)) {
_image.resize(data.width || Jimp.AUTO, data.height || Jimp.AUTO, next);
} else {
next(null, image);
}
}, },
function(image, next) { function(image, next) {
image.write(data.target || data.path, next); image.write(data.target || data.path, next);

@ -28,8 +28,19 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="maximumFileSize">Maximum File Size</label> <label for="maximumImageWidth">Resize images down to specified width (in pixels)</label>
<input type="text" class="form-control" value="760" data-field="maximumImageWidth" placeholder="760">
<p class="help-block">
(in pixels, default: 760 pixels, set to 0 to disable)
</p>
</div>
<div class="form-group">
<label for="maximumFileSize">Maximum File Size (in KiB)</label>
<input type="text" class="form-control" value="2048" data-field="maximumFileSize"> <input type="text" class="form-control" value="2048" data-field="maximumFileSize">
<p class="help-block">
(in kilobytes, default: 2048 KiB)
</p>
</div> </div>
<div class="checkbox"> <div class="checkbox">

Loading…
Cancel
Save