finish watcher rewrite

This commit is contained in:
James Campos 2011-04-02 18:29:48 -07:00
parent 27b83bc189
commit 3d931acfe4
2 changed files with 150 additions and 154 deletions

View File

@ -58,7 +58,7 @@
*/ */
(function() { (function() {
var $, $$, NAMESPACE, a, arr, as, autoWatch, callback, changeCheckbox, changeValue, clearHidden, config, d, delform, down, editSauce, el, expand, expandComment, expandThread, g, getThread, href, i, imageClick, imageExpand, imageExpandClick, imageHover, imageResize, imageThumb, imageToggle, imageType, imageTypeChange, keyModeInsert, keyModeNormal, keydown, keypress, l1, log, navbotr, navtopr, nodeInserted, omitted, onloadComment, onloadThread, option, options, parseResponse, pathname, qr, recaptcha, recaptchaListener, recaptchaReload, redirect, replyHiding, replyNav, report, request, scroll, scrollThread, span, temp, text, textContent, threadHiding, tzOffset, ui, up, updateAuto, updateCallback, updateFavicon, updateInterval, updateNow, updateTime, updateTitle, updateVerbose, updaterMake, watch, watchX, watcher, watcherUpdate, _i, _j, _k, _l, _len, _len2, _len3, _len4, _len5, _len6, _m, _ref, _ref2, _ref3, _ref4; var $, $$, NAMESPACE, a, arr, as, autoWatch, callback, changeCheckbox, changeValue, clearHidden, config, d, delform, down, editSauce, el, expand, expandComment, expandThread, g, getThread, href, i, imageClick, imageExpand, imageExpandClick, imageHover, imageResize, imageThumb, imageToggle, imageType, imageTypeChange, keyModeInsert, keyModeNormal, keydown, keypress, l1, log, navbotr, navtopr, nodeInserted, omitted, onloadComment, onloadThread, option, options, parseResponse, pathname, qr, recaptcha, recaptchaListener, recaptchaReload, redirect, replyHiding, replyNav, report, request, scroll, scrollThread, span, temp, text, textContent, threadHiding, tzOffset, ui, up, updateAuto, updateCallback, updateFavicon, updateInterval, updateNow, updateTime, updateTitle, updateVerbose, updaterMake, watcher, _i, _j, _k, _l, _len, _len2, _len3, _len4, _len5, _len6, _m, _ref, _ref2, _ref3, _ref4;
var __slice = Array.prototype.slice; var __slice = Array.prototype.slice;
if (typeof console != "undefined" && console !== null) { if (typeof console != "undefined" && console !== null) {
log = console.log; log = console.log;
@ -1554,101 +1554,99 @@
return updateAuto.call($("input[name=autoL]", div)); return updateAuto.call($("input[name=autoL]", div));
} }
}; };
watch = function() {
var id, text, _base, _name;
id = this.nextSibling.name;
if (this.src === g.favEmpty) {
this.src = g.favDefault;
text = ("/" + g.BOARD + "/ - ") + $.x('following-sibling::blockquote', this).textContent.slice(0, 25);
(_base = g.watched)[_name = g.BOARD] || (_base[_name] = []);
g.watched[g.BOARD].push({
id: id,
text: text
});
} else {
this.src = g.favEmpty;
g.watched[g.BOARD] = $.slice(g.watched[g.BOARD], id);
}
GM_setValue('watched', JSON.stringify(g.watched));
return watcherUpdate();
};
watcherUpdate = function() {
var a, board, div, link, old, thread, _i, _len, _ref;
div = $.el('div');
for (board in g.watched) {
_ref = g.watched[board];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
thread = _ref[_i];
a = $.el('a', {
textContent: 'X',
className: 'pointer'
});
$.bind(a, 'click', watchX);
link = $.el('a', {
textContent: thread.text,
href: "/" + board + "/res/" + thread.id
});
$.append(div, a, $.tn(' '), link, $.el('br'));
}
}
old = $('#watcher div:last-child');
return $.replace(old, div);
};
watchX = function() {
var board, favicon, id, input, _, _ref;
_ref = this.nextElementSibling.getAttribute('href').substring(1).split('/'), board = _ref[0], _ = _ref[1], id = _ref[2];
g.watched[board] = $.slice(g.watched[board], id);
GM_setValue('watched', JSON.stringify(g.watched));
watcherUpdate();
if (input = $("input[name=\"" + id + "\"]")) {
favicon = input.previousSibling;
return favicon.src = g.favEmpty;
}
};
watcher = { watcher = {
init: function() { init: function() {
var dialog, html, img, input, inputs, _i, _len, _results; var board, dialog, favicon, html, id, input, inputs, props, src, watched, watchedBoard, _i, _len, _ref, _results;
html = '<div class=move>Thread Watcher</div>'; html = '<div class=move>Thread Watcher</div>';
dialog = ui.dialog('watcher', { dialog = ui.dialog('watcher', {
top: '50px', top: '50px',
left: '0px' left: '0px'
}, html); }, html);
$.append(d.body, dialog); $.append(d.body, dialog);
watched = $.getValue('watched', {});
for (board in watched) {
_ref = watched[board];
for (id in _ref) {
props = _ref[id];
watcher.addLink(props, dialog);
}
}
watchedBoard = watched[g.BOARD] || {};
inputs = $$('form > input[value=delete], div.thread > input[value=delete]'); inputs = $$('form > input[value=delete], div.thread > input[value=delete]');
_results = []; _results = [];
for (_i = 0, _len = inputs.length; _i < _len; _i++) { for (_i = 0, _len = inputs.length; _i < _len; _i++) {
input = inputs[_i]; input = inputs[_i];
img = $.el('img', { id = input.name;
src: g.favEmpty if (id in watchedBoard) {
src = g.favDefault;
} else {
src = g.favEmpty;
}
favicon = $.el('img', {
src: src,
className: 'pointer'
}); });
_results.push($.before(input, img)); $.bind(favicon, 'click', watcher.cb.toggle);
_results.push($.before(input, favicon));
} }
return _results; return _results;
/* },
#create watcher addLink: function(props, dialog) {
html = '<div class="move">Thread Watcher</div><div></div>' var div, link, x;
watcher = ui.dialog 'watcher', top: '50px', left: '0px', html dialog || (dialog = $('#watcher'));
$.append d.body, watcher div = $.el('div');
watcherUpdate() x = $.el('a', {
textContent: 'X'
#add buttons });
threads = g.watched[g.BOARD] || [] $.bind(x, 'click', watcher.cb.x);
#normal, threading link = $.el('a', props);
inputs = $$('form > input[value="delete"], div > input[value="delete"]') $.append(div, x, $.tn(' '), link);
for input in inputs return $.append(dialog, div);
id = input.name },
src = (-> cb: {
for thread in threads toggle: function(e) {
if id is thread.id return watcher.toggle(e.target);
return g.favDefault },
g.favEmpty x: function(e) {
)() var board, id, _, _ref;
img = $.el 'img', _ref = e.target.nextElementSibling.getAttribute('href').substring(1).split('/'), board = _ref[0], _ = _ref[1], id = _ref[2];
src: src return watcher.unwatch(board, id);
className: 'pointer' }
$.bind img, 'click', watch },
$.before input, img toggle: function(favicon) {
*/ var id;
id = favicon.nextSibling.name;
if (favicon.src === g.favEmpty) {
return watcher.watch(id, favicon);
} else {
return watcher.unwatch(g.BOARD, id);
}
},
unwatch: function(board, id) {
var div, favicon, href, input, watched;
href = "/" + board + "/res/" + id;
div = $("#watcher a[href=\"" + href + "\"]").parentNode;
$.remove(div);
if (input = $("input[name=\"" + id + "\"]")) {
favicon = input.previousSibling;
favicon.src = g.favEmpty;
}
watched = $.getValue('watched', {});
delete watched[board][id];
return $.setValue('watched', watched);
},
watch: function(id, favicon) {
var props, watched, _name;
favicon.src = g.favDefault;
props = {
textContent: ("/" + g.BOARD + "/ - ") + $.x('following-sibling::blockquote', favicon).textContent.slice(0, 25),
href: "/" + g.BOARD + "/res/" + id
};
watched = $.getValue('watched', {});
watched[_name = g.BOARD] || (watched[_name] = {});
watched[g.BOARD][id] = props;
$.setValue('watched', watched);
return watcher.addLink(props);
} }
}; };
NAMESPACE = 'AEOS.4chan_x.'; NAMESPACE = 'AEOS.4chan_x.';
@ -1660,7 +1658,6 @@
favDefault: ((_ref = $('link[rel="shortcut icon"]', d)) != null ? _ref.href : void 0) || '', favDefault: ((_ref = $('link[rel="shortcut icon"]', d)) != null ? _ref.href : void 0) || '',
favEmpty: 'data:image/gif;base64,R0lGODlhEAAQAJEAAAAAAP///9vb2////yH5BAEAAAMALAAAAAAQABAAAAIvnI+pq+D9DBAUoFkPFnbs7lFZKIJOJJ3MyraoB14jFpOcVMpzrnF3OKlZYsMWowAAOw==', favEmpty: 'data:image/gif;base64,R0lGODlhEAAQAJEAAAAAAP///9vb2////yH5BAEAAAMALAAAAAAQABAAAAIvnI+pq+D9DBAUoFkPFnbs7lFZKIJOJJ3MyraoB14jFpOcVMpzrnF3OKlZYsMWowAAOw==',
flavors: ['http://regex.info/exif.cgi?url=', 'http://iqdb.org/?url=', 'http://saucenao.com/search.php?db=999&url=', 'http://tineye.com/search?url='].join('\n'), flavors: ['http://regex.info/exif.cgi?url=', 'http://iqdb.org/?url=', 'http://saucenao.com/search.php?db=999&url=', 'http://tineye.com/search?url='].join('\n'),
watched: JSON.parse(GM_getValue('watched', '{}')),
xhrs: [] xhrs: []
}; };
g.favHalo = /ws/.test(g.favDefault) ? 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAZklEQVR4XrWRQQoAIQwD+6L97j7Ih9WTQQxhDqJQCk4Mranuvqod6LgwawSqSuUmWSPw/UNlJlnDAmA2ARjABLYj8ZyCzJHHqOg+GdAKZmKPIQUzuYrxicHqEgHzP9g7M0+hj45sAnRWxtPj3zSPAAAAAElFTkSuQmCC' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEUAAABmzDP///8AAABet0i+AAAAAXRSTlMAQObYZgAAAExJREFUeF4tyrENgDAMAMFXKuQswQLBG3mOlBnFS1gwDfIYLpEivvjq2MlqjmYvYg5jWEzCwtDSQlwcXKCVLrpFbvLvvSf9uZJ2HusDtJAY7Tkn1oYAAAAASUVORK5CYII='; g.favHalo = /ws/.test(g.favDefault) ? 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAZklEQVR4XrWRQQoAIQwD+6L97j7Ih9WTQQxhDqJQCk4Mranuvqod6LgwawSqSuUmWSPw/UNlJlnDAmA2ARjABLYj8ZyCzJHHqOg+GdAKZmKPIQUzuYrxicHqEgHzP9g7M0+hj45sAnRWxtPj3zSPAAAAAElFTkSuQmCC' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEUAAABmzDP///8AAABet0i+AAAAAXRSTlMAQObYZgAAAExJREFUeF4tyrENgDAMAMFXKuQswQLBG3mOlBnFS1gwDfIYLpEivvjq2MlqjmYvYg5jWEzCwtDSQlwcXKCVLrpFbvLvvSf9uZJ2HusDtJAY7Tkn1oYAAAAASUVORK5CYII=';
@ -1708,7 +1705,7 @@
div.dialog > div.move {\ div.dialog > div.move {\
cursor: move;\ cursor: move;\
}\ }\
label, a {\ label, a, .pointer {\
cursor: pointer;\ cursor: pointer;\
}\ }\
\ \

View File

@ -1191,86 +1191,86 @@ updaterMake = ->
if GM_getValue 'autoG' then updateAuto.call $("input[name=autoL]", div) if GM_getValue 'autoG' then updateAuto.call $("input[name=autoL]", div)
watch = ->
id = @nextSibling.name
if @src is g.favEmpty
@src = g.favDefault
text = "/#{g.BOARD}/ - " +
$.x('following-sibling::blockquote', this).textContent.slice(0,25)
g.watched[g.BOARD] or= []
g.watched[g.BOARD].push {
id: id,
text: text
}
else
@src = g.favEmpty
g.watched[g.BOARD] = $.slice(g.watched[g.BOARD], id)
GM_setValue('watched', JSON.stringify(g.watched))
watcherUpdate()
watcherUpdate = ->
div = $.el 'div'
for board of g.watched
for thread in g.watched[board]
a = $.el 'a',
textContent: 'X'
className: 'pointer'
$.bind a, 'click', watchX
link = $.el 'a',
textContent: thread.text
href: "/#{board}/res/#{thread.id}"
$.append div, a, $.tn(' '), link, $.el('br')
old = $('#watcher div:last-child')
$.replace(old, div)
watchX = ->
[board, _, id] = @nextElementSibling.
getAttribute('href').substring(1).split('/')
g.watched[board] = $.slice(g.watched[board], id)
GM_setValue('watched', JSON.stringify(g.watched))
watcherUpdate()
if input = $("input[name=\"#{id}\"]")
favicon = input.previousSibling
favicon.src = g.favEmpty
watcher = watcher =
init: -> init: ->
html = '<div class=move>Thread Watcher</div>' html = '<div class=move>Thread Watcher</div>'
dialog = ui.dialog 'watcher', top: '50px', left: '0px', html dialog = ui.dialog 'watcher', top: '50px', left: '0px', html
$.append d.body, dialog $.append d.body, dialog
#populate watcher
watched = $.getValue 'watched', {}
for board of watched
for id, props of watched[board]
watcher.addLink props, dialog
#add watch buttons
watchedBoard = watched[g.BOARD] or {}
inputs = $$ 'form > input[value=delete], div.thread > input[value=delete]' inputs = $$ 'form > input[value=delete], div.thread > input[value=delete]'
for input in inputs
img = $.el 'img',
src: g.favEmpty
$.before input, img
###
#create watcher
html = '<div class="move">Thread Watcher</div><div></div>'
watcher = ui.dialog 'watcher', top: '50px', left: '0px', html
$.append d.body, watcher
watcherUpdate()
#add buttons
threads = g.watched[g.BOARD] || []
#normal, threading
inputs = $$('form > input[value="delete"], div > input[value="delete"]')
for input in inputs for input in inputs
id = input.name id = input.name
src = (-> if id of watchedBoard
for thread in threads src = g.favDefault
if id is thread.id else
return g.favDefault src = g.favEmpty
g.favEmpty favicon = $.el 'img',
)()
img = $.el 'img',
src: src src: src
className: 'pointer' className: 'pointer'
$.bind img, 'click', watch $.bind favicon, 'click', watcher.cb.toggle
$.before input, img $.before input, favicon
###
addLink: (props, dialog) ->
dialog or= $ '#watcher'
div = $.el 'div'
x = $.el 'a',
textContent: 'X'
$.bind x, 'click', watcher.cb.x
link = $.el 'a', props
$.append div, x, $.tn(' '), link
$.append dialog, div
cb:
toggle: (e) ->
watcher.toggle e.target
x: (e) ->
[board, _, id] = e.target.nextElementSibling
.getAttribute('href').substring(1).split('/')
watcher.unwatch board, id
toggle: (favicon) ->
id = favicon.nextSibling.name
if favicon.src == g.favEmpty
watcher.watch id, favicon
else # favicon.src == g.favDefault
watcher.unwatch g.BOARD, id
unwatch: (board, id) ->
href = "/#{board}/res/#{id}"
div = $("#watcher a[href=\"#{href}\"]").parentNode
$.remove div
if input = $ "input[name=\"#{id}\"]"
favicon = input.previousSibling
favicon.src = g.favEmpty
watched = $.getValue 'watched', {}
delete watched[board][id]
$.setValue 'watched', watched
watch: (id, favicon) ->
favicon.src = g.favDefault
props =
textContent: "/#{g.BOARD}/ - " +
$.x('following-sibling::blockquote', favicon)
.textContent.slice(0,25)
href: "/#{g.BOARD}/res/#{id}"
watched = $.getValue 'watched', {}
watched[g.BOARD] or= {}
watched[g.BOARD][id] = props
$.setValue 'watched', watched
watcher.addLink props
#main #main
NAMESPACE = 'AEOS.4chan_x.' NAMESPACE = 'AEOS.4chan_x.'
@ -1287,7 +1287,6 @@ g =
'http://saucenao.com/search.php?db=999&url=' 'http://saucenao.com/search.php?db=999&url='
'http://tineye.com/search?url=' 'http://tineye.com/search?url='
].join '\n' ].join '\n'
watched: JSON.parse(GM_getValue('watched', '{}'))
xhrs: [] xhrs: []
g.favHalo = if /ws/.test g.favDefault then 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAZklEQVR4XrWRQQoAIQwD+6L97j7Ih9WTQQxhDqJQCk4Mranuvqod6LgwawSqSuUmWSPw/UNlJlnDAmA2ARjABLYj8ZyCzJHHqOg+GdAKZmKPIQUzuYrxicHqEgHzP9g7M0+hj45sAnRWxtPj3zSPAAAAAElFTkSuQmCC' else 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEUAAABmzDP///8AAABet0i+AAAAAXRSTlMAQObYZgAAAExJREFUeF4tyrENgDAMAMFXKuQswQLBG3mOlBnFS1gwDfIYLpEivvjq2MlqjmYvYg5jWEzCwtDSQlwcXKCVLrpFbvLvvSf9uZJ2HusDtJAY7Tkn1oYAAAAASUVORK5CYII=' g.favHalo = if /ws/.test g.favDefault then 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAZklEQVR4XrWRQQoAIQwD+6L97j7Ih9WTQQxhDqJQCk4Mranuvqod6LgwawSqSuUmWSPw/UNlJlnDAmA2ARjABLYj8ZyCzJHHqOg+GdAKZmKPIQUzuYrxicHqEgHzP9g7M0+hj45sAnRWxtPj3zSPAAAAAElFTkSuQmCC' else 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEUAAABmzDP///8AAABet0i+AAAAAXRSTlMAQObYZgAAAExJREFUeF4tyrENgDAMAMFXKuQswQLBG3mOlBnFS1gwDfIYLpEivvjq2MlqjmYvYg5jWEzCwtDSQlwcXKCVLrpFbvLvvSf9uZJ2HusDtJAY7Tkn1oYAAAAASUVORK5CYII='
pathname = location.pathname.substring(1).split('/') pathname = location.pathname.substring(1).split('/')
@ -1334,7 +1333,7 @@ $.addStyle '
div.dialog > div.move { div.dialog > div.move {
cursor: move; cursor: move;
} }
label, a { label, a, .pointer {
cursor: pointer; cursor: pointer;
} }