diff --git a/builds/appchan-x.user.js b/builds/appchan-x.user.js index 437da2cd0..a5578255f 100644 --- a/builds/appchan-x.user.js +++ b/builds/appchan-x.user.js @@ -135,6 +135,7 @@ Config = { main: { 'Miscellaneous': { + 'JSON Navigation': [true, 'Use JSON for loading the Board Index and Threads. Also allows searching and sorting the board index and infinite scolling.'], 'Catalog Links': [true, 'Add toggle link in header menu to turn Navigation links into links to each board\'s catalog.'], 'External Catalog': [false, 'Link to external catalog instead of the internal one.'], 'Announcement Hiding': [true, 'Add button to hide 4chan announcements.'], @@ -4119,6 +4120,8 @@ var a, footer, _i, _len, _ref, _results; if (a = $("a[href*='/" + g.BOARD + "/']", footer = $.id('boardNavDesktopFoot'))) { a.className = 'current'; + } + if (Conf['JSON Navigation']) { _ref = $$('a', footer); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { @@ -4161,7 +4164,9 @@ _ref = $$('a', boardList); for (_i = 0, _len = _ref.length; _i < _len; _i++) { a = _ref[_i]; - $.on(a, 'click', Navigate.navigate); + if (Conf['JSON Navigation']) { + $.on(a, 'click', Navigate.navigate); + } if (a.pathname.split('/')[1] === g.BOARD.ID) { a.className = 'current'; } @@ -4217,7 +4222,9 @@ a = as[_i]; if (a.textContent === board) { a = a.cloneNode(true); - $.on(a, 'click', Navigate.navigate); + if (Conf['JSON Navigation']) { + $.on(a, 'click', Navigate.navigate); + } a.textContent = /-title/.test(t) || /-replace/.test(t) && $.hasClass(a, 'current') ? a.title : /-full/.test(t) ? "/" + board + "/ - " + a.title : (m = t.match(/-text:"(.+)"/)) ? m[1] : a.textContent; if (m = t.match(/-(index|catalog)/)) { a.dataset.only = m[1]; @@ -4445,7 +4452,7 @@ Index = { init: function() { var anchorEntry, input, label, modeEntry, name, refNavEntry, repliesEntry, sortEntry, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2; - if (g.BOARD.ID === 'f' || g.VIEW === 'catalog') { + if (g.BOARD.ID === 'f' || g.VIEW === 'catalog' || !Conf['JSON Navigation']) { return; } this.button = $.el('a', { @@ -4619,18 +4626,20 @@ if (Index.req || Conf['Index Mode'] !== 'infinite' || (doc.scrollTop <= doc.scrollHeight - (300 + window.innerHeight)) || g.VIEW === 'thread') { return; } - pageNum = Index.getCurrentPage() + 1; + if (Index.pageNum == null) { + Index.pageNum = Index.getCurrentPage(); + } + pageNum = Index.pageNum++; if (pageNum >= Index.pagesNum) { return Index.endNotice(); } nodesPerPage = Index.threadsNumPerPage * 2; - history.pushState(null, '', "/" + g.BOARD + "/" + pageNum); nodes = Index.sortedNodes.slice(nodesPerPage * pageNum, nodesPerPage * (pageNum + 1)); if (Conf['Show Replies']) { Index.buildReplies(nodes); } $.add(Index.root, nodes); - return Index.setPage(); + return Index.setPage(pageNum); }), endNotice: (function() { var notify, reset; @@ -4675,14 +4684,6 @@ } e.preventDefault(); return Index.userPageNav(+a.pathname.split('/')[2]); - }, - link: function(e) { - if (g.VIEW !== 'index' || /catalog/.test(this.href)) { - return; - } - e.preventDefault(); - history.pushState(null, '', this.pathname); - return Index.update(); } }, scrollToIndex: function() { @@ -4745,9 +4746,9 @@ } return Index.togglePagelist(); }, - setPage: function() { - var a, href, maxPageNum, next, pageNum, pagesRoot, prev, strong; - pageNum = Index.getCurrentPage(); + setPage: function(pageNum) { + var a, href, maxPageNum, next, pagesRoot, prev, strong; + pageNum || (pageNum = Index.getCurrentPage()); maxPageNum = Index.getMaxPageNum(); pagesRoot = $('.pages', Index.pagelist); prev = pagesRoot.previousSibling.firstChild; @@ -4784,6 +4785,7 @@ if (!(d.readyState === 'loading' || Index.root.parentElement)) { $.replace($('.board'), Index.root); } + delete Index.pageNum; if ((_ref = Index.req) != null) { _ref.abort(); } @@ -15614,7 +15616,7 @@ Navigate = { path: window.location.pathname, init: function() { - if (g.VIEW === 'catalog' || g.BOARD.ID === 'f') { + if (g.VIEW === 'catalog' || g.BOARD.ID === 'f' || !Conf['JSON Navigation']) { return; } $.ready(function() { @@ -15833,6 +15835,7 @@ if (e) { e.preventDefault(); } + delete Index.pageNum; path = this.pathname; if (this.hash) { path += this.hash; diff --git a/builds/crx/script.js b/builds/crx/script.js index d6c141277..7b21ee8fc 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -113,6 +113,7 @@ Config = { main: { 'Miscellaneous': { + 'JSON Navigation': [true, 'Use JSON for loading the Board Index and Threads. Also allows searching and sorting the board index and infinite scolling.'], 'Catalog Links': [true, 'Add toggle link in header menu to turn Navigation links into links to each board\'s catalog.'], 'External Catalog': [false, 'Link to external catalog instead of the internal one.'], 'Announcement Hiding': [true, 'Add button to hide 4chan announcements.'], @@ -4129,6 +4130,8 @@ var a, footer, _i, _len, _ref, _results; if (a = $("a[href*='/" + g.BOARD + "/']", footer = $.id('boardNavDesktopFoot'))) { a.className = 'current'; + } + if (Conf['JSON Navigation']) { _ref = $$('a', footer); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { @@ -4171,7 +4174,9 @@ _ref = $$('a', boardList); for (_i = 0, _len = _ref.length; _i < _len; _i++) { a = _ref[_i]; - $.on(a, 'click', Navigate.navigate); + if (Conf['JSON Navigation']) { + $.on(a, 'click', Navigate.navigate); + } if (a.pathname.split('/')[1] === g.BOARD.ID) { a.className = 'current'; } @@ -4227,7 +4232,9 @@ a = as[_i]; if (a.textContent === board) { a = a.cloneNode(true); - $.on(a, 'click', Navigate.navigate); + if (Conf['JSON Navigation']) { + $.on(a, 'click', Navigate.navigate); + } a.textContent = /-title/.test(t) || /-replace/.test(t) && $.hasClass(a, 'current') ? a.title : /-full/.test(t) ? "/" + board + "/ - " + a.title : (m = t.match(/-text:"(.+)"/)) ? m[1] : a.textContent; if (m = t.match(/-(index|catalog)/)) { a.dataset.only = m[1]; @@ -4455,7 +4462,7 @@ Index = { init: function() { var anchorEntry, input, label, modeEntry, name, refNavEntry, repliesEntry, sortEntry, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2; - if (g.BOARD.ID === 'f' || g.VIEW === 'catalog') { + if (g.BOARD.ID === 'f' || g.VIEW === 'catalog' || !Conf['JSON Navigation']) { return; } this.button = $.el('a', { @@ -4629,18 +4636,20 @@ if (Index.req || Conf['Index Mode'] !== 'infinite' || (doc.scrollTop <= doc.scrollHeight - (300 + window.innerHeight)) || g.VIEW === 'thread') { return; } - pageNum = Index.getCurrentPage() + 1; + if (Index.pageNum == null) { + Index.pageNum = Index.getCurrentPage(); + } + pageNum = Index.pageNum++; if (pageNum >= Index.pagesNum) { return Index.endNotice(); } nodesPerPage = Index.threadsNumPerPage * 2; - history.pushState(null, '', "/" + g.BOARD + "/" + pageNum); nodes = Index.sortedNodes.slice(nodesPerPage * pageNum, nodesPerPage * (pageNum + 1)); if (Conf['Show Replies']) { Index.buildReplies(nodes); } $.add(Index.root, nodes); - return Index.setPage(); + return Index.setPage(pageNum); }), endNotice: (function() { var notify, reset; @@ -4685,14 +4694,6 @@ } e.preventDefault(); return Index.userPageNav(+a.pathname.split('/')[2]); - }, - link: function(e) { - if (g.VIEW !== 'index' || /catalog/.test(this.href)) { - return; - } - e.preventDefault(); - history.pushState(null, '', this.pathname); - return Index.update(); } }, scrollToIndex: function() { @@ -4755,9 +4756,9 @@ } return Index.togglePagelist(); }, - setPage: function() { - var a, href, maxPageNum, next, pageNum, pagesRoot, prev, strong; - pageNum = Index.getCurrentPage(); + setPage: function(pageNum) { + var a, href, maxPageNum, next, pagesRoot, prev, strong; + pageNum || (pageNum = Index.getCurrentPage()); maxPageNum = Index.getMaxPageNum(); pagesRoot = $('.pages', Index.pagelist); prev = pagesRoot.previousSibling.firstChild; @@ -4794,6 +4795,7 @@ if (!(d.readyState === 'loading' || Index.root.parentElement)) { $.replace($('.board'), Index.root); } + delete Index.pageNum; if ((_ref = Index.req) != null) { _ref.abort(); } @@ -15609,7 +15611,7 @@ Navigate = { path: window.location.pathname, init: function() { - if (g.VIEW === 'catalog' || g.BOARD.ID === 'f') { + if (g.VIEW === 'catalog' || g.BOARD.ID === 'f' || !Conf['JSON Navigation']) { return; } $.ready(function() { @@ -15828,6 +15830,7 @@ if (e) { e.preventDefault(); } + delete Index.pageNum; path = this.pathname; if (this.hash) { path += this.hash; diff --git a/src/General/Config.coffee b/src/General/Config.coffee index cdff3ced0..2b325ce71 100755 --- a/src/General/Config.coffee +++ b/src/General/Config.coffee @@ -1,6 +1,10 @@ Config = main: 'Miscellaneous': + 'JSON Navigation' : [ + true + 'Use JSON for loading the Board Index and Threads. Also allows searching and sorting the board index and infinite scolling.' + ] 'Catalog Links': [ true 'Add toggle link in header menu to turn Navigation links into links to each board\'s catalog.' diff --git a/src/General/Header.coffee b/src/General/Header.coffee index c59f60234..d3043f472 100644 --- a/src/General/Header.coffee +++ b/src/General/Header.coffee @@ -83,6 +83,7 @@ Header = $.ready => if a = $ "a[href*='/#{g.BOARD}/']", footer = $.id 'boardNavDesktopFoot' a.className = 'current' + if Conf['JSON Navigation'] $.on a, 'click', Navigate.navigate for a in $$ 'a', footer bar: $.el 'div', @@ -113,7 +114,8 @@ Header = id: 'board-list' innerHTML: "" for a in $$ 'a', boardList - $.on a, 'click', Navigate.navigate + if Conf['JSON Navigation'] + $.on a, 'click', Navigate.navigate if a.pathname.split('/')[1] is g.BOARD.ID a.className = 'current' fullBoardList = $ '#full-board-list', boardList @@ -167,7 +169,8 @@ Header = if a.textContent is board a = a.cloneNode true - $.on a, 'click', Navigate.navigate + if Conf['JSON Navigation'] + $.on a, 'click', Navigate.navigate a.textContent = if /-title/.test(t) or /-replace/.test(t) and $.hasClass a, 'current' a.title diff --git a/src/General/Index.coffee b/src/General/Index.coffee index 2adbae152..1870d655b 100644 --- a/src/General/Index.coffee +++ b/src/General/Index.coffee @@ -1,6 +1,6 @@ Index = init: -> - return if g.BOARD.ID is 'f' or g.VIEW is 'catalog' + return if g.BOARD.ID is 'f' or g.VIEW is 'catalog' or !Conf['JSON Navigation'] @button = $.el 'a', className: 'index-refresh-shortcut fa' @@ -112,14 +112,14 @@ 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' - pageNum = Index.getCurrentPage() + 1 + 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 - history.pushState null, '', "/#{g.BOARD}/#{pageNum}" nodes = Index.sortedNodes[nodesPerPage * pageNum ... nodesPerPage * (pageNum + 1)] Index.buildReplies nodes if Conf['Show Replies'] $.add Index.root, nodes - Index.setPage() + Index.setPage pageNum endNotice: do -> notify = false @@ -148,11 +148,6 @@ Index = return if a.textContent is 'Catalog' e.preventDefault() Index.userPageNav +a.pathname.split('/')[2] - link: (e) -> - return if g.VIEW isnt 'index' or /catalog/.test @href - e.preventDefault() - history.pushState null, '', @pathname - Index.update() scrollToIndex: -> Header.scrollToIfNeeded Index.root @@ -197,8 +192,8 @@ Index = $.rmAll pagesRoot $.add pagesRoot, nodes Index.togglePagelist() - setPage: -> - pageNum = Index.getCurrentPage() + setPage: (pageNum) -> + pageNum or= Index.getCurrentPage() maxPageNum = Index.getMaxPageNum() pagesRoot = $ '.pages', Index.pagelist # Previous/Next buttons @@ -227,6 +222,7 @@ Index = return unless d.readyState is 'loading' or Index.root.parentElement $.replace $('.board'), Index.root + delete Index.pageNum Index.req?.abort() Index.notice?.close() diff --git a/src/General/Navigate.coffee b/src/General/Navigate.coffee index fc78440d8..4ae1cba42 100644 --- a/src/General/Navigate.coffee +++ b/src/General/Navigate.coffee @@ -1,7 +1,7 @@ Navigate = path: window.location.pathname init: -> - return if g.VIEW is 'catalog' or g.BOARD.ID is 'f' + return if g.VIEW is 'catalog' or g.BOARD.ID is 'f' or !Conf['JSON Navigation'] # blink/webkit throw a popstate on page load. Not what we want. $.ready -> $.on window, 'popstate', Navigate.popstate @@ -174,6 +174,8 @@ Navigate = return if view is 'catalog' or 'f' in [boardID, g.BOARD.ID] e.preventDefault() if e + delete Index.pageNum + path = @pathname path += @hash if @hash