diff --git a/CHANGELOG.md b/CHANGELOG.md
index 014303933..5207b3bfc 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+### v1.7.31
+*2014-05-08*
+
**Zixaphir**
- Refactoring, bug fixes.
diff --git a/LICENSE b/LICENSE
index 73e8b3950..571cc1e1a 100755
--- a/LICENSE
+++ b/LICENSE
@@ -1,5 +1,5 @@
/*
-* 4chan X - Version 1.7.30 - 2014-05-05
+* 4chan X - Version 1.7.31 - 2014-05-08
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
diff --git a/builds/4chan-X.meta.js b/builds/4chan-X.meta.js
index 99647c4ff..d965c4f88 100755
--- a/builds/4chan-X.meta.js
+++ b/builds/4chan-X.meta.js
@@ -1,6 +1,6 @@
// ==UserScript==
// @name 4chan X
-// @version 1.7.30
+// @version 1.7.31
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js
index b3f2bf6fc..6d2d2bb31 100644
--- a/builds/4chan-X.user.js
+++ b/builds/4chan-X.user.js
@@ -1,7 +1,7 @@
// Generated by CoffeeScript
// ==UserScript==
// @name 4chan X
-// @version 1.7.30
+// @version 1.7.31
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@@ -24,7 +24,7 @@
// ==/UserScript==
/*
-* 4chan X - Version 1.7.30 - 2014-05-05
+* 4chan X - Version 1.7.31 - 2014-05-08
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
@@ -372,7 +372,7 @@
doc = d.documentElement;
g = {
- VERSION: '1.7.30',
+ VERSION: '1.7.31',
NAMESPACE: '4chan X.',
boards: {}
};
@@ -3095,7 +3095,7 @@
o.file = {
name: data.filename + data.ext,
timestamp: "" + data.tim + data.ext,
- url: boardID === 'f' ? "//i.4cdn.org/" + boardID + "/" + data.filename + data.ext : "//i.4cdn.org/" + boardID + "/" + data.tim + data.ext,
+ url: boardID === 'f' ? ("//i.4cdn.org/" + boardID + "/" + data.filename + data.ext).replace(/'/g, ''') : "//i.4cdn.org/" + boardID + "/" + data.tim + data.ext,
height: data.h,
width: data.w,
MD5: data.md5,
@@ -5682,7 +5682,7 @@
return $.addClass(doc, 'hide-original-post-form');
});
}
- $.ready(this.initReady);
+ $.on(d, '4chanXInitFinished', this.initReady);
if (Conf['Persistent QR']) {
if (!(g.BOARD.ID === 'f' && g.VIEW === 'index')) {
$.on(d, '4chanXInitFinished', this.persist);
@@ -5697,6 +5697,7 @@
},
initReady: function() {
var link;
+ $.off(d, '4chanXInitFinished', this.initReady);
QR.postingIsEnabled = !!$.id('postForm');
if (!QR.postingIsEnabled) {
return;
@@ -6051,9 +6052,10 @@
}
},
handleFile: function(file, index, nfiles) {
- var isNewPost, max, post, _ref;
+ var isNewPost, isSingle, max, post, _ref;
+ isSingle = nfiles === 1;
if (/^text\//.test(file.type)) {
- if (nfiles === 1) {
+ if (isSingle) {
post = QR.selected;
} else if (index !== 0 || (post = QR.posts[QR.posts.length - 1]).com) {
post = new QR.post();
@@ -6063,7 +6065,7 @@
}
if (_ref = file.type, __indexOf.call(QR.mimeTypes, _ref) < 0) {
QR.error("" + file.name + ": Unsupported file type.");
- if (nfiles !== 1) {
+ if (!isSingle) {
return;
}
}
@@ -6073,22 +6075,25 @@
}
if (file.size > max) {
QR.error("" + file.name + ": File too large (file: " + ($.bytesToString(file.size)) + ", max: " + ($.bytesToString(max)) + ").");
- if (nfiles !== 1) {
+ if (!isSingle) {
return;
}
}
isNewPost = false;
- if (nfiles === 1) {
+ if (isSingle) {
post = QR.selected;
} else if (index !== 0 || (post = QR.posts[QR.posts.length - 1]).file) {
isNewPost = true;
post = new QR.post();
}
- return QR.checkDimensions(file, function(pass) {
- if (pass || nfiles === 1) {
- return post.setFile(file);
+ return QR.checkDimensions(file, function(pass, el) {
+ if (pass || isSingle) {
+ return post.setFile(file, el);
} else if (isNewPost) {
- return post.rm();
+ post.rm();
+ if (el) {
+ return URL.revokeObjectURL(el.src);
+ }
}
});
},
@@ -6096,75 +6101,69 @@
var img, video;
if (/^image\//.test(file.type)) {
img = new Image();
- img.onload = (function(_this) {
- return function() {
- var height, pass, width;
- height = img.height, width = img.width;
- pass = true;
- if (height > QR.max_height || width > QR.max_width) {
- QR.error("" + file.name + ": Image too large (image: " + height + "x" + width + "px, max: " + QR.max_height + "x" + QR.max_width + "px)");
- pass = false;
- }
- if (height < QR.min_height || width < QR.min_width) {
- QR.error("" + file.name + ": Image too small (image: " + height + "x" + width + "px, min: " + QR.min_height + "x" + QR.min_width + "px)");
- pass = false;
- }
- return cb(pass);
- };
- })(this);
+ img.onload = function() {
+ var height, pass, width;
+ height = img.height, width = img.width;
+ pass = true;
+ if (height > QR.max_height || width > QR.max_width) {
+ QR.error("" + file.name + ": Image too large (image: " + height + "x" + width + "px, max: " + QR.max_height + "x" + QR.max_width + "px)");
+ pass = false;
+ }
+ if (height < QR.min_height || width < QR.min_width) {
+ QR.error("" + file.name + ": Image too small (image: " + height + "x" + width + "px, min: " + QR.min_height + "x" + QR.min_width + "px)");
+ pass = false;
+ }
+ return cb(pass, img);
+ };
return img.src = URL.createObjectURL(file);
} else if (/^video\//.test(file.type)) {
video = $.el('video');
- $.on(video, 'loadedmetadata', (function(_this) {
- return function() {
- var duration, max_height, max_width, pass, videoHeight, videoWidth;
- if (cb == null) {
- return;
- }
- videoHeight = video.videoHeight, videoWidth = video.videoWidth, duration = video.duration;
- max_height = Math.min(QR.max_height, QR.max_height_video);
- max_width = Math.min(QR.max_width, QR.max_width_video);
- pass = true;
- if (videoHeight > max_height || videoWidth > max_width) {
- QR.error("" + file.name + ": Video too large (video: " + videoHeight + "x" + videoWidth + "px, max: " + max_height + "x" + max_width + "px)");
- pass = false;
- }
- if (videoHeight < QR.min_height || videoWidth < QR.min_width) {
- QR.error("" + file.name + ": Video too small (video: " + videoHeight + "x" + videoWidth + "px, min: " + QR.min_height + "x" + QR.min_width + "px)");
- pass = false;
- }
- if (!isFinite(video.duration)) {
- QR.error("" + file.name + ": Video lacks duration metadata (try remuxing)");
- pass = false;
- }
- if (duration > QR.max_duration_video) {
- QR.error("" + file.name + ": Video too long (video: " + duration + "s, max: " + QR.max_duration_video + "s)");
- pass = false;
- }
- if (video.mozHasAudio) {
- QR.error("" + file.name + ": Audio not allowed");
- pass = false;
- }
- cb(pass);
- return cb = null;
- };
- })(this));
- $.on(video, 'error', (function(_this) {
- return function() {
- var _ref;
- if (cb == null) {
- return;
- }
- if (_ref = file.type, __indexOf.call(QR.mimeTypes, _ref) >= 0) {
- QR.error("" + file.name + ": Video appears corrupt");
- }
- cb(false);
- return cb = null;
- };
- })(this));
+ $.on(video, 'loadedmetadata', function() {
+ var duration, max_height, max_width, pass, videoHeight, videoWidth;
+ if (!cb) {
+ return;
+ }
+ videoHeight = video.videoHeight, videoWidth = video.videoWidth, duration = video.duration;
+ max_height = Math.min(QR.max_height, QR.max_height_video);
+ max_width = Math.min(QR.max_width, QR.max_width_video);
+ pass = true;
+ if (videoHeight > max_height || videoWidth > max_width) {
+ QR.error("" + file.name + ": Video too large (video: " + videoHeight + "x" + videoWidth + "px, max: " + max_height + "x" + max_width + "px)");
+ pass = false;
+ }
+ if (videoHeight < QR.min_height || videoWidth < QR.min_width) {
+ QR.error("" + file.name + ": Video too small (video: " + videoHeight + "x" + videoWidth + "px, min: " + QR.min_height + "x" + QR.min_width + "px)");
+ pass = false;
+ }
+ if (!isFinite(duration)) {
+ QR.error("" + file.name + ": Video lacks duration metadata (try remuxing)");
+ pass = false;
+ } else if (duration > QR.max_duration_video) {
+ QR.error("" + file.name + ": Video too long (video: " + duration + "s, max: " + QR.max_duration_video + "s)");
+ pass = false;
+ }
+ if (video.mozHasAudio) {
+ QR.error("" + file.name + ": Audio not allowed");
+ pass = false;
+ }
+ cb(pass, video);
+ return cb = null;
+ });
+ $.on(video, 'error', function() {
+ var _ref;
+ if (!cb) {
+ return;
+ }
+ if (_ref = file.type, __indexOf.call(QR.mimeTypes, _ref) >= 0) {
+ QR.error("" + file.name + ": Video appears corrupt");
+ }
+ URL.revokeObjectURL(file);
+ cb(false, null);
+ return cb = null;
+ });
return video.src = URL.createObjectURL(file);
} else {
- return cb(true);
+ return cb(true, null);
}
},
openFileInput: function(e) {
@@ -6211,49 +6210,46 @@
return list.value = g.VIEW === 'thread' ? g.THREADID : 'new';
},
dialog: function() {
- var dialog, elm, event, i, items, key, name, node, nodes, prop, rules, save, value, _, _i, _len, _ref, _ref1, _ref2, _ref3;
+ var dialog, elm, event, i, items, name, node, nodes, prop, rules, save, setNode, _, _i, _len, _ref, _ref1, _ref2;
QR.nodes = nodes = {
el: dialog = UI.dialog('qr', 'top:0;right:0;', "
")
};
- _ref = {
- move: '.move',
- autohide: '#autohide',
- thread: 'select',
- threadPar: '#qr-thread-select',
- close: '.close',
- form: 'form',
- dumpButton: '#dump-button',
- urlButton: '#url-button',
- name: '[data-name=name]',
- email: '[data-name=email]',
- sub: '[data-name=sub]',
- com: '[data-name=com]',
- dumpList: '#dump-list',
- addPost: '#add-post',
- charCount: '#char-count',
- fileSubmit: '#file-n-submit',
- filename: '#qr-filename',
- fileContainer: '#qr-filename-container',
- fileRM: '#qr-filerm',
- fileExtras: '#qr-extras-container',
- spoiler: '#qr-file-spoiler',
- spoilerPar: '#qr-spoiler-label',
- status: '[type=submit]',
- fileInput: '[type=file]'
+ setNode = function(name, query) {
+ return nodes[name] = $(query, dialog);
};
- for (key in _ref) {
- value = _ref[key];
- nodes[key] = $(value, dialog);
- }
+ setNode('move', '.move');
+ setNode('autohide', '#autohide');
+ setNode('thread', 'select');
+ setNode('threadPar', '#qr-thread-select');
+ setNode('close', '.close');
+ setNode('form', 'form');
+ setNode('dumpButton', '#dump-button');
+ setNode('urlButton', '#url-button');
+ setNode('name', '[data-name=name]');
+ setNode('email', '[data-name=email]');
+ setNode('sub', '[data-name=sub]');
+ setNode('com', '[data-name=com]');
+ setNode('dumpList', '#dump-list');
+ setNode('addPost', '#add-post');
+ setNode('charCount', '#char-count');
+ setNode('fileSubmit', '#file-n-submit');
+ setNode('filename', '#qr-filename');
+ setNode('fileContainer', '#qr-filename-container');
+ setNode('fileRM', '#qr-filerm');
+ setNode('fileExtras', '#qr-extras-container');
+ setNode('spoiler', '#qr-file-spoiler');
+ setNode('spoilerPar', '#qr-spoiler-label');
+ setNode('status', '[type=submit]');
+ setNode('fileInput', '[type=file]');
rules = $('ul.rules').textContent.trim();
QR.min_width = QR.min_height = 1;
QR.max_width = QR.max_height = 10000;
try {
- _ref1 = rules.match(/.+smaller than (\d+)x(\d+).+/), _ = _ref1[0], QR.min_width = _ref1[1], QR.min_height = _ref1[2];
- _ref2 = rules.match(/.+greater than (\d+)x(\d+).+/), _ = _ref2[0], QR.max_width = _ref2[1], QR.max_height = _ref2[2];
- _ref3 = ['min_width', 'min_height', 'max_width', 'max_height'];
- for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
- prop = _ref3[_i];
+ _ref = rules.match(/.+smaller than (\d+)x(\d+).+/), _ = _ref[0], QR.min_width = _ref[1], QR.min_height = _ref[2];
+ _ref1 = rules.match(/.+greater than (\d+)x(\d+).+/), _ = _ref1[0], QR.max_width = _ref1[1], QR.max_height = _ref1[2];
+ _ref2 = ['min_width', 'min_height', 'max_width', 'max_height'];
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
+ prop = _ref2[_i];
QR[prop] = parseInt(QR[prop], 10);
}
} catch (_error) {
@@ -6339,20 +6335,20 @@
},
flags: function() {
var flag, fn, select, _i, _len, _ref;
- fn = function(val) {
- return $.el('option', {
- value: val[0],
- textContent: val[1]
- });
- };
select = $.el('select', {
name: 'flag',
className: 'flagSelector'
});
+ fn = function(val) {
+ return $.add(select, $.el('option', {
+ value: val[0],
+ textContent: val[1]
+ }));
+ };
_ref = [['0', 'None'], ['US', 'American'], ['KP', 'Best Korean'], ['BL', 'Black Nationalist'], ['CM', 'Communist'], ['CF', 'Confederate'], ['RE', 'Conservative'], ['EU', 'European'], ['GY', 'Gay'], ['PC', 'Hippie'], ['IL', 'Israeli'], ['DM', 'Liberal'], ['RP', 'Libertarian'], ['MF', 'Muslim'], ['NZ', 'Nazi'], ['OB', 'Obama'], ['PR', 'Pirate'], ['RB', 'Rebel'], ['TP', 'Tea Partier'], ['TX', 'Texan'], ['TR', 'Tree Hugger'], ['WP', 'White Supremacist']];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
flag = _ref[_i];
- $.add(select, fn(flag));
+ fn(flag);
}
return select;
},
@@ -6459,14 +6455,11 @@
responseType: 'document',
withCredentials: true,
onload: QR.response,
- onerror: function(err, url, line) {
+ onerror: function() {
delete QR.req;
post.unlock();
QR.cooldown.auto = false;
QR.status();
- console.log(err);
- console.log(url);
- console.log(line);
return QR.error($.el('span', {
innerHTML: "4chan X encountered an error while posting. \n[Banned?] [More info]"
}));
@@ -7250,7 +7243,7 @@
}
};
- _Class.prototype.setFile = function(file) {
+ _Class.prototype.setFile = function(file, el) {
this.file = file;
this.filename = file.name;
this.filesize = $.bytesToString(file.size);
@@ -7261,55 +7254,49 @@
if (this === QR.selected) {
this.showFileData();
}
- if (!/^(image|video)\//.test(file.type)) {
- this.nodes.el.style.backgroundImage = null;
- return;
+ if (el) {
+ return this.setThumbnail(el);
+ } else {
+ return this.nodes.el.style.backgroundImage = null;
}
- return this.setThumbnail();
};
- _Class.prototype.setThumbnail = function() {
- var fileURL, img, isVideo;
- isVideo = /^video\//.test(this.file.type);
- img = $.el((isVideo ? 'video' : 'img'));
- $.on(img, (isVideo ? 'loadeddata' : 'load'), (function(_this) {
- return function() {
- var cv, height, s, width;
- s = 90 * 2 * window.devicePixelRatio;
- if (_this.file.type === 'image/gif') {
- s *= 3;
- }
- if (isVideo) {
- height = img.videoHeight;
- width = img.videoWidth;
- } else {
- height = img.height, width = img.width;
- if (height < s || width < s) {
- _this.URL = fileURL;
- _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")";
- return;
- }
- }
- if (height <= width) {
- width = s / height * width;
- height = s;
- } else {
- height = s / width * height;
- width = s;
- }
- cv = $.el('canvas');
- cv.height = img.height = height;
- cv.width = img.width = width;
- cv.getContext('2d').drawImage(img, 0, 0, width, height);
- URL.revokeObjectURL(fileURL);
- return cv.toBlob(function(blob) {
- _this.URL = URL.createObjectURL(blob);
- return _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")";
- });
+ _Class.prototype.setThumbnail = function(el) {
+ var cv, height, isVideo, s, width;
+ isVideo = el.tagName === 'VIDEO';
+ s = 90 * 2 * window.devicePixelRatio;
+ if (this.file.type === 'image/gif') {
+ s *= 3;
+ }
+ if (isVideo) {
+ height = el.videoHeight;
+ width = el.videoWidth;
+ } else {
+ height = el.height, width = el.width;
+ if (height < s || width < s) {
+ this.URL = el.src;
+ this.nodes.el.style.backgroundImage = "url(" + this.URL + ")";
+ return;
+ }
+ }
+ if (height <= width) {
+ width = s / height * width;
+ height = s;
+ } else {
+ height = s / width * height;
+ width = s;
+ }
+ cv = $.el('canvas');
+ cv.height = height;
+ cv.width = width;
+ cv.getContext('2d').drawImage(el, 0, 0, width, height);
+ URL.revokeObjectURL(el.src);
+ return cv.toBlob((function(_this) {
+ return function(blob) {
+ _this.URL = URL.createObjectURL(blob);
+ return _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")";
};
})(this));
- fileURL = URL.createObjectURL(this.file);
- return img.src = fileURL;
};
_Class.prototype.rmFile = function() {
@@ -8746,9 +8733,13 @@
rel: 'nofollow noreferrer',
target: 'blank',
className: 'linkify',
- href: a.dataset.href,
- innerHTML: a.dataset.title || a.dataset.nodedata
+ href: a.dataset.href
});
+ if (a.dataset.title) {
+ el.textContent = a.dataset.title;
+ } else {
+ el.innerHTML = a.dataset.nodedata;
+ }
$.addClass(el, a.dataset.key);
return el;
},
@@ -8818,9 +8809,18 @@
regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/,
style: 'border: 0; width: auto; height: auto;',
el: function(a) {
- return $.el('div', {
- innerHTML: "
"
+ var div, img, link;
+ img = $.el('img', {
+ src: a.dataset.href
});
+ link = $.el('a', {
+ target: '_blank',
+ href: a.dataset.href
+ });
+ div = $.el('div');
+ $.add(link, img);
+ $.add(div, link);
+ return div;
}
}, {
key: 'InstallGentoo',
@@ -8854,7 +8854,7 @@
}
}, {
key: 'MediaCrush',
- regExp: /.*(?:mediacru.sh\/)([0-9a-z_]+)/i,
+ regExp: /.*(?:mediacru.sh\/)([0-9a-z_-]+)/i,
style: 'border: 0;',
el: function(a) {
var el;
@@ -8863,7 +8863,7 @@
var embed, file, files, status, type, _i, _j, _len, _len1, _ref;
status = this.status;
if (status !== 200 && status !== 304) {
- return div.innerHTML = "ERROR " + status;
+ return el.textContent = "ERROR " + status;
}
files = this.response.files;
_ref = ['video/mp4', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'image/svg', 'audio/mpeg'];
@@ -8881,26 +8881,27 @@
}
}
if (!embed) {
- return div.innerHTML = "ERROR: Not a valid filetype";
+ return div.textContent = "ERROR: Not a valid filetype";
+ }
+ switch (embed.type) {
+ case 'video/mp4':
+ case 'video/ogv':
+ return el.innerHTML = "";
+ case 'image/png':
+ case 'image/gif':
+ case 'image/jpeg':
+ case 'image/svg':
+ case 'image/svg+xml':
+ return $.add(el, $.el('a', {
+ target: '_blank',
+ href: a.dataset.href,
+ innerHTML: "
"
+ }));
+ case 'audio/mpeg':
+ return el.innerHTML = "";
+ default:
+ return el.textContent = "ERROR: No valid filetype.";
}
- return el.innerHTML = (function() {
- switch (embed.type) {
- case 'video/mp4':
- case 'video/ogv':
- return "";
- case 'image/png':
- case 'image/gif':
- case 'image/jpeg':
- return "
";
- case 'image/svg':
- case 'image/svg+xml':
- return "";
- case 'audio/mpeg':
- return "";
- default:
- return "ERROR: No valid filetype.";
- }
- })();
});
return el;
}
diff --git a/builds/crx.crx b/builds/crx.crx
index dcd2a567e..4e185824a 100644
Binary files a/builds/crx.crx and b/builds/crx.crx differ
diff --git a/builds/crx/manifest.json b/builds/crx/manifest.json
index 91d619237..1205a2341 100755
--- a/builds/crx/manifest.json
+++ b/builds/crx/manifest.json
@@ -1,6 +1,6 @@
{
"name": "4chan X",
- "version": "1.7.30",
+ "version": "1.7.31",
"manifest_version": 2,
"description": "Cross-browser userscript for maximum lurking on 4chan.",
"icons": {
diff --git a/builds/crx/script.js b/builds/crx/script.js
index dad2089b3..71a97cd0a 100644
--- a/builds/crx/script.js
+++ b/builds/crx/script.js
@@ -1,6 +1,6 @@
// Generated by CoffeeScript
/*
-* 4chan X - Version 1.7.30 - 2014-05-05
+* 4chan X - Version 1.7.31 - 2014-05-08
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
@@ -348,7 +348,7 @@
doc = d.documentElement;
g = {
- VERSION: '1.7.30',
+ VERSION: '1.7.31',
NAMESPACE: '4chan X.',
boards: {}
};
@@ -3136,7 +3136,7 @@
o.file = {
name: data.filename + data.ext,
timestamp: "" + data.tim + data.ext,
- url: boardID === 'f' ? "//i.4cdn.org/" + boardID + "/" + data.filename + data.ext : "//i.4cdn.org/" + boardID + "/" + data.tim + data.ext,
+ url: boardID === 'f' ? ("//i.4cdn.org/" + boardID + "/" + data.filename + data.ext).replace(/'/g, ''') : "//i.4cdn.org/" + boardID + "/" + data.tim + data.ext,
height: data.h,
width: data.w,
MD5: data.md5,
@@ -5716,7 +5716,7 @@
return $.addClass(doc, 'hide-original-post-form');
});
}
- $.ready(this.initReady);
+ $.on(d, '4chanXInitFinished', this.initReady);
if (Conf['Persistent QR']) {
if (!(g.BOARD.ID === 'f' && g.VIEW === 'index')) {
$.on(d, '4chanXInitFinished', this.persist);
@@ -5731,6 +5731,7 @@
},
initReady: function() {
var link;
+ $.off(d, '4chanXInitFinished', this.initReady);
QR.postingIsEnabled = !!$.id('postForm');
if (!QR.postingIsEnabled) {
return;
@@ -6091,9 +6092,10 @@
}
},
handleFile: function(file, index, nfiles) {
- var isNewPost, max, post, _ref;
+ var isNewPost, isSingle, max, post, _ref;
+ isSingle = nfiles === 1;
if (/^text\//.test(file.type)) {
- if (nfiles === 1) {
+ if (isSingle) {
post = QR.selected;
} else if (index !== 0 || (post = QR.posts[QR.posts.length - 1]).com) {
post = new QR.post();
@@ -6103,7 +6105,7 @@
}
if (_ref = file.type, __indexOf.call(QR.mimeTypes, _ref) < 0) {
QR.error("" + file.name + ": Unsupported file type.");
- if (nfiles !== 1) {
+ if (!isSingle) {
return;
}
}
@@ -6113,22 +6115,25 @@
}
if (file.size > max) {
QR.error("" + file.name + ": File too large (file: " + ($.bytesToString(file.size)) + ", max: " + ($.bytesToString(max)) + ").");
- if (nfiles !== 1) {
+ if (!isSingle) {
return;
}
}
isNewPost = false;
- if (nfiles === 1) {
+ if (isSingle) {
post = QR.selected;
} else if (index !== 0 || (post = QR.posts[QR.posts.length - 1]).file) {
isNewPost = true;
post = new QR.post();
}
- return QR.checkDimensions(file, function(pass) {
- if (pass || nfiles === 1) {
- return post.setFile(file);
+ return QR.checkDimensions(file, function(pass, el) {
+ if (pass || isSingle) {
+ return post.setFile(file, el);
} else if (isNewPost) {
- return post.rm();
+ post.rm();
+ if (el) {
+ return URL.revokeObjectURL(el.src);
+ }
}
});
},
@@ -6136,71 +6141,65 @@
var img, video;
if (/^image\//.test(file.type)) {
img = new Image();
- img.onload = (function(_this) {
- return function() {
- var height, pass, width;
- height = img.height, width = img.width;
- pass = true;
- if (height > QR.max_height || width > QR.max_width) {
- QR.error("" + file.name + ": Image too large (image: " + height + "x" + width + "px, max: " + QR.max_height + "x" + QR.max_width + "px)");
- pass = false;
- }
- if (height < QR.min_height || width < QR.min_width) {
- QR.error("" + file.name + ": Image too small (image: " + height + "x" + width + "px, min: " + QR.min_height + "x" + QR.min_width + "px)");
- pass = false;
- }
- return cb(pass);
- };
- })(this);
+ img.onload = function() {
+ var height, pass, width;
+ height = img.height, width = img.width;
+ pass = true;
+ if (height > QR.max_height || width > QR.max_width) {
+ QR.error("" + file.name + ": Image too large (image: " + height + "x" + width + "px, max: " + QR.max_height + "x" + QR.max_width + "px)");
+ pass = false;
+ }
+ if (height < QR.min_height || width < QR.min_width) {
+ QR.error("" + file.name + ": Image too small (image: " + height + "x" + width + "px, min: " + QR.min_height + "x" + QR.min_width + "px)");
+ pass = false;
+ }
+ return cb(pass, img);
+ };
return img.src = URL.createObjectURL(file);
} else if (/^video\//.test(file.type)) {
video = $.el('video');
- $.on(video, 'loadedmetadata', (function(_this) {
- return function() {
- var duration, max_height, max_width, pass, videoHeight, videoWidth;
- if (cb == null) {
- return;
- }
- videoHeight = video.videoHeight, videoWidth = video.videoWidth, duration = video.duration;
- max_height = Math.min(QR.max_height, QR.max_height_video);
- max_width = Math.min(QR.max_width, QR.max_width_video);
- pass = true;
- if (videoHeight > max_height || videoWidth > max_width) {
- QR.error("" + file.name + ": Video too large (video: " + videoHeight + "x" + videoWidth + "px, max: " + max_height + "x" + max_width + "px)");
- pass = false;
- }
- if (videoHeight < QR.min_height || videoWidth < QR.min_width) {
- QR.error("" + file.name + ": Video too small (video: " + videoHeight + "x" + videoWidth + "px, min: " + QR.min_height + "x" + QR.min_width + "px)");
- pass = false;
- }
- if (!isFinite(video.duration)) {
- QR.error("" + file.name + ": Video lacks duration metadata (try remuxing)");
- pass = false;
- }
- if (duration > QR.max_duration_video) {
- QR.error("" + file.name + ": Video too long (video: " + duration + "s, max: " + QR.max_duration_video + "s)");
- pass = false;
- }
- cb(pass);
- return cb = null;
- };
- })(this));
- $.on(video, 'error', (function(_this) {
- return function() {
- var _ref;
- if (cb == null) {
- return;
- }
- if (_ref = file.type, __indexOf.call(QR.mimeTypes, _ref) >= 0) {
- QR.error("" + file.name + ": Video appears corrupt");
- }
- cb(false);
- return cb = null;
- };
- })(this));
+ $.on(video, 'loadedmetadata', function() {
+ var duration, max_height, max_width, pass, videoHeight, videoWidth;
+ if (!cb) {
+ return;
+ }
+ videoHeight = video.videoHeight, videoWidth = video.videoWidth, duration = video.duration;
+ max_height = Math.min(QR.max_height, QR.max_height_video);
+ max_width = Math.min(QR.max_width, QR.max_width_video);
+ pass = true;
+ if (videoHeight > max_height || videoWidth > max_width) {
+ QR.error("" + file.name + ": Video too large (video: " + videoHeight + "x" + videoWidth + "px, max: " + max_height + "x" + max_width + "px)");
+ pass = false;
+ }
+ if (videoHeight < QR.min_height || videoWidth < QR.min_width) {
+ QR.error("" + file.name + ": Video too small (video: " + videoHeight + "x" + videoWidth + "px, min: " + QR.min_height + "x" + QR.min_width + "px)");
+ pass = false;
+ }
+ if (!isFinite(duration)) {
+ QR.error("" + file.name + ": Video lacks duration metadata (try remuxing)");
+ pass = false;
+ } else if (duration > QR.max_duration_video) {
+ QR.error("" + file.name + ": Video too long (video: " + duration + "s, max: " + QR.max_duration_video + "s)");
+ pass = false;
+ }
+ cb(pass, video);
+ return cb = null;
+ });
+ $.on(video, 'error', function() {
+ var _ref;
+ if (!cb) {
+ return;
+ }
+ if (_ref = file.type, __indexOf.call(QR.mimeTypes, _ref) >= 0) {
+ QR.error("" + file.name + ": Video appears corrupt");
+ }
+ URL.revokeObjectURL(file);
+ cb(false, null);
+ return cb = null;
+ });
return video.src = URL.createObjectURL(file);
} else {
- return cb(true);
+ return cb(true, null);
}
},
openFileInput: function(e) {
@@ -6247,49 +6246,46 @@
return list.value = g.VIEW === 'thread' ? g.THREADID : 'new';
},
dialog: function() {
- var dialog, elm, event, i, items, key, name, node, nodes, prop, rules, save, value, _, _i, _len, _ref, _ref1, _ref2, _ref3;
+ var dialog, elm, event, i, items, name, node, nodes, prop, rules, save, setNode, _, _i, _len, _ref, _ref1, _ref2;
QR.nodes = nodes = {
el: dialog = UI.dialog('qr', 'top:0;right:0;', " ")
};
- _ref = {
- move: '.move',
- autohide: '#autohide',
- thread: 'select',
- threadPar: '#qr-thread-select',
- close: '.close',
- form: 'form',
- dumpButton: '#dump-button',
- urlButton: '#url-button',
- name: '[data-name=name]',
- email: '[data-name=email]',
- sub: '[data-name=sub]',
- com: '[data-name=com]',
- dumpList: '#dump-list',
- addPost: '#add-post',
- charCount: '#char-count',
- fileSubmit: '#file-n-submit',
- filename: '#qr-filename',
- fileContainer: '#qr-filename-container',
- fileRM: '#qr-filerm',
- fileExtras: '#qr-extras-container',
- spoiler: '#qr-file-spoiler',
- spoilerPar: '#qr-spoiler-label',
- status: '[type=submit]',
- fileInput: '[type=file]'
+ setNode = function(name, query) {
+ return nodes[name] = $(query, dialog);
};
- for (key in _ref) {
- value = _ref[key];
- nodes[key] = $(value, dialog);
- }
+ setNode('move', '.move');
+ setNode('autohide', '#autohide');
+ setNode('thread', 'select');
+ setNode('threadPar', '#qr-thread-select');
+ setNode('close', '.close');
+ setNode('form', 'form');
+ setNode('dumpButton', '#dump-button');
+ setNode('urlButton', '#url-button');
+ setNode('name', '[data-name=name]');
+ setNode('email', '[data-name=email]');
+ setNode('sub', '[data-name=sub]');
+ setNode('com', '[data-name=com]');
+ setNode('dumpList', '#dump-list');
+ setNode('addPost', '#add-post');
+ setNode('charCount', '#char-count');
+ setNode('fileSubmit', '#file-n-submit');
+ setNode('filename', '#qr-filename');
+ setNode('fileContainer', '#qr-filename-container');
+ setNode('fileRM', '#qr-filerm');
+ setNode('fileExtras', '#qr-extras-container');
+ setNode('spoiler', '#qr-file-spoiler');
+ setNode('spoilerPar', '#qr-spoiler-label');
+ setNode('status', '[type=submit]');
+ setNode('fileInput', '[type=file]');
rules = $('ul.rules').textContent.trim();
QR.min_width = QR.min_height = 1;
QR.max_width = QR.max_height = 10000;
try {
- _ref1 = rules.match(/.+smaller than (\d+)x(\d+).+/), _ = _ref1[0], QR.min_width = _ref1[1], QR.min_height = _ref1[2];
- _ref2 = rules.match(/.+greater than (\d+)x(\d+).+/), _ = _ref2[0], QR.max_width = _ref2[1], QR.max_height = _ref2[2];
- _ref3 = ['min_width', 'min_height', 'max_width', 'max_height'];
- for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
- prop = _ref3[_i];
+ _ref = rules.match(/.+smaller than (\d+)x(\d+).+/), _ = _ref[0], QR.min_width = _ref[1], QR.min_height = _ref[2];
+ _ref1 = rules.match(/.+greater than (\d+)x(\d+).+/), _ = _ref1[0], QR.max_width = _ref1[1], QR.max_height = _ref1[2];
+ _ref2 = ['min_width', 'min_height', 'max_width', 'max_height'];
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
+ prop = _ref2[_i];
QR[prop] = parseInt(QR[prop], 10);
}
} catch (_error) {
@@ -6364,20 +6360,20 @@
},
flags: function() {
var flag, fn, select, _i, _len, _ref;
- fn = function(val) {
- return $.el('option', {
- value: val[0],
- textContent: val[1]
- });
- };
select = $.el('select', {
name: 'flag',
className: 'flagSelector'
});
+ fn = function(val) {
+ return $.add(select, $.el('option', {
+ value: val[0],
+ textContent: val[1]
+ }));
+ };
_ref = [['0', 'None'], ['US', 'American'], ['KP', 'Best Korean'], ['BL', 'Black Nationalist'], ['CM', 'Communist'], ['CF', 'Confederate'], ['RE', 'Conservative'], ['EU', 'European'], ['GY', 'Gay'], ['PC', 'Hippie'], ['IL', 'Israeli'], ['DM', 'Liberal'], ['RP', 'Libertarian'], ['MF', 'Muslim'], ['NZ', 'Nazi'], ['OB', 'Obama'], ['PR', 'Pirate'], ['RB', 'Rebel'], ['TP', 'Tea Partier'], ['TX', 'Texan'], ['TR', 'Tree Hugger'], ['WP', 'White Supremacist']];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
flag = _ref[_i];
- $.add(select, fn(flag));
+ fn(flag);
}
return select;
},
@@ -6484,14 +6480,11 @@
responseType: 'document',
withCredentials: true,
onload: QR.response,
- onerror: function(err, url, line) {
+ onerror: function() {
delete QR.req;
post.unlock();
QR.cooldown.auto = false;
QR.status();
- console.log(err);
- console.log(url);
- console.log(line);
return QR.error($.el('span', {
innerHTML: "4chan X encountered an error while posting. \n[Banned?] [More info]"
}));
@@ -7269,7 +7262,7 @@
}
};
- _Class.prototype.setFile = function(file) {
+ _Class.prototype.setFile = function(file, el) {
this.file = file;
this.filename = file.name;
this.filesize = $.bytesToString(file.size);
@@ -7280,55 +7273,49 @@
if (this === QR.selected) {
this.showFileData();
}
- if (!/^(image|video)\//.test(file.type)) {
- this.nodes.el.style.backgroundImage = null;
- return;
+ if (el) {
+ return this.setThumbnail(el);
+ } else {
+ return this.nodes.el.style.backgroundImage = null;
}
- return this.setThumbnail();
};
- _Class.prototype.setThumbnail = function() {
- var fileURL, img, isVideo;
- isVideo = /^video\//.test(this.file.type);
- img = $.el((isVideo ? 'video' : 'img'));
- $.on(img, (isVideo ? 'loadeddata' : 'load'), (function(_this) {
- return function() {
- var cv, height, s, width;
- s = 90 * 2 * window.devicePixelRatio;
- if (_this.file.type === 'image/gif') {
- s *= 3;
- }
- if (isVideo) {
- height = img.videoHeight;
- width = img.videoWidth;
- } else {
- height = img.height, width = img.width;
- if (height < s || width < s) {
- _this.URL = fileURL;
- _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")";
- return;
- }
- }
- if (height <= width) {
- width = s / height * width;
- height = s;
- } else {
- height = s / width * height;
- width = s;
- }
- cv = $.el('canvas');
- cv.height = img.height = height;
- cv.width = img.width = width;
- cv.getContext('2d').drawImage(img, 0, 0, width, height);
- URL.revokeObjectURL(fileURL);
- return cv.toBlob(function(blob) {
- _this.URL = URL.createObjectURL(blob);
- return _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")";
- });
+ _Class.prototype.setThumbnail = function(el) {
+ var cv, height, isVideo, s, width;
+ isVideo = el.tagName === 'VIDEO';
+ s = 90 * 2 * window.devicePixelRatio;
+ if (this.file.type === 'image/gif') {
+ s *= 3;
+ }
+ if (isVideo) {
+ height = el.videoHeight;
+ width = el.videoWidth;
+ } else {
+ height = el.height, width = el.width;
+ if (height < s || width < s) {
+ this.URL = el.src;
+ this.nodes.el.style.backgroundImage = "url(" + this.URL + ")";
+ return;
+ }
+ }
+ if (height <= width) {
+ width = s / height * width;
+ height = s;
+ } else {
+ height = s / width * height;
+ width = s;
+ }
+ cv = $.el('canvas');
+ cv.height = height;
+ cv.width = width;
+ cv.getContext('2d').drawImage(el, 0, 0, width, height);
+ URL.revokeObjectURL(el.src);
+ return cv.toBlob((function(_this) {
+ return function(blob) {
+ _this.URL = URL.createObjectURL(blob);
+ return _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")";
};
})(this));
- fileURL = URL.createObjectURL(this.file);
- return img.src = fileURL;
};
_Class.prototype.rmFile = function() {
@@ -8743,9 +8730,13 @@
rel: 'nofollow noreferrer',
target: 'blank',
className: 'linkify',
- href: a.dataset.href,
- innerHTML: a.dataset.title || a.dataset.nodedata
+ href: a.dataset.href
});
+ if (a.dataset.title) {
+ el.textContent = a.dataset.title;
+ } else {
+ el.innerHTML = a.dataset.nodedata;
+ }
$.addClass(el, a.dataset.key);
return el;
},
@@ -8815,9 +8806,18 @@
regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/,
style: 'border: 0; width: auto; height: auto;',
el: function(a) {
- return $.el('div', {
- innerHTML: "
"
+ var div, img, link;
+ img = $.el('img', {
+ src: a.dataset.href
});
+ link = $.el('a', {
+ target: '_blank',
+ href: a.dataset.href
+ });
+ div = $.el('div');
+ $.add(link, img);
+ $.add(div, link);
+ return div;
}
}, {
key: 'InstallGentoo',
@@ -8851,7 +8851,7 @@
}
}, {
key: 'MediaCrush',
- regExp: /.*(?:mediacru.sh\/)([0-9a-z_]+)/i,
+ regExp: /.*(?:mediacru.sh\/)([0-9a-z_-]+)/i,
style: 'border: 0;',
el: function(a) {
var el;
@@ -8860,7 +8860,7 @@
var embed, file, files, status, type, _i, _j, _len, _len1, _ref;
status = this.status;
if (status !== 200 && status !== 304) {
- return div.innerHTML = "ERROR " + status;
+ return el.textContent = "ERROR " + status;
}
files = this.response.files;
_ref = ['video/mp4', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'image/svg', 'audio/mpeg'];
@@ -8878,26 +8878,27 @@
}
}
if (!embed) {
- return div.innerHTML = "ERROR: Not a valid filetype";
+ return div.textContent = "ERROR: Not a valid filetype";
+ }
+ switch (embed.type) {
+ case 'video/mp4':
+ case 'video/ogv':
+ return el.innerHTML = "";
+ case 'image/png':
+ case 'image/gif':
+ case 'image/jpeg':
+ case 'image/svg':
+ case 'image/svg+xml':
+ return $.add(el, $.el('a', {
+ target: '_blank',
+ href: a.dataset.href,
+ innerHTML: "
"
+ }));
+ case 'audio/mpeg':
+ return el.innerHTML = "";
+ default:
+ return el.textContent = "ERROR: No valid filetype.";
}
- return el.innerHTML = (function() {
- switch (embed.type) {
- case 'video/mp4':
- case 'video/ogv':
- return "";
- case 'image/png':
- case 'image/gif':
- case 'image/jpeg':
- return "
";
- case 'image/svg':
- case 'image/svg+xml':
- return "";
- case 'audio/mpeg':
- return "";
- default:
- return "ERROR: No valid filetype.";
- }
- })();
});
return el;
}
diff --git a/builds/updates.xml b/builds/updates.xml
index 3ca41f1d5..83fb3a91f 100644
--- a/builds/updates.xml
+++ b/builds/updates.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/package.json b/package.json
index f67f0d137..086255bdd 100755
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "4chan-X",
- "version": "1.7.30",
+ "version": "1.7.31",
"description": "Cross-browser userscript for maximum lurking on 4chan.",
"meta": {
"name": "4chan X",