diff --git a/builds/appchan-x.user.js b/builds/appchan-x.user.js index 52f6feeef..02e6de206 100644 --- a/builds/appchan-x.user.js +++ b/builds/appchan-x.user.js @@ -8471,13 +8471,9 @@ $.extend(this.threadNewLink, { innerHTML: "Thread New Posts" }); - $.on($('input', this.controls), 'change', function() { - return QuoteThreading.rethread(this.checked); - }); - $.on(this.threadNewLink.firstElementChild, 'click', function() { - QuoteThreading.threadNewLink.hidden = true; - return QuoteThreading.rethread(true); - }); + $.on($('input', this.controls), 'change', this.cb.thread); + $.on(this.threadNewLink.firstElementChild, 'click', this.cb.click); + $.on(d, '4chanXInitFinished', this.cb.thread); Header.menu.addEntry(this.entry = { el: this.controls, order: 98 @@ -8505,6 +8501,9 @@ this.parent = {}; this.children = {}; this.inserted = {}; + $.off($('input', this.controls), 'change', this.cb.thread); + $.off(this.threadNewLink.firstElementChild, 'click', this.cb.click); + $.off(d, '4chanXInitFinished', this.cb.thread); Thread.callbacks.disconnect('Quote Threading'); return Post.callbacks.disconnect('Quote Threading'); }, @@ -8528,11 +8527,9 @@ _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { quote = _ref[_i]; - parent = g.posts[quote]; - if (!parent || parent.isFetchedQuote || !parent.isReply || parent.ID >= this.ID) { - continue; + if ((parent = g.posts[quote]) && !parent.isFetchedQuote && parent.isReply && parent.ID <= this.ID) { + _results.push(parent); } - _results.push(parent); } return _results; }).call(this); @@ -8552,16 +8549,24 @@ return posts; }, insert: function(post) { - var child, children, descendants, i, next, nodes, order, parent, prev, prev2, threadContainer, x, _base, _i, _j, _k, _len, _name; + var child, children, descendants, i, next, nodes, order, parent, prev, prev2, threadContainer, x, _base, _i, _j, _len, _name; if (!(QuoteThreading.enabled && (parent = QuoteThreading.parent[post.fullID]) && !QuoteThreading.inserted[post.fullID])) { return false; } descendants = QuoteThreading.descendants(post); - if (!Unread.posts.has(parent.ID) && descendants.some(function(x) { - return Unread.posts.has(x.ID); - })) { - QuoteThreading.threadNewLink.hidden = false; - return false; + if (!Unread.posts.has(parent.ID)) { + if ((function() { + var x, _i, _len; + for (_i = 0, _len = descendants.length; _i < _len; _i++) { + x = descendants[_i]; + if (Unread.posts.has(x.ID)) { + return true; + } + } + })()) { + QuoteThreading.threadNewLink.hidden = false; + return false; + } } order = Unread.order; children = ((_base = QuoteThreading.children)[_name = parent.fullID] || (_base[_name] = [])); @@ -8573,16 +8578,13 @@ nodes.push(post.nodes.threadContainer); } i = children.length; - for (_i = children.length - 1; _i >= 0; _i += -1) { - child = children[_i]; - if (child.ID >= post.ID) { - i--; - } + while ((child = children[i]) && child.ID >= post.ID) { + i--; } if (i !== children.length) { next = children[i]; - for (_j = 0, _len = descendants.length; _j < _len; _j++) { - x = descendants[_j]; + for (_i = 0, _len = descendants.length; _i < _len; _i++) { + x = descendants[_i]; order.before(order[next.ID], order[x.ID]); } children.splice(i, 0, post); @@ -8592,8 +8594,8 @@ while ((prev2 = QuoteThreading.children[prev.fullID]) && prev2.length) { prev = prev2[prev2.length - 1]; } - for (_k = descendants.length - 1; _k >= 0; _k += -1) { - x = descendants[_k]; + for (_j = descendants.length - 1; _j >= 0; _j += -1) { + x = descendants[_j]; order.after(order[prev.ID], order[x.ID]); } children.push(post); @@ -8609,6 +8611,9 @@ }, rethread: function(enabled) { var nodes, posts, thread; + if (enabled == null) { + enabled = true; + } thread = QuoteThreading.thread; posts = thread.posts; if (QuoteThreading.enabled = enabled) { @@ -8639,6 +8644,15 @@ Unread.setLine(true); Unread.read(); return Unread.update(); + }, + cb: { + thread: function() { + return QuoteThreading.rethread(QuoteThreading.checked); + }, + click: function() { + QuoteThreading.threadNewLink.hidden = true; + return QuoteThreading.cb.thread(); + } } }; diff --git a/builds/crx/script.js b/builds/crx/script.js index ee4e5ea7b..78b8fd5ce 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -8513,13 +8513,9 @@ $.extend(this.threadNewLink, { innerHTML: "Thread New Posts" }); - $.on($('input', this.controls), 'change', function() { - return QuoteThreading.rethread(this.checked); - }); - $.on(this.threadNewLink.firstElementChild, 'click', function() { - QuoteThreading.threadNewLink.hidden = true; - return QuoteThreading.rethread(true); - }); + $.on($('input', this.controls), 'change', this.cb.thread); + $.on(this.threadNewLink.firstElementChild, 'click', this.cb.click); + $.on(d, '4chanXInitFinished', this.cb.thread); Header.menu.addEntry(this.entry = { el: this.controls, order: 98 @@ -8547,6 +8543,9 @@ this.parent = {}; this.children = {}; this.inserted = {}; + $.off($('input', this.controls), 'change', this.cb.thread); + $.off(this.threadNewLink.firstElementChild, 'click', this.cb.click); + $.off(d, '4chanXInitFinished', this.cb.thread); Thread.callbacks.disconnect('Quote Threading'); return Post.callbacks.disconnect('Quote Threading'); }, @@ -8570,11 +8569,9 @@ _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { quote = _ref[_i]; - parent = g.posts[quote]; - if (!parent || parent.isFetchedQuote || !parent.isReply || parent.ID >= this.ID) { - continue; + if ((parent = g.posts[quote]) && !parent.isFetchedQuote && parent.isReply && parent.ID <= this.ID) { + _results.push(parent); } - _results.push(parent); } return _results; }).call(this); @@ -8594,16 +8591,24 @@ return posts; }, insert: function(post) { - var child, children, descendants, i, next, nodes, order, parent, prev, prev2, threadContainer, x, _base, _i, _j, _k, _len, _name; + var child, children, descendants, i, next, nodes, order, parent, prev, prev2, threadContainer, x, _base, _i, _j, _len, _name; if (!(QuoteThreading.enabled && (parent = QuoteThreading.parent[post.fullID]) && !QuoteThreading.inserted[post.fullID])) { return false; } descendants = QuoteThreading.descendants(post); - if (!Unread.posts.has(parent.ID) && descendants.some(function(x) { - return Unread.posts.has(x.ID); - })) { - QuoteThreading.threadNewLink.hidden = false; - return false; + if (!Unread.posts.has(parent.ID)) { + if ((function() { + var x, _i, _len; + for (_i = 0, _len = descendants.length; _i < _len; _i++) { + x = descendants[_i]; + if (Unread.posts.has(x.ID)) { + return true; + } + } + })()) { + QuoteThreading.threadNewLink.hidden = false; + return false; + } } order = Unread.order; children = ((_base = QuoteThreading.children)[_name = parent.fullID] || (_base[_name] = [])); @@ -8615,16 +8620,13 @@ nodes.push(post.nodes.threadContainer); } i = children.length; - for (_i = children.length - 1; _i >= 0; _i += -1) { - child = children[_i]; - if (child.ID >= post.ID) { - i--; - } + while ((child = children[i]) && child.ID >= post.ID) { + i--; } if (i !== children.length) { next = children[i]; - for (_j = 0, _len = descendants.length; _j < _len; _j++) { - x = descendants[_j]; + for (_i = 0, _len = descendants.length; _i < _len; _i++) { + x = descendants[_i]; order.before(order[next.ID], order[x.ID]); } children.splice(i, 0, post); @@ -8634,8 +8636,8 @@ while ((prev2 = QuoteThreading.children[prev.fullID]) && prev2.length) { prev = prev2[prev2.length - 1]; } - for (_k = descendants.length - 1; _k >= 0; _k += -1) { - x = descendants[_k]; + for (_j = descendants.length - 1; _j >= 0; _j += -1) { + x = descendants[_j]; order.after(order[prev.ID], order[x.ID]); } children.push(post); @@ -8651,6 +8653,9 @@ }, rethread: function(enabled) { var nodes, posts, thread; + if (enabled == null) { + enabled = true; + } thread = QuoteThreading.thread; posts = thread.posts; if (QuoteThreading.enabled = enabled) { @@ -8681,6 +8686,15 @@ Unread.setLine(true); Unread.read(); return Unread.update(); + }, + cb: { + thread: function() { + return QuoteThreading.rethread(QuoteThreading.checked); + }, + click: function() { + QuoteThreading.threadNewLink.hidden = true; + return QuoteThreading.cb.thread(); + } } }; diff --git a/src/Quotelinks/QuoteThreading.coffee b/src/Quotelinks/QuoteThreading.coffee index df190c6c4..a4874b494 100755 --- a/src/Quotelinks/QuoteThreading.coffee +++ b/src/Quotelinks/QuoteThreading.coffee @@ -9,16 +9,15 @@ QuoteThreading = @enabled = true @controls = $.el 'span', <%= html('') %> + @threadNewLink = $.el 'span', className: 'brackets-wrap threadnewlink' hidden: true $.extend @threadNewLink, <%= html('Thread New Posts') %> - $.on $('input', @controls), 'change', -> - QuoteThreading.rethread @checked - $.on @threadNewLink.firstElementChild, 'click', -> - QuoteThreading.threadNewLink.hidden = true - QuoteThreading.rethread true + $.on $('input', @controls), 'change', @cb.thread + $.on @threadNewLink.firstElementChild, 'click', @cb.click + $.on d, '4chanXInitFinished', @cb.thread Header.menu.addEntry @entry = el: @controls @@ -49,6 +48,10 @@ QuoteThreading = @children = {} @inserted = {} + $.off $('input', @controls), 'change', @cb.thread + $.off @threadNewLink.firstElementChild, 'click', @cb.click + $.off d, '4chanXInitFinished', @cb.thread + Thread.callbacks.disconnect 'Quote Threading' Post.callbacks.disconnect 'Quote Threading' @@ -60,10 +63,10 @@ QuoteThreading = node: -> return if @isFetchedQuote or @isClone or !@isReply {thread} = QuoteThreading - parents = for quote in @quotes - parent = g.posts[quote] - continue if !parent or parent.isFetchedQuote or !parent.isReply or parent.ID >= @ID - parent + parents = (parent for quote in @quotes when (parent = g.posts[quote]) and + not parent.isFetchedQuote and parent.isReply and parent.ID <= @ID + ) + if parents.length is 1 QuoteThreading.parent[@fullID] = parents[0] @@ -80,9 +83,10 @@ QuoteThreading = !QuoteThreading.inserted[post.fullID] descendants = QuoteThreading.descendants post - if !Unread.posts.has(parent.ID) and descendants.some((x) -> Unread.posts.has(x.ID)) - QuoteThreading.threadNewLink.hidden = false - return false + if !Unread.posts.has(parent.ID) + if (do -> return true for x in descendants when Unread.posts.has x.ID) + QuoteThreading.threadNewLink.hidden = false + return false {order} = Unread children = (QuoteThreading.children[parent.fullID] or= []) @@ -91,7 +95,7 @@ QuoteThreading = nodes.push post.nodes.threadContainer if post.nodes.threadContainer i = children.length - i-- for child in children by -1 when child.ID >= post.ID + i-- while (child = children[i]) and child.ID >= post.ID if i isnt children.length next = children[i] order.before order[next.ID], order[x.ID] for x in descendants @@ -114,7 +118,7 @@ QuoteThreading = return true - rethread: (enabled) -> + rethread: (enabled = true) -> {thread} = QuoteThreading {posts} = thread @@ -140,3 +144,9 @@ QuoteThreading = Unread.setLine true Unread.read() Unread.update() + + cb: + thread: -> QuoteThreading.rethread QuoteThreading.checked + click: -> + QuoteThreading.threadNewLink.hidden = true + QuoteThreading.cb.thread() \ No newline at end of file