From 479ddffd95e95793ba4d7718c97770827495918e Mon Sep 17 00:00:00 2001 From: Nicolas Stepien Date: Fri, 15 Feb 2013 18:48:40 +0100 Subject: [PATCH] rm $.debounce, better Relative Dates. --- 4chan_x.user.js | 49 +++++++++++++++++++-------------------------- lib/$.coffee | 11 ---------- src/features.coffee | 32 ++++++++++++++++------------- 3 files changed, 39 insertions(+), 53 deletions(-) diff --git a/4chan_x.user.js b/4chan_x.user.js index a7ed530c2..bda5b5b1b 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -835,20 +835,6 @@ open: function(url) { return (GM_openInTab || window.open)(url, '_blank'); }, - debounce: function(wait, fn) { - var timeout; - timeout = null; - return function() { - if (timeout) { - clearTimeout(timeout); - } else { - fn.apply(this, arguments); - } - return timeout = setTimeout((function() { - return timeout = null; - }), wait); - }; - }, queueTask: (function() { var execTask, taskChannel, taskQueue; taskQueue = []; @@ -3334,18 +3320,21 @@ return; } $.on(d, 'visibilitychange ThreadUpdate', this.flush); + this.flush(); return Post.prototype.callbacks.push({ name: 'Relative Post Dates', cb: this.node }); }, node: function() { - var dateEl, diff; + var dateEl; + if (this.isClone) { + RelativeDates.flush(); + return; + } dateEl = this.nodes.date; dateEl.title = dateEl.textContent; - diff = Date.now() - this.info.date; - dateEl.textContent = RelativeDates.relative(diff); - return RelativeDates.setUpdate(this, diff); + return RelativeDates.setUpdate(this); }, relative: function(diff) { var number, rounded, unit; @@ -3357,7 +3346,7 @@ return "" + rounded + " " + unit + " ago"; }, stale: [], - flush: $.debounce($.SECOND, function() { + flush: function() { var now, update, _i, _len, _ref; if (d.hidden) { return; @@ -3371,26 +3360,30 @@ RelativeDates.stale = []; clearTimeout(RelativeDates.timeout); return RelativeDates.timeout = setTimeout(RelativeDates.flush, RelativeDates.INTERVAL); - }), - setUpdate: function(post, diff) { - var dateEl, markStale, setOwnTimeout, update; + }, + setUpdate: function(post) { + var markStale, setOwnTimeout, update; setOwnTimeout = function(diff) { var delay; delay = diff > $.HOUR ? diff % $.HOUR : diff > $.MINUTE ? diff % $.MINUTE : diff % $.SECOND; return setTimeout(markStale, delay); }; - dateEl = post.nodes.date; update = function(now) { - if (d.contains(dateEl)) { - diff = now - post.info.date; - dateEl.textContent = RelativeDates.relative(diff); - return setOwnTimeout(diff); + var dateEl, diff, relative, singlePost, _i, _len, _ref; + diff = now - post.info.date; + relative = RelativeDates.relative(diff); + _ref = [post].concat(post.clones); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + singlePost = _ref[_i]; + dateEl = singlePost.nodes.date; + dateEl.textContent = relative; } + return setOwnTimeout(diff); }; markStale = function() { return RelativeDates.stale.push(update); }; - return setOwnTimeout(diff); + return update(Date.now()); } }; diff --git a/lib/$.coffee b/lib/$.coffee index 082bf13f7..8f247d2e9 100644 --- a/lib/$.coffee +++ b/lib/$.coffee @@ -140,17 +140,6 @@ $.extend $, root.dispatchEvent new CustomEvent event, {bubbles: true, detail} open: (url) -> (GM_openInTab or window.open) url, '_blank' - debounce: (wait, fn) -> - timeout = null - return -> - if timeout - # stop current reset - clearTimeout timeout - else - fn.apply this, arguments - - # after wait, let next invocation execute immediately - timeout = setTimeout (-> timeout = null), wait queueTask: (-> # inspired by https://www.w3.org/Bugs/Public/show_bug.cgi?id=15007 taskQueue = [] diff --git a/src/features.coffee b/src/features.coffee index 7ab04544f..1f1228fab 100644 --- a/src/features.coffee +++ b/src/features.coffee @@ -2002,21 +2002,24 @@ RelativeDates = # flush when page becomes visible again $.on d, 'visibilitychange ThreadUpdate', @flush + # setup the timeout + @flush() + Post::callbacks.push name: 'Relative Post Dates' cb: @node node: -> - dateEl = @nodes.date + if @isClone + RelativeDates.flush() + return # Show original absolute time as tooltip so users can still know exact times # Since "Time Formatting" runs `node` before us, the title tooltip will # pick up the user-formatted time instead of 4chan time when enabled. + dateEl = @nodes.date dateEl.title = dateEl.textContent - diff = Date.now() - @info.date - - dateEl.textContent = RelativeDates.relative diff - RelativeDates.setUpdate @, diff + RelativeDates.setUpdate @ # diff is milliseconds from now relative: (diff) -> @@ -2044,7 +2047,7 @@ RelativeDates = # each individual dateTime element will add its update() function to the stale list # when it is to be called. stale: [] - flush: $.debounce($.SECOND, -> + flush: -> # no point in changing the dates until the user sees them return if d.hidden @@ -2054,12 +2057,12 @@ RelativeDates = # reset automatic flush clearTimeout RelativeDates.timeout - RelativeDates.timeout = setTimeout RelativeDates.flush, RelativeDates.INTERVAL) + RelativeDates.timeout = setTimeout RelativeDates.flush, RelativeDates.INTERVAL # create function `update()`, closed over post and diff, that, when called # from `flush()`, updates the element, and re-calls `setOwnTimeout()` to # re-add `update()` to the stale list later. - setUpdate: (post, diff) -> + setUpdate: (post) -> setOwnTimeout = (diff) -> delay = if diff > $.HOUR diff % $.HOUR @@ -2069,17 +2072,18 @@ RelativeDates = diff % $.SECOND setTimeout markStale, delay - dateEl = post.nodes.date update = (now) -> - if d.contains dateEl # not removed from DOM - diff = now - post.info.date - dateEl.textContent = RelativeDates.relative diff - setOwnTimeout diff + diff = now - post.info.date + relative = RelativeDates.relative diff + for singlePost in [post].concat post.clones + dateEl = singlePost.nodes.date + dateEl.textContent = relative + setOwnTimeout diff markStale = -> RelativeDates.stale.push update # kick off initial timeout with current diff - setOwnTimeout diff + update Date.now() FileInfo = init: ->