rm $.debounce, better Relative Dates.

This commit is contained in:
Nicolas Stepien 2013-02-15 18:48:40 +01:00
parent 7657167953
commit 479ddffd95
3 changed files with 39 additions and 53 deletions

View File

@ -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());
}
};

View File

@ -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 = []

View File

@ -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: ->