From 02fc7fecb330a42b42a8c7103607fbfb7a96161f Mon Sep 17 00:00:00 2001 From: Nicolas Stepien Date: Sat, 23 Feb 2013 00:02:34 +0100 Subject: [PATCH] Add Thread.OP|isSticky|isClosed. --- 4chan_x.user.js | 54 ++++++++++++++++++++++----------------------- src/features.coffee | 39 ++++++++++++++------------------ src/main.coffee | 6 ++++- 3 files changed, 48 insertions(+), 51 deletions(-) diff --git a/4chan_x.user.js b/4chan_x.user.js index e2fd10c2d..b4841e41c 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -20,7 +20,7 @@ // @icon data:image/gif;base64,R0lGODlhEAAQAKECAAAAAGbMM////////yH5BAEKAAIALAAAAAAQABAAAAIxlI+pq+D9DAgUoFkPDlbs7lGiI2bSVnKglnJMOL6omczxVZK3dH/41AG6Lh7i6qUoAAA7 // ==/UserScript== -/* 4chan X Beta - Version 3.0.0 - 2013-02-22 +/* 4chan X Beta - Version 3.0.0 - 2013-02-23 * http://mayhemydg.github.com/4chan-x/ * * Copyright (c) 2009-2011 James Campos @@ -1913,7 +1913,7 @@ if (!Conf['Hiding Buttons']) { return; } - return $.prepend(this.posts[this].nodes.root, ThreadHiding.makeButton(this, 'hide')); + return $.prepend(this.OP.nodes.root, ThreadHiding.makeButton(this, 'hide')); }, getHiddenThreads: function() { var hiddenThreads; @@ -2032,15 +2032,14 @@ return ThreadHiding.saveHiddenState(thread); }, hide: function(thread, makeStub) { - var a, numReplies, op, opInfo, span, threadRoot; + var a, numReplies, opInfo, span, threadRoot; if (makeStub == null) { makeStub = Conf['Stubs']; } if (thread.hidden) { return; } - op = thread.posts[thread]; - threadRoot = op.nodes.root.parentNode; + threadRoot = thread.OP.nodes.root.parentNode; threadRoot.hidden = thread.isHidden = true; if (!makeStub) { threadRoot.nextElementSibling.hidden = true; @@ -2070,7 +2069,7 @@ $.rm(thread.stub); delete thread.stub; } - threadRoot = thread.posts[thread].nodes.root.parentNode; + threadRoot = thread.OP.nodes.root.parentNode; return threadRoot.nextElementSibling.hidden = threadRoot.hidden = thread.isHidden = false; } }; @@ -3259,8 +3258,8 @@ fileHTML = ''; } tripcode = tripcode ? " " + tripcode + "" : ''; - sticky = isSticky ? ' Sticky' : ''; - closed = isClosed ? ' Closed' : ''; + sticky = isSticky ? ' Sticky' : ''; + closed = isClosed ? ' Closed' : ''; container = $.el('div', { id: "pc" + postID, className: "postContainer " + (isOP ? 'op' : 'reply') + "Container", @@ -3281,9 +3280,9 @@ Get = { threadExcerpt: function(thread) { - var excerpt, op, _ref; - op = thread.posts[thread]; - excerpt = ((_ref = op.info.subject) != null ? _ref.trim() : void 0) || op.info.comment.replace(/\n+/g, ' // ') || Conf['Anonymize'] && 'Anonymous' || $('.nameBlock', op.nodes.info).textContent.trim(); + var OP, excerpt, _ref; + OP = thread.OP; + excerpt = ((_ref = OP.info.subject) != null ? _ref.trim() : void 0) || OP.info.comment.replace(/\n+/g, ' // ') || Conf['Anonymize'] && 'Anonymous' || $('.nameBlock', OP.nodes.info).textContent.trim(); return "/" + thread.board + "/ - " + excerpt; }, postFromRoot: function(root) { @@ -4798,9 +4797,8 @@ }); }, node: function() { - var a, op, span; - op = this.posts[this]; - if (!(span = $('.summary', op.nodes.root.parentNode))) { + var a, span; + if (!(span = $('.summary', this.OP.nodes.root.parentNode))) { return; } a = $.el('a', { @@ -4818,7 +4816,7 @@ }, toggle: function(thread) { var a, inlined, num, replies, reply, text, threadRoot, url, _i, _len; - threadRoot = thread.posts[thread].nodes.root.parentNode; + threadRoot = thread.OP.nodes.root.parentNode; url = "//api.4chan.org/" + thread.board + "/res/" + thread + ".json"; a = $('.summary', threadRoot); text = a.textContent; @@ -4828,14 +4826,14 @@ $.cache(url, function() { return ExpandThread.parse(this, thread, a); }); - ExpandComment.expand(thread.posts[thread]); + ExpandComment.expand(thread.OP); break; case '×': a.textContent = text.replace('× Loading...', '+'); break; case '-': a.textContent = text.replace('-', '+'); - ExpandComment.contract(thread.posts[thread]); + ExpandComment.contract(thread.OP); num = (function() { switch (g.BOARD) { case 'b': @@ -5137,7 +5135,7 @@ node: function() { var input, _i, _len, _ref; ThreadUpdater.thread = this; - ThreadUpdater.root = this.posts[this].nodes.root.parentNode; + ThreadUpdater.root = this.OP.nodes.root.parentNode; ThreadUpdater.lastPost = +ThreadUpdater.root.lastElementChild.id.match(/\d+/)[0]; ThreadUpdater.outdateCount = 0; ThreadUpdater.lastModified = '0'; @@ -5419,13 +5417,12 @@ }); }, node: function() { - var favicon, op; - op = this.posts[this]; + var favicon; favicon = $.el('img', { className: 'favicon' }); $.on(favicon, 'click', ThreadWatcher.cb.toggle); - $.before($('input', op.nodes.post), favicon); + $.before($('input', this.OP.nodes.post), favicon); if (g.VIEW === 'thread' && this.ID === $.get('AutoWatch', 0)) { ThreadWatcher.watch(this); return $["delete"]('AutoWatch'); @@ -5436,7 +5433,7 @@ return $.add(d.body, ThreadWatcher.dialog); }, refresh: function(watched) { - var ID, board, div, favicon, id, link, nodes, op, props, thread, x, _ref, _ref1; + var ID, board, div, favicon, id, link, nodes, props, thread, x, _ref, _ref1; watched || (watched = $.get('WatchedThreads', {})); nodes = [$('.move', ThreadWatcher.dialog)]; for (board in watched) { @@ -5461,8 +5458,7 @@ _ref1 = g.BOARD.threads; for (ID in _ref1) { thread = _ref1[ID]; - op = thread.posts[thread]; - favicon = $('.favicon', op.nodes.post); + favicon = $('.favicon', thread.OP.nodes.post); favicon.src = ID in watched ? Favicon["default"] : Favicon.empty; } }, @@ -5488,9 +5484,7 @@ } }, toggle: function(thread) { - var op; - op = thread.posts[thread]; - if ($('.favicon', op.nodes.post).src === Favicon.empty) { + if ($('.favicon', thread.OP.nodes.post).src === Favicon.empty) { return ThreadWatcher.watch(thread); } else { return ThreadWatcher.unwatch(thread.board, thread.ID); @@ -6599,7 +6593,11 @@ this.file.dimensions = this.file.text.textContent.match(/\d+x\d+/)[0]; } } - this.isReply = $.hasClass(post, 'reply'); + if (!(this.isReply = $.hasClass(post, 'reply'))) { + this.thread.OP = this; + this.thread.isSticky = !!$('.stickyIcon', this.nodes.info); + this.thread.isClosed = !!$('.closedIcon', this.nodes.info); + } this.clones = []; g.posts["" + board + "." + this] = thread.posts[this] = board.posts[this] = this; if (that.isArchived) { diff --git a/src/features.coffee b/src/features.coffee index 3063ad997..3caa69f75 100644 --- a/src/features.coffee +++ b/src/features.coffee @@ -889,7 +889,7 @@ ThreadHiding = if data = ThreadHiding.hiddenThreads.threads[@] ThreadHiding.hide @, data.makeStub return unless Conf['Hiding Buttons'] - $.prepend @posts[@].nodes.root, ThreadHiding.makeButton @, 'hide' + $.prepend @OP.nodes.root, ThreadHiding.makeButton @, 'hide' getHiddenThreads: -> hiddenThreads = $.get "hiddenThreads.#{g.BOARD}" @@ -981,8 +981,7 @@ ThreadHiding = hide: (thread, makeStub=Conf['Stubs']) -> return if thread.hidden - op = thread.posts[thread] - threadRoot = op.nodes.root.parentNode + threadRoot = thread.OP.nodes.root.parentNode threadRoot.hidden = thread.isHidden = true unless makeStub @@ -1013,7 +1012,7 @@ ThreadHiding = if thread.stub $.rm thread.stub delete thread.stub - threadRoot = thread.posts[thread].nodes.root.parentNode + threadRoot = thread.OP.nodes.root.parentNode threadRoot.nextElementSibling.hidden = threadRoot.hidden = thread.isHidden = false @@ -1948,12 +1947,12 @@ Build = sticky = if isSticky - ' Sticky' + ' Sticky' else '' closed = if isClosed - ' Closed' + ' Closed' else '' @@ -2022,11 +2021,11 @@ Build = Get = threadExcerpt: (thread) -> - op = thread.posts[thread] - excerpt = op.info.subject?.trim() or - op.info.comment.replace(/\n+/g, ' // ') or + {OP} = thread + excerpt = OP.info.subject?.trim() or + OP.info.comment.replace(/\n+/g, ' // ') or Conf['Anonymize'] and 'Anonymous' or - $('.nameBlock', op.nodes.info).textContent.trim() + $('.nameBlock', OP.nodes.info).textContent.trim() "/#{thread.board}/ - #{excerpt}" postFromRoot: (root) -> link = $ 'a[title="Highlight this post"]', root @@ -3182,8 +3181,7 @@ ExpandThread = name: 'Thread Expansion' cb: @node node: -> - op = @posts[@] - return unless span = $ '.summary', op.nodes.root.parentNode + return unless span = $ '.summary', @OP.nodes.root.parentNode a = $.el 'a', textContent: "+ #{span.textContent}" className: 'summary' @@ -3196,7 +3194,7 @@ ExpandThread = ExpandThread.toggle op.thread toggle: (thread) -> - threadRoot = thread.posts[thread].nodes.root.parentNode + threadRoot = thread.OP.nodes.root.parentNode url = "//api.4chan.org/#{thread.board}/res/#{thread}.json" a = $ '.summary', threadRoot @@ -3205,14 +3203,14 @@ ExpandThread = when '+' a.textContent = text.replace '+', '× Loading...' $.cache url, -> ExpandThread.parse @, thread, a - ExpandComment.expand thread.posts[thread] + ExpandComment.expand thread.OP when '×' a.textContent = text.replace '× Loading...', '+' when '-' a.textContent = text.replace '-', '+' - ExpandComment.contract thread.posts[thread] + ExpandComment.contract thread.OP #goddamit moot num = switch g.BOARD # XXX boards config @@ -3459,7 +3457,7 @@ ThreadUpdater = node: -> ThreadUpdater.thread = @ - ThreadUpdater.root = @posts[@].nodes.root.parentNode + ThreadUpdater.root = @OP.nodes.root.parentNode ThreadUpdater.lastPost = +ThreadUpdater.root.lastElementChild.id.match(/\d+/)[0] ThreadUpdater.outdateCount = 0 ThreadUpdater.lastModified = '0' @@ -3688,11 +3686,10 @@ ThreadWatcher = cb: @node node: -> - op = @posts[@] favicon = $.el 'img', className: 'favicon' $.on favicon, 'click', ThreadWatcher.cb.toggle - $.before $('input', op.nodes.post), favicon + $.before $('input', @OP.nodes.post), favicon if g.VIEW is 'thread' and @ID is $.get 'AutoWatch', 0 ThreadWatcher.watch @ $.delete 'AutoWatch' @@ -3722,8 +3719,7 @@ ThreadWatcher = watched = watched[g.BOARD] or {} for ID, thread of g.BOARD.threads - op = thread.posts[thread] - favicon = $ '.favicon', op.nodes.post + favicon = $ '.favicon', thread.OP.nodes.post favicon.src = if ID of watched Favicon.default else @@ -3745,8 +3741,7 @@ ThreadWatcher = ThreadWatcher.watch g.BOARD.threads[threadID] toggle: (thread) -> - op = thread.posts[thread] - if $('.favicon', op.nodes.post).src is Favicon.empty + if $('.favicon', thread.OP.nodes.post).src is Favicon.empty ThreadWatcher.watch thread else ThreadWatcher.unwatch thread.board, thread.ID diff --git a/src/main.coffee b/src/main.coffee index 2da7a543c..2608b7ed0 100644 --- a/src/main.coffee +++ b/src/main.coffee @@ -101,7 +101,11 @@ class Post if @file.isImage = /(jpg|png|gif)$/i.test @file.name @file.dimensions = @file.text.textContent.match(/\d+x\d+/)[0] - @isReply = $.hasClass post, 'reply' + unless @isReply = $.hasClass post, 'reply' + @thread.OP = @ + @thread.isSticky = !!$ '.stickyIcon', @nodes.info + @thread.isClosed = !!$ '.closedIcon', @nodes.info + @clones = [] g.posts["#{board}.#{@}"] = thread.posts[@] = board.posts[@] = @ @kill() if that.isArchived