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