diff --git a/Gruntfile.coffee b/Gruntfile.coffee index f1a579c44..62aa4eaf4 100755 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -37,7 +37,6 @@ module.exports = (grunt) -> 'src/Monitoring/**/*.coffee' 'src/Archive/**/*.coffee' 'src/Miscellaneous/**/*.coffee' - 'src/General/Navigate.coffee' 'src/General/Settings.coffee' 'src/General/Main.coffee' ] diff --git a/src/General/Config.coffee b/src/General/Config.coffee index 1d0139220..a5b4f206a 100755 --- a/src/General/Config.coffee +++ b/src/General/Config.coffee @@ -3,7 +3,7 @@ Config = 'Miscellaneous': 'JSON Navigation' : [ false - 'Use JSON for loading the Board Index and Threads. Also allows searching and sorting the board index and infinite scolling.' + 'Use JSON for loading the Board Index. Also allows searching and sorting the board index and infinite scolling.' ] 'Catalog Links': [ true diff --git a/src/General/Header.coffee b/src/General/Header.coffee index 5b3b95a9e..3980ef86f 100755 --- a/src/General/Header.coffee +++ b/src/General/Header.coffee @@ -94,8 +94,6 @@ Header = $.ready => @footer = footer = $.id 'boardNavDesktopFoot' - if Conf['JSON Navigation'] - $.on a, 'click', Navigate.navigate for a in $$ 'a', footer if a = $ "a[href*='/#{g.BOARD}/']", footer a.className = 'current' @@ -137,8 +135,6 @@ Header = id: 'board-list' innerHTML: "" for a in $$ 'a', boardList - 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 @@ -184,9 +180,6 @@ Header = if a.textContent is board a = a.cloneNode true - 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 else if /-full/.test t diff --git a/src/General/Index.coffee b/src/General/Index.coffee index e5da9a38e..48ee3abb2 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' or !Conf['JSON Navigation'] + return if g.BOARD.ID is 'f' or g.VIEW isnt 'index' or !Conf['JSON Navigation'] @board = "#{g.BOARD}" @@ -71,20 +71,16 @@ Index = @navLinks = $.el 'div', className: 'navLinks' innerHTML: <%= importHTML('Features/Index-navlinks') %> - @navLinksBot = $.el 'div', - className: 'navLinks navLinksBot' - innerHTML: <%= importHTML('Features/Index-navlinksbot') %> + $('.returnlink a', @navLinks).href = "//boards.4chan.org/#{g.BOARD}/" + $('.cataloglink a', @navLinks).href = "//boards.4chan.org/#{g.BOARD}/catalog" @searchInput = $ '#index-search', @navLinks @currentPage = @getCurrentPage() - - Index.setNavLinks() + $.on window, 'popstate', @cb.popstate $.on d, 'scroll', Index.scroll $.on @pagelist, 'click', @cb.pageNav $.on @searchInput, 'input', @onSearchInput $.on $('#index-search-clear', @navLinks), 'click', @clearSearch - $.on $('.returnlink a', @navLinks), 'click', Navigate.navigate - $.on $('.returnlink a', @navLinksBot), 'click', Navigate.navigate @update() if g.VIEW is 'index' $.asap (-> $('.board', doc) or d.readyState isnt 'loading'), -> @@ -100,15 +96,11 @@ Index = # Does not work on Firefox unfortunately. bugzil.la/939713 d.implementation.createDocument(null, null, null).appendChild board - $.asap (-> $('.navLinksBot.mobile', doc) or d.readyState isnt 'loading'), -> - $.rm el for el in $$ '.navLinks, .navLinksBot + hr' + $.rm el for el in $$ '.navLinks' $.id('search-box')?.parentNode.remove() topNavPos = $.id('delform').previousElementSibling - botNavPos = $ '.board' - $.before topNavPos, $.el 'hr' if g.VIEW is 'index' + $.before topNavPos, $.el 'hr' $.before topNavPos, Index.navLinks - $.after botNavPos, $.el 'hr' - $.after botNavPos, Index.navLinksBot $.asap (-> $('.pagelist', doc) or d.readyState isnt 'loading'), -> if pagelist = $('.pagelist') @@ -117,10 +109,6 @@ Index = $.after $.id('delform'), Index.pagelist $.rmClass doc, 'index-loading' - setNavLinks: () -> - $('.returnlink a', Index.navLinks).href = $('.returnlink a', Index.navLinksBot).href = "//boards.4chan.org/#{g.BOARD}/" - $('.cataloglink a', Index.navLinks).href = $('.cataloglink a', Index.navLinksBot).href = "//boards.4chan.org/#{g.BOARD}/catalog" - scroll: -> return if Index.req or Conf['Index Mode'] isnt 'infinite' or (window.scrollY <= 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 @@ -153,6 +141,9 @@ Index = Index.buildThreads() Index.sort() Index.buildIndex() + popstate: (e) -> + pageNum = Index.getCurrentPage() + Index.pageLoad pageNum if Index.currentPage isnt pageNum pageNav: (e) -> return if e.shiftKey or e.altKey or e.ctrlKey or e.metaKey or e.button isnt 0 switch e.target.nodeName @@ -172,7 +163,7 @@ Index = getCurrentPage: -> +window.location.pathname.split('/')[2] or 1 userPageNav: (pageNum) -> - Navigate.pushState if pageNum is 1 then './' else pageNum + history.pushState null, '', if pageNum is 1 then './' else pageNum if Conf['Refreshed Navigation'] and Conf['Index Mode'] isnt 'all pages' Index.update pageNum else @@ -232,9 +223,6 @@ Index = update: (pageNum, forceReparse) -> return unless navigator.onLine - if g.VIEW is 'thread' - return ThreadUpdater.update() if Conf['Thread Updater'] - return unless d.readyState is 'loading' or Index.root.parentElement $.replace $('.board'), Index.root delete Index.pageNum @@ -281,8 +269,6 @@ Index = new Notice 'warning', err, 1 return - Navigate.title() - try if req.status is 200 Index.parse req.response, pageNum @@ -498,7 +484,7 @@ Index = Index.buildIndex() Index.setPage() else - Navigate.pushState if pageNum is 1 then './' else pageNum + history.pushState null, '', if pageNum is 1 then './' else pageNum Index.pageLoad pageNum querySearch: (query) -> diff --git a/src/General/Main.coffee b/src/General/Main.coffee index 6e2f0717f..596a9d497 100755 --- a/src/General/Main.coffee +++ b/src/General/Main.coffee @@ -345,7 +345,6 @@ Main = ['Keybinds', Keybinds] ['Show Dice Roll', Dice] ['Banner', Banner] - ['Navigate', Navigate] ] Main.init() diff --git a/src/General/Navigate.coffee b/src/General/Navigate.coffee deleted file mode 100644 index 37612969b..000000000 --- a/src/General/Navigate.coffee +++ /dev/null @@ -1,329 +0,0 @@ -Navigate = - path: window.location.pathname - init: -> - return if g.VIEW is 'catalog' or g.BOARD.ID is 'f' or !Conf['JSON Navigation'] - - <% if (type === 'crx') { %> - # blink/webkit throw a popstate on page load. Not what we want. - popstateHack = -> - $.off window, 'popstate', popstateHack - $.on window, 'popstate', Navigate.popstate - - $.on window, 'popstate', popstateHack - <% } else { %> - $.on window, 'popstate', Navigate.popstate - <% } %> - - @title = -> return - - Thread.callbacks.push - name: 'Navigate' - cb: @thread - - Post.callbacks.push - name: 'Navigate' - cb: @post - - thread: -> - return if g.VIEW is 'thread' # The reply link only exists in index view - replyLink = $ 'a.replylink', @OP.nodes.info - $.on replyLink, 'click', Navigate.navigate - - post: -> # Allows us to navigate via JSON from thread to thread by hashes and quote highlights. - # We don't need to reload the thread inside the thread - unless g.VIEW is 'thread' and @thread.ID is g.THREADID - $.on $('a[title="Link to this post"]', @nodes.info), 'click', Navigate.navigate - - return unless (linktype = if Conf['Quote Inlining'] and Conf['Quote Hash Navigation'] - '.hashlink' - else if !Conf['Quote Inlining'] - '.quotelink' - else - null - ) - - Navigate.quoteLink $$ linktype, @nodes.comment - - quoteLink: (links) -> - for link in links - Navigate.singleQuoteLink link - return - - singleQuoteLink: (link) -> - {boardID, threadID} = Get.postDataFromLink link - if g.VIEW is 'index' or boardID isnt g.BOARD.ID or threadID isnt g.THREADID - $.on link, 'click', Navigate.navigate - - clean: -> - # Garbage collection - g.threads.forEach (thread) -> thread.collect() - QuoteBacklink.containers = {} - - $.rmAll $ '.board' - - features: [ - ['Thread Excerpt', ThreadExcerpt] - ['Unread Count', Unread] - ['Quote Threading', QuoteThreading] - ['Thread Stats', ThreadStats] - ['Thread Updater', ThreadUpdater] - ['Thread Expansion', ExpandThread] - ] - - disconnect: -> - for [name, feature] in Navigate.features - try - feature.disconnect() - catch err - errors = [] unless errors - errors.push - message: "Failed to disconnect feature #{name}." - error: err - - Main.handleErrors errors if errors - - return - - reconnect: -> - for [name, feature] in Navigate.features - try - feature.init() - catch err - errors = [] unless errors - errors.push - message: "Failed to reconnect feature #{name}." - error: err - Main.handleErrors errors if errors - return - - updateContext: (view) -> - g.DEAD = false - g.THREADID = +window.location.pathname.split('/')[3] if view is 'thread' - - unless view is g.VIEW - $.rmClass doc, g.VIEW - $.addClass doc, view - - delete g.THREADID if view is 'index' - - origFormThread = $ 'form[name="post"] input[name="resto"]' - if view is 'thread' - unless origFormThread - origFormThread = $.el 'input', - type: 'hidden' - name: 'resto' - $.after ($.id 'postPassword'), origFormThread - origFormThread.value = g.THREADID - else - $.rm origFormThread if origFormThread - - if Conf['Quick Reply'] - QR.link.textContent = if view is 'thread' then 'Reply to Thread' else 'Start a Thread' - QR.status() # Re-enable the QR in the case of a 404'd thread or something. - for post in QR.posts - post.thread = g.THREADID or 'new' - - g.VIEW = view - - updateBoard: (boardID) -> - fullBoardList = $ '#full-board-list', Header.boardList - $.rmClass current, 'current' if current = $ '.current', fullBoardList - $.addClass current, 'current' if current = $ "a[href*='/#{boardID}/']", fullBoardList - Header.generateBoardList Conf['boardnav'].replace /(\r\n|\n|\r)/g, ' ' - - Index.setNavLinks() - $('form[name="post"]').action = "//sys.4chan.org/#{g.BOARD}/post" - QR.flagsInput() if Conf['Quick Reply'] - - $.cache '//a.4cdn.org/boards.json', -> - try - return unless @status is 200 - for aboard in @response.boards when aboard.board is boardID - board = aboard - break - - catch err - Main.handleErrors [ - message: "Navigation failed to update board name." - error: err - ] - - return unless board - Navigate.updateTitle board - Navigate.updateSFW !!board.ws_board - - updateSFW: (sfw) -> - Favicon.el.href = Favicon.default = "//s.4cdn.org/image/favicon#{if sfw then '-ws' else ''}.ico" - - # Changing the href alone doesn't update the icon on Firefox - $.add d.head, Favicon.el - - return if Favicon.SFW is sfw # Board SFW status hasn't changed - - Favicon.SFW = sfw - Favicon.update() - - findStyle = (type, base) -> - style = d.cookie.match new RegExp "\\b#{type}_style=([^;]+)" - return ["#{type}_style", (if style then style[1] else base)] - - style = if sfw - findStyle 'ws', 'Yotsuba B New' - else - findStyle 'nws', 'Yotsuba New' - - $.globalEval "var style_group = #{JSON.stringify style[0]}" - - $('link[title=switch]', d.head).href = $("link[title='#{style[1]}']", d.head).href - - Main.setClass() - - updateTitle: ({board, title}) -> - $.rm subtitle if subtitle = $ '.boardSubtitle' - $('.boardTitle').textContent = d.title = "/#{board}/ - #{title}" - - navigate: (e) -> - return if @hostname isnt 'boards.4chan.org' or window.location.hostname is 'rs.4chan.org' - if e - return if e.shiftKey or e.ctrlKey or (e.type is 'click' and e.button isnt 0) # Not simply a left click - - if @pathname is Navigate.path - return if @id is 'popState' - if g.VIEW is 'thread' - ThreadUpdater.update() if Conf['Thread Updater'] - else - Index.update() - e?.preventDefault() - return - - $.addClass Index.button, 'fa-spin' - Index.clearSearch() if Index.isSearching - - [_, boardID, view, threadID] = @pathname.split '/' - - return if view is 'catalog' or 'f' in [boardID, g.BOARD.ID] - e?.preventDefault() - Navigate.title = -> return - - delete Index.pageNum - $.rmAll Header.hover - - if threadID - view = 'thread' - else - pageNum = +view or 1 # string to number, '' to 1 - view = 'index' # path is "/boardID/". See the problem? - - path = @pathname - path += @hash if @hash - - history.pushState null, '', path unless @id is 'popState' - Navigate.path = @pathname - - unless view is 'index' and 'index' is g.VIEW and boardID is g.BOARD.ID - Navigate.disconnect() - Navigate.updateContext view - Navigate.clean() - Navigate.reconnect() - - if boardID is g.BOARD.ID - Navigate.title = -> d.title = $('.boardTitle').textContent if view is 'index' - else - g.BOARD = new Board boardID - Navigate.title = -> Navigate.updateBoard boardID - - Navigate.updateSFW Favicon.SFW - - if view is 'index' - return Index.update pageNum, true - - # Moving from index to thread or thread to thread - {load} = Navigate - Navigate.req = $.ajax "//a.4cdn.org/#{boardID}/thread/#{threadID}.json", - onabort: load - onloadend: load - - setTimeout (-> - if Navigate.req and !Navigate.notice - Navigate.notice = new Notice 'info', 'Loading thread...' - ), 3 * $.SECOND - - load: (e) -> - $.rmClass Index.button, 'fa-spin' - {req, notice} = Navigate - notice?.close() - delete Navigate.req - delete Navigate.notice - - if e.type is 'abort' or req.status isnt 200 - req.onloadend = null - new Notice 'warning', "Failed to load thread.#{if req.status then " #{req.status}" else ''}" - return - - Navigate.title() - - try - Navigate.parse req.response.posts - catch err - console.error 'Navigate failure:' - console.log err - # network error or non-JSON content for example. - if notice - notice.setType 'error' - notice.el.lastElementChild.textContent = 'Navigation Failed.' - setTimeout notice.close, 2 * $.SECOND - else - new Notice 'error', 'Navigation Failed.', 2 - return - - parse: (data) -> - posts = [] - errors = null - board = g.BOARD - threadRoot = Build.thread board, OP = data[0], true - thread = new Thread OP.no, board - - makePost = (postNode) -> - try - posts.push new Post postNode, thread, board - catch err - # Skip posts that we failed to parse. - errors = [] unless errors - errors.push - message: "Parsing of Post No.#{postNode.ID} failed. Post will be skipped." - error: err - - makePost $('.opContainer', threadRoot) - - i = 0 - while obj = data[++i] - post = Build.postFromObject obj, board - makePost post - $.add threadRoot, post - - Main.callbackNodes Thread, [thread] - Main.callbackNodes Post, posts - - QuoteThreading.force() if Conf['Quote Threading'] and not Conf['Unread Count'] - - board = $ '.board' - $.rmAll board - $.add board, [threadRoot, $.el 'hr'] - - Unread.ready() if Conf['Unread Count'] - - QR.generatePostableThreadsList() if Conf['Quick Reply'] - Header.hashScroll.call window - - Main.handleErrors errors if errors - - pushState: (path) -> - history.pushState null, '', path - Navigate.path = window.location.pathname - - popstate: -> - a = $.el 'a', - href: window.location - id: 'popState' - - Navigate.navigate.call a diff --git a/src/General/css/style.css b/src/General/css/style.css index 806b798f6..dcaddf123 100755 --- a/src/General/css/style.css +++ b/src/General/css/style.css @@ -471,8 +471,7 @@ div.center:not(.ad-cnt) { /* Index */ :root.index-loading .navLinks, :root.index-loading .board, -:root.index-loading .pagelist, -:root.thread .pagelist { +:root.index-loading .pagelist { display: none; } #index-search { @@ -498,15 +497,6 @@ div.center:not(.ad-cnt) { .summary { text-decoration: none; } -.index .returnlink, -.index .bottomlink, -.index .navLinksBot, -.index .navLinksBot + hr, -.thread #index-last-refresh, -.thread #index-search-clear, -.thread #index-search { - display: none; -} /* Announcement Hiding */ :root.hide-announcement #globalMessage { diff --git a/src/General/html/Features/Index-navlinksbot.html b/src/General/html/Features/Index-navlinksbot.html deleted file mode 100644 index a0f02ac4e..000000000 --- a/src/General/html/Features/Index-navlinksbot.html +++ /dev/null @@ -1,3 +0,0 @@ -Return -Catalog -Top diff --git a/src/Monitoring/ThreadUpdater.coffee b/src/Monitoring/ThreadUpdater.coffee index 4aa7a6465..24596e378 100755 --- a/src/Monitoring/ThreadUpdater.coffee +++ b/src/Monitoring/ThreadUpdater.coffee @@ -25,13 +25,12 @@ ThreadUpdater = $.on @timer, 'click', @update $.on @status, 'click', @update - unless Index.navLinksBot and $ '.updatelink', Index.navLinksBot - updateLink = $.el 'span', - innerHTML: 'Update' - className: 'brackets-wrap updatelink' - $.ready -> - $.add (Index.navLinksBot or $('.navLinksBot')), [$.tn(' '), updateLink] - $.on updateLink.firstElementChild, 'click', @update + updateLink = $.el 'span', + innerHTML: 'Update' + className: 'brackets-wrap updatelink' + $.ready -> + $.add $('.navLinksBot'), [$.tn(' '), updateLink] + $.on updateLink.firstElementChild, 'click', @update subEntries = [] for name, conf of Config.updater.checkbox diff --git a/src/Posting/QR.coffee b/src/Posting/QR.coffee index eaa72671a..68e60e0d8 100644 --- a/src/Posting/QR.coffee +++ b/src/Posting/QR.coffee @@ -56,7 +56,7 @@ QR = if Conf['QR Shortcut'] $.rmClass $('.qr-shortcut'), 'disabled' - if Conf['Bottom QR Link'] and (g.VIEW is 'thread' or Conf['JSON Navigation']) + if Conf['Bottom QR Link'] and g.VIEW is 'thread' linkBot = $.el 'div', innerHTML: 'Reply to Thread' className: "brackets-wrap qr-link-container-bottom" @@ -68,7 +68,7 @@ QR = if Conf['QR Shortcut'] $.rmClass $('.qr-shortcut'), 'disabled' - $.prepend (Index.navLinksBot or $('.navLinksBot')), linkBot + $.prepend $('.navLinksBot'), linkBot $.before $.id('togglePostFormLink'), link diff --git a/src/Quotelinks/QuoteBacklink.coffee b/src/Quotelinks/QuoteBacklink.coffee index 8be132be2..5dd6c301f 100755 --- a/src/Quotelinks/QuoteBacklink.coffee +++ b/src/Quotelinks/QuoteBacklink.coffee @@ -43,11 +43,6 @@ QuoteBacklink = if Conf['Quote Hash Navigation'] hash = QuoteInline.qiQuote link, $.hasClass link, 'filtered' nodes.push hash - if Conf['JSON Navigation'] - if hash - Navigate.singleQuoteLink hash - else unless Conf['Quote Inlining'] - Navigate.singleQuoteLink link $.add container, nodes return secondNode: ->