From 6f84ae9abe37665db9e1aba9d24fd4a493051242 Mon Sep 17 00:00:00 2001 From: Zixaphir Date: Thu, 8 Jan 2015 13:53:38 -0700 Subject: [PATCH] Start merging ccd0's 4chan X stuff --- Gruntfile.coffee | 28 +- builds/4chan-X.meta.js | 23 - builds/appchan-x.meta.js | 1 - builds/appchan-x.user.js | 4558 +++++++++++++++---------------- builds/crx.crx | Bin 204271 -> 0 bytes builds/crx/manifest.json | 2 +- builds/crx/script.js | 4580 ++++++++++++++++---------------- builds/updates.xml | 7 - package.json | 9 +- src/Archive/Redirect.coffee | 19 +- src/Archive/archives.json | 7 +- src/Filtering/Anonymize.coffee | 9 +- src/Filtering/Filter.coffee | 67 +- 13 files changed, 4739 insertions(+), 4571 deletions(-) delete mode 100755 builds/4chan-X.meta.js delete mode 100644 builds/crx.crx delete mode 100644 builds/updates.xml diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 4f60ae3b9..6e57cf1fa 100755 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -1,7 +1,8 @@ module.exports = (grunt) -> + grunt.util.linefeed = '\n' importHTML = (filename) -> - "\"\"\"#{grunt.file.read("src/General/html/#{filename}.html").replace(/^\s+|\s+$ parts = template.split /([\$&@]){([^}`]*)}/ @@ -38,6 +39,8 @@ module.exports = (grunt) -> pkg = grunt.config 'pkg' pkg.importHTML = importHTML pkg.html = html + pkg.assert = assert + pkg.tests_enabled or= false pkg enumerable: true ) @@ -52,17 +55,18 @@ module.exports = (grunt) -> 'src/General/Build.coffee' 'src/General/Get.coffee' 'src/General/UI.coffee' - 'src/Filtering/*' - 'src/Quotelinks/*' - 'src/Linkification/*' - 'src/Posting/QR.coffee' - 'src/Posting/*' - 'src/Images/*' - 'src/Menu/*' - 'src/Monitoring/*' - 'src/Archive/*' - 'src/Theming/*' - 'src/Miscellaneous/*' + 'src/General/CrossOrigin.coffee' + 'src/Filtering/**/*.coffee' + 'src/Quotelinks/**/*.coffee' + 'src/Posting/Captcha.coffee' + 'src/Posting/**/*.coffee' + 'src/Images/**/*.coffee' + 'src/Linkification/**/*.coffee' + 'src/Menu/**/*.coffee' + 'src/Monitoring/**/*.coffee' + 'src/Archive/**/*.coffee' + 'src/Miscellaneous/**/*.coffee' + 'src/Theming/**/*.coffee' 'src/General/Navigate.coffee' 'src/General/Settings.coffee' 'src/General/Main.coffee' diff --git a/builds/4chan-X.meta.js b/builds/4chan-X.meta.js deleted file mode 100755 index 972d23bba..000000000 --- a/builds/4chan-X.meta.js +++ /dev/null @@ -1,23 +0,0 @@ -// ==UserScript== -// @name 4chan X -// @version 1.7.33 -// @minGMVer 1.14 -// @minFFVer 26 -// @namespace 4chan-X -// @description Cross-browser userscript for maximum lurking on 4chan. -// @license MIT; https://github.com/ccd0/4chan-x/blob/master/LICENSE -// @match *://boards.4chan.org/* -// @match *://sys.4chan.org/* -// @match *://a.4cdn.org/* -// @match *://i.4cdn.org/* -// @grant GM_getValue -// @grant GM_setValue -// @grant GM_deleteValue -// @grant GM_listValues -// @grant GM_openInTab -// @grant GM_xmlhttpRequest -// @run-at document-start -// @updateURL https://ccd0.github.io/4chan-x/builds/4chan-X.meta.js -// @downloadURL https://ccd0.github.io/4chan-x/builds/4chan-X.user.js -// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAACVBMVEUAAGcAAABmzDNZt9VtAAAAAXRSTlMAQObYZgAAAF5JREFUeNrtkTESABAQxPD/R6tsE2dUGYUtFJvLDKf93KevHJAjpBorAQWSBIKqFASC4G0pCAkm4GfaEvgYXl0T6HBaE97f0vmnfYHbZOMLZCx9ISdKWwjOWZSC8GYm4SUGwfYgqI4AAAAASUVORK5CYII= -// ==/UserScript== diff --git a/builds/appchan-x.meta.js b/builds/appchan-x.meta.js index a92d9d95a..deec3c232 100644 --- a/builds/appchan-x.meta.js +++ b/builds/appchan-x.meta.js @@ -13,7 +13,6 @@ // @match *://i.4cdn.org/* // @exclude *://blog.4chan.org/* // @exclude *://dis.4chan.org/* -// @exclude *://a.4cdn.org/* // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue diff --git a/builds/appchan-x.user.js b/builds/appchan-x.user.js index 1240d72a4..dc9c46552 100644 --- a/builds/appchan-x.user.js +++ b/builds/appchan-x.user.js @@ -14,7 +14,6 @@ // @match *://i.4cdn.org/* // @exclude *://blog.4chan.org/* // @exclude *://dis.4chan.org/* -// @exclude *://a.4cdn.org/* // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue @@ -116,7 +115,7 @@ 'use strict'; (function() { - var $, $$, Anonymize, ArchiveLink, Banner, Board, Build, Callbacks, CatalogLinks, CatalogThread, Clone, Color, Conf, Config, CustomCSS, DataBoard, DeleteLink, Dice, DownloadLink, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Flash, Fourchan, Gallery, Get, GlobalMessage, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Index, JSColor, Keybinds, Labels, Linkify, Main, MarkNewIPs, MascotTools, Mascots, Menu, Nav, Navigate, Notice, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteInline, QuoteMarkers, QuotePreview, QuoteStrikeThrough, QuoteThreading, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Rice, Sauce, Settings, SimpleDict, Style, ThemeTools, Themes, Thread, ThreadExcerpt, ThreadStats, ThreadUpdater, ThreadWatcher, Time, TrashQueue, UI, Unread, Video, c, d, doc, editMascot, editTheme, g, userNavigation, + var $, $$, Anonymize, ArchiveLink, Banner, Board, Build, Callbacks, CatalogLinks, CatalogThread, Clone, Color, Conf, Config, CrossOrigin, CustomCSS, DataBoard, DeleteLink, Dice, DownloadLink, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Flash, Fourchan, Gallery, Get, GlobalMessage, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Index, JSColor, Keybinds, Labels, Linkify, Main, MarkNewIPs, MascotTools, Mascots, Menu, Nav, Navigate, Notice, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteInline, QuoteMarkers, QuotePreview, QuoteStrikeThrough, QuoteThreading, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Rice, Sauce, Settings, SimpleDict, Style, ThemeTools, Themes, Thread, ThreadExcerpt, ThreadStats, ThreadUpdater, ThreadWatcher, Time, TrashQueue, UI, Unread, Video, c, d, doc, editMascot, editTheme, g, userNavigation, __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; }, __hasProp = {}.hasOwnProperty, @@ -4824,11 +4823,15 @@ this.pagelist = $.el('div', { className: 'pagelist', hidden: true, - innerHTML: "
<
>
" + innerHTML: { + innerHTML: "
\r\r<\r\r
\r
\r
\r\r>\r\r
" + } }); this.navLinks = $.el('div', { className: 'navLinks', - innerHTML: "\uf05c " + innerHTML: { + innerHTML: "\r\r\\uf05c\r \r\r\r\r\r\r\r\r" + } }); this.timeEl = $('time#index-last-refresh', this.navLinks); this.searchInput = $('#index-search', this.navLinks); @@ -6050,7 +6053,9 @@ comment = thread.OP.nodes.comment.innerHTML.replace(/(
\s*){2,}/g, '
'); root = $.el('div', { className: 'catalog-thread', - innerHTML: "
" + postCount + " / " + fileCount + " / " + pageCount + "
" + subject + "
" + comment + "
" + innerHTML: { + innerHTML: "\r
\r" + postCount + " / " + fileCount + " / " + pageCount + "\r\r
\r" + subject + "\r
" + comment + "
\r" + } }); root.dataset.fullID = thread.fullID; if (thread.isPinned) { @@ -6793,11 +6798,97 @@ }; })(); + CrossOrigin = (function() { + return { + file: (function() { + var makeBlob; + makeBlob = function(urlBlob, contentType, contentDisposition, url) { + var blob, match, mime, name, _ref, _ref1, _ref2; + name = (_ref = url.match(/([^\/]+)\/*$/)) != null ? _ref[1] : void 0; + mime = (contentType != null ? contentType.match(/[^;]*/)[0] : void 0) || 'application/octet-stream'; + match = (contentDisposition != null ? (_ref1 = contentDisposition.match(/\bfilename\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref1[1] : void 0 : void 0) || (contentType != null ? (_ref2 = contentType.match(/\bname\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref2[1] : void 0 : void 0); + if (match) { + name = match.replace(/\\"/g, '"'); + } + blob = new Blob([urlBlob], { + type: mime + }); + blob.name = name; + return blob; + }; + return function(url, cb) { + return GM_xmlhttpRequest({ + method: "GET", + url: url, + overrideMimeType: "text/plain; charset=x-user-defined", + onload: function(xhr) { + var contentDisposition, contentType, data, i, r, _ref, _ref1; + r = xhr.responseText; + data = new Uint8Array(r.length); + i = 0; + while (i < r.length) { + data[i] = r.charCodeAt(i); + i++; + } + contentType = (_ref = xhr.responseHeaders.match(/Content-Type:\s*(.*)/i)) != null ? _ref[1] : void 0; + contentDisposition = (_ref1 = xhr.responseHeaders.match(/Content-Disposition:\s*(.*)/i)) != null ? _ref1[1] : void 0; + return cb(makeBlob(data, contentType, contentDisposition, url)); + }, + onerror: function() { + return cb(null); + } + }); + }; + })(), + json: (function() { + var callbacks, responses; + callbacks = {}; + responses = {}; + return function(url, cb) { + if (responses[url]) { + cb(responses[url]); + return; + } + if (callbacks[url]) { + callbacks[url].push(cb); + return; + } + callbacks[url] = [cb]; + return GM_xmlhttpRequest({ + method: "GET", + url: url + '', + onload: function(xhr) { + var response, _i, _len, _ref; + response = JSON.parse(xhr.responseText); + _ref = callbacks[url]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + cb = _ref[_i]; + cb(response); + } + delete callbacks[url]; + return responses[url] = response; + }, + onerror: function() { + return delete callbacks[url]; + }, + onabort: function() { + return delete callbacks[url]; + } + }); + }; + })() + }; + })(); + Anonymize = { init: function() { - if (!Conf['Anonymize']) { + var _ref; + if (!(((_ref = g.VIEW) === 'index' || _ref === 'thread' || _ref === 'archive') && Conf['Anonymize'])) { return; } + if (g.VIEW === 'archive') { + return this.archive(); + } return Post.callbacks.push({ name: 'Anonymize', cb: this.node @@ -6820,14 +6911,31 @@ $.replace(email, name); return delete this.nodes.email; } + }, + archive: function() { + return $.ready(function() { + var name, trip, _i, _j, _len, _len1, _ref, _ref1, _results; + _ref = $$('.name'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + name = _ref[_i]; + name.textContent = 'Anonymous'; + } + _ref1 = $$('.postertrip'); + _results = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + trip = _ref1[_j]; + _results.push($.rm(trip)); + } + return _results; + }); } }; Filter = { filters: {}, init: function() { - var boards, err, filter, hl, key, op, regexp, stub, top, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5; - if (!Conf['Filter']) { + var boards, err, filter, hl, key, line, op, regexp, stub, top, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6; + if (!(((_ref = g.VIEW) === 'index' || _ref === 'thread') && Conf['Filter'])) { return; } if (!Conf['Filtered Backlinks']) { @@ -6835,18 +6943,18 @@ } for (key in Config.filter) { this.filters[key] = []; - _ref = Conf[key].split('\n'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - filter = _ref[_i]; - if (filter[0] === '#') { + _ref1 = Conf[key].split('\n'); + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + line = _ref1[_i]; + if (line[0] === '#') { continue; } - if (!(regexp = filter.match(/\/(.+)\/(\w*)/))) { + if (!(regexp = line.match(/\/(.+)\/(\w*)/))) { continue; } - filter = filter.replace(regexp[0], ''); - boards = ((_ref1 = filter.match(/boards:([^;]+)/)) != null ? _ref1[1].toLowerCase() : void 0) || 'global'; - if (boards !== 'global' && (_ref2 = g.BOARD.ID, __indexOf.call(boards.split(','), _ref2) < 0)) { + filter = line.replace(regexp[0], ''); + boards = ((_ref2 = filter.match(/boards:([^;]+)/)) != null ? _ref2[1].toLowerCase() : void 0) || 'global'; + if (boards !== 'global' && (_ref3 = g.BOARD.ID, __indexOf.call(boards.split(','), _ref3) < 0)) { continue; } if (key === 'uniqueID' || key === 'MD5') { @@ -6856,14 +6964,14 @@ regexp = RegExp(regexp[1], regexp[2]); } catch (_error) { err = _error; - new Notice('warning', err.message, 60); + new Notice('warning', [$.tn(("Invalid " + key + " filter: ") + line, $.el('br')), $.tn(err.message)], 60); continue; } } - op = ((_ref3 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref3[1] : void 0) || 'yes'; + op = ((_ref4 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref4[1] : void 0) || 'yes'; stub = (function() { - var _ref4; - switch ((_ref4 = filter.match(/stub:(yes|no)/)) != null ? _ref4[1] : void 0) { + var _ref5; + switch ((_ref5 = filter.match(/stub:(yes|no)/)) != null ? _ref5[1] : void 0) { case 'yes': return true; case 'no': @@ -6873,19 +6981,11 @@ } })(); if (hl = /highlight/.test(filter)) { - 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'; + hl = ((_ref5 = filter.match(/highlight:(\w+)/)) != null ? _ref5[1] : void 0) || 'filter-highlight'; + top = ((_ref6 = filter.match(/top:(yes|no)/)) != null ? _ref6[1] : void 0) || 'yes'; top = top === 'yes'; } - this.filters[key].push({ - hide: !hl, - op: op, - stub: stub, - "class": hl, - top: top, - match: regexp, - test: typeof regexp === 'string' ? Filter.stringTest : Filter.regexpTest - }); + this.filters[key].push(this.createFilter(regexp, op, stub, hl, top)); } if (!this.filters[key].length) { delete this.filters[key]; @@ -6899,9 +6999,24 @@ cb: this.node }); }, + createFilter: function(regexp, op, stub, hl, top) { + var settings, test; + test = typeof regexp === 'string' ? Filter.stringTest : Filter.regexpTest; + settings = { + hide: !hl, + stub: stub, + "class": hl, + top: top + }; + return function(value, isReply) { + if (Filter.test(test, value, isReply)) { + return settings; + } + }; + }, node: function() { - var key, obj, value, _i, _len, _ref; - if (this.isClone) { + var filter, key, result, value, _i, _len, _ref; + if (this.isClone || this.isFetchedQuote) { return; } for (key in Filter.filters) { @@ -6911,18 +7026,18 @@ } _ref = Filter.filters[key]; for (_i = 0, _len = _ref.length; _i < _len; _i++) { - obj = _ref[_i]; - if (!Filter.test(obj, value, this.isReply)) { + filter = _ref[_i]; + if (!(result = filter(value, this.isReply))) { continue; } - if (obj.hide) { + if (result.hide) { if (!(this.isReply || g.VIEW === 'index')) { continue; } - this.hide("Hidden by filtering the " + key + ": " + obj.match, obj.stub); + this.hide("Hidden by filtering the " + key + ": " + result.match, result.stub); return; } - this.highlight("Highlighted by filtering the " + key + ": " + obj.match, obj["class"], obj.top); + this.highlight("Highlighted by filtering the " + key + ": " + result.match, result["class"], result.top); } } }, @@ -6967,12 +7082,6 @@ } return false; }, - email: function(post) { - if ('email' in post.info) { - return post.info.email; - } - return false; - }, subject: function(post) { if ('subject' in post.info) { return post.info.subject || false; @@ -7001,7 +7110,7 @@ var file; file = post.file; if (file && (file.isImage || file.isVideo)) { - return post.file.dimensions; + return file.dimensions; } return false; }, @@ -7019,8 +7128,8 @@ }, menu: { init: function() { - var div, entry, type, _i, _len, _ref; - if (!Conf['Menu'] || !Conf['Filter']) { + var div, entry, type, _i, _len, _ref, _ref1; + if (!(((_ref = g.VIEW) === 'index' || _ref === 'thread') && Conf['Menu'] && Conf['Filter'])) { return; } div = $.el('div', { @@ -7035,9 +7144,9 @@ }, subEntries: [] }; - _ref = [['Name', 'name'], ['Unique ID', 'uniqueID'], ['Tripcode', 'tripcode'], ['Capcode', 'capcode'], ['E-mail', 'email'], ['Subject', 'subject'], ['Comment', 'comment'], ['Flag', 'flag'], ['Filename', 'filename'], ['Image dimensions', 'dimensions'], ['Filesize', 'filesize'], ['Image MD5', 'MD5']]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; + _ref1 = [['Name', 'name'], ['Unique ID', 'uniqueID'], ['Tripcode', 'tripcode'], ['Capcode', 'capcode'], ['Subject', 'subject'], ['Comment', 'comment'], ['Flag', 'flag'], ['Filename', 'filename'], ['Image dimensions', 'dimensions'], ['Filesize', 'filesize'], ['Image MD5', 'MD5']]; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + type = _ref1[_i]; entry.subEntries.push(Filter.menu.createSubEntry(type[0], type[1])); } return Menu.menu.addEntry(entry); @@ -8130,555 +8239,224 @@ } }; - Linkify = { + QR.captcha = { init: function() { - var type, _i, _len, _ref; - if (!Conf['Linkify']) { + var counter, root; + if (d.cookie.indexOf('pass_enabled=1') >= 0) { return; } - this.types = {}; - _ref = this.ordered_types; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - this.types[type.key] = type; + if (!(this.isEnabled = !!$.id('g-recaptcha'))) { + return; } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - if (Conf['Embedding'] || Conf['Link Title']) { - this.embedProcess = Function('link', 'post', "var data = this.services(link);\nif (data) {" + ((Conf['Embedding'] ? 'this.embed(data); ' : '') + (Conf['Link Title'] ? 'data.push(post); this.title(data);' : '')) + "}"); - } - return Post.callbacks.push({ - name: 'Linkify', - cb: this.node + this.captchas = []; + $.get('captchas', [], function(_arg) { + var captchas; + captchas = _arg.captchas; + return QR.captcha.sync(captchas); }); + $.sync('captchas', this.sync.bind(this)); + root = $.el('div', { + className: 'captcha-root' + }); + $.extend(root, { + innerHTML: "
" + }); + counter = $('.captcha-counter > a', root); + this.nodes = { + root: root, + counter: counter + }; + this.count(); + $.addClass(QR.nodes.el, 'has-captcha'); + $.after(QR.nodes.com.parentNode, root); + $.on(counter, 'click', this.toggle.bind(this)); + return $.on(window, 'captcha:success', (function(_this) { + return function() { + return $.queueTask(function() { + return _this.save(false); + }); + }; + })(this)); }, - events: function(post) { - var el, i, items; - i = 0; - items = $$('.embedder', post.nodes.comment); - while (el = items[i++]) { - $.on(el, 'click', Linkify.cb.toggle); - if ($.hasClass(el, 'embedded')) { - Linkify.cb.toggle.call(el); - } + shouldFocus: false, + timeouts: {}, + postsCount: 0, + needed: function() { + var captchaCount; + captchaCount = this.captchas.length; + if (this.nodes.container && !this.timeouts.destroy) { + captchaCount++; + } + this.postsCount = QR.posts.length; + if (this.postsCount === 1 && !Conf['Auto-load captcha'] && !QR.posts[0].com && !QR.posts[0].file) { + this.postsCount = 0; + } + return captchaCount < this.postsCount; + }, + onPostChange: function() { + if (this.postsCount === 0) { + this.setup(); + } + if (QR.posts.length === 1 && !Conf['Auto-load captcha'] && !QR.posts[0].com && !QR.posts[0].file) { + return this.postsCount = 0; } }, - node: function() { - var data, end, endNode, i, index, length, link, links, node, result, saved, snapshot, space, test, word; - if (this.isClone) { - return (Conf['Embedding'] ? Linkify.events(this) : null); + toggle: function() { + if (this.nodes.container && !this.timeouts.destroy) { + return this.destroy(); + } else { + return this.setup(true, true); } - if (!Linkify.regString.test(this.info.comment)) { + }, + setup: function(focus, force) { + if (!(this.isEnabled && (this.needed() || force))) { return; } - test = /[^\s'"]+/g; - space = /[\s'"]/; - snapshot = $.X('.//br|.//text()', this.nodes.comment); - i = 0; - links = []; - while (node = snapshot.snapshotItem(i++)) { - data = node.data; - if (!data || node.parentElement.nodeName === "A") { - continue; - } - while (result = test.exec(data)) { - index = result.index; - endNode = node; - word = result[0]; - if ((length = index + word.length) === data.length) { - test.lastIndex = 0; - while ((saved = snapshot.snapshotItem(i++))) { - if (saved.nodeName === 'BR') { - break; - } - endNode = saved; - data = saved.data; - word += data; - length = data.length; - if (end = space.exec(data)) { - test.lastIndex = length = end.index; - i--; - break; - } - } - } - if (Linkify.regString.exec(word)) { - links.push(Linkify.makeRange(node, endNode, index, length)); - } - if (!(test.lastIndex && node === endNode)) { - break; - } - } + $.addClass(QR.nodes.el, 'captcha-open'); + if (focus) { + this.shouldFocus = true; } - i = links.length; - while (i--) { - link = links[i]; - Linkify.embedProcess(Linkify.makeLink(link), this); + if (this.timeouts.destroy) { + clearTimeout(this.timeouts.destroy); + delete this.timeouts.destroy; + return this.reload(); + } + if (this.nodes.container) { + return; + } + this.nodes.container = $.el('div', { + className: 'captcha-container' + }); + $.prepend(this.nodes.root, this.nodes.container); + new MutationObserver(this.afterSetup.bind(this)).observe(this.nodes.container, { + childList: true, + subtree: true + }); + return $.globalEval('(function() {\n function render() {\n var container = document.querySelector("#qr .captcha-container");\n container.dataset.widgetID = window.grecaptcha.render(container, {\n sitekey: \'6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc\',\n theme: document.documentElement.classList.contains(\'tomorrow\') ? \'dark\' : \'light\',\n callback: function(response) {\n window.dispatchEvent(new CustomEvent("captcha:success", {detail: response}));\n }\n });\n }\n if (window.grecaptcha) {\n render();\n } else {\n var cbNative = window.onRecaptchaLoaded;\n window.onRecaptchaLoaded = function() {\n render();\n cbNative();\n }\n }\n})();'); + }, + afterSetup: function(mutations) { + var iframe, mutation, node, textarea, _i, _j, _len, _len1, _ref; + for (_i = 0, _len = mutations.length; _i < _len; _i++) { + mutation = mutations[_i]; + _ref = mutation.addedNodes; + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { + node = _ref[_j]; + if (iframe = $.x('./descendant-or-self::iframe', node)) { + this.setupIFrame(iframe); + } + if (textarea = $.x('./descendant-or-self::textarea', node)) { + this.setupTextArea(textarea); + } + } } }, - embedProcess: function() {}, - regString: /((https?|mailto|git|magnet|ftp|irc):([a-z\d%\/])|[-a-z\d]+[.](aero|asia|biz|cat|com|coop|info|int|jobs|mobi|museum|name|net|org|post|pro|tel|travel|xxx|edu|gov|mil|[a-z]{2})([:\/]|(?!.))|[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}|[-\w\d.@]+@[a-z\d.-]+\.[a-z\d])/i, - makeRange: function(startNode, endNode, startOffset, endOffset) { - var range; - range = document.createRange(); - range.setStart(startNode, startOffset); - range.setEnd(endNode, endOffset); - return range; + setupIFrame: function(iframe) { + this.setupTime = Date.now(); + if (QR.nodes.el.getBoundingClientRect().bottom > doc.clientHeight) { + QR.nodes.el.style.top = null; + QR.nodes.el.style.bottom = '0px'; + } + if (this.shouldFocus) { + iframe.focus(); + } + return this.shouldFocus = false; }, - makeLink: function(range) { - var a, i, t, text; - text = range.toString(); - i = 0; - while (/[(\[{<>]/.test(text.charAt(i))) { - i++; + setupTextArea: function(textarea) { + return $.one(textarea, 'input', (function(_this) { + return function() { + return _this.save(true); + }; + })(this)); + }, + destroy: function() { + if (!this.isEnabled) { + return; } - if (i) { - text = text.slice(i); - while (range.startOffset + i >= range.startContainer.data.length) { - i--; - } - if (i) { - range.setStart(range.startContainer, range.startOffset + i); - } + delete this.timeouts.destroy; + $.rmClass(QR.nodes.el, 'captcha-open'); + if (this.nodes.container) { + $.rm(this.nodes.container); } - i = 0; - while (/[)\]}>.,]/.test(t = text.charAt(text.length - (1 + i)))) { - if (!(/[.,]/.test(t) || (text.match(/[()\[\]{}<>]/g)).length % 2)) { + return delete this.nodes.container; + }, + sync: function(captchas) { + if (captchas == null) { + captchas = []; + } + this.captchas = captchas; + this.clear(); + return this.count(); + }, + getOne: function() { + var captcha; + this.clear(); + if (captcha = this.captchas.shift()) { + this.count(); + $.set('captchas', this.captchas); + return captcha.response; + } else { + return null; + } + }, + save: function(pasted) { + var reload, _base; + $.forceSync('captchas'); + reload = (QR.cooldown.auto || Conf['Post on Captcha Completion']) && this.needed(); + this.captchas.push({ + response: $('textarea', this.nodes.container).value, + timeout: (pasted ? this.setupTime : Date.now()) + 2 * $.MINUTE + }); + this.count(); + $.set('captchas', this.captchas); + if (reload) { + this.shouldFocus = true; + this.reload(); + } else { + if (pasted) { + this.destroy(); + } else { + if ((_base = this.timeouts).destroy == null) { + _base.destroy = setTimeout(this.destroy.bind(this), 3 * $.SECOND); + } + } + QR.nodes.status.focus(); + } + if (Conf['Post on Captcha Completion'] && !QR.cooldown.auto) { + return QR.submit(); + } + }, + clear: function() { + var captcha, i, now, _i, _len, _ref; + if (!this.captchas.length) { + return; + } + $.forceSync('captchas'); + now = Date.now(); + _ref = this.captchas; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + captcha = _ref[i]; + if (captcha.timeout > now) { break; } - i++; } - if (i) { - text = text.slice(0, -i); - while (range.endOffset - i < 0) { - i--; - } - if (i) { - range.setEnd(range.endContainer, range.endOffset - i); - } - } - if (!/(mailto:|.+:\/\/)/.test(text)) { - text = (/@/.test(text) ? 'mailto:' : 'http://') + text; - } - a = $.el('a', { - className: 'linkify', - rel: 'nofollow noreferrer', - target: '_blank', - href: text - }); - $.add(a, range.extractContents()); - range.insertNode(a); - range.detach(); - return a; - }, - services: function(link) { - var href, match, type, _i, _len, _ref; - href = link.href; - _ref = Linkify.ordered_types; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - if (!(match = type.regExp.exec(href))) { - continue; - } - if (type.dummy) { - return; - } - return [type.key, match[1], match[2], link]; - } - }, - embed: function(data) { - var embed, href, key, link, name, options, post, uid, value, _ref; - key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; - href = link.href; - embed = $.el('a', { - className: 'embedder', - href: 'javascript:;', - textContent: '(embed)' - }); - _ref = { - key: key, - href: href, - uid: uid, - options: options - }; - for (name in _ref) { - value = _ref[name]; - embed.dataset[name] = value; - } - $.addClass(link, "" + embed.dataset.key); - $.on(embed, 'click', Linkify.cb.toggle); - $.after(link, [$.tn(' '), embed]); - if (Conf['Auto-embed']) { - return Linkify.cb.toggle.call(embed); - } - }, - title: function(data) { - var err, key, link, options, post, service, title, titles, uid; - key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; - if (!(service = Linkify.types[key].title)) { + if (!i) { return; } - titles = Conf['CachedTitles']; - if (title = titles[uid]) { - return link.textContent = title[0]; - } else { - try { - return $.cache(service.api(uid), (function() { - return Linkify.cb.title(this, data); - }), { - responseType: 'json' - }); - } catch (_error) { - err = _error; - link.innerHTML = 'Title Link Blocked (are you using NoScript?)'; - $.prepend(link, $.tn("[" + key + "] ")); - } + this.captchas = this.captchas.slice(i); + this.count(); + $.set('captchas', this.captchas); + return this.setup(true); + }, + count: function() { + this.nodes.counter.textContent = "Captchas: " + this.captchas.length; + clearTimeout(this.timeouts.clear); + if (this.captchas.length) { + return this.timeouts.clear = setTimeout(this.clear.bind(this), this.captchas[0].timeout - Date.now()); } }, - cb: { - toggle: function() { - if ($.hasClass(this, "embedded")) { - $.rm(this.previousElementSibling); - this.previousElementSibling.hidden = false; - this.textContent = '(embed)'; - } else { - this.previousElementSibling.hidden = true; - $.before(this, Linkify.cb.embed(this)); - this.textContent = '(unembed)'; - } - return $.toggleClass(this, 'embedded'); - }, - embed: function(a) { - var el, type; - el = (type = Linkify.types[a.dataset.key]).el(a); - el.style.cssText = type.style != null ? type.style : "border: 0; width: 640px; height: 390px"; - return el; - }, - title: function(req, data) { - var key, link, link2, options, post, post2, service, status, text, uid, _i, _j, _len, _len1, _ref, _ref1; - key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; - status = req.status; - service = Linkify.types[key].title; - text = "[" + key + "] " + ((function() { - switch (status) { - case 200: - case 304: - return service.text(req.response); - case 404: - return "Not Found"; - case 403: - return "Forbidden or Private"; - default: - return "" + status + "'d"; - } - })()); - link.textContent = text; - _ref = post.clones; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - post2 = _ref[_i]; - _ref1 = $$('a', post2.nodes.comment); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - link2 = _ref1[_j]; - if (link2.href === link.href) { - link2.textContent = text; - } - } - } - } - }, - ordered_types: [ - { - key: 'audio', - regExp: /(.*\.(mp3|ogg|wav))$/, - style: '', - el: function(a) { - return $.el('audio', { - controls: true, - preload: 'auto', - src: a.dataset.uid - }); - } - }, { - key: 'gist', - regExp: /.*(?:gist.github.com.*\/)([^\/][^\/]*)$/, - el: function(a) { - var div; - return div = $.el('iframe', { - src: "http://www.purplegene.com/script?url=https://gist.github.com/" + a.dataset.uid + ".js" - }); - }, - title: { - api: function(uid) { - return "https://api.github.com/gists/" + uid; - }, - text: function(_arg) { - var file, files; - files = _arg.files; - for (file in files) { - if (files.hasOwnProperty(file)) { - return file; - } - } - } - } - }, { - key: 'image', - regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/, - style: 'border: 0; width: auto; height: auto;', - el: function(a) { - var el; - el = $.el('div'); - el.innerHTML = ''; - el.firstChild.href = el.firstChild.firstChild.src = a.dataset.href; - return el; - } - }, { - key: 'InstallGentoo', - regExp: /.*(?:paste.installgentoo.com\/view\/)([0-9a-z_]+)/, - el: function(a) { - return $.el('iframe', { - src: "http://paste.installgentoo.com/view/embed/" + a.dataset.uid - }); - } - }, { - key: 'Twitter', - regExp: /.*twitter.com\/(.+\/status\/\d+)/, - el: function(a) { - return $.el('iframe', { - src: "https://twitframe.com/show?url=https://twitter.com/" + a.dataset.uid - }); - } - }, { - key: 'LiveLeak', - regExp: /.*(?:liveleak.com\/view.+i=)([0-9a-z_]+)/, - el: function(a) { - var el; - el = $.el('iframe', { - width: "640", - height: "360", - src: "http://www.liveleak.com/ll_embed?i=" + a.dataset.uid, - frameborder: "0" - }); - el.setAttribute("allowfullscreen", "true"); - return el; - } - }, { - key: 'MediaCrush', - regExp: /.*(?:mediacru.sh\/)([0-9a-z_-]+)/i, - style: 'border: 0;', - el: function(a) { - var el; - el = $.el('div'); - $.cache("https://mediacru.sh/" + a.dataset.uid + ".json", function() { - var embed, ext, file, files, i, status, type, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _results, _results1; - status = this.status; - if (status !== 200 && status !== 304) { - return el.textContent = "ERROR " + status; - } - files = this.response.files; - _ref = ['video/webm', 'video/mp4', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'audio/mpeg', 'audio/ogg']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - for (_j = 0, _len1 = files.length; _j < _len1; _j++) { - file = files[_j]; - if (file.type === type) { - embed = file; - break; - } - } - if (embed) { - break; - } - } - if (!embed) { - return div.textContent = "ERROR: Not a valid filetype"; - } - switch (embed.type) { - case 'video/mp4': - case 'video/webm': - case 'video/ogv': - el.innerHTML = ''; - _ref1 = ['mp4', 'webm', 'ogv']; - _results = []; - for (i = _k = 0, _len2 = _ref1.length; _k < _len2; i = ++_k) { - ext = _ref1[i]; - _results.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); - } - return _results; - break; - case 'image/svg+xml': - case 'image/png': - case 'image/gif': - case 'image/jpeg': - el.innerHTML = ''; - el.firstChild.href = a.dataset.href; - return el.firstChild.firstChild.src = "https://mediacru.sh/" + file.file; - case 'audio/mpeg': - case 'audio/ogg': - el.innerHTML = ''; - _ref2 = ['ogg', 'mp3']; - _results1 = []; - for (i = _l = 0, _len3 = _ref2.length; _l < _len3; i = ++_l) { - ext = _ref2[i]; - _results1.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); - } - return _results1; - break; - default: - return el.textContent = "ERROR: No valid filetype."; - } - }); - return el; - } - }, { - key: 'pastebin', - regExp: /.*(?:pastebin.com\/(?!u\/))([^#\&\?]*).*/, - el: function(a) { - var div; - return div = $.el('iframe', { - src: "http://pastebin.com/embed_iframe.php?i=" + a.dataset.uid - }); - } - }, { - key: 'gfycat', - regExp: /.*gfycat.com\/(?:iframe\/)?(\S*)/, - el: function(a) { - var div; - return div = $.el('iframe', { - src: "http://gfycat.com/iframe/" + a.dataset.uid - }); - } - }, { - key: 'SoundCloud', - regExp: /.*(?:soundcloud.com\/|snd.sc\/)([^#\&\?]*).*/, - style: 'border: 0; width: 500px; height: 400px;', - el: function(a) { - return $.el('iframe', { - src: "//w.soundcloud.com/player/?visual=true&show_comments=false&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(a.dataset.uid)) - }); - }, - title: { - api: function(uid) { - return "//soundcloud.com/oembed?format=json&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(uid)); - }, - text: function(_) { - return _.title; - } - } - }, { - key: 'StrawPoll', - regExp: /strawpoll\.me\/(?:embed_\d+\/)?(\d+)/, - style: 'border: 0; width: 600px; height: 406px;', - el: function(a) { - return $.el('iframe', { - src: "http://strawpoll.me/embed_1/" + a.dataset.uid - }); - } - }, { - key: 'TwitchTV', - regExp: /.*(?:twitch.tv\/)([^#\&\?]*).*/, - style: "border: none; width: 640px; height: 360px;", - el: function(a) { - var channel, id, idparam, obj, result, type, _; - if (result = /(\w+)\/([bc])\/(\d+)/i.exec(a.dataset.uid)) { - _ = result[0], channel = result[1], type = result[2], id = result[3]; - idparam = { - 'b': 'archive_id', - 'c': 'chapter_id' - }; - obj = $.el('object', { - data: 'http://www.twitch.tv/widgets/archive_embed_player.swf' - }); - obj.innerHTML = ''; - obj.children[1].value = "channel=" + channel + "&start_volume=25&auto_play=false&" + idparam[type] + "=" + id; - return obj; - } else { - channel = (/(\w+)/.exec(a.dataset.uid))[0]; - obj = $.el('object', { - data: "http://www.twitch.tv/widgets/live_embed_player.swf?channel=" + channel - }); - obj.innerHTML = ''; - obj.children[1].value = "hostname=www.twitch.tv&channel=" + channel + "&auto_play=true&start_volume=25"; - return obj; - } - } - }, { - key: 'Vocaroo', - regExp: /.*(?:vocaroo.com\/)([^#\&\?]*).*/, - style: '', - el: function(a) { - return $.el('audio', { - controls: true, - preload: 'auto', - src: "http://vocaroo.com/media_command.php?media=" + (a.dataset.uid.replace(/^i\//, '')) + "&command=download_ogg" - }); - } - }, { - key: 'Vimeo', - regExp: /.*(?:vimeo.com\/)([^#\&\?]*).*/, - el: function(a) { - return $.el('iframe', { - src: "//player.vimeo.com/video/" + a.dataset.uid + "?wmode=opaque" - }); - }, - title: { - api: function(uid) { - return "https://vimeo.com/api/oembed.json?url=http://vimeo.com/" + uid; - }, - text: function(_) { - return _.title; - } - } - }, { - key: 'Vine', - regExp: /.*(?:vine.co\/)([^#\&\?]*).*/, - style: 'border: none; width: 500px; height: 500px;', - el: function(a) { - return $.el('iframe', { - src: "https://vine.co/" + a.dataset.uid + "/card" - }); - } - }, { - key: 'YouTube', - regExp: /.*(?:youtu.be\/|youtube.*v=|youtube.*\/embed\/|youtube.*\/v\/|youtube.*videos\/)([^#\&\?]*)\??(t\=.*)?/, - el: function(a) { - var el; - el = $.el('iframe', { - src: "//www.youtube.com/embed/" + a.dataset.uid + (a.dataset.option ? '#' + a.dataset.option : '') + "?wmode=opaque" - }); - el.setAttribute("allowfullscreen", "true"); - return el; - }, - title: { - api: function(uid) { - return "https://gdata.youtube.com/feeds/api/videos/" + uid + "?alt=json&fields=title/text(),yt:noembed,app:control/yt:state/@reasonCode"; - }, - text: function(data) { - return data.entry.title.$t; - } - } - }, { - key: 'Loopvid', - regExp: /.*loopvid.appspot.com\/.*/, - dummy: true - }, { - key: 'MediaFire', - regExp: /.*mediafire.com\/.*/, - dummy: true - }, { - key: 'video', - regExp: /(.*\.(ogv|webm|mp4))$/, - style: 'border: 0; width: auto; height: auto;', - el: function(a) { - return $.el('video', { - controls: 'controls', - preload: 'auto', - src: a.dataset.uid - }); - } - } - ] + reload: function(focus) { + return $.globalEval('(function() {\n var container = document.querySelector("#qr .captcha-container");\n window.grecaptcha.reset(container.dataset.widgetID);\n})();'); + } }; QR = { @@ -9146,7 +8924,9 @@ dialog: function() { var dialog, elm, event, i, items, match_max, match_min, name, node, nodes, rules, save, setNode; QR.nodes = nodes = { - el: dialog = UI.dialog('qr', 'top:0;right:0;', "
\uf00d
No selected fileSpoiler\uf0c1Post from URL+Dump\uf00dRemove File
") + el: dialog = UI.dialog('qr', 'top:0;right:0;', { + innerHTML: "
\r\r
\r\r
\r\\uf00d\r
\r
\r
\r\r\r \r
\r
\r\r\r
\r
\r
\r+\r
\r
\r\rNo selected file\r\r\r\rSpoiler\r\\uf0c1\rPost from URL\r+\rDump\r\\uf00d\rRemove File\r\r\r\r
\r\r
\r\r\r\r" + }) }; setNode = function(name, query) { return nodes[name] = $(query, dialog); @@ -9578,226 +9358,6 @@ } }; - QR.captcha = { - init: function() { - var counter, root; - if (d.cookie.indexOf('pass_enabled=1') >= 0) { - return; - } - if (!(this.isEnabled = !!$.id('g-recaptcha'))) { - return; - } - this.captchas = []; - $.get('captchas', [], function(_arg) { - var captchas; - captchas = _arg.captchas; - return QR.captcha.sync(captchas); - }); - $.sync('captchas', this.sync.bind(this)); - root = $.el('div', { - className: 'captcha-root' - }); - $.extend(root, { - innerHTML: "
" - }); - counter = $('.captcha-counter > a', root); - this.nodes = { - root: root, - counter: counter - }; - this.count(); - $.addClass(QR.nodes.el, 'has-captcha'); - $.after(QR.nodes.com.parentNode, root); - $.on(counter, 'click', this.toggle.bind(this)); - return $.on(window, 'captcha:success', (function(_this) { - return function() { - return $.queueTask(function() { - return _this.save(false); - }); - }; - })(this)); - }, - shouldFocus: false, - timeouts: {}, - postsCount: 0, - needed: function() { - var captchaCount; - captchaCount = this.captchas.length; - if (this.nodes.container && !this.timeouts.destroy) { - captchaCount++; - } - this.postsCount = QR.posts.length; - if (this.postsCount === 1 && !Conf['Auto-load captcha'] && !QR.posts[0].com && !QR.posts[0].file) { - this.postsCount = 0; - } - return captchaCount < this.postsCount; - }, - onPostChange: function() { - if (this.postsCount === 0) { - this.setup(); - } - if (QR.posts.length === 1 && !Conf['Auto-load captcha'] && !QR.posts[0].com && !QR.posts[0].file) { - return this.postsCount = 0; - } - }, - toggle: function() { - if (this.nodes.container && !this.timeouts.destroy) { - return this.destroy(); - } else { - return this.setup(true, true); - } - }, - setup: function(focus, force) { - if (!(this.isEnabled && (this.needed() || force))) { - return; - } - $.addClass(QR.nodes.el, 'captcha-open'); - if (focus) { - this.shouldFocus = true; - } - if (this.timeouts.destroy) { - clearTimeout(this.timeouts.destroy); - delete this.timeouts.destroy; - return this.reload(); - } - if (this.nodes.container) { - return; - } - this.nodes.container = $.el('div', { - className: 'captcha-container' - }); - $.prepend(this.nodes.root, this.nodes.container); - new MutationObserver(this.afterSetup.bind(this)).observe(this.nodes.container, { - childList: true, - subtree: true - }); - return $.globalEval('(function() {\n function render() {\n var container = document.querySelector("#qr .captcha-container");\n container.dataset.widgetID = window.grecaptcha.render(container, {\n sitekey: \'6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc\',\n theme: document.documentElement.classList.contains(\'tomorrow\') ? \'dark\' : \'light\',\n callback: function(response) {\n window.dispatchEvent(new CustomEvent("captcha:success", {detail: response}));\n }\n });\n }\n if (window.grecaptcha) {\n render();\n } else {\n var cbNative = window.onRecaptchaLoaded;\n window.onRecaptchaLoaded = function() {\n render();\n cbNative();\n }\n }\n})();'); - }, - afterSetup: function(mutations) { - var iframe, mutation, node, textarea, _i, _j, _len, _len1, _ref; - for (_i = 0, _len = mutations.length; _i < _len; _i++) { - mutation = mutations[_i]; - _ref = mutation.addedNodes; - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - node = _ref[_j]; - if (iframe = $.x('./descendant-or-self::iframe', node)) { - this.setupIFrame(iframe); - } - if (textarea = $.x('./descendant-or-self::textarea', node)) { - this.setupTextArea(textarea); - } - } - } - }, - setupIFrame: function(iframe) { - this.setupTime = Date.now(); - if (QR.nodes.el.getBoundingClientRect().bottom > doc.clientHeight) { - QR.nodes.el.style.top = null; - QR.nodes.el.style.bottom = '0px'; - } - if (this.shouldFocus) { - iframe.focus(); - } - return this.shouldFocus = false; - }, - setupTextArea: function(textarea) { - return $.one(textarea, 'input', (function(_this) { - return function() { - return _this.save(true); - }; - })(this)); - }, - destroy: function() { - if (!this.isEnabled) { - return; - } - delete this.timeouts.destroy; - $.rmClass(QR.nodes.el, 'captcha-open'); - if (this.nodes.container) { - $.rm(this.nodes.container); - } - return delete this.nodes.container; - }, - sync: function(captchas) { - if (captchas == null) { - captchas = []; - } - this.captchas = captchas; - this.clear(); - return this.count(); - }, - getOne: function() { - var captcha; - this.clear(); - if (captcha = this.captchas.shift()) { - this.count(); - $.set('captchas', this.captchas); - return captcha.response; - } else { - return null; - } - }, - save: function(pasted) { - var reload, _base; - $.forceSync('captchas'); - reload = (QR.cooldown.auto || Conf['Post on Captcha Completion']) && this.needed(); - this.captchas.push({ - response: $('textarea', this.nodes.container).value, - timeout: (pasted ? this.setupTime : Date.now()) + 2 * $.MINUTE - }); - this.count(); - $.set('captchas', this.captchas); - if (reload) { - this.shouldFocus = true; - this.reload(); - } else { - if (pasted) { - this.destroy(); - } else { - if ((_base = this.timeouts).destroy == null) { - _base.destroy = setTimeout(this.destroy.bind(this), 3 * $.SECOND); - } - } - QR.nodes.status.focus(); - } - if (Conf['Post on Captcha Completion'] && !QR.cooldown.auto) { - return QR.submit(); - } - }, - clear: function() { - var captcha, i, now, _i, _len, _ref; - if (!this.captchas.length) { - return; - } - $.forceSync('captchas'); - now = Date.now(); - _ref = this.captchas; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - captcha = _ref[i]; - if (captcha.timeout > now) { - break; - } - } - if (!i) { - return; - } - this.captchas = this.captchas.slice(i); - this.count(); - $.set('captchas', this.captchas); - return this.setup(true); - }, - count: function() { - this.nodes.counter.textContent = "Captchas: " + this.captchas.length; - clearTimeout(this.timeouts.clear); - if (this.captchas.length) { - return this.timeouts.clear = setTimeout(this.clear.bind(this), this.captchas[0].timeout - Date.now()); - } - }, - reload: function(focus) { - return $.globalEval('(function() {\n var container = document.querySelector("#qr .captcha-container");\n window.grecaptcha.reset(container.dataset.widgetID);\n})();'); - } - }; - QR.cooldown = { init: function() { var key, setTimers, type; @@ -11534,6 +11094,557 @@ } }; + Linkify = { + init: function() { + var type, _i, _len, _ref; + if (!Conf['Linkify']) { + return; + } + this.types = {}; + _ref = this.ordered_types; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + type = _ref[_i]; + this.types[type.key] = type; + } + if (Conf['Comment Expansion']) { + ExpandComment.callbacks.push(this.node); + } + if (Conf['Embedding'] || Conf['Link Title']) { + this.embedProcess = Function('link', 'post', "var data = this.services(link);\nif (data) {" + ((Conf['Embedding'] ? 'this.embed(data); ' : '') + (Conf['Link Title'] ? 'data.push(post); this.title(data);' : '')) + "}"); + } + return Post.callbacks.push({ + name: 'Linkify', + cb: this.node + }); + }, + events: function(post) { + var el, i, items; + i = 0; + items = $$('.embedder', post.nodes.comment); + while (el = items[i++]) { + $.on(el, 'click', Linkify.cb.toggle); + if ($.hasClass(el, 'embedded')) { + Linkify.cb.toggle.call(el); + } + } + }, + node: function() { + var data, end, endNode, i, index, length, link, links, node, result, saved, snapshot, space, test, word; + if (this.isClone) { + return (Conf['Embedding'] ? Linkify.events(this) : null); + } + if (!Linkify.regString.test(this.info.comment)) { + return; + } + test = /[^\s'"]+/g; + space = /[\s'"]/; + snapshot = $.X('.//br|.//text()', this.nodes.comment); + i = 0; + links = []; + while (node = snapshot.snapshotItem(i++)) { + data = node.data; + if (!data || node.parentElement.nodeName === "A") { + continue; + } + while (result = test.exec(data)) { + index = result.index; + endNode = node; + word = result[0]; + if ((length = index + word.length) === data.length) { + test.lastIndex = 0; + while ((saved = snapshot.snapshotItem(i++))) { + if (saved.nodeName === 'BR') { + break; + } + endNode = saved; + data = saved.data; + word += data; + length = data.length; + if (end = space.exec(data)) { + test.lastIndex = length = end.index; + i--; + break; + } + } + } + if (Linkify.regString.exec(word)) { + links.push(Linkify.makeRange(node, endNode, index, length)); + } + if (!(test.lastIndex && node === endNode)) { + break; + } + } + } + i = links.length; + while (i--) { + link = links[i]; + Linkify.embedProcess(Linkify.makeLink(link), this); + } + }, + embedProcess: function() {}, + regString: /((https?|mailto|git|magnet|ftp|irc):([a-z\d%\/])|[-a-z\d]+[.](aero|asia|biz|cat|com|coop|info|int|jobs|mobi|museum|name|net|org|post|pro|tel|travel|xxx|edu|gov|mil|[a-z]{2})([:\/]|(?!.))|[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}|[-\w\d.@]+@[a-z\d.-]+\.[a-z\d])/i, + makeRange: function(startNode, endNode, startOffset, endOffset) { + var range; + range = document.createRange(); + range.setStart(startNode, startOffset); + range.setEnd(endNode, endOffset); + return range; + }, + makeLink: function(range) { + var a, i, t, text; + text = range.toString(); + i = 0; + while (/[(\[{<>]/.test(text.charAt(i))) { + i++; + } + if (i) { + text = text.slice(i); + while (range.startOffset + i >= range.startContainer.data.length) { + i--; + } + if (i) { + range.setStart(range.startContainer, range.startOffset + i); + } + } + i = 0; + while (/[)\]}>.,]/.test(t = text.charAt(text.length - (1 + i)))) { + if (!(/[.,]/.test(t) || (text.match(/[()\[\]{}<>]/g)).length % 2)) { + break; + } + i++; + } + if (i) { + text = text.slice(0, -i); + while (range.endOffset - i < 0) { + i--; + } + if (i) { + range.setEnd(range.endContainer, range.endOffset - i); + } + } + if (!/(mailto:|.+:\/\/)/.test(text)) { + text = (/@/.test(text) ? 'mailto:' : 'http://') + text; + } + a = $.el('a', { + className: 'linkify', + rel: 'nofollow noreferrer', + target: '_blank', + href: text + }); + $.add(a, range.extractContents()); + range.insertNode(a); + range.detach(); + return a; + }, + services: function(link) { + var href, match, type, _i, _len, _ref; + href = link.href; + _ref = Linkify.ordered_types; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + type = _ref[_i]; + if (!(match = type.regExp.exec(href))) { + continue; + } + if (type.dummy) { + return; + } + return [type.key, match[1], match[2], link]; + } + }, + embed: function(data) { + var embed, href, key, link, name, options, post, uid, value, _ref; + key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; + href = link.href; + embed = $.el('a', { + className: 'embedder', + href: 'javascript:;', + textContent: '(embed)' + }); + _ref = { + key: key, + href: href, + uid: uid, + options: options + }; + for (name in _ref) { + value = _ref[name]; + embed.dataset[name] = value; + } + $.addClass(link, "" + embed.dataset.key); + $.on(embed, 'click', Linkify.cb.toggle); + $.after(link, [$.tn(' '), embed]); + if (Conf['Auto-embed']) { + return Linkify.cb.toggle.call(embed); + } + }, + title: function(data) { + var err, key, link, options, post, service, title, titles, uid; + key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; + if (!(service = Linkify.types[key].title)) { + return; + } + titles = Conf['CachedTitles']; + if (title = titles[uid]) { + return link.textContent = title[0]; + } else { + try { + return $.cache(service.api(uid), (function() { + return Linkify.cb.title(this, data); + }), { + responseType: 'json' + }); + } catch (_error) { + err = _error; + link.innerHTML = 'Title Link Blocked (are you using NoScript?)'; + $.prepend(link, $.tn("[" + key + "] ")); + } + } + }, + cb: { + toggle: function() { + if ($.hasClass(this, "embedded")) { + $.rm(this.previousElementSibling); + this.previousElementSibling.hidden = false; + this.textContent = '(embed)'; + } else { + this.previousElementSibling.hidden = true; + $.before(this, Linkify.cb.embed(this)); + this.textContent = '(unembed)'; + } + return $.toggleClass(this, 'embedded'); + }, + embed: function(a) { + var el, type; + el = (type = Linkify.types[a.dataset.key]).el(a); + el.style.cssText = type.style != null ? type.style : "border: 0; width: 640px; height: 390px"; + return el; + }, + title: function(req, data) { + var key, link, link2, options, post, post2, service, status, text, uid, _i, _j, _len, _len1, _ref, _ref1; + key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; + status = req.status; + service = Linkify.types[key].title; + text = "[" + key + "] " + ((function() { + switch (status) { + case 200: + case 304: + return service.text(req.response); + case 404: + return "Not Found"; + case 403: + return "Forbidden or Private"; + default: + return "" + status + "'d"; + } + })()); + link.textContent = text; + _ref = post.clones; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + post2 = _ref[_i]; + _ref1 = $$('a', post2.nodes.comment); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + link2 = _ref1[_j]; + if (link2.href === link.href) { + link2.textContent = text; + } + } + } + } + }, + ordered_types: [ + { + key: 'audio', + regExp: /(.*\.(mp3|ogg|wav))$/, + style: '', + el: function(a) { + return $.el('audio', { + controls: true, + preload: 'auto', + src: a.dataset.uid + }); + } + }, { + key: 'gist', + regExp: /.*(?:gist.github.com.*\/)([^\/][^\/]*)$/, + el: function(a) { + var div; + return div = $.el('iframe', { + src: "http://www.purplegene.com/script?url=https://gist.github.com/" + a.dataset.uid + ".js" + }); + }, + title: { + api: function(uid) { + return "https://api.github.com/gists/" + uid; + }, + text: function(_arg) { + var file, files; + files = _arg.files; + for (file in files) { + if (files.hasOwnProperty(file)) { + return file; + } + } + } + } + }, { + key: 'image', + regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/, + style: 'border: 0; width: auto; height: auto;', + el: function(a) { + var el; + el = $.el('div'); + el.innerHTML = ''; + el.firstChild.href = el.firstChild.firstChild.src = a.dataset.href; + return el; + } + }, { + key: 'InstallGentoo', + regExp: /.*(?:paste.installgentoo.com\/view\/)([0-9a-z_]+)/, + el: function(a) { + return $.el('iframe', { + src: "http://paste.installgentoo.com/view/embed/" + a.dataset.uid + }); + } + }, { + key: 'Twitter', + regExp: /.*twitter.com\/(.+\/status\/\d+)/, + el: function(a) { + return $.el('iframe', { + src: "https://twitframe.com/show?url=https://twitter.com/" + a.dataset.uid + }); + } + }, { + key: 'LiveLeak', + regExp: /.*(?:liveleak.com\/view.+i=)([0-9a-z_]+)/, + el: function(a) { + var el; + el = $.el('iframe', { + width: "640", + height: "360", + src: "http://www.liveleak.com/ll_embed?i=" + a.dataset.uid, + frameborder: "0" + }); + el.setAttribute("allowfullscreen", "true"); + return el; + } + }, { + key: 'MediaCrush', + regExp: /.*(?:mediacru.sh\/)([0-9a-z_-]+)/i, + style: 'border: 0;', + el: function(a) { + var el; + el = $.el('div'); + $.cache("https://mediacru.sh/" + a.dataset.uid + ".json", function() { + var embed, ext, file, files, i, status, type, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _results, _results1; + status = this.status; + if (status !== 200 && status !== 304) { + return el.textContent = "ERROR " + status; + } + files = this.response.files; + _ref = ['video/webm', 'video/mp4', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'audio/mpeg', 'audio/ogg']; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + type = _ref[_i]; + for (_j = 0, _len1 = files.length; _j < _len1; _j++) { + file = files[_j]; + if (file.type === type) { + embed = file; + break; + } + } + if (embed) { + break; + } + } + if (!embed) { + return div.textContent = "ERROR: Not a valid filetype"; + } + switch (embed.type) { + case 'video/mp4': + case 'video/webm': + case 'video/ogv': + el.innerHTML = ''; + _ref1 = ['mp4', 'webm', 'ogv']; + _results = []; + for (i = _k = 0, _len2 = _ref1.length; _k < _len2; i = ++_k) { + ext = _ref1[i]; + _results.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); + } + return _results; + break; + case 'image/svg+xml': + case 'image/png': + case 'image/gif': + case 'image/jpeg': + el.innerHTML = ''; + el.firstChild.href = a.dataset.href; + return el.firstChild.firstChild.src = "https://mediacru.sh/" + file.file; + case 'audio/mpeg': + case 'audio/ogg': + el.innerHTML = ''; + _ref2 = ['ogg', 'mp3']; + _results1 = []; + for (i = _l = 0, _len3 = _ref2.length; _l < _len3; i = ++_l) { + ext = _ref2[i]; + _results1.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); + } + return _results1; + break; + default: + return el.textContent = "ERROR: No valid filetype."; + } + }); + return el; + } + }, { + key: 'pastebin', + regExp: /.*(?:pastebin.com\/(?!u\/))([^#\&\?]*).*/, + el: function(a) { + var div; + return div = $.el('iframe', { + src: "http://pastebin.com/embed_iframe.php?i=" + a.dataset.uid + }); + } + }, { + key: 'gfycat', + regExp: /.*gfycat.com\/(?:iframe\/)?(\S*)/, + el: function(a) { + var div; + return div = $.el('iframe', { + src: "http://gfycat.com/iframe/" + a.dataset.uid + }); + } + }, { + key: 'SoundCloud', + regExp: /.*(?:soundcloud.com\/|snd.sc\/)([^#\&\?]*).*/, + style: 'border: 0; width: 500px; height: 400px;', + el: function(a) { + return $.el('iframe', { + src: "//w.soundcloud.com/player/?visual=true&show_comments=false&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(a.dataset.uid)) + }); + }, + title: { + api: function(uid) { + return "//soundcloud.com/oembed?format=json&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(uid)); + }, + text: function(_) { + return _.title; + } + } + }, { + key: 'StrawPoll', + regExp: /strawpoll\.me\/(?:embed_\d+\/)?(\d+)/, + style: 'border: 0; width: 600px; height: 406px;', + el: function(a) { + return $.el('iframe', { + src: "http://strawpoll.me/embed_1/" + a.dataset.uid + }); + } + }, { + key: 'TwitchTV', + regExp: /.*(?:twitch.tv\/)([^#\&\?]*).*/, + style: "border: none; width: 640px; height: 360px;", + el: function(a) { + var channel, id, idparam, obj, result, type, _; + if (result = /(\w+)\/([bc])\/(\d+)/i.exec(a.dataset.uid)) { + _ = result[0], channel = result[1], type = result[2], id = result[3]; + idparam = { + 'b': 'archive_id', + 'c': 'chapter_id' + }; + obj = $.el('object', { + data: 'http://www.twitch.tv/widgets/archive_embed_player.swf' + }); + obj.innerHTML = ''; + obj.children[1].value = "channel=" + channel + "&start_volume=25&auto_play=false&" + idparam[type] + "=" + id; + return obj; + } else { + channel = (/(\w+)/.exec(a.dataset.uid))[0]; + obj = $.el('object', { + data: "http://www.twitch.tv/widgets/live_embed_player.swf?channel=" + channel + }); + obj.innerHTML = ''; + obj.children[1].value = "hostname=www.twitch.tv&channel=" + channel + "&auto_play=true&start_volume=25"; + return obj; + } + } + }, { + key: 'Vocaroo', + regExp: /.*(?:vocaroo.com\/)([^#\&\?]*).*/, + style: '', + el: function(a) { + return $.el('audio', { + controls: true, + preload: 'auto', + src: "http://vocaroo.com/media_command.php?media=" + (a.dataset.uid.replace(/^i\//, '')) + "&command=download_ogg" + }); + } + }, { + key: 'Vimeo', + regExp: /.*(?:vimeo.com\/)([^#\&\?]*).*/, + el: function(a) { + return $.el('iframe', { + src: "//player.vimeo.com/video/" + a.dataset.uid + "?wmode=opaque" + }); + }, + title: { + api: function(uid) { + return "https://vimeo.com/api/oembed.json?url=http://vimeo.com/" + uid; + }, + text: function(_) { + return _.title; + } + } + }, { + key: 'Vine', + regExp: /.*(?:vine.co\/)([^#\&\?]*).*/, + style: 'border: none; width: 500px; height: 500px;', + el: function(a) { + return $.el('iframe', { + src: "https://vine.co/" + a.dataset.uid + "/card" + }); + } + }, { + key: 'YouTube', + regExp: /.*(?:youtu.be\/|youtube.*v=|youtube.*\/embed\/|youtube.*\/v\/|youtube.*videos\/)([^#\&\?]*)\??(t\=.*)?/, + el: function(a) { + var el; + el = $.el('iframe', { + src: "//www.youtube.com/embed/" + a.dataset.uid + (a.dataset.option ? '#' + a.dataset.option : '') + "?wmode=opaque" + }); + el.setAttribute("allowfullscreen", "true"); + return el; + }, + title: { + api: function(uid) { + return "https://gdata.youtube.com/feeds/api/videos/" + uid + "?alt=json&fields=title/text(),yt:noembed,app:control/yt:state/@reasonCode"; + }, + text: function(data) { + return data.entry.title.$t; + } + } + }, { + key: 'Loopvid', + regExp: /.*loopvid.appspot.com\/.*/, + dummy: true + }, { + key: 'MediaFire', + regExp: /.*mediafire.com\/.*/, + dummy: true + }, { + key: 'video', + regExp: /(.*\.(ogv|webm|mp4))$/, + style: 'border: 0; width: auto; height: auto;', + el: function(a) { + return $.el('video', { + controls: 'controls', + preload: 'auto', + src: a.dataset.uid + }); + } + } + ] + }; + ArchiveLink = { init: function() { var div, entry, type, _i, _len, _ref; @@ -13410,7 +13521,7 @@ } return Redirect.data = o; }, - archives: [{"uid":0,"name":"Moe","domain":"archive.moe","http":false,"https":true,"software":"foolfuuka","boards":["a","biz","c","co","diy","gd","h","i","int","jp","k","m","mlp","out","po","r9k","s4s","sci","sp","tg","tv","u","v","vg","vp","vr","wsg"],"files":["a","biz","c","co","diy","gd","h","i","jp","k","m","mlp","po","s4s","sci","tg","u","v","vg","vp","vr","wsg"]},{"uid":3,"name":"4plebs Archive","domain":"archive.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["adv","f","hr","o","pol","s4s","tg","trv","tv","x"],"files":["adv","f","hr","o","pol","s4s","tg","trv","tv","x"]},{"uid":5,"name":"Love is Over","domain":"archive.loveisover.me","http":true,"https":true,"software":"foolfuuka","boards":["c","d","e","i","lgbt","t","u","w","wg"],"files":["c","d","e","i","lgbt","t","u","w","wg"]},{"uid":8,"name":"Rebecca Black Tech","domain":"archive.rebeccablacktech.com","http":false,"https":true,"software":"fuuka","boards":["cgl","g","mu","w"],"files":["cgl","g","mu","w"]},{"uid":10,"name":"warosu","domain":"warosu.org","http":false,"https":true,"software":"fuuka","boards":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"],"files":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"]},{"uid":15,"name":"fgts","domain":"fgts.jp","http":true,"https":true,"software":"foolfuuka","boards":["asp","cm","h","hc","hm","n","p","r","s","soc","y"],"files":["asp","cm","h","hc","hm","n","p","r","s","soc","y"]},{"uid":17,"name":"imcute","domain":"imcute.yt","http":true,"https":false,"software":"foolfuuka","boards":["an","fit","gif","int","mlp","out","r9k","toy"],"files":["an","fit","gif","int","mlp","out","r9k","toy"]}], + archives: [{"uid":0,"name":"Moe","domain":"archive.moe","http":false,"https":true,"software":"foolfuuka","boards":["a","biz","c","co","diy","gd","h","i","int","jp","k","m","mlp","out","po","r9k","s4s","sci","tg","tv","u","v","vg","vp","vr","wsg"],"files":["a","biz","c","co","diy","gd","h","i","jp","k","m","mlp","po","s4s","sci","tg","u","v","vg","vp","vr","wsg"]},{"uid":3,"name":"4plebs Archive","domain":"archive.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["adv","f","hr","o","pol","s4s","tg","trv","tv","x"],"files":["adv","f","hr","o","pol","s4s","tg","trv","tv","x"]},{"uid":5,"name":"Love is Over","domain":"archive.loveisover.me","http":true,"https":true,"software":"foolfuuka","boards":["c","d","e","i","lgbt","t","u","w","wg"],"files":["c","d","e","i","lgbt","t","u","w","wg"]},{"uid":8,"name":"Rebecca Black Tech","domain":"archive.rebeccablacktech.com","http":false,"https":true,"software":"fuuka","boards":["cgl","g","mu","w"],"files":["cgl","g","mu","w"]},{"uid":10,"name":"warosu","domain":"warosu.org","http":false,"https":true,"software":"fuuka","boards":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"],"files":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"]},{"uid":15,"name":"fgts","domain":"fgts.jp","http":true,"https":true,"software":"foolfuuka","boards":["asp","cm","h","hc","hm","n","p","r","s","soc","y"],"files":["asp","cm","h","hc","hm","n","p","r","s","soc","y"]},{"uid":21,"name":"imcute","domain":"imcute.yt","http":true,"https":false,"software":"foolfuuka","boards":["an","fit","gif","int","mlp","out","r9k","toy"],"files":["an","fit","gif","int","mlp","out","r9k","toy"],"imagehosts":["http://imcute.yt/"]}], to: function(dest, data) { var archive; archive = (dest === 'search' || dest === 'board' ? Redirect.data.thread : Redirect.data[dest])[data.boardID]; @@ -13440,9 +13551,13 @@ return "" + (Redirect.protocol(archive)) + archive.domain + "/" + path; }, post: function(archive, _arg) { - var URL, boardID, postID; + var URL, boardID, postID, protocol; boardID = _arg.boardID, postID = _arg.postID; - URL = new String("" + (Redirect.protocol(archive)) + archive.domain + "/_/api/chan/post/?board=" + boardID + "&num=" + postID); + protocol = Redirect.protocol(archive); + URL = new String("" + protocol + archive.domain + "/_/api/chan/post/?board=" + boardID + "&num=" + postID); + if (!Redirect.securityCheck(URL)) { + return ''; + } URL.archive = archive; return URL; }, @@ -13463,75 +13578,1392 @@ value = encodeURIComponent(value); path = archive.software === 'foolfuuka' ? "" + boardID + "/search/" + type + "/" + value : "" + boardID + "/?task=search2&search_" + (type === 'image' ? 'media_hash' : type) + "=" + value; return "" + (Redirect.protocol(archive)) + archive.domain + "/" + path; + }, + securityCheck: function(URL) { + return /^https:\/\//.test(URL) || location.protocol === 'http:' || Conf['Except Archives from Encryption']; + }, + navigate: function(URL, alternative) { + if (URL && (Redirect.securityCheck(URL) || confirm("Redirect to " + URL + "?\n\nYour connection will not be encrypted."))) { + return location.replace(URL); + } else if (alternative) { + return location.replace(alternative); + } } }; - [ - { - "uid": 0, - "name": "Moe", - "domain": "archive.moe", - "http": false, - "https": true, - "software": "foolfuuka", - "boards": ["a", "biz", "c", "co", "diy", "gd", "h", "i", "int", "jp", "k", "m", "mlp", "out", "po", "r9k", "s4s", "sci", "sp", "tg", "tv", "u", "v", "vg", "vp", "vr", "wsg"], - "files": ["a", "biz", "c", "co", "diy", "gd", "h", "i", "jp", "k", "m", "mlp", "po", "s4s", "sci", "tg", "u", "v", "vg", "vp", "vr", "wsg"] - }, { - "uid": 3, - "name": "4plebs Archive", - "domain": "archive.4plebs.org", - "http": true, - "https": true, - "software": "foolfuuka", - "boards": ["adv", "f", "hr", "o", "pol", "s4s", "tg", "trv", "tv", "x"], - "files": ["adv", "f", "hr", "o", "pol", "s4s", "tg", "trv", "tv", "x"] - }, { - "uid": 5, - "name": "Love is Over", - "domain": "archive.loveisover.me", - "http": true, - "https": true, - "software": "foolfuuka", - "boards": ["c", "d", "e", "i", "lgbt", "t", "u", "w", "wg"], - "files": ["c", "d", "e", "i", "lgbt", "t", "u", "w", "wg"] - }, { - "uid": 8, - "name": "Rebecca Black Tech", - "domain": "archive.rebeccablacktech.com", - "http": false, - "https": true, - "software": "fuuka", - "boards": ["cgl", "g", "mu", "w"], - "files": ["cgl", "g", "mu", "w"] - }, { - "uid": 10, - "name": "warosu", - "domain": "warosu.org", - "http": false, - "https": true, - "software": "fuuka", - "boards": ["3", "biz", "cgl", "ck", "diy", "fa", "g", "ic", "jp", "lit", "sci", "tg", "vr"], - "files": ["3", "biz", "cgl", "ck", "diy", "fa", "g", "ic", "jp", "lit", "sci", "tg", "vr"] - }, { - "uid": 15, - "name": "fgts", - "domain": "fgts.jp", - "http": true, - "https": true, - "software": "foolfuuka", - "boards": ["asp", "cm", "h", "hc", "hm", "n", "p", "r", "s", "soc", "y"], - "files": ["asp", "cm", "h", "hc", "hm", "n", "p", "r", "s", "soc", "y"] - }, { - "uid": 17, - "name": "imcute", - "domain": "imcute.yt", - "http": true, - "https": false, - "software": "foolfuuka", - "boards": ["an", "fit", "gif", "int", "mlp", "out", "r9k", "toy"], - "files": ["an", "fit", "gif", "int", "mlp", "out", "r9k", "toy"] + PSAHiding = { + init: function() { + if (!Conf['Announcement Hiding']) { + return; + } + $.addClass(doc, 'hide-announcement'); + return $.on(d, '4chanXInitFinished', this.setup); + }, + setup: function() { + var btn, entry, psa; + $.off(d, '4chanXInitFinished', PSAHiding.setup); + if (!(psa = $.id('globalMessage'))) { + return; + } + entry = { + el: $.el('a', { + textContent: 'Show announcement', + className: 'show-announcement', + href: 'javascript:;' + }), + order: 50, + open: function() { + return psa.hidden; + } + }; + Header.menu.addEntry(entry); + $.on(entry.el, 'click', PSAHiding.toggle); + PSAHiding.btn = btn = $.el('span', { + innerHTML: '[Dismiss]', + title: 'Mark announcement as read and hide.', + className: 'hide-announcement', + href: 'javascript:;', + textContent: '[ - ]' + }); + $.on(btn, 'click', PSAHiding.toggle); + $.get('hiddenPSA', 0, function(_arg) { + var hiddenPSA; + hiddenPSA = _arg.hiddenPSA; + PSAHiding.sync(hiddenPSA); + $.add(psa, btn); + return $.rmClass(doc, 'hide-announcement'); + }); + return $.sync('hiddenPSA', PSAHiding.sync); + }, + toggle: function(e) { + var UTC; + if ($.hasClass(this, 'hide-announcement')) { + UTC = +$.id('globalMessage').dataset.utc; + $.set('hiddenPSA', UTC); + } else { + $.event('CloseMenu'); + $["delete"]('hiddenPSA'); + } + return PSAHiding.sync(UTC); + }, + sync: function(UTC) { + var hr, psa; + psa = $.id('globalMessage'); + psa.hidden = PSAHiding.btn.hidden = UTC && UTC >= +psa.dataset.utc ? true : false; + if ((hr = psa.nextElementSibling) && hr.nodeName === 'HR') { + return hr.hidden = psa.hidden; + } } - ]; + }; + + CatalogLinks = { + init: function() { + var el, input; + if (!Conf['Catalog Links']) { + return; + } + CatalogLinks.el = el = $.el('label', { + id: 'toggleCatalog', + href: 'javascript:;', + innerHTML: " Catalog Links" + }); + input = $('input', el); + $.on(input, 'change', this.toggle); + $.sync('Header catalog links', CatalogLinks.set); + Header.menu.addEntry({ + el: el, + order: 95 + }); + return $.on(d, '4chanXInitFinished', function() { + return CatalogLinks.set(Conf['Header catalog links']); + }); + }, + toggle: function() { + $.event('CloseMenu'); + $.set('Header catalog links', this.checked); + return CatalogLinks.set(this.checked); + }, + set: function(useCatalog) { + var a, board, generateURL, path, _i, _len, _ref, _ref1; + path = useCatalog ? 'catalog' : ''; + generateURL = useCatalog && Conf['External Catalog'] ? CatalogLinks.external : function(board) { + return a.href = "/" + board + "/" + path; + }; + _ref = $$("#board-list a:not(.catalog), #boardNavDesktopFoot a"); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + a = _ref[_i]; + 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') || $.hasClass(a, 'external')) { + continue; + } + a.href = generateURL(board); + } + return CatalogLinks.el.title = "Turn catalog links " + (useCatalog ? 'off' : 'on') + "."; + }, + external: function(board) { + if (board === 'a' || board === 'c' || board === 'g' || board === 'co' || board === 'k' || board === 'm' || board === 'o' || board === 'p' || board === 'v' || board === 'vg' || board === 'w' || board === 'cm' || board === '3' || board === 'adv' || board === 'an' || board === 'cgl' || board === 'ck' || board === 'diy' || board === 'fa' || board === 'fit' || board === 'int' || board === 'jp' || board === 'mlp' || board === 'lit' || board === 'mu' || board === 'n' || board === 'po' || board === 'sci' || board === 'toy' || board === 'trv' || board === 'tv' || board === 'vp' || board === 'x' || board === 'q') { + return "http://catalog.neet.tv/" + board; + } else { + return "/" + board + "/catalog"; + } + } + }; + + CustomCSS = { + init: function() { + if (!Conf['Custom CSS']) { + return; + } + return this.addStyle(); + }, + addStyle: function() { + return this.style = $.addStyle(Conf['usercss'], 'CustomCSS'); + }, + rmStyle: function() { + if (this.style) { + $.rm(this.style); + return delete this.style; + } + }, + update: function() { + if (!this.style) { + return this.addStyle(); + } + return this.style.textContent = Conf['usercss']; + } + }; + + Dice = { + init: function() { + if (g.BOARD.ID !== 'tg' || !Conf['Show Dice Roll']) { + return; + } + return Post.callbacks.push({ + name: 'Show Dice Roll', + cb: this.node + }); + }, + node: function() { + var dicestats, roll, _ref; + if (this.isClone || !(dicestats = (_ref = this.info.email) != null ? _ref.match(/dice[+\s](\d+)d(\d+)/) : void 0)) { + return; + } + roll = $('b', this.nodes.comment).firstChild; + return roll.data = "Rolled " + dicestats[1] + "d" + dicestats[2] + ": " + (roll.data.slice(7)); + } + }; + + ExpandComment = { + init: function() { + if (g.VIEW !== 'index' || !Conf['Comment Expansion'] || Conf['JSON Navigation']) { + return; + } + if (g.BOARD.ID === 'g') { + this.callbacks.push(Fourchan.code); + } + if (g.BOARD.ID === 'sci') { + this.callbacks.push(Fourchan.math); + } + return Post.callbacks.push({ + name: 'Comment Expansion', + cb: this.node + }); + }, + node: function() { + var a; + if (a = $('.abbr > a:not([onclick])', this.nodes.comment)) { + return $.on(a, 'click', ExpandComment.cb); + } + }, + callbacks: [], + cb: function(e) { + e.preventDefault(); + return ExpandComment.expand(Get.postFromNode(this)); + }, + expand: function(post) { + var a; + if (post.nodes.longComment && !post.nodes.longComment.parentNode) { + $.replace(post.nodes.shortComment, post.nodes.longComment); + post.nodes.comment = post.nodes.longComment; + return; + } + if (!(a = $('.abbr > a', post.nodes.comment))) { + return; + } + a.textContent = "Post No." + post + " Loading..."; + return $.cache("//a.4cdn.org" + (a.pathname.split('/').splice(0, 4).join('/')) + ".json", function() { + return ExpandComment.parse(this, a, post); + }); + }, + contract: function(post) { + var a; + if (!post.nodes.shortComment) { + return; + } + a = $('.abbr > a', post.nodes.shortComment); + a.textContent = 'here'; + $.replace(post.nodes.longComment, post.nodes.shortComment); + return post.nodes.comment = post.nodes.shortComment; + }, + parse: function(req, a, post) { + var callback, clone, comment, href, postObj, posts, quote, spoilerRange, status, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; + status = req.status; + if (status !== 200 && status !== 304) { + a.textContent = "Error " + req.statusText + " (" + status + ")"; + return; + } + posts = req.response.posts; + if (spoilerRange = posts[0].custom_spoiler) { + Build.spoilerRange[g.BOARD] = spoilerRange; + } + for (_i = 0, _len = posts.length; _i < _len; _i++) { + postObj = posts[_i]; + if (postObj.no === post.ID) { + break; + } + } + if (postObj.no !== post.ID) { + a.textContent = "Post No." + post + " not found."; + return; + } + comment = post.nodes.comment; + clone = comment.cloneNode(false); + clone.innerHTML = postObj.com; + _ref = $$('.quotelink', clone); + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { + quote = _ref[_j]; + href = quote.getAttribute('href'); + if (href[0] === '/') { + continue; + } + if (href[0] === '#') { + quote.href = "" + (a.pathname.split('/').splice(0, 4).join('/')) + href; + } else { + quote.href = "" + (a.pathname.split('/').splice(0, 3).join('/')) + "/" + href; + } + } + post.nodes.shortComment = comment; + $.replace(comment, clone); + post.nodes.comment = post.nodes.longComment = clone; + post.parseComment(); + post.parseQuotes(); + _ref1 = ExpandComment.callbacks; + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { + callback = _ref1[_k]; + callback.call(post); + } + } + }; + + ExpandThread = { + statuses: {}, + init: function() { + if (g.VIEW === 'thread' || !Conf['Thread Expansion']) { + return; + } + return $.on(d, (Conf['JSON Navigation'] ? 'IndexRefresh' : '4chanXInitFinished'), this.onIndexRefresh); + }, + setButton: function(thread) { + var a, summary; + if (!(summary = $.x('following-sibling::*[contains(@class,"summary")][1]', thread.OP.nodes.root))) { + return; + } + a = $.el('a', { + textContent: ExpandThread.text.apply(ExpandThread, ['+'].concat(__slice.call(summary.textContent.match(/\d+/g)))), + href: "res/" + thread.ID, + className: 'summary' + }); + $.on(a, 'click', ExpandThread.cbToggle); + return $.replace(summary, a); + }, + disconnect: function() { + this.refresh(); + return $.off(d, 'IndexRefresh', this.onIndexRefresh); + }, + refresh: function(disconnect) { + var status, threadID, _ref, _ref1; + if (g.VIEW === 'thread' || !Conf['Thread Expansion']) { + return; + } + _ref = ExpandThread.statuses; + for (threadID in _ref) { + status = _ref[threadID]; + if ((_ref1 = status.req) != null) { + _ref1.abort(); + } + delete ExpandThread.statuses[threadID]; + } + }, + onIndexRefresh: function() { + ExpandThread.refresh(); + return g.BOARD.threads.forEach(function(thread) { + return ExpandThread.setButton(thread); + }); + }, + text: function(status, posts, files) { + return ("" + status + " " + posts + " post" + (posts > 1 ? 's' : '')) + (+files ? " and " + files + " image repl" + (files > 1 ? 'ies' : 'y') : "") + (" " + (status === '-' ? 'shown' : 'omitted') + "."); + }, + cbToggle: function(e) { + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) { + return; + } + e.preventDefault(); + return ExpandThread.toggle(Get.threadFromNode(this)); + }, + toggle: function(thread) { + var a, threadRoot; + threadRoot = thread.OP.nodes.root.parentNode; + if (!(a = $('.summary', threadRoot))) { + return; + } + if (thread.ID in ExpandThread.statuses) { + return ExpandThread.contract(thread, a, threadRoot); + } else { + return ExpandThread.expand(thread, a, threadRoot); + } + }, + expand: function(thread, a, threadRoot) { + var status; + ExpandThread.statuses[thread] = status = {}; + a.textContent = ExpandThread.text.apply(ExpandThread, ['...'].concat(__slice.call(a.textContent.match(/\d+/g)))); + return status.req = $.cache("//a.4cdn.org/" + thread.board + "/thread/" + thread + ".json", function() { + delete status.req; + return ExpandThread.parse(this, thread, a); + }); + }, + contract: function(thread, a, threadRoot) { + var filesCount, inlined, num, postsCount, replies, reply, status, _i, _len; + status = ExpandThread.statuses[thread]; + delete ExpandThread.statuses[thread]; + if (status.req) { + status.req.abort(); + if (a) { + a.textContent = ExpandThread.text.apply(ExpandThread, ['+'].concat(__slice.call(a.textContent.match(/\d+/g)))); + } + return; + } + replies = $$('.thread > .replyContainer', threadRoot); + if (Conf['Show Replies']) { + num = (function() { + if (thread.isSticky) { + return 1; + } else { + switch (g.BOARD.ID) { + case 'b': + case 'vg': + return 3; + case 't': + return 1; + default: + return 5; + } + } + })(); + replies = replies.slice(0, -num); + } + postsCount = 0; + filesCount = 0; + for (_i = 0, _len = replies.length; _i < _len; _i++) { + reply = replies[_i]; + if (Conf['Quote Inlining']) { + while (inlined = $('.inlined', reply)) { + inlined.click(); + } + } + postsCount++; + if ('file' in Get.postFromRoot(reply)) { + filesCount++; + } + $.rm(reply); + } + return a.textContent = ExpandThread.text('+', postsCount, filesCount); + }, + parse: function(req, thread, a) { + var filesCount, post, postData, posts, postsCount, postsRoot, root, _i, _len, _ref, _ref1; + if ((_ref = req.status) !== 200 && _ref !== 304) { + a.textContent = "Error " + req.statusText + " (" + req.status + ")"; + return; + } + Build.spoilerRange[thread.board] = req.response.posts[0].custom_spoiler; + posts = []; + postsRoot = []; + filesCount = 0; + _ref1 = req.response.posts; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + postData = _ref1[_i]; + if (postData.no === thread.ID) { + continue; + } + if (post = thread.posts[postData.no]) { + if ('file' in post) { + filesCount++; + } + postsRoot.push(post.nodes.root); + continue; + } + root = Build.postFromObject(postData, thread.board.ID); + post = new Post(root, thread, thread.board); + if ('file' in post) { + filesCount++; + } + posts.push(post); + postsRoot.push(root); + } + Post.callbacks.execute(posts); + $.after(a, postsRoot); + postsCount = postsRoot.length; + return a.textContent = ExpandThread.text('-', postsRoot.length, filesCount); + } + }; + + FileInfo = { + init: function() { + if (!Conf['File Info Formatting']) { + return; + } + return Post.callbacks.push({ + name: 'File Info Formatting', + cb: this.node + }); + }, + node: function() { + if (!this.file || this.isClone) { + return; + } + return this.file.text.innerHTML = "" + (FileInfo.format(Conf['fileInfo'], this)) + ""; + }, + format: function(formatString, post) { + return formatString.replace(/%([A-Za-z])/g, function(s, c) { + if (c in FileInfo.formatters) { + return FileInfo.formatters[c].call(post); + } else { + return s; + } + }); + }, + convertUnit: function(size, unit) { + var i; + if (unit === 'B') { + return "" + (size.toFixed()) + " Bytes"; + } + i = 1 + ['KB', 'MB'].indexOf(unit); + while (i--) { + size /= 1024; + } + size = unit === 'MB' ? Math.round(size * 100) / 100 : size.toFixed(); + return "" + size + " " + unit; + }, + escape: function(name) { + return name.replace(/<|>/g, function(c) { + return c === '<' && '<' || '>'; + }); + }, + formatters: { + t: function() { + return this.file.URL.match(/\d+\..+$/)[0]; + }, + T: function() { + return "" + (FileInfo.formatters.t.call(this)) + ""; + }, + l: function() { + return "" + (FileInfo.formatters.n.call(this)) + ""; + }, + L: function() { + return "" + (FileInfo.formatters.N.call(this)) + ""; + }, + n: function() { + var fullname, shortname; + fullname = this.file.name; + shortname = Build.shortFilename(this.file.name, this.isReply); + if (fullname === shortname) { + return FileInfo.escape(fullname); + } else { + return "" + (FileInfo.escape(shortname)) + "" + (FileInfo.escape(fullname)) + ""; + } + }, + N: function() { + return FileInfo.escape(this.file.name); + }, + p: function() { + if (this.file.isSpoiler) { + return 'Spoiler, '; + } else { + return ''; + } + }, + s: function() { + return this.file.size; + }, + B: function() { + return FileInfo.convertUnit(this.file.sizeInBytes, 'B'); + }, + K: function() { + return FileInfo.convertUnit(this.file.sizeInBytes, 'KB'); + }, + M: function() { + return FileInfo.convertUnit(this.file.sizeInBytes, 'MB'); + }, + r: function() { + return this.file.dimensions || 'PDF'; + } + } + }; + + Flash = { + init: function() { + if (g.BOARD.ID === 'f') { + return $.ready(Flash.initReady); + } + }, + initReady: function() { + var nav, sauceLink, swfName; + $.globalEval('SWFEmbed.init()'); + if (g.VIEW !== 'thread') { + return; + } + swfName = $('.fileText > a'); + nav = $('.navLinks.desktop'); + swfName = swfName.href.replace(/^(.*?)\/f\//g, ""); + sauceLink = $.el('a', { + textContent: 'Check Sauce on SWFCHAN', + href: "http://eye.swfchan.com/search/?q=" + swfName + }); + $.addClass(nav, 'swfSauce'); + $.rmClass(nav, 'navLinks'); + $.rmAll(nav); + return $.add(nav, [$.tn('['), sauceLink, $.tn(']')]); + } + }; + + Fourchan = { + init: function() { + var board; + board = g.BOARD.ID; + if (board === 'g') { + $.globalEval("window.addEventListener('prettyprint', function(e) {\n window.dispatchEvent(new CustomEvent('prettyprint:cb', {\n detail: prettyPrintOne(e.detail)\n }));\n}, false);"); + Post.callbacks.push({ + name: 'Parse /g/ code', + cb: this.code + }); + } + if (board === 'sci') { + $.globalEval("window.addEventListener('jsmath', function(e) {\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(document.getElementById(e.detail));\n } else {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push('ProcessBeforeShowing', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);"); + return Post.callbacks.push({ + name: 'Parse /sci/ math', + cb: this.math + }); + } + }, + code: function() { + var apply, pre, _i, _len, _ref; + if (this.isClone) { + return; + } + apply = function(e) { + return pre.innerHTML = e.detail; + }; + $.on(window, 'prettyprint:cb', apply); + _ref = $$('.prettyprint:not(.prettyprinted)', this.nodes.comment); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + pre = _ref[_i]; + $.event('prettyprint', pre.innerHTML, window); + } + $.off(window, 'prettyprint:cb', apply); + }, + math: function() { + if (this.isClone || !$('.math', this.nodes.comment)) { + return; + } + return $.event('jsmath', this.nodes.post.id, window); + } + }; + + IDColor = { + init: function() { + if (!Conf['Color User IDs']) { + return; + } + this.ids = { + Heaven: [0, 0, 0, '#fff'] + }; + return Post.callbacks.push({ + name: 'Color User IDs', + cb: this.node + }); + }, + node: function() { + var rgb, span, uid; + if (this.isClone || !((uid = this.info.uniqueID) && (span = $('span.hand', this.nodes.uniqueID)))) { + return; + } + rgb = IDColor.ids[uid] || IDColor.compute(uid); + span.style.color = rgb[3]; + span.style.backgroundColor = "rgb(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ")"; + $.addClass(span, 'painted'); + return span.title = 'Highlight posts by this ID'; + }, + compute: function(uid) { + var hash, i, rgb; + i = 1; + hash = uid.charCodeAt(0); + while (i < 8) { + hash = (hash << 5) - hash + uid.charCodeAt(i++); + } + rgb = [(hash >> 24) & 0xFF, (hash >> 16) & 0xFF, (hash >> 8) & 0xFF]; + rgb.push((rgb[0] * 0.299 + rgb[1] * 0.587 + rgb[2] * 0.114) > 125 ? '#000' : '#fff'); + return this.ids[uid] = rgb; + } + }; + + Keybinds = { + init: function() { + var hotkey, init; + if (!Conf['Keybinds']) { + return; + } + for (hotkey in Conf.hotkeys) { + $.sync(hotkey, Keybinds.sync); + } + init = function() { + var node, _i, _len, _ref; + $.off(d, '4chanXInitFinished', init); + $.on(d, 'keydown', Keybinds.keydown); + _ref = $$('[accesskey]'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + node = _ref[_i]; + node.removeAttribute('accesskey'); + } + }; + return $.on(d, '4chanXInitFinished', init); + }, + sync: function(key, hotkey) { + return Conf[hotkey] = key; + }, + keydown: function(e) { + var form, key, notification, notifications, op, searchInput, target, thread, threadRoot, _i, _len, _ref; + if (!(key = Keybinds.keyCode(e))) { + return; + } + target = e.target; + if (target.nodeName === 'EMBED') { + return; + } + if ((_ref = target.nodeName) === 'INPUT' || _ref === 'TEXTAREA') { + if (!/(Esc|Alt|Ctrl|Meta|Shift\+\w{2,})/.test(key)) { + return; + } + } + if (g.VIEW !== 'catalog') { + threadRoot = Nav.getThread(); + if (op = $('.op', threadRoot)) { + thread = Get.postFromNode(op).thread; + } + } + switch (key) { + case Conf['Toggle board list']: + if (Conf['Custom Board Navigation']) { + Header.toggleBoardList(); + } + break; + case Conf['Toggle header']: + Header.toggleBarVisibility(); + break; + case Conf['Open empty QR']: + Keybinds.qr(); + break; + case Conf['Open QR']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.qr(threadRoot); + break; + case Conf['Open settings']: + Settings.open(); + break; + case Conf['Close']: + if ($.id('fourchanx-settings')) { + Settings.close(); + } else if ((notifications = $$('.notification')).length) { + for (_i = 0, _len = notifications.length; _i < _len; _i++) { + notification = notifications[_i]; + $('.close', notification).click(); + } + } else if (QR.nodes) { + if (Conf['Persistent QR']) { + QR.hide(); + } else { + QR.close(); + } + } + break; + case Conf['Spoiler tags']: + if (target.nodeName !== 'TEXTAREA') { + return; + } + Keybinds.tags('spoiler', target); + break; + case Conf['Code tags']: + if (target.nodeName !== 'TEXTAREA') { + return; + } + Keybinds.tags('code', target); + break; + case Conf['Eqn tags']: + if (target.nodeName !== 'TEXTAREA') { + return; + } + Keybinds.tags('eqn', target); + break; + case Conf['Math tags']: + if (target.nodeName !== 'TEXTAREA') { + return; + } + Keybinds.tags('math', target); + break; + case Conf['Toggle sage']: + if (QR.nodes) { + Keybinds.sage(); + } + break; + case Conf['Submit QR']: + if (QR.nodes && !QR.status()) { + QR.submit(); + } + break; + case Conf['Post Without Name']: + if (QR.nodes && !QR.status()) { + Keybinds.name(); + QR.submit(); + } + break; + case Conf['Update']: + switch (g.VIEW) { + case 'thread': + ThreadUpdater.update(); + break; + case 'index': + if (Conf['JSON Navigation']) { + Index.update(); + } + } + break; + case Conf['Watch']: + if (g.VIEW === 'catalog') { + return; + } + ThreadWatcher.toggle(thread); + break; + case Conf['Expand image']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.img(threadRoot); + break; + case Conf['Expand images']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.img(threadRoot, true); + break; + case Conf['Open Gallery']: + if (g.VIEW === 'catalog') { + return; + } + Gallery.cb.toggle(); + break; + case Conf['fappeTyme']: + if (g.VIEW === 'catalog') { + return; + } + FappeTyme.cb.toggle.call({ + name: 'fappe' + }); + break; + case Conf['werkTyme']: + if (g.VIEW === 'catalog') { + return; + } + FappeTyme.cb.toggle.call({ + name: 'werk' + }); + break; + case Conf['Front page']: + if (Conf['JSON Navigation'] && g.VIEW === 'index') { + Index.userPageNav(1); + } else { + window.location = "/" + g.BOARD + "/"; + } + break; + case Conf['Open front page']: + $.open("/" + g.BOARD + "/"); + break; + case Conf['Next page']: + if (g.VIEW !== 'index') { + return; + } + if (Conf['JSON Navigation']) { + if (Conf['Index Mode'] !== 'all pages') { + $('.next button', Index.pagelist).click(); + } + } else { + if (form = $('.next form')) { + window.location = form.action; + } + } + break; + case Conf['Previous page']: + if (g.VIEW !== 'index') { + return; + } + if (Conf['JSON Navigation']) { + if (Conf['Index Mode'] !== 'all pages') { + $('.prev button', Index.pagelist).click(); + } + } else { + if (form = $('.prev form')) { + window.location = form.action; + } + } + break; + case Conf['Search form']: + if (g.VIEW !== 'index') { + return; + } + searchInput = Conf['JSON Navigation'] ? Index.searchInput : $.id('search-box'); + Header.scrollToIfNeeded(searchInput); + searchInput.click(); + searchInput.focus(); + break; + case Conf['Paged mode']: + if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'paged')) { + return; + } + Index.setIndexMode('paged'); + break; + case Conf['All pages mode']: + if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'all pages')) { + return; + } + Index.setIndexMode('all pages'); + break; + case Conf['Catalog mode']: + if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'catalog')) { + return; + } + Index.setIndexMode('catalog'); + break; + case Conf['Cycle sort type']: + if (g.VIEW !== 'index') { + return; + } + Index.cycleSortType(); + break; + case Conf['Open catalog']: + if (Conf['External Catalog']) { + window.location = CatalogLinks.external(g.BOARD.ID); + } else { + if (!Conf['JSON Navigation']) { + return window.location = "/" + g.BOARD + "/catalog"; + } + if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'catalog')) { + return; + } + Index.setIndexMode('catalog'); + } + break; + case Conf['Next thread']: + if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { + return; + } + Nav.scroll(+1); + break; + case Conf['Previous thread']: + if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { + return; + } + Nav.scroll(-1); + break; + case Conf['Expand thread']: + if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { + return; + } + ExpandThread.toggle(thread); + break; + case Conf['Open thread']: + if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { + return; + } + Keybinds.open(thread); + break; + case Conf['Open thread tab']: + if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { + return; + } + Keybinds.open(thread, true); + break; + case Conf['Next reply']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.hl(+1, threadRoot); + break; + case Conf['Previous reply']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.hl(-1, threadRoot); + break; + case Conf['Deselect reply']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.hl(0, threadRoot); + break; + case Conf['Hide']: + PostHiding.toggle(thread.OP); + break; + case Conf['Previous Post Quoting You']: + QuoteMarkers.cb.seek('preceding'); + break; + case Conf['Next Post Quoting You']: + QuoteMarkers.cb.seek('following'); + break; + default: + return; + } + e.preventDefault(); + return e.stopPropagation(); + }, + keyCode: function(e) { + var kc, key; + key = (function() { + switch (kc = e.keyCode) { + case 8: + return ''; + case 13: + return 'Enter'; + case 27: + return 'Esc'; + case 37: + return 'Left'; + case 38: + return 'Up'; + case 39: + return 'Right'; + case 40: + return 'Down'; + default: + if ((48 <= kc && kc <= 57) || (65 <= kc && kc <= 90)) { + return String.fromCharCode(kc).toLowerCase(); + } else { + return null; + } + } + })(); + if (key) { + if (e.altKey) { + key = 'Alt+' + key; + } + if (e.ctrlKey) { + key = 'Ctrl+' + key; + } + if (e.metaKey) { + key = 'Meta+' + key; + } + if (e.shiftKey) { + key = 'Shift+' + key; + } + } + return key; + }, + qr: function(thread) { + if (!QR.postingIsEnabled) { + return; + } + QR.open(); + if (thread != null) { + QR.quote.call($('input', $('.post.highlight', thread) || thread)); + } + QR.nodes.com.focus(); + if (Conf['QR Shortcut']) { + return $.rmClass($('.qr-shortcut'), 'disabled'); + } + }, + tags: function(tag, ta) { + var range, selEnd, selStart, value; + value = ta.value; + selStart = ta.selectionStart; + selEnd = ta.selectionEnd; + ta.value = value.slice(0, selStart) + ("[" + tag + "]") + value.slice(selStart, selEnd) + ("[/" + tag + "]") + value.slice(selEnd); + range = ("[" + tag + "]").length + selEnd; + ta.setSelectionRange(range, range); + return $.event('input', null, ta); + }, + name: function() { + return QR.nodes.name.value = ''; + }, + sage: function() { + var isSage; + isSage = /sage/i.test(QR.nodes.email.value); + return QR.nodes.email.value = isSage ? "" : "sage"; + }, + img: function(thread, all) { + var post; + if (all) { + return ImageExpand.cb.toggleAll(); + } else { + post = Get.postFromNode($('.post.highlight', thread) || $('.op', thread)); + return ImageExpand.toggle(post); + } + }, + open: function(thread, tab) { + var url; + if (g.VIEW !== 'index') { + return; + } + url = Build.path(thread.board.ID, thread.ID); + if (tab) { + return $.open(url); + } else { + return location.href = url; + } + }, + hl: function(delta, thread) { + var axis, height, next, postEl, replies, reply, root, _i, _len; + postEl = $('.reply.highlight', thread); + if (!delta) { + if (postEl) { + $.rmClass(postEl, 'highlight'); + } + return; + } + if (postEl) { + height = postEl.getBoundingClientRect().height; + if (Header.getTopOf(postEl) >= -height && Header.getBottomOf(postEl) >= -height) { + root = postEl.parentNode; + axis = delta === +1 ? 'following' : 'preceding'; + if (!(next = $.x("" + axis + "-sibling::div[contains(@class,'replyContainer') and not(@hidden) and not(child::div[@class='stub'])][1]/child::div[contains(@class,'reply')]", root))) { + return; + } + Header.scrollToIfNeeded(next, delta === +1); + this.focus(next); + $.rmClass(postEl, 'highlight'); + return; + } + $.rmClass(postEl, 'highlight'); + } + replies = $$('.reply', thread); + if (delta === -1) { + replies.reverse(); + } + for (_i = 0, _len = replies.length; _i < _len; _i++) { + reply = replies[_i]; + if (delta === +1 && Header.getTopOf(reply) > 0 || delta === -1 && Header.getBottomOf(reply) > 0) { + this.focus(reply); + return; + } + } + }, + focus: function(post) { + return $.addClass(post, 'highlight'); + } + }; + + Nav = { + init: function() { + var next, prev; + switch (g.VIEW) { + case 'index': + if (!Conf['Index Navigation']) { + return; + } + break; + case 'thread': + if (!Conf['Reply Navigation']) { + return; + } + } + prev = $.el('a', { + href: 'javascript:;', + id: 'navPrev' + }); + next = $.el('a', { + href: 'javascript:;', + id: 'navNext' + }); + Header.addShortcut(prev, true); + Header.addShortcut(next, true); + $.on(prev, 'click', this.prev); + return $.on(next, 'click', this.next); + }, + prev: function() { + if (g.VIEW === 'thread') { + return window.scrollTo(0, 0); + } else { + return Nav.scroll(-1); + } + }, + next: function() { + if (g.VIEW === 'thread') { + return window.scrollTo(0, d.body.scrollHeight); + } else { + return Nav.scroll(+1); + } + }, + getThread: function() { + var threadRoot, _i, _len, _ref; + _ref = $$('.thread'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + threadRoot = _ref[_i]; + if (Header.getTopOf(threadRoot) >= -threadRoot.getBoundingClientRect().height) { + return threadRoot; + } + } + return $('.board'); + }, + scroll: function(delta) { + var axis, next, thread, top; + thread = Nav.getThread(); + axis = delta === +1 ? 'following' : 'preceding'; + if (next = $.x("" + axis + "-sibling::div[contains(@class,'thread') and not(@hidden)][1]", thread)) { + top = Header.getTopOf(thread); + if (delta === +1 && top < 5 || delta === -1 && top > -5) { + thread = next; + } + } + return Header.scrollTo(thread); + } + }; + + RelativeDates = { + INTERVAL: $.MINUTE / 2, + init: function() { + switch (g.VIEW) { + case 'index': + this.flush(); + $.on(d, 'visibilitychange', this.flush); + if (!Conf['Relative Post Dates']) { + return; + } + break; + case 'thread': + if (!Conf['Relative Post Dates']) { + return; + } + this.flush(); + $.on(d, 'visibilitychange ThreadUpdate', this.flush); + break; + default: + return; + } + return Post.callbacks.push({ + name: 'Relative Post Dates', + cb: this.node + }); + }, + node: function() { + var dateEl; + if (this.isClone) { + return; + } + dateEl = this.nodes.date; + dateEl.title = dateEl.textContent; + return RelativeDates.update(this); + }, + relative: function(diff, now, date) { + var days, months, number, rounded, unit, years; + unit = (number = diff / $.DAY) >= 1 ? (years = now.getYear() - date.getYear(), months = now.getMonth() - date.getMonth(), days = now.getDate() - date.getDate(), years > 1 ? (number = years - (months < 0 || months === 0 && days < 0), 'year') : years === 1 && (months > 0 || months === 0 && days >= 0) ? (number = years, 'year') : (months = (months + 12) % 12) > 1 ? (number = months - (days < 0), 'month') : months === 1 && days >= 0 ? (number = months, 'month') : 'day') : (number = diff / $.HOUR) >= 1 ? 'hour' : (number = diff / $.MINUTE) >= 1 ? 'minute' : (number = Math.max(0, diff) / $.SECOND, 'second'); + rounded = Math.round(number); + if (rounded !== 1) { + unit += 's'; + } + return "" + rounded + " " + unit + " ago"; + }, + stale: [], + flush: function() { + var data, now, _i, _len, _ref; + if (d.hidden) { + return; + } + now = new Date(); + _ref = RelativeDates.stale; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + data = _ref[_i]; + RelativeDates.update(data, now); + } + RelativeDates.stale = []; + clearTimeout(RelativeDates.timeout); + return RelativeDates.timeout = setTimeout(RelativeDates.flush, RelativeDates.INTERVAL); + }, + update: function(data, now) { + var date, diff, isPost, relative, singlePost, _i, _len, _ref; + isPost = data instanceof Post; + date = isPost ? data.info.date : new Date(+data.dataset.utc); + now || (now = new Date()); + diff = now - date; + relative = RelativeDates.relative(diff, now, date); + if (isPost) { + _ref = [data].concat(data.clones); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + singlePost = _ref[_i]; + singlePost.nodes.date.firstChild.textContent = relative; + } + } else { + data.firstChild.textContent = relative; + } + return RelativeDates.setOwnTimeout(diff, data); + }, + setOwnTimeout: function(diff, data) { + var delay; + delay = diff < $.MINUTE ? $.SECOND - (diff + $.SECOND / 2) % $.SECOND : diff < $.HOUR ? $.MINUTE - (diff + $.MINUTE / 2) % $.MINUTE : diff < $.DAY ? $.HOUR - (diff + $.HOUR / 2) % $.HOUR : $.DAY - (diff + $.DAY / 2) % $.DAY; + return setTimeout(RelativeDates.markStale, delay, data); + }, + markStale: function(data) { + if (__indexOf.call(RelativeDates.stale, data) >= 0) { + return; + } + if (data instanceof Post && !g.posts[data.fullID]) { + return; + } + return RelativeDates.stale.push(data); + } + }; + + RemoveSpoilers = { + init: function() { + if (Conf['Reveal Spoilers']) { + $.addClass(doc, 'reveal-spoilers'); + } + if (Conf['Remove Spoilers']) { + return $.addClass(doc, 'remove-spoilers'); + } + } + }; + + Report = { + init: function() { + if (!/report/.test(location.search)) { + return; + } + return $.asap((function() { + return $.id('recaptcha_response_field'); + }), Report.ready); + }, + ready: function() { + var field; + field = $.id('recaptcha_response_field'); + $.on(field, 'keydown', function(e) { + if (e.keyCode === 8 && !field.value) { + return $.globalEval('Recaptcha.reload("t")'); + } + }); + return $.on($('form'), 'submit', function(e) { + var response; + e.preventDefault(); + response = field.value.trim(); + if (!/\s|^\d+$/.test(response)) { + field.value = "" + response + " " + response; + } + return this.submit(); + }); + } + }; + + Time = { + init: function() { + if (!Conf['Time Formatting']) { + return; + } + return Post.callbacks.push({ + name: 'Time Formatting', + cb: this.node + }); + }, + node: function() { + if (this.isClone) { + return; + } + return this.nodes.date.textContent = Time.format(Conf['time'], this.info.date); + }, + format: function(formatString, date) { + return formatString.replace(/%([A-Za-z])/g, function(s, c) { + if (c in Time.formatters) { + return Time.formatters[c].call(date); + } else { + return s; + } + }); + }, + day: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + zeroPad: function(n) { + if (n < 10) { + return "0" + n; + } else { + return n; + } + }, + formatters: { + a: function() { + return Time.day[this.getDay()].slice(0, 3); + }, + A: function() { + return Time.day[this.getDay()]; + }, + b: function() { + return Time.month[this.getMonth()].slice(0, 3); + }, + B: function() { + return Time.month[this.getMonth()]; + }, + d: function() { + return Time.zeroPad(this.getDate()); + }, + e: function() { + return this.getDate(); + }, + H: function() { + return Time.zeroPad(this.getHours()); + }, + I: function() { + return Time.zeroPad(this.getHours() % 12 || 12); + }, + k: function() { + return this.getHours(); + }, + l: function() { + return this.getHours() % 12 || 12; + }, + m: function() { + return Time.zeroPad(this.getMonth() + 1); + }, + M: function() { + return Time.zeroPad(this.getMinutes()); + }, + p: function() { + if (this.getHours() < 12) { + return 'AM'; + } else { + return 'PM'; + } + }, + P: function() { + if (this.getHours() < 12) { + return 'am'; + } else { + return 'pm'; + } + }, + S: function() { + return Time.zeroPad(this.getSeconds()); + }, + y: function() { + return this.getFullYear().toString().slice(2); + }, + Y: function() { + return this.getFullYear(); + } + } + }; Banner = { init: function() { @@ -15044,1380 +16476,6 @@ })(); - PSAHiding = { - init: function() { - if (!Conf['Announcement Hiding']) { - return; - } - $.addClass(doc, 'hide-announcement'); - return $.on(d, '4chanXInitFinished', this.setup); - }, - setup: function() { - var btn, entry, psa; - $.off(d, '4chanXInitFinished', PSAHiding.setup); - if (!(psa = $.id('globalMessage'))) { - return; - } - entry = { - el: $.el('a', { - textContent: 'Show announcement', - className: 'show-announcement', - href: 'javascript:;' - }), - order: 50, - open: function() { - return psa.hidden; - } - }; - Header.menu.addEntry(entry); - $.on(entry.el, 'click', PSAHiding.toggle); - PSAHiding.btn = btn = $.el('span', { - innerHTML: '[Dismiss]', - title: 'Mark announcement as read and hide.', - className: 'hide-announcement', - href: 'javascript:;', - textContent: '[ - ]' - }); - $.on(btn, 'click', PSAHiding.toggle); - $.get('hiddenPSA', 0, function(_arg) { - var hiddenPSA; - hiddenPSA = _arg.hiddenPSA; - PSAHiding.sync(hiddenPSA); - $.add(psa, btn); - return $.rmClass(doc, 'hide-announcement'); - }); - return $.sync('hiddenPSA', PSAHiding.sync); - }, - toggle: function(e) { - var UTC; - if ($.hasClass(this, 'hide-announcement')) { - UTC = +$.id('globalMessage').dataset.utc; - $.set('hiddenPSA', UTC); - } else { - $.event('CloseMenu'); - $["delete"]('hiddenPSA'); - } - return PSAHiding.sync(UTC); - }, - sync: function(UTC) { - var hr, psa; - psa = $.id('globalMessage'); - psa.hidden = PSAHiding.btn.hidden = UTC && UTC >= +psa.dataset.utc ? true : false; - if ((hr = psa.nextElementSibling) && hr.nodeName === 'HR') { - return hr.hidden = psa.hidden; - } - } - }; - - CatalogLinks = { - init: function() { - var el, input; - if (!Conf['Catalog Links']) { - return; - } - CatalogLinks.el = el = $.el('label', { - id: 'toggleCatalog', - href: 'javascript:;', - innerHTML: " Catalog Links" - }); - input = $('input', el); - $.on(input, 'change', this.toggle); - $.sync('Header catalog links', CatalogLinks.set); - Header.menu.addEntry({ - el: el, - order: 95 - }); - return $.on(d, '4chanXInitFinished', function() { - return CatalogLinks.set(Conf['Header catalog links']); - }); - }, - toggle: function() { - $.event('CloseMenu'); - $.set('Header catalog links', this.checked); - return CatalogLinks.set(this.checked); - }, - set: function(useCatalog) { - var a, board, generateURL, path, _i, _len, _ref, _ref1; - path = useCatalog ? 'catalog' : ''; - generateURL = useCatalog && Conf['External Catalog'] ? CatalogLinks.external : function(board) { - return a.href = "/" + board + "/" + path; - }; - _ref = $$("#board-list a:not(.catalog), #boardNavDesktopFoot a"); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - a = _ref[_i]; - 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') || $.hasClass(a, 'external')) { - continue; - } - a.href = generateURL(board); - } - return CatalogLinks.el.title = "Turn catalog links " + (useCatalog ? 'off' : 'on') + "."; - }, - external: function(board) { - if (board === 'a' || board === 'c' || board === 'g' || board === 'co' || board === 'k' || board === 'm' || board === 'o' || board === 'p' || board === 'v' || board === 'vg' || board === 'w' || board === 'cm' || board === '3' || board === 'adv' || board === 'an' || board === 'cgl' || board === 'ck' || board === 'diy' || board === 'fa' || board === 'fit' || board === 'int' || board === 'jp' || board === 'mlp' || board === 'lit' || board === 'mu' || board === 'n' || board === 'po' || board === 'sci' || board === 'toy' || board === 'trv' || board === 'tv' || board === 'vp' || board === 'x' || board === 'q') { - return "http://catalog.neet.tv/" + board; - } else { - return "/" + board + "/catalog"; - } - } - }; - - CustomCSS = { - init: function() { - if (!Conf['Custom CSS']) { - return; - } - return this.addStyle(); - }, - addStyle: function() { - return this.style = $.addStyle(Conf['usercss'], 'CustomCSS'); - }, - rmStyle: function() { - if (this.style) { - $.rm(this.style); - return delete this.style; - } - }, - update: function() { - if (!this.style) { - return this.addStyle(); - } - return this.style.textContent = Conf['usercss']; - } - }; - - Dice = { - init: function() { - if (g.BOARD.ID !== 'tg' || !Conf['Show Dice Roll']) { - return; - } - return Post.callbacks.push({ - name: 'Show Dice Roll', - cb: this.node - }); - }, - node: function() { - var dicestats, roll, _ref; - if (this.isClone || !(dicestats = (_ref = this.info.email) != null ? _ref.match(/dice[+\s](\d+)d(\d+)/) : void 0)) { - return; - } - roll = $('b', this.nodes.comment).firstChild; - return roll.data = "Rolled " + dicestats[1] + "d" + dicestats[2] + ": " + (roll.data.slice(7)); - } - }; - - ExpandComment = { - init: function() { - if (g.VIEW !== 'index' || !Conf['Comment Expansion'] || Conf['JSON Navigation']) { - return; - } - if (g.BOARD.ID === 'g') { - this.callbacks.push(Fourchan.code); - } - if (g.BOARD.ID === 'sci') { - this.callbacks.push(Fourchan.math); - } - return Post.callbacks.push({ - name: 'Comment Expansion', - cb: this.node - }); - }, - node: function() { - var a; - if (a = $('.abbr > a:not([onclick])', this.nodes.comment)) { - return $.on(a, 'click', ExpandComment.cb); - } - }, - callbacks: [], - cb: function(e) { - e.preventDefault(); - return ExpandComment.expand(Get.postFromNode(this)); - }, - expand: function(post) { - var a; - if (post.nodes.longComment && !post.nodes.longComment.parentNode) { - $.replace(post.nodes.shortComment, post.nodes.longComment); - post.nodes.comment = post.nodes.longComment; - return; - } - if (!(a = $('.abbr > a', post.nodes.comment))) { - return; - } - a.textContent = "Post No." + post + " Loading..."; - return $.cache("//a.4cdn.org" + (a.pathname.split('/').splice(0, 4).join('/')) + ".json", function() { - return ExpandComment.parse(this, a, post); - }); - }, - contract: function(post) { - var a; - if (!post.nodes.shortComment) { - return; - } - a = $('.abbr > a', post.nodes.shortComment); - a.textContent = 'here'; - $.replace(post.nodes.longComment, post.nodes.shortComment); - return post.nodes.comment = post.nodes.shortComment; - }, - parse: function(req, a, post) { - var callback, clone, comment, href, postObj, posts, quote, spoilerRange, status, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; - status = req.status; - if (status !== 200 && status !== 304) { - a.textContent = "Error " + req.statusText + " (" + status + ")"; - return; - } - posts = req.response.posts; - if (spoilerRange = posts[0].custom_spoiler) { - Build.spoilerRange[g.BOARD] = spoilerRange; - } - for (_i = 0, _len = posts.length; _i < _len; _i++) { - postObj = posts[_i]; - if (postObj.no === post.ID) { - break; - } - } - if (postObj.no !== post.ID) { - a.textContent = "Post No." + post + " not found."; - return; - } - comment = post.nodes.comment; - clone = comment.cloneNode(false); - clone.innerHTML = postObj.com; - _ref = $$('.quotelink', clone); - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - quote = _ref[_j]; - href = quote.getAttribute('href'); - if (href[0] === '/') { - continue; - } - if (href[0] === '#') { - quote.href = "" + (a.pathname.split('/').splice(0, 4).join('/')) + href; - } else { - quote.href = "" + (a.pathname.split('/').splice(0, 3).join('/')) + "/" + href; - } - } - post.nodes.shortComment = comment; - $.replace(comment, clone); - post.nodes.comment = post.nodes.longComment = clone; - post.parseComment(); - post.parseQuotes(); - _ref1 = ExpandComment.callbacks; - for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { - callback = _ref1[_k]; - callback.call(post); - } - } - }; - - ExpandThread = { - statuses: {}, - init: function() { - if (g.VIEW === 'thread' || !Conf['Thread Expansion']) { - return; - } - return $.on(d, (Conf['JSON Navigation'] ? 'IndexRefresh' : '4chanXInitFinished'), this.onIndexRefresh); - }, - setButton: function(thread) { - var a, summary; - if (!(summary = $.x('following-sibling::*[contains(@class,"summary")][1]', thread.OP.nodes.root))) { - return; - } - a = $.el('a', { - textContent: ExpandThread.text.apply(ExpandThread, ['+'].concat(__slice.call(summary.textContent.match(/\d+/g)))), - href: "res/" + thread.ID, - className: 'summary' - }); - $.on(a, 'click', ExpandThread.cbToggle); - return $.replace(summary, a); - }, - disconnect: function() { - this.refresh(); - return $.off(d, 'IndexRefresh', this.onIndexRefresh); - }, - refresh: function(disconnect) { - var status, threadID, _ref, _ref1; - if (g.VIEW === 'thread' || !Conf['Thread Expansion']) { - return; - } - _ref = ExpandThread.statuses; - for (threadID in _ref) { - status = _ref[threadID]; - if ((_ref1 = status.req) != null) { - _ref1.abort(); - } - delete ExpandThread.statuses[threadID]; - } - }, - onIndexRefresh: function() { - ExpandThread.refresh(); - return g.BOARD.threads.forEach(function(thread) { - return ExpandThread.setButton(thread); - }); - }, - text: function(status, posts, files) { - return ("" + status + " " + posts + " post" + (posts > 1 ? 's' : '')) + (+files ? " and " + files + " image repl" + (files > 1 ? 'ies' : 'y') : "") + (" " + (status === '-' ? 'shown' : 'omitted') + "."); - }, - cbToggle: function(e) { - if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) { - return; - } - e.preventDefault(); - return ExpandThread.toggle(Get.threadFromNode(this)); - }, - toggle: function(thread) { - var a, threadRoot; - threadRoot = thread.OP.nodes.root.parentNode; - if (!(a = $('.summary', threadRoot))) { - return; - } - if (thread.ID in ExpandThread.statuses) { - return ExpandThread.contract(thread, a, threadRoot); - } else { - return ExpandThread.expand(thread, a, threadRoot); - } - }, - expand: function(thread, a, threadRoot) { - var status; - ExpandThread.statuses[thread] = status = {}; - a.textContent = ExpandThread.text.apply(ExpandThread, ['...'].concat(__slice.call(a.textContent.match(/\d+/g)))); - return status.req = $.cache("//a.4cdn.org/" + thread.board + "/thread/" + thread + ".json", function() { - delete status.req; - return ExpandThread.parse(this, thread, a); - }); - }, - contract: function(thread, a, threadRoot) { - var filesCount, inlined, num, postsCount, replies, reply, status, _i, _len; - status = ExpandThread.statuses[thread]; - delete ExpandThread.statuses[thread]; - if (status.req) { - status.req.abort(); - if (a) { - a.textContent = ExpandThread.text.apply(ExpandThread, ['+'].concat(__slice.call(a.textContent.match(/\d+/g)))); - } - return; - } - replies = $$('.thread > .replyContainer', threadRoot); - if (Conf['Show Replies']) { - num = (function() { - if (thread.isSticky) { - return 1; - } else { - switch (g.BOARD.ID) { - case 'b': - case 'vg': - return 3; - case 't': - return 1; - default: - return 5; - } - } - })(); - replies = replies.slice(0, -num); - } - postsCount = 0; - filesCount = 0; - for (_i = 0, _len = replies.length; _i < _len; _i++) { - reply = replies[_i]; - if (Conf['Quote Inlining']) { - while (inlined = $('.inlined', reply)) { - inlined.click(); - } - } - postsCount++; - if ('file' in Get.postFromRoot(reply)) { - filesCount++; - } - $.rm(reply); - } - return a.textContent = ExpandThread.text('+', postsCount, filesCount); - }, - parse: function(req, thread, a) { - var filesCount, post, postData, posts, postsCount, postsRoot, root, _i, _len, _ref, _ref1; - if ((_ref = req.status) !== 200 && _ref !== 304) { - a.textContent = "Error " + req.statusText + " (" + req.status + ")"; - return; - } - Build.spoilerRange[thread.board] = req.response.posts[0].custom_spoiler; - posts = []; - postsRoot = []; - filesCount = 0; - _ref1 = req.response.posts; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - postData = _ref1[_i]; - if (postData.no === thread.ID) { - continue; - } - if (post = thread.posts[postData.no]) { - if ('file' in post) { - filesCount++; - } - postsRoot.push(post.nodes.root); - continue; - } - root = Build.postFromObject(postData, thread.board.ID); - post = new Post(root, thread, thread.board); - if ('file' in post) { - filesCount++; - } - posts.push(post); - postsRoot.push(root); - } - Post.callbacks.execute(posts); - $.after(a, postsRoot); - postsCount = postsRoot.length; - return a.textContent = ExpandThread.text('-', postsRoot.length, filesCount); - } - }; - - FileInfo = { - init: function() { - if (!Conf['File Info Formatting']) { - return; - } - return Post.callbacks.push({ - name: 'File Info Formatting', - cb: this.node - }); - }, - node: function() { - if (!this.file || this.isClone) { - return; - } - return this.file.text.innerHTML = "" + (FileInfo.format(Conf['fileInfo'], this)) + ""; - }, - format: function(formatString, post) { - return formatString.replace(/%([A-Za-z])/g, function(s, c) { - if (c in FileInfo.formatters) { - return FileInfo.formatters[c].call(post); - } else { - return s; - } - }); - }, - convertUnit: function(size, unit) { - var i; - if (unit === 'B') { - return "" + (size.toFixed()) + " Bytes"; - } - i = 1 + ['KB', 'MB'].indexOf(unit); - while (i--) { - size /= 1024; - } - size = unit === 'MB' ? Math.round(size * 100) / 100 : size.toFixed(); - return "" + size + " " + unit; - }, - escape: function(name) { - return name.replace(/<|>/g, function(c) { - return c === '<' && '<' || '>'; - }); - }, - formatters: { - t: function() { - return this.file.URL.match(/\d+\..+$/)[0]; - }, - T: function() { - return "" + (FileInfo.formatters.t.call(this)) + ""; - }, - l: function() { - return "" + (FileInfo.formatters.n.call(this)) + ""; - }, - L: function() { - return "" + (FileInfo.formatters.N.call(this)) + ""; - }, - n: function() { - var fullname, shortname; - fullname = this.file.name; - shortname = Build.shortFilename(this.file.name, this.isReply); - if (fullname === shortname) { - return FileInfo.escape(fullname); - } else { - return "" + (FileInfo.escape(shortname)) + "" + (FileInfo.escape(fullname)) + ""; - } - }, - N: function() { - return FileInfo.escape(this.file.name); - }, - p: function() { - if (this.file.isSpoiler) { - return 'Spoiler, '; - } else { - return ''; - } - }, - s: function() { - return this.file.size; - }, - B: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'B'); - }, - K: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'KB'); - }, - M: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'MB'); - }, - r: function() { - return this.file.dimensions || 'PDF'; - } - } - }; - - Flash = { - init: function() { - if (g.BOARD.ID === 'f') { - return $.ready(Flash.initReady); - } - }, - initReady: function() { - var nav, sauceLink, swfName; - $.globalEval('SWFEmbed.init()'); - if (g.VIEW !== 'thread') { - return; - } - swfName = $('.fileText > a'); - nav = $('.navLinks.desktop'); - swfName = swfName.href.replace(/^(.*?)\/f\//g, ""); - sauceLink = $.el('a', { - textContent: 'Check Sauce on SWFCHAN', - href: "http://eye.swfchan.com/search/?q=" + swfName - }); - $.addClass(nav, 'swfSauce'); - $.rmClass(nav, 'navLinks'); - $.rmAll(nav); - return $.add(nav, [$.tn('['), sauceLink, $.tn(']')]); - } - }; - - Fourchan = { - init: function() { - var board; - board = g.BOARD.ID; - if (board === 'g') { - $.globalEval("window.addEventListener('prettyprint', function(e) {\n window.dispatchEvent(new CustomEvent('prettyprint:cb', {\n detail: prettyPrintOne(e.detail)\n }));\n}, false);"); - Post.callbacks.push({ - name: 'Parse /g/ code', - cb: this.code - }); - } - if (board === 'sci') { - $.globalEval("window.addEventListener('jsmath', function(e) {\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(document.getElementById(e.detail));\n } else {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push('ProcessBeforeShowing', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);"); - return Post.callbacks.push({ - name: 'Parse /sci/ math', - cb: this.math - }); - } - }, - code: function() { - var apply, pre, _i, _len, _ref; - if (this.isClone) { - return; - } - apply = function(e) { - return pre.innerHTML = e.detail; - }; - $.on(window, 'prettyprint:cb', apply); - _ref = $$('.prettyprint:not(.prettyprinted)', this.nodes.comment); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - pre = _ref[_i]; - $.event('prettyprint', pre.innerHTML, window); - } - $.off(window, 'prettyprint:cb', apply); - }, - math: function() { - if (this.isClone || !$('.math', this.nodes.comment)) { - return; - } - return $.event('jsmath', this.nodes.post.id, window); - } - }; - - IDColor = { - init: function() { - if (!Conf['Color User IDs']) { - return; - } - this.ids = { - Heaven: [0, 0, 0, '#fff'] - }; - return Post.callbacks.push({ - name: 'Color User IDs', - cb: this.node - }); - }, - node: function() { - var rgb, span, uid; - if (this.isClone || !((uid = this.info.uniqueID) && (span = $('span.hand', this.nodes.uniqueID)))) { - return; - } - rgb = IDColor.ids[uid] || IDColor.compute(uid); - span.style.color = rgb[3]; - span.style.backgroundColor = "rgb(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ")"; - $.addClass(span, 'painted'); - return span.title = 'Highlight posts by this ID'; - }, - compute: function(uid) { - var hash, i, rgb; - i = 1; - hash = uid.charCodeAt(0); - while (i < 8) { - hash = (hash << 5) - hash + uid.charCodeAt(i++); - } - rgb = [(hash >> 24) & 0xFF, (hash >> 16) & 0xFF, (hash >> 8) & 0xFF]; - rgb.push((rgb[0] * 0.299 + rgb[1] * 0.587 + rgb[2] * 0.114) > 125 ? '#000' : '#fff'); - return this.ids[uid] = rgb; - } - }; - - Keybinds = { - init: function() { - var hotkey, init; - if (!Conf['Keybinds']) { - return; - } - for (hotkey in Conf.hotkeys) { - $.sync(hotkey, Keybinds.sync); - } - init = function() { - var node, _i, _len, _ref; - $.off(d, '4chanXInitFinished', init); - $.on(d, 'keydown', Keybinds.keydown); - _ref = $$('[accesskey]'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - node = _ref[_i]; - node.removeAttribute('accesskey'); - } - }; - return $.on(d, '4chanXInitFinished', init); - }, - sync: function(key, hotkey) { - return Conf[hotkey] = key; - }, - keydown: function(e) { - var form, key, notification, notifications, op, searchInput, target, thread, threadRoot, _i, _len, _ref; - if (!(key = Keybinds.keyCode(e))) { - return; - } - target = e.target; - if (target.nodeName === 'EMBED') { - return; - } - if ((_ref = target.nodeName) === 'INPUT' || _ref === 'TEXTAREA') { - if (!/(Esc|Alt|Ctrl|Meta|Shift\+\w{2,})/.test(key)) { - return; - } - } - if (g.VIEW !== 'catalog') { - threadRoot = Nav.getThread(); - if (op = $('.op', threadRoot)) { - thread = Get.postFromNode(op).thread; - } - } - switch (key) { - case Conf['Toggle board list']: - if (Conf['Custom Board Navigation']) { - Header.toggleBoardList(); - } - break; - case Conf['Toggle header']: - Header.toggleBarVisibility(); - break; - case Conf['Open empty QR']: - Keybinds.qr(); - break; - case Conf['Open QR']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.qr(threadRoot); - break; - case Conf['Open settings']: - Settings.open(); - break; - case Conf['Close']: - if ($.id('fourchanx-settings')) { - Settings.close(); - } else if ((notifications = $$('.notification')).length) { - for (_i = 0, _len = notifications.length; _i < _len; _i++) { - notification = notifications[_i]; - $('.close', notification).click(); - } - } else if (QR.nodes) { - if (Conf['Persistent QR']) { - QR.hide(); - } else { - QR.close(); - } - } - break; - case Conf['Spoiler tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('spoiler', target); - break; - case Conf['Code tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('code', target); - break; - case Conf['Eqn tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('eqn', target); - break; - case Conf['Math tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('math', target); - break; - case Conf['Toggle sage']: - if (QR.nodes) { - Keybinds.sage(); - } - break; - case Conf['Submit QR']: - if (QR.nodes && !QR.status()) { - QR.submit(); - } - break; - case Conf['Post Without Name']: - if (QR.nodes && !QR.status()) { - Keybinds.name(); - QR.submit(); - } - break; - case Conf['Update']: - switch (g.VIEW) { - case 'thread': - ThreadUpdater.update(); - break; - case 'index': - if (Conf['JSON Navigation']) { - Index.update(); - } - } - break; - case Conf['Watch']: - if (g.VIEW === 'catalog') { - return; - } - ThreadWatcher.toggle(thread); - break; - case Conf['Expand image']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.img(threadRoot); - break; - case Conf['Expand images']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.img(threadRoot, true); - break; - case Conf['Open Gallery']: - if (g.VIEW === 'catalog') { - return; - } - Gallery.cb.toggle(); - break; - case Conf['fappeTyme']: - if (g.VIEW === 'catalog') { - return; - } - FappeTyme.cb.toggle.call({ - name: 'fappe' - }); - break; - case Conf['werkTyme']: - if (g.VIEW === 'catalog') { - return; - } - FappeTyme.cb.toggle.call({ - name: 'werk' - }); - break; - case Conf['Front page']: - if (Conf['JSON Navigation'] && g.VIEW === 'index') { - Index.userPageNav(1); - } else { - window.location = "/" + g.BOARD + "/"; - } - break; - case Conf['Open front page']: - $.open("/" + g.BOARD + "/"); - break; - case Conf['Next page']: - if (g.VIEW !== 'index') { - return; - } - if (Conf['JSON Navigation']) { - if (Conf['Index Mode'] !== 'all pages') { - $('.next button', Index.pagelist).click(); - } - } else { - if (form = $('.next form')) { - window.location = form.action; - } - } - break; - case Conf['Previous page']: - if (g.VIEW !== 'index') { - return; - } - if (Conf['JSON Navigation']) { - if (Conf['Index Mode'] !== 'all pages') { - $('.prev button', Index.pagelist).click(); - } - } else { - if (form = $('.prev form')) { - window.location = form.action; - } - } - break; - case Conf['Search form']: - if (g.VIEW !== 'index') { - return; - } - searchInput = Conf['JSON Navigation'] ? Index.searchInput : $.id('search-box'); - Header.scrollToIfNeeded(searchInput); - searchInput.click(); - searchInput.focus(); - break; - case Conf['Paged mode']: - if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'paged')) { - return; - } - Index.setIndexMode('paged'); - break; - case Conf['All pages mode']: - if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'all pages')) { - return; - } - Index.setIndexMode('all pages'); - break; - case Conf['Catalog mode']: - if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'catalog')) { - return; - } - Index.setIndexMode('catalog'); - break; - case Conf['Cycle sort type']: - if (g.VIEW !== 'index') { - return; - } - Index.cycleSortType(); - break; - case Conf['Open catalog']: - if (Conf['External Catalog']) { - window.location = CatalogLinks.external(g.BOARD.ID); - } else { - if (!Conf['JSON Navigation']) { - return window.location = "/" + g.BOARD + "/catalog"; - } - if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'catalog')) { - return; - } - Index.setIndexMode('catalog'); - } - break; - case Conf['Next thread']: - if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { - return; - } - Nav.scroll(+1); - break; - case Conf['Previous thread']: - if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { - return; - } - Nav.scroll(-1); - break; - case Conf['Expand thread']: - if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { - return; - } - ExpandThread.toggle(thread); - break; - case Conf['Open thread']: - if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { - return; - } - Keybinds.open(thread); - break; - case Conf['Open thread tab']: - if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { - return; - } - Keybinds.open(thread, true); - break; - case Conf['Next reply']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.hl(+1, threadRoot); - break; - case Conf['Previous reply']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.hl(-1, threadRoot); - break; - case Conf['Deselect reply']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.hl(0, threadRoot); - break; - case Conf['Hide']: - PostHiding.toggle(thread.OP); - break; - case Conf['Previous Post Quoting You']: - QuoteMarkers.cb.seek('preceding'); - break; - case Conf['Next Post Quoting You']: - QuoteMarkers.cb.seek('following'); - break; - default: - return; - } - e.preventDefault(); - return e.stopPropagation(); - }, - keyCode: function(e) { - var kc, key; - key = (function() { - switch (kc = e.keyCode) { - case 8: - return ''; - case 13: - return 'Enter'; - case 27: - return 'Esc'; - case 37: - return 'Left'; - case 38: - return 'Up'; - case 39: - return 'Right'; - case 40: - return 'Down'; - default: - if ((48 <= kc && kc <= 57) || (65 <= kc && kc <= 90)) { - return String.fromCharCode(kc).toLowerCase(); - } else { - return null; - } - } - })(); - if (key) { - if (e.altKey) { - key = 'Alt+' + key; - } - if (e.ctrlKey) { - key = 'Ctrl+' + key; - } - if (e.metaKey) { - key = 'Meta+' + key; - } - if (e.shiftKey) { - key = 'Shift+' + key; - } - } - return key; - }, - qr: function(thread) { - if (!QR.postingIsEnabled) { - return; - } - QR.open(); - if (thread != null) { - QR.quote.call($('input', $('.post.highlight', thread) || thread)); - } - QR.nodes.com.focus(); - if (Conf['QR Shortcut']) { - return $.rmClass($('.qr-shortcut'), 'disabled'); - } - }, - tags: function(tag, ta) { - var range, selEnd, selStart, value; - value = ta.value; - selStart = ta.selectionStart; - selEnd = ta.selectionEnd; - ta.value = value.slice(0, selStart) + ("[" + tag + "]") + value.slice(selStart, selEnd) + ("[/" + tag + "]") + value.slice(selEnd); - range = ("[" + tag + "]").length + selEnd; - ta.setSelectionRange(range, range); - return $.event('input', null, ta); - }, - name: function() { - return QR.nodes.name.value = ''; - }, - sage: function() { - var isSage; - isSage = /sage/i.test(QR.nodes.email.value); - return QR.nodes.email.value = isSage ? "" : "sage"; - }, - img: function(thread, all) { - var post; - if (all) { - return ImageExpand.cb.toggleAll(); - } else { - post = Get.postFromNode($('.post.highlight', thread) || $('.op', thread)); - return ImageExpand.toggle(post); - } - }, - open: function(thread, tab) { - var url; - if (g.VIEW !== 'index') { - return; - } - url = Build.path(thread.board.ID, thread.ID); - if (tab) { - return $.open(url); - } else { - return location.href = url; - } - }, - hl: function(delta, thread) { - var axis, height, next, postEl, replies, reply, root, _i, _len; - postEl = $('.reply.highlight', thread); - if (!delta) { - if (postEl) { - $.rmClass(postEl, 'highlight'); - } - return; - } - if (postEl) { - height = postEl.getBoundingClientRect().height; - if (Header.getTopOf(postEl) >= -height && Header.getBottomOf(postEl) >= -height) { - root = postEl.parentNode; - axis = delta === +1 ? 'following' : 'preceding'; - if (!(next = $.x("" + axis + "-sibling::div[contains(@class,'replyContainer') and not(@hidden) and not(child::div[@class='stub'])][1]/child::div[contains(@class,'reply')]", root))) { - return; - } - Header.scrollToIfNeeded(next, delta === +1); - this.focus(next); - $.rmClass(postEl, 'highlight'); - return; - } - $.rmClass(postEl, 'highlight'); - } - replies = $$('.reply', thread); - if (delta === -1) { - replies.reverse(); - } - for (_i = 0, _len = replies.length; _i < _len; _i++) { - reply = replies[_i]; - if (delta === +1 && Header.getTopOf(reply) > 0 || delta === -1 && Header.getBottomOf(reply) > 0) { - this.focus(reply); - return; - } - } - }, - focus: function(post) { - return $.addClass(post, 'highlight'); - } - }; - - Nav = { - init: function() { - var next, prev; - switch (g.VIEW) { - case 'index': - if (!Conf['Index Navigation']) { - return; - } - break; - case 'thread': - if (!Conf['Reply Navigation']) { - return; - } - } - prev = $.el('a', { - href: 'javascript:;', - id: 'navPrev' - }); - next = $.el('a', { - href: 'javascript:;', - id: 'navNext' - }); - Header.addShortcut(prev, true); - Header.addShortcut(next, true); - $.on(prev, 'click', this.prev); - return $.on(next, 'click', this.next); - }, - prev: function() { - if (g.VIEW === 'thread') { - return window.scrollTo(0, 0); - } else { - return Nav.scroll(-1); - } - }, - next: function() { - if (g.VIEW === 'thread') { - return window.scrollTo(0, d.body.scrollHeight); - } else { - return Nav.scroll(+1); - } - }, - getThread: function() { - var threadRoot, _i, _len, _ref; - _ref = $$('.thread'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - threadRoot = _ref[_i]; - if (Header.getTopOf(threadRoot) >= -threadRoot.getBoundingClientRect().height) { - return threadRoot; - } - } - return $('.board'); - }, - scroll: function(delta) { - var axis, next, thread, top; - thread = Nav.getThread(); - axis = delta === +1 ? 'following' : 'preceding'; - if (next = $.x("" + axis + "-sibling::div[contains(@class,'thread') and not(@hidden)][1]", thread)) { - top = Header.getTopOf(thread); - if (delta === +1 && top < 5 || delta === -1 && top > -5) { - thread = next; - } - } - return Header.scrollTo(thread); - } - }; - - RelativeDates = { - INTERVAL: $.MINUTE / 2, - init: function() { - switch (g.VIEW) { - case 'index': - this.flush(); - $.on(d, 'visibilitychange', this.flush); - if (!Conf['Relative Post Dates']) { - return; - } - break; - case 'thread': - if (!Conf['Relative Post Dates']) { - return; - } - this.flush(); - $.on(d, 'visibilitychange ThreadUpdate', this.flush); - break; - default: - return; - } - return Post.callbacks.push({ - name: 'Relative Post Dates', - cb: this.node - }); - }, - node: function() { - var dateEl; - if (this.isClone) { - return; - } - dateEl = this.nodes.date; - dateEl.title = dateEl.textContent; - return RelativeDates.update(this); - }, - relative: function(diff, now, date) { - var days, months, number, rounded, unit, years; - unit = (number = diff / $.DAY) >= 1 ? (years = now.getYear() - date.getYear(), months = now.getMonth() - date.getMonth(), days = now.getDate() - date.getDate(), years > 1 ? (number = years - (months < 0 || months === 0 && days < 0), 'year') : years === 1 && (months > 0 || months === 0 && days >= 0) ? (number = years, 'year') : (months = (months + 12) % 12) > 1 ? (number = months - (days < 0), 'month') : months === 1 && days >= 0 ? (number = months, 'month') : 'day') : (number = diff / $.HOUR) >= 1 ? 'hour' : (number = diff / $.MINUTE) >= 1 ? 'minute' : (number = Math.max(0, diff) / $.SECOND, 'second'); - rounded = Math.round(number); - if (rounded !== 1) { - unit += 's'; - } - return "" + rounded + " " + unit + " ago"; - }, - stale: [], - flush: function() { - var data, now, _i, _len, _ref; - if (d.hidden) { - return; - } - now = new Date(); - _ref = RelativeDates.stale; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - data = _ref[_i]; - RelativeDates.update(data, now); - } - RelativeDates.stale = []; - clearTimeout(RelativeDates.timeout); - return RelativeDates.timeout = setTimeout(RelativeDates.flush, RelativeDates.INTERVAL); - }, - update: function(data, now) { - var date, diff, isPost, relative, singlePost, _i, _len, _ref; - isPost = data instanceof Post; - date = isPost ? data.info.date : new Date(+data.dataset.utc); - now || (now = new Date()); - diff = now - date; - relative = RelativeDates.relative(diff, now, date); - if (isPost) { - _ref = [data].concat(data.clones); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - singlePost = _ref[_i]; - singlePost.nodes.date.firstChild.textContent = relative; - } - } else { - data.firstChild.textContent = relative; - } - return RelativeDates.setOwnTimeout(diff, data); - }, - setOwnTimeout: function(diff, data) { - var delay; - delay = diff < $.MINUTE ? $.SECOND - (diff + $.SECOND / 2) % $.SECOND : diff < $.HOUR ? $.MINUTE - (diff + $.MINUTE / 2) % $.MINUTE : diff < $.DAY ? $.HOUR - (diff + $.HOUR / 2) % $.HOUR : $.DAY - (diff + $.DAY / 2) % $.DAY; - return setTimeout(RelativeDates.markStale, delay, data); - }, - markStale: function(data) { - if (__indexOf.call(RelativeDates.stale, data) >= 0) { - return; - } - if (data instanceof Post && !g.posts[data.fullID]) { - return; - } - return RelativeDates.stale.push(data); - } - }; - - RemoveSpoilers = { - init: function() { - if (Conf['Reveal Spoilers']) { - $.addClass(doc, 'reveal-spoilers'); - } - if (Conf['Remove Spoilers']) { - return $.addClass(doc, 'remove-spoilers'); - } - } - }; - - Report = { - init: function() { - if (!/report/.test(location.search)) { - return; - } - return $.asap((function() { - return $.id('recaptcha_response_field'); - }), Report.ready); - }, - ready: function() { - var field; - field = $.id('recaptcha_response_field'); - $.on(field, 'keydown', function(e) { - if (e.keyCode === 8 && !field.value) { - return $.globalEval('Recaptcha.reload("t")'); - } - }); - return $.on($('form'), 'submit', function(e) { - var response; - e.preventDefault(); - response = field.value.trim(); - if (!/\s|^\d+$/.test(response)) { - field.value = "" + response + " " + response; - } - return this.submit(); - }); - } - }; - - Time = { - init: function() { - if (!Conf['Time Formatting']) { - return; - } - return Post.callbacks.push({ - name: 'Time Formatting', - cb: this.node - }); - }, - node: function() { - if (this.isClone) { - return; - } - return this.nodes.date.textContent = Time.format(Conf['time'], this.info.date); - }, - format: function(formatString, date) { - return formatString.replace(/%([A-Za-z])/g, function(s, c) { - if (c in Time.formatters) { - return Time.formatters[c].call(date); - } else { - return s; - } - }); - }, - day: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - zeroPad: function(n) { - if (n < 10) { - return "0" + n; - } else { - return n; - } - }, - formatters: { - a: function() { - return Time.day[this.getDay()].slice(0, 3); - }, - A: function() { - return Time.day[this.getDay()]; - }, - b: function() { - return Time.month[this.getMonth()].slice(0, 3); - }, - B: function() { - return Time.month[this.getMonth()]; - }, - d: function() { - return Time.zeroPad(this.getDate()); - }, - e: function() { - return this.getDate(); - }, - H: function() { - return Time.zeroPad(this.getHours()); - }, - I: function() { - return Time.zeroPad(this.getHours() % 12 || 12); - }, - k: function() { - return this.getHours(); - }, - l: function() { - return this.getHours() % 12 || 12; - }, - m: function() { - return Time.zeroPad(this.getMonth() + 1); - }, - M: function() { - return Time.zeroPad(this.getMinutes()); - }, - p: function() { - if (this.getHours() < 12) { - return 'AM'; - } else { - return 'PM'; - } - }, - P: function() { - if (this.getHours() < 12) { - return 'am'; - } else { - return 'pm'; - } - }, - S: function() { - return Time.zeroPad(this.getSeconds()); - }, - y: function() { - return this.getFullYear().toString().slice(2); - }, - Y: function() { - return this.getFullYear(); - } - } - }; - Navigate = { path: window.location.pathname, init: function() { @@ -16910,7 +16968,9 @@ Settings.dialog = dialog = $.el('div', { id: 'appchanx-settings', "class": 'dialog', - innerHTML: "
" + innerHTML: { + innerHTML: "\r
\r
\r" + } }); Settings.overlay = overlay = $.el('div', { id: 'overlay' @@ -17102,7 +17162,9 @@ }, filter: function(section) { var select; - section.innerHTML = "
"; + section.innerHTML = { + innerHTML: "\r
" + }; select = $('select', section); $.on(select, 'change', Settings.selectFilter); return Settings.selectFilter.call(select); @@ -17124,11 +17186,15 @@ $.add(div, ta); return; } - return div.innerHTML = "
Filter is disabled.

Use regular expressions, one per line.
Lines starting with a # will be ignored.
For example, /weeaboo/i will filter posts containing the string `weeaboo`, case-insensitive.
MD5 filtering uses exact string matching, not regular expressions.

"; + return div.innerHTML = { + innerHTML: "
Filter is disabled.
\r

\rUse regular expressions, one per line.
\rLines starting with a # will be ignored.
\rFor example, /weeaboo/i will filter posts containing the string `weeaboo`, case-insensitive.
\rMD5 filtering uses exact string matching, not regular expressions.\r

\r\r" + }; }, sauce: function(section) { var ta; - section.innerHTML = "
Sauce is disabled.
Lines starting with a # will be ignored.
You can specify a display text by appending ;text:[text] to the URL.
"; + section.innerHTML = { + innerHTML: "
Sauce is disabled.
\r
Lines starting with a # will be ignored.
\r
You can specify a display text by appending ;text:[text] to the URL.
\r\r\r" + }; ta = $('textarea', section); $.get('sauces', Conf['sauces'], function(item) { return ta.value = item['sauces'].replace(/\$\d/g, function(c) { @@ -17150,7 +17216,9 @@ }, advanced: function(section) { var archBoards, boardID, boardOptions, boardSelect, boards, event, files, i, input, inputs, item, items, name, o, row, rows, software, ta, table, withCredentials, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref, _ref1, _ref2, _ref3, _ref4, _ref5; - section.innerHTML = "
Archiver
404 Redirect is disabled.
Thread redirectionPost fetchingFile redirection
Disabled selections indicate that only one archive is available for that board and redirection type.
Custom Board Navigation
New lines will be converted into spaces.

In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@).
Board link: g
Title link: g-title
Board link (Replace with title when on that board): g-replace
Full text link: g-full
Custom text link: g-text:\"Install Gentoo\"
External link: external-text:\"Google\",\"http://www.google.com\"
Index mode: g-mode:\"type\" where type is paged, all threads or catalog
Index sort: g-sort:\"type\" where type is bump order, last reply, creation date, reply count or file countCombinations are possible: g-text:\"VIP Catalog\"-mode:\"catalog\"-sort:\"creation date\"
Full board list toggle: toggle-all

[ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h-mode:\"catalog\"-sort:\"file count\"] [t-text:\"Piracy\"]
will give you
[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
if you are on /g/.
Time Formatting is disabled.
:
Supported format specifiers:
Day: %a, %A, %d, %e
Month: %m, %b, %B
Year: %y, %Y
Hour: %k, %H, %l, %I, %p, %P
Minute: %M
Second: %S
Quote Backlinks formatting is disabled.
:
File Info Formatting is disabled.
:
Link: %l (truncated), %L (untruncated), %T (Unix timestamp)
Original file name: %n (truncated), %N (untruncated), %t (Unix timestamp)
Spoiler indicator: %p
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
Resolution: %r (Displays 'PDF' for PDF files)
Quick Reply Personas

One item per line.
Items will be added in the relevant input's auto-completion list.
Password items will always be used, since there is no password input.
Lines starting with a # will be ignored.

Unread Favicon is disabled.
Thread Updater is disabled.
Interval:
Custom CSS
"; + section.innerHTML = { + innerHTML: "
\rArchiver\r
404 Redirect is disabled.
\r
\r\r\r\r\r\r\r\r
Thread redirectionPost fetchingFile redirection
\rDisabled selections indicate that only one archive is available for that board and redirection type.\r
\r
\rCustom Board Navigation\r
\rNew lines will be converted into spaces.

\r
In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@).
\r
Board link: g
\r
Title link: g-title
\r
Board link (Replace with title when on that board): g-replace
\r
Full text link: g-full
\r
Custom text link: g-text:\"Install Gentoo\"
\r
External link: external-text:\"Google\",\"http://www.google.com\"
\r
Index mode: g-mode:\"type\" where type is paged, all threads or catalog
\r
Index sort: g-sort:\"type\" where type is bump order, last reply, creation date, reply count or file countCombinations are possible: g-text:\"VIP Catalog\"-mode:\"catalog\"-sort:\"creation date\"
\r
Full board list toggle: toggle-all
\r
\r
\r[ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h-mode:\"catalog\"-sort:\"file count\"] [t-text:\"Piracy\"]
\rwill give you
\r[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
\rif you are on /g/.\r
\r
\r
\rTime Formatting is disabled.\r
:
\r
Supported format specifiers:
\r
Day: %a, %A, %d, %e
\r
Month: %m, %b, %B
\r
Year: %y, %Y
\r
Hour: %k, %H, %l, %I, %p, %P
\r
Minute: %M
\r
Second: %S
\r
\r
\rQuote Backlinks formatting is disabled.\r
:
\r
\r
\rFile Info Formatting is disabled.\r
:
\r
Link: %l (truncated), %L (untruncated), %T (Unix timestamp)
\r
Original file name: %n (truncated), %N (untruncated), %t (Unix timestamp)
\r
Spoiler indicator: %p
\r
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
\r
Resolution: %r (Displays 'PDF' for PDF files)
\r
\r
\rQuick Reply Personas\r\r

\rOne item per line.
\rItems will be added in the relevant input's auto-completion list.
\rPassword items will always be used, since there is no password input.
\rLines starting with a # will be ignored.\r

\r\r
\r
\rUnread Favicon is disabled.\r\r\r
\r
\rThread Updater is disabled.\r
\rInterval: \r
\r
\r
\r Custom CSS\r
\r\r\r
\r
\r" + }; items = {}; inputs = {}; _ref = ['boardnav', 'time', 'backlink', 'fileInfo', 'favicon', 'usercss']; @@ -17345,7 +17413,9 @@ }, keybinds: function(section) { var arr, input, inputs, items, key, tbody, tr, _ref; - section.innerHTML = "
Keybinds are disabled.
Allowed keys: a-z, 0-9, Ctrl, Shift, Alt, Meta, Enter, Esc, Up, Down, Right, Left.
Press Backspace to disable a keybind.
ActionsKeybinds
"; + section.innerHTML = { + innerHTML: "
Keybinds are disabled.
\r
Allowed keys: a-z, 0-9, Ctrl, Shift, Alt, Meta, Enter, Esc, Up, Down, Right, Left.
\r
Press Backspace to disable a keybind.
\r\r\r
ActionsKeybinds
" + }; tbody = $('tbody', section); items = {}; inputs = {}; diff --git a/builds/crx.crx b/builds/crx.crx deleted file mode 100644 index a908dabcc8de0285dbeaf5b8d9a5156c91414143..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204271 zcmV)4K+3;Eaxydm0000c0RR910RR9nf&n5h4F(A+hDe6@4FLfG1potr0S^E$f&mHw zf&l>l-yO&x!D@trnzMHomNEhdXhD^!vXHvDI7?V;MqlES#!XA>#g}`=auEi?=_spN z;|-{5(P)`Jsh){veFzzm@V5)?cHrz65H?RO)f|iQh+hvZjO8yDJ$LgCuG=9PxMZc~ z>!(xW5SRtXWAkuMJNrpc!4wdhn4RU)y_y)JSG-!)?X9L0Jx6>tbHCz>8Jy6ZYU<`d3HiJ#?j*!tW6A_~W7b)kf)v)#qFfKX}CnN@@9YPDx{vj*mo(xl4N69ZHVnIcvtm8Z4sa=UHY z7*IWtCL|7Fr038M26#m zTipSMZHk}Yc{H3$nRO|Zks<#2R5ghLrKb{1C32s3I0zh&oN8od(D1i@!qQW+oE5&I zS0^&;k<;S+qo-=p<^r^o!PC{xWt~$(697<40|XQR00;;G00000H#aiZTowZW+OP=# z2><{9b7OL8aC9zebL_o+TN_8RIQoA+#h5rNDF_Li>^Wy~>>P}7%&rXtaI(3;`WZsuCA`Gs;;i?_mdy8BCFC_ zHcAF}$!>XhnPn%#Dxc22=zsmi*U7iT>$FJzo@^vPWmTP*MY7fVkKQIcKib^-c4HI% z_a9$i!B_b(D{25UFGg9F%&xQK_5Nux=GQ$aaXp(&>+OF3DxY1?2fblA=?{ma%|11; z@u5E$mxKN!t!G))f3?56cW|;tkawn2g~V<-y{q!8>sj*u{vT}rn+^OY`G4{c>GV3U zlJEYheoe{`)9bYQ@2g3gkFlkvs(ol)m+2`y^0J?D3xGpny8OX!ZSybK+E(({bduG{ zZaSHkb@JUieCk!bAw7o;dL2%)vc4;3*Sgcq&22rx=Dtl1@?kkn>*QpXP4lcszN`61 zuiy{yCKdSJyLmm^7-Zu-d!P04qQ9WMZ@9g`memNpKLeJ4?$zmhRHf5;k`_gjnst`m zX4wc~3WDk(UEaO?I(?rN{pSZCYhee3YbhT@G`ad!uqVpJc@>o#h1JG9Lr^+c=BX zPE?(>4mC8&(s7a(G{f|#q2LkB;|%(GQQ4{ntmY_V=E5ll_C;S8ty0AN-I! zgPI42r^%~*khK8z^pKiV!1nh}00IDfy?4C(5?<^)+kdrx`b#%?v447iP+tJpo#bfe z_;i2w&8wZ`u&OV=k?AHdsOcb z;2cvi#t^Fi{Bn<8LYq7AzunXQ!vpNh?%~1dF+6smx5uZZ^3VGxd);K`c>e^@h3YSk z51|PpEz~(AFi`VgkKrKM-O+&}`26MseBiaU8ge=M7QPm5}r{u-JW+fEDncRX2 zH%o6a7BI7XlF<~e@>!M)=2sw~aK_X-bAi&3wvuKJ8zA7*b=Wy7?Zl`vno z{_>xH=~J1y{})&}9^t~0B*Wpx;BKQBZhX_*{K9BJYN7b+Nz#t2CvK4r!Lch-d)P4x z-Zx#fcD;JFOU00WN(h7G&Z_s>h$)k3)oDAng1IfmRj2+JEfDGnF9)s1UwqNNoENk( zv^&YazDSbyX_Y+eCJ*8N%pdtbK}zpb!|VKg_9`!K-~o91hy52_&<6_86X9=}Rc?Z;#I|Gb=K&tMG3L>_wFFW@0l53kee29{d& zbW~;U^XyhVod9p#WI(oZes!(hF%cO)JQK>t(C2cpGlZ#EzseDf<7_wwd*FSBKSw!C zD|$Hw)#82j9F<3WoB)ANrX`TRqGz1>`Y#XXF({_#*p@j-=SYB)Y&HWF@I^j>xeJ^C z74`V?-@Ok*5M1W<38*!-et0tl;eo@!k3Xlg;Wa(x$P}j)jQo%DY!1KQ?8E;HhC2ie zr;EB+H@WJ<1WA&&Z)==}$&=*lqDMdV`y9vl@RGmihu?ln%p3!GH-UKuDoT~KajNA| zcC(v|;Sb8@-Z(3+X4jA5{ddV2{;aQK@%%Dr=d9m>e)6Y3(ciQDB6;%UNy0FzYzCT9 zl0Qy9>fak%@Sstjsk{ESo5am>MuiK~l}}CDb7R zSQ?*u)2f`6v%6_#pxIZCxvW#B$Zi#M{T0S>4g`4nHVQ!zQ8%iIgcDd&=(0eKxbrVv z-ilNEs_2328Q-;$&A>JwrM?C|z9N(2 z;(#^|>Kn9*un;CKpXYzwgN3#(QHw8cYt*Z7kwfzgiqxpUtLg))o}219U|yi+QiHJ# zLiMWGy69R2)iOu2y%y;0jL>Gex`H7rZ< zYsTojRVPDk%SB*MD@FqfORAqzH^IqaZ*lpeUpxZLmP2{2kV47y6IKsAX2O z;d~|mL+@%ZZ0iXcMQ1-AUzkoJIPRzm=y_J(%s?XH`gWNQsmrwlxmTnEw0K9VU?B@8 z>98v68fQWdJYsxOmstvA%xbr-Z#Ta+OOhB8{R-`8H2#P!c#LuR_JHW+TL5^5(jXl& zMnG1OXUr|NB9R9Iml{wms!2*qnSk`F1d$247PWp!B}h*OlX5ckpy(x)*8PMQRsrdG zUQfsA9cs!zyfLih$=Wx`BroRpoL-e{z2vkk$FqEjXaehNot)Zon?emKK@};E^>L zAP{gmm*}n_@+fBqP3s=$lRz6_u;jL^Zpbl`c!I{ogN2DJhQw5m-6@nNmkhEQnoseL zf&MeTyC*;t889#UAP?Z^?!5ih5VD=+@ zXvAu7+JLo^zyeu;>Ecjpr>^s>BAFNYuXA*YK{@UEqp~sF^D2{$Li5^LX+UZZc}PjK z0FjbPJWwGcxt-5YIhf6XnP~p@KwwljF@Vk|y8L$XOF2KC4*>K}u=15)Q=->rcU;a# z?3Dh294pBch>AKwes&lzZ3O9!&qVh7HS!{`cXbEaly$oWD=h$&G9(*cZcNG%@(OB$ z)c-;0&l+WNCv5+V`tTw{$J$u=-LLb}2t?2nbOtbqD_wDX=Rzc%!UAhpgRT)cfr|A4 z#zT7_q*VMFMWC6ata}V}IfQztYZGK1&J>3`+nBLG0yH(4HM}4vhrkTgZI1XMK1y~W1Vf3IXx6$ig&%^x*0qtWQA zvl&^mvKqWb(^%2eox8Y7Cg>uS6<(T|ZuSe+cqCr~@Y&buj|1xG47BJdBvb?tT69ox zfk5S4umevq(A%zZ5`lNft2rq6BitkfkxqIQtf&PkttcxZ3pj1cl;coEV>_zOvKwO7 z_vLs#!G)QN<1A3KltI9-su$eus7kM{crTI`rtH$wYFG`XwIxuFX`cb-7o%8~JFdl`7gl0!8Ex-W)-iG1zRdop=H7*cwD7t#n8o}QDSY2Wa zBO^i9LqY2ZX~alx2E@@B>8~_7&2&d=6}9KEx5+N7HIr-CDa70hW2JBkOV72=ZTijpo{77 z8WzsYXb04uj^Bk;*hQCIgaOW2^Q~MQqM%`nvk)##S@tL3`Z>?*>qK;hHXapd(E5CB zWC-GAjMZPI!1Bjf3g?wapm{_Bm3<1rVMi;D+6c+voz8TFYQ|*ICG3IfNbpri(EE>Y7 z9!7y#@3t(?TQjog+3-&@14d69Y8W-9hmmB6aZ*ym5m!qG{+d2Pv$_KNmLj1%2Mm8h zKsr*2+<9He#~5fp-rYsCvhA=!-Q12+xN-7i_iu-W<4~{EL`ZZ$`^GJ{RG_z6sg%fM zzPq>_%Y&DhP+0D>A~70&l&>HeqR)wEW2~w;1Esw&Y7~hMYnd`Rb(_{R$yS%*)AD1 z(T{tef=66{#Qq))u0t<{qCtLjJ;rb+A1U>kmm_XQ!SlsZJtt2p2dl`zBwr%!?kSR~ z@l+amtVbj3d(=a*dz}_nnbk&EF{S0~a*XW)3!h_*+W_}>xZl1+)15gY>QWR9jMp#a z+*OQKv6^FtsVw>3ha3P0bA)*s8YiD~NDbT6;VrL1bwd+q6L1sxC6g{ufkC7gD^Fc) z$V@ztvk23oH6&Matz?s|im=rPA$O^+i&=NxYQxLUdCRbIO-!#C+w|8PHG&J1IT(Be z^YBQ4gfa{@QhyhBlQ-1D+XP7#QZR?&Rc*k3BAuN83nlz=6Jdt#L=hwL0+hDfd^Ee3 zqiZ`x->);oprL^BN7iD;#r0IC+TjRz()KAShq`<(1jW&oU|2y!f*JkM{Qu%s$M+PJc~f#QUK8&z;)9^4Sozp9DT&_0td6 z?{BtF$F|eFXz#<=yCuu=vFs3PR8Ns|_n76px(Sll`f_|A*>uLc=X*rmG zu+3eWW-iC+)i#JX^Q_!^^4$n@e3GIyVPhA{X^A!^9^AME%%&-Z2oNq?e|fa|VQcfh zHv5WVmX42S@TMp=Cb!*NfefD1$^Ypz{`&c!@lmoZZF3+lI+*+R_O^FbmSFxk5x?vwHi@ zl#K@51%iUMUOAbLM-^dXD{e(=a#2L!eC;PtB9jwfjPo@zsFfZ_qup0ey-P3~|Jj?@ z{kMuHeIkDUD;UH+Lnk;j`j3HiseBy5SHvIp0F&q{4m`BQfHh&h&C0S@WHVjLLW}@( zY8k+aO*tUm3e8J=-cDEut9Q3qb)#NM#%*B~gbq(>>4SHQ)ms^UIHG;g7F*Q%i;CRY zg|bdV6ip>oK#r~g!H3I23svrsnMW-$I56aIVJZH2QdToUV?LP%-*}h4MInp!qY4hi zFrnm#gFQCQNAle0MNRr+S{~up0y<`=4t%5qSARRsF2Tgc_1m%h0y4A1(oy+7KqceH zbb#_(G6y%%T@_&D7a)fO8ID2GXBKHL?IY-;kfu-?6ss)bW!qWqOcXW(t zvOi=Whx6450dt6m#Uu@h<%{$^NZB(Le!GFH=*4-FZdAO7dR`3e&nx@$#{PUSeu@(B zD*;0kAC~s_Wj?bH@22+mWNv@g;{8lECf=Xvpxq6c>E~-Nc78lx>z=PIJ4Ah(-{k!l zRR)?3?qqH3)Hm5^=9emw5+am*CSzxE~T2N^FpVx)yFC>2&!>e_520HfxYv-N8agqUSh_V8WC1EE=@WRvOaPC1}kc}x3^sO z?qtvubMmnAzMo^6>+%An0L*GIlzWy;oz~8Hwq6=I`T&lsvpX(pQr=s8^$<(a3vpKG zz;%LFfQ_uL12|@>YLZ5zZjl3wwl`~0!fClg7jP;t9g12*{nas3e=Xb^nW&MekFvt+ z6n8^pjfto+(O)ARqT>XqQZ2XxKj6|K;%X&1<^wzjtp<{4v4_$Y0jO`D$ERhCy4G#0 zs~*FxK(!@C

%-%Uz?Qyp7oOq+kfPB9dv>L5AKhVN6FWGx20S>kA0jPlOb;t~BTI z7FHNO)VkD%`l$RRmbXzXvLGrlrW|*KsbvCHgxL;~Wk!xZD!qy2{t5~N1ytbZZ3b9h zx>dM=O*3)0R?`Mf>wr8KZslWg8;F)^vqKk@wT(XHL3ov21^}kAtTPQsKcyWM%Xx-% zUzA{A^2UxThit1i6U6x#2QO5}(2TY7V2ju|o7G}hYeEy1DeHPHFj9#8MGlNd3t*&l z@Yvr|H79Z$INvOQ69&7rcJGEbc`-Z&k7yY%A4ulWM;)TbuuRc97;3f4VTTF>SQs5O z#^Lleqa0LzGu2h6Zkfn@6qRX&<)jQN32m3E*pmB!zob84A6eW*a#3^cMQ zVLSY3?Q4-Zq|J}x@j@D#}`B6w_|&od`{Jlr_o<63ekHeJK z;?>HiY)$W32`b zH_psAdv^4vz2lSp!vj$MDGimf01kFu@0}d&?Cu#4#ov3{_F&Tm&@hNSlxJ;u#^dq+ zsw`*vC@h|m#pmS76HubZ;)pE21w04k=q_?37Qgqv_^R$s6lBvx#~zk_*y97(5|eW9 zt_#wjoXUg0VAyo=j4roCC$jZvY*7-+;<0jk$LFloYwQQU^iF}d`INSu+R(N>t!)}J zds71I=R3bZkw@PqUnlK{y_bh?j^Xh?Hu>@O{=u8mJ@MjXZ};%vIlS1~+}!MRItobc zbUPnuL=*)_y{k-*{mzV7kt{;c5F>)C2reqMfrVIxj#N=|=R!1!h8YOXm#42^VYH1Rw_tNd3Mc;y)fzV; zDRMbdXYEaqPROScG0ms=F5pw|Bsv{b2bBu2q)Iq?B}Y7AR)iL`dys-Ik8OBW5i>l7 z4->4dX+ZzOBmwte6enuFTZ6K{@uQ3Byo{dzJ0r5u3blGtYWL^QCRWNdwBUvQM6%9N{+HO+c z6~iv6%w1S~L>d{~$93CgR^YIhKpZD3UdG~Nhe#!ZpaMN^NHI6xvv2xkEGA~Ho1 zmT55BBzB=zM0yG~3Sa_3DqIYXvw8{~m1%@9j@qEqk}Y?99>7lb&wKCcvUu3<&5-y2 z*;)H4SR@$!DGx#mOSgPTdPZY^6pNeI?6)58PdRKPMz6*~LXKLsK`aR$J8ivG4lxYA zah_J$ueF|tzt+p<<#1pTcP3?4q4tyg3ja(bBf%>i0RYV-?C}zOkjpCy=x^O|9S%4* z48w-v+56dI(TjzKnr^-6yuNOW6;!g8T%YZGnwe29)5-;(M=_l;0L+Z6?wndk0v4B! zbhC_x4g^rj+i!u4pyNr&RN?gJ_m7t#&NBt+6wH-O!o=}+@=3e1VzX2wq88NYRL&q2 zn52FRyNHBnCr}lK1Ebfv^ICle#4#fZn3Qd9r<*+bGju?=5J6@%qQtCDlByb*%$f{1 z9cnDYwQE%z<;`cMK?ucIhlC)@qqY08%rsep;BzJZk=sj zbZuF*Ta)j^XC?QN?{$(lmSg67H`(eW+sWC5)0wuCve~#tpm9IDgBYv4U-((H>RPUo z|I4~nQR0jhdd8dWLGQ2|wt{Qs%a&CAb{zP1THgz@$wbCImkl|Up2AA#4v*VHh%nQm z?F}k!UWkg$^bk%VA#f5lV;l+=j#n!1iSQ|^Q-Fcfv|YOnfhxU{`W?rD`xJqN)uu)L4| zjKZuWT%EMBM}BK+)|IDpj>KcpNHfHy3<{ZSL3>mZHy2Lw0iH#1no}pMe(&}?Cm?4; zxPK$6W-vIBMlxq!&ye}!zME_;1ht-R%BP0)I(C-CoH@pPM5!hUL>M!3ghpBTGLg0? zK*nFE#b}&W4wCPQxnkCX7XDPZS5L?Jtldgl3nt=fh68VwgmwdnQkYSD`1KW?@dT@0 zp{Eesj$M|fkze>+_rWKw46CHVT{K}iNx3GYhx9sbJuVC`M9gNfBrscpH zWrK2FxI*AI%>lv7Lh=BpKIDzehU~XO$4r+tM7tEc1||uULw`(^Vvy+1V!cjyCsn>c z_|6M#D(;66Enq4~kUqC<-(oWc>{V z3II+q1LG1h19^OTx~PnGiW0U%f;`F{?UoeoXj`&}*{EABF3c06eCX_z88+g zfG1ca&hsKy7~?N15LH@fEROcm*5)JO^QE_aeya(G)!p3DRO$)CeVS~6p^A~0J&KE9 zz+dBraVP2HA23zD&u&lG){=Dwxt^>g_;A*GhJi4Dqkmu1zdt-{U7TTq7m^s0yqKhp zkA=KqUCf^g|D+$hRf#`?u!Qe`HU7KJzB=d!Li(QmRqq_SW8QYzkl9!iB*!vpPIGDP z&Bw=JGfyY#R+V%^xEsVn`!D$_Dny5r`ltuXdxh~cWx+?EN62JGJrU{Q@uRnOfO`sn znGt_t*D@&2vWi@*22bji?`YOd(MQ~}{fUPKgBI+(^)_N%u5bx${g+~bNDMGGWgr(J zJH^2|VERdrzJ1LeY!{{+l`$rK{#$lOKIs-ZVv#HL`9u7z&lKWsbzl&GQs6NDP-pb$ zGas_UpLh_C{;C6T_}d9uy@QPtxu8ae{0w~Jk$gA*cfL&U`xftqAn zOET4sqCEb!J3bO=p&TT7H`l(1*#Zb_m7Nou4P4sYIN>W497mPl6J~buP`R^%O7LRl zPKQKuAq@&ca)JV)`)%0O6`)};ADFKOy26CE3@L?aHkVObtVh6Kb_<%M)qn`l9R zRU!~{?1;o->%EtP78`Q62+0cpZ@nS=M3!p{?9kKiAp0+{?IMw5QD$q~-XI*=w`MRt zn^A5sqmCpr!j2axtLNicu<9_gRhaz-{-WWt=Wo{n@E+|cHkR%wUAQ6EK{;`l^AsK~ z^&f0(PzR#n53umjP)0iM7;T395(@a)cVCNhdu!w5XzNMM~|1;hDD{2$T^+QTQ8&@?hao+EcEv=|Vm zch)`*4dcKfcId$%Xy2BRjv6X50xVqU{$M8lycJH7IJ(Li^0ps{fnlxBhmlbFj=Y#> zZvBtWQ=@d#O{K&;qzM53QLJE$L4SO6c)IiU*)OMiCvT7Tj^FN|?!AUC;zbZWRw44s zJBmrvT(OS*Qx6f`S0uZQ%IrM;gzo!P^yQ^nUKq7TmD6#$=uF5`2ML$yrHcwWuj|PQ zF8_z&IVQG40yfjd*9b)4ggCHL;e_=v>-aMv#*4P!Rma=R4&Kf?#ZxRY%oau5xaw!4 z_UWlmo(AAAlV%yQ)m+O*(^$E$#R|SiU0pTMhbM9v=fjg&X&e?cZxV+b{Lv$W)l0Rk zjwzRml}`=Rj4T0d`Rt@PrYYK*{FaW}ra_T}rOS-C?L#6XPA#I&Yptw2YEoAIZEDJ* zsk&4#akb+$js05kJq7)s!=ubcRwaulE>UfSMxgDe1`9NbptNVH|DmTkoKTAJh{q1R zHK#m;<3~mkhlaMf2+tHFaUvYI7^$TqgXy9=`Cc2f7aCpqvulGVjh`9qJ4u|kX>}F4 zanOID8z?xi1PiJ-GYi?xm9XU_oV4KFBbQR@aiy+g01@ca1Me=fF(EW|~ zI5b6qSeBu{VUk4{l-Et(F&A-&h~W}xttt1h;x9AOXRr!6U3w=gDZAPB&wkMGWW2{a z50)R(YuIl%XdGYNEKhh5C8Gb6TGoOPVEiv025hik`h|`2d&dtIHm!^CRPjNmbpVfu zuC?^owAPX#UVoa=nQo$7t7}CK6i5zA%xZ|Adi&4uMO!}(_>SIIr`NjZy({yg-D-8Z zG0eB|kBhfMLfZ@9#HZ690Z|l_B^hQLS(7@s0!0UEqzBwv@dfk0 zPz~Bh5{1{3wVrw9fm=*_Dw5aFnTQn6;eC3^R}jTN9u}u`cW><5QC<{T6V#JgKD@bW z_(-W*;x(~1uks0P^Mzk=2ch}v;gRQ=RAKy-Q-Si6xu35zbF;(}L!bsT{LaEj2eyA~ z;49Gfk9eC}gwtJR2lI)$Zt-Q{Wac$kbwi4(df0CD5Wq$;pJ@4bc*Nmil=#j_9A$`| zwJ1|CZRXfb+}6TPgwM9h09Rv7>EAlSt=&H#t@pc$CPPdG^GB;et&l|&2@opX>EOk+ zs@CG-I5uj#%1E+tcC-p9>x(Y}84&||rcKp3vc zI4-x#gsNx3v?bzTD2brKLl#-Lupv2#<@=HX`>S!dTw)yC-Rj_qbyn^fXOCx9Pbhek-HbuV|FE1^9U%g$8 zz9&gq(*wea%TkyWSG}M1_kLz*v`5uabr(xvoKEf58TIPP8YkSwVwAID?P9U$R-w@< zbodOT@F@heOZ30!e5QoavcQswi6Y6Q*5&U-MEEvKi%!6Zl9?FA-f&zNba2O<{A!dQ z)4Yf)UA}H1&BYZL2`k>3kY*CMrqoEQL0u1Uo);@)?dT>eqpbw-?~66%0&I*e(?;nLT(L{Jhxj^)9^NGMj9#}nUU^m0 zP)756kmkW>(k9>vhd7AMA4(h?nw4pDle-6r;%1RCEbOp1LL8RkvFB9sCJ<-#0o`;D z)D>&*;p<4ZDI1akDk6c+FRR_d8Yy)9ARgG5S$+jih^g}2G1p2}iQX0%t4@hUHmlAV z=h?1q{omDubwI1-M_o1Hd4F~HW{L#j8=0-5ly9YKqgNIQ4PbrjOAI#VlV^?5Y7KZT z0xh*Y`q@&Rbz6c~C0zpB+MqXKL1ZFQsktysKT@H?qG)@HqWIWU)Yv22R%vjGYG#di zT0DET$yMSEn#+uomMzAEM>J!aS&uFP)C@<3e^)+3hz@%xE1Qo$cphC2JEYJlJc2r* zVClNq;|Kpnq3=-5%0F5!JJ^Qqe})IP>pTFj?v zxEvrxp`;@^z=mK6+P;XMeZtJfhPHW7?Odj;%rxlMM9_CT=-#RjecfSOlCpr~31j<; z5)Ve+o7<+iHIezNes;I3jgodtmum&nm^Y@?%1HN=klCcq47ZtETb%E)(+Q}qBmnub z$i}IHbo|MOTGk&ia?rPkp1GQeI3*FdMOc&sc-8b<{5p zPa=CzNP0M8ek0{NKr~d`@gf{lX}QBFTNj^~wabZ=xnYcB*74DcTGw^xZ>)V?0I!=L zWp9r6cgx8X%ql$ahM#)Z=%!T zn0tL8LZX^4&Lu*TVtn{m&0acPy9`CO;3y2$6K(D+LDE)KzhWo`g(NygeQ$mFC2oJU zeA`Z?%Nz5#bksd)9qf@xQQf`Z!23l=s=D|mhMxG`Bj-h|eahO+?c-037zJH>t(Gya2_GRzdgMI2~kTcZ-wW zU)$@{f^VO?uR@Lz7v7b!e!`syCA_`QdWRx-&HEFvC0|_~J_<$)Z9V@i<;SQND5<`{ za{iTe;5jz~u|k*5l7$LEPc7s5 zoz~ao41<>2xCP@38#cVoMQO@VcE0m4QJiC}lO!^OhcHy0Cb3IXuRrWxO@t8o7`F$+ zBx_~_qiHqmZxLRzXor(Hi|OUpD7-PrPkO52of@TD|TN)pNf zaVVxI{RD$JT(y#30SHr*RRMb4?(+`&d5z(s{mDT6C1NY^$ z4gYo?_B$(tjtgR2m6=6NNCM$H+{FpH9K37(P&dxDE{yTRFCIBrS-k@zf_u6OTnEN@ zGvX`~MY#u_FKGD);6T|*l{je9ePNf zUtx$_s}t7E>-`Bwi1gdgq2H#()o)k%B}nF+6T`YtqY!?|M;Y4X{o8CXSys`=XQz2Q zT;xM+lAct?9_Up9fe9px8O^k#^$!^GA!ortA*(!2Qp5`9lOt$F(yw>${~M!Oz`tAk z=Mn1}{O=b3F_G_5yO@*%ma>j7?Q@g~rNxDMM6(`ANGgoZ^3jFww_|kPS#-8k16vlM zcM72`{N0Gr*4f*40;PhJP~kz>of+tYgE{CotvuLWWE3B1qQO#hGb^WYs@+&LAE{O! zSu}4Hnvd{zBbtxS-rjhWWAV&G-_i)Iwtin_GxXd&0}0iTW(8*lB`0n1<-B-EJr>s7 zGI#e{P1`>-qj%+$JBnI$S8=kLok_!L_)4Ae_jAc^MTPMuJDJTvtH1)s*>GOfAgRZ9 z_teOd5*k*_>utYrHrEzD)U6AjUl5LmNeo<2L_sz065hv*HxSbY*^bBLN(0P0`|KsP5T4bNL!GiA!-Z3>Bbs7bhL+a z9b?%Qj6&Lgk5={z>1(Bw)u8e;F0EU$oZ+~$QU2bEI}=f2EiBjy=*bC+Jb2yYY*FY) zm$IL>Ie8D)m8(Y^Y$`Vri^bLJteCevr%|+VEGSzIJ@_W5Lq%Y4?;|;2Sx5B)qmG88`rlh#Xk$Zw!4r<*8B(kf3#nNYD$-0G0XlIio4%b^MkvN zy4t~8S^N;~{|$?Q)~Z%t3mVxcBF?d_5y_3x8+2kRy#Fmy+UrG3Nv25j-DvK7eiuzXAcatHy&=a$nZv)t_M>!Ui&2P{3x`XPR3&U;ZfV@g>h z#6vy9+pmT3?HJzH;+CX#;fAh==T4+q$ip%~-LDsDEsKcWV)h$tkYlwuTawWJ?~U8% zpfy$TR}qG2GvSq2i+=a?NsZ99bR567rn-m%A01W7Ri+GB@!iP;=`iQ_N$c!6)Hb_;>wN+J(fzH2=Se5H2OB}fh z-%rlmOR@xWiDsZaLDC@5qf^(PvyIZ2)5pez!v8H(+Au|!vig7HO#OW)YRt;`pP#48 zk0ZEYF*-n};V^;J#hii*jvK_vHDF7^&P&*XRL4y%KMI?oy0Ne_kaW3)4d5Vo@JT_A zO0EUL96YD!27_V7AY?A_aQdlOMsDoiF&BjmrT2w(6+*%$6^y2DK)QK{KU8h&N_bn( zr}pZHw{JO%R^8rJ&{W@Ee_S7H>_y> zv1iw@1N!VbcP*OaONV!Hk)F6Z$ecnI+|>}M_W5D_c2Q3L{Q>oVT=cx$1?@3c|IQns z3^cy-k($8;7H@v4`4&g*lQ%yV)MfjhX0o?58u4=(#znKh+hd_B{SdkUn%_tQwPn=V z1>?AAIl7<|-@i2aKXPIqrrFtm{l&5Te&l~MEDE7t5}F?k=Whn7W8jwu)yISJn<499 z_T|y>(V+Tfz$ylPX+XP(gkKI6gU1&~pA)z+WW5Zl&)#w;OR9@y45oOADjn0qks&<7+Y5Vr=AlKWD{Lg+pxALOLb^qIm6jBXS~e5=yXpIe^bYoN5q(Ru9Tbsr zT$?u$;PJ~b!i=4y$79qwDXiwmiao8R3M49Przx+?=@0r@L(=d0NwN^Xks~KvV%R;M zb51pOai)P^oN;A8!k+=`U+zt&vpXk!p#rgOI_d~+hPrKj*>U%G7}#6Ir9KVyPe!>J zsnyX46iwmKKsIbI=O`EB6}jqjxykiehU6#VA`|kjFc6(+?)6U@NSBVyBf4Nr-A$H{ zA=9nayI7wh`?kwjV-W**DbDX9Otd3o0PDN@v!(t%`h5jWSF39HN+@Dh@FWkOJW+|J zCAHdZLI;;0{aoy5Lii%GnuH5C6NBgQ1k@ceA-w~jd4OojFJx4928NvP9QS+R_lM%bBKd6D?( zXY7AGGx>YCkn8^j@cG7n?dB?WlO_lE1L>BWbRcfMV4it>^hQHNRK5J(>qMe8h=?S2 zrv-w+`xXNhSu{OJv2NayG|YQLw=WgtZOHEhMG}Tr#UcU3szMjJUT4FbjIM5xv;p6EbH)k%*0+ycHoKSfH7H0H)7XS2$q@6Aw%7Xo)IA-h`^`tgI2qTw znvz-G!=TIjX;*2%uM)XV>Fyg>%-5^$zUxuSdNYvK*{sKDKWUMDw7Kbvtyob^!1(Rv zx1ofi&RN4NNTa?`06jp$zYX+RNe;XuRa~Aa&?xnnDtgRHIy1QRklDM;b(gEGo|c7- zQT)739Q<#}E~juOMK+T4_^mH~aYZRLr!{_`u~n5PZY4&(;nJzajAekvt7-2^HVgQDk?oEDy~j&FRd-x+ zIP)O7!pp`NOu2;U3ra>@uG4WljEBr zlgzEM9@*{HfX=P6HtK=QKIuE9cQMy#IvROJ;Z3X{9j%I=enIbY_44%ftL>!qU7Fxg z`6utv_bFeqz5SRYI-jgDVwWlWZvzpp*Er|$6Uqek^t*og^gDp9imN+1;5EE^8lI?8 zSivH8HwJc{ro)`PIGauZyyy)`%J&C3zD`{~*p9%PgvYr(CrN0#!Di~-Cmlc5aKD-P z&gXd4W8hB~r*i-ux~$5<#;=DdR@2d)87mE;1uIKl8oe%Ocj3Zxktw+Fi(&8IZQM<}lfx|x>^F@E&{t>(ijX^$Q!Ix1A z0f5xc{kvLY%AUHtZWV1$-9XPbGJ47$Z|>r*9)51Ld(=erySw0CGI!4@nyXgve$bnvN41m$8NKKMdH>f1`9B2HsTn-HBC36@P)aUH5) z`V~l4U+0$%7J`%nCcc^wG`_4A8Yrug%hIuRj0)*4=^AHBh}wqDBBN3*i8ZL_^Atge zEJB{!R4-QLF*tgw*ST=m;QYHB)@TaIzhq|tkN-k`mscK2PCqKgcb9y^nVZ9Ss_n+ZKGNzw z%0TYaHI;JY-mH8!E(dMjQloFyvNQW7tXIb&M=>G3zXh%-Z+i#Q4S?BQr>1TTUCI7; zUGFv<+~hO)b%l%4R7aGzca&Y`MRrt`&?Iz6!sv@*55)v*a@fgev=oo|Jtdl^sYS?RY_pvCb~cgi1Fh@ zy<2~hY`I*3Fwb%=%7JInYPTF^JF|8kvH9)Q?SnR=L6i0jVO+S!-jSNynCdgV%KFpd zN}gH|GPkHfwe!4j3JWg}B`Tr$8o9FDpM|mMmuGbwdEt3EoV#owyW%yt?eucd%yeZK z&(EJ+U=1wqq*sC2@p)}>T9?&km++7&Cnm#)_|~ErnA+KUOdcQlP7c!d=1n%rXS@0>bO9{gtTJD(2?6tn zC#n7lh4afh^A6Z#{!HBjRu8LkJbvj`s;|pxHk{AY3ulSL%6j(h_b^>myTxr_&shKI^Y+>Y2zw76b9S4twraemN(!3)=*(GRtKcV$yP=25+uTRzp zni|Hnr-^(FTX%^4`E4uaN$0b219K8V`#bu#YAeJcGJ?N9CV2ZgHx$9ievFQf$I_pV z+_MrmWn#xjJvR|3oC2$%uogvu^1gAlvR#l4mMa@3ysfaqP;}^8gO~W zb`0f1;(4;__rmlP<+9CeUEQLvrzV_tfzV!-#Ckdum0?-JP7#`)6roRl^93K;LPCLZ#vW0{y57hAtQZ6V-X5 za8L*Vti$4jszhML^s6YSSGM3EL|#u3jKX+9Wfp?*7_tG7mU|@jB2YrLH44UvMi+#q z;<|k5d~`)!oy|1+s5RQr-!6jE-Tl$Vja^owmd6A^cD8 zN%RKg$n1Rpn|}IaHrd8Ge)3q-Jy_jjSZl{s)7Fyh6qhrKHW^WJe4g`N zAE?^2oX*+w>wi5tJP>wp>%t#+apMcxX55l@P~vlsBqT}Ncp^c~$W-V$3SGRWhkqz&4^zlrcaMRWh6B8D*hMkQBhO)t| zC1ggJeLtJwB@gw_B&lA}O?^(Om@Vs;a2G*!w|R1+0JogE=d-|7@2CB}pE)8}-JRYF z#y?o#hjpi^$98J_>U6u&%@Lb*p0*^4cNetLS!JF&@xw(r7-wphID2c}MkI(Ht%tbb z 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ɎMw^@S&$;>0B{Bu5}n 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 diff --git a/builds/crx/manifest.json b/builds/crx/manifest.json index df7271072..4e297c4f4 100644 --- a/builds/crx/manifest.json +++ b/builds/crx/manifest.json @@ -15,7 +15,7 @@ "run_at": "document_start" }], "homepage_url": "http://zixaphir.github.com/appchan-x/", - "minimum_chrome_version": "33", + "minimum_chrome_version": "32", "permissions": [ "storage", "http://*/", diff --git a/builds/crx/script.js b/builds/crx/script.js index d43f1470c..52f8afc28 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -88,7 +88,7 @@ 'use strict'; (function() { - var $, $$, Anonymize, ArchiveLink, Banner, Board, Build, Callbacks, CatalogLinks, CatalogThread, Clone, Color, Conf, Config, CustomCSS, DataBoard, DeleteLink, Dice, DownloadLink, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Flash, Fourchan, Gallery, Get, GlobalMessage, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Index, JSColor, Keybinds, Labels, Linkify, Main, MarkNewIPs, MascotTools, Mascots, Menu, Nav, Navigate, Notice, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteInline, QuoteMarkers, QuotePreview, QuoteStrikeThrough, QuoteThreading, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Rice, Sauce, Settings, SimpleDict, Style, ThemeTools, Themes, Thread, ThreadExcerpt, ThreadStats, ThreadUpdater, ThreadWatcher, Time, TrashQueue, UI, Unread, Video, c, d, doc, editMascot, editTheme, g, userNavigation, + var $, $$, Anonymize, ArchiveLink, Banner, Board, Build, Callbacks, CatalogLinks, CatalogThread, Clone, Color, Conf, Config, CrossOrigin, CustomCSS, DataBoard, DeleteLink, Dice, DownloadLink, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Flash, Fourchan, Gallery, Get, GlobalMessage, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Index, JSColor, Keybinds, Labels, Linkify, Main, MarkNewIPs, MascotTools, Mascots, Menu, Nav, Navigate, Notice, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteInline, QuoteMarkers, QuotePreview, QuoteStrikeThrough, QuoteThreading, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Rice, Sauce, Settings, SimpleDict, Style, ThemeTools, Themes, Thread, ThreadExcerpt, ThreadStats, ThreadUpdater, ThreadWatcher, Time, TrashQueue, UI, Unread, Video, c, d, doc, editMascot, editTheme, g, userNavigation, __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; }, __hasProp = {}.hasOwnProperty, @@ -4852,11 +4852,15 @@ this.pagelist = $.el('div', { className: 'pagelist', hidden: true, - innerHTML: "

" + innerHTML: { + innerHTML: "
\r\r<\r\r
\r
\r
\r\r>\r\r
" + } }); this.navLinks = $.el('div', { className: 'navLinks', - innerHTML: "\uf05c " + innerHTML: { + innerHTML: "\r\r\\uf05c\r \r\r\r\r\r\r\r\r" + } }); this.timeEl = $('time#index-last-refresh', this.navLinks); this.searchInput = $('#index-search', this.navLinks); @@ -6078,7 +6082,9 @@ comment = thread.OP.nodes.comment.innerHTML.replace(/(
\s*){2,}/g, '
'); root = $.el('div', { className: 'catalog-thread', - innerHTML: "
" + postCount + " / " + fileCount + " / " + pageCount + "
" + subject + "
" + comment + "
" + innerHTML: { + innerHTML: "\r
\r" + postCount + " / " + fileCount + " / " + pageCount + "\r\r
\r" + subject + "\r
" + comment + "
\r" + } }); root.dataset.fullID = thread.fullID; if (thread.isPinned) { @@ -6814,11 +6820,120 @@ }; })(); + CrossOrigin = (function() { + var eventPageRequest; + eventPageRequest = (function() { + var callbacks; + callbacks = []; + chrome.runtime.onMessage.addListener(function(data) { + callbacks[data.id](data); + return delete callbacks[data.id]; + }); + return function(url, responseType, cb) { + return chrome.runtime.sendMessage({ + url: url, + responseType: responseType + }, function(id) { + return callbacks[id] = cb; + }); + }; + })(); + return { + file: (function() { + var makeBlob; + makeBlob = function(urlBlob, contentType, contentDisposition, url) { + var blob, match, mime, name, _ref, _ref1, _ref2; + name = (_ref = url.match(/([^\/]+)\/*$/)) != null ? _ref[1] : void 0; + mime = (contentType != null ? contentType.match(/[^;]*/)[0] : void 0) || 'application/octet-stream'; + match = (contentDisposition != null ? (_ref1 = contentDisposition.match(/\bfilename\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref1[1] : void 0 : void 0) || (contentType != null ? (_ref2 = contentType.match(/\bname\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref2[1] : void 0 : void 0); + if (match) { + name = match.replace(/\\"/g, '"'); + } + blob = new Blob([urlBlob], { + type: mime + }); + blob.name = name; + return blob; + }; + return function(url, cb) { + if (/^https:\/\//.test(url) || location.protocol === 'http:') { + return $.ajax(url, { + responseType: 'blob', + onload: function() { + var contentDisposition, contentType; + if (!(this.readyState === this.DONE && this.status === 200)) { + return cb(null); + } + contentType = this.getResponseHeader('Content-Type'); + contentDisposition = this.getResponseHeader('Content-Disposition'); + return cb(makeBlob(this.response, contentType, contentDisposition, url)); + }, + onerror: function() { + return cb(null); + } + }); + } else { + return eventPageRequest(url, 'arraybuffer', function(_arg) { + var contentDisposition, contentType, error, response; + response = _arg.response, contentType = _arg.contentType, contentDisposition = _arg.contentDisposition, error = _arg.error; + if (error) { + return cb(null); + } + return cb(makeBlob(new Uint8Array(response), contentType, contentDisposition, url)); + }); + } + }; + })(), + json: (function() { + var callbacks, responses; + callbacks = {}; + responses = {}; + return function(url, cb) { + if (/^https:\/\//.test(url) || location.protocol === 'http:') { + return $.cache(url, (function() { + return cb(this.response); + }), { + responseType: 'json' + }); + } + if (responses[url]) { + cb(responses[url]); + return; + } + if (callbacks[url]) { + callbacks[url].push(cb); + return; + } + callbacks[url] = [cb]; + return eventPageRequest(url, 'json', function(_arg) { + var error, response, _i, _len, _ref; + response = _arg.response, error = _arg.error; + if (error) { + return delete callbacks[url]; + } else { + _ref = callbacks[url]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + cb = _ref[_i]; + cb(response); + } + delete callbacks[url]; + return responses[url] = response; + } + }); + }; + })() + }; + })(); + Anonymize = { init: function() { - if (!Conf['Anonymize']) { + var _ref; + if (!(((_ref = g.VIEW) === 'index' || _ref === 'thread' || _ref === 'archive') && Conf['Anonymize'])) { return; } + if (g.VIEW === 'archive') { + return this.archive(); + } return Post.callbacks.push({ name: 'Anonymize', cb: this.node @@ -6841,14 +6956,31 @@ $.replace(email, name); return delete this.nodes.email; } + }, + archive: function() { + return $.ready(function() { + var name, trip, _i, _j, _len, _len1, _ref, _ref1, _results; + _ref = $$('.name'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + name = _ref[_i]; + name.textContent = 'Anonymous'; + } + _ref1 = $$('.postertrip'); + _results = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + trip = _ref1[_j]; + _results.push($.rm(trip)); + } + return _results; + }); } }; Filter = { filters: {}, init: function() { - var boards, err, filter, hl, key, op, regexp, stub, top, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5; - if (!Conf['Filter']) { + var boards, err, filter, hl, key, line, op, regexp, stub, top, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6; + if (!(((_ref = g.VIEW) === 'index' || _ref === 'thread') && Conf['Filter'])) { return; } if (!Conf['Filtered Backlinks']) { @@ -6856,18 +6988,18 @@ } for (key in Config.filter) { this.filters[key] = []; - _ref = Conf[key].split('\n'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - filter = _ref[_i]; - if (filter[0] === '#') { + _ref1 = Conf[key].split('\n'); + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + line = _ref1[_i]; + if (line[0] === '#') { continue; } - if (!(regexp = filter.match(/\/(.+)\/(\w*)/))) { + if (!(regexp = line.match(/\/(.+)\/(\w*)/))) { continue; } - filter = filter.replace(regexp[0], ''); - boards = ((_ref1 = filter.match(/boards:([^;]+)/)) != null ? _ref1[1].toLowerCase() : void 0) || 'global'; - if (boards !== 'global' && (_ref2 = g.BOARD.ID, __indexOf.call(boards.split(','), _ref2) < 0)) { + filter = line.replace(regexp[0], ''); + boards = ((_ref2 = filter.match(/boards:([^;]+)/)) != null ? _ref2[1].toLowerCase() : void 0) || 'global'; + if (boards !== 'global' && (_ref3 = g.BOARD.ID, __indexOf.call(boards.split(','), _ref3) < 0)) { continue; } if (key === 'uniqueID' || key === 'MD5') { @@ -6877,14 +7009,14 @@ regexp = RegExp(regexp[1], regexp[2]); } catch (_error) { err = _error; - new Notice('warning', err.message, 60); + new Notice('warning', [$.tn(("Invalid " + key + " filter: ") + line, $.el('br')), $.tn(err.message)], 60); continue; } } - op = ((_ref3 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref3[1] : void 0) || 'yes'; + op = ((_ref4 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref4[1] : void 0) || 'yes'; stub = (function() { - var _ref4; - switch ((_ref4 = filter.match(/stub:(yes|no)/)) != null ? _ref4[1] : void 0) { + var _ref5; + switch ((_ref5 = filter.match(/stub:(yes|no)/)) != null ? _ref5[1] : void 0) { case 'yes': return true; case 'no': @@ -6894,19 +7026,11 @@ } })(); if (hl = /highlight/.test(filter)) { - 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'; + hl = ((_ref5 = filter.match(/highlight:(\w+)/)) != null ? _ref5[1] : void 0) || 'filter-highlight'; + top = ((_ref6 = filter.match(/top:(yes|no)/)) != null ? _ref6[1] : void 0) || 'yes'; top = top === 'yes'; } - this.filters[key].push({ - hide: !hl, - op: op, - stub: stub, - "class": hl, - top: top, - match: regexp, - test: typeof regexp === 'string' ? Filter.stringTest : Filter.regexpTest - }); + this.filters[key].push(this.createFilter(regexp, op, stub, hl, top)); } if (!this.filters[key].length) { delete this.filters[key]; @@ -6920,9 +7044,24 @@ cb: this.node }); }, + createFilter: function(regexp, op, stub, hl, top) { + var settings, test; + test = typeof regexp === 'string' ? Filter.stringTest : Filter.regexpTest; + settings = { + hide: !hl, + stub: stub, + "class": hl, + top: top + }; + return function(value, isReply) { + if (Filter.test(test, value, isReply)) { + return settings; + } + }; + }, node: function() { - var key, obj, value, _i, _len, _ref; - if (this.isClone) { + var filter, key, result, value, _i, _len, _ref; + if (this.isClone || this.isFetchedQuote) { return; } for (key in Filter.filters) { @@ -6932,18 +7071,18 @@ } _ref = Filter.filters[key]; for (_i = 0, _len = _ref.length; _i < _len; _i++) { - obj = _ref[_i]; - if (!Filter.test(obj, value, this.isReply)) { + filter = _ref[_i]; + if (!(result = filter(value, this.isReply))) { continue; } - if (obj.hide) { + if (result.hide) { if (!(this.isReply || g.VIEW === 'index')) { continue; } - this.hide("Hidden by filtering the " + key + ": " + obj.match, obj.stub); + this.hide("Hidden by filtering the " + key + ": " + result.match, result.stub); return; } - this.highlight("Highlighted by filtering the " + key + ": " + obj.match, obj["class"], obj.top); + this.highlight("Highlighted by filtering the " + key + ": " + result.match, result["class"], result.top); } } }, @@ -6988,12 +7127,6 @@ } return false; }, - email: function(post) { - if ('email' in post.info) { - return post.info.email; - } - return false; - }, subject: function(post) { if ('subject' in post.info) { return post.info.subject || false; @@ -7022,7 +7155,7 @@ var file; file = post.file; if (file && (file.isImage || file.isVideo)) { - return post.file.dimensions; + return file.dimensions; } return false; }, @@ -7040,8 +7173,8 @@ }, menu: { init: function() { - var div, entry, type, _i, _len, _ref; - if (!Conf['Menu'] || !Conf['Filter']) { + var div, entry, type, _i, _len, _ref, _ref1; + if (!(((_ref = g.VIEW) === 'index' || _ref === 'thread') && Conf['Menu'] && Conf['Filter'])) { return; } div = $.el('div', { @@ -7056,9 +7189,9 @@ }, subEntries: [] }; - _ref = [['Name', 'name'], ['Unique ID', 'uniqueID'], ['Tripcode', 'tripcode'], ['Capcode', 'capcode'], ['E-mail', 'email'], ['Subject', 'subject'], ['Comment', 'comment'], ['Flag', 'flag'], ['Filename', 'filename'], ['Image dimensions', 'dimensions'], ['Filesize', 'filesize'], ['Image MD5', 'MD5']]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; + _ref1 = [['Name', 'name'], ['Unique ID', 'uniqueID'], ['Tripcode', 'tripcode'], ['Capcode', 'capcode'], ['Subject', 'subject'], ['Comment', 'comment'], ['Flag', 'flag'], ['Filename', 'filename'], ['Image dimensions', 'dimensions'], ['Filesize', 'filesize'], ['Image MD5', 'MD5']]; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + type = _ref1[_i]; entry.subEntries.push(Filter.menu.createSubEntry(type[0], type[1])); } return Menu.menu.addEntry(entry); @@ -8151,555 +8284,224 @@ } }; - Linkify = { + QR.captcha = { init: function() { - var type, _i, _len, _ref; - if (!Conf['Linkify']) { + var counter, root; + if (d.cookie.indexOf('pass_enabled=1') >= 0) { return; } - this.types = {}; - _ref = this.ordered_types; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - this.types[type.key] = type; + if (!(this.isEnabled = !!$.id('g-recaptcha'))) { + return; } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - if (Conf['Embedding'] || Conf['Link Title']) { - this.embedProcess = Function('link', 'post', "var data = this.services(link);\nif (data) {" + ((Conf['Embedding'] ? 'this.embed(data); ' : '') + (Conf['Link Title'] ? 'data.push(post); this.title(data);' : '')) + "}"); - } - return Post.callbacks.push({ - name: 'Linkify', - cb: this.node + this.captchas = []; + $.get('captchas', [], function(_arg) { + var captchas; + captchas = _arg.captchas; + return QR.captcha.sync(captchas); }); + $.sync('captchas', this.sync.bind(this)); + root = $.el('div', { + className: 'captcha-root' + }); + $.extend(root, { + innerHTML: "
" + }); + counter = $('.captcha-counter > a', root); + this.nodes = { + root: root, + counter: counter + }; + this.count(); + $.addClass(QR.nodes.el, 'has-captcha'); + $.after(QR.nodes.com.parentNode, root); + $.on(counter, 'click', this.toggle.bind(this)); + return $.on(window, 'captcha:success', (function(_this) { + return function() { + return $.queueTask(function() { + return _this.save(false); + }); + }; + })(this)); }, - events: function(post) { - var el, i, items; - i = 0; - items = $$('.embedder', post.nodes.comment); - while (el = items[i++]) { - $.on(el, 'click', Linkify.cb.toggle); - if ($.hasClass(el, 'embedded')) { - Linkify.cb.toggle.call(el); - } + shouldFocus: false, + timeouts: {}, + postsCount: 0, + needed: function() { + var captchaCount; + captchaCount = this.captchas.length; + if (this.nodes.container && !this.timeouts.destroy) { + captchaCount++; + } + this.postsCount = QR.posts.length; + if (this.postsCount === 1 && !Conf['Auto-load captcha'] && !QR.posts[0].com && !QR.posts[0].file) { + this.postsCount = 0; + } + return captchaCount < this.postsCount; + }, + onPostChange: function() { + if (this.postsCount === 0) { + this.setup(); + } + if (QR.posts.length === 1 && !Conf['Auto-load captcha'] && !QR.posts[0].com && !QR.posts[0].file) { + return this.postsCount = 0; } }, - node: function() { - var data, end, endNode, i, index, length, link, links, node, result, saved, snapshot, space, test, word; - if (this.isClone) { - return (Conf['Embedding'] ? Linkify.events(this) : null); + toggle: function() { + if (this.nodes.container && !this.timeouts.destroy) { + return this.destroy(); + } else { + return this.setup(true, true); } - if (!Linkify.regString.test(this.info.comment)) { + }, + setup: function(focus, force) { + if (!(this.isEnabled && (this.needed() || force))) { return; } - test = /[^\s'"]+/g; - space = /[\s'"]/; - snapshot = $.X('.//br|.//text()', this.nodes.comment); - i = 0; - links = []; - while (node = snapshot.snapshotItem(i++)) { - data = node.data; - if (!data || node.parentElement.nodeName === "A") { - continue; - } - while (result = test.exec(data)) { - index = result.index; - endNode = node; - word = result[0]; - if ((length = index + word.length) === data.length) { - test.lastIndex = 0; - while ((saved = snapshot.snapshotItem(i++))) { - if (saved.nodeName === 'BR') { - break; - } - endNode = saved; - data = saved.data; - word += data; - length = data.length; - if (end = space.exec(data)) { - test.lastIndex = length = end.index; - i--; - break; - } - } - } - if (Linkify.regString.exec(word)) { - links.push(Linkify.makeRange(node, endNode, index, length)); - } - if (!(test.lastIndex && node === endNode)) { - break; - } - } + $.addClass(QR.nodes.el, 'captcha-open'); + if (focus) { + this.shouldFocus = true; } - i = links.length; - while (i--) { - link = links[i]; - Linkify.embedProcess(Linkify.makeLink(link), this); + if (this.timeouts.destroy) { + clearTimeout(this.timeouts.destroy); + delete this.timeouts.destroy; + return this.reload(); + } + if (this.nodes.container) { + return; + } + this.nodes.container = $.el('div', { + className: 'captcha-container' + }); + $.prepend(this.nodes.root, this.nodes.container); + new MutationObserver(this.afterSetup.bind(this)).observe(this.nodes.container, { + childList: true, + subtree: true + }); + return $.globalEval('(function() {\n function render() {\n var container = document.querySelector("#qr .captcha-container");\n container.dataset.widgetID = window.grecaptcha.render(container, {\n sitekey: \'6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc\',\n theme: document.documentElement.classList.contains(\'tomorrow\') ? \'dark\' : \'light\',\n callback: function(response) {\n window.dispatchEvent(new CustomEvent("captcha:success", {detail: response}));\n }\n });\n }\n if (window.grecaptcha) {\n render();\n } else {\n var cbNative = window.onRecaptchaLoaded;\n window.onRecaptchaLoaded = function() {\n render();\n cbNative();\n }\n }\n})();'); + }, + afterSetup: function(mutations) { + var iframe, mutation, node, textarea, _i, _j, _len, _len1, _ref; + for (_i = 0, _len = mutations.length; _i < _len; _i++) { + mutation = mutations[_i]; + _ref = mutation.addedNodes; + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { + node = _ref[_j]; + if (iframe = $.x('./descendant-or-self::iframe', node)) { + this.setupIFrame(iframe); + } + if (textarea = $.x('./descendant-or-self::textarea', node)) { + this.setupTextArea(textarea); + } + } } }, - embedProcess: function() {}, - regString: /((https?|mailto|git|magnet|ftp|irc):([a-z\d%\/])|[-a-z\d]+[.](aero|asia|biz|cat|com|coop|info|int|jobs|mobi|museum|name|net|org|post|pro|tel|travel|xxx|edu|gov|mil|[a-z]{2})([:\/]|(?!.))|[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}|[-\w\d.@]+@[a-z\d.-]+\.[a-z\d])/i, - makeRange: function(startNode, endNode, startOffset, endOffset) { - var range; - range = document.createRange(); - range.setStart(startNode, startOffset); - range.setEnd(endNode, endOffset); - return range; + setupIFrame: function(iframe) { + this.setupTime = Date.now(); + if (QR.nodes.el.getBoundingClientRect().bottom > doc.clientHeight) { + QR.nodes.el.style.top = null; + QR.nodes.el.style.bottom = '0px'; + } + if (this.shouldFocus) { + iframe.focus(); + } + return this.shouldFocus = false; }, - makeLink: function(range) { - var a, i, t, text; - text = range.toString(); - i = 0; - while (/[(\[{<>]/.test(text.charAt(i))) { - i++; + setupTextArea: function(textarea) { + return $.one(textarea, 'input', (function(_this) { + return function() { + return _this.save(true); + }; + })(this)); + }, + destroy: function() { + if (!this.isEnabled) { + return; } - if (i) { - text = text.slice(i); - while (range.startOffset + i >= range.startContainer.data.length) { - i--; - } - if (i) { - range.setStart(range.startContainer, range.startOffset + i); - } + delete this.timeouts.destroy; + $.rmClass(QR.nodes.el, 'captcha-open'); + if (this.nodes.container) { + $.rm(this.nodes.container); } - i = 0; - while (/[)\]}>.,]/.test(t = text.charAt(text.length - (1 + i)))) { - if (!(/[.,]/.test(t) || (text.match(/[()\[\]{}<>]/g)).length % 2)) { + return delete this.nodes.container; + }, + sync: function(captchas) { + if (captchas == null) { + captchas = []; + } + this.captchas = captchas; + this.clear(); + return this.count(); + }, + getOne: function() { + var captcha; + this.clear(); + if (captcha = this.captchas.shift()) { + this.count(); + $.set('captchas', this.captchas); + return captcha.response; + } else { + return null; + } + }, + save: function(pasted) { + var reload, _base; + $.forceSync('captchas'); + reload = (QR.cooldown.auto || Conf['Post on Captcha Completion']) && this.needed(); + this.captchas.push({ + response: $('textarea', this.nodes.container).value, + timeout: (pasted ? this.setupTime : Date.now()) + 2 * $.MINUTE + }); + this.count(); + $.set('captchas', this.captchas); + if (reload) { + this.shouldFocus = true; + this.reload(); + } else { + if (pasted) { + this.destroy(); + } else { + if ((_base = this.timeouts).destroy == null) { + _base.destroy = setTimeout(this.destroy.bind(this), 3 * $.SECOND); + } + } + QR.nodes.status.focus(); + } + if (Conf['Post on Captcha Completion'] && !QR.cooldown.auto) { + return QR.submit(); + } + }, + clear: function() { + var captcha, i, now, _i, _len, _ref; + if (!this.captchas.length) { + return; + } + $.forceSync('captchas'); + now = Date.now(); + _ref = this.captchas; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + captcha = _ref[i]; + if (captcha.timeout > now) { break; } - i++; } - if (i) { - text = text.slice(0, -i); - while (range.endOffset - i < 0) { - i--; - } - if (i) { - range.setEnd(range.endContainer, range.endOffset - i); - } - } - if (!/(mailto:|.+:\/\/)/.test(text)) { - text = (/@/.test(text) ? 'mailto:' : 'http://') + text; - } - a = $.el('a', { - className: 'linkify', - rel: 'nofollow noreferrer', - target: '_blank', - href: text - }); - $.add(a, range.extractContents()); - range.insertNode(a); - range.detach(); - return a; - }, - services: function(link) { - var href, match, type, _i, _len, _ref; - href = link.href; - _ref = Linkify.ordered_types; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - if (!(match = type.regExp.exec(href))) { - continue; - } - if (type.dummy) { - return; - } - return [type.key, match[1], match[2], link]; - } - }, - embed: function(data) { - var embed, href, key, link, name, options, post, uid, value, _ref; - key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; - href = link.href; - embed = $.el('a', { - className: 'embedder', - href: 'javascript:;', - textContent: '(embed)' - }); - _ref = { - key: key, - href: href, - uid: uid, - options: options - }; - for (name in _ref) { - value = _ref[name]; - embed.dataset[name] = value; - } - $.addClass(link, "" + embed.dataset.key); - $.on(embed, 'click', Linkify.cb.toggle); - $.after(link, [$.tn(' '), embed]); - if (Conf['Auto-embed']) { - return Linkify.cb.toggle.call(embed); - } - }, - title: function(data) { - var err, key, link, options, post, service, title, titles, uid; - key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; - if (!(service = Linkify.types[key].title)) { + if (!i) { return; } - titles = Conf['CachedTitles']; - if (title = titles[uid]) { - return link.textContent = title[0]; - } else { - try { - return $.cache(service.api(uid), (function() { - return Linkify.cb.title(this, data); - }), { - responseType: 'json' - }); - } catch (_error) { - err = _error; - link.innerHTML = 'Title Link Blocked (are you using NoScript?)'; - $.prepend(link, $.tn("[" + key + "] ")); - } + this.captchas = this.captchas.slice(i); + this.count(); + $.set('captchas', this.captchas); + return this.setup(true); + }, + count: function() { + this.nodes.counter.textContent = "Captchas: " + this.captchas.length; + clearTimeout(this.timeouts.clear); + if (this.captchas.length) { + return this.timeouts.clear = setTimeout(this.clear.bind(this), this.captchas[0].timeout - Date.now()); } }, - cb: { - toggle: function() { - if ($.hasClass(this, "embedded")) { - $.rm(this.previousElementSibling); - this.previousElementSibling.hidden = false; - this.textContent = '(embed)'; - } else { - this.previousElementSibling.hidden = true; - $.before(this, Linkify.cb.embed(this)); - this.textContent = '(unembed)'; - } - return $.toggleClass(this, 'embedded'); - }, - embed: function(a) { - var el, type; - el = (type = Linkify.types[a.dataset.key]).el(a); - el.style.cssText = type.style != null ? type.style : "border: 0; width: 640px; height: 390px"; - return el; - }, - title: function(req, data) { - var key, link, link2, options, post, post2, service, status, text, uid, _i, _j, _len, _len1, _ref, _ref1; - key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; - status = req.status; - service = Linkify.types[key].title; - text = "[" + key + "] " + ((function() { - switch (status) { - case 200: - case 304: - return service.text(req.response); - case 404: - return "Not Found"; - case 403: - return "Forbidden or Private"; - default: - return "" + status + "'d"; - } - })()); - link.textContent = text; - _ref = post.clones; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - post2 = _ref[_i]; - _ref1 = $$('a', post2.nodes.comment); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - link2 = _ref1[_j]; - if (link2.href === link.href) { - link2.textContent = text; - } - } - } - } - }, - ordered_types: [ - { - key: 'audio', - regExp: /(.*\.(mp3|ogg|wav))$/, - style: '', - el: function(a) { - return $.el('audio', { - controls: true, - preload: 'auto', - src: a.dataset.uid - }); - } - }, { - key: 'gist', - regExp: /.*(?:gist.github.com.*\/)([^\/][^\/]*)$/, - el: function(a) { - var div; - return div = $.el('iframe', { - src: "http://www.purplegene.com/script?url=https://gist.github.com/" + a.dataset.uid + ".js" - }); - }, - title: { - api: function(uid) { - return "https://api.github.com/gists/" + uid; - }, - text: function(_arg) { - var file, files; - files = _arg.files; - for (file in files) { - if (files.hasOwnProperty(file)) { - return file; - } - } - } - } - }, { - key: 'image', - regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/, - style: 'border: 0; width: auto; height: auto;', - el: function(a) { - var el; - el = $.el('div'); - el.innerHTML = ''; - el.firstChild.href = el.firstChild.firstChild.src = a.dataset.href; - return el; - } - }, { - key: 'InstallGentoo', - regExp: /.*(?:paste.installgentoo.com\/view\/)([0-9a-z_]+)/, - el: function(a) { - return $.el('iframe', { - src: "http://paste.installgentoo.com/view/embed/" + a.dataset.uid - }); - } - }, { - key: 'Twitter', - regExp: /.*twitter.com\/(.+\/status\/\d+)/, - el: function(a) { - return $.el('iframe', { - src: "https://twitframe.com/show?url=https://twitter.com/" + a.dataset.uid - }); - } - }, { - key: 'LiveLeak', - regExp: /.*(?:liveleak.com\/view.+i=)([0-9a-z_]+)/, - el: function(a) { - var el; - el = $.el('iframe', { - width: "640", - height: "360", - src: "http://www.liveleak.com/ll_embed?i=" + a.dataset.uid, - frameborder: "0" - }); - el.setAttribute("allowfullscreen", "true"); - return el; - } - }, { - key: 'MediaCrush', - regExp: /.*(?:mediacru.sh\/)([0-9a-z_-]+)/i, - style: 'border: 0;', - el: function(a) { - var el; - el = $.el('div'); - $.cache("https://mediacru.sh/" + a.dataset.uid + ".json", function() { - var embed, ext, file, files, i, status, type, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _results, _results1; - status = this.status; - if (status !== 200 && status !== 304) { - return el.textContent = "ERROR " + status; - } - files = this.response.files; - _ref = ['video/webm', 'video/mp4', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'audio/mpeg', 'audio/ogg']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - for (_j = 0, _len1 = files.length; _j < _len1; _j++) { - file = files[_j]; - if (file.type === type) { - embed = file; - break; - } - } - if (embed) { - break; - } - } - if (!embed) { - return div.textContent = "ERROR: Not a valid filetype"; - } - switch (embed.type) { - case 'video/mp4': - case 'video/webm': - case 'video/ogv': - el.innerHTML = ''; - _ref1 = ['mp4', 'webm', 'ogv']; - _results = []; - for (i = _k = 0, _len2 = _ref1.length; _k < _len2; i = ++_k) { - ext = _ref1[i]; - _results.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); - } - return _results; - break; - case 'image/svg+xml': - case 'image/png': - case 'image/gif': - case 'image/jpeg': - el.innerHTML = ''; - el.firstChild.href = a.dataset.href; - return el.firstChild.firstChild.src = "https://mediacru.sh/" + file.file; - case 'audio/mpeg': - case 'audio/ogg': - el.innerHTML = ''; - _ref2 = ['ogg', 'mp3']; - _results1 = []; - for (i = _l = 0, _len3 = _ref2.length; _l < _len3; i = ++_l) { - ext = _ref2[i]; - _results1.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); - } - return _results1; - break; - default: - return el.textContent = "ERROR: No valid filetype."; - } - }); - return el; - } - }, { - key: 'pastebin', - regExp: /.*(?:pastebin.com\/(?!u\/))([^#\&\?]*).*/, - el: function(a) { - var div; - return div = $.el('iframe', { - src: "http://pastebin.com/embed_iframe.php?i=" + a.dataset.uid - }); - } - }, { - key: 'gfycat', - regExp: /.*gfycat.com\/(?:iframe\/)?(\S*)/, - el: function(a) { - var div; - return div = $.el('iframe', { - src: "http://gfycat.com/iframe/" + a.dataset.uid - }); - } - }, { - key: 'SoundCloud', - regExp: /.*(?:soundcloud.com\/|snd.sc\/)([^#\&\?]*).*/, - style: 'border: 0; width: 500px; height: 400px;', - el: function(a) { - return $.el('iframe', { - src: "//w.soundcloud.com/player/?visual=true&show_comments=false&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(a.dataset.uid)) - }); - }, - title: { - api: function(uid) { - return "//soundcloud.com/oembed?format=json&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(uid)); - }, - text: function(_) { - return _.title; - } - } - }, { - key: 'StrawPoll', - regExp: /strawpoll\.me\/(?:embed_\d+\/)?(\d+)/, - style: 'border: 0; width: 600px; height: 406px;', - el: function(a) { - return $.el('iframe', { - src: "http://strawpoll.me/embed_1/" + a.dataset.uid - }); - } - }, { - key: 'TwitchTV', - regExp: /.*(?:twitch.tv\/)([^#\&\?]*).*/, - style: "border: none; width: 640px; height: 360px;", - el: function(a) { - var channel, id, idparam, obj, result, type, _; - if (result = /(\w+)\/([bc])\/(\d+)/i.exec(a.dataset.uid)) { - _ = result[0], channel = result[1], type = result[2], id = result[3]; - idparam = { - 'b': 'archive_id', - 'c': 'chapter_id' - }; - obj = $.el('object', { - data: 'http://www.twitch.tv/widgets/archive_embed_player.swf' - }); - obj.innerHTML = ''; - obj.children[1].value = "channel=" + channel + "&start_volume=25&auto_play=false&" + idparam[type] + "=" + id; - return obj; - } else { - channel = (/(\w+)/.exec(a.dataset.uid))[0]; - obj = $.el('object', { - data: "http://www.twitch.tv/widgets/live_embed_player.swf?channel=" + channel - }); - obj.innerHTML = ''; - obj.children[1].value = "hostname=www.twitch.tv&channel=" + channel + "&auto_play=true&start_volume=25"; - return obj; - } - } - }, { - key: 'Vocaroo', - regExp: /.*(?:vocaroo.com\/)([^#\&\?]*).*/, - style: '', - el: function(a) { - return $.el('audio', { - controls: true, - preload: 'auto', - src: "http://vocaroo.com/media_command.php?media=" + (a.dataset.uid.replace(/^i\//, '')) + "&command=download_ogg" - }); - } - }, { - key: 'Vimeo', - regExp: /.*(?:vimeo.com\/)([^#\&\?]*).*/, - el: function(a) { - return $.el('iframe', { - src: "//player.vimeo.com/video/" + a.dataset.uid + "?wmode=opaque" - }); - }, - title: { - api: function(uid) { - return "https://vimeo.com/api/oembed.json?url=http://vimeo.com/" + uid; - }, - text: function(_) { - return _.title; - } - } - }, { - key: 'Vine', - regExp: /.*(?:vine.co\/)([^#\&\?]*).*/, - style: 'border: none; width: 500px; height: 500px;', - el: function(a) { - return $.el('iframe', { - src: "https://vine.co/" + a.dataset.uid + "/card" - }); - } - }, { - key: 'YouTube', - regExp: /.*(?:youtu.be\/|youtube.*v=|youtube.*\/embed\/|youtube.*\/v\/|youtube.*videos\/)([^#\&\?]*)\??(t\=.*)?/, - el: function(a) { - var el; - el = $.el('iframe', { - src: "//www.youtube.com/embed/" + a.dataset.uid + (a.dataset.option ? '#' + a.dataset.option : '') + "?wmode=opaque" - }); - el.setAttribute("allowfullscreen", "true"); - return el; - }, - title: { - api: function(uid) { - return "https://gdata.youtube.com/feeds/api/videos/" + uid + "?alt=json&fields=title/text(),yt:noembed,app:control/yt:state/@reasonCode"; - }, - text: function(data) { - return data.entry.title.$t; - } - } - }, { - key: 'Loopvid', - regExp: /.*loopvid.appspot.com\/.*/, - dummy: true - }, { - key: 'MediaFire', - regExp: /.*mediafire.com\/.*/, - dummy: true - }, { - key: 'video', - regExp: /(.*\.(ogv|webm|mp4))$/, - style: 'border: 0; width: auto; height: auto;', - el: function(a) { - return $.el('video', { - controls: 'controls', - preload: 'auto', - src: a.dataset.uid - }); - } - } - ] + reload: function(focus) { + return $.globalEval('(function() {\n var container = document.querySelector("#qr .captcha-container");\n window.grecaptcha.reset(container.dataset.widgetID);\n})();'); + } }; QR = { @@ -9177,7 +8979,9 @@ dialog: function() { var dialog, elm, event, i, items, match_max, match_min, name, node, nodes, rules, save, setNode; QR.nodes = nodes = { - el: dialog = UI.dialog('qr', 'top:0;right:0;', "
\uf00d
No selected fileSpoiler\uf0c1Post from URL+Dump\uf00dRemove File
") + el: dialog = UI.dialog('qr', 'top:0;right:0;', { + innerHTML: "
\r\r
\r\r
\r\\uf00d\r
\r
\r
\r\r\r \r
\r
\r\r\r
\r
\r
\r+\r
\r
\r\rNo selected file\r\r\r\rSpoiler\r\\uf0c1\rPost from URL\r+\rDump\r\\uf00d\rRemove File\r\r\r\r
\r\r
\r\r\r\r" + }) }; setNode = function(name, query) { return nodes[name] = $(query, dialog); @@ -9598,226 +9402,6 @@ } }; - QR.captcha = { - init: function() { - var counter, root; - if (d.cookie.indexOf('pass_enabled=1') >= 0) { - return; - } - if (!(this.isEnabled = !!$.id('g-recaptcha'))) { - return; - } - this.captchas = []; - $.get('captchas', [], function(_arg) { - var captchas; - captchas = _arg.captchas; - return QR.captcha.sync(captchas); - }); - $.sync('captchas', this.sync.bind(this)); - root = $.el('div', { - className: 'captcha-root' - }); - $.extend(root, { - innerHTML: "
" - }); - counter = $('.captcha-counter > a', root); - this.nodes = { - root: root, - counter: counter - }; - this.count(); - $.addClass(QR.nodes.el, 'has-captcha'); - $.after(QR.nodes.com.parentNode, root); - $.on(counter, 'click', this.toggle.bind(this)); - return $.on(window, 'captcha:success', (function(_this) { - return function() { - return $.queueTask(function() { - return _this.save(false); - }); - }; - })(this)); - }, - shouldFocus: false, - timeouts: {}, - postsCount: 0, - needed: function() { - var captchaCount; - captchaCount = this.captchas.length; - if (this.nodes.container && !this.timeouts.destroy) { - captchaCount++; - } - this.postsCount = QR.posts.length; - if (this.postsCount === 1 && !Conf['Auto-load captcha'] && !QR.posts[0].com && !QR.posts[0].file) { - this.postsCount = 0; - } - return captchaCount < this.postsCount; - }, - onPostChange: function() { - if (this.postsCount === 0) { - this.setup(); - } - if (QR.posts.length === 1 && !Conf['Auto-load captcha'] && !QR.posts[0].com && !QR.posts[0].file) { - return this.postsCount = 0; - } - }, - toggle: function() { - if (this.nodes.container && !this.timeouts.destroy) { - return this.destroy(); - } else { - return this.setup(true, true); - } - }, - setup: function(focus, force) { - if (!(this.isEnabled && (this.needed() || force))) { - return; - } - $.addClass(QR.nodes.el, 'captcha-open'); - if (focus) { - this.shouldFocus = true; - } - if (this.timeouts.destroy) { - clearTimeout(this.timeouts.destroy); - delete this.timeouts.destroy; - return this.reload(); - } - if (this.nodes.container) { - return; - } - this.nodes.container = $.el('div', { - className: 'captcha-container' - }); - $.prepend(this.nodes.root, this.nodes.container); - new MutationObserver(this.afterSetup.bind(this)).observe(this.nodes.container, { - childList: true, - subtree: true - }); - return $.globalEval('(function() {\n function render() {\n var container = document.querySelector("#qr .captcha-container");\n container.dataset.widgetID = window.grecaptcha.render(container, {\n sitekey: \'6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc\',\n theme: document.documentElement.classList.contains(\'tomorrow\') ? \'dark\' : \'light\',\n callback: function(response) {\n window.dispatchEvent(new CustomEvent("captcha:success", {detail: response}));\n }\n });\n }\n if (window.grecaptcha) {\n render();\n } else {\n var cbNative = window.onRecaptchaLoaded;\n window.onRecaptchaLoaded = function() {\n render();\n cbNative();\n }\n }\n})();'); - }, - afterSetup: function(mutations) { - var iframe, mutation, node, textarea, _i, _j, _len, _len1, _ref; - for (_i = 0, _len = mutations.length; _i < _len; _i++) { - mutation = mutations[_i]; - _ref = mutation.addedNodes; - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - node = _ref[_j]; - if (iframe = $.x('./descendant-or-self::iframe', node)) { - this.setupIFrame(iframe); - } - if (textarea = $.x('./descendant-or-self::textarea', node)) { - this.setupTextArea(textarea); - } - } - } - }, - setupIFrame: function(iframe) { - this.setupTime = Date.now(); - if (QR.nodes.el.getBoundingClientRect().bottom > doc.clientHeight) { - QR.nodes.el.style.top = null; - QR.nodes.el.style.bottom = '0px'; - } - if (this.shouldFocus) { - iframe.focus(); - } - return this.shouldFocus = false; - }, - setupTextArea: function(textarea) { - return $.one(textarea, 'input', (function(_this) { - return function() { - return _this.save(true); - }; - })(this)); - }, - destroy: function() { - if (!this.isEnabled) { - return; - } - delete this.timeouts.destroy; - $.rmClass(QR.nodes.el, 'captcha-open'); - if (this.nodes.container) { - $.rm(this.nodes.container); - } - return delete this.nodes.container; - }, - sync: function(captchas) { - if (captchas == null) { - captchas = []; - } - this.captchas = captchas; - this.clear(); - return this.count(); - }, - getOne: function() { - var captcha; - this.clear(); - if (captcha = this.captchas.shift()) { - this.count(); - $.set('captchas', this.captchas); - return captcha.response; - } else { - return null; - } - }, - save: function(pasted) { - var reload, _base; - $.forceSync('captchas'); - reload = (QR.cooldown.auto || Conf['Post on Captcha Completion']) && this.needed(); - this.captchas.push({ - response: $('textarea', this.nodes.container).value, - timeout: (pasted ? this.setupTime : Date.now()) + 2 * $.MINUTE - }); - this.count(); - $.set('captchas', this.captchas); - if (reload) { - this.shouldFocus = true; - this.reload(); - } else { - if (pasted) { - this.destroy(); - } else { - if ((_base = this.timeouts).destroy == null) { - _base.destroy = setTimeout(this.destroy.bind(this), 3 * $.SECOND); - } - } - QR.nodes.status.focus(); - } - if (Conf['Post on Captcha Completion'] && !QR.cooldown.auto) { - return QR.submit(); - } - }, - clear: function() { - var captcha, i, now, _i, _len, _ref; - if (!this.captchas.length) { - return; - } - $.forceSync('captchas'); - now = Date.now(); - _ref = this.captchas; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - captcha = _ref[i]; - if (captcha.timeout > now) { - break; - } - } - if (!i) { - return; - } - this.captchas = this.captchas.slice(i); - this.count(); - $.set('captchas', this.captchas); - return this.setup(true); - }, - count: function() { - this.nodes.counter.textContent = "Captchas: " + this.captchas.length; - clearTimeout(this.timeouts.clear); - if (this.captchas.length) { - return this.timeouts.clear = setTimeout(this.clear.bind(this), this.captchas[0].timeout - Date.now()); - } - }, - reload: function(focus) { - return $.globalEval('(function() {\n var container = document.querySelector("#qr .captcha-container");\n window.grecaptcha.reset(container.dataset.widgetID);\n})();'); - } - }; - QR.cooldown = { init: function() { var key, setTimers, type; @@ -11523,6 +11107,557 @@ } }; + Linkify = { + init: function() { + var type, _i, _len, _ref; + if (!Conf['Linkify']) { + return; + } + this.types = {}; + _ref = this.ordered_types; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + type = _ref[_i]; + this.types[type.key] = type; + } + if (Conf['Comment Expansion']) { + ExpandComment.callbacks.push(this.node); + } + if (Conf['Embedding'] || Conf['Link Title']) { + this.embedProcess = Function('link', 'post', "var data = this.services(link);\nif (data) {" + ((Conf['Embedding'] ? 'this.embed(data); ' : '') + (Conf['Link Title'] ? 'data.push(post); this.title(data);' : '')) + "}"); + } + return Post.callbacks.push({ + name: 'Linkify', + cb: this.node + }); + }, + events: function(post) { + var el, i, items; + i = 0; + items = $$('.embedder', post.nodes.comment); + while (el = items[i++]) { + $.on(el, 'click', Linkify.cb.toggle); + if ($.hasClass(el, 'embedded')) { + Linkify.cb.toggle.call(el); + } + } + }, + node: function() { + var data, end, endNode, i, index, length, link, links, node, result, saved, snapshot, space, test, word; + if (this.isClone) { + return (Conf['Embedding'] ? Linkify.events(this) : null); + } + if (!Linkify.regString.test(this.info.comment)) { + return; + } + test = /[^\s'"]+/g; + space = /[\s'"]/; + snapshot = $.X('.//br|.//text()', this.nodes.comment); + i = 0; + links = []; + while (node = snapshot.snapshotItem(i++)) { + data = node.data; + if (!data || node.parentElement.nodeName === "A") { + continue; + } + while (result = test.exec(data)) { + index = result.index; + endNode = node; + word = result[0]; + if ((length = index + word.length) === data.length) { + test.lastIndex = 0; + while ((saved = snapshot.snapshotItem(i++))) { + if (saved.nodeName === 'BR') { + break; + } + endNode = saved; + data = saved.data; + word += data; + length = data.length; + if (end = space.exec(data)) { + test.lastIndex = length = end.index; + i--; + break; + } + } + } + if (Linkify.regString.exec(word)) { + links.push(Linkify.makeRange(node, endNode, index, length)); + } + if (!(test.lastIndex && node === endNode)) { + break; + } + } + } + i = links.length; + while (i--) { + link = links[i]; + Linkify.embedProcess(Linkify.makeLink(link), this); + } + }, + embedProcess: function() {}, + regString: /((https?|mailto|git|magnet|ftp|irc):([a-z\d%\/])|[-a-z\d]+[.](aero|asia|biz|cat|com|coop|info|int|jobs|mobi|museum|name|net|org|post|pro|tel|travel|xxx|edu|gov|mil|[a-z]{2})([:\/]|(?!.))|[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}|[-\w\d.@]+@[a-z\d.-]+\.[a-z\d])/i, + makeRange: function(startNode, endNode, startOffset, endOffset) { + var range; + range = document.createRange(); + range.setStart(startNode, startOffset); + range.setEnd(endNode, endOffset); + return range; + }, + makeLink: function(range) { + var a, i, t, text; + text = range.toString(); + i = 0; + while (/[(\[{<>]/.test(text.charAt(i))) { + i++; + } + if (i) { + text = text.slice(i); + while (range.startOffset + i >= range.startContainer.data.length) { + i--; + } + if (i) { + range.setStart(range.startContainer, range.startOffset + i); + } + } + i = 0; + while (/[)\]}>.,]/.test(t = text.charAt(text.length - (1 + i)))) { + if (!(/[.,]/.test(t) || (text.match(/[()\[\]{}<>]/g)).length % 2)) { + break; + } + i++; + } + if (i) { + text = text.slice(0, -i); + while (range.endOffset - i < 0) { + i--; + } + if (i) { + range.setEnd(range.endContainer, range.endOffset - i); + } + } + if (!/(mailto:|.+:\/\/)/.test(text)) { + text = (/@/.test(text) ? 'mailto:' : 'http://') + text; + } + a = $.el('a', { + className: 'linkify', + rel: 'nofollow noreferrer', + target: '_blank', + href: text + }); + $.add(a, range.extractContents()); + range.insertNode(a); + range.detach(); + return a; + }, + services: function(link) { + var href, match, type, _i, _len, _ref; + href = link.href; + _ref = Linkify.ordered_types; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + type = _ref[_i]; + if (!(match = type.regExp.exec(href))) { + continue; + } + if (type.dummy) { + return; + } + return [type.key, match[1], match[2], link]; + } + }, + embed: function(data) { + var embed, href, key, link, name, options, post, uid, value, _ref; + key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; + href = link.href; + embed = $.el('a', { + className: 'embedder', + href: 'javascript:;', + textContent: '(embed)' + }); + _ref = { + key: key, + href: href, + uid: uid, + options: options + }; + for (name in _ref) { + value = _ref[name]; + embed.dataset[name] = value; + } + $.addClass(link, "" + embed.dataset.key); + $.on(embed, 'click', Linkify.cb.toggle); + $.after(link, [$.tn(' '), embed]); + if (Conf['Auto-embed']) { + return Linkify.cb.toggle.call(embed); + } + }, + title: function(data) { + var err, key, link, options, post, service, title, titles, uid; + key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; + if (!(service = Linkify.types[key].title)) { + return; + } + titles = Conf['CachedTitles']; + if (title = titles[uid]) { + return link.textContent = title[0]; + } else { + try { + return $.cache(service.api(uid), (function() { + return Linkify.cb.title(this, data); + }), { + responseType: 'json' + }); + } catch (_error) { + err = _error; + link.innerHTML = 'Title Link Blocked (are you using NoScript?)'; + $.prepend(link, $.tn("[" + key + "] ")); + } + } + }, + cb: { + toggle: function() { + if ($.hasClass(this, "embedded")) { + $.rm(this.previousElementSibling); + this.previousElementSibling.hidden = false; + this.textContent = '(embed)'; + } else { + this.previousElementSibling.hidden = true; + $.before(this, Linkify.cb.embed(this)); + this.textContent = '(unembed)'; + } + return $.toggleClass(this, 'embedded'); + }, + embed: function(a) { + var el, type; + el = (type = Linkify.types[a.dataset.key]).el(a); + el.style.cssText = type.style != null ? type.style : "border: 0; width: 640px; height: 390px"; + return el; + }, + title: function(req, data) { + var key, link, link2, options, post, post2, service, status, text, uid, _i, _j, _len, _len1, _ref, _ref1; + key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; + status = req.status; + service = Linkify.types[key].title; + text = "[" + key + "] " + ((function() { + switch (status) { + case 200: + case 304: + return service.text(req.response); + case 404: + return "Not Found"; + case 403: + return "Forbidden or Private"; + default: + return "" + status + "'d"; + } + })()); + link.textContent = text; + _ref = post.clones; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + post2 = _ref[_i]; + _ref1 = $$('a', post2.nodes.comment); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + link2 = _ref1[_j]; + if (link2.href === link.href) { + link2.textContent = text; + } + } + } + } + }, + ordered_types: [ + { + key: 'audio', + regExp: /(.*\.(mp3|ogg|wav))$/, + style: '', + el: function(a) { + return $.el('audio', { + controls: true, + preload: 'auto', + src: a.dataset.uid + }); + } + }, { + key: 'gist', + regExp: /.*(?:gist.github.com.*\/)([^\/][^\/]*)$/, + el: function(a) { + var div; + return div = $.el('iframe', { + src: "http://www.purplegene.com/script?url=https://gist.github.com/" + a.dataset.uid + ".js" + }); + }, + title: { + api: function(uid) { + return "https://api.github.com/gists/" + uid; + }, + text: function(_arg) { + var file, files; + files = _arg.files; + for (file in files) { + if (files.hasOwnProperty(file)) { + return file; + } + } + } + } + }, { + key: 'image', + regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/, + style: 'border: 0; width: auto; height: auto;', + el: function(a) { + var el; + el = $.el('div'); + el.innerHTML = ''; + el.firstChild.href = el.firstChild.firstChild.src = a.dataset.href; + return el; + } + }, { + key: 'InstallGentoo', + regExp: /.*(?:paste.installgentoo.com\/view\/)([0-9a-z_]+)/, + el: function(a) { + return $.el('iframe', { + src: "http://paste.installgentoo.com/view/embed/" + a.dataset.uid + }); + } + }, { + key: 'Twitter', + regExp: /.*twitter.com\/(.+\/status\/\d+)/, + el: function(a) { + return $.el('iframe', { + src: "https://twitframe.com/show?url=https://twitter.com/" + a.dataset.uid + }); + } + }, { + key: 'LiveLeak', + regExp: /.*(?:liveleak.com\/view.+i=)([0-9a-z_]+)/, + el: function(a) { + var el; + el = $.el('iframe', { + width: "640", + height: "360", + src: "http://www.liveleak.com/ll_embed?i=" + a.dataset.uid, + frameborder: "0" + }); + el.setAttribute("allowfullscreen", "true"); + return el; + } + }, { + key: 'MediaCrush', + regExp: /.*(?:mediacru.sh\/)([0-9a-z_-]+)/i, + style: 'border: 0;', + el: function(a) { + var el; + el = $.el('div'); + $.cache("https://mediacru.sh/" + a.dataset.uid + ".json", function() { + var embed, ext, file, files, i, status, type, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _results, _results1; + status = this.status; + if (status !== 200 && status !== 304) { + return el.textContent = "ERROR " + status; + } + files = this.response.files; + _ref = ['video/webm', 'video/mp4', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'audio/mpeg', 'audio/ogg']; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + type = _ref[_i]; + for (_j = 0, _len1 = files.length; _j < _len1; _j++) { + file = files[_j]; + if (file.type === type) { + embed = file; + break; + } + } + if (embed) { + break; + } + } + if (!embed) { + return div.textContent = "ERROR: Not a valid filetype"; + } + switch (embed.type) { + case 'video/mp4': + case 'video/webm': + case 'video/ogv': + el.innerHTML = ''; + _ref1 = ['mp4', 'webm', 'ogv']; + _results = []; + for (i = _k = 0, _len2 = _ref1.length; _k < _len2; i = ++_k) { + ext = _ref1[i]; + _results.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); + } + return _results; + break; + case 'image/svg+xml': + case 'image/png': + case 'image/gif': + case 'image/jpeg': + el.innerHTML = ''; + el.firstChild.href = a.dataset.href; + return el.firstChild.firstChild.src = "https://mediacru.sh/" + file.file; + case 'audio/mpeg': + case 'audio/ogg': + el.innerHTML = ''; + _ref2 = ['ogg', 'mp3']; + _results1 = []; + for (i = _l = 0, _len3 = _ref2.length; _l < _len3; i = ++_l) { + ext = _ref2[i]; + _results1.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); + } + return _results1; + break; + default: + return el.textContent = "ERROR: No valid filetype."; + } + }); + return el; + } + }, { + key: 'pastebin', + regExp: /.*(?:pastebin.com\/(?!u\/))([^#\&\?]*).*/, + el: function(a) { + var div; + return div = $.el('iframe', { + src: "http://pastebin.com/embed_iframe.php?i=" + a.dataset.uid + }); + } + }, { + key: 'gfycat', + regExp: /.*gfycat.com\/(?:iframe\/)?(\S*)/, + el: function(a) { + var div; + return div = $.el('iframe', { + src: "http://gfycat.com/iframe/" + a.dataset.uid + }); + } + }, { + key: 'SoundCloud', + regExp: /.*(?:soundcloud.com\/|snd.sc\/)([^#\&\?]*).*/, + style: 'border: 0; width: 500px; height: 400px;', + el: function(a) { + return $.el('iframe', { + src: "//w.soundcloud.com/player/?visual=true&show_comments=false&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(a.dataset.uid)) + }); + }, + title: { + api: function(uid) { + return "//soundcloud.com/oembed?format=json&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(uid)); + }, + text: function(_) { + return _.title; + } + } + }, { + key: 'StrawPoll', + regExp: /strawpoll\.me\/(?:embed_\d+\/)?(\d+)/, + style: 'border: 0; width: 600px; height: 406px;', + el: function(a) { + return $.el('iframe', { + src: "http://strawpoll.me/embed_1/" + a.dataset.uid + }); + } + }, { + key: 'TwitchTV', + regExp: /.*(?:twitch.tv\/)([^#\&\?]*).*/, + style: "border: none; width: 640px; height: 360px;", + el: function(a) { + var channel, id, idparam, obj, result, type, _; + if (result = /(\w+)\/([bc])\/(\d+)/i.exec(a.dataset.uid)) { + _ = result[0], channel = result[1], type = result[2], id = result[3]; + idparam = { + 'b': 'archive_id', + 'c': 'chapter_id' + }; + obj = $.el('object', { + data: 'http://www.twitch.tv/widgets/archive_embed_player.swf' + }); + obj.innerHTML = ''; + obj.children[1].value = "channel=" + channel + "&start_volume=25&auto_play=false&" + idparam[type] + "=" + id; + return obj; + } else { + channel = (/(\w+)/.exec(a.dataset.uid))[0]; + obj = $.el('object', { + data: "http://www.twitch.tv/widgets/live_embed_player.swf?channel=" + channel + }); + obj.innerHTML = ''; + obj.children[1].value = "hostname=www.twitch.tv&channel=" + channel + "&auto_play=true&start_volume=25"; + return obj; + } + } + }, { + key: 'Vocaroo', + regExp: /.*(?:vocaroo.com\/)([^#\&\?]*).*/, + style: '', + el: function(a) { + return $.el('audio', { + controls: true, + preload: 'auto', + src: "http://vocaroo.com/media_command.php?media=" + (a.dataset.uid.replace(/^i\//, '')) + "&command=download_ogg" + }); + } + }, { + key: 'Vimeo', + regExp: /.*(?:vimeo.com\/)([^#\&\?]*).*/, + el: function(a) { + return $.el('iframe', { + src: "//player.vimeo.com/video/" + a.dataset.uid + "?wmode=opaque" + }); + }, + title: { + api: function(uid) { + return "https://vimeo.com/api/oembed.json?url=http://vimeo.com/" + uid; + }, + text: function(_) { + return _.title; + } + } + }, { + key: 'Vine', + regExp: /.*(?:vine.co\/)([^#\&\?]*).*/, + style: 'border: none; width: 500px; height: 500px;', + el: function(a) { + return $.el('iframe', { + src: "https://vine.co/" + a.dataset.uid + "/card" + }); + } + }, { + key: 'YouTube', + regExp: /.*(?:youtu.be\/|youtube.*v=|youtube.*\/embed\/|youtube.*\/v\/|youtube.*videos\/)([^#\&\?]*)\??(t\=.*)?/, + el: function(a) { + var el; + el = $.el('iframe', { + src: "//www.youtube.com/embed/" + a.dataset.uid + (a.dataset.option ? '#' + a.dataset.option : '') + "?wmode=opaque" + }); + el.setAttribute("allowfullscreen", "true"); + return el; + }, + title: { + api: function(uid) { + return "https://gdata.youtube.com/feeds/api/videos/" + uid + "?alt=json&fields=title/text(),yt:noembed,app:control/yt:state/@reasonCode"; + }, + text: function(data) { + return data.entry.title.$t; + } + } + }, { + key: 'Loopvid', + regExp: /.*loopvid.appspot.com\/.*/, + dummy: true + }, { + key: 'MediaFire', + regExp: /.*mediafire.com\/.*/, + dummy: true + }, { + key: 'video', + regExp: /(.*\.(ogv|webm|mp4))$/, + style: 'border: 0; width: auto; height: auto;', + el: function(a) { + return $.el('video', { + controls: 'controls', + preload: 'auto', + src: a.dataset.uid + }); + } + } + ] + }; + ArchiveLink = { init: function() { var div, entry, type, _i, _len, _ref; @@ -13398,7 +13533,7 @@ } return Redirect.data = o; }, - archives: [{"uid":0,"name":"Moe","domain":"archive.moe","http":false,"https":true,"software":"foolfuuka","boards":["a","biz","c","co","diy","gd","h","i","int","jp","k","m","mlp","out","po","r9k","s4s","sci","sp","tg","tv","u","v","vg","vp","vr","wsg"],"files":["a","biz","c","co","diy","gd","h","i","jp","k","m","mlp","po","s4s","sci","tg","u","v","vg","vp","vr","wsg"]},{"uid":3,"name":"4plebs Archive","domain":"archive.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["adv","f","hr","o","pol","s4s","tg","trv","tv","x"],"files":["adv","f","hr","o","pol","s4s","tg","trv","tv","x"]},{"uid":5,"name":"Love is Over","domain":"archive.loveisover.me","http":true,"https":true,"software":"foolfuuka","boards":["c","d","e","i","lgbt","t","u","w","wg"],"files":["c","d","e","i","lgbt","t","u","w","wg"]},{"uid":8,"name":"Rebecca Black Tech","domain":"archive.rebeccablacktech.com","http":false,"https":true,"software":"fuuka","boards":["cgl","g","mu","w"],"files":["cgl","g","mu","w"]},{"uid":10,"name":"warosu","domain":"warosu.org","http":false,"https":true,"software":"fuuka","boards":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"],"files":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"]},{"uid":15,"name":"fgts","domain":"fgts.jp","http":true,"https":true,"software":"foolfuuka","boards":["asp","cm","h","hc","hm","n","p","r","s","soc","y"],"files":["asp","cm","h","hc","hm","n","p","r","s","soc","y"]},{"uid":17,"name":"imcute","domain":"imcute.yt","http":true,"https":false,"software":"foolfuuka","boards":["an","fit","gif","int","mlp","out","r9k","toy"],"files":["an","fit","gif","int","mlp","out","r9k","toy"]}], + archives: [{"uid":0,"name":"Moe","domain":"archive.moe","http":false,"https":true,"software":"foolfuuka","boards":["a","biz","c","co","diy","gd","h","i","int","jp","k","m","mlp","out","po","r9k","s4s","sci","tg","tv","u","v","vg","vp","vr","wsg"],"files":["a","biz","c","co","diy","gd","h","i","jp","k","m","mlp","po","s4s","sci","tg","u","v","vg","vp","vr","wsg"]},{"uid":3,"name":"4plebs Archive","domain":"archive.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["adv","f","hr","o","pol","s4s","tg","trv","tv","x"],"files":["adv","f","hr","o","pol","s4s","tg","trv","tv","x"]},{"uid":5,"name":"Love is Over","domain":"archive.loveisover.me","http":true,"https":true,"software":"foolfuuka","boards":["c","d","e","i","lgbt","t","u","w","wg"],"files":["c","d","e","i","lgbt","t","u","w","wg"]},{"uid":8,"name":"Rebecca Black Tech","domain":"archive.rebeccablacktech.com","http":false,"https":true,"software":"fuuka","boards":["cgl","g","mu","w"],"files":["cgl","g","mu","w"]},{"uid":10,"name":"warosu","domain":"warosu.org","http":false,"https":true,"software":"fuuka","boards":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"],"files":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"]},{"uid":15,"name":"fgts","domain":"fgts.jp","http":true,"https":true,"software":"foolfuuka","boards":["asp","cm","h","hc","hm","n","p","r","s","soc","y"],"files":["asp","cm","h","hc","hm","n","p","r","s","soc","y"]},{"uid":21,"name":"imcute","domain":"imcute.yt","http":true,"https":false,"software":"foolfuuka","boards":["an","fit","gif","int","mlp","out","r9k","toy"],"files":["an","fit","gif","int","mlp","out","r9k","toy"],"imagehosts":["http://imcute.yt/"]}], to: function(dest, data) { var archive; archive = (dest === 'search' || dest === 'board' ? Redirect.data.thread : Redirect.data[dest])[data.boardID]; @@ -13428,9 +13563,13 @@ return "" + (Redirect.protocol(archive)) + archive.domain + "/" + path; }, post: function(archive, _arg) { - var URL, boardID, postID; + var URL, boardID, postID, protocol; boardID = _arg.boardID, postID = _arg.postID; - URL = new String("" + (Redirect.protocol(archive)) + archive.domain + "/_/api/chan/post/?board=" + boardID + "&num=" + postID); + protocol = Redirect.protocol(archive); + URL = new String("" + protocol + archive.domain + "/_/api/chan/post/?board=" + boardID + "&num=" + postID); + if (!Redirect.securityCheck(URL)) { + return ''; + } URL.archive = archive; return URL; }, @@ -13451,75 +13590,1392 @@ value = encodeURIComponent(value); path = archive.software === 'foolfuuka' ? "" + boardID + "/search/" + type + "/" + value : "" + boardID + "/?task=search2&search_" + (type === 'image' ? 'media_hash' : type) + "=" + value; return "" + (Redirect.protocol(archive)) + archive.domain + "/" + path; + }, + securityCheck: function(URL) { + return /^https:\/\//.test(URL) || location.protocol === 'http:' || Conf['Except Archives from Encryption']; + }, + navigate: function(URL, alternative) { + if (URL && (Redirect.securityCheck(URL) || confirm("Redirect to " + URL + "?\n\nYour connection will not be encrypted."))) { + return location.replace(URL); + } else if (alternative) { + return location.replace(alternative); + } } }; - [ - { - "uid": 0, - "name": "Moe", - "domain": "archive.moe", - "http": false, - "https": true, - "software": "foolfuuka", - "boards": ["a", "biz", "c", "co", "diy", "gd", "h", "i", "int", "jp", "k", "m", "mlp", "out", "po", "r9k", "s4s", "sci", "sp", "tg", "tv", "u", "v", "vg", "vp", "vr", "wsg"], - "files": ["a", "biz", "c", "co", "diy", "gd", "h", "i", "jp", "k", "m", "mlp", "po", "s4s", "sci", "tg", "u", "v", "vg", "vp", "vr", "wsg"] - }, { - "uid": 3, - "name": "4plebs Archive", - "domain": "archive.4plebs.org", - "http": true, - "https": true, - "software": "foolfuuka", - "boards": ["adv", "f", "hr", "o", "pol", "s4s", "tg", "trv", "tv", "x"], - "files": ["adv", "f", "hr", "o", "pol", "s4s", "tg", "trv", "tv", "x"] - }, { - "uid": 5, - "name": "Love is Over", - "domain": "archive.loveisover.me", - "http": true, - "https": true, - "software": "foolfuuka", - "boards": ["c", "d", "e", "i", "lgbt", "t", "u", "w", "wg"], - "files": ["c", "d", "e", "i", "lgbt", "t", "u", "w", "wg"] - }, { - "uid": 8, - "name": "Rebecca Black Tech", - "domain": "archive.rebeccablacktech.com", - "http": false, - "https": true, - "software": "fuuka", - "boards": ["cgl", "g", "mu", "w"], - "files": ["cgl", "g", "mu", "w"] - }, { - "uid": 10, - "name": "warosu", - "domain": "warosu.org", - "http": false, - "https": true, - "software": "fuuka", - "boards": ["3", "biz", "cgl", "ck", "diy", "fa", "g", "ic", "jp", "lit", "sci", "tg", "vr"], - "files": ["3", "biz", "cgl", "ck", "diy", "fa", "g", "ic", "jp", "lit", "sci", "tg", "vr"] - }, { - "uid": 15, - "name": "fgts", - "domain": "fgts.jp", - "http": true, - "https": true, - "software": "foolfuuka", - "boards": ["asp", "cm", "h", "hc", "hm", "n", "p", "r", "s", "soc", "y"], - "files": ["asp", "cm", "h", "hc", "hm", "n", "p", "r", "s", "soc", "y"] - }, { - "uid": 17, - "name": "imcute", - "domain": "imcute.yt", - "http": true, - "https": false, - "software": "foolfuuka", - "boards": ["an", "fit", "gif", "int", "mlp", "out", "r9k", "toy"], - "files": ["an", "fit", "gif", "int", "mlp", "out", "r9k", "toy"] + PSAHiding = { + init: function() { + if (!Conf['Announcement Hiding']) { + return; + } + $.addClass(doc, 'hide-announcement'); + return $.on(d, '4chanXInitFinished', this.setup); + }, + setup: function() { + var btn, entry, psa; + $.off(d, '4chanXInitFinished', PSAHiding.setup); + if (!(psa = $.id('globalMessage'))) { + return; + } + entry = { + el: $.el('a', { + textContent: 'Show announcement', + className: 'show-announcement', + href: 'javascript:;' + }), + order: 50, + open: function() { + return psa.hidden; + } + }; + Header.menu.addEntry(entry); + $.on(entry.el, 'click', PSAHiding.toggle); + PSAHiding.btn = btn = $.el('span', { + innerHTML: '[Dismiss]', + title: 'Mark announcement as read and hide.', + className: 'hide-announcement', + href: 'javascript:;', + textContent: '[ - ]' + }); + $.on(btn, 'click', PSAHiding.toggle); + $.get('hiddenPSA', 0, function(_arg) { + var hiddenPSA; + hiddenPSA = _arg.hiddenPSA; + PSAHiding.sync(hiddenPSA); + $.add(psa, btn); + return $.rmClass(doc, 'hide-announcement'); + }); + return $.sync('hiddenPSA', PSAHiding.sync); + }, + toggle: function(e) { + var UTC; + if ($.hasClass(this, 'hide-announcement')) { + UTC = +$.id('globalMessage').dataset.utc; + $.set('hiddenPSA', UTC); + } else { + $.event('CloseMenu'); + $["delete"]('hiddenPSA'); + } + return PSAHiding.sync(UTC); + }, + sync: function(UTC) { + var hr, psa; + psa = $.id('globalMessage'); + psa.hidden = PSAHiding.btn.hidden = UTC && UTC >= +psa.dataset.utc ? true : false; + if ((hr = psa.nextElementSibling) && hr.nodeName === 'HR') { + return hr.hidden = psa.hidden; + } } - ]; + }; + + CatalogLinks = { + init: function() { + var el, input; + if (!Conf['Catalog Links']) { + return; + } + CatalogLinks.el = el = $.el('label', { + id: 'toggleCatalog', + href: 'javascript:;', + innerHTML: " Catalog Links" + }); + input = $('input', el); + $.on(input, 'change', this.toggle); + $.sync('Header catalog links', CatalogLinks.set); + Header.menu.addEntry({ + el: el, + order: 95 + }); + return $.on(d, '4chanXInitFinished', function() { + return CatalogLinks.set(Conf['Header catalog links']); + }); + }, + toggle: function() { + $.event('CloseMenu'); + $.set('Header catalog links', this.checked); + return CatalogLinks.set(this.checked); + }, + set: function(useCatalog) { + var a, board, generateURL, path, _i, _len, _ref, _ref1; + path = useCatalog ? 'catalog' : ''; + generateURL = useCatalog && Conf['External Catalog'] ? CatalogLinks.external : function(board) { + return a.href = "/" + board + "/" + path; + }; + _ref = $$("#board-list a:not(.catalog), #boardNavDesktopFoot a"); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + a = _ref[_i]; + 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') || $.hasClass(a, 'external')) { + continue; + } + a.href = generateURL(board); + } + return CatalogLinks.el.title = "Turn catalog links " + (useCatalog ? 'off' : 'on') + "."; + }, + external: function(board) { + if (board === 'a' || board === 'c' || board === 'g' || board === 'co' || board === 'k' || board === 'm' || board === 'o' || board === 'p' || board === 'v' || board === 'vg' || board === 'w' || board === 'cm' || board === '3' || board === 'adv' || board === 'an' || board === 'cgl' || board === 'ck' || board === 'diy' || board === 'fa' || board === 'fit' || board === 'int' || board === 'jp' || board === 'mlp' || board === 'lit' || board === 'mu' || board === 'n' || board === 'po' || board === 'sci' || board === 'toy' || board === 'trv' || board === 'tv' || board === 'vp' || board === 'x' || board === 'q') { + return "http://catalog.neet.tv/" + board; + } else { + return "/" + board + "/catalog"; + } + } + }; + + CustomCSS = { + init: function() { + if (!Conf['Custom CSS']) { + return; + } + return this.addStyle(); + }, + addStyle: function() { + return this.style = $.addStyle(Conf['usercss'], 'CustomCSS'); + }, + rmStyle: function() { + if (this.style) { + $.rm(this.style); + return delete this.style; + } + }, + update: function() { + if (!this.style) { + return this.addStyle(); + } + return this.style.textContent = Conf['usercss']; + } + }; + + Dice = { + init: function() { + if (g.BOARD.ID !== 'tg' || !Conf['Show Dice Roll']) { + return; + } + return Post.callbacks.push({ + name: 'Show Dice Roll', + cb: this.node + }); + }, + node: function() { + var dicestats, roll, _ref; + if (this.isClone || !(dicestats = (_ref = this.info.email) != null ? _ref.match(/dice[+\s](\d+)d(\d+)/) : void 0)) { + return; + } + roll = $('b', this.nodes.comment).firstChild; + return roll.data = "Rolled " + dicestats[1] + "d" + dicestats[2] + ": " + (roll.data.slice(7)); + } + }; + + ExpandComment = { + init: function() { + if (g.VIEW !== 'index' || !Conf['Comment Expansion'] || Conf['JSON Navigation']) { + return; + } + if (g.BOARD.ID === 'g') { + this.callbacks.push(Fourchan.code); + } + if (g.BOARD.ID === 'sci') { + this.callbacks.push(Fourchan.math); + } + return Post.callbacks.push({ + name: 'Comment Expansion', + cb: this.node + }); + }, + node: function() { + var a; + if (a = $('.abbr > a:not([onclick])', this.nodes.comment)) { + return $.on(a, 'click', ExpandComment.cb); + } + }, + callbacks: [], + cb: function(e) { + e.preventDefault(); + return ExpandComment.expand(Get.postFromNode(this)); + }, + expand: function(post) { + var a; + if (post.nodes.longComment && !post.nodes.longComment.parentNode) { + $.replace(post.nodes.shortComment, post.nodes.longComment); + post.nodes.comment = post.nodes.longComment; + return; + } + if (!(a = $('.abbr > a', post.nodes.comment))) { + return; + } + a.textContent = "Post No." + post + " Loading..."; + return $.cache("//a.4cdn.org" + (a.pathname.split('/').splice(0, 4).join('/')) + ".json", function() { + return ExpandComment.parse(this, a, post); + }); + }, + contract: function(post) { + var a; + if (!post.nodes.shortComment) { + return; + } + a = $('.abbr > a', post.nodes.shortComment); + a.textContent = 'here'; + $.replace(post.nodes.longComment, post.nodes.shortComment); + return post.nodes.comment = post.nodes.shortComment; + }, + parse: function(req, a, post) { + var callback, clone, comment, href, postObj, posts, quote, spoilerRange, status, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; + status = req.status; + if (status !== 200 && status !== 304) { + a.textContent = "Error " + req.statusText + " (" + status + ")"; + return; + } + posts = req.response.posts; + if (spoilerRange = posts[0].custom_spoiler) { + Build.spoilerRange[g.BOARD] = spoilerRange; + } + for (_i = 0, _len = posts.length; _i < _len; _i++) { + postObj = posts[_i]; + if (postObj.no === post.ID) { + break; + } + } + if (postObj.no !== post.ID) { + a.textContent = "Post No." + post + " not found."; + return; + } + comment = post.nodes.comment; + clone = comment.cloneNode(false); + clone.innerHTML = postObj.com; + _ref = $$('.quotelink', clone); + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { + quote = _ref[_j]; + href = quote.getAttribute('href'); + if (href[0] === '/') { + continue; + } + if (href[0] === '#') { + quote.href = "" + (a.pathname.split('/').splice(0, 4).join('/')) + href; + } else { + quote.href = "" + (a.pathname.split('/').splice(0, 3).join('/')) + "/" + href; + } + } + post.nodes.shortComment = comment; + $.replace(comment, clone); + post.nodes.comment = post.nodes.longComment = clone; + post.parseComment(); + post.parseQuotes(); + _ref1 = ExpandComment.callbacks; + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { + callback = _ref1[_k]; + callback.call(post); + } + } + }; + + ExpandThread = { + statuses: {}, + init: function() { + if (g.VIEW === 'thread' || !Conf['Thread Expansion']) { + return; + } + return $.on(d, (Conf['JSON Navigation'] ? 'IndexRefresh' : '4chanXInitFinished'), this.onIndexRefresh); + }, + setButton: function(thread) { + var a, summary; + if (!(summary = $.x('following-sibling::*[contains(@class,"summary")][1]', thread.OP.nodes.root))) { + return; + } + a = $.el('a', { + textContent: ExpandThread.text.apply(ExpandThread, ['+'].concat(__slice.call(summary.textContent.match(/\d+/g)))), + href: "res/" + thread.ID, + className: 'summary' + }); + $.on(a, 'click', ExpandThread.cbToggle); + return $.replace(summary, a); + }, + disconnect: function() { + this.refresh(); + return $.off(d, 'IndexRefresh', this.onIndexRefresh); + }, + refresh: function(disconnect) { + var status, threadID, _ref, _ref1; + if (g.VIEW === 'thread' || !Conf['Thread Expansion']) { + return; + } + _ref = ExpandThread.statuses; + for (threadID in _ref) { + status = _ref[threadID]; + if ((_ref1 = status.req) != null) { + _ref1.abort(); + } + delete ExpandThread.statuses[threadID]; + } + }, + onIndexRefresh: function() { + ExpandThread.refresh(); + return g.BOARD.threads.forEach(function(thread) { + return ExpandThread.setButton(thread); + }); + }, + text: function(status, posts, files) { + return ("" + status + " " + posts + " post" + (posts > 1 ? 's' : '')) + (+files ? " and " + files + " image repl" + (files > 1 ? 'ies' : 'y') : "") + (" " + (status === '-' ? 'shown' : 'omitted') + "."); + }, + cbToggle: function(e) { + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) { + return; + } + e.preventDefault(); + return ExpandThread.toggle(Get.threadFromNode(this)); + }, + toggle: function(thread) { + var a, threadRoot; + threadRoot = thread.OP.nodes.root.parentNode; + if (!(a = $('.summary', threadRoot))) { + return; + } + if (thread.ID in ExpandThread.statuses) { + return ExpandThread.contract(thread, a, threadRoot); + } else { + return ExpandThread.expand(thread, a, threadRoot); + } + }, + expand: function(thread, a, threadRoot) { + var status; + ExpandThread.statuses[thread] = status = {}; + a.textContent = ExpandThread.text.apply(ExpandThread, ['...'].concat(__slice.call(a.textContent.match(/\d+/g)))); + return status.req = $.cache("//a.4cdn.org/" + thread.board + "/thread/" + thread + ".json", function() { + delete status.req; + return ExpandThread.parse(this, thread, a); + }); + }, + contract: function(thread, a, threadRoot) { + var filesCount, inlined, num, postsCount, replies, reply, status, _i, _len; + status = ExpandThread.statuses[thread]; + delete ExpandThread.statuses[thread]; + if (status.req) { + status.req.abort(); + if (a) { + a.textContent = ExpandThread.text.apply(ExpandThread, ['+'].concat(__slice.call(a.textContent.match(/\d+/g)))); + } + return; + } + replies = $$('.thread > .replyContainer', threadRoot); + if (Conf['Show Replies']) { + num = (function() { + if (thread.isSticky) { + return 1; + } else { + switch (g.BOARD.ID) { + case 'b': + case 'vg': + return 3; + case 't': + return 1; + default: + return 5; + } + } + })(); + replies = replies.slice(0, -num); + } + postsCount = 0; + filesCount = 0; + for (_i = 0, _len = replies.length; _i < _len; _i++) { + reply = replies[_i]; + if (Conf['Quote Inlining']) { + while (inlined = $('.inlined', reply)) { + inlined.click(); + } + } + postsCount++; + if ('file' in Get.postFromRoot(reply)) { + filesCount++; + } + $.rm(reply); + } + return a.textContent = ExpandThread.text('+', postsCount, filesCount); + }, + parse: function(req, thread, a) { + var filesCount, post, postData, posts, postsCount, postsRoot, root, _i, _len, _ref, _ref1; + if ((_ref = req.status) !== 200 && _ref !== 304) { + a.textContent = "Error " + req.statusText + " (" + req.status + ")"; + return; + } + Build.spoilerRange[thread.board] = req.response.posts[0].custom_spoiler; + posts = []; + postsRoot = []; + filesCount = 0; + _ref1 = req.response.posts; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + postData = _ref1[_i]; + if (postData.no === thread.ID) { + continue; + } + if (post = thread.posts[postData.no]) { + if ('file' in post) { + filesCount++; + } + postsRoot.push(post.nodes.root); + continue; + } + root = Build.postFromObject(postData, thread.board.ID); + post = new Post(root, thread, thread.board); + if ('file' in post) { + filesCount++; + } + posts.push(post); + postsRoot.push(root); + } + Post.callbacks.execute(posts); + $.after(a, postsRoot); + postsCount = postsRoot.length; + return a.textContent = ExpandThread.text('-', postsRoot.length, filesCount); + } + }; + + FileInfo = { + init: function() { + if (!Conf['File Info Formatting']) { + return; + } + return Post.callbacks.push({ + name: 'File Info Formatting', + cb: this.node + }); + }, + node: function() { + if (!this.file || this.isClone) { + return; + } + return this.file.text.innerHTML = "" + (FileInfo.format(Conf['fileInfo'], this)) + ""; + }, + format: function(formatString, post) { + return formatString.replace(/%([A-Za-z])/g, function(s, c) { + if (c in FileInfo.formatters) { + return FileInfo.formatters[c].call(post); + } else { + return s; + } + }); + }, + convertUnit: function(size, unit) { + var i; + if (unit === 'B') { + return "" + (size.toFixed()) + " Bytes"; + } + i = 1 + ['KB', 'MB'].indexOf(unit); + while (i--) { + size /= 1024; + } + size = unit === 'MB' ? Math.round(size * 100) / 100 : size.toFixed(); + return "" + size + " " + unit; + }, + escape: function(name) { + return name.replace(/<|>/g, function(c) { + return c === '<' && '<' || '>'; + }); + }, + formatters: { + t: function() { + return this.file.URL.match(/\d+\..+$/)[0]; + }, + T: function() { + return "" + (FileInfo.formatters.t.call(this)) + ""; + }, + l: function() { + return "" + (FileInfo.formatters.n.call(this)) + ""; + }, + L: function() { + return "" + (FileInfo.formatters.N.call(this)) + ""; + }, + n: function() { + var fullname, shortname; + fullname = this.file.name; + shortname = Build.shortFilename(this.file.name, this.isReply); + if (fullname === shortname) { + return FileInfo.escape(fullname); + } else { + return "" + (FileInfo.escape(shortname)) + "" + (FileInfo.escape(fullname)) + ""; + } + }, + N: function() { + return FileInfo.escape(this.file.name); + }, + p: function() { + if (this.file.isSpoiler) { + return 'Spoiler, '; + } else { + return ''; + } + }, + s: function() { + return this.file.size; + }, + B: function() { + return FileInfo.convertUnit(this.file.sizeInBytes, 'B'); + }, + K: function() { + return FileInfo.convertUnit(this.file.sizeInBytes, 'KB'); + }, + M: function() { + return FileInfo.convertUnit(this.file.sizeInBytes, 'MB'); + }, + r: function() { + return this.file.dimensions || 'PDF'; + } + } + }; + + Flash = { + init: function() { + if (g.BOARD.ID === 'f') { + return $.ready(Flash.initReady); + } + }, + initReady: function() { + var nav, sauceLink, swfName; + $.globalEval('SWFEmbed.init()'); + if (g.VIEW !== 'thread') { + return; + } + swfName = $('.fileText > a'); + nav = $('.navLinks.desktop'); + swfName = swfName.href.replace(/^(.*?)\/f\//g, ""); + sauceLink = $.el('a', { + textContent: 'Check Sauce on SWFCHAN', + href: "http://eye.swfchan.com/search/?q=" + swfName + }); + $.addClass(nav, 'swfSauce'); + $.rmClass(nav, 'navLinks'); + $.rmAll(nav); + return $.add(nav, [$.tn('['), sauceLink, $.tn(']')]); + } + }; + + Fourchan = { + init: function() { + var board; + board = g.BOARD.ID; + if (board === 'g') { + $.globalEval("window.addEventListener('prettyprint', function(e) {\n window.dispatchEvent(new CustomEvent('prettyprint:cb', {\n detail: prettyPrintOne(e.detail)\n }));\n}, false);"); + Post.callbacks.push({ + name: 'Parse /g/ code', + cb: this.code + }); + } + if (board === 'sci') { + $.globalEval("window.addEventListener('jsmath', function(e) {\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(document.getElementById(e.detail));\n } else {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push('ProcessBeforeShowing', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);"); + return Post.callbacks.push({ + name: 'Parse /sci/ math', + cb: this.math + }); + } + }, + code: function() { + var apply, pre, _i, _len, _ref; + if (this.isClone) { + return; + } + apply = function(e) { + return pre.innerHTML = e.detail; + }; + $.on(window, 'prettyprint:cb', apply); + _ref = $$('.prettyprint:not(.prettyprinted)', this.nodes.comment); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + pre = _ref[_i]; + $.event('prettyprint', pre.innerHTML, window); + } + $.off(window, 'prettyprint:cb', apply); + }, + math: function() { + if (this.isClone || !$('.math', this.nodes.comment)) { + return; + } + return $.event('jsmath', this.nodes.post.id, window); + } + }; + + IDColor = { + init: function() { + if (!Conf['Color User IDs']) { + return; + } + this.ids = { + Heaven: [0, 0, 0, '#fff'] + }; + return Post.callbacks.push({ + name: 'Color User IDs', + cb: this.node + }); + }, + node: function() { + var rgb, span, uid; + if (this.isClone || !((uid = this.info.uniqueID) && (span = $('span.hand', this.nodes.uniqueID)))) { + return; + } + rgb = IDColor.ids[uid] || IDColor.compute(uid); + span.style.color = rgb[3]; + span.style.backgroundColor = "rgb(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ")"; + $.addClass(span, 'painted'); + return span.title = 'Highlight posts by this ID'; + }, + compute: function(uid) { + var hash, i, rgb; + i = 1; + hash = uid.charCodeAt(0); + while (i < 8) { + hash = (hash << 5) - hash + uid.charCodeAt(i++); + } + rgb = [(hash >> 24) & 0xFF, (hash >> 16) & 0xFF, (hash >> 8) & 0xFF]; + rgb.push((rgb[0] * 0.299 + rgb[1] * 0.587 + rgb[2] * 0.114) > 125 ? '#000' : '#fff'); + return this.ids[uid] = rgb; + } + }; + + Keybinds = { + init: function() { + var hotkey, init; + if (!Conf['Keybinds']) { + return; + } + for (hotkey in Conf.hotkeys) { + $.sync(hotkey, Keybinds.sync); + } + init = function() { + var node, _i, _len, _ref; + $.off(d, '4chanXInitFinished', init); + $.on(d, 'keydown', Keybinds.keydown); + _ref = $$('[accesskey]'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + node = _ref[_i]; + node.removeAttribute('accesskey'); + } + }; + return $.on(d, '4chanXInitFinished', init); + }, + sync: function(key, hotkey) { + return Conf[hotkey] = key; + }, + keydown: function(e) { + var form, key, notification, notifications, op, searchInput, target, thread, threadRoot, _i, _len, _ref; + if (!(key = Keybinds.keyCode(e))) { + return; + } + target = e.target; + if (target.nodeName === 'EMBED') { + return; + } + if ((_ref = target.nodeName) === 'INPUT' || _ref === 'TEXTAREA') { + if (!/(Esc|Alt|Ctrl|Meta|Shift\+\w{2,})/.test(key)) { + return; + } + } + if (g.VIEW !== 'catalog') { + threadRoot = Nav.getThread(); + if (op = $('.op', threadRoot)) { + thread = Get.postFromNode(op).thread; + } + } + switch (key) { + case Conf['Toggle board list']: + if (Conf['Custom Board Navigation']) { + Header.toggleBoardList(); + } + break; + case Conf['Toggle header']: + Header.toggleBarVisibility(); + break; + case Conf['Open empty QR']: + Keybinds.qr(); + break; + case Conf['Open QR']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.qr(threadRoot); + break; + case Conf['Open settings']: + Settings.open(); + break; + case Conf['Close']: + if ($.id('fourchanx-settings')) { + Settings.close(); + } else if ((notifications = $$('.notification')).length) { + for (_i = 0, _len = notifications.length; _i < _len; _i++) { + notification = notifications[_i]; + $('.close', notification).click(); + } + } else if (QR.nodes) { + if (Conf['Persistent QR']) { + QR.hide(); + } else { + QR.close(); + } + } + break; + case Conf['Spoiler tags']: + if (target.nodeName !== 'TEXTAREA') { + return; + } + Keybinds.tags('spoiler', target); + break; + case Conf['Code tags']: + if (target.nodeName !== 'TEXTAREA') { + return; + } + Keybinds.tags('code', target); + break; + case Conf['Eqn tags']: + if (target.nodeName !== 'TEXTAREA') { + return; + } + Keybinds.tags('eqn', target); + break; + case Conf['Math tags']: + if (target.nodeName !== 'TEXTAREA') { + return; + } + Keybinds.tags('math', target); + break; + case Conf['Toggle sage']: + if (QR.nodes) { + Keybinds.sage(); + } + break; + case Conf['Submit QR']: + if (QR.nodes && !QR.status()) { + QR.submit(); + } + break; + case Conf['Post Without Name']: + if (QR.nodes && !QR.status()) { + Keybinds.name(); + QR.submit(); + } + break; + case Conf['Update']: + switch (g.VIEW) { + case 'thread': + ThreadUpdater.update(); + break; + case 'index': + if (Conf['JSON Navigation']) { + Index.update(); + } + } + break; + case Conf['Watch']: + if (g.VIEW === 'catalog') { + return; + } + ThreadWatcher.toggle(thread); + break; + case Conf['Expand image']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.img(threadRoot); + break; + case Conf['Expand images']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.img(threadRoot, true); + break; + case Conf['Open Gallery']: + if (g.VIEW === 'catalog') { + return; + } + Gallery.cb.toggle(); + break; + case Conf['fappeTyme']: + if (g.VIEW === 'catalog') { + return; + } + FappeTyme.cb.toggle.call({ + name: 'fappe' + }); + break; + case Conf['werkTyme']: + if (g.VIEW === 'catalog') { + return; + } + FappeTyme.cb.toggle.call({ + name: 'werk' + }); + break; + case Conf['Front page']: + if (Conf['JSON Navigation'] && g.VIEW === 'index') { + Index.userPageNav(1); + } else { + window.location = "/" + g.BOARD + "/"; + } + break; + case Conf['Open front page']: + $.open("/" + g.BOARD + "/"); + break; + case Conf['Next page']: + if (g.VIEW !== 'index') { + return; + } + if (Conf['JSON Navigation']) { + if (Conf['Index Mode'] !== 'all pages') { + $('.next button', Index.pagelist).click(); + } + } else { + if (form = $('.next form')) { + window.location = form.action; + } + } + break; + case Conf['Previous page']: + if (g.VIEW !== 'index') { + return; + } + if (Conf['JSON Navigation']) { + if (Conf['Index Mode'] !== 'all pages') { + $('.prev button', Index.pagelist).click(); + } + } else { + if (form = $('.prev form')) { + window.location = form.action; + } + } + break; + case Conf['Search form']: + if (g.VIEW !== 'index') { + return; + } + searchInput = Conf['JSON Navigation'] ? Index.searchInput : $.id('search-box'); + Header.scrollToIfNeeded(searchInput); + searchInput.click(); + searchInput.focus(); + break; + case Conf['Paged mode']: + if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'paged')) { + return; + } + Index.setIndexMode('paged'); + break; + case Conf['All pages mode']: + if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'all pages')) { + return; + } + Index.setIndexMode('all pages'); + break; + case Conf['Catalog mode']: + if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'catalog')) { + return; + } + Index.setIndexMode('catalog'); + break; + case Conf['Cycle sort type']: + if (g.VIEW !== 'index') { + return; + } + Index.cycleSortType(); + break; + case Conf['Open catalog']: + if (Conf['External Catalog']) { + window.location = CatalogLinks.external(g.BOARD.ID); + } else { + if (!Conf['JSON Navigation']) { + return window.location = "/" + g.BOARD + "/catalog"; + } + if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'catalog')) { + return; + } + Index.setIndexMode('catalog'); + } + break; + case Conf['Next thread']: + if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { + return; + } + Nav.scroll(+1); + break; + case Conf['Previous thread']: + if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { + return; + } + Nav.scroll(-1); + break; + case Conf['Expand thread']: + if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { + return; + } + ExpandThread.toggle(thread); + break; + case Conf['Open thread']: + if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { + return; + } + Keybinds.open(thread); + break; + case Conf['Open thread tab']: + if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { + return; + } + Keybinds.open(thread, true); + break; + case Conf['Next reply']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.hl(+1, threadRoot); + break; + case Conf['Previous reply']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.hl(-1, threadRoot); + break; + case Conf['Deselect reply']: + if (g.VIEW === 'catalog') { + return; + } + Keybinds.hl(0, threadRoot); + break; + case Conf['Hide']: + PostHiding.toggle(thread.OP); + break; + case Conf['Previous Post Quoting You']: + QuoteMarkers.cb.seek('preceding'); + break; + case Conf['Next Post Quoting You']: + QuoteMarkers.cb.seek('following'); + break; + default: + return; + } + e.preventDefault(); + return e.stopPropagation(); + }, + keyCode: function(e) { + var kc, key; + key = (function() { + switch (kc = e.keyCode) { + case 8: + return ''; + case 13: + return 'Enter'; + case 27: + return 'Esc'; + case 37: + return 'Left'; + case 38: + return 'Up'; + case 39: + return 'Right'; + case 40: + return 'Down'; + default: + if ((48 <= kc && kc <= 57) || (65 <= kc && kc <= 90)) { + return String.fromCharCode(kc).toLowerCase(); + } else { + return null; + } + } + })(); + if (key) { + if (e.altKey) { + key = 'Alt+' + key; + } + if (e.ctrlKey) { + key = 'Ctrl+' + key; + } + if (e.metaKey) { + key = 'Meta+' + key; + } + if (e.shiftKey) { + key = 'Shift+' + key; + } + } + return key; + }, + qr: function(thread) { + if (!QR.postingIsEnabled) { + return; + } + QR.open(); + if (thread != null) { + QR.quote.call($('input', $('.post.highlight', thread) || thread)); + } + QR.nodes.com.focus(); + if (Conf['QR Shortcut']) { + return $.rmClass($('.qr-shortcut'), 'disabled'); + } + }, + tags: function(tag, ta) { + var range, selEnd, selStart, value; + value = ta.value; + selStart = ta.selectionStart; + selEnd = ta.selectionEnd; + ta.value = value.slice(0, selStart) + ("[" + tag + "]") + value.slice(selStart, selEnd) + ("[/" + tag + "]") + value.slice(selEnd); + range = ("[" + tag + "]").length + selEnd; + ta.setSelectionRange(range, range); + return $.event('input', null, ta); + }, + name: function() { + return QR.nodes.name.value = ''; + }, + sage: function() { + var isSage; + isSage = /sage/i.test(QR.nodes.email.value); + return QR.nodes.email.value = isSage ? "" : "sage"; + }, + img: function(thread, all) { + var post; + if (all) { + return ImageExpand.cb.toggleAll(); + } else { + post = Get.postFromNode($('.post.highlight', thread) || $('.op', thread)); + return ImageExpand.toggle(post); + } + }, + open: function(thread, tab) { + var url; + if (g.VIEW !== 'index') { + return; + } + url = Build.path(thread.board.ID, thread.ID); + if (tab) { + return $.open(url); + } else { + return location.href = url; + } + }, + hl: function(delta, thread) { + var axis, height, next, postEl, replies, reply, root, _i, _len; + postEl = $('.reply.highlight', thread); + if (!delta) { + if (postEl) { + $.rmClass(postEl, 'highlight'); + } + return; + } + if (postEl) { + height = postEl.getBoundingClientRect().height; + if (Header.getTopOf(postEl) >= -height && Header.getBottomOf(postEl) >= -height) { + root = postEl.parentNode; + axis = delta === +1 ? 'following' : 'preceding'; + if (!(next = $.x("" + axis + "-sibling::div[contains(@class,'replyContainer') and not(@hidden) and not(child::div[@class='stub'])][1]/child::div[contains(@class,'reply')]", root))) { + return; + } + Header.scrollToIfNeeded(next, delta === +1); + this.focus(next); + $.rmClass(postEl, 'highlight'); + return; + } + $.rmClass(postEl, 'highlight'); + } + replies = $$('.reply', thread); + if (delta === -1) { + replies.reverse(); + } + for (_i = 0, _len = replies.length; _i < _len; _i++) { + reply = replies[_i]; + if (delta === +1 && Header.getTopOf(reply) > 0 || delta === -1 && Header.getBottomOf(reply) > 0) { + this.focus(reply); + return; + } + } + }, + focus: function(post) { + return $.addClass(post, 'highlight'); + } + }; + + Nav = { + init: function() { + var next, prev; + switch (g.VIEW) { + case 'index': + if (!Conf['Index Navigation']) { + return; + } + break; + case 'thread': + if (!Conf['Reply Navigation']) { + return; + } + } + prev = $.el('a', { + href: 'javascript:;', + id: 'navPrev' + }); + next = $.el('a', { + href: 'javascript:;', + id: 'navNext' + }); + Header.addShortcut(prev, true); + Header.addShortcut(next, true); + $.on(prev, 'click', this.prev); + return $.on(next, 'click', this.next); + }, + prev: function() { + if (g.VIEW === 'thread') { + return window.scrollTo(0, 0); + } else { + return Nav.scroll(-1); + } + }, + next: function() { + if (g.VIEW === 'thread') { + return window.scrollTo(0, d.body.scrollHeight); + } else { + return Nav.scroll(+1); + } + }, + getThread: function() { + var threadRoot, _i, _len, _ref; + _ref = $$('.thread'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + threadRoot = _ref[_i]; + if (Header.getTopOf(threadRoot) >= -threadRoot.getBoundingClientRect().height) { + return threadRoot; + } + } + return $('.board'); + }, + scroll: function(delta) { + var axis, next, thread, top; + thread = Nav.getThread(); + axis = delta === +1 ? 'following' : 'preceding'; + if (next = $.x("" + axis + "-sibling::div[contains(@class,'thread') and not(@hidden)][1]", thread)) { + top = Header.getTopOf(thread); + if (delta === +1 && top < 5 || delta === -1 && top > -5) { + thread = next; + } + } + return Header.scrollTo(thread); + } + }; + + RelativeDates = { + INTERVAL: $.MINUTE / 2, + init: function() { + switch (g.VIEW) { + case 'index': + this.flush(); + $.on(d, 'visibilitychange', this.flush); + if (!Conf['Relative Post Dates']) { + return; + } + break; + case 'thread': + if (!Conf['Relative Post Dates']) { + return; + } + this.flush(); + $.on(d, 'visibilitychange ThreadUpdate', this.flush); + break; + default: + return; + } + return Post.callbacks.push({ + name: 'Relative Post Dates', + cb: this.node + }); + }, + node: function() { + var dateEl; + if (this.isClone) { + return; + } + dateEl = this.nodes.date; + dateEl.title = dateEl.textContent; + return RelativeDates.update(this); + }, + relative: function(diff, now, date) { + var days, months, number, rounded, unit, years; + unit = (number = diff / $.DAY) >= 1 ? (years = now.getYear() - date.getYear(), months = now.getMonth() - date.getMonth(), days = now.getDate() - date.getDate(), years > 1 ? (number = years - (months < 0 || months === 0 && days < 0), 'year') : years === 1 && (months > 0 || months === 0 && days >= 0) ? (number = years, 'year') : (months = (months + 12) % 12) > 1 ? (number = months - (days < 0), 'month') : months === 1 && days >= 0 ? (number = months, 'month') : 'day') : (number = diff / $.HOUR) >= 1 ? 'hour' : (number = diff / $.MINUTE) >= 1 ? 'minute' : (number = Math.max(0, diff) / $.SECOND, 'second'); + rounded = Math.round(number); + if (rounded !== 1) { + unit += 's'; + } + return "" + rounded + " " + unit + " ago"; + }, + stale: [], + flush: function() { + var data, now, _i, _len, _ref; + if (d.hidden) { + return; + } + now = new Date(); + _ref = RelativeDates.stale; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + data = _ref[_i]; + RelativeDates.update(data, now); + } + RelativeDates.stale = []; + clearTimeout(RelativeDates.timeout); + return RelativeDates.timeout = setTimeout(RelativeDates.flush, RelativeDates.INTERVAL); + }, + update: function(data, now) { + var date, diff, isPost, relative, singlePost, _i, _len, _ref; + isPost = data instanceof Post; + date = isPost ? data.info.date : new Date(+data.dataset.utc); + now || (now = new Date()); + diff = now - date; + relative = RelativeDates.relative(diff, now, date); + if (isPost) { + _ref = [data].concat(data.clones); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + singlePost = _ref[_i]; + singlePost.nodes.date.firstChild.textContent = relative; + } + } else { + data.firstChild.textContent = relative; + } + return RelativeDates.setOwnTimeout(diff, data); + }, + setOwnTimeout: function(diff, data) { + var delay; + delay = diff < $.MINUTE ? $.SECOND - (diff + $.SECOND / 2) % $.SECOND : diff < $.HOUR ? $.MINUTE - (diff + $.MINUTE / 2) % $.MINUTE : diff < $.DAY ? $.HOUR - (diff + $.HOUR / 2) % $.HOUR : $.DAY - (diff + $.DAY / 2) % $.DAY; + return setTimeout(RelativeDates.markStale, delay, data); + }, + markStale: function(data) { + if (__indexOf.call(RelativeDates.stale, data) >= 0) { + return; + } + if (data instanceof Post && !g.posts[data.fullID]) { + return; + } + return RelativeDates.stale.push(data); + } + }; + + RemoveSpoilers = { + init: function() { + if (Conf['Reveal Spoilers']) { + $.addClass(doc, 'reveal-spoilers'); + } + if (Conf['Remove Spoilers']) { + return $.addClass(doc, 'remove-spoilers'); + } + } + }; + + Report = { + init: function() { + if (!/report/.test(location.search)) { + return; + } + return $.asap((function() { + return $.id('recaptcha_response_field'); + }), Report.ready); + }, + ready: function() { + var field; + field = $.id('recaptcha_response_field'); + $.on(field, 'keydown', function(e) { + if (e.keyCode === 8 && !field.value) { + return $.globalEval('Recaptcha.reload("t")'); + } + }); + return $.on($('form'), 'submit', function(e) { + var response; + e.preventDefault(); + response = field.value.trim(); + if (!/\s|^\d+$/.test(response)) { + field.value = "" + response + " " + response; + } + return this.submit(); + }); + } + }; + + Time = { + init: function() { + if (!Conf['Time Formatting']) { + return; + } + return Post.callbacks.push({ + name: 'Time Formatting', + cb: this.node + }); + }, + node: function() { + if (this.isClone) { + return; + } + return this.nodes.date.textContent = Time.format(Conf['time'], this.info.date); + }, + format: function(formatString, date) { + return formatString.replace(/%([A-Za-z])/g, function(s, c) { + if (c in Time.formatters) { + return Time.formatters[c].call(date); + } else { + return s; + } + }); + }, + day: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + zeroPad: function(n) { + if (n < 10) { + return "0" + n; + } else { + return n; + } + }, + formatters: { + a: function() { + return Time.day[this.getDay()].slice(0, 3); + }, + A: function() { + return Time.day[this.getDay()]; + }, + b: function() { + return Time.month[this.getMonth()].slice(0, 3); + }, + B: function() { + return Time.month[this.getMonth()]; + }, + d: function() { + return Time.zeroPad(this.getDate()); + }, + e: function() { + return this.getDate(); + }, + H: function() { + return Time.zeroPad(this.getHours()); + }, + I: function() { + return Time.zeroPad(this.getHours() % 12 || 12); + }, + k: function() { + return this.getHours(); + }, + l: function() { + return this.getHours() % 12 || 12; + }, + m: function() { + return Time.zeroPad(this.getMonth() + 1); + }, + M: function() { + return Time.zeroPad(this.getMinutes()); + }, + p: function() { + if (this.getHours() < 12) { + return 'AM'; + } else { + return 'PM'; + } + }, + P: function() { + if (this.getHours() < 12) { + return 'am'; + } else { + return 'pm'; + } + }, + S: function() { + return Time.zeroPad(this.getSeconds()); + }, + y: function() { + return this.getFullYear().toString().slice(2); + }, + Y: function() { + return this.getFullYear(); + } + } + }; Banner = { init: function() { @@ -15038,1380 +16494,6 @@ })(); - PSAHiding = { - init: function() { - if (!Conf['Announcement Hiding']) { - return; - } - $.addClass(doc, 'hide-announcement'); - return $.on(d, '4chanXInitFinished', this.setup); - }, - setup: function() { - var btn, entry, psa; - $.off(d, '4chanXInitFinished', PSAHiding.setup); - if (!(psa = $.id('globalMessage'))) { - return; - } - entry = { - el: $.el('a', { - textContent: 'Show announcement', - className: 'show-announcement', - href: 'javascript:;' - }), - order: 50, - open: function() { - return psa.hidden; - } - }; - Header.menu.addEntry(entry); - $.on(entry.el, 'click', PSAHiding.toggle); - PSAHiding.btn = btn = $.el('span', { - innerHTML: '[Dismiss]', - title: 'Mark announcement as read and hide.', - className: 'hide-announcement', - href: 'javascript:;', - textContent: '[ - ]' - }); - $.on(btn, 'click', PSAHiding.toggle); - $.get('hiddenPSA', 0, function(_arg) { - var hiddenPSA; - hiddenPSA = _arg.hiddenPSA; - PSAHiding.sync(hiddenPSA); - $.add(psa, btn); - return $.rmClass(doc, 'hide-announcement'); - }); - return $.sync('hiddenPSA', PSAHiding.sync); - }, - toggle: function(e) { - var UTC; - if ($.hasClass(this, 'hide-announcement')) { - UTC = +$.id('globalMessage').dataset.utc; - $.set('hiddenPSA', UTC); - } else { - $.event('CloseMenu'); - $["delete"]('hiddenPSA'); - } - return PSAHiding.sync(UTC); - }, - sync: function(UTC) { - var hr, psa; - psa = $.id('globalMessage'); - psa.hidden = PSAHiding.btn.hidden = UTC && UTC >= +psa.dataset.utc ? true : false; - if ((hr = psa.nextElementSibling) && hr.nodeName === 'HR') { - return hr.hidden = psa.hidden; - } - } - }; - - CatalogLinks = { - init: function() { - var el, input; - if (!Conf['Catalog Links']) { - return; - } - CatalogLinks.el = el = $.el('label', { - id: 'toggleCatalog', - href: 'javascript:;', - innerHTML: " Catalog Links" - }); - input = $('input', el); - $.on(input, 'change', this.toggle); - $.sync('Header catalog links', CatalogLinks.set); - Header.menu.addEntry({ - el: el, - order: 95 - }); - return $.on(d, '4chanXInitFinished', function() { - return CatalogLinks.set(Conf['Header catalog links']); - }); - }, - toggle: function() { - $.event('CloseMenu'); - $.set('Header catalog links', this.checked); - return CatalogLinks.set(this.checked); - }, - set: function(useCatalog) { - var a, board, generateURL, path, _i, _len, _ref, _ref1; - path = useCatalog ? 'catalog' : ''; - generateURL = useCatalog && Conf['External Catalog'] ? CatalogLinks.external : function(board) { - return a.href = "/" + board + "/" + path; - }; - _ref = $$("#board-list a:not(.catalog), #boardNavDesktopFoot a"); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - a = _ref[_i]; - 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') || $.hasClass(a, 'external')) { - continue; - } - a.href = generateURL(board); - } - return CatalogLinks.el.title = "Turn catalog links " + (useCatalog ? 'off' : 'on') + "."; - }, - external: function(board) { - if (board === 'a' || board === 'c' || board === 'g' || board === 'co' || board === 'k' || board === 'm' || board === 'o' || board === 'p' || board === 'v' || board === 'vg' || board === 'w' || board === 'cm' || board === '3' || board === 'adv' || board === 'an' || board === 'cgl' || board === 'ck' || board === 'diy' || board === 'fa' || board === 'fit' || board === 'int' || board === 'jp' || board === 'mlp' || board === 'lit' || board === 'mu' || board === 'n' || board === 'po' || board === 'sci' || board === 'toy' || board === 'trv' || board === 'tv' || board === 'vp' || board === 'x' || board === 'q') { - return "http://catalog.neet.tv/" + board; - } else { - return "/" + board + "/catalog"; - } - } - }; - - CustomCSS = { - init: function() { - if (!Conf['Custom CSS']) { - return; - } - return this.addStyle(); - }, - addStyle: function() { - return this.style = $.addStyle(Conf['usercss'], 'CustomCSS'); - }, - rmStyle: function() { - if (this.style) { - $.rm(this.style); - return delete this.style; - } - }, - update: function() { - if (!this.style) { - return this.addStyle(); - } - return this.style.textContent = Conf['usercss']; - } - }; - - Dice = { - init: function() { - if (g.BOARD.ID !== 'tg' || !Conf['Show Dice Roll']) { - return; - } - return Post.callbacks.push({ - name: 'Show Dice Roll', - cb: this.node - }); - }, - node: function() { - var dicestats, roll, _ref; - if (this.isClone || !(dicestats = (_ref = this.info.email) != null ? _ref.match(/dice[+\s](\d+)d(\d+)/) : void 0)) { - return; - } - roll = $('b', this.nodes.comment).firstChild; - return roll.data = "Rolled " + dicestats[1] + "d" + dicestats[2] + ": " + (roll.data.slice(7)); - } - }; - - ExpandComment = { - init: function() { - if (g.VIEW !== 'index' || !Conf['Comment Expansion'] || Conf['JSON Navigation']) { - return; - } - if (g.BOARD.ID === 'g') { - this.callbacks.push(Fourchan.code); - } - if (g.BOARD.ID === 'sci') { - this.callbacks.push(Fourchan.math); - } - return Post.callbacks.push({ - name: 'Comment Expansion', - cb: this.node - }); - }, - node: function() { - var a; - if (a = $('.abbr > a:not([onclick])', this.nodes.comment)) { - return $.on(a, 'click', ExpandComment.cb); - } - }, - callbacks: [], - cb: function(e) { - e.preventDefault(); - return ExpandComment.expand(Get.postFromNode(this)); - }, - expand: function(post) { - var a; - if (post.nodes.longComment && !post.nodes.longComment.parentNode) { - $.replace(post.nodes.shortComment, post.nodes.longComment); - post.nodes.comment = post.nodes.longComment; - return; - } - if (!(a = $('.abbr > a', post.nodes.comment))) { - return; - } - a.textContent = "Post No." + post + " Loading..."; - return $.cache("//a.4cdn.org" + (a.pathname.split('/').splice(0, 4).join('/')) + ".json", function() { - return ExpandComment.parse(this, a, post); - }); - }, - contract: function(post) { - var a; - if (!post.nodes.shortComment) { - return; - } - a = $('.abbr > a', post.nodes.shortComment); - a.textContent = 'here'; - $.replace(post.nodes.longComment, post.nodes.shortComment); - return post.nodes.comment = post.nodes.shortComment; - }, - parse: function(req, a, post) { - var callback, clone, comment, href, postObj, posts, quote, spoilerRange, status, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; - status = req.status; - if (status !== 200 && status !== 304) { - a.textContent = "Error " + req.statusText + " (" + status + ")"; - return; - } - posts = req.response.posts; - if (spoilerRange = posts[0].custom_spoiler) { - Build.spoilerRange[g.BOARD] = spoilerRange; - } - for (_i = 0, _len = posts.length; _i < _len; _i++) { - postObj = posts[_i]; - if (postObj.no === post.ID) { - break; - } - } - if (postObj.no !== post.ID) { - a.textContent = "Post No." + post + " not found."; - return; - } - comment = post.nodes.comment; - clone = comment.cloneNode(false); - clone.innerHTML = postObj.com; - _ref = $$('.quotelink', clone); - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - quote = _ref[_j]; - href = quote.getAttribute('href'); - if (href[0] === '/') { - continue; - } - if (href[0] === '#') { - quote.href = "" + (a.pathname.split('/').splice(0, 4).join('/')) + href; - } else { - quote.href = "" + (a.pathname.split('/').splice(0, 3).join('/')) + "/" + href; - } - } - post.nodes.shortComment = comment; - $.replace(comment, clone); - post.nodes.comment = post.nodes.longComment = clone; - post.parseComment(); - post.parseQuotes(); - _ref1 = ExpandComment.callbacks; - for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { - callback = _ref1[_k]; - callback.call(post); - } - } - }; - - ExpandThread = { - statuses: {}, - init: function() { - if (g.VIEW === 'thread' || !Conf['Thread Expansion']) { - return; - } - return $.on(d, (Conf['JSON Navigation'] ? 'IndexRefresh' : '4chanXInitFinished'), this.onIndexRefresh); - }, - setButton: function(thread) { - var a, summary; - if (!(summary = $.x('following-sibling::*[contains(@class,"summary")][1]', thread.OP.nodes.root))) { - return; - } - a = $.el('a', { - textContent: ExpandThread.text.apply(ExpandThread, ['+'].concat(__slice.call(summary.textContent.match(/\d+/g)))), - href: "res/" + thread.ID, - className: 'summary' - }); - $.on(a, 'click', ExpandThread.cbToggle); - return $.replace(summary, a); - }, - disconnect: function() { - this.refresh(); - return $.off(d, 'IndexRefresh', this.onIndexRefresh); - }, - refresh: function(disconnect) { - var status, threadID, _ref, _ref1; - if (g.VIEW === 'thread' || !Conf['Thread Expansion']) { - return; - } - _ref = ExpandThread.statuses; - for (threadID in _ref) { - status = _ref[threadID]; - if ((_ref1 = status.req) != null) { - _ref1.abort(); - } - delete ExpandThread.statuses[threadID]; - } - }, - onIndexRefresh: function() { - ExpandThread.refresh(); - return g.BOARD.threads.forEach(function(thread) { - return ExpandThread.setButton(thread); - }); - }, - text: function(status, posts, files) { - return ("" + status + " " + posts + " post" + (posts > 1 ? 's' : '')) + (+files ? " and " + files + " image repl" + (files > 1 ? 'ies' : 'y') : "") + (" " + (status === '-' ? 'shown' : 'omitted') + "."); - }, - cbToggle: function(e) { - if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) { - return; - } - e.preventDefault(); - return ExpandThread.toggle(Get.threadFromNode(this)); - }, - toggle: function(thread) { - var a, threadRoot; - threadRoot = thread.OP.nodes.root.parentNode; - if (!(a = $('.summary', threadRoot))) { - return; - } - if (thread.ID in ExpandThread.statuses) { - return ExpandThread.contract(thread, a, threadRoot); - } else { - return ExpandThread.expand(thread, a, threadRoot); - } - }, - expand: function(thread, a, threadRoot) { - var status; - ExpandThread.statuses[thread] = status = {}; - a.textContent = ExpandThread.text.apply(ExpandThread, ['...'].concat(__slice.call(a.textContent.match(/\d+/g)))); - return status.req = $.cache("//a.4cdn.org/" + thread.board + "/thread/" + thread + ".json", function() { - delete status.req; - return ExpandThread.parse(this, thread, a); - }); - }, - contract: function(thread, a, threadRoot) { - var filesCount, inlined, num, postsCount, replies, reply, status, _i, _len; - status = ExpandThread.statuses[thread]; - delete ExpandThread.statuses[thread]; - if (status.req) { - status.req.abort(); - if (a) { - a.textContent = ExpandThread.text.apply(ExpandThread, ['+'].concat(__slice.call(a.textContent.match(/\d+/g)))); - } - return; - } - replies = $$('.thread > .replyContainer', threadRoot); - if (Conf['Show Replies']) { - num = (function() { - if (thread.isSticky) { - return 1; - } else { - switch (g.BOARD.ID) { - case 'b': - case 'vg': - return 3; - case 't': - return 1; - default: - return 5; - } - } - })(); - replies = replies.slice(0, -num); - } - postsCount = 0; - filesCount = 0; - for (_i = 0, _len = replies.length; _i < _len; _i++) { - reply = replies[_i]; - if (Conf['Quote Inlining']) { - while (inlined = $('.inlined', reply)) { - inlined.click(); - } - } - postsCount++; - if ('file' in Get.postFromRoot(reply)) { - filesCount++; - } - $.rm(reply); - } - return a.textContent = ExpandThread.text('+', postsCount, filesCount); - }, - parse: function(req, thread, a) { - var filesCount, post, postData, posts, postsCount, postsRoot, root, _i, _len, _ref, _ref1; - if ((_ref = req.status) !== 200 && _ref !== 304) { - a.textContent = "Error " + req.statusText + " (" + req.status + ")"; - return; - } - Build.spoilerRange[thread.board] = req.response.posts[0].custom_spoiler; - posts = []; - postsRoot = []; - filesCount = 0; - _ref1 = req.response.posts; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - postData = _ref1[_i]; - if (postData.no === thread.ID) { - continue; - } - if (post = thread.posts[postData.no]) { - if ('file' in post) { - filesCount++; - } - postsRoot.push(post.nodes.root); - continue; - } - root = Build.postFromObject(postData, thread.board.ID); - post = new Post(root, thread, thread.board); - if ('file' in post) { - filesCount++; - } - posts.push(post); - postsRoot.push(root); - } - Post.callbacks.execute(posts); - $.after(a, postsRoot); - postsCount = postsRoot.length; - return a.textContent = ExpandThread.text('-', postsRoot.length, filesCount); - } - }; - - FileInfo = { - init: function() { - if (!Conf['File Info Formatting']) { - return; - } - return Post.callbacks.push({ - name: 'File Info Formatting', - cb: this.node - }); - }, - node: function() { - if (!this.file || this.isClone) { - return; - } - return this.file.text.innerHTML = "" + (FileInfo.format(Conf['fileInfo'], this)) + ""; - }, - format: function(formatString, post) { - return formatString.replace(/%([A-Za-z])/g, function(s, c) { - if (c in FileInfo.formatters) { - return FileInfo.formatters[c].call(post); - } else { - return s; - } - }); - }, - convertUnit: function(size, unit) { - var i; - if (unit === 'B') { - return "" + (size.toFixed()) + " Bytes"; - } - i = 1 + ['KB', 'MB'].indexOf(unit); - while (i--) { - size /= 1024; - } - size = unit === 'MB' ? Math.round(size * 100) / 100 : size.toFixed(); - return "" + size + " " + unit; - }, - escape: function(name) { - return name.replace(/<|>/g, function(c) { - return c === '<' && '<' || '>'; - }); - }, - formatters: { - t: function() { - return this.file.URL.match(/\d+\..+$/)[0]; - }, - T: function() { - return "" + (FileInfo.formatters.t.call(this)) + ""; - }, - l: function() { - return "" + (FileInfo.formatters.n.call(this)) + ""; - }, - L: function() { - return "" + (FileInfo.formatters.N.call(this)) + ""; - }, - n: function() { - var fullname, shortname; - fullname = this.file.name; - shortname = Build.shortFilename(this.file.name, this.isReply); - if (fullname === shortname) { - return FileInfo.escape(fullname); - } else { - return "" + (FileInfo.escape(shortname)) + "" + (FileInfo.escape(fullname)) + ""; - } - }, - N: function() { - return FileInfo.escape(this.file.name); - }, - p: function() { - if (this.file.isSpoiler) { - return 'Spoiler, '; - } else { - return ''; - } - }, - s: function() { - return this.file.size; - }, - B: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'B'); - }, - K: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'KB'); - }, - M: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'MB'); - }, - r: function() { - return this.file.dimensions || 'PDF'; - } - } - }; - - Flash = { - init: function() { - if (g.BOARD.ID === 'f') { - return $.ready(Flash.initReady); - } - }, - initReady: function() { - var nav, sauceLink, swfName; - $.globalEval('SWFEmbed.init()'); - if (g.VIEW !== 'thread') { - return; - } - swfName = $('.fileText > a'); - nav = $('.navLinks.desktop'); - swfName = swfName.href.replace(/^(.*?)\/f\//g, ""); - sauceLink = $.el('a', { - textContent: 'Check Sauce on SWFCHAN', - href: "http://eye.swfchan.com/search/?q=" + swfName - }); - $.addClass(nav, 'swfSauce'); - $.rmClass(nav, 'navLinks'); - $.rmAll(nav); - return $.add(nav, [$.tn('['), sauceLink, $.tn(']')]); - } - }; - - Fourchan = { - init: function() { - var board; - board = g.BOARD.ID; - if (board === 'g') { - $.globalEval("window.addEventListener('prettyprint', function(e) {\n window.dispatchEvent(new CustomEvent('prettyprint:cb', {\n detail: prettyPrintOne(e.detail)\n }));\n}, false);"); - Post.callbacks.push({ - name: 'Parse /g/ code', - cb: this.code - }); - } - if (board === 'sci') { - $.globalEval("window.addEventListener('jsmath', function(e) {\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(document.getElementById(e.detail));\n } else {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push('ProcessBeforeShowing', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);"); - return Post.callbacks.push({ - name: 'Parse /sci/ math', - cb: this.math - }); - } - }, - code: function() { - var apply, pre, _i, _len, _ref; - if (this.isClone) { - return; - } - apply = function(e) { - return pre.innerHTML = e.detail; - }; - $.on(window, 'prettyprint:cb', apply); - _ref = $$('.prettyprint:not(.prettyprinted)', this.nodes.comment); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - pre = _ref[_i]; - $.event('prettyprint', pre.innerHTML, window); - } - $.off(window, 'prettyprint:cb', apply); - }, - math: function() { - if (this.isClone || !$('.math', this.nodes.comment)) { - return; - } - return $.event('jsmath', this.nodes.post.id, window); - } - }; - - IDColor = { - init: function() { - if (!Conf['Color User IDs']) { - return; - } - this.ids = { - Heaven: [0, 0, 0, '#fff'] - }; - return Post.callbacks.push({ - name: 'Color User IDs', - cb: this.node - }); - }, - node: function() { - var rgb, span, uid; - if (this.isClone || !((uid = this.info.uniqueID) && (span = $('span.hand', this.nodes.uniqueID)))) { - return; - } - rgb = IDColor.ids[uid] || IDColor.compute(uid); - span.style.color = rgb[3]; - span.style.backgroundColor = "rgb(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ")"; - $.addClass(span, 'painted'); - return span.title = 'Highlight posts by this ID'; - }, - compute: function(uid) { - var hash, i, rgb; - i = 1; - hash = uid.charCodeAt(0); - while (i < 8) { - hash = (hash << 5) - hash + uid.charCodeAt(i++); - } - rgb = [(hash >> 24) & 0xFF, (hash >> 16) & 0xFF, (hash >> 8) & 0xFF]; - rgb.push((rgb[0] * 0.299 + rgb[1] * 0.587 + rgb[2] * 0.114) > 125 ? '#000' : '#fff'); - return this.ids[uid] = rgb; - } - }; - - Keybinds = { - init: function() { - var hotkey, init; - if (!Conf['Keybinds']) { - return; - } - for (hotkey in Conf.hotkeys) { - $.sync(hotkey, Keybinds.sync); - } - init = function() { - var node, _i, _len, _ref; - $.off(d, '4chanXInitFinished', init); - $.on(d, 'keydown', Keybinds.keydown); - _ref = $$('[accesskey]'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - node = _ref[_i]; - node.removeAttribute('accesskey'); - } - }; - return $.on(d, '4chanXInitFinished', init); - }, - sync: function(key, hotkey) { - return Conf[hotkey] = key; - }, - keydown: function(e) { - var form, key, notification, notifications, op, searchInput, target, thread, threadRoot, _i, _len, _ref; - if (!(key = Keybinds.keyCode(e))) { - return; - } - target = e.target; - if (target.nodeName === 'EMBED') { - return; - } - if ((_ref = target.nodeName) === 'INPUT' || _ref === 'TEXTAREA') { - if (!/(Esc|Alt|Ctrl|Meta|Shift\+\w{2,})/.test(key)) { - return; - } - } - if (g.VIEW !== 'catalog') { - threadRoot = Nav.getThread(); - if (op = $('.op', threadRoot)) { - thread = Get.postFromNode(op).thread; - } - } - switch (key) { - case Conf['Toggle board list']: - if (Conf['Custom Board Navigation']) { - Header.toggleBoardList(); - } - break; - case Conf['Toggle header']: - Header.toggleBarVisibility(); - break; - case Conf['Open empty QR']: - Keybinds.qr(); - break; - case Conf['Open QR']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.qr(threadRoot); - break; - case Conf['Open settings']: - Settings.open(); - break; - case Conf['Close']: - if ($.id('fourchanx-settings')) { - Settings.close(); - } else if ((notifications = $$('.notification')).length) { - for (_i = 0, _len = notifications.length; _i < _len; _i++) { - notification = notifications[_i]; - $('.close', notification).click(); - } - } else if (QR.nodes) { - if (Conf['Persistent QR']) { - QR.hide(); - } else { - QR.close(); - } - } - break; - case Conf['Spoiler tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('spoiler', target); - break; - case Conf['Code tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('code', target); - break; - case Conf['Eqn tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('eqn', target); - break; - case Conf['Math tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('math', target); - break; - case Conf['Toggle sage']: - if (QR.nodes) { - Keybinds.sage(); - } - break; - case Conf['Submit QR']: - if (QR.nodes && !QR.status()) { - QR.submit(); - } - break; - case Conf['Post Without Name']: - if (QR.nodes && !QR.status()) { - Keybinds.name(); - QR.submit(); - } - break; - case Conf['Update']: - switch (g.VIEW) { - case 'thread': - ThreadUpdater.update(); - break; - case 'index': - if (Conf['JSON Navigation']) { - Index.update(); - } - } - break; - case Conf['Watch']: - if (g.VIEW === 'catalog') { - return; - } - ThreadWatcher.toggle(thread); - break; - case Conf['Expand image']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.img(threadRoot); - break; - case Conf['Expand images']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.img(threadRoot, true); - break; - case Conf['Open Gallery']: - if (g.VIEW === 'catalog') { - return; - } - Gallery.cb.toggle(); - break; - case Conf['fappeTyme']: - if (g.VIEW === 'catalog') { - return; - } - FappeTyme.cb.toggle.call({ - name: 'fappe' - }); - break; - case Conf['werkTyme']: - if (g.VIEW === 'catalog') { - return; - } - FappeTyme.cb.toggle.call({ - name: 'werk' - }); - break; - case Conf['Front page']: - if (Conf['JSON Navigation'] && g.VIEW === 'index') { - Index.userPageNav(1); - } else { - window.location = "/" + g.BOARD + "/"; - } - break; - case Conf['Open front page']: - $.open("/" + g.BOARD + "/"); - break; - case Conf['Next page']: - if (g.VIEW !== 'index') { - return; - } - if (Conf['JSON Navigation']) { - if (Conf['Index Mode'] !== 'all pages') { - $('.next button', Index.pagelist).click(); - } - } else { - if (form = $('.next form')) { - window.location = form.action; - } - } - break; - case Conf['Previous page']: - if (g.VIEW !== 'index') { - return; - } - if (Conf['JSON Navigation']) { - if (Conf['Index Mode'] !== 'all pages') { - $('.prev button', Index.pagelist).click(); - } - } else { - if (form = $('.prev form')) { - window.location = form.action; - } - } - break; - case Conf['Search form']: - if (g.VIEW !== 'index') { - return; - } - searchInput = Conf['JSON Navigation'] ? Index.searchInput : $.id('search-box'); - Header.scrollToIfNeeded(searchInput); - searchInput.click(); - searchInput.focus(); - break; - case Conf['Paged mode']: - if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'paged')) { - return; - } - Index.setIndexMode('paged'); - break; - case Conf['All pages mode']: - if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'all pages')) { - return; - } - Index.setIndexMode('all pages'); - break; - case Conf['Catalog mode']: - if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'catalog')) { - return; - } - Index.setIndexMode('catalog'); - break; - case Conf['Cycle sort type']: - if (g.VIEW !== 'index') { - return; - } - Index.cycleSortType(); - break; - case Conf['Open catalog']: - if (Conf['External Catalog']) { - window.location = CatalogLinks.external(g.BOARD.ID); - } else { - if (!Conf['JSON Navigation']) { - return window.location = "/" + g.BOARD + "/catalog"; - } - if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'catalog')) { - return; - } - Index.setIndexMode('catalog'); - } - break; - case Conf['Next thread']: - if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { - return; - } - Nav.scroll(+1); - break; - case Conf['Previous thread']: - if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { - return; - } - Nav.scroll(-1); - break; - case Conf['Expand thread']: - if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { - return; - } - ExpandThread.toggle(thread); - break; - case Conf['Open thread']: - if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { - return; - } - Keybinds.open(thread); - break; - case Conf['Open thread tab']: - if (g.VIEW !== 'index' || Conf['Index Mode'] === 'catalog') { - return; - } - Keybinds.open(thread, true); - break; - case Conf['Next reply']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.hl(+1, threadRoot); - break; - case Conf['Previous reply']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.hl(-1, threadRoot); - break; - case Conf['Deselect reply']: - if (g.VIEW === 'catalog') { - return; - } - Keybinds.hl(0, threadRoot); - break; - case Conf['Hide']: - PostHiding.toggle(thread.OP); - break; - case Conf['Previous Post Quoting You']: - QuoteMarkers.cb.seek('preceding'); - break; - case Conf['Next Post Quoting You']: - QuoteMarkers.cb.seek('following'); - break; - default: - return; - } - e.preventDefault(); - return e.stopPropagation(); - }, - keyCode: function(e) { - var kc, key; - key = (function() { - switch (kc = e.keyCode) { - case 8: - return ''; - case 13: - return 'Enter'; - case 27: - return 'Esc'; - case 37: - return 'Left'; - case 38: - return 'Up'; - case 39: - return 'Right'; - case 40: - return 'Down'; - default: - if ((48 <= kc && kc <= 57) || (65 <= kc && kc <= 90)) { - return String.fromCharCode(kc).toLowerCase(); - } else { - return null; - } - } - })(); - if (key) { - if (e.altKey) { - key = 'Alt+' + key; - } - if (e.ctrlKey) { - key = 'Ctrl+' + key; - } - if (e.metaKey) { - key = 'Meta+' + key; - } - if (e.shiftKey) { - key = 'Shift+' + key; - } - } - return key; - }, - qr: function(thread) { - if (!QR.postingIsEnabled) { - return; - } - QR.open(); - if (thread != null) { - QR.quote.call($('input', $('.post.highlight', thread) || thread)); - } - QR.nodes.com.focus(); - if (Conf['QR Shortcut']) { - return $.rmClass($('.qr-shortcut'), 'disabled'); - } - }, - tags: function(tag, ta) { - var range, selEnd, selStart, value; - value = ta.value; - selStart = ta.selectionStart; - selEnd = ta.selectionEnd; - ta.value = value.slice(0, selStart) + ("[" + tag + "]") + value.slice(selStart, selEnd) + ("[/" + tag + "]") + value.slice(selEnd); - range = ("[" + tag + "]").length + selEnd; - ta.setSelectionRange(range, range); - return $.event('input', null, ta); - }, - name: function() { - return QR.nodes.name.value = ''; - }, - sage: function() { - var isSage; - isSage = /sage/i.test(QR.nodes.email.value); - return QR.nodes.email.value = isSage ? "" : "sage"; - }, - img: function(thread, all) { - var post; - if (all) { - return ImageExpand.cb.toggleAll(); - } else { - post = Get.postFromNode($('.post.highlight', thread) || $('.op', thread)); - return ImageExpand.toggle(post); - } - }, - open: function(thread, tab) { - var url; - if (g.VIEW !== 'index') { - return; - } - url = Build.path(thread.board.ID, thread.ID); - if (tab) { - return $.open(url); - } else { - return location.href = url; - } - }, - hl: function(delta, thread) { - var axis, height, next, postEl, replies, reply, root, _i, _len; - postEl = $('.reply.highlight', thread); - if (!delta) { - if (postEl) { - $.rmClass(postEl, 'highlight'); - } - return; - } - if (postEl) { - height = postEl.getBoundingClientRect().height; - if (Header.getTopOf(postEl) >= -height && Header.getBottomOf(postEl) >= -height) { - root = postEl.parentNode; - axis = delta === +1 ? 'following' : 'preceding'; - if (!(next = $.x("" + axis + "-sibling::div[contains(@class,'replyContainer') and not(@hidden) and not(child::div[@class='stub'])][1]/child::div[contains(@class,'reply')]", root))) { - return; - } - Header.scrollToIfNeeded(next, delta === +1); - this.focus(next); - $.rmClass(postEl, 'highlight'); - return; - } - $.rmClass(postEl, 'highlight'); - } - replies = $$('.reply', thread); - if (delta === -1) { - replies.reverse(); - } - for (_i = 0, _len = replies.length; _i < _len; _i++) { - reply = replies[_i]; - if (delta === +1 && Header.getTopOf(reply) > 0 || delta === -1 && Header.getBottomOf(reply) > 0) { - this.focus(reply); - return; - } - } - }, - focus: function(post) { - return $.addClass(post, 'highlight'); - } - }; - - Nav = { - init: function() { - var next, prev; - switch (g.VIEW) { - case 'index': - if (!Conf['Index Navigation']) { - return; - } - break; - case 'thread': - if (!Conf['Reply Navigation']) { - return; - } - } - prev = $.el('a', { - href: 'javascript:;', - id: 'navPrev' - }); - next = $.el('a', { - href: 'javascript:;', - id: 'navNext' - }); - Header.addShortcut(prev, true); - Header.addShortcut(next, true); - $.on(prev, 'click', this.prev); - return $.on(next, 'click', this.next); - }, - prev: function() { - if (g.VIEW === 'thread') { - return window.scrollTo(0, 0); - } else { - return Nav.scroll(-1); - } - }, - next: function() { - if (g.VIEW === 'thread') { - return window.scrollTo(0, d.body.scrollHeight); - } else { - return Nav.scroll(+1); - } - }, - getThread: function() { - var threadRoot, _i, _len, _ref; - _ref = $$('.thread'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - threadRoot = _ref[_i]; - if (Header.getTopOf(threadRoot) >= -threadRoot.getBoundingClientRect().height) { - return threadRoot; - } - } - return $('.board'); - }, - scroll: function(delta) { - var axis, next, thread, top; - thread = Nav.getThread(); - axis = delta === +1 ? 'following' : 'preceding'; - if (next = $.x("" + axis + "-sibling::div[contains(@class,'thread') and not(@hidden)][1]", thread)) { - top = Header.getTopOf(thread); - if (delta === +1 && top < 5 || delta === -1 && top > -5) { - thread = next; - } - } - return Header.scrollTo(thread); - } - }; - - RelativeDates = { - INTERVAL: $.MINUTE / 2, - init: function() { - switch (g.VIEW) { - case 'index': - this.flush(); - $.on(d, 'visibilitychange', this.flush); - if (!Conf['Relative Post Dates']) { - return; - } - break; - case 'thread': - if (!Conf['Relative Post Dates']) { - return; - } - this.flush(); - $.on(d, 'visibilitychange ThreadUpdate', this.flush); - break; - default: - return; - } - return Post.callbacks.push({ - name: 'Relative Post Dates', - cb: this.node - }); - }, - node: function() { - var dateEl; - if (this.isClone) { - return; - } - dateEl = this.nodes.date; - dateEl.title = dateEl.textContent; - return RelativeDates.update(this); - }, - relative: function(diff, now, date) { - var days, months, number, rounded, unit, years; - unit = (number = diff / $.DAY) >= 1 ? (years = now.getYear() - date.getYear(), months = now.getMonth() - date.getMonth(), days = now.getDate() - date.getDate(), years > 1 ? (number = years - (months < 0 || months === 0 && days < 0), 'year') : years === 1 && (months > 0 || months === 0 && days >= 0) ? (number = years, 'year') : (months = (months + 12) % 12) > 1 ? (number = months - (days < 0), 'month') : months === 1 && days >= 0 ? (number = months, 'month') : 'day') : (number = diff / $.HOUR) >= 1 ? 'hour' : (number = diff / $.MINUTE) >= 1 ? 'minute' : (number = Math.max(0, diff) / $.SECOND, 'second'); - rounded = Math.round(number); - if (rounded !== 1) { - unit += 's'; - } - return "" + rounded + " " + unit + " ago"; - }, - stale: [], - flush: function() { - var data, now, _i, _len, _ref; - if (d.hidden) { - return; - } - now = new Date(); - _ref = RelativeDates.stale; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - data = _ref[_i]; - RelativeDates.update(data, now); - } - RelativeDates.stale = []; - clearTimeout(RelativeDates.timeout); - return RelativeDates.timeout = setTimeout(RelativeDates.flush, RelativeDates.INTERVAL); - }, - update: function(data, now) { - var date, diff, isPost, relative, singlePost, _i, _len, _ref; - isPost = data instanceof Post; - date = isPost ? data.info.date : new Date(+data.dataset.utc); - now || (now = new Date()); - diff = now - date; - relative = RelativeDates.relative(diff, now, date); - if (isPost) { - _ref = [data].concat(data.clones); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - singlePost = _ref[_i]; - singlePost.nodes.date.firstChild.textContent = relative; - } - } else { - data.firstChild.textContent = relative; - } - return RelativeDates.setOwnTimeout(diff, data); - }, - setOwnTimeout: function(diff, data) { - var delay; - delay = diff < $.MINUTE ? $.SECOND - (diff + $.SECOND / 2) % $.SECOND : diff < $.HOUR ? $.MINUTE - (diff + $.MINUTE / 2) % $.MINUTE : diff < $.DAY ? $.HOUR - (diff + $.HOUR / 2) % $.HOUR : $.DAY - (diff + $.DAY / 2) % $.DAY; - return setTimeout(RelativeDates.markStale, delay, data); - }, - markStale: function(data) { - if (__indexOf.call(RelativeDates.stale, data) >= 0) { - return; - } - if (data instanceof Post && !g.posts[data.fullID]) { - return; - } - return RelativeDates.stale.push(data); - } - }; - - RemoveSpoilers = { - init: function() { - if (Conf['Reveal Spoilers']) { - $.addClass(doc, 'reveal-spoilers'); - } - if (Conf['Remove Spoilers']) { - return $.addClass(doc, 'remove-spoilers'); - } - } - }; - - Report = { - init: function() { - if (!/report/.test(location.search)) { - return; - } - return $.asap((function() { - return $.id('recaptcha_response_field'); - }), Report.ready); - }, - ready: function() { - var field; - field = $.id('recaptcha_response_field'); - $.on(field, 'keydown', function(e) { - if (e.keyCode === 8 && !field.value) { - return $.globalEval('Recaptcha.reload("t")'); - } - }); - return $.on($('form'), 'submit', function(e) { - var response; - e.preventDefault(); - response = field.value.trim(); - if (!/\s|^\d+$/.test(response)) { - field.value = "" + response + " " + response; - } - return this.submit(); - }); - } - }; - - Time = { - init: function() { - if (!Conf['Time Formatting']) { - return; - } - return Post.callbacks.push({ - name: 'Time Formatting', - cb: this.node - }); - }, - node: function() { - if (this.isClone) { - return; - } - return this.nodes.date.textContent = Time.format(Conf['time'], this.info.date); - }, - format: function(formatString, date) { - return formatString.replace(/%([A-Za-z])/g, function(s, c) { - if (c in Time.formatters) { - return Time.formatters[c].call(date); - } else { - return s; - } - }); - }, - day: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - zeroPad: function(n) { - if (n < 10) { - return "0" + n; - } else { - return n; - } - }, - formatters: { - a: function() { - return Time.day[this.getDay()].slice(0, 3); - }, - A: function() { - return Time.day[this.getDay()]; - }, - b: function() { - return Time.month[this.getMonth()].slice(0, 3); - }, - B: function() { - return Time.month[this.getMonth()]; - }, - d: function() { - return Time.zeroPad(this.getDate()); - }, - e: function() { - return this.getDate(); - }, - H: function() { - return Time.zeroPad(this.getHours()); - }, - I: function() { - return Time.zeroPad(this.getHours() % 12 || 12); - }, - k: function() { - return this.getHours(); - }, - l: function() { - return this.getHours() % 12 || 12; - }, - m: function() { - return Time.zeroPad(this.getMonth() + 1); - }, - M: function() { - return Time.zeroPad(this.getMinutes()); - }, - p: function() { - if (this.getHours() < 12) { - return 'AM'; - } else { - return 'PM'; - } - }, - P: function() { - if (this.getHours() < 12) { - return 'am'; - } else { - return 'pm'; - } - }, - S: function() { - return Time.zeroPad(this.getSeconds()); - }, - y: function() { - return this.getFullYear().toString().slice(2); - }, - Y: function() { - return this.getFullYear(); - } - } - }; - Navigate = { path: window.location.pathname, init: function() { @@ -16909,7 +16991,9 @@ Settings.dialog = dialog = $.el('div', { id: 'appchanx-settings', "class": 'dialog', - innerHTML: "
" + innerHTML: { + innerHTML: "\r
\r
\r" + } }); Settings.overlay = overlay = $.el('div', { id: 'overlay' @@ -17099,7 +17183,9 @@ }, filter: function(section) { var select; - section.innerHTML = "
"; + section.innerHTML = { + innerHTML: "\r
" + }; select = $('select', section); $.on(select, 'change', Settings.selectFilter); return Settings.selectFilter.call(select); @@ -17121,11 +17207,15 @@ $.add(div, ta); return; } - return div.innerHTML = "
Filter is disabled.

Use regular expressions, one per line.
Lines starting with a # will be ignored.
For example, /weeaboo/i will filter posts containing the string `weeaboo`, case-insensitive.
MD5 filtering uses exact string matching, not regular expressions.

    You can use these settings with each regular expression, separate them with semicolons:
  • Per boards, separate them with commas. It is global if not specified.
    For example: boards:a,jp;.
  • Filter OPs only along with their threads (`only`), replies only (`no`), or both (`yes`, this is default).
    For example: op:only;, op:no; or op:yes;.
  • Overrule the `Show Stubs` setting if specified: create a stub (`yes`) or not (`no`).
    For example: stub:yes; or stub:no;.
  • Highlight instead of hiding. You can specify a class name to use with a userstyle.
    For example: highlight; or highlight:wallpaper;.
  • Highlighted OPs will have their threads put on top of the board index by default.
    For example: top:yes; or top:no;.
"; + return div.innerHTML = { + innerHTML: "
Filter is disabled.
\r

\rUse regular expressions, one per line.
\rLines starting with a # will be ignored.
\rFor example, /weeaboo/i will filter posts containing the string `weeaboo`, case-insensitive.
\rMD5 filtering uses exact string matching, not regular expressions.\r

\r
    You can use these settings with each regular expression, separate them with semicolons:\r
  • \rPer boards, separate them with commas. It is global if not specified.
    \rFor example: boards:a,jp;.\r
  • \r
  • \rFilter OPs only along with their threads (`only`), replies only (`no`), or both (`yes`, this is default).
    \rFor example: op:only;, op:no; or op:yes;.\r
  • \r
  • \rOverrule the `Show Stubs` setting if specified: create a stub (`yes`) or not (`no`).
    \rFor example: stub:yes; or stub:no;.\r
  • \r
  • \rHighlight instead of hiding. You can specify a class name to use with a userstyle.
    \rFor example: highlight; or highlight:wallpaper;.\r
  • \r
  • \rHighlighted OPs will have their threads put on top of the board index by default.
    \rFor example: top:yes; or top:no;.\r
  • \r
\r" + }; }, sauce: function(section) { var ta; - section.innerHTML = "
Sauce is disabled.
Lines starting with a # will be ignored.
You can specify a display text by appending ;text:[text] to the URL.
    These parameters will be replaced by their corresponding values:
  • %TURL: Thumbnail URL.
  • %URL: Full image URL.
  • %MD5: MD5 hash.
  • %name: Original file name.
  • %board: Current board.
"; + section.innerHTML = { + innerHTML: "
Sauce is disabled.
\r
Lines starting with a # will be ignored.
\r
You can specify a display text by appending ;text:[text] to the URL.
\r
    These parameters will be replaced by their corresponding values:\r
  • %TURL: Thumbnail URL.
  • \r
  • %URL: Full image URL.
  • \r
  • %MD5: MD5 hash.
  • \r
  • %name: Original file name.
  • \r
  • %board: Current board.
  • \r
\r\r" + }; ta = $('textarea', section); $.get('sauces', Conf['sauces'], function(item) { return ta.value = item['sauces'].replace(/\$\d/g, function(c) { @@ -17147,7 +17237,9 @@ }, advanced: function(section) { var archBoards, boardID, boardOptions, boardSelect, boards, event, files, i, input, inputs, item, items, name, o, row, rows, software, ta, table, withCredentials, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref, _ref1, _ref2, _ref3, _ref4, _ref5; - section.innerHTML = "
Archiver
404 Redirect is disabled.
Thread redirectionPost fetchingFile redirection
Disabled selections indicate that only one archive is available for that board and redirection type.
Custom Board Navigation
New lines will be converted into spaces.

In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@).
Board link: g
Title link: g-title
Board link (Replace with title when on that board): g-replace
Full text link: g-full
Custom text link: g-text:\"Install Gentoo\"
External link: external-text:\"Google\",\"http://www.google.com\"
Index mode: g-mode:\"type\" where type is paged, all threads or catalog
Index sort: g-sort:\"type\" where type is bump order, last reply, creation date, reply count or file countCombinations are possible: g-text:\"VIP Catalog\"-mode:\"catalog\"-sort:\"creation date\"
Full board list toggle: toggle-all

[ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h-mode:\"catalog\"-sort:\"file count\"] [t-text:\"Piracy\"]
will give you
[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
if you are on /g/.
Time Formatting is disabled.
:
Day: %a, %A, %d, %e
Month: %m, %b, %B
Year: %y, %Y
Hour: %k, %H, %l, %I, %p, %P
Minute: %M
Second: %S
Quote Backlinks formatting is disabled.
:
File Info Formatting is disabled.
:
Link: %l (truncated), %L (untruncated), %T (Unix timestamp)
Original file name: %n (truncated), %N (untruncated), %t (Unix timestamp)
Spoiler indicator: %p
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
Resolution: %r (Displays 'PDF' for PDF files)
Quick Reply Personas

One item per line.
Items will be added in the relevant input's auto-completion list.
Password items will always be used, since there is no password input.
Lines starting with a # will be ignored.

    You can use these settings with each item, separate them with semicolons:
  • Possible items are: name, options (or equivalently email), subject and password.
  • Wrap values of items with quotes, like this: options:\"sage\".
  • Force values as defaults with the always keyword, for example: options:\"sage\";always.
  • Select specific boards for an item, separated with commas, for example: options:\"sage\";boards:jp;always.
Unread Favicon is disabled.
Thread Updater is disabled.
Interval:
Custom CSS
"; + section.innerHTML = { + innerHTML: "
\rArchiver\r
404 Redirect is disabled.
\r
\r\r\r\r\r\r\r\r
Thread redirectionPost fetchingFile redirection
\rDisabled selections indicate that only one archive is available for that board and redirection type.\r
\r
\rCustom Board Navigation\r
\rNew lines will be converted into spaces.

\r
In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@).
\r
Board link: g
\r
Title link: g-title
\r
Board link (Replace with title when on that board): g-replace
\r
Full text link: g-full
\r
Custom text link: g-text:\"Install Gentoo\"
\r
External link: external-text:\"Google\",\"http://www.google.com\"
\r
Index mode: g-mode:\"type\" where type is paged, all threads or catalog
\r
Index sort: g-sort:\"type\" where type is bump order, last reply, creation date, reply count or file countCombinations are possible: g-text:\"VIP Catalog\"-mode:\"catalog\"-sort:\"creation date\"
\r
Full board list toggle: toggle-all
\r
\r
\r[ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h-mode:\"catalog\"-sort:\"file count\"] [t-text:\"Piracy\"]
\rwill give you
\r[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
\rif you are on /g/.\r
\r
\r
\rTime Formatting is disabled.\r
:
\r\r
Day: %a, %A, %d, %e
\r
Month: %m, %b, %B
\r
Year: %y, %Y
\r
Hour: %k, %H, %l, %I, %p, %P
\r
Minute: %M
\r
Second: %S
\r
\r
\rQuote Backlinks formatting is disabled.\r
:
\r
\r
\rFile Info Formatting is disabled.\r
:
\r
Link: %l (truncated), %L (untruncated), %T (Unix timestamp)
\r
Original file name: %n (truncated), %N (untruncated), %t (Unix timestamp)
\r
Spoiler indicator: %p
\r
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
\r
Resolution: %r (Displays 'PDF' for PDF files)
\r
\r
\rQuick Reply Personas\r\r

\rOne item per line.
\rItems will be added in the relevant input's auto-completion list.
\rPassword items will always be used, since there is no password input.
\rLines starting with a # will be ignored.\r

\r
    You can use these settings with each item, separate them with semicolons:\r
  • Possible items are: name, options (or equivalently email), subject and password.
  • \r
  • Wrap values of items with quotes, like this: options:\"sage\".
  • \r
  • Force values as defaults with the always keyword, for example: options:\"sage\";always.
  • \r
  • Select specific boards for an item, separated with commas, for example: options:\"sage\";boards:jp;always.
  • \r
\r
\r
\rUnread Favicon is disabled.\r\r\r
\r
\rThread Updater is disabled.\r
\rInterval: \r
\r
\r
\r Custom CSS\r
\r\r\r
\r
\r" + }; items = {}; inputs = {}; _ref = ['boardnav', 'time', 'backlink', 'fileInfo', 'favicon', 'usercss']; @@ -17342,7 +17434,9 @@ }, keybinds: function(section) { var arr, input, inputs, items, key, tbody, tr, _ref; - section.innerHTML = "
Keybinds are disabled.
Allowed keys: a-z, 0-9, Ctrl, Shift, Alt, Meta, Enter, Esc, Up, Down, Right, Left.
Press Backspace to disable a keybind.
ActionsKeybinds
"; + section.innerHTML = { + innerHTML: "
Keybinds are disabled.
\r
Allowed keys: a-z, 0-9, Ctrl, Shift, Alt, Meta, Enter, Esc, Up, Down, Right, Left.
\r
Press Backspace to disable a keybind.
\r\r\r
ActionsKeybinds
" + }; tbody = $('tbody', section); items = {}; inputs = {}; diff --git a/builds/updates.xml b/builds/updates.xml deleted file mode 100644 index 786a7fdf3..000000000 --- a/builds/updates.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/package.json b/package.json index 37f04506e..75b92a439 100644 --- a/package.json +++ b/package.json @@ -19,15 +19,14 @@ ], "excludes": [ "*://blog.4chan.org/*", - "*://dis.4chan.org/*", - "*://a.4cdn.org/*" + "*://dis.4chan.org/*" ], "files": { "metajs": "appchan-x.meta.js", "userjs": "appchan-x.user.js" }, "min": { - "chrome": "33", + "chrome": "32", "firefox": "26", "greasemonkey": "1.14" } @@ -53,7 +52,9 @@ "author": "Zixaphir ", "contributors": [ "Nicolas Stepien ", - "James Campos " + "James Campos ", + "seaweedchan ", + "ccd0" ], "license": "MIT", "readmeFilename": "README.md", diff --git a/src/Archive/Redirect.coffee b/src/Archive/Redirect.coffee index c058a61d2..892078ef3 100755 --- a/src/Archive/Redirect.coffee +++ b/src/Archive/Redirect.coffee @@ -53,7 +53,10 @@ Redirect = post: (archive, {boardID, postID}) -> # For fuuka-based archives: # https://github.com/eksopl/fuuka/issues/27 - URL = new String "#{Redirect.protocol archive}#{archive.domain}/_/api/chan/post/?board=#{boardID}&num=#{postID}" + protocol = Redirect.protocol archive + URL = new String "#{protocol}#{archive.domain}/_/api/chan/post/?board=#{boardID}&num=#{postID}" + return '' unless Redirect.securityCheck URL + URL.archive = archive URL @@ -76,3 +79,17 @@ Redirect = else "#{boardID}/?task=search2&search_#{if type is 'image' then 'media_hash' else type}=#{value}" "#{Redirect.protocol archive}#{archive.domain}/#{path}" + + securityCheck: (URL) -> + /^https:\/\//.test(URL) or + location.protocol is 'http:' or + Conf['Except Archives from Encryption'] + + navigate: (URL, alternative) -> + if URL and ( + Redirect.securityCheck(URL) or + confirm "Redirect to #{URL}?\n\nYour connection will not be encrypted." + ) + location.replace URL + else if alternative + location.replace alternative \ No newline at end of file diff --git a/src/Archive/archives.json b/src/Archive/archives.json index a9f08fbd1..571df5359 100644 --- a/src/Archive/archives.json +++ b/src/Archive/archives.json @@ -5,7 +5,7 @@ "http": false, "https": true, "software": "foolfuuka", - "boards": ["a", "biz", "c", "co", "diy", "gd", "h", "i", "int", "jp", "k", "m", "mlp", "out", "po", "r9k", "s4s", "sci", "sp", "tg", "tv", "u", "v", "vg", "vp", "vr", "wsg"], + "boards": ["a", "biz", "c", "co", "diy", "gd", "h", "i", "int", "jp", "k", "m", "mlp", "out", "po", "r9k", "s4s", "sci", "tg", "tv", "u", "v", "vg", "vp", "vr", "wsg"], "files": ["a", "biz", "c", "co", "diy", "gd", "h", "i", "jp", "k", "m", "mlp", "po", "s4s", "sci", "tg", "u", "v", "vg", "vp", "vr", "wsg"] }, { "uid": 3, @@ -53,12 +53,13 @@ "boards": ["asp", "cm", "h", "hc", "hm", "n", "p", "r", "s", "soc", "y"], "files": ["asp", "cm", "h", "hc", "hm", "n", "p", "r", "s", "soc", "y"] }, { - "uid": 17, + "uid": 21, "name": "imcute", "domain": "imcute.yt", "http": true, "https": false, "software": "foolfuuka", "boards": ["an", "fit", "gif", "int", "mlp", "out", "r9k", "toy"], - "files": ["an", "fit", "gif", "int", "mlp", "out", "r9k", "toy"] + "files": ["an", "fit", "gif", "int", "mlp", "out", "r9k", "toy"], + "imagehosts": ["http://imcute.yt/"] }] diff --git a/src/Filtering/Anonymize.coffee b/src/Filtering/Anonymize.coffee index 5b9f4e6a1..915361dc6 100755 --- a/src/Filtering/Anonymize.coffee +++ b/src/Filtering/Anonymize.coffee @@ -1,10 +1,12 @@ Anonymize = init: -> - return if !Conf['Anonymize'] + return unless g.VIEW in ['index', 'thread', 'archive'] and Conf['Anonymize'] + return @archive() if g.VIEW is 'archive' Post.callbacks.push name: 'Anonymize' cb: @node + node: -> return if @info.capcode or @isClone {name, tripcode, email} = @nodes @@ -16,3 +18,8 @@ Anonymize = if @info.email $.replace email, name delete @nodes.email + + archive: -> + $.ready -> + name.textContent = 'Anonymous' for name in $$ '.name' + $.rm trip for trip in $$ '.postertrip' \ No newline at end of file diff --git a/src/Filtering/Filter.coffee b/src/Filtering/Filter.coffee index 7231f44f0..e7bcd4808 100755 --- a/src/Filtering/Filter.coffee +++ b/src/Filtering/Filter.coffee @@ -1,21 +1,21 @@ Filter = filters: {} init: -> - return if !Conf['Filter'] + return unless g.VIEW in ['index', 'thread'] and Conf['Filter'] unless Conf['Filtered Backlinks'] $.addClass doc, 'hide-backlinks' for key of Config.filter @filters[key] = [] - for filter in Conf[key].split '\n' - continue if filter[0] is '#' + for line in Conf[key].split '\n' + continue if line[0] is '#' - unless regexp = filter.match /\/(.+)\/(\w*)/ + unless regexp = line.match /\/(.+)\/(\w*)/ continue # Don't mix up filter flags with the regular expression. - filter = filter.replace regexp[0], '' + filter = line.replace regexp[0], '' # Do not add this filter to the list if it's not a global one # and it's not specifically applicable to the current board. @@ -33,7 +33,11 @@ Filter = regexp = RegExp regexp[1], regexp[2] catch err # I warned you, bro. - new Notice 'warning', err.message, 60 + new Notice 'warning', [ + $.tn "Invalid #{key} filter: " + line, + $.el 'br' + $.tn err.message + ], 60 continue # Filter OPs along with their threads, replies only, or both. @@ -60,18 +64,7 @@ Filter = top = filter.match(/top:(yes|no)/)?[1] or 'yes' top = top is 'yes' # Turn it into a boolean - @filters[key].push { - hide: !hl - op: op - stub: stub - class: hl - top: top - match: regexp - test: if typeof regexp is 'string' - Filter.stringTest # MD5 checking - else - Filter.regexpTest - } + @filters[key].push @createFilter regexp, op, stub, hl, top # Only execute filter types that contain valid filters. unless @filters[key].length @@ -82,25 +75,41 @@ Filter = name: 'Filter' cb: @node + createFilter: (regexp, op, stub, hl, top) -> + test = + if typeof regexp is 'string' + # MD5 checking + Filter.stringTest + else + Filter.regexpTest + + settings = + hide: !hl + stub: stub + class: hl + top: top + + (value, isReply) -> return settings if Filter.test(test, value, isReply) + node: -> - return if @isClone + return if @isClone or @isFetchedQuote for key of Filter.filters value = Filter[key] @ # Continue if there's nothing to filter (no tripcode for example). continue if value is false - for obj in Filter.filters[key] - unless Filter.test obj, value, @isReply + for filter in Filter.filters[key] + unless result = filter value, @isReply continue # Hide - if obj.hide + if result.hide continue unless @isReply or g.VIEW is 'index' - @hide "Hidden by filtering the #{key}: #{obj.match}", obj.stub + @hide "Hidden by filtering the #{key}: #{result.match}", result.stub return # Highlight - @highlight "Highlighted by filtering the #{key}: #{obj.match}", obj.class, obj.top + @highlight "Highlighted by filtering the #{key}: #{result.match}", result.class, result.top stringTest: (string, value) -> string is value @@ -112,6 +121,7 @@ Filter = unless test match, value return false true + name: (post) -> if 'name' of post.info return post.info.name @@ -128,10 +138,6 @@ Filter = if 'capcode' of post.info return post.info.capcode false - email: (post) -> - if 'email' of post.info - return post.info.email - false subject: (post) -> if 'subject' of post.info return post.info.subject or false @@ -151,7 +157,7 @@ Filter = dimensions: (post) -> {file} = post if file and (file.isImage or file.isVideo) - return post.file.dimensions + return file.dimensions false filesize: (post) -> if post.file @@ -164,7 +170,7 @@ Filter = menu: init: -> - return if !Conf['Menu'] or !Conf['Filter'] + return unless g.VIEW in ['index', 'thread'] and Conf['Menu'] and Conf['Filter'] div = $.el 'div', textContent: 'Filter' @@ -182,7 +188,6 @@ Filter = ['Unique ID', 'uniqueID'] ['Tripcode', 'tripcode'] ['Capcode', 'capcode'] - ['E-mail', 'email'] ['Subject', 'subject'] ['Comment', 'comment'] ['Flag', 'flag']