From f067d990c6ab6995a2033d88f5459dee7bb5c9bc Mon Sep 17 00:00:00 2001 From: Zixaphir Date: Tue, 7 Jan 2014 13:37:14 -0700 Subject: [PATCH] Start work on more or less JSONing everything Obviously to start, I want to make adding and removing callbacks simpler, because I'm going to need to be disabling and enabling features on the fly quite a lot, I'm guessing. --- builds/4chan-X.user.js | 108 +++++++++++++++++--------------- builds/crx/script.js | 108 +++++++++++++++++--------------- src/General/Main.coffee | 32 ++-------- src/General/lib/callbacks.class | 20 ++++++ src/General/lib/classes.coffee | 1 + src/General/lib/post.class | 2 +- src/General/lib/thread.class | 2 +- 7 files changed, 147 insertions(+), 126 deletions(-) create mode 100644 src/General/lib/callbacks.class diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js index 748348b7d..2ad2d02a4 100644 --- a/builds/4chan-X.user.js +++ b/builds/4chan-X.user.js @@ -104,7 +104,7 @@ 'use strict'; (function() { - var $, $$, Anonymize, ArchiveLink, AutoGIF, Banner, Board, Build, CatalogLinks, Clone, Conf, Config, CustomCSS, DataBoard, DeleteLink, Dice, DownloadLink, Emoji, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Fourchan, Gallery, Get, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Index, InfiniScroll, Keybinds, Linkify, Main, Menu, Nav, Notice, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, Thread, ThreadExcerpt, ThreadHiding, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, c, d, doc, g, + var $, $$, Anonymize, ArchiveLink, AutoGIF, Banner, Board, Build, Callbacks, CatalogLinks, Clone, Conf, Config, CustomCSS, DataBoard, DeleteLink, Dice, DownloadLink, Emoji, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Fourchan, Gallery, Get, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Index, InfiniScroll, Keybinds, Linkify, Main, Menu, Nav, Notice, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, Thread, ThreadExcerpt, ThreadHiding, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, c, d, doc, g, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __slice = [].slice, __hasProp = {}.hasOwnProperty, @@ -807,6 +807,56 @@ return __slice.call(root.querySelectorAll(selector)); }; + Callbacks = (function() { + function Callbacks() {} + + Callbacks.prototype.push = function(_arg) { + var cb, name; + name = _arg.name, cb = _arg.cb; + return this.name = cb; + }; + + Callbacks.prototype.clean = function() { + var name; + for (name in this) { + if (this.hasOwnProperty(name)) { + this.rm(name); + } + } + }; + + Callbacks.prototype.rm = function(name) { + return delete this.name; + }; + + Callbacks.prototype.execute = function(target) { + var cb, err, errors, name; + for (name in this) { + cb = this[name]; + if (this.hasOwnProperty(name)) { + try { + cb.call(target); + } catch (_error) { + err = _error; + if (!errors) { + errors = []; + } + errors.push({ + message: ['"', name, '" crashed on node No.', node, ' (', node.board, ').'].join(''), + error: err + }); + } + } + } + if (errors) { + return Main.handleErrors(errors); + } + }; + + return Callbacks; + + })(); + Board = (function() { Board.prototype.toString = function() { return this.ID; @@ -824,7 +874,7 @@ })(); Thread = (function() { - Thread.callbacks = []; + Thread.callbacks = new Callbacks(); Thread.prototype.toString = function() { return this.ID; @@ -898,7 +948,7 @@ })(); Post = (function() { - Post.callbacks = []; + Post.callbacks = new Callbacks(); Post.prototype.toString = function() { return this.ID; @@ -12514,38 +12564,17 @@ break; } try { - localStorage.getItem('4chan-settings'); + return localStorage.getItem('4chan-settings'); } catch (_error) { err = _error; - new Notice('warning', 'Cookies need to be enabled on 4chan for 4chan X to operate properly.', 30); + return new Notice('warning', 'Cookies need to be enabled on 4chan for 4chan X to operate properly.', 30); } - return $.event('4chanXInitFinished'); }, callbackNodes: function(klass, nodes) { - var callback, err, errors, i, len, node, _i, _len, _ref; + var len, node; len = nodes.length; - _ref = klass.callbacks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - callback = _ref[_i]; - i = 0; - while (i < len) { - node = nodes[i++]; - try { - callback.cb.call(node); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "\"" + callback.name + "\" crashed on " + klass.name + " No." + node + " (/" + node.board + "/).", - error: err - }); - } - } - } - if (errors) { - return Main.handleErrors(errors); + while (node = nodes[i++]) { + klass.callback.execute(node); } }, callbackNodesDB: function(klass, nodes, cb) { @@ -12553,27 +12582,8 @@ queue = []; errors = null; func = function(node) { - var callback, err, _i, _len, _ref; - _ref = klass.callbacks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - callback = _ref[_i]; - try { - callback.cb.call(node); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "\"" + callback.name + "\" crashed on " + klass.name + " No." + node + " (/" + node.board + "/).", - error: err - }); - } - } + klass.callback.execute(node); if (!queue.length) { - if (errors) { - Main.handleErrors(errors); - } if (cb) { return cb(); } diff --git a/builds/crx/script.js b/builds/crx/script.js index 4f5048c1f..a6551d072 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -82,7 +82,7 @@ 'use strict'; (function() { - var $, $$, Anonymize, ArchiveLink, AutoGIF, Banner, Board, Build, CatalogLinks, Clone, Conf, Config, CustomCSS, DataBoard, DeleteLink, Dice, DownloadLink, Emoji, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Fourchan, Gallery, Get, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Index, InfiniScroll, Keybinds, Linkify, Main, Menu, Nav, Notice, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, Thread, ThreadExcerpt, ThreadHiding, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, c, d, doc, g, + var $, $$, Anonymize, ArchiveLink, AutoGIF, Banner, Board, Build, Callbacks, CatalogLinks, Clone, Conf, Config, CustomCSS, DataBoard, DeleteLink, Dice, DownloadLink, Emoji, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Fourchan, Gallery, Get, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Index, InfiniScroll, Keybinds, Linkify, Main, Menu, Nav, Notice, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, Thread, ThreadExcerpt, ThreadHiding, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, c, d, doc, g, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __slice = [].slice, __hasProp = {}.hasOwnProperty, @@ -812,6 +812,56 @@ return __slice.call(root.querySelectorAll(selector)); }; + Callbacks = (function() { + function Callbacks() {} + + Callbacks.prototype.push = function(_arg) { + var cb, name; + name = _arg.name, cb = _arg.cb; + return this.name = cb; + }; + + Callbacks.prototype.clean = function() { + var name; + for (name in this) { + if (this.hasOwnProperty(name)) { + this.rm(name); + } + } + }; + + Callbacks.prototype.rm = function(name) { + return delete this.name; + }; + + Callbacks.prototype.execute = function(target) { + var cb, err, errors, name; + for (name in this) { + cb = this[name]; + if (this.hasOwnProperty(name)) { + try { + cb.call(target); + } catch (_error) { + err = _error; + if (!errors) { + errors = []; + } + errors.push({ + message: ['"', name, '" crashed on node No.', node, ' (', node.board, ').'].join(''), + error: err + }); + } + } + } + if (errors) { + return Main.handleErrors(errors); + } + }; + + return Callbacks; + + })(); + Board = (function() { Board.prototype.toString = function() { return this.ID; @@ -829,7 +879,7 @@ })(); Thread = (function() { - Thread.callbacks = []; + Thread.callbacks = new Callbacks(); Thread.prototype.toString = function() { return this.ID; @@ -903,7 +953,7 @@ })(); Post = (function() { - Post.callbacks = []; + Post.callbacks = new Callbacks(); Post.prototype.toString = function() { return this.ID; @@ -12488,38 +12538,17 @@ return; } try { - localStorage.getItem('4chan-settings'); + return localStorage.getItem('4chan-settings'); } catch (_error) { err = _error; - new Notice('warning', 'Cookies need to be enabled on 4chan for 4chan X to operate properly.', 30); + return new Notice('warning', 'Cookies need to be enabled on 4chan for 4chan X to operate properly.', 30); } - return $.event('4chanXInitFinished'); }, callbackNodes: function(klass, nodes) { - var callback, err, errors, i, len, node, _i, _len, _ref; + var len, node; len = nodes.length; - _ref = klass.callbacks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - callback = _ref[_i]; - i = 0; - while (i < len) { - node = nodes[i++]; - try { - callback.cb.call(node); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "\"" + callback.name + "\" crashed on " + klass.name + " No." + node + " (/" + node.board + "/).", - error: err - }); - } - } - } - if (errors) { - return Main.handleErrors(errors); + while (node = nodes[i++]) { + klass.callback.execute(node); } }, callbackNodesDB: function(klass, nodes, cb) { @@ -12527,27 +12556,8 @@ queue = []; errors = null; func = function(node) { - var callback, err, _i, _len, _ref; - _ref = klass.callbacks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - callback = _ref[_i]; - try { - callback.cb.call(node); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "\"" + callback.name + "\" crashed on " + klass.name + " No." + node + " (/" + node.board + "/).", - error: err - }); - } - } + klass.callback.execute(node); if (!queue.length) { - if (errors) { - Main.handleErrors(errors); - } if (cb) { return cb(); } diff --git a/src/General/Main.coffee b/src/General/Main.coffee index 9d02d5f5d..3148ef4a7 100755 --- a/src/General/Main.coffee +++ b/src/General/Main.coffee @@ -228,45 +228,25 @@ Main = catch err new Notice 'warning', 'Cookies need to be enabled on 4chan for <%= meta.name %> to operate properly.', 30 - $.event '4chanXInitFinished' - callbackNodes: (klass, nodes) -> # get the nodes' length only once len = nodes.length - for callback in klass.callbacks - # c.profile callback.name - i = 0 - while i < len - node = nodes[i++] - try - callback.cb.call node - catch err - errors = [] unless errors - errors.push - message: "\"#{callback.name}\" crashed on #{klass.name} No.#{node} (/#{node.board}/)." - error: err - # c.profileEnd callback.name - Main.handleErrors errors if errors + while node = nodes[i++] + klass.callback.execute node + return callbackNodesDB: (klass, nodes, cb) -> queue = [] errors = null func = (node) -> - for callback in klass.callbacks - try - callback.cb.call node - catch err - errors = [] unless errors - errors.push - message: "\"#{callback.name}\" crashed on #{klass.name} No.#{node} (/#{node.board}/)." - error: err + klass.callback.execute node + # finish unless queue.length - Main.handleErrors errors if errors cb() if cb - softTask = -> + softTask = -> node = queue.shift() func node return unless queue.length diff --git a/src/General/lib/callbacks.class b/src/General/lib/callbacks.class new file mode 100644 index 000000000..ef425fce5 --- /dev/null +++ b/src/General/lib/callbacks.class @@ -0,0 +1,20 @@ +class Callbacks + push: ({name, cb}) -> @name = cb + + clean: -> + @rm name for name of @ when @hasOwnProperty name + return + + rm: (name) -> delete @name + + execute: (target) -> + for name, cb of @ when @hasOwnProperty name + try + cb.call target + catch err + errors = [] unless errors + errors.push + message: ['"', name, '" crashed on node No.', node, ' (', node.board, ').'].join('') + error: err + + Main.handleErrors errors if errors diff --git a/src/General/lib/classes.coffee b/src/General/lib/classes.coffee index 63c33645e..5654ff914 100755 --- a/src/General/lib/classes.coffee +++ b/src/General/lib/classes.coffee @@ -1,3 +1,4 @@ +<%= grunt.file.read('src/General/lib/callbacks.class') %> <%= grunt.file.read('src/General/lib/board.class') %> <%= grunt.file.read('src/General/lib/thread.class') %> <%= grunt.file.read('src/General/lib/post.class') %> diff --git a/src/General/lib/post.class b/src/General/lib/post.class index 81ac63acc..0943e520a 100755 --- a/src/General/lib/post.class +++ b/src/General/lib/post.class @@ -1,5 +1,5 @@ class Post - @callbacks = [] + @callbacks = new Callbacks() toString: -> @ID constructor: (root, @thread, @board, that={}) -> diff --git a/src/General/lib/thread.class b/src/General/lib/thread.class index 5b14e135d..f05bfeebf 100755 --- a/src/General/lib/thread.class +++ b/src/General/lib/thread.class @@ -1,5 +1,5 @@ class Thread - @callbacks = [] + @callbacks = new Callbacks() toString: -> @ID constructor: (@ID, @board) ->