From 69288c7ebe96cf4b7f4e7e3671cf8cf49a84b095 Mon Sep 17 00:00:00 2001 From: Zixaphir Date: Thu, 16 Jan 2014 09:56:20 -0700 Subject: [PATCH] More or less just trying to optimize this. --- builds/4chan-X.user.js | 72 ++++++++++++++++++++++++---------------- builds/crx/script.js | 72 ++++++++++++++++++++++++---------------- src/General/Index.coffee | 60 ++++++++++++++++++--------------- 3 files changed, 122 insertions(+), 82 deletions(-) diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js index 535756d8d..2c3c0c488 100644 --- a/builds/4chan-X.user.js +++ b/builds/4chan-X.user.js @@ -2360,7 +2360,7 @@ }); }, scroll: $.debounce(100, function() { - var nodes, nodesPerPage, pageNum; + var nodes, nodesPerPage, offset, pageNum; if (Index.req || Conf['Index Mode'] !== 'infinite' || (doc.scrollTop <= doc.scrollHeight - (300 + window.innerHeight)) || g.VIEW === 'thread') { return; } @@ -2371,12 +2371,13 @@ if (pageNum >= Index.pagesNum) { return Index.endNotice(); } - nodesPerPage = Index.threadsNumPerPage * 2; - nodes = Index.sortedNodes.slice(nodesPerPage * pageNum, nodesPerPage * (pageNum + 1)); + nodesPerPage = Index.threadsNumPerPage; + offset = nodesPerPage * pageNum; + nodes = Index.sortedNodes.slice(offset, offset + nodesPerPage); if (Conf['Show Replies']) { Index.buildReplies(nodes); } - $.add(Index.root, nodes); + Index.buildStructure(nodes); return Index.setPage(pageNum); }), endNotice: (function() { @@ -2655,7 +2656,7 @@ thread = new Thread(threadData.no, g.BOARD); threads.push(thread); } - Index.nodes.push(threadRoot, $.el('hr')); + Index.nodes.push(threadRoot); if (thread.ID in thread.posts) { continue; } @@ -2682,7 +2683,7 @@ buildReplies: function(threadRoots) { var data, err, errors, i, lastReplies, node, nodes, post, posts, thread, threadRoot, _i, _j, _len, _len1; posts = []; - for (_i = 0, _len = threadRoots.length; _i < _len; _i += 2) { + for (_i = 0, _len = threadRoots.length; _i < _len; _i++) { threadRoot = threadRoots[_i]; thread = Get.threadFromRoot(threadRoot); i = Index.liveThreadIDs.indexOf(thread.ID); @@ -2718,7 +2719,7 @@ return Main.callbackNodes(Post, posts); }, sort: function() { - var cnd, fn, i, item, items, sortOnTop, sortedThreadIDs, threadID, _i, _len; + var cnd, fn, i, item, items, nodes, sortedThreadIDs, threadID, _i, _len; sortedThreadIDs = { lastreply: __slice.call(Index.liveThreadData).sort(function(a, b) { if ('last_replies' in a) { @@ -2747,15 +2748,14 @@ }) }[Conf['Index Sort']]; Index.sortedNodes = []; + nodes = Index.nodes; for (_i = 0, _len = sortedThreadIDs.length; _i < _len; _i++) { threadID = sortedThreadIDs[_i]; - i = Index.liveThreadIDs.indexOf(threadID) * 2; - Index.sortedNodes.push(Index.nodes[i], Index.nodes[i + 1]); + Index.sortedNodes.push(nodes[Index.liveThreadIDs.indexOf(threadID)]); } - if (Index.isSearching) { - Index.sortedNodes = Index.querySearch(Index.searchInput.value) || Index.sortedNodes; + if (Index.isSearching && (nodes = Index.querySearch(Index.searchInput.value))) { + Index.sortedNodes = nodes; } - sortOnTop = Index.sortOnTop; items = [ { fn: function(thread) { @@ -2777,28 +2777,30 @@ i = 0; while (item = items[i++]) { fn = item.fn, cnd = item.cnd; - if (fn) { - sortOnTop(fn); + if (cnd) { + Index.sortOnTop(fn); } } }, sortOnTop: function(match) { - var i, offset, threadRoot, _i, _len, _ref, _ref1; + var i, offset, threadRoot, _i, _len, _ref; offset = 0; + i = 0; _ref = Index.sortedNodes; - for (i = _i = 0, _len = _ref.length; _i < _len; i = _i += 2) { + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { threadRoot = _ref[i]; if (match(Get.threadFromRoot(threadRoot))) { - (_ref1 = Index.sortedNodes).splice.apply(_ref1, [offset++ * 2, 0].concat(__slice.call(Index.sortedNodes.splice(i, 2)))); + Index.sortedNodes.splice(offset++, 0, Index.sortedNodes.splice(i, 1)[0]); } } }, buildIndex: function() { - var nodes, nodesPerPage, pageNum; + var nodes, nodesPerPage, offset, pageNum; if (Conf['Index Mode'] !== 'all pages') { pageNum = Index.getCurrentPage(); - nodesPerPage = Index.threadsNumPerPage * 2; - nodes = Index.sortedNodes.slice(nodesPerPage * pageNum, nodesPerPage * (pageNum + 1)); + nodesPerPage = Index.threadsNumPerPage; + offset = nodesPerPage * pageNum; + nodes = Index.sortedNodes.slice(offset, offset + nodesPerPage); } else { nodes = Index.sortedNodes; } @@ -2807,8 +2809,22 @@ if (Conf['Show Replies']) { Index.buildReplies(nodes); } - $.add(Index.root, nodes); - return $.event('IndexBuild', nodes); + return Index.buildStructure(nodes); + }, + buildStructure: function(nodes) { + var hr, i, node, result, _i, _len, _ref; + result = $.frag(); + i = 0; + while (node = nodes[i++]) { + $.add(result, [node, $.el('hr')]); + } + $.add(Index.root, result); + _ref = $$('hr + hr', Index.root); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + hr = _ref[_i]; + $.rm(hr); + } + return $.event('IndexBuild', result); }, isSearching: false, clearSearch: function() { @@ -2851,16 +2867,16 @@ return Index.search(keywords); }, search: function(keywords) { - var found, i, threadRoot, _i, _len, _ref; - found = []; + var threadRoot, _i, _len, _ref, _results; _ref = Index.sortedNodes; - for (i = _i = 0, _len = _ref.length; _i < _len; i = _i += 2) { - threadRoot = _ref[i]; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + threadRoot = _ref[_i]; if (Index.searchMatch(Get.threadFromRoot(threadRoot), keywords)) { - found.push(Index.sortedNodes[i], Index.sortedNodes[i + 1]); + _results.push(threadRoot); } } - return found; + return _results; }, searchMatch: function(thread, keywords) { var file, info, key, keyword, text, _i, _j, _len, _len1, _ref, _ref1; diff --git a/builds/crx/script.js b/builds/crx/script.js index 819f7145e..fab976f9c 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -2370,7 +2370,7 @@ }); }, scroll: $.debounce(100, function() { - var nodes, nodesPerPage, pageNum; + var nodes, nodesPerPage, offset, pageNum; if (Index.req || Conf['Index Mode'] !== 'infinite' || (doc.scrollTop <= doc.scrollHeight - (300 + window.innerHeight)) || g.VIEW === 'thread') { return; } @@ -2381,12 +2381,13 @@ if (pageNum >= Index.pagesNum) { return Index.endNotice(); } - nodesPerPage = Index.threadsNumPerPage * 2; - nodes = Index.sortedNodes.slice(nodesPerPage * pageNum, nodesPerPage * (pageNum + 1)); + nodesPerPage = Index.threadsNumPerPage; + offset = nodesPerPage * pageNum; + nodes = Index.sortedNodes.slice(offset, offset + nodesPerPage); if (Conf['Show Replies']) { Index.buildReplies(nodes); } - $.add(Index.root, nodes); + Index.buildStructure(nodes); return Index.setPage(pageNum); }), endNotice: (function() { @@ -2665,7 +2666,7 @@ thread = new Thread(threadData.no, g.BOARD); threads.push(thread); } - Index.nodes.push(threadRoot, $.el('hr')); + Index.nodes.push(threadRoot); if (thread.ID in thread.posts) { continue; } @@ -2692,7 +2693,7 @@ buildReplies: function(threadRoots) { var data, err, errors, i, lastReplies, node, nodes, post, posts, thread, threadRoot, _i, _j, _len, _len1; posts = []; - for (_i = 0, _len = threadRoots.length; _i < _len; _i += 2) { + for (_i = 0, _len = threadRoots.length; _i < _len; _i++) { threadRoot = threadRoots[_i]; thread = Get.threadFromRoot(threadRoot); i = Index.liveThreadIDs.indexOf(thread.ID); @@ -2728,7 +2729,7 @@ return Main.callbackNodes(Post, posts); }, sort: function() { - var cnd, fn, i, item, items, sortOnTop, sortedThreadIDs, threadID, _i, _len; + var cnd, fn, i, item, items, nodes, sortedThreadIDs, threadID, _i, _len; sortedThreadIDs = { lastreply: __slice.call(Index.liveThreadData).sort(function(a, b) { if ('last_replies' in a) { @@ -2757,15 +2758,14 @@ }) }[Conf['Index Sort']]; Index.sortedNodes = []; + nodes = Index.nodes; for (_i = 0, _len = sortedThreadIDs.length; _i < _len; _i++) { threadID = sortedThreadIDs[_i]; - i = Index.liveThreadIDs.indexOf(threadID) * 2; - Index.sortedNodes.push(Index.nodes[i], Index.nodes[i + 1]); + Index.sortedNodes.push(nodes[Index.liveThreadIDs.indexOf(threadID)]); } - if (Index.isSearching) { - Index.sortedNodes = Index.querySearch(Index.searchInput.value) || Index.sortedNodes; + if (Index.isSearching && (nodes = Index.querySearch(Index.searchInput.value))) { + Index.sortedNodes = nodes; } - sortOnTop = Index.sortOnTop; items = [ { fn: function(thread) { @@ -2787,28 +2787,30 @@ i = 0; while (item = items[i++]) { fn = item.fn, cnd = item.cnd; - if (fn) { - sortOnTop(fn); + if (cnd) { + Index.sortOnTop(fn); } } }, sortOnTop: function(match) { - var i, offset, threadRoot, _i, _len, _ref, _ref1; + var i, offset, threadRoot, _i, _len, _ref; offset = 0; + i = 0; _ref = Index.sortedNodes; - for (i = _i = 0, _len = _ref.length; _i < _len; i = _i += 2) { + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { threadRoot = _ref[i]; if (match(Get.threadFromRoot(threadRoot))) { - (_ref1 = Index.sortedNodes).splice.apply(_ref1, [offset++ * 2, 0].concat(__slice.call(Index.sortedNodes.splice(i, 2)))); + Index.sortedNodes.splice(offset++, 0, Index.sortedNodes.splice(i, 1)[0]); } } }, buildIndex: function() { - var nodes, nodesPerPage, pageNum; + var nodes, nodesPerPage, offset, pageNum; if (Conf['Index Mode'] !== 'all pages') { pageNum = Index.getCurrentPage(); - nodesPerPage = Index.threadsNumPerPage * 2; - nodes = Index.sortedNodes.slice(nodesPerPage * pageNum, nodesPerPage * (pageNum + 1)); + nodesPerPage = Index.threadsNumPerPage; + offset = nodesPerPage * pageNum; + nodes = Index.sortedNodes.slice(offset, offset + nodesPerPage); } else { nodes = Index.sortedNodes; } @@ -2817,8 +2819,22 @@ if (Conf['Show Replies']) { Index.buildReplies(nodes); } - $.add(Index.root, nodes); - return $.event('IndexBuild', nodes); + return Index.buildStructure(nodes); + }, + buildStructure: function(nodes) { + var hr, i, node, result, _i, _len, _ref; + result = $.frag(); + i = 0; + while (node = nodes[i++]) { + $.add(result, [node, $.el('hr')]); + } + $.add(Index.root, result); + _ref = $$('hr + hr', Index.root); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + hr = _ref[_i]; + $.rm(hr); + } + return $.event('IndexBuild', result); }, isSearching: false, clearSearch: function() { @@ -2861,16 +2877,16 @@ return Index.search(keywords); }, search: function(keywords) { - var found, i, threadRoot, _i, _len, _ref; - found = []; + var threadRoot, _i, _len, _ref, _results; _ref = Index.sortedNodes; - for (i = _i = 0, _len = _ref.length; _i < _len; i = _i += 2) { - threadRoot = _ref[i]; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + threadRoot = _ref[_i]; if (Index.searchMatch(Get.threadFromRoot(threadRoot), keywords)) { - found.push(Index.sortedNodes[i], Index.sortedNodes[i + 1]); + _results.push(threadRoot); } } - return found; + return _results; }, searchMatch: function(thread, keywords) { var file, info, key, keyword, text, _i, _j, _len, _len1, _ref, _ref1; diff --git a/src/General/Index.coffee b/src/General/Index.coffee index 3e2cb30c6..4efda8098 100644 --- a/src/General/Index.coffee +++ b/src/General/Index.coffee @@ -115,12 +115,16 @@ Index = scroll: $.debounce 100, -> return if Index.req or Conf['Index Mode'] isnt 'infinite' or (doc.scrollTop <= doc.scrollHeight - (300 + window.innerHeight)) or g.VIEW is 'thread' Index.pageNum = Index.getCurrentPage() unless Index.pageNum? # Avoid having to pushState to keep track of the current page + pageNum = Index.pageNum++ return Index.endNotice() if pageNum >= Index.pagesNum - nodesPerPage = Index.threadsNumPerPage * 2 - nodes = Index.sortedNodes[nodesPerPage * pageNum ... nodesPerPage * (pageNum + 1)] + + nodesPerPage = Index.threadsNumPerPage + offset = nodesPerPage * pageNum + nodes = Index.sortedNodes[offset ... offset + nodesPerPage] + Index.buildReplies nodes if Conf['Show Replies'] - $.add Index.root, nodes + Index.buildStructure nodes Index.setPage pageNum endNotice: do -> @@ -331,7 +335,7 @@ Index = else thread = new Thread threadData.no, g.BOARD threads.push thread - Index.nodes.push threadRoot, $.el 'hr' + Index.nodes.push threadRoot continue if thread.ID of thread.posts posts.push new Post $('.opContainer', threadRoot), thread, g.BOARD catch err @@ -350,7 +354,7 @@ Index = buildReplies: (threadRoots) -> posts = [] - for threadRoot in threadRoots by 2 + for threadRoot in threadRoots thread = Get.threadFromRoot threadRoot i = Index.liveThreadIDs.indexOf thread.ID continue unless lastReplies = Index.liveThreadData[i].last_replies @@ -382,19 +386,18 @@ Index = b.no - a.no ).map (data) -> data.no bump: Index.liveThreadIDs - birth: [Index.liveThreadIDs...].sort (a, b) -> b - a + birth: [Index.liveThreadIDs... ].sort (a, b) -> b - a replycount: [Index.liveThreadData...].sort((a, b) -> b.replies - a.replies).map (data) -> data.no - filecount: [Index.liveThreadData...].sort((a, b) -> b.images - a.images).map (data) -> data.no + filecount: [Index.liveThreadData...].sort((a, b) -> b.images - a.images ).map (data) -> data.no }[Conf['Index Sort']] Index.sortedNodes = [] + {nodes} = Index for threadID in sortedThreadIDs - i = Index.liveThreadIDs.indexOf(threadID) * 2 - Index.sortedNodes.push Index.nodes[i], Index.nodes[i + 1] - if Index.isSearching - Index.sortedNodes = Index.querySearch(Index.searchInput.value) or Index.sortedNodes - # Sticky threads - {sortOnTop} = Index + Index.sortedNodes.push nodes[Index.liveThreadIDs.indexOf(threadID)] + if Index.isSearching and nodes = Index.querySearch(Index.searchInput.value) + Index.sortedNodes = nodes items = [ + # Sticky threads fn: (thread) -> thread.isSticky cnd: true , # Highlighted threads @@ -407,27 +410,37 @@ Index = i = 0 while item = items[i++] {fn, cnd} = item - sortOnTop fn if fn + Index.sortOnTop fn if cnd return sortOnTop: (match) -> offset = 0 - for threadRoot, i in Index.sortedNodes by 2 when match Get.threadFromRoot threadRoot - Index.sortedNodes.splice offset++ * 2, 0, Index.sortedNodes.splice(i, 2)... + i = 0 + for threadRoot, i in Index.sortedNodes + if match Get.threadFromRoot threadRoot + Index.sortedNodes.splice offset++, 0, Index.sortedNodes.splice(i, 1)[0] return buildIndex: -> if Conf['Index Mode'] isnt 'all pages' pageNum = Index.getCurrentPage() - nodesPerPage = Index.threadsNumPerPage * 2 - nodes = Index.sortedNodes[nodesPerPage * pageNum ... nodesPerPage * (pageNum + 1)] + nodesPerPage = Index.threadsNumPerPage + offset = nodesPerPage * pageNum + nodes = Index.sortedNodes[offset ... offset + nodesPerPage] else nodes = Index.sortedNodes $.rmAll Index.root $.rmAll Header.hover Index.buildReplies nodes if Conf['Show Replies'] - $.add Index.root, nodes - $.event 'IndexBuild', nodes + Index.buildStructure nodes + + buildStructure: (nodes) -> + result = $.frag() + i = 0 + $.add result, [node, $.el 'hr'] while node = nodes[i++] + $.add Index.root, result + $.rm hr for hr in $$ 'hr + hr', Index.root # Temp fix until I figure out where I fucked up + $.event 'IndexBuild', result isSearching: false @@ -467,12 +480,7 @@ Index = return unless keywords = query.toLowerCase().match /\S+/g Index.search keywords - search: (keywords) -> - found = [] - for threadRoot, i in Index.sortedNodes by 2 - if Index.searchMatch Get.threadFromRoot(threadRoot), keywords - found.push Index.sortedNodes[i], Index.sortedNodes[i + 1] - found + search: (keywords) -> threadRoot for threadRoot in Index.sortedNodes when Index.searchMatch Get.threadFromRoot(threadRoot), keywords searchMatch: (thread, keywords) -> {info, file} = thread.OP