diff --git a/LICENSE b/LICENSE
index 16be3fc60..340559c95 100755
--- a/LICENSE
+++ b/LICENSE
@@ -1,5 +1,5 @@
/*
-* 4chan X - Version 1.2.44 - 2013-12-21
+* 4chan X - Version 1.2.44 - 2013-12-24
*
* Licensed under the MIT license.
* https://github.com/seaweedchan/4chan-x/blob/master/LICENSE
diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js
index 7b3f1bba4..4f502a9db 100644
--- a/builds/4chan-X.user.js
+++ b/builds/4chan-X.user.js
@@ -22,7 +22,7 @@
// ==/UserScript==
/*
-* 4chan X - Version 1.2.44 - 2013-12-21
+* 4chan X - Version 1.2.44 - 2013-12-24
*
* Licensed under the MIT license.
* https://github.com/seaweedchan/4chan-x/blob/master/LICENSE
@@ -105,11 +105,11 @@
(function() {
var $, $$, Anonymize, ArchiveLink, AutoGIF, Banner, Board, Build, CatalogLinks, Clone, Conf, Config, CustomCSS, DataBoard, DeleteLink, Dice, DownloadLink, Emoji, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Fourchan, Gallery, Get, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Index, InfiniScroll, Keybinds, Linkify, Main, Menu, Nav, Notice, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, Thread, ThreadExcerpt, ThreadHiding, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, c, d, doc, g,
+ __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
__slice = [].slice,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
- __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
- __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
+ __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
Config = {
main: {
@@ -352,24 +352,12 @@
posts: {}
};
- String.prototype.capitalize = function() {
- return this.charAt(0).toUpperCase() + this.slice(1);
- };
-
- String.prototype.contains = function(string) {
- return this.indexOf(string) > -1;
- };
-
- Array.prototype.contains = function(object) {
- return this.indexOf(object) > -1;
- };
-
- Array.prototype.indexOf = function(object) {
+ Array.prototype.indexOf = function(val) {
var i;
i = this.length;
while (i--) {
- if (this[i] === object) {
+ if (this[i] === val) {
return i;
}
}
@@ -383,15 +371,14 @@
return root.querySelector(selector);
};
- $.extend = function(object, properties) {
+ $.extend = function(obj, prop) {
var key, val;
- for (key in properties) {
- val = properties[key];
- if (!properties.hasOwnProperty(key)) {
- continue;
+ for (key in prop) {
+ val = prop[key];
+ if (prop.hasOwnProperty(key)) {
+ obj[key] = val;
}
- object[key] = val;
}
};
@@ -571,7 +558,7 @@
};
$.hasClass = function(el, className) {
- return el.classList.contains(className);
+ return __indexOf.call(el.classList, className) >= 0;
};
$.rm = (function() {
@@ -1063,7 +1050,7 @@
return;
}
fullID = "" + match[1] + "." + match[2];
- if (!this.quotes.contains(fullID)) {
+ if (__indexOf.call(this.quotes, fullID) < 0) {
return this.quotes.push(fullID);
}
};
@@ -2965,38 +2952,38 @@
};
},
allQuotelinksLinkingTo: function(post) {
- var ID, quote, quotedPost, quotelinks, quoterPost, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3;
+ var ID, quote, quotedPost, quotelinks, quoterPost, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3, _ref4;
quotelinks = [];
_ref = g.posts;
for (ID in _ref) {
quoterPost = _ref[ID];
- if (quoterPost.quotes.contains(post.fullID)) {
- _ref1 = [quoterPost].concat(quoterPost.clones);
- for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
- quoterPost = _ref1[_i];
+ if (_ref1 = post.fullID, __indexOf.call(quoterPost.quotes, _ref1) >= 0) {
+ _ref2 = [quoterPost].concat(quoterPost.clones);
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
+ quoterPost = _ref2[_i];
quotelinks.push.apply(quotelinks, quoterPost.nodes.quotelinks);
}
}
}
if (Conf['Quote Backlinks']) {
- _ref2 = post.quotes;
- for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
- quote = _ref2[_j];
+ _ref3 = post.quotes;
+ for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {
+ quote = _ref3[_j];
if (!(quotedPost = g.posts[quote])) {
continue;
}
- _ref3 = [quotedPost].concat(quotedPost.clones);
- for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {
- quotedPost = _ref3[_k];
+ _ref4 = [quotedPost].concat(quotedPost.clones);
+ for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) {
+ quotedPost = _ref4[_k];
quotelinks.push.apply(quotelinks, __slice.call(quotedPost.nodes.backlinks));
}
}
}
return quotelinks.filter(function(quotelink) {
- var boardID, postID, _ref4;
+ var boardID, postID, _ref5;
- _ref4 = Get.postDataFromLink(quotelink), boardID = _ref4.boardID, postID = _ref4.postID;
+ _ref5 = Get.postDataFromLink(quotelink), boardID = _ref5.boardID, postID = _ref5.postID;
return boardID === post.board.ID && postID === post.ID;
});
},
@@ -3045,7 +3032,7 @@
return;
}
status = req.status;
- if (![200, 304].contains(status)) {
+ if (status !== 200 && status !== 304) {
if (url = Redirect.to('post', {
boardID: boardID,
postID: postID
@@ -3575,7 +3562,9 @@
}
$.on(root, 'mousemove', o.hover);
o.workaround = function(e) {
- if (!root.contains(e.target)) {
+ var _ref;
+
+ if (_ref = e.target, __indexOf.call(root, _ref) < 0) {
return o.hoverend();
}
};
@@ -3649,7 +3638,7 @@
Filter = {
filters: {},
init: function() {
- var boards, err, filter, hl, key, op, regexp, stub, top, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4;
+ var boards, err, filter, hl, key, op, regexp, stub, top, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
if (g.VIEW === 'catalog' || !Conf['Filter']) {
return;
@@ -3670,10 +3659,10 @@
}
filter = filter.replace(regexp[0], '');
boards = ((_ref1 = filter.match(/boards:([^;]+)/)) != null ? _ref1[1].toLowerCase() : void 0) || 'global';
- if (boards !== 'global' && !(boards.split(',')).contains(g.BOARD.ID)) {
+ if (boards !== 'global' && (_ref2 = !g.BOARD.ID, __indexOf.call(boards.split(','), _ref2) >= 0)) {
continue;
}
- if (['uniqueID', 'MD5'].contains(key)) {
+ if (key === 'uniqueID' || key === 'MD5') {
regexp = regexp[1];
} else {
try {
@@ -3684,11 +3673,11 @@
continue;
}
}
- op = ((_ref2 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref2[1] : void 0) || 'yes';
+ op = ((_ref3 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref3[1] : void 0) || 'yes';
stub = (function() {
- var _ref3;
+ var _ref4;
- switch ((_ref3 = filter.match(/stub:(yes|no)/)) != null ? _ref3[1] : void 0) {
+ switch ((_ref4 = filter.match(/stub:(yes|no)/)) != null ? _ref4[1] : void 0) {
case 'yes':
return true;
case 'no':
@@ -3698,8 +3687,8 @@
}
})();
if (hl = /highlight/.test(filter)) {
- hl = ((_ref3 = filter.match(/highlight:(\w+)/)) != null ? _ref3[1] : void 0) || 'filter-highlight';
- top = ((_ref4 = filter.match(/top:(yes|no)/)) != null ? _ref4[1] : void 0) || 'yes';
+ hl = ((_ref4 = filter.match(/highlight:(\w+)/)) != null ? _ref4[1] : void 0) || 'filter-highlight';
+ top = ((_ref5 = filter.match(/top:(yes|no)/)) != null ? _ref5[1] : void 0) || 'yes';
top = top === 'yes';
}
this.filters[key].push(this.createFilter(regexp, op, stub, hl, top));
@@ -3897,7 +3886,7 @@
type = this.dataset.type;
value = Filter[type](Filter.menu.post);
- re = ['uniqueID', 'MD5'].contains(type) ? value : value.replace(/\/|\\|\^|\$|\n|\.|\(|\)|\{|\}|\[|\]|\?|\*|\+|\|/g, function(c) {
+ re = type === 'uniqueID' || type === 'MD5' ? value : value.replace(/\/|\\|\^|\$|\n|\.|\(|\)|\{|\}|\[|\]|\?|\*|\+|\|/g, function(c) {
if (c === '\n') {
return '\\n';
} else if (c === '\\') {
@@ -3906,7 +3895,7 @@
return "\\" + c;
}
});
- re = ['uniqueID', 'MD5'].contains(type) ? "/" + re + "/" : "/^" + re + "$/";
+ re = type === 'uniqueID' || type === 'MD5' ? "/" + re + "/" : "/^" + re + "$/";
return $.get(type, Conf[type], function(item) {
var save, section, select, ta, tl;
@@ -4296,7 +4285,7 @@
_ref = g.posts;
for (ID in _ref) {
post = _ref[ID];
- if (post.quotes.contains(fullID)) {
+ if (__indexOf.call(post.quotes, fullID) >= 0) {
recursive.apply(null, [post].concat(__slice.call(args)));
}
}
@@ -4331,7 +4320,7 @@
return $.prepend(this.OP.nodes.root, ThreadHiding.makeButton(this, 'hide'));
},
onIndexBuild: function(_arg) {
- var i, nodes, root, thread, _i, _len;
+ var i, nodes, root, thread, _i, _len, _ref;
nodes = _arg.detail;
for (i = _i = 0, _len = nodes.length; _i < _len; i = _i += 2) {
@@ -4342,7 +4331,7 @@
}
if (!thread.stub) {
nodes[i + 1].hidden = true;
- } else if (!root.contains(thread.stub)) {
+ } else if (_ref = thread.stub, __indexOf.call(root, _ref) < 0) {
ThreadHiding.makeStub(thread, root);
}
}
@@ -4857,7 +4846,7 @@
});
},
node: function() {
- var boardID, fullID, i, postID, quotelink, quotelinks, quotes, _ref;
+ var boardID, fullID, i, postID, quotelink, quotelinks, quotes, _ref, _ref1;
if (this.isClone && this.thread === this.context.thread) {
return;
@@ -4866,19 +4855,19 @@
return;
}
quotelinks = this.nodes.quotelinks;
- if (this.isClone && quotes.contains(this.thread.fullID)) {
+ if (this.isClone && (_ref = this.thread.fullID, __indexOf.call(quotes, _ref) >= 0)) {
i = 0;
while (quotelink = quotelinks[i++]) {
quotelink.textContent = quotelink.textContent.replace(QuoteOP.text, '');
}
}
fullID = (this.isClone ? this.context : this).thread.fullID;
- if (!quotes.contains(fullID)) {
+ if (__indexOf.call(quotes, fullID) < 0) {
return;
}
i = 0;
while (quotelink = quotelinks[i++]) {
- _ref = Get.postDataFromLink(quotelink), boardID = _ref.boardID, postID = _ref.postID;
+ _ref1 = Get.postDataFromLink(quotelink), boardID = _ref1.boardID, postID = _ref1.postID;
if (("" + boardID + "." + postID) === fullID) {
$.add(quotelink, $.tn(QuoteOP.text));
}
@@ -5083,7 +5072,7 @@
if (QuoteThreading.hasRun) {
height = doc.clientHeight;
_ref = qpost.nodes.root.getBoundingClientRect(), bottom = _ref.bottom, top = _ref.top;
- if (!(Unread.posts.contains(qpost) || ((bottom < height) && (top > 0)))) {
+ if (!(__indexOf.call(Unread.posts, qpost) >= 0 || ((bottom < height) && (top > 0)))) {
return false;
}
}
@@ -5320,12 +5309,11 @@
});
}
}
- if (!this.quotes.contains(quoteID)) {
+ if (__indexOf.call(this.quotes, quoteID) < 0) {
this.quotes.push(quoteID);
}
if (!a) {
- deadlink.textContent = "" + quote + "\u00A0(Dead)";
- return;
+ return deadlink.textContent = "" + quote + "\u00A0(Dead)";
}
$.replace(deadlink, a);
if ($.hasClass(a, 'quotelink')) {
@@ -5706,7 +5694,7 @@
var embed, file, files, status, type, _i, _j, _len, _len1, _ref;
status = this.status;
- if (![200, 304].contains(status)) {
+ if (status !== 200 && status !== 304) {
return div.innerHTML = "ERROR " + status;
}
files = JSON.parse(this.response).files;
@@ -6151,7 +6139,7 @@
});
},
parseItem: function(item, types) {
- var boards, match, type, val, _ref, _ref1;
+ var boards, match, type, val, _ref, _ref1, _ref2;
if (item[0] === '#') {
return;
@@ -6162,7 +6150,7 @@
_ref = match, match = _ref[0], type = _ref[1], val = _ref[2];
item = item.replace(match, '');
boards = ((_ref1 = item.match(/boards:([^;]+)/i)) != null ? _ref1[1].toLowerCase() : void 0) || 'global';
- if (boards !== 'global' && !((boards.split(',')).contains(g.BOARD.ID))) {
+ if (boards !== 'global' && (_ref2 = !g.BOARD.ID, __indexOf.call(boards.split(','), _ref2) >= 0)) {
return;
}
if (type === 'password') {
@@ -6175,7 +6163,7 @@
if (/always/i.test(item)) {
QR.persona.always[type] = val;
}
- if (!types[type].contains(val)) {
+ if (__indexOf.call(types[type], val) < 0) {
return types[type].push(val);
}
},
@@ -6473,12 +6461,12 @@
}
},
handleFile: function(file, isSingle, max) {
- var post;
+ var post, _ref;
if (file.size > max) {
QR.error("" + file.name + ": File too large (file: " + ($.bytesToString(file.size)) + ", max: " + ($.bytesToString(max)) + ").");
return;
- } else if (!QR.mimeTypes.contains(file.type)) {
+ } else if (_ref = file.type, __indexOf.call(QR.mimeTypes, _ref) < 0) {
if (!/^text/.test(file.type)) {
QR.error("" + file.name + ": Unsupported file type.");
return;
@@ -6499,6 +6487,8 @@
return post.setFile(file);
},
openFileInput: function(e) {
+ var _ref;
+
e.stopPropagation();
if (e.shiftKey && e.type === 'click') {
return QR.selected.rmFile();
@@ -6510,7 +6500,7 @@
return $.rmClass(QR.nodes.filename, 'edit');
});
}
- if (e.target.nodeName === 'INPUT' || (e.keyCode && ![32, 13].contains(e.keyCode)) || e.ctrlKey) {
+ if (e.target.nodeName === 'INPUT' || (e.keyCode && ((_ref = !e.keyCode) === 32 || _ref === 13)) || e.ctrlKey) {
return;
}
e.preventDefault();
@@ -7804,7 +7794,7 @@
innerHTML: " " + name
});
input = label.firstElementChild;
- if (['Fit Width', 'Fit Height', 'Hide Thumbnails'].contains(name)) {
+ if (name === 'Fit Width' || name === 'Fit Height' || name === 'Hide Thumbnails') {
$.on(input, 'change', Gallery.cb.setFitness);
}
input.checked = Conf[name];
@@ -7861,7 +7851,7 @@
return ImageExpand.toggle(Get.postFromNode(this));
},
toggleAll: function() {
- var ID, file, func, post, _i, _len, _ref, _ref1;
+ var ID, file, func, post, _i, _len, _ref, _ref1, _ref2;
$.event('CloseMenu');
if (ImageExpand.on = $.hasClass(ImageExpand.EAI, 'expand-all-shortcut')) {
@@ -7880,7 +7870,7 @@
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
post = _ref1[_i];
file = post.file;
- if (!(file && file.isImage && doc.contains(post.nodes.root))) {
+ if (!(file && file.isImage && (_ref2 = post.nodes.root, __indexOf.call(doc, _ref2) >= 0))) {
continue;
}
if (ImageExpand.on && (!Conf['Expand spoilers'] && file.isSpoiler || Conf['Expand from here'] && Header.getTopOf(file.thumb) < 0)) {
@@ -8124,7 +8114,7 @@
var URL, post, src, timeoutID,
_this = this;
- if (!doc.contains(this)) {
+ if (__indexOf.call(doc, this) < 0) {
return;
}
post = g.posts[this.dataset.fullID];
@@ -9130,12 +9120,12 @@
for (ID in _ref) {
post = _ref[ID];
ID = +ID;
- if (post.isDead && index.contains(ID)) {
- post.resurrect();
- } else if (!index.contains(ID)) {
+ if (__indexOf.call(index, ID) < 0) {
post.kill();
deletedPosts.push(post);
- } else if (post.file && !post.file.isDead && !files.contains(ID)) {
+ } else if (post.isDead) {
+ post.resurrect();
+ } else if (post.file && !(post.file.isDead && __indexOf.call(files, ID) >= 0)) {
post.kill(true);
deletedFiles.push(post);
}
@@ -9815,7 +9805,7 @@
return Unread.update();
},
addPosts: function(posts) {
- var ID, data, post, _i, _len;
+ var ID, data, post, _i, _len, _ref;
for (_i = 0, _len = posts.length; _i < _len; _i++) {
post = posts[_i];
@@ -9837,7 +9827,7 @@
Unread.addPostQuotingYou(post);
}
if (Conf['Unread Line']) {
- Unread.setLine(posts.contains(Unread.posts[0]));
+ Unread.setLine((_ref = Unread.posts[0], __indexOf.call(posts, _ref) >= 0));
}
Unread.read();
return Unread.update();
@@ -10002,7 +9992,7 @@
file: {}
},
init: function() {
- var archive, boardID, boards, data, id, name, type, _i, _len, _ref, _ref1, _ref2;
+ var archive, boardID, boards, data, id, name, type, _i, _len, _ref, _ref1, _ref2, _ref3;
_ref = Conf['selectedArchives'];
for (boardID in _ref) {
@@ -10011,7 +10001,7 @@
id = data[type];
if (archive = Redirect.archives[id]) {
boards = archive[type] || archive['boards'];
- if (!boards.contains(boardID)) {
+ if (__indexOf.call(boards, boardID) < 0) {
continue;
}
Redirect.data[type][boardID] = archive;
@@ -10030,7 +10020,7 @@
if (!(boardID in Redirect.data.post || archive.software !== 'foolfuuka')) {
Redirect.data.post[boardID] = archive;
}
- if (!(boardID in Redirect.data.file || !archive.files.contains(boardID))) {
+ if (!(boardID in Redirect.data.file || (_ref3 = !boardID, __indexOf.call(archive.files, _ref3) >= 0))) {
Redirect.data.file[boardID] = archive;
}
}
@@ -10394,7 +10384,7 @@
return CatalogLinks.set(this.checked);
},
set: function(useCatalog) {
- var a, board, generateURL, path, _i, _len, _ref;
+ var a, board, generateURL, path, _i, _len, _ref, _ref1;
path = useCatalog ? 'catalog' : '';
generateURL = useCatalog && Conf['External Catalog'] ? CatalogLinks.external : function(board) {
@@ -10403,7 +10393,7 @@
_ref = $$("#board-list a:not(.catalog), #boardNavDesktopFoot a");
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
a = _ref[_i];
- if (!['boards.4chan.org', 'catalog.neet.tv', '4index.gropes.us'].contains(a.hostname) || !(board = a.pathname.split('/')[1]) || ['f', 'status', '4chan'].contains(board)) {
+ if (((_ref1 = !a.hostname) === 'boards.4chan.org' || _ref1 === 'catalog.neet.tv' || _ref1 === '4index.gropes.us') || !(board = a.pathname.split('/')[1]) || (board === 'f' || board === 'status' || board === '4chan')) {
continue;
}
a.href = generateURL(board);
@@ -10634,7 +10624,7 @@
var callback, clone, comment, href, postObj, posts, quote, spoilerRange, status, _i, _j, _k, _len, _len1, _len2, _ref, _ref1;
status = req.status;
- if (![200, 304].contains(status)) {
+ if (status !== 200 && status !== 304) {
a.textContent = "Error " + req.statusText + " (" + status + ")";
return;
}
@@ -11243,13 +11233,13 @@
return Conf[hotkey] = key;
},
keydown: function(e) {
- var key, notification, notifications, op, target, thread, threadRoot, _i, _len;
+ var key, notification, notifications, op, target, thread, threadRoot, _i, _len, _ref;
if (!(key = Keybinds.keyCode(e))) {
return;
}
target = e.target;
- if (['INPUT', 'TEXTAREA'].contains(target.nodeName)) {
+ if ((_ref = target.nodeName) === 'INPUT' || _ref === 'TEXTAREA') {
if (!/(Esc|Alt|Ctrl|Meta|Shift\+\w{2,})/.test(key)) {
return;
}
@@ -12350,7 +12340,7 @@
input = $("[name=" + name + "]", section);
items[name] = Conf[name];
inputs[name] = input;
- event = ['favicon', 'usercss', 'sageEmoji', 'emojiPos'].contains(name) ? 'change' : 'input';
+ event = name === 'favicon' || name === 'usercss' || name === 'sageEmoji' || name === 'emojiPos' ? 'change' : 'input';
$.on(input, event, $.cb.value);
}
ta = $('.personafield', section);
@@ -12363,7 +12353,7 @@
for (key in items) {
val = items[key];
- if (['emojiPos'].contains(key)) {
+ if (key === 'emojiPos') {
continue;
}
input = inputs[key];
@@ -12394,7 +12384,7 @@
if (archive.software === 'foolfuuka') {
data.post.push(name);
}
- if (archive.files.contains(boardID)) {
+ if (__indexOf.call(archive.files, boardID) >= 0) {
data.file.push(name);
}
}
@@ -12648,9 +12638,9 @@
return;
case 'i.4cdn.org':
$.ready(function() {
- var URL;
+ var URL, _ref1;
- if (Conf['404 Redirect'] && ['4chan - Temporarily Offline', '4chan - 404 Not Found'].contains(d.title)) {
+ if (Conf['404 Redirect'] && ((_ref1 = d.title) === '4chan - Temporarily Offline' || _ref1 === '4chan - 404 Not Found')) {
Redirect.init();
pathname = location.pathname.split('/');
URL = Redirect.to('file', {
@@ -12790,9 +12780,9 @@
});
},
initReady: function() {
- var GMver, err, errors, href, i, passLink, postRoot, posts, styleSelector, thread, threadRoot, v, _i, _j, _len, _len1, _ref, _ref1;
+ var GMver, err, errors, href, i, passLink, postRoot, posts, styleSelector, thread, threadRoot, v, _i, _j, _len, _len1, _ref, _ref1, _ref2;
- if (['4chan - Temporarily Offline', '4chan - 404 Not Found'].contains(d.title)) {
+ if ((_ref = d.title) === '4chan - Temporarily Offline' || _ref === '4chan - 404 Not Found') {
if (Conf['404 Redirect'] && g.VIEW === 'thread') {
href = Redirect.to('thread', {
boardID: g.BOARD.ID,
@@ -12807,9 +12797,9 @@
if (g.VIEW === 'thread' && (threadRoot = $('.thread'))) {
thread = new Thread(+threadRoot.id.slice(1), g.BOARD);
posts = [];
- _ref = $$('.thread > .postContainer', threadRoot);
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- postRoot = _ref[_i];
+ _ref1 = $$('.thread > .postContainer', threadRoot);
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
+ postRoot = _ref1[_i];
try {
posts.push(new Post(postRoot, thread, g.BOARD));
} catch (_error) {
@@ -12843,9 +12833,9 @@
return;
}
GMver = GM_info.version.split('.');
- _ref1 = "1.12".split('.');
- for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) {
- v = _ref1[i];
+ _ref2 = "1.12".split('.');
+ for (i = _j = 0, _len1 = _ref2.length; _j < _len1; i = ++_j) {
+ v = _ref2[i];
if (v < GMver[i]) {
break;
}
diff --git a/builds/crx/script.js b/builds/crx/script.js
index 2deb7737b..f9865a9ab 100644
--- a/builds/crx/script.js
+++ b/builds/crx/script.js
@@ -1,6 +1,6 @@
// Generated by CoffeeScript
/*
-* 4chan X - Version 1.2.44 - 2013-12-21
+* 4chan X - Version 1.2.44 - 2013-12-24
*
* Licensed under the MIT license.
* https://github.com/seaweedchan/4chan-x/blob/master/LICENSE
@@ -83,8 +83,8 @@
(function() {
var $, $$, Anonymize, ArchiveLink, AutoGIF, Banner, Board, Build, CatalogLinks, Clone, Conf, Config, CustomCSS, DataBoard, DeleteLink, Dice, DownloadLink, Emoji, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Fourchan, Gallery, Get, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Index, InfiniScroll, Keybinds, Linkify, Main, Menu, Nav, Notice, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, Thread, ThreadExcerpt, ThreadHiding, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, c, d, doc, g,
- __slice = [].slice,
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
+ __slice = [].slice,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
@@ -330,24 +330,12 @@
posts: {}
};
- String.prototype.capitalize = function() {
- return this.charAt(0).toUpperCase() + this.slice(1);
- };
-
- String.prototype.contains = function(string) {
- return this.indexOf(string) > -1;
- };
-
- Array.prototype.contains = function(object) {
- return this.indexOf(object) > -1;
- };
-
- Array.prototype.indexOf = function(object) {
+ Array.prototype.indexOf = function(val) {
var i;
i = this.length;
while (i--) {
- if (this[i] === object) {
+ if (this[i] === val) {
return i;
}
}
@@ -361,15 +349,14 @@
return root.querySelector(selector);
};
- $.extend = function(object, properties) {
+ $.extend = function(obj, prop) {
var key, val;
- for (key in properties) {
- val = properties[key];
- if (!properties.hasOwnProperty(key)) {
- continue;
+ for (key in prop) {
+ val = prop[key];
+ if (prop.hasOwnProperty(key)) {
+ obj[key] = val;
}
- object[key] = val;
}
};
@@ -549,7 +536,7 @@
};
$.hasClass = function(el, className) {
- return el.classList.contains(className);
+ return __indexOf.call(el.classList, className) >= 0;
};
$.rm = (function() {
@@ -1070,7 +1057,7 @@
return;
}
fullID = "" + match[1] + "." + match[2];
- if (!this.quotes.contains(fullID)) {
+ if (__indexOf.call(this.quotes, fullID) < 0) {
return this.quotes.push(fullID);
}
};
@@ -2977,38 +2964,38 @@
};
},
allQuotelinksLinkingTo: function(post) {
- var ID, quote, quotedPost, quotelinks, quoterPost, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3;
+ var ID, quote, quotedPost, quotelinks, quoterPost, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3, _ref4;
quotelinks = [];
_ref = g.posts;
for (ID in _ref) {
quoterPost = _ref[ID];
- if (quoterPost.quotes.contains(post.fullID)) {
- _ref1 = [quoterPost].concat(quoterPost.clones);
- for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
- quoterPost = _ref1[_i];
+ if (_ref1 = post.fullID, __indexOf.call(quoterPost.quotes, _ref1) >= 0) {
+ _ref2 = [quoterPost].concat(quoterPost.clones);
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
+ quoterPost = _ref2[_i];
quotelinks.push.apply(quotelinks, quoterPost.nodes.quotelinks);
}
}
}
if (Conf['Quote Backlinks']) {
- _ref2 = post.quotes;
- for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
- quote = _ref2[_j];
+ _ref3 = post.quotes;
+ for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {
+ quote = _ref3[_j];
if (!(quotedPost = g.posts[quote])) {
continue;
}
- _ref3 = [quotedPost].concat(quotedPost.clones);
- for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {
- quotedPost = _ref3[_k];
+ _ref4 = [quotedPost].concat(quotedPost.clones);
+ for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) {
+ quotedPost = _ref4[_k];
quotelinks.push.apply(quotelinks, __slice.call(quotedPost.nodes.backlinks));
}
}
}
return quotelinks.filter(function(quotelink) {
- var boardID, postID, _ref4;
+ var boardID, postID, _ref5;
- _ref4 = Get.postDataFromLink(quotelink), boardID = _ref4.boardID, postID = _ref4.postID;
+ _ref5 = Get.postDataFromLink(quotelink), boardID = _ref5.boardID, postID = _ref5.postID;
return boardID === post.board.ID && postID === post.ID;
});
},
@@ -3057,7 +3044,7 @@
return;
}
status = req.status;
- if (![200, 304].contains(status)) {
+ if (status !== 200 && status !== 304) {
if (url = Redirect.to('post', {
boardID: boardID,
postID: postID
@@ -3654,7 +3641,7 @@
Filter = {
filters: {},
init: function() {
- var boards, err, filter, hl, key, op, regexp, stub, top, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4;
+ var boards, err, filter, hl, key, op, regexp, stub, top, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
if (g.VIEW === 'catalog' || !Conf['Filter']) {
return;
@@ -3675,10 +3662,10 @@
}
filter = filter.replace(regexp[0], '');
boards = ((_ref1 = filter.match(/boards:([^;]+)/)) != null ? _ref1[1].toLowerCase() : void 0) || 'global';
- if (boards !== 'global' && !(boards.split(',')).contains(g.BOARD.ID)) {
+ if (boards !== 'global' && (_ref2 = !g.BOARD.ID, __indexOf.call(boards.split(','), _ref2) >= 0)) {
continue;
}
- if (['uniqueID', 'MD5'].contains(key)) {
+ if (key === 'uniqueID' || key === 'MD5') {
regexp = regexp[1];
} else {
try {
@@ -3689,11 +3676,11 @@
continue;
}
}
- op = ((_ref2 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref2[1] : void 0) || 'yes';
+ op = ((_ref3 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref3[1] : void 0) || 'yes';
stub = (function() {
- var _ref3;
+ var _ref4;
- switch ((_ref3 = filter.match(/stub:(yes|no)/)) != null ? _ref3[1] : void 0) {
+ switch ((_ref4 = filter.match(/stub:(yes|no)/)) != null ? _ref4[1] : void 0) {
case 'yes':
return true;
case 'no':
@@ -3703,8 +3690,8 @@
}
})();
if (hl = /highlight/.test(filter)) {
- hl = ((_ref3 = filter.match(/highlight:(\w+)/)) != null ? _ref3[1] : void 0) || 'filter-highlight';
- top = ((_ref4 = filter.match(/top:(yes|no)/)) != null ? _ref4[1] : void 0) || 'yes';
+ hl = ((_ref4 = filter.match(/highlight:(\w+)/)) != null ? _ref4[1] : void 0) || 'filter-highlight';
+ top = ((_ref5 = filter.match(/top:(yes|no)/)) != null ? _ref5[1] : void 0) || 'yes';
top = top === 'yes';
}
this.filters[key].push(this.createFilter(regexp, op, stub, hl, top));
@@ -3902,7 +3889,7 @@
type = this.dataset.type;
value = Filter[type](Filter.menu.post);
- re = ['uniqueID', 'MD5'].contains(type) ? value : value.replace(/\/|\\|\^|\$|\n|\.|\(|\)|\{|\}|\[|\]|\?|\*|\+|\|/g, function(c) {
+ re = type === 'uniqueID' || type === 'MD5' ? value : value.replace(/\/|\\|\^|\$|\n|\.|\(|\)|\{|\}|\[|\]|\?|\*|\+|\|/g, function(c) {
if (c === '\n') {
return '\\n';
} else if (c === '\\') {
@@ -3911,7 +3898,7 @@
return "\\" + c;
}
});
- re = ['uniqueID', 'MD5'].contains(type) ? "/" + re + "/" : "/^" + re + "$/";
+ re = type === 'uniqueID' || type === 'MD5' ? "/" + re + "/" : "/^" + re + "$/";
return $.get(type, Conf[type], function(item) {
var save, section, select, ta, tl;
@@ -4301,7 +4288,7 @@
_ref = g.posts;
for (ID in _ref) {
post = _ref[ID];
- if (post.quotes.contains(fullID)) {
+ if (__indexOf.call(post.quotes, fullID) >= 0) {
recursive.apply(null, [post].concat(__slice.call(args)));
}
}
@@ -4336,7 +4323,7 @@
return $.prepend(this.OP.nodes.root, ThreadHiding.makeButton(this, 'hide'));
},
onIndexBuild: function(_arg) {
- var i, nodes, root, thread, _i, _len;
+ var i, nodes, root, thread, _i, _len, _ref;
nodes = _arg.detail;
for (i = _i = 0, _len = nodes.length; _i < _len; i = _i += 2) {
@@ -4347,7 +4334,7 @@
}
if (!thread.stub) {
nodes[i + 1].hidden = true;
- } else if (!root.contains(thread.stub)) {
+ } else if (_ref = thread.stub, __indexOf.call(root, _ref) < 0) {
ThreadHiding.makeStub(thread, root);
}
}
@@ -4862,7 +4849,7 @@
});
},
node: function() {
- var boardID, fullID, i, postID, quotelink, quotelinks, quotes, _ref;
+ var boardID, fullID, i, postID, quotelink, quotelinks, quotes, _ref, _ref1;
if (this.isClone && this.thread === this.context.thread) {
return;
@@ -4871,19 +4858,19 @@
return;
}
quotelinks = this.nodes.quotelinks;
- if (this.isClone && quotes.contains(this.thread.fullID)) {
+ if (this.isClone && (_ref = this.thread.fullID, __indexOf.call(quotes, _ref) >= 0)) {
i = 0;
while (quotelink = quotelinks[i++]) {
quotelink.textContent = quotelink.textContent.replace(QuoteOP.text, '');
}
}
fullID = (this.isClone ? this.context : this).thread.fullID;
- if (!quotes.contains(fullID)) {
+ if (__indexOf.call(quotes, fullID) < 0) {
return;
}
i = 0;
while (quotelink = quotelinks[i++]) {
- _ref = Get.postDataFromLink(quotelink), boardID = _ref.boardID, postID = _ref.postID;
+ _ref1 = Get.postDataFromLink(quotelink), boardID = _ref1.boardID, postID = _ref1.postID;
if (("" + boardID + "." + postID) === fullID) {
$.add(quotelink, $.tn(QuoteOP.text));
}
@@ -5088,7 +5075,7 @@
if (QuoteThreading.hasRun) {
height = doc.clientHeight;
_ref = qpost.nodes.root.getBoundingClientRect(), bottom = _ref.bottom, top = _ref.top;
- if (!(Unread.posts.contains(qpost) || ((bottom < height) && (top > 0)))) {
+ if (!(__indexOf.call(Unread.posts, qpost) >= 0 || ((bottom < height) && (top > 0)))) {
return false;
}
}
@@ -5325,12 +5312,11 @@
});
}
}
- if (!this.quotes.contains(quoteID)) {
+ if (__indexOf.call(this.quotes, quoteID) < 0) {
this.quotes.push(quoteID);
}
if (!a) {
- deadlink.textContent = "" + quote + "\u00A0(Dead)";
- return;
+ return deadlink.textContent = "" + quote + "\u00A0(Dead)";
}
$.replace(deadlink, a);
if ($.hasClass(a, 'quotelink')) {
@@ -5711,7 +5697,7 @@
var embed, file, files, status, type, _i, _j, _len, _len1, _ref;
status = this.status;
- if (![200, 304].contains(status)) {
+ if (status !== 200 && status !== 304) {
return div.innerHTML = "ERROR " + status;
}
files = JSON.parse(this.response).files;
@@ -6161,7 +6147,7 @@
});
},
parseItem: function(item, types) {
- var boards, match, type, val, _ref, _ref1;
+ var boards, match, type, val, _ref, _ref1, _ref2;
if (item[0] === '#') {
return;
@@ -6172,7 +6158,7 @@
_ref = match, match = _ref[0], type = _ref[1], val = _ref[2];
item = item.replace(match, '');
boards = ((_ref1 = item.match(/boards:([^;]+)/i)) != null ? _ref1[1].toLowerCase() : void 0) || 'global';
- if (boards !== 'global' && !((boards.split(',')).contains(g.BOARD.ID))) {
+ if (boards !== 'global' && (_ref2 = !g.BOARD.ID, __indexOf.call(boards.split(','), _ref2) >= 0)) {
return;
}
if (type === 'password') {
@@ -6185,7 +6171,7 @@
if (/always/i.test(item)) {
QR.persona.always[type] = val;
}
- if (!types[type].contains(val)) {
+ if (__indexOf.call(types[type], val) < 0) {
return types[type].push(val);
}
},
@@ -6483,12 +6469,12 @@
}
},
handleFile: function(file, isSingle, max) {
- var post;
+ var post, _ref;
if (file.size > max) {
QR.error("" + file.name + ": File too large (file: " + ($.bytesToString(file.size)) + ", max: " + ($.bytesToString(max)) + ").");
return;
- } else if (!QR.mimeTypes.contains(file.type)) {
+ } else if (_ref = file.type, __indexOf.call(QR.mimeTypes, _ref) < 0) {
if (!/^text/.test(file.type)) {
QR.error("" + file.name + ": Unsupported file type.");
return;
@@ -6509,6 +6495,8 @@
return post.setFile(file);
},
openFileInput: function(e) {
+ var _ref;
+
e.stopPropagation();
if (e.shiftKey && e.type === 'click') {
return QR.selected.rmFile();
@@ -6520,7 +6508,7 @@
return $.rmClass(QR.nodes.filename, 'edit');
});
}
- if (e.target.nodeName === 'INPUT' || (e.keyCode && ![32, 13].contains(e.keyCode)) || e.ctrlKey) {
+ if (e.target.nodeName === 'INPUT' || (e.keyCode && ((_ref = !e.keyCode) === 32 || _ref === 13)) || e.ctrlKey) {
return;
}
e.preventDefault();
@@ -7789,7 +7777,7 @@
innerHTML: " " + name
});
input = label.firstElementChild;
- if (['Fit Width', 'Fit Height', 'Hide Thumbnails'].contains(name)) {
+ if (name === 'Fit Width' || name === 'Fit Height' || name === 'Hide Thumbnails') {
$.on(input, 'change', Gallery.cb.setFitness);
}
input.checked = Conf[name];
@@ -7846,7 +7834,7 @@
return ImageExpand.toggle(Get.postFromNode(this));
},
toggleAll: function() {
- var ID, file, func, post, _i, _len, _ref, _ref1;
+ var ID, file, func, post, _i, _len, _ref, _ref1, _ref2;
$.event('CloseMenu');
if (ImageExpand.on = $.hasClass(ImageExpand.EAI, 'expand-all-shortcut')) {
@@ -7865,7 +7853,7 @@
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
post = _ref1[_i];
file = post.file;
- if (!(file && file.isImage && doc.contains(post.nodes.root))) {
+ if (!(file && file.isImage && (_ref2 = post.nodes.root, __indexOf.call(doc, _ref2) >= 0))) {
continue;
}
if (ImageExpand.on && (!Conf['Expand spoilers'] && file.isSpoiler || Conf['Expand from here'] && Header.getTopOf(file.thumb) < 0)) {
@@ -8109,7 +8097,7 @@
var URL, post, src, timeoutID,
_this = this;
- if (!doc.contains(this)) {
+ if (__indexOf.call(doc, this) < 0) {
return;
}
post = g.posts[this.dataset.fullID];
@@ -9115,12 +9103,12 @@
for (ID in _ref) {
post = _ref[ID];
ID = +ID;
- if (post.isDead && index.contains(ID)) {
- post.resurrect();
- } else if (!index.contains(ID)) {
+ if (__indexOf.call(index, ID) < 0) {
post.kill();
deletedPosts.push(post);
- } else if (post.file && !post.file.isDead && !files.contains(ID)) {
+ } else if (post.isDead) {
+ post.resurrect();
+ } else if (post.file && !(post.file.isDead && __indexOf.call(files, ID) >= 0)) {
post.kill(true);
deletedFiles.push(post);
}
@@ -9800,7 +9788,7 @@
return Unread.update();
},
addPosts: function(posts) {
- var ID, data, post, _i, _len;
+ var ID, data, post, _i, _len, _ref;
for (_i = 0, _len = posts.length; _i < _len; _i++) {
post = posts[_i];
@@ -9822,7 +9810,7 @@
Unread.addPostQuotingYou(post);
}
if (Conf['Unread Line']) {
- Unread.setLine(posts.contains(Unread.posts[0]));
+ Unread.setLine((_ref = Unread.posts[0], __indexOf.call(posts, _ref) >= 0));
}
Unread.read();
return Unread.update();
@@ -9993,7 +9981,7 @@
file: {}
},
init: function() {
- var archive, boardID, boards, data, id, name, type, _i, _len, _ref, _ref1, _ref2;
+ var archive, boardID, boards, data, id, name, type, _i, _len, _ref, _ref1, _ref2, _ref3;
_ref = Conf['selectedArchives'];
for (boardID in _ref) {
@@ -10002,7 +9990,7 @@
id = data[type];
if (archive = Redirect.archives[id]) {
boards = archive[type] || archive['boards'];
- if (!boards.contains(boardID)) {
+ if (__indexOf.call(boards, boardID) < 0) {
continue;
}
Redirect.data[type][boardID] = archive;
@@ -10021,7 +10009,7 @@
if (!(boardID in Redirect.data.post || archive.software !== 'foolfuuka')) {
Redirect.data.post[boardID] = archive;
}
- if (!(boardID in Redirect.data.file || !archive.files.contains(boardID))) {
+ if (!(boardID in Redirect.data.file || (_ref3 = !boardID, __indexOf.call(archive.files, _ref3) >= 0))) {
Redirect.data.file[boardID] = archive;
}
}
@@ -10385,7 +10373,7 @@
return CatalogLinks.set(this.checked);
},
set: function(useCatalog) {
- var a, board, generateURL, path, _i, _len, _ref;
+ var a, board, generateURL, path, _i, _len, _ref, _ref1;
path = useCatalog ? 'catalog' : '';
generateURL = useCatalog && Conf['External Catalog'] ? CatalogLinks.external : function(board) {
@@ -10394,7 +10382,7 @@
_ref = $$("#board-list a:not(.catalog), #boardNavDesktopFoot a");
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
a = _ref[_i];
- if (!['boards.4chan.org', 'catalog.neet.tv', '4index.gropes.us'].contains(a.hostname) || !(board = a.pathname.split('/')[1]) || ['f', 'status', '4chan'].contains(board)) {
+ if (((_ref1 = !a.hostname) === 'boards.4chan.org' || _ref1 === 'catalog.neet.tv' || _ref1 === '4index.gropes.us') || !(board = a.pathname.split('/')[1]) || (board === 'f' || board === 'status' || board === '4chan')) {
continue;
}
a.href = generateURL(board);
@@ -10625,7 +10613,7 @@
var callback, clone, comment, href, postObj, posts, quote, spoilerRange, status, _i, _j, _k, _len, _len1, _len2, _ref, _ref1;
status = req.status;
- if (![200, 304].contains(status)) {
+ if (status !== 200 && status !== 304) {
a.textContent = "Error " + req.statusText + " (" + status + ")";
return;
}
@@ -11234,13 +11222,13 @@
return Conf[hotkey] = key;
},
keydown: function(e) {
- var key, notification, notifications, op, target, thread, threadRoot, _i, _len;
+ var key, notification, notifications, op, target, thread, threadRoot, _i, _len, _ref;
if (!(key = Keybinds.keyCode(e))) {
return;
}
target = e.target;
- if (['INPUT', 'TEXTAREA'].contains(target.nodeName)) {
+ if ((_ref = target.nodeName) === 'INPUT' || _ref === 'TEXTAREA') {
if (!/(Esc|Alt|Ctrl|Meta|Shift\+\w{2,})/.test(key)) {
return;
}
@@ -12339,7 +12327,7 @@
input = $("[name=" + name + "]", section);
items[name] = Conf[name];
inputs[name] = input;
- event = ['favicon', 'usercss', 'sageEmoji', 'emojiPos'].contains(name) ? 'change' : 'input';
+ event = name === 'favicon' || name === 'usercss' || name === 'sageEmoji' || name === 'emojiPos' ? 'change' : 'input';
$.on(input, event, $.cb.value);
}
ta = $('.personafield', section);
@@ -12352,7 +12340,7 @@
for (key in items) {
val = items[key];
- if (['emojiPos'].contains(key)) {
+ if (key === 'emojiPos') {
continue;
}
input = inputs[key];
@@ -12383,7 +12371,7 @@
if (archive.software === 'foolfuuka') {
data.post.push(name);
}
- if (archive.files.contains(boardID)) {
+ if (__indexOf.call(archive.files, boardID) >= 0) {
data.file.push(name);
}
}
@@ -12637,9 +12625,9 @@
return;
case 'i.4cdn.org':
$.ready(function() {
- var URL;
+ var URL, _ref1;
- if (Conf['404 Redirect'] && ['4chan - Temporarily Offline', '4chan - 404 Not Found'].contains(d.title)) {
+ if (Conf['404 Redirect'] && ((_ref1 = d.title) === '4chan - Temporarily Offline' || _ref1 === '4chan - 404 Not Found')) {
Redirect.init();
pathname = location.pathname.split('/');
URL = Redirect.to('file', {
@@ -12779,9 +12767,9 @@
});
},
initReady: function() {
- var err, errors, href, passLink, postRoot, posts, styleSelector, thread, threadRoot, _i, _len, _ref;
+ var err, errors, href, passLink, postRoot, posts, styleSelector, thread, threadRoot, _i, _len, _ref, _ref1;
- if (['4chan - Temporarily Offline', '4chan - 404 Not Found'].contains(d.title)) {
+ if ((_ref = d.title) === '4chan - Temporarily Offline' || _ref === '4chan - 404 Not Found') {
if (Conf['404 Redirect'] && g.VIEW === 'thread') {
href = Redirect.to('thread', {
boardID: g.BOARD.ID,
@@ -12796,9 +12784,9 @@
if (g.VIEW === 'thread' && (threadRoot = $('.thread'))) {
thread = new Thread(+threadRoot.id.slice(1), g.BOARD);
posts = [];
- _ref = $$('.thread > .postContainer', threadRoot);
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- postRoot = _ref[_i];
+ _ref1 = $$('.thread > .postContainer', threadRoot);
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
+ postRoot = _ref1[_i];
try {
posts.push(new Post(postRoot, thread, g.BOARD));
} catch (_error) {
diff --git a/src/Archive/Redirect.coffee b/src/Archive/Redirect.coffee
index 9e1afb20a..b4aa7137b 100755
--- a/src/Archive/Redirect.coffee
+++ b/src/Archive/Redirect.coffee
@@ -9,7 +9,7 @@ Redirect =
for type, id of data
if archive = Redirect.archives[id]
boards = archive[type] or archive['boards']
- continue unless boards.contains boardID
+ continue unless boardID in boards
Redirect.data[type][boardID] = archive
for name, archive of Redirect.archives
for boardID in archive.boards
@@ -17,7 +17,7 @@ Redirect =
Redirect.data.thread[boardID] = archive
unless boardID of Redirect.data.post or archive.software isnt 'foolfuuka'
Redirect.data.post[boardID] = archive
- unless boardID of Redirect.data.file or !archive.files.contains boardID
+ unless boardID of Redirect.data.file or not boardID in archive.files
Redirect.data.file[boardID] = archive
return
diff --git a/src/Filtering/Filter.coffee b/src/Filtering/Filter.coffee
index 75703686a..e6a8bd27f 100755
--- a/src/Filtering/Filter.coffee
+++ b/src/Filtering/Filter.coffee
@@ -21,10 +21,10 @@ Filter =
# and it's not specifically applicable to the current board.
# Defaults to global.
boards = filter.match(/boards:([^;]+)/)?[1].toLowerCase() or 'global'
- if boards isnt 'global' and not (boards.split ',').contains g.BOARD.ID
+ if boards isnt 'global' and not g.BOARD.ID in boards.split ','
continue
- if ['uniqueID', 'MD5'].contains key
+ if key in ['uniqueID', 'MD5']
# MD5 filter will use strings instead of regular expressions.
regexp = regexp[1]
else
@@ -218,7 +218,7 @@ Filter =
{type} = @dataset
# Convert value -> regexp, unless type is MD5
value = Filter[type] Filter.menu.post
- re = if ['uniqueID', 'MD5'].contains type then value else value.replace ///
+ re = if type in ['uniqueID', 'MD5'] then value else value.replace ///
/
| \\
| \^
@@ -243,7 +243,7 @@ Filter =
else
"\\#{c}"
- re = if ['uniqueID', 'MD5'].contains type
+ re = if type in ['uniqueID', 'MD5']
"/#{re}/"
else
"/^#{re}$/"
diff --git a/src/Filtering/Recursive.coffee b/src/Filtering/Recursive.coffee
index 71a27713b..da5496ceb 100755
--- a/src/Filtering/Recursive.coffee
+++ b/src/Filtering/Recursive.coffee
@@ -33,6 +33,6 @@ Recursive =
apply: (recursive, post, args...) ->
{fullID} = post
for ID, post of g.posts
- if post.quotes.contains fullID
+ if fullID in post.quotes
recursive post, args...
return
diff --git a/src/Filtering/ThreadHiding.coffee b/src/Filtering/ThreadHiding.coffee
index d803c22bc..2400f55ed 100755
--- a/src/Filtering/ThreadHiding.coffee
+++ b/src/Filtering/ThreadHiding.coffee
@@ -21,7 +21,7 @@ ThreadHiding =
continue unless thread.isHidden
unless thread.stub
nodes[i + 1].hidden = true
- else unless root.contains thread.stub
+ else unless thread.stub in root
# When we come back to a page, the stub is already there.
ThreadHiding.makeStub thread, root
return
diff --git a/src/General/Get.coffee b/src/General/Get.coffee
index caf1005e9..5ea979b9a 100755
--- a/src/General/Get.coffee
+++ b/src/General/Get.coffee
@@ -45,7 +45,7 @@ Get =
# if it did quote this post,
# get all their backlinks.
for ID, quoterPost of g.posts
- if quoterPost.quotes.contains post.fullID
+ if post.fullID in quoterPost.quotes
for quoterPost in [quoterPost].concat quoterPost.clones
quotelinks.push.apply quotelinks, quoterPost.nodes.quotelinks
# Second:
@@ -98,7 +98,7 @@ Get =
return
{status} = req
- unless [200, 304].contains status
+ unless status in [200, 304]
# The thread can die by the time we check a quote.
if url = Redirect.to 'post', {boardID, postID}
$.cache url,
diff --git a/src/General/Main.coffee b/src/General/Main.coffee
index 2065812cd..affecb3e7 100755
--- a/src/General/Main.coffee
+++ b/src/General/Main.coffee
@@ -49,7 +49,7 @@ Main =
return
when 'i.4cdn.org'
$.ready ->
- if Conf['404 Redirect'] and ['4chan - Temporarily Offline', '4chan - 404 Not Found'].contains d.title
+ if Conf['404 Redirect'] and d.title in ['4chan - Temporarily Offline', '4chan - 404 Not Found']
Redirect.init()
pathname = location.pathname.split '/'
URL = Redirect.to 'file',
@@ -174,7 +174,7 @@ Main =
attributeFilter: ['href']
initReady: ->
- if ['4chan - Temporarily Offline', '4chan - 404 Not Found'].contains d.title
+ if d.title in ['4chan - Temporarily Offline', '4chan - 404 Not Found']
if Conf['404 Redirect'] and g.VIEW is 'thread'
href = Redirect.to 'thread',
boardID: g.BOARD.ID
diff --git a/src/General/Settings.coffee b/src/General/Settings.coffee
index 02adff143..a7f944a24 100755
--- a/src/General/Settings.coffee
+++ b/src/General/Settings.coffee
@@ -307,7 +307,7 @@ Settings =
input = $ "[name=#{name}]", section
items[name] = Conf[name]
inputs[name] = input
- event = if ['favicon', 'usercss', 'sageEmoji', 'emojiPos'].contains name
+ event = if name in ['favicon', 'usercss', 'sageEmoji', 'emojiPos']
'change'
else
'input'
@@ -321,7 +321,7 @@ Settings =
$.get items, (items) ->
for key, val of items
- continue if ['emojiPos'].contains key
+ continue if key is 'emojiPos'
input = inputs[key]
input.value = val
continue if key is 'usercss'
@@ -342,7 +342,7 @@ Settings =
file: []
data.thread.push name
data.post.push name if archive.software is 'foolfuuka'
- data.file.push name if archive.files.contains boardID
+ data.file.push name if boardID in archive.files
rows = []
boardOptions = []
diff --git a/src/General/UI.coffee b/src/General/UI.coffee
index 2636bf415..844212ffe 100755
--- a/src/General/UI.coffee
+++ b/src/General/UI.coffee
@@ -326,7 +326,7 @@ UI = do ->
$.on root, 'mousemove', o.hover
<% if (type === 'userscript') { %>
# Workaround for https://github.com/MayhemYDG/4chan-x/issues/377
- o.workaround = (e) -> o.hoverend() unless root.contains e.target
+ o.workaround = (e) -> o.hoverend() unless e.target in root
$.on doc, 'mousemove', o.workaround
<% } %>
diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee
index c875138b2..77f57d307 100755
--- a/src/General/lib/$.coffee
+++ b/src/General/lib/$.coffee
@@ -1,16 +1,7 @@
-String::capitalize = ->
- @charAt(0).toUpperCase() + @slice(1);
-
-String::contains = (string) ->
- @indexOf(string) > -1
-
-Array::contains = (object) ->
- @indexOf(object) > -1
-
-Array::indexOf = (object) ->
+Array::indexOf = (val) ->
i = @length
while i--
- return i if @[i] is object
+ return i if @[i] is val
return i
# loosely follows the jquery api:
@@ -19,13 +10,14 @@ Array::indexOf = (object) ->
$ = (selector, root=d.body) ->
root.querySelector selector
-$.extend = (object, properties) ->
- for key, val of properties
- continue unless properties.hasOwnProperty key
- object[key] = val
+$.extend = (obj, prop) ->
+ obj[key] = val for key, val of prop when prop.hasOwnProperty key
return
-$.DAY = 24 * ($.HOUR = 60 * ($.MINUTE = 60 * ($.SECOND = 1000)))
+$.DAY = 24 *
+ $.HOUR = 60 *
+ $.MINUTE = 60 *
+ $.SECOND = 1000
$.id = (id) ->
d.getElementById id
@@ -137,7 +129,7 @@ $.toggleClass = (el, className) ->
el.classList.toggle className
$.hasClass = (el, className) ->
- el.classList.contains className
+ className in el.classList
$.rm = do ->
if 'remove' of Element::
diff --git a/src/General/lib/post.class b/src/General/lib/post.class
index a77a978c5..557d01f83 100755
--- a/src/General/lib/post.class
+++ b/src/General/lib/post.class
@@ -111,7 +111,7 @@ class Post
# ES6 Set when?
fullID = "#{match[1]}.#{match[2]}"
- @quotes.push fullID unless @quotes.contains fullID
+ @quotes.push fullID unless fullID in @quotes
parseFile: (that) ->
return unless (fileEl = $ '.file', @nodes.post) and thumb = $ 'img[data-md5]', fileEl
diff --git a/src/Images/Gallery.coffee b/src/Images/Gallery.coffee
index 4633d83a3..efa7b20df 100644
--- a/src/Images/Gallery.coffee
+++ b/src/Images/Gallery.coffee
@@ -247,7 +247,7 @@ Gallery =
label = $.el 'label',
innerHTML: " #{name}"
input = label.firstElementChild
- if ['Fit Width', 'Fit Height', 'Hide Thumbnails'].contains name
+ if name in ['Fit Width', 'Fit Height', 'Hide Thumbnails']
$.on input, 'change', Gallery.cb.setFitness
input.checked = Conf[name]
$.event 'change', null, input
diff --git a/src/Images/ImageExpand.coffee b/src/Images/ImageExpand.coffee
index 135a50481..d82a20fe2 100755
--- a/src/Images/ImageExpand.coffee
+++ b/src/Images/ImageExpand.coffee
@@ -43,7 +43,7 @@ ImageExpand =
for ID, post of g.posts
for post in [post].concat post.clones
{file} = post
- continue unless file and file.isImage and doc.contains post.nodes.root
+ continue unless file and file.isImage and post.nodes.root in doc
if ImageExpand.on and
(!Conf['Expand spoilers'] and file.isSpoiler or
Conf['Expand from here'] and Header.getTopOf(file.thumb) < 0)
diff --git a/src/Images/ImageHover.coffee b/src/Images/ImageHover.coffee
index 9116a6c95..e09cd55f3 100755
--- a/src/Images/ImageHover.coffee
+++ b/src/Images/ImageHover.coffee
@@ -23,7 +23,7 @@ ImageHover =
asapTest: -> el.naturalHeight
$.on el, 'error', ImageHover.error
error: ->
- return unless doc.contains @
+ return unless @ in doc
post = g.posts[@dataset.fullID]
src = @src.split '/'
diff --git a/src/Linkification/Linkify.coffee b/src/Linkification/Linkify.coffee
index 368654f77..6774be36e 100755
--- a/src/Linkification/Linkify.coffee
+++ b/src/Linkification/Linkify.coffee
@@ -303,7 +303,7 @@ Linkify =
el = $.el 'div'
$.cache "https://mediacru.sh/#{a.dataset.uid}.json", ->
{status} = @
- return div.innerHTML = "ERROR #{status}" unless [200, 304].contains status
+ return div.innerHTML = "ERROR #{status}" unless status in [200, 304]
{files} = JSON.parse @response
for type in ['video/mp4', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'image/svg', 'audio/mpeg']
for file in files
diff --git a/src/Miscellaneous/CatalogLinks.coffee b/src/Miscellaneous/CatalogLinks.coffee
index 869fecc1a..b60b7623c 100755
--- a/src/Miscellaneous/CatalogLinks.coffee
+++ b/src/Miscellaneous/CatalogLinks.coffee
@@ -33,9 +33,9 @@ CatalogLinks =
(board) -> a.href = "/#{board}/#{path}"
for a in $$ """#board-list a:not(.catalog), #boardNavDesktopFoot a"""
- continue if !['boards.4chan.org', 'catalog.neet.tv', '4index.gropes.us'].contains(a.hostname) or
+ continue if not a.hostname in ['boards.4chan.org', 'catalog.neet.tv', '4index.gropes.us'] or
!(board = a.pathname.split('/')[1]) or
- ['f', 'status', '4chan'].contains board
+ board in ['f', 'status', '4chan']
# Href is easier than pathname because then we don't have
# conditions where External Catalog has been disabled between switches.
diff --git a/src/Miscellaneous/ExpandComment.coffee b/src/Miscellaneous/ExpandComment.coffee
index db55f37ba..cb9223ae9 100755
--- a/src/Miscellaneous/ExpandComment.coffee
+++ b/src/Miscellaneous/ExpandComment.coffee
@@ -32,7 +32,7 @@ ExpandComment =
post.nodes.comment = post.nodes.shortComment
parse: (req, a, post) ->
{status} = req
- unless [200, 304].contains status
+ unless status in [200, 304]
a.textContent = "Error #{req.statusText} (#{status})"
return
diff --git a/src/Miscellaneous/Keybinds.coffee b/src/Miscellaneous/Keybinds.coffee
index dc25fd49f..d81814396 100755
--- a/src/Miscellaneous/Keybinds.coffee
+++ b/src/Miscellaneous/Keybinds.coffee
@@ -19,7 +19,7 @@ Keybinds =
keydown: (e) ->
return unless key = Keybinds.keyCode e
{target} = e
- if ['INPUT', 'TEXTAREA'].contains target.nodeName
+ if target.nodeName in ['INPUT', 'TEXTAREA']
return unless /(Esc|Alt|Ctrl|Meta|Shift\+\w{2,})/.test key
threadRoot = Nav.getThread()
if op = $ '.op', threadRoot
diff --git a/src/Monitoring/ThreadUpdater.coffee b/src/Monitoring/ThreadUpdater.coffee
index 4a7ebbed6..8ff2ec813 100755
--- a/src/Monitoring/ThreadUpdater.coffee
+++ b/src/Monitoring/ThreadUpdater.coffee
@@ -254,18 +254,20 @@ ThreadUpdater =
deletedPosts = []
deletedFiles = []
+
# Check for deleted posts/files.
for ID, post of ThreadUpdater.thread.posts
# XXX tmp fix for 4chan's racing condition
# giving us false-positive dead posts.
# continue if post.isDead
ID = +ID
- if post.isDead and index.contains ID
- post.resurrect()
- else unless index.contains ID
+
+ unless ID in index
post.kill()
deletedPosts.push post
- else if post.file and !post.file.isDead and not files.contains ID
+ else if post.isDead
+ post.resurrect()
+ else if post.file and not (post.file.isDead and ID in files)
post.kill true
deletedFiles.push post
diff --git a/src/Monitoring/Unread.coffee b/src/Monitoring/Unread.coffee
index 0635dc901..36d5f5213 100755
--- a/src/Monitoring/Unread.coffee
+++ b/src/Monitoring/Unread.coffee
@@ -79,7 +79,7 @@ Unread =
Unread.addPostQuotingYou post
if Conf['Unread Line']
# Force line on visible threads if there were no unread posts previously.
- Unread.setLine posts.contains Unread.posts[0]
+ Unread.setLine Unread.posts[0] in posts
Unread.read()
Unread.update()
diff --git a/src/Posting/QuickReply.coffee b/src/Posting/QuickReply.coffee
index 92e09f9ff..296fbc6a5 100755
--- a/src/Posting/QuickReply.coffee
+++ b/src/Posting/QuickReply.coffee
@@ -228,8 +228,7 @@ QR =
item = item.replace match, ''
boards = item.match(/boards:([^;]+)/i)?[1].toLowerCase() or 'global'
- if boards isnt 'global' and not ((boards.split ',').contains g.BOARD.ID)
- return
+ return if boards isnt 'global' and not g.BOARD.ID in boards.split ','
if type is 'password'
QR.persona.pwd = val
@@ -240,7 +239,7 @@ QR =
if /always/i.test item
QR.persona.always[type] = val
- unless types[type].contains val
+ unless val in types[type]
types[type].push val
loadPersonas: (type, arr) ->
@@ -469,7 +468,7 @@ QR =
if file.size > max
QR.error "#{file.name}: File too large (file: #{$.bytesToString file.size}, max: #{$.bytesToString max})."
return
- else unless QR.mimeTypes.contains file.type
+ else unless file.type in QR.mimeTypes
unless /^text/.test file.type
QR.error "#{file.name}: Unsupported file type."
return
@@ -493,7 +492,7 @@ QR =
$.addClass QR.nodes.filename, 'edit'
QR.nodes.filename.focus()
return $.on QR.nodes.filename, 'blur', -> $.rmClass QR.nodes.filename, 'edit'
- return if e.target.nodeName is 'INPUT' or (e.keyCode and not [32, 13].contains e.keyCode) or e.ctrlKey
+ return if e.target.nodeName is 'INPUT' or (e.keyCode and not e.keyCode in [32, 13]) or e.ctrlKey
e.preventDefault()
QR.nodes.fileInput.click()
diff --git a/src/Quotelinks/QuoteOP.coffee b/src/Quotelinks/QuoteOP.coffee
index 1f5554dfe..33b680112 100755
--- a/src/Quotelinks/QuoteOP.coffee
+++ b/src/Quotelinks/QuoteOP.coffee
@@ -19,7 +19,7 @@ QuoteOP =
{quotelinks} = @nodes
# rm (OP) from cross-thread quotes.
- if @isClone and quotes.contains @thread.fullID
+ if @isClone and @thread.fullID in quotes
i = 0
while quotelink = quotelinks[i++]
quotelink.textContent = quotelink.textContent.replace QuoteOP.text, ''
@@ -27,7 +27,7 @@ QuoteOP =
{fullID} = (if @isClone then @context else @).thread
# add (OP) to quotes quoting this context's OP.
- return unless quotes.contains fullID
+ return unless fullID in quotes
i = 0
while quotelink = quotelinks[i++]
{boardID, postID} = Get.postDataFromLink quotelink
diff --git a/src/Quotelinks/QuoteThreading.coffee b/src/Quotelinks/QuoteThreading.coffee
index ec28ddfcb..3287c9a4f 100755
--- a/src/Quotelinks/QuoteThreading.coffee
+++ b/src/Quotelinks/QuoteThreading.coffee
@@ -68,7 +68,7 @@ QuoteThreading =
{bottom, top} = qpost.nodes.root.getBoundingClientRect()
# Post is unread or is fully visible.
- return false unless Unread.posts.contains(qpost) or ((bottom < height) and (top > 0))
+ return false unless qpost in Unread.posts or ((bottom < height) and (top > 0))
qroot = qpost.nodes.root
unless $.hasClass qroot, 'threadOP'
diff --git a/src/Quotelinks/Quotify.coffee b/src/Quotelinks/Quotify.coffee
index 3fd3fc2bb..6d00037a7 100755
--- a/src/Quotelinks/Quotify.coffee
+++ b/src/Quotelinks/Quotify.coffee
@@ -69,19 +69,16 @@ Quotify =
$.addClass a, 'quotelink'
$.extend a.dataset, {boardID, postID}
- unless @quotes.contains quoteID
- @quotes.push quoteID
+ @quotes.push quoteID unless quoteID in @quotes
- unless a
- deadlink.textContent = "#{quote}\u00A0(Dead)"
- return
+ return deadlink.textContent = "#{quote}\u00A0(Dead)" unless a
$.replace deadlink, a
if $.hasClass a, 'quotelink'
@nodes.quotelinks.push a
fixDeadlink: (deadlink) ->
- if !(el = deadlink.previousSibling) or el.nodeName is 'BR'
+ if not (el = deadlink.previousSibling) or el.nodeName is 'BR'
green = $.el 'span',
className: 'quote'
$.before deadlink, green