diff --git a/builds/appchan-x.user.js b/builds/appchan-x.user.js index 4fa526c8f..0e3899e69 100644 --- a/builds/appchan-x.user.js +++ b/builds/appchan-x.user.js @@ -3349,7 +3349,7 @@ if (!(!$.hasClass(quotelink, 'deadlink'))) { continue; } - $.add(quotelink, $.tn('\u00A0(Dead)')); + quotelink.textContent = quotelink.textContent + '\u00A0(Dead)'; $.addClass(quotelink, 'deadlink'); } }; @@ -6954,7 +6954,7 @@ if (Conf['Quote Inlining']) { $.on(link, 'click', QuoteInline.toggle); if (Conf['Quote Hash Navigation']) { - nodes.push.apply(nodes, QuoteInline.qiQuote(link, $.hasClass(link, 'filtered'))); + nodes.push(QuoteInline.qiQuote(link, $.hasClass(link, 'filtered'))); } } $.add(container, nodes); @@ -8235,12 +8235,14 @@ $.on(d, 'dragover', QR.dragOver); $.on(d, 'drop', QR.dropFile); $.on(d, 'dragstart dragend', QR.drag); - switch (g.VIEW) { - case 'index': + return { + index: function() { return $.on(d, 'IndexRefresh', QR.generatePostableThreadsList); - case 'thread': + }, + thread: function() { return $.on(d, 'ThreadUpdate', QR.statusCheck); - } + } + }[g.VIEW](); }, statusCheck: function() { if (g.DEAD) { @@ -8572,7 +8574,7 @@ return list.value = g.VIEW === 'thread' ? g.THREADID : 'new'; }, dialog: function() { - var check, dialog, elm, event, flagSelector, i, items, key, mimeTypes, name, node, nodes, save, value, _ref; + var check, dialog, elm, event, i, items, key, mimeTypes, name, node, nodes, save, value, _ref; QR.nodes = nodes = { el: dialog = UI.dialog('qr', 'top:0;right:0;', "
") }; @@ -8634,12 +8636,7 @@ nodes.flashTag.dataset["default"] = '4'; $.add(nodes.form, nodes.flashTag); } - if (flagSelector = $('.flagSelector')) { - nodes.flag = flagSelector.cloneNode(true); - nodes.flag.dataset.name = 'flag'; - nodes.flag.dataset["default"] = '0'; - $.add(nodes.form, nodes.flag); - } + QR.flagsInput(); $.on(nodes.filename.parentNode, 'click keydown', QR.openFileInput); items = $$('*', QR.nodes.el); i = 0; @@ -8725,6 +8722,40 @@ return $.rmClass(this, 'tripped'); } }, + flags: function() { + var flag, fn, select, _i, _len, _ref; + fn = function(val) { + return $.el('option', { + value: val[0], + textContent: val[1] + }); + }; + select = $.el('select', { + name: 'flag', + className: 'flagSelector' + }); + _ref = [['0', 'None'], ['US', 'American'], ['KP', 'Best Korean'], ['BL', 'Black Nationalist'], ['CM', 'Communist'], ['CF', 'Confederate'], ['RE', 'Conservative'], ['EU', 'European'], ['GY', 'Gay'], ['PC', 'Hippie'], ['IL', 'Israeli'], ['DM', 'Liberal'], ['RP', 'Libertarian'], ['MF', 'Muslim'], ['NZ', 'Nazi'], ['OB', 'Obama'], ['PR', 'Pirate'], ['RB', 'Rebel'], ['TP', 'Tea Partier'], ['TX', 'Texan'], ['TR', 'Tree Hugger'], ['WP', 'White Supremacist']]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + flag = _ref[_i]; + $.add(select, fn(flag)); + } + return select; + }, + flagsInput: function() { + var flag, nodes; + nodes = QR.nodes; + if (nodes.flagSelector) { + $.rm(nodes.flagSelector); + delete nodes.flagSelector; + } + if (g.BOARD.ID === 'pol') { + flag = QR.flags(); + flag.dataset.name = 'flag'; + flag.dataset["default"] = '0'; + nodes.flag = flag; + return $.add(nodes.form, flag); + } + }, preSubmitHooks: [], submit: function(e) { var challenge, err, extra, filetag, formData, hook, options, post, response, textOnly, thread, threadID, _i, _len, _ref, _ref1; @@ -15696,19 +15727,32 @@ return QR.generatePostableThreadsList(); }, updateContext: function(view) { + var oldView; + if (view === g.VIEW) { + return; + } $.rmClass(doc, g.VIEW); $.addClass(doc, view); + oldView = g.VIEW; g.VIEW = view; - switch (view) { - case 'index': + return { + index: function() { + if (oldView === g.VIEW) { + return; + } delete g.THREADID; $.off(d, 'ThreadUpdate', QR.statusCheck); return $.on(d, 'IndexRefresh', QR.generatePostableThreadsList); - case 'thread': + }, + thread: function() { g.THREADID = +window.location.pathname.split('/')[3]; + if (oldView === g.VIEW) { + return; + } $.on(d, 'ThreadUpdate', QR.statusCheck); return $.off(d, 'IndexRefresh', QR.generatePostableThreadsList); - } + } + }[g.VIEW](); }, updateBoard: function(boardID) { var fullBoardList, onload, req; @@ -15717,6 +15761,7 @@ $.rmClass($('.current', fullBoardList), 'current'); $.addClass($("a[href*='/" + boardID + "/']", fullBoardList), 'current'); Header.generateBoardList(Conf['boardnav'].replace(/(\r\n|\n|\r)/g, ' ')); + QR.flagsInput(); onload = function(e) { var aboard, board, err, _i, _len, _ref; if (e.type === 'abort') { @@ -15750,14 +15795,14 @@ return; } Navigate.updateTitle(board); - return Navigate.updateFavicon(!!board.ws_board); + return Navigate.updateSFW(!!board.ws_board); }; return req = $.ajax('//a.4cdn.org/boards.json', { onabort: onload, onloadend: onload }); }, - updateFavicon: function(sfw) { + updateSFW: function(sfw) { var theme; Favicon.el.href = "//s.4cdn.org/image/favicon" + (sfw ? '-ws' : '') + ".ico"; $.add(d.head, Favicon.el); @@ -15776,7 +15821,6 @@ theme = Themes[Conf[g.THEMESTRING] || (sfw ? 'Yotsuba B' : 'Yotsuba')] || Themes[Conf[g.THEMESTRING] = sfw ? 'Yotsuba B' : 'Yotsuba']; Style.setTheme(theme); } - mainStyleSheet.href = newStyleSheet.href; return Main.setClass(); }, updateTitle: function(_arg) { @@ -15820,26 +15864,30 @@ pageNum = view; view = 'index'; } - if (view !== g.VIEW) { - Navigate.disconnect(); - Navigate.clean(); + if (view === g.VIEW && boardID === g.BOARD.ID) { Navigate.updateContext(view); + } else { + Navigate.disconnect(); + Navigate.updateContext(view); + Navigate.clean(); Navigate.reconnect(); } - if (view === 'index') { - if (boardID === g.BOARD.ID) { - Navigate.title = function() { + if (boardID === g.BOARD.ID) { + Navigate.title = function() { + if (view === 'index') { return d.title = $('.boardTitle').textContent; - }; - } else { - g.BOARD = new Board(boardID); - Navigate.title = function() { - return Navigate.updateBoard(boardID); - }; - } + } + }; + } else { + g.BOARD = new Board(boardID); + Navigate.title = function() { + return Navigate.updateBoard(boardID); + }; + } + if (view === 'index') { return Index.update(pageNum); } else { - Navigate.updateFavicon(Favicon.SFW); + Navigate.updateSFW(Favicon.SFW); load = Navigate.load; Navigate.req = $.ajax("//a.4cdn.org/" + boardID + "/res/" + threadID + ".json", { onabort: load, @@ -15866,6 +15914,7 @@ new Notice('warning', "Failed to load thread." + (req.status ? " " + req.status : '')); return; } + Navigate.title(); try { return Navigate.parse(JSON.parse(req.response).posts); } catch (_error) { diff --git a/builds/crx/script.js b/builds/crx/script.js index 3687a3a58..311117af9 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -3355,7 +3355,7 @@ if (!(!$.hasClass(quotelink, 'deadlink'))) { continue; } - $.add(quotelink, $.tn('\u00A0(Dead)')); + quotelink.textContent = quotelink.textContent + '\u00A0(Dead)'; $.addClass(quotelink, 'deadlink'); } }; @@ -6957,7 +6957,7 @@ if (Conf['Quote Inlining']) { $.on(link, 'click', QuoteInline.toggle); if (Conf['Quote Hash Navigation']) { - nodes.push.apply(nodes, QuoteInline.qiQuote(link, $.hasClass(link, 'filtered'))); + nodes.push(QuoteInline.qiQuote(link, $.hasClass(link, 'filtered'))); } } $.add(container, nodes); @@ -8239,12 +8239,14 @@ $.on(d, 'dragover', QR.dragOver); $.on(d, 'drop', QR.dropFile); $.on(d, 'dragstart dragend', QR.drag); - switch (g.VIEW) { - case 'index': + return { + index: function() { return $.on(d, 'IndexRefresh', QR.generatePostableThreadsList); - case 'thread': + }, + thread: function() { return $.on(d, 'ThreadUpdate', QR.statusCheck); - } + } + }[g.VIEW](); }, statusCheck: function() { if (g.DEAD) { @@ -8580,7 +8582,7 @@ return list.value = g.VIEW === 'thread' ? g.THREADID : 'new'; }, dialog: function() { - var check, dialog, event, flagSelector, i, items, key, mimeTypes, name, node, nodes, save, value, _ref; + var check, dialog, event, i, items, key, mimeTypes, name, node, nodes, save, value, _ref; QR.nodes = nodes = { el: dialog = UI.dialog('qr', 'top:0;right:0;', "") }; @@ -8642,12 +8644,7 @@ nodes.flashTag.dataset["default"] = '4'; $.add(nodes.form, nodes.flashTag); } - if (flagSelector = $('.flagSelector')) { - nodes.flag = flagSelector.cloneNode(true); - nodes.flag.dataset.name = 'flag'; - nodes.flag.dataset["default"] = '0'; - $.add(nodes.form, nodes.flag); - } + QR.flagsInput(); $.on(nodes.filename.parentNode, 'click keydown', QR.openFileInput); $.on(dialog, 'focusin', QR.focusin); $.on(dialog, 'focusout', QR.focusout); @@ -8716,6 +8713,40 @@ return $.rmClass(this, 'tripped'); } }, + flags: function() { + var flag, fn, select, _i, _len, _ref; + fn = function(val) { + return $.el('option', { + value: val[0], + textContent: val[1] + }); + }; + select = $.el('select', { + name: 'flag', + className: 'flagSelector' + }); + _ref = [['0', 'None'], ['US', 'American'], ['KP', 'Best Korean'], ['BL', 'Black Nationalist'], ['CM', 'Communist'], ['CF', 'Confederate'], ['RE', 'Conservative'], ['EU', 'European'], ['GY', 'Gay'], ['PC', 'Hippie'], ['IL', 'Israeli'], ['DM', 'Liberal'], ['RP', 'Libertarian'], ['MF', 'Muslim'], ['NZ', 'Nazi'], ['OB', 'Obama'], ['PR', 'Pirate'], ['RB', 'Rebel'], ['TP', 'Tea Partier'], ['TX', 'Texan'], ['TR', 'Tree Hugger'], ['WP', 'White Supremacist']]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + flag = _ref[_i]; + $.add(select, fn(flag)); + } + return select; + }, + flagsInput: function() { + var flag, nodes; + nodes = QR.nodes; + if (nodes.flagSelector) { + $.rm(nodes.flagSelector); + delete nodes.flagSelector; + } + if (g.BOARD.ID === 'pol') { + flag = QR.flags(); + flag.dataset.name = 'flag'; + flag.dataset["default"] = '0'; + nodes.flag = flag; + return $.add(nodes.form, flag); + } + }, preSubmitHooks: [], submit: function(e) { var challenge, err, extra, filetag, formData, hook, options, post, response, textOnly, thread, threadID, _i, _len, _ref, _ref1; @@ -15691,19 +15722,32 @@ return QR.generatePostableThreadsList(); }, updateContext: function(view) { + var oldView; + if (view === g.VIEW) { + return; + } $.rmClass(doc, g.VIEW); $.addClass(doc, view); + oldView = g.VIEW; g.VIEW = view; - switch (view) { - case 'index': + return { + index: function() { + if (oldView === g.VIEW) { + return; + } delete g.THREADID; $.off(d, 'ThreadUpdate', QR.statusCheck); return $.on(d, 'IndexRefresh', QR.generatePostableThreadsList); - case 'thread': + }, + thread: function() { g.THREADID = +window.location.pathname.split('/')[3]; + if (oldView === g.VIEW) { + return; + } $.on(d, 'ThreadUpdate', QR.statusCheck); return $.off(d, 'IndexRefresh', QR.generatePostableThreadsList); - } + } + }[g.VIEW](); }, updateBoard: function(boardID) { var fullBoardList, onload, req; @@ -15712,6 +15756,7 @@ $.rmClass($('.current', fullBoardList), 'current'); $.addClass($("a[href*='/" + boardID + "/']", fullBoardList), 'current'); Header.generateBoardList(Conf['boardnav'].replace(/(\r\n|\n|\r)/g, ' ')); + QR.flagsInput(); onload = function(e) { var aboard, board, err, _i, _len, _ref; if (e.type === 'abort') { @@ -15745,14 +15790,14 @@ return; } Navigate.updateTitle(board); - return Navigate.updateFavicon(!!board.ws_board); + return Navigate.updateSFW(!!board.ws_board); }; return req = $.ajax('//a.4cdn.org/boards.json', { onabort: onload, onloadend: onload }); }, - updateFavicon: function(sfw) { + updateSFW: function(sfw) { var theme; Favicon.el.href = "//s.4cdn.org/image/favicon" + (sfw ? '-ws' : '') + ".ico"; $.add(d.head, Favicon.el); @@ -15771,7 +15816,6 @@ theme = Themes[Conf[g.THEMESTRING] || (sfw ? 'Yotsuba B' : 'Yotsuba')] || Themes[Conf[g.THEMESTRING] = sfw ? 'Yotsuba B' : 'Yotsuba']; Style.setTheme(theme); } - mainStyleSheet.href = newStyleSheet.href; return Main.setClass(); }, updateTitle: function(_arg) { @@ -15815,26 +15859,30 @@ pageNum = view; view = 'index'; } - if (view !== g.VIEW) { - Navigate.disconnect(); - Navigate.clean(); + if (view === g.VIEW && boardID === g.BOARD.ID) { Navigate.updateContext(view); + } else { + Navigate.disconnect(); + Navigate.updateContext(view); + Navigate.clean(); Navigate.reconnect(); } - if (view === 'index') { - if (boardID === g.BOARD.ID) { - Navigate.title = function() { + if (boardID === g.BOARD.ID) { + Navigate.title = function() { + if (view === 'index') { return d.title = $('.boardTitle').textContent; - }; - } else { - g.BOARD = new Board(boardID); - Navigate.title = function() { - return Navigate.updateBoard(boardID); - }; - } + } + }; + } else { + g.BOARD = new Board(boardID); + Navigate.title = function() { + return Navigate.updateBoard(boardID); + }; + } + if (view === 'index') { return Index.update(pageNum); } else { - Navigate.updateFavicon(Favicon.SFW); + Navigate.updateSFW(Favicon.SFW); load = Navigate.load; Navigate.req = $.ajax("//a.4cdn.org/" + boardID + "/res/" + threadID + ".json", { onabort: load, @@ -15861,6 +15909,7 @@ new Notice('warning', "Failed to load thread." + (req.status ? " " + req.status : '')); return; } + Navigate.title(); try { return Navigate.parse(JSON.parse(req.response).posts); } catch (_error) { diff --git a/src/General/Navigate.coffee b/src/General/Navigate.coffee index 536f007f5..c73ce4790 100644 --- a/src/General/Navigate.coffee +++ b/src/General/Navigate.coffee @@ -90,19 +90,24 @@ Navigate = QR.generatePostableThreadsList() updateContext: (view) -> + return if view is g.VIEW + $.rmClass doc, g.VIEW $.addClass doc, view + oldView = g.VIEW g.VIEW = view - - switch view - when 'index' + { + index: -> + return if oldView is g.VIEW delete g.THREADID $.off d, 'ThreadUpdate', QR.statusCheck $.on d, 'IndexRefresh', QR.generatePostableThreadsList - when 'thread' + thread: -> g.THREADID = +window.location.pathname.split('/')[3] + return if oldView is g.VIEW $.on d, 'ThreadUpdate', QR.statusCheck $.off d, 'IndexRefresh', QR.generatePostableThreadsList + }[g.VIEW]() updateBoard: (boardID) -> req = null @@ -112,6 +117,8 @@ Navigate = $.addClass $("a[href*='/#{boardID}/']", fullBoardList), 'current' Header.generateBoardList Conf['boardnav'].replace /(\r\n|\n|\r)/g, ' ' + QR.flagsInput() + onload = (e) -> if e.type is 'abort' req.onloadend = null @@ -133,13 +140,13 @@ Navigate = return unless board Navigate.updateTitle board - Navigate.updateFavicon !!board.ws_board + Navigate.updateSFW !!board.ws_board req = $.ajax '//a.4cdn.org/boards.json', onabort: onload onloadend: onload - updateFavicon: (sfw) -> + updateSFW: (sfw) -> # TODO: think of a better name for this. Changes style, too. Favicon.el.href = "//s.4cdn.org/image/favicon#{if sfw then '-ws' else ''}.ico" $.add d.head, Favicon.el # Changing the href alone doesn't update the icon on Firefox @@ -148,7 +155,7 @@ Navigate = Favicon.SFW = sfw Favicon.update() - + g.TYPE = if sfw then 'sfw' else 'nsfw' if Conf["NSFW/SFW Mascots"] Main.setMascotString() @@ -159,8 +166,6 @@ Navigate = theme = Themes[Conf[g.THEMESTRING] or if sfw then 'Yotsuba B' else 'Yotsuba'] or Themes[Conf[g.THEMESTRING] = if sfw then 'Yotsuba B' else 'Yotsuba'] Style.setTheme theme - mainStyleSheet.href = newStyleSheet.href - Main.setClass() updateTitle: ({board, title}) -> @@ -195,24 +200,26 @@ Navigate = pageNum = view view = 'index' # path is "/boardID/". See the problem? - if view isnt g.VIEW - Navigate.disconnect() - Navigate.clean() + if view is g.VIEW and boardID is g.BOARD.ID Navigate.updateContext view + else # We've navigated somewhere we weren't before! + Navigate.disconnect() + Navigate.updateContext view + Navigate.clean() Navigate.reconnect() - if view is 'index' - if boardID is g.BOARD.ID - Navigate.title = -> d.title = $('.boardTitle').textContent - else - g.BOARD = new Board boardID - Navigate.title = -> Navigate.updateBoard boardID + 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 + if view is 'index' Index.update pageNum # Moving from index to thread or thread to thread else - Navigate.updateFavicon Favicon.SFW + Navigate.updateSFW Favicon.SFW {load} = Navigate Navigate.req = $.ajax "//a.4cdn.org/#{boardID}/res/#{threadID}.json", onabort: load @@ -235,6 +242,8 @@ Navigate = new Notice 'warning', "Failed to load thread.#{if req.status then " #{req.status}" else ''}" return + Navigate.title() + try Navigate.parse JSON.parse(req.response).posts catch err diff --git a/src/General/lib/post.class b/src/General/lib/post.class index 7eda1dfe9..d5108dde9 100755 --- a/src/General/lib/post.class +++ b/src/General/lib/post.class @@ -180,7 +180,7 @@ class Post # Get quotelinks/backlinks to this post # and paint them (Dead). for quotelink in Get.allQuotelinksLinkingTo @ when not $.hasClass quotelink, 'deadlink' - $.add quotelink, $.tn '\u00A0(Dead)' + quotelink.textContent = quotelink.textContent + '\u00A0(Dead)' $.addClass quotelink, 'deadlink' return # XXX tmp fix for 4chan's racing condition diff --git a/src/Posting/QR.coffee b/src/Posting/QR.coffee index 0c4ba8a46..0a0c06546 100644 --- a/src/Posting/QR.coffee +++ b/src/Posting/QR.coffee @@ -60,11 +60,12 @@ QR = $.on d, 'dragover', QR.dragOver $.on d, 'drop', QR.dropFile $.on d, 'dragstart dragend', QR.drag - switch g.VIEW - when 'index' + { + index: -> $.on d, 'IndexRefresh', QR.generatePostableThreadsList - when 'thread' + thread: -> $.on d, 'ThreadUpdate', QR.statusCheck + }[g.VIEW]() statusCheck: -> if g.DEAD @@ -407,11 +408,8 @@ QR = """ nodes.flashTag.dataset.default = '4' $.add nodes.form, nodes.flashTag - if flagSelector = $ '.flagSelector' - nodes.flag = flagSelector.cloneNode true - nodes.flag.dataset.name = 'flag' - nodes.flag.dataset.default = '0' - $.add nodes.form, nodes.flag + + QR.flagsInput() $.on nodes.filename.parentNode, 'click keydown', QR.openFileInput @@ -487,6 +485,54 @@ QR = if check and !@.className.match "\\btripped\\b" then $.addClass @, 'tripped' else if !check and @.className.match "\\btripped\\b" then $.rmClass @, 'tripped' + flags: -> + fn = (val) -> $.el 'option', + value: val[0] + textContent: val[1] + select = $.el 'select', + name: 'flag' + className: 'flagSelector' + + $.add select, fn flag for flag in [ + ['0', 'None'] + ['US', 'American'] + ['KP', 'Best Korean'] + ['BL', 'Black Nationalist'] + ['CM', 'Communist'] + ['CF', 'Confederate'] + ['RE', 'Conservative'] + ['EU', 'European'] + ['GY', 'Gay'] + ['PC', 'Hippie'] + ['IL', 'Israeli'] + ['DM', 'Liberal'] + ['RP', 'Libertarian'] + ['MF', 'Muslim'] + ['NZ', 'Nazi'] + ['OB', 'Obama'] + ['PR', 'Pirate'] + ['RB', 'Rebel'] + ['TP', 'Tea Partier'] + ['TX', 'Texan'] + ['TR', 'Tree Hugger'] + ['WP', 'White Supremacist'] + ] + + select + + flagsInput: -> + {nodes} = QR + if nodes.flagSelector + $.rm nodes.flagSelector + delete nodes.flagSelector + + if g.BOARD.ID is 'pol' + flag = QR.flags() + flag.dataset.name = 'flag' + flag.dataset.default = '0' + nodes.flag = flag + $.add nodes.form, flag + preSubmitHooks: [] submit: (e) -> diff --git a/src/Quotelinks/QuoteBacklink.coffee b/src/Quotelinks/QuoteBacklink.coffee index de0d0ba5c..34820cdaa 100755 --- a/src/Quotelinks/QuoteBacklink.coffee +++ b/src/Quotelinks/QuoteBacklink.coffee @@ -42,7 +42,7 @@ QuoteBacklink = $.on link, 'mouseover', QuotePreview.mouseover if Conf['Quote Inlining'] $.on link, 'click', QuoteInline.toggle - nodes.push.apply nodes, QuoteInline.qiQuote link, $.hasClass link, 'filtered' if Conf['Quote Hash Navigation'] + nodes.push QuoteInline.qiQuote link, $.hasClass link, 'filtered' if Conf['Quote Hash Navigation'] $.add container, nodes return secondNode: ->