Release 4chan X v1.8.1.

This commit is contained in:
ccd0 2014-06-19 01:14:45 -07:00
parent e1d695531b
commit 2794ff1133
12 changed files with 164 additions and 446 deletions

View File

@ -1,3 +1,6 @@
### v1.8.1
*2014-06-19*
**MayhemYDG**
- More API changes:
- `ThreadUpdate`:

View File

@ -1,5 +1,5 @@
/*
* 4chan X - Version 1.8.0 - 2014-06-18
* 4chan X - Version 1.8.1 - 2014-06-19
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE

View File

@ -1,6 +1,6 @@
// ==UserScript==
// @name 4chan X
// @version 1.8.0
// @version 1.8.1
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X

View File

@ -1,7 +1,7 @@
// Generated by CoffeeScript
// ==UserScript==
// @name 4chan X
// @version 1.8.0
// @version 1.8.1
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@ -24,7 +24,7 @@
// ==/UserScript==
/*
* 4chan X - Version 1.8.0 - 2014-06-18
* 4chan X - Version 1.8.1 - 2014-06-19
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
@ -374,7 +374,7 @@
doc = d.documentElement;
g = {
VERSION: '1.8.0',
VERSION: '1.8.1',
NAMESPACE: '4chan X.',
boards: {}
};
@ -649,7 +649,7 @@
if (root == null) {
root = d;
}
if (typeof cloneInto === 'function') {
if ((detail != null) && typeof cloneInto === 'function') {
detail = cloneInto(detail, document.defaultView);
}
return root.dispatchEvent(new CustomEvent(event, {
@ -1813,8 +1813,7 @@
$.sync('Header auto-hide', this.setBarVisibility);
$.sync('Centered links', this.setLinkJustify);
this.addShortcut(menuButton);
UI.addMenuEntry({
type: 'header',
this.menu.addEntry({
el: $.el('span', {
textContent: 'Header'
}),
@ -2363,8 +2362,7 @@
$.on(input, 'change', this.cb.sort);
}
}
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: $.el('span', {
textContent: 'Index Navigation'
}),
@ -3072,7 +3070,7 @@
This function contains code from 4chan-JS (https://github.com/4chan/4chan-JS).
@license: https://github.com/4chan/4chan-JS/blob/master/LICENSE
*/
var E, boardID, capcode, container, date, dateUTC, email, file, fileSize, fileThumb, flagCode, flagName, h_capcodeClass, h_capcodeIcon, h_capcodeStart, h_closed, h_comment, h_emailEnd, h_emailStart, h_file, h_fileDims, h_fileInfo, h_fileTitle1, h_fileTitle2, h_flag, h_gifIcon, h_imgSrc, h_pageIcon, h_postClass, h_quoteLink, h_replyLink, h_sideArrows, h_staticPath, h_sticky, h_tripcode, h_userID, href, isClosed, isOP, isSticky, name, pageNum, postID, quote, shortFilename, spoilerRange, subject, threadID, tripcode, uniqueID, _i, _len, _ref;
var E, boardID, capcode, container, date, dateUTC, email, email_processed, file, fileSize, fileThumb, flagCode, flagName, h_capcodeClass, h_capcodeIcon, h_capcodeStart, h_closed, h_comment, h_emailEnd, h_emailStart, h_file, h_fileDims, h_fileInfo, h_fileTitle1, h_fileTitle2, h_flag, h_gifIcon, h_imgSrc, h_pageIcon, h_postClass, h_quoteLink, h_replyLink, h_sideArrows, h_staticPath, h_sticky, h_tripcode, h_userID, href, isClosed, isOP, isSticky, name, pageNum, postID, quote, shortFilename, spoilerRange, subject, threadID, tripcode, uniqueID, _i, _len, _ref;
E = Build.h_escape;
postID = o.postID, threadID = o.threadID, boardID = o.boardID, name = o.name, capcode = o.capcode, tripcode = o.tripcode, uniqueID = o.uniqueID, email = o.email, subject = o.subject, flagCode = o.flagCode, flagName = o.flagName, date = o.date, dateUTC = o.dateUTC, isSticky = o.isSticky, isClosed = o.isClosed, h_comment = o.h_comment, file = o.file;
name || (name = '');
@ -3090,8 +3088,9 @@
} else {
h_tripcode = '';
}
email_processed = encodeURIComponent(email).replace(/%40/g, '@');
if (email) {
h_emailStart = "<a href='mailto:" + (E(encodeURIComponent(email))) + "' class='useremail'>";
h_emailStart = "<a href='mailto:" + (E(email_processed)) + "' class='useremail'>";
h_emailEnd = '</a>';
} else {
h_emailStart = '';
@ -3538,7 +3537,7 @@
};
UI = (function() {
var Menu, addMenuEntry, checkbox, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, menus, rmMenuEntry, touchend, touchmove;
var Menu, checkbox, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, menus, touchend, touchmove;
dialog = function(id, position, properties) {
var child, el, move, _i, _len, _ref;
el = $.el('div', {
@ -3565,12 +3564,6 @@
return el;
};
menus = {};
addMenuEntry = function(entry) {
return menus[entry.type].addEntry(entry);
};
rmMenuEntry = function(entry) {
return menus[entry.type].addEntry(entry);
};
Menu = (function() {
var currentMenu, lastToggledButton;
@ -3580,7 +3573,6 @@
function Menu(type) {
this.type = type;
this.rmEntry = __bind(this.rmEntry, this);
this.addEntry = __bind(this.addEntry, this);
this.onFocus = __bind(this.onFocus, this);
this.keybinds = __bind(this.keybinds, this);
@ -3793,12 +3785,6 @@
return this.entries.push(entry);
};
Menu.prototype.rmEntry = function(entry) {
var index;
index = this.entries.indexOf(entry);
return this.entries.splice(index, 1);
};
Menu.prototype.parseEntry = function(entry) {
var el, subEntries, subEntry, _i, _len;
el = entry.el, subEntries = entry.subEntries;
@ -3984,9 +3970,7 @@
dialog: dialog,
Menu: Menu,
hover: hoverstart,
checkbox: checkbox,
addMenuEntry: addMenuEntry,
rmMenuEntry: rmMenuEntry
checkbox: checkbox
};
})();
@ -4270,7 +4254,6 @@
textContent: 'Filter'
});
entry = {
type: 'post',
el: div,
order: 50,
open: function(post) {
@ -4284,7 +4267,7 @@
type = _ref[_i];
entry.subEntries.push(Filter.menu.createSubEntry(type[0], type[1]));
}
return UI.addMenuEntry(entry);
return Menu.menu.addEntry(entry);
},
createSubEntry: function(text, type) {
var el;
@ -4390,8 +4373,7 @@
thisPost = UI.checkbox('thisPost', ' This post', true);
replies = UI.checkbox('replies', ' Hide replies', Conf['Recursive Hiding']);
makeStub = UI.checkbox('makeStub', ' Make stub', Conf['Stubs']);
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(post) {
@ -4429,8 +4411,7 @@
href: 'javascript:;'
});
$.on(hideStubLink, 'click', PostHiding.menu.hideStub);
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(post) {
@ -4460,8 +4441,7 @@
}
]
});
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: hideStubLink,
order: 15,
open: function(post) {
@ -4792,8 +4772,7 @@
});
$.on(apply, 'click', ThreadHiding.menu.hide);
makeStub = UI.checkbox('Stubs', ' Make stub');
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(_arg) {
@ -4819,8 +4798,7 @@
href: 'javascript:;'
});
$.on(div, 'click', ThreadHiding.menu.show);
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(_arg) {
@ -4838,8 +4816,7 @@
href: 'javascript:;'
});
$.on(hideStubLink, 'click', ThreadHiding.menu.hideStub);
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: hideStubLink,
order: 15,
open: function(_arg) {
@ -5366,8 +5343,7 @@
});
input = $('input', this.controls);
$.on(input, 'change', this.toggle);
UI.addMenuEntry(this.entry = {
type: 'header',
Header.menu.addEntry(this.entry = {
el: this.controls,
order: 98
});
@ -6571,13 +6547,12 @@
});
ThreadUpdater.postID = postID;
$.event('QRPostSuccessful', {
board: {
ID: g.BOARD.ID
},
boardID: g.BOARD.ID,
threadID: threadID,
postID: postID
});
$.event('QRPostSuccessful_', {
boardID: g.BOARD.ID,
threadID: threadID,
postID: postID
});
@ -7472,8 +7447,7 @@
el.title = "" + type + " Tyme";
FappeTyme[lc] = input = el.firstElementChild;
$.on(input, 'change', FappeTyme.cb.toggle.bind(input));
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: el,
order: 97
});
@ -7572,8 +7546,7 @@
createSubEntry = Gallery.menu.createSubEntry;
for (name in Config.gallery) {
el = createSubEntry(name).el;
UI.addMenuEntry({
type: 'gallery',
nodes.menu.addEntry({
el: el,
order: 0
});
@ -7807,8 +7780,7 @@
for (name in Config.gallery) {
subEntries.push(createSubEntry(name));
}
return UI.addMenuEntry({
type: 'header',
return Header.menu.addEntry({
el: el,
order: 105,
subEntries: subEntries
@ -8152,8 +8124,7 @@
conf = _ref[name];
subEntries.push(createSubEntry(name, conf[1]));
}
return UI.addMenuEntry({
type: 'header',
return Header.menu.addEntry({
el: el,
order: 105,
subEntries: subEntries
@ -8325,8 +8296,7 @@
});
this.el = prefetch.firstElementChild;
$.on(this.el, 'change', this.toggle);
return UI.addMenuEntry({
type: 'header',
return Header.menu.addEntry({
el: prefetch,
order: 104
});
@ -9083,7 +9053,6 @@
textContent: 'Archive'
});
entry = {
type: 'post',
el: div,
order: 90,
open: function(_arg) {
@ -9102,7 +9071,7 @@
type = _ref[_i];
entry.subEntries.push(this.createSubEntry(type[0], type[1]));
}
return UI.addMenuEntry(entry);
return Menu.menu.addEntry(entry);
},
createSubEntry: function(text, type) {
var el, open;
@ -9179,8 +9148,7 @@
return true;
}
};
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: div,
order: 40,
open: function(post) {
@ -9304,8 +9272,7 @@
};
})(this));
});
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: a,
order: 100,
open: function(_arg) {
@ -9373,8 +9340,7 @@
textContent: 'Report this post'
});
$.on(a, 'click', ReportLink.report);
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: a,
order: 10,
open: function(post) {
@ -9621,8 +9587,7 @@
subEntries.push({
el: this.settings
});
UI.addMenuEntry(this.entry = {
type: 'header',
Header.menu.addEntry(this.entry = {
el: $.el('span', {
textContent: 'Updater'
}),
@ -9732,9 +9697,7 @@
ThreadUpdater.thread.kill();
$.event('ThreadUpdate', {
404: true,
thread: {
fullID: ThreadUpdater.thread.fullID
}
threadID: ThreadUpdater.thread.fullID
});
break;
default:
@ -9828,7 +9791,7 @@
return new Notice('info', "The thread is " + change + ".", 30);
},
parse: function(postObjects) {
var OP, count, deletedFiles, deletedPosts, files, index, node, num, post, postObject, posts, root, scroll, _i, _j, _len, _len1;
var OP, count, files, index, node, num, post, postObject, posts, root, scroll, _i, _j, _len, _len1;
OP = postObjects[0];
Build.spoilerRange[ThreadUpdater.thread.board] = OP.custom_spoiler;
ThreadUpdater.updateThreadStatus('Sticky', !!OP.sticky);
@ -9853,25 +9816,15 @@
node = Build.postFromObject(postObject, ThreadUpdater.thread.board.ID);
posts.push(new Post(node, ThreadUpdater.thread, ThreadUpdater.thread.board));
}
deletedPosts = [];
deletedFiles = [];
ThreadUpdater.thread.posts.forEach(function(post) {
var ID;
ID = +post.ID;
if (__indexOf.call(index, ID) < 0) {
post.kill();
deletedPosts.push({
ID: post.ID,
fullID: post.fullID
});
} else if (post.isDead) {
post.resurrect();
} else if (post.file && !(post.file.isDead || __indexOf.call(files, ID) >= 0)) {
post.kill(true);
deletedFiles.push({
ID: post.ID,
fullID: post.fullID
});
}
if (ThreadUpdater.postID && ThreadUpdater.postID === ID) {
return ThreadUpdater.foundPost = true;
@ -9923,24 +9876,10 @@
}
return $.event('ThreadUpdate', {
404: false,
thread: {
ID: ThreadUpdater.thread.ID,
fullID: ThreadUpdater.thread.fullID
},
newPosts: (function() {
var _k, _len2, _results;
_results = [];
for (_k = 0, _len2 = posts.length; _k < _len2; _k++) {
post = posts[_k];
_results.push({
ID: post.ID,
fullID: post.fullID
});
}
return _results;
})(),
deletedPosts: deletedPosts,
deletedFiles: deletedFiles,
threadID: ThreadUpdater.thread.fullID,
newPosts: posts.map(function(post) {
return post.fullID;
}),
postCount: OP.replies + 1,
fileCount: OP.images + (!!ThreadUpdater.thread.OP.file && !ThreadUpdater.thread.OP.file.isDead)
});
@ -10075,14 +10014,14 @@
return ThreadWatcher.rm(boardID, +threadID);
},
post: function(e) {
var board, postID, threadID, _ref;
_ref = e.detail, board = _ref.board, postID = _ref.postID, threadID = _ref.threadID;
var boardID, postID, threadID, _ref;
_ref = e.detail, boardID = _ref.boardID, threadID = _ref.threadID, postID = _ref.postID;
if (postID === threadID) {
if (Conf['Auto Watch']) {
return $.set('AutoWatch', threadID);
}
} else if (Conf['Auto Watch Reply']) {
return ThreadWatcher.add(g.boards[board.ID].threads[threadID]);
return ThreadWatcher.add(g.threads[boardID + '.' + threadID]);
}
},
onIndexRefresh: function() {
@ -10112,7 +10051,7 @@
},
onThreadRefresh: function(e) {
var thread;
thread = g.threads[e.detail.thread.fullID];
thread = g.threads[e.detail.threadID];
if (!(e.detail[404] && ThreadWatcher.db.get({
boardID: thread.board.ID,
threadID: thread.ID
@ -10324,7 +10263,7 @@
if (!Conf['Thread Watcher']) {
return;
}
menu = new UI.Menu('thread watcher');
menu = this.menu = new UI.Menu('thread watcher');
$.on($('.menu-button', ThreadWatcher.dialog), 'click', function(e) {
return menu.toggle(e, this, ThreadWatcher);
});
@ -10339,8 +10278,7 @@
entryEl = $.el('a', {
href: 'javascript:;'
});
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: entryEl,
order: 60
});
@ -10361,7 +10299,6 @@
entries.push({
cb: ThreadWatcher.cb.openAll,
entry: {
type: 'thread watcher',
el: $.el('a', {
textContent: 'Open all threads'
})
@ -10373,7 +10310,6 @@
entries.push({
cb: ThreadWatcher.cb.checkThreads,
entry: {
type: 'thread watcher',
el: $.el('a', {
textContent: 'Check 404\'d threads'
})
@ -10385,7 +10321,6 @@
entries.push({
cb: ThreadWatcher.cb.pruneDeads,
entry: {
type: 'thread watcher',
el: $.el('a', {
textContent: 'Prune 404\'d threads'
})
@ -10402,7 +10337,6 @@
}
entries.push({
entry: {
type: 'thread watcher',
el: $.el('span', {
textContent: 'Settings'
}),
@ -10420,7 +10354,7 @@
if (refresh) {
this.refreshers.push(refresh.bind(entry));
}
UI.addMenuEntry(entry);
this.menu.addEntry(entry);
}
},
createSubEntry: function(name, desc) {
@ -10597,20 +10531,12 @@
};
},
onUpdate: function(e) {
var post;
if (e.detail[404]) {
return Unread.update();
} else if (!QuoteThreading.enabled) {
return Unread.addPosts((function() {
var _i, _len, _ref, _results;
_ref = e.detail.newPosts;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
post = _ref[_i];
_results.push(g.posts[post.fullID]);
}
return _results;
})());
return Unread.addPosts(e.detail.newPosts.map(function(fullID) {
return g.posts[fullID];
}));
} else {
Unread.read();
return Unread.update();
@ -10819,7 +10745,6 @@
return;
}
entry = {
type: 'header',
el: $.el('a', {
textContent: 'Show announcement',
className: 'show-announcement',
@ -10830,7 +10755,7 @@
return psa.hidden;
}
};
UI.addMenuEntry(entry);
Header.menu.addEntry(entry);
$.on(entry.el, 'click', PSAHiding.toggle);
PSAHiding.btn = btn = $.el('span', {
innerHTML: '[<a href="javascript:;">Dismiss</a>]',
@ -10983,8 +10908,7 @@
input = $('input', el);
$.on(input, 'change', this.toggle);
$.sync('Header catalog links', CatalogLinks.set);
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: el,
order: 95
});
@ -11481,7 +11405,7 @@
});
}
if (board === 'sci') {
$.globalEval('window.addEventListener(\'jsmath\', function(e) {\n if (!jsMath) return;\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(document.getElementById(\'p\' + e.detail));\n } else if (jsMath.Autoload && jsMath.Autoload.checked) {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push(\'ProcessBeforeShowing\', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);');
$.globalEval('window.addEventListener(\'jsmath\', function(e) {\n if (!jsMath) return;\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(document.getElementById(e.detail));\n } else if (jsMath.Autoload && jsMath.Autoload.checked) {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push(\'ProcessBeforeShowing\', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);');
return Post.callbacks.push({
name: 'Parse /sci/ math',
cb: this.math
@ -11514,7 +11438,7 @@
};
})(this)), (function(_this) {
return function() {
return $.event('jsmath', _this.ID, window);
return $.event('jsmath', _this.nodes.post.id, window);
};
})(this));
},
@ -12362,7 +12286,7 @@
Settings.dialog = dialog = $.el('div', {
id: 'fourchanx-settings',
className: 'dialog',
innerHTML: '<nav><div class=sections-list></div><p class=\'imp-exp-result warning\'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href=\'https://github.com/ccd0/4chan-x\' target=_blank>4chan X</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md\' target=_blank>1.8.0</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/issues\' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class=\'close fa fa-times\' title=Close></a></div></nav><div class=section-container><section></section></div>'
innerHTML: '<nav><div class=sections-list></div><p class=\'imp-exp-result warning\'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href=\'https://github.com/ccd0/4chan-x\' target=_blank>4chan X</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md\' target=_blank>1.8.1</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/issues\' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class=\'close fa fa-times\' title=Close></a></div></nav><div class=section-container><section></section></div>'
});
$.on($('.export', Settings.dialog), 'click', Settings["export"]);
$.on($('.import', Settings.dialog), 'click', Settings["import"]);
@ -13206,7 +13130,7 @@
}
if (previousversion) {
el = $.el('span', {
innerHTML: '4chan X has been updated to <a href="https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md" target="_blank">version 1.8.0</a>.'
innerHTML: '4chan X has been updated to <a href="https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md" target="_blank">version 1.8.1</a>.'
});
new Notice('info', el, 15);
} else {
@ -13249,25 +13173,6 @@
};
return softTask();
},
addCallback: function(e) {
var Klass, obj;
obj = e.detail;
if (typeof obj.callback.name !== 'string') {
throw new Error("Invalid callback name: " + obj.callback.name);
}
switch (obj.type) {
case 'Post':
Klass = Post;
break;
case 'Thread':
Klass = Thread;
break;
default:
return;
}
obj.callback.isAddon = true;
return Klass.callbacks.push(obj.callback);
},
handleErrors: function(errors) {
var div, error, logs, _i, _len;
if (!(errors instanceof Array)) {

Binary file not shown.

Binary file not shown.

View File

@ -1,6 +1,6 @@
{
"name": "4chan X",
"version": "1.8.0",
"version": "1.8.1",
"manifest_version": 2,
"description": "Cross-browser userscript for maximum lurking on 4chan.",
"icons": {

View File

@ -1,6 +1,6 @@
// Generated by CoffeeScript
/*
* 4chan X - Version 1.8.0 - 2014-06-18
* 4chan X - Version 1.8.1 - 2014-06-19
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
@ -349,7 +349,7 @@
doc = d.documentElement;
g = {
VERSION: '1.8.0',
VERSION: '1.8.1',
NAMESPACE: '4chan X.',
boards: {}
};
@ -1845,8 +1845,7 @@
$.sync('Header auto-hide', this.setBarVisibility);
$.sync('Centered links', this.setLinkJustify);
this.addShortcut(menuButton);
UI.addMenuEntry({
type: 'header',
this.menu.addEntry({
el: $.el('span', {
textContent: 'Header'
}),
@ -2395,8 +2394,7 @@
$.on(input, 'change', this.cb.sort);
}
}
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: $.el('span', {
textContent: 'Index Navigation'
}),
@ -3104,7 +3102,7 @@
This function contains code from 4chan-JS (https://github.com/4chan/4chan-JS).
@license: https://github.com/4chan/4chan-JS/blob/master/LICENSE
*/
var E, boardID, capcode, container, date, dateUTC, email, file, fileSize, fileThumb, flagCode, flagName, h_capcodeClass, h_capcodeIcon, h_capcodeStart, h_closed, h_comment, h_emailEnd, h_emailStart, h_file, h_fileDims, h_fileInfo, h_fileTitle1, h_fileTitle2, h_flag, h_gifIcon, h_imgSrc, h_pageIcon, h_postClass, h_quoteLink, h_replyLink, h_sideArrows, h_staticPath, h_sticky, h_tripcode, h_userID, href, isClosed, isOP, isSticky, name, pageNum, postID, quote, shortFilename, spoilerRange, subject, threadID, tripcode, uniqueID, _i, _len, _ref;
var E, boardID, capcode, container, date, dateUTC, email, email_processed, file, fileSize, fileThumb, flagCode, flagName, h_capcodeClass, h_capcodeIcon, h_capcodeStart, h_closed, h_comment, h_emailEnd, h_emailStart, h_file, h_fileDims, h_fileInfo, h_fileTitle1, h_fileTitle2, h_flag, h_gifIcon, h_imgSrc, h_pageIcon, h_postClass, h_quoteLink, h_replyLink, h_sideArrows, h_staticPath, h_sticky, h_tripcode, h_userID, href, isClosed, isOP, isSticky, name, pageNum, postID, quote, shortFilename, spoilerRange, subject, threadID, tripcode, uniqueID, _i, _len, _ref;
E = Build.h_escape;
postID = o.postID, threadID = o.threadID, boardID = o.boardID, name = o.name, capcode = o.capcode, tripcode = o.tripcode, uniqueID = o.uniqueID, email = o.email, subject = o.subject, flagCode = o.flagCode, flagName = o.flagName, date = o.date, dateUTC = o.dateUTC, isSticky = o.isSticky, isClosed = o.isClosed, h_comment = o.h_comment, file = o.file;
name || (name = '');
@ -3122,8 +3120,9 @@
} else {
h_tripcode = '';
}
email_processed = encodeURIComponent(email).replace(/%40/g, '@');
if (email) {
h_emailStart = "<a href='mailto:" + (E(encodeURIComponent(email))) + "' class='useremail'>";
h_emailStart = "<a href='mailto:" + (E(email_processed)) + "' class='useremail'>";
h_emailEnd = '</a>';
} else {
h_emailStart = '';
@ -3570,7 +3569,7 @@
};
UI = (function() {
var Menu, addMenuEntry, checkbox, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, menus, rmMenuEntry, touchend, touchmove;
var Menu, checkbox, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, menus, touchend, touchmove;
dialog = function(id, position, properties) {
var child, el, move, _i, _len, _ref;
el = $.el('div', {
@ -3597,12 +3596,6 @@
return el;
};
menus = {};
addMenuEntry = function(entry) {
return menus[entry.type].addEntry(entry);
};
rmMenuEntry = function(entry) {
return menus[entry.type].addEntry(entry);
};
Menu = (function() {
var currentMenu, lastToggledButton;
@ -3612,7 +3605,6 @@
function Menu(type) {
this.type = type;
this.rmEntry = __bind(this.rmEntry, this);
this.addEntry = __bind(this.addEntry, this);
this.onFocus = __bind(this.onFocus, this);
this.keybinds = __bind(this.keybinds, this);
@ -3825,12 +3817,6 @@
return this.entries.push(entry);
};
Menu.prototype.rmEntry = function(entry) {
var index;
index = this.entries.indexOf(entry);
return this.entries.splice(index, 1);
};
Menu.prototype.parseEntry = function(entry) {
var el, subEntries, subEntry, _i, _len;
el = entry.el, subEntries = entry.subEntries;
@ -4009,9 +3995,7 @@
dialog: dialog,
Menu: Menu,
hover: hoverstart,
checkbox: checkbox,
addMenuEntry: addMenuEntry,
rmMenuEntry: rmMenuEntry
checkbox: checkbox
};
})();
@ -4292,7 +4276,6 @@
textContent: 'Filter'
});
entry = {
type: 'post',
el: div,
order: 50,
open: function(post) {
@ -4306,7 +4289,7 @@
type = _ref[_i];
entry.subEntries.push(Filter.menu.createSubEntry(type[0], type[1]));
}
return UI.addMenuEntry(entry);
return Menu.menu.addEntry(entry);
},
createSubEntry: function(text, type) {
var el;
@ -4412,8 +4395,7 @@
thisPost = UI.checkbox('thisPost', ' This post', true);
replies = UI.checkbox('replies', ' Hide replies', Conf['Recursive Hiding']);
makeStub = UI.checkbox('makeStub', ' Make stub', Conf['Stubs']);
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(post) {
@ -4451,8 +4433,7 @@
href: 'javascript:;'
});
$.on(hideStubLink, 'click', PostHiding.menu.hideStub);
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(post) {
@ -4482,8 +4463,7 @@
}
]
});
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: hideStubLink,
order: 15,
open: function(post) {
@ -4814,8 +4794,7 @@
});
$.on(apply, 'click', ThreadHiding.menu.hide);
makeStub = UI.checkbox('Stubs', ' Make stub');
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(_arg) {
@ -4841,8 +4820,7 @@
href: 'javascript:;'
});
$.on(div, 'click', ThreadHiding.menu.show);
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(_arg) {
@ -4860,8 +4838,7 @@
href: 'javascript:;'
});
$.on(hideStubLink, 'click', ThreadHiding.menu.hideStub);
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: hideStubLink,
order: 15,
open: function(_arg) {
@ -5388,8 +5365,7 @@
});
input = $('input', this.controls);
$.on(input, 'change', this.toggle);
UI.addMenuEntry(this.entry = {
type: 'header',
Header.menu.addEntry(this.entry = {
el: this.controls,
order: 98
});
@ -6591,13 +6567,12 @@
});
ThreadUpdater.postID = postID;
$.event('QRPostSuccessful', {
board: {
ID: g.BOARD.ID
},
boardID: g.BOARD.ID,
threadID: threadID,
postID: postID
});
$.event('QRPostSuccessful_', {
boardID: g.BOARD.ID,
threadID: threadID,
postID: postID
});
@ -7486,8 +7461,7 @@
el.title = "" + type + " Tyme";
FappeTyme[lc] = input = el.firstElementChild;
$.on(input, 'change', FappeTyme.cb.toggle.bind(input));
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: el,
order: 97
});
@ -7586,8 +7560,7 @@
createSubEntry = Gallery.menu.createSubEntry;
for (name in Config.gallery) {
el = createSubEntry(name).el;
UI.addMenuEntry({
type: 'gallery',
nodes.menu.addEntry({
el: el,
order: 0
});
@ -7821,8 +7794,7 @@
for (name in Config.gallery) {
subEntries.push(createSubEntry(name));
}
return UI.addMenuEntry({
type: 'header',
return Header.menu.addEntry({
el: el,
order: 105,
subEntries: subEntries
@ -8155,8 +8127,7 @@
conf = _ref[name];
subEntries.push(createSubEntry(name, conf[1]));
}
return UI.addMenuEntry({
type: 'header',
return Header.menu.addEntry({
el: el,
order: 105,
subEntries: subEntries
@ -8317,8 +8288,7 @@
});
this.el = prefetch.firstElementChild;
$.on(this.el, 'change', this.toggle);
return UI.addMenuEntry({
type: 'header',
return Header.menu.addEntry({
el: prefetch,
order: 104
});
@ -9075,7 +9045,6 @@
textContent: 'Archive'
});
entry = {
type: 'post',
el: div,
order: 90,
open: function(_arg) {
@ -9094,7 +9063,7 @@
type = _ref[_i];
entry.subEntries.push(this.createSubEntry(type[0], type[1]));
}
return UI.addMenuEntry(entry);
return Menu.menu.addEntry(entry);
},
createSubEntry: function(text, type) {
var el, open;
@ -9171,8 +9140,7 @@
return true;
}
};
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: div,
order: 40,
open: function(post) {
@ -9296,8 +9264,7 @@
};
})(this));
});
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: a,
order: 100,
open: function(_arg) {
@ -9365,8 +9332,7 @@
textContent: 'Report this post'
});
$.on(a, 'click', ReportLink.report);
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: a,
order: 10,
open: function(post) {
@ -9613,8 +9579,7 @@
subEntries.push({
el: this.settings
});
UI.addMenuEntry(this.entry = {
type: 'header',
Header.menu.addEntry(this.entry = {
el: $.el('span', {
textContent: 'Updater'
}),
@ -9724,9 +9689,7 @@
ThreadUpdater.thread.kill();
$.event('ThreadUpdate', {
404: true,
thread: {
fullID: ThreadUpdater.thread.fullID
}
threadID: ThreadUpdater.thread.fullID
});
break;
default:
@ -9820,7 +9783,7 @@
return new Notice('info', "The thread is " + change + ".", 30);
},
parse: function(postObjects) {
var OP, count, deletedFiles, deletedPosts, files, index, node, num, post, postObject, posts, root, scroll, _i, _j, _len, _len1;
var OP, count, files, index, node, num, post, postObject, posts, root, scroll, _i, _j, _len, _len1;
OP = postObjects[0];
Build.spoilerRange[ThreadUpdater.thread.board] = OP.custom_spoiler;
ThreadUpdater.updateThreadStatus('Sticky', !!OP.sticky);
@ -9845,25 +9808,15 @@
node = Build.postFromObject(postObject, ThreadUpdater.thread.board.ID);
posts.push(new Post(node, ThreadUpdater.thread, ThreadUpdater.thread.board));
}
deletedPosts = [];
deletedFiles = [];
ThreadUpdater.thread.posts.forEach(function(post) {
var ID;
ID = +post.ID;
if (__indexOf.call(index, ID) < 0) {
post.kill();
deletedPosts.push({
ID: post.ID,
fullID: post.fullID
});
} else if (post.isDead) {
post.resurrect();
} else if (post.file && !(post.file.isDead || __indexOf.call(files, ID) >= 0)) {
post.kill(true);
deletedFiles.push({
ID: post.ID,
fullID: post.fullID
});
}
if (ThreadUpdater.postID && ThreadUpdater.postID === ID) {
return ThreadUpdater.foundPost = true;
@ -9915,24 +9868,10 @@
}
return $.event('ThreadUpdate', {
404: false,
thread: {
ID: ThreadUpdater.thread.ID,
fullID: ThreadUpdater.thread.fullID
},
newPosts: (function() {
var _k, _len2, _results;
_results = [];
for (_k = 0, _len2 = posts.length; _k < _len2; _k++) {
post = posts[_k];
_results.push({
ID: post.ID,
fullID: post.fullID
});
}
return _results;
})(),
deletedPosts: deletedPosts,
deletedFiles: deletedFiles,
threadID: ThreadUpdater.thread.fullID,
newPosts: posts.map(function(post) {
return post.fullID;
}),
postCount: OP.replies + 1,
fileCount: OP.images + (!!ThreadUpdater.thread.OP.file && !ThreadUpdater.thread.OP.file.isDead)
});
@ -10067,14 +10006,14 @@
return ThreadWatcher.rm(boardID, +threadID);
},
post: function(e) {
var board, postID, threadID, _ref;
_ref = e.detail, board = _ref.board, postID = _ref.postID, threadID = _ref.threadID;
var boardID, postID, threadID, _ref;
_ref = e.detail, boardID = _ref.boardID, threadID = _ref.threadID, postID = _ref.postID;
if (postID === threadID) {
if (Conf['Auto Watch']) {
return $.set('AutoWatch', threadID);
}
} else if (Conf['Auto Watch Reply']) {
return ThreadWatcher.add(g.boards[board.ID].threads[threadID]);
return ThreadWatcher.add(g.threads[boardID + '.' + threadID]);
}
},
onIndexRefresh: function() {
@ -10104,7 +10043,7 @@
},
onThreadRefresh: function(e) {
var thread;
thread = g.threads[e.detail.thread.fullID];
thread = g.threads[e.detail.threadID];
if (!(e.detail[404] && ThreadWatcher.db.get({
boardID: thread.board.ID,
threadID: thread.ID
@ -10316,7 +10255,7 @@
if (!Conf['Thread Watcher']) {
return;
}
menu = new UI.Menu('thread watcher');
menu = this.menu = new UI.Menu('thread watcher');
$.on($('.menu-button', ThreadWatcher.dialog), 'click', function(e) {
return menu.toggle(e, this, ThreadWatcher);
});
@ -10331,8 +10270,7 @@
entryEl = $.el('a', {
href: 'javascript:;'
});
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: entryEl,
order: 60
});
@ -10353,7 +10291,6 @@
entries.push({
cb: ThreadWatcher.cb.openAll,
entry: {
type: 'thread watcher',
el: $.el('a', {
textContent: 'Open all threads'
})
@ -10365,7 +10302,6 @@
entries.push({
cb: ThreadWatcher.cb.checkThreads,
entry: {
type: 'thread watcher',
el: $.el('a', {
textContent: 'Check 404\'d threads'
})
@ -10377,7 +10313,6 @@
entries.push({
cb: ThreadWatcher.cb.pruneDeads,
entry: {
type: 'thread watcher',
el: $.el('a', {
textContent: 'Prune 404\'d threads'
})
@ -10394,7 +10329,6 @@
}
entries.push({
entry: {
type: 'thread watcher',
el: $.el('span', {
textContent: 'Settings'
}),
@ -10412,7 +10346,7 @@
if (refresh) {
this.refreshers.push(refresh.bind(entry));
}
UI.addMenuEntry(entry);
this.menu.addEntry(entry);
}
},
createSubEntry: function(name, desc) {
@ -10589,20 +10523,12 @@
};
},
onUpdate: function(e) {
var post;
if (e.detail[404]) {
return Unread.update();
} else if (!QuoteThreading.enabled) {
return Unread.addPosts((function() {
var _i, _len, _ref, _results;
_ref = e.detail.newPosts;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
post = _ref[_i];
_results.push(g.posts[post.fullID]);
}
return _results;
})());
return Unread.addPosts(e.detail.newPosts.map(function(fullID) {
return g.posts[fullID];
}));
} else {
Unread.read();
return Unread.update();
@ -10810,7 +10736,6 @@
return;
}
entry = {
type: 'header',
el: $.el('a', {
textContent: 'Show announcement',
className: 'show-announcement',
@ -10821,7 +10746,7 @@
return psa.hidden;
}
};
UI.addMenuEntry(entry);
Header.menu.addEntry(entry);
$.on(entry.el, 'click', PSAHiding.toggle);
PSAHiding.btn = btn = $.el('span', {
innerHTML: '[<a href="javascript:;">Dismiss</a>]',
@ -10974,8 +10899,7 @@
input = $('input', el);
$.on(input, 'change', this.toggle);
$.sync('Header catalog links', CatalogLinks.set);
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: el,
order: 95
});
@ -11472,7 +11396,7 @@
});
}
if (board === 'sci') {
$.globalEval('window.addEventListener(\'jsmath\', function(e) {\n if (!jsMath) return;\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(document.getElementById(\'p\' + e.detail));\n } else if (jsMath.Autoload && jsMath.Autoload.checked) {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push(\'ProcessBeforeShowing\', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);');
$.globalEval('window.addEventListener(\'jsmath\', function(e) {\n if (!jsMath) return;\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(document.getElementById(e.detail));\n } else if (jsMath.Autoload && jsMath.Autoload.checked) {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push(\'ProcessBeforeShowing\', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);');
return Post.callbacks.push({
name: 'Parse /sci/ math',
cb: this.math
@ -11505,7 +11429,7 @@
};
})(this)), (function(_this) {
return function() {
return $.event('jsmath', _this.ID, window);
return $.event('jsmath', _this.nodes.post.id, window);
};
})(this));
},
@ -12353,7 +12277,7 @@
Settings.dialog = dialog = $.el('div', {
id: 'fourchanx-settings',
className: 'dialog',
innerHTML: '<nav><div class=sections-list></div><p class=\'imp-exp-result warning\'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href=\'https://github.com/ccd0/4chan-x\' target=_blank>4chan X</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md\' target=_blank>1.8.0</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/issues\' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class=\'close fa fa-times\' title=Close></a></div></nav><div class=section-container><section></section></div>'
innerHTML: '<nav><div class=sections-list></div><p class=\'imp-exp-result warning\'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href=\'https://github.com/ccd0/4chan-x\' target=_blank>4chan X</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md\' target=_blank>1.8.1</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/issues\' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class=\'close fa fa-times\' title=Close></a></div></nav><div class=section-container><section></section></div>'
});
$.on($('.export', Settings.dialog), 'click', Settings["export"]);
$.on($('.import', Settings.dialog), 'click', Settings["import"]);
@ -13184,7 +13108,7 @@
}
if (previousversion) {
el = $.el('span', {
innerHTML: '4chan X has been updated to <a href="https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md" target="_blank">version 1.8.0</a>.'
innerHTML: '4chan X has been updated to <a href="https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md" target="_blank">version 1.8.1</a>.'
});
new Notice('info', el, 15);
} else {
@ -13227,25 +13151,6 @@
};
return softTask();
},
addCallback: function(e) {
var Klass, obj;
obj = e.detail;
if (typeof obj.callback.name !== 'string') {
throw new Error("Invalid callback name: " + obj.callback.name);
}
switch (obj.type) {
case 'Post':
Klass = Post;
break;
case 'Thread':
Klass = Thread;
break;
default:
return;
}
obj.callback.isAddon = true;
return Klass.callbacks.push(obj.callback);
},
handleErrors: function(errors) {
var div, error, logs, _i, _len;
if (!(errors instanceof Array)) {

View File

@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='lacclbnghgdicfifcamcmcnilckjamag'>
<updatecheck codebase='https://ccd0.github.io/4chan-x/builds/crx.crx' version='1.8.0' />
<updatecheck codebase='https://ccd0.github.io/4chan-x/builds/crx.crx' version='1.8.1' />
</app>
</gupdate>

View File

@ -1,6 +1,6 @@
{
"name": "4chan X",
"version": "1.8.0",
"version": "1.8.1",
"manifest_version": 2,
"description": "Cross-browser userscript for maximum lurking on 4chan.",
"icons": {

View File

@ -1,6 +1,6 @@
// Generated by CoffeeScript
/*
* 4chan X - Version 1.8.0 - 2014-06-18
* 4chan X - Version 1.8.1 - 2014-06-19
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
@ -349,7 +349,7 @@
doc = d.documentElement;
g = {
VERSION: '1.8.0',
VERSION: '1.8.1',
NAMESPACE: '4chan X.',
boards: {}
};
@ -1845,8 +1845,7 @@
$.sync('Header auto-hide', this.setBarVisibility);
$.sync('Centered links', this.setLinkJustify);
this.addShortcut(menuButton);
UI.addMenuEntry({
type: 'header',
this.menu.addEntry({
el: $.el('span', {
textContent: 'Header'
}),
@ -2395,8 +2394,7 @@
$.on(input, 'change', this.cb.sort);
}
}
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: $.el('span', {
textContent: 'Index Navigation'
}),
@ -3104,7 +3102,7 @@
This function contains code from 4chan-JS (https://github.com/4chan/4chan-JS).
@license: https://github.com/4chan/4chan-JS/blob/master/LICENSE
*/
var E, boardID, capcode, container, date, dateUTC, email, file, fileSize, fileThumb, flagCode, flagName, h_capcodeClass, h_capcodeIcon, h_capcodeStart, h_closed, h_comment, h_emailEnd, h_emailStart, h_file, h_fileDims, h_fileInfo, h_fileTitle1, h_fileTitle2, h_flag, h_gifIcon, h_imgSrc, h_pageIcon, h_postClass, h_quoteLink, h_replyLink, h_sideArrows, h_staticPath, h_sticky, h_tripcode, h_userID, href, isClosed, isOP, isSticky, name, pageNum, postID, quote, shortFilename, spoilerRange, subject, threadID, tripcode, uniqueID, _i, _len, _ref;
var E, boardID, capcode, container, date, dateUTC, email, email_processed, file, fileSize, fileThumb, flagCode, flagName, h_capcodeClass, h_capcodeIcon, h_capcodeStart, h_closed, h_comment, h_emailEnd, h_emailStart, h_file, h_fileDims, h_fileInfo, h_fileTitle1, h_fileTitle2, h_flag, h_gifIcon, h_imgSrc, h_pageIcon, h_postClass, h_quoteLink, h_replyLink, h_sideArrows, h_staticPath, h_sticky, h_tripcode, h_userID, href, isClosed, isOP, isSticky, name, pageNum, postID, quote, shortFilename, spoilerRange, subject, threadID, tripcode, uniqueID, _i, _len, _ref;
E = Build.h_escape;
postID = o.postID, threadID = o.threadID, boardID = o.boardID, name = o.name, capcode = o.capcode, tripcode = o.tripcode, uniqueID = o.uniqueID, email = o.email, subject = o.subject, flagCode = o.flagCode, flagName = o.flagName, date = o.date, dateUTC = o.dateUTC, isSticky = o.isSticky, isClosed = o.isClosed, h_comment = o.h_comment, file = o.file;
name || (name = '');
@ -3122,8 +3120,9 @@
} else {
h_tripcode = '';
}
email_processed = encodeURIComponent(email).replace(/%40/g, '@');
if (email) {
h_emailStart = "<a href='mailto:" + (E(encodeURIComponent(email))) + "' class='useremail'>";
h_emailStart = "<a href='mailto:" + (E(email_processed)) + "' class='useremail'>";
h_emailEnd = '</a>';
} else {
h_emailStart = '';
@ -3570,7 +3569,7 @@
};
UI = (function() {
var Menu, addMenuEntry, checkbox, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, menus, rmMenuEntry, touchend, touchmove;
var Menu, checkbox, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, menus, touchend, touchmove;
dialog = function(id, position, properties) {
var child, el, move, _i, _len, _ref;
el = $.el('div', {
@ -3597,12 +3596,6 @@
return el;
};
menus = {};
addMenuEntry = function(entry) {
return menus[entry.type].addEntry(entry);
};
rmMenuEntry = function(entry) {
return menus[entry.type].addEntry(entry);
};
Menu = (function() {
var currentMenu, lastToggledButton;
@ -3612,7 +3605,6 @@
function Menu(type) {
this.type = type;
this.rmEntry = __bind(this.rmEntry, this);
this.addEntry = __bind(this.addEntry, this);
this.onFocus = __bind(this.onFocus, this);
this.keybinds = __bind(this.keybinds, this);
@ -3825,12 +3817,6 @@
return this.entries.push(entry);
};
Menu.prototype.rmEntry = function(entry) {
var index;
index = this.entries.indexOf(entry);
return this.entries.splice(index, 1);
};
Menu.prototype.parseEntry = function(entry) {
var el, subEntries, subEntry, _i, _len;
el = entry.el, subEntries = entry.subEntries;
@ -4009,9 +3995,7 @@
dialog: dialog,
Menu: Menu,
hover: hoverstart,
checkbox: checkbox,
addMenuEntry: addMenuEntry,
rmMenuEntry: rmMenuEntry
checkbox: checkbox
};
})();
@ -4292,7 +4276,6 @@
textContent: 'Filter'
});
entry = {
type: 'post',
el: div,
order: 50,
open: function(post) {
@ -4306,7 +4289,7 @@
type = _ref[_i];
entry.subEntries.push(Filter.menu.createSubEntry(type[0], type[1]));
}
return UI.addMenuEntry(entry);
return Menu.menu.addEntry(entry);
},
createSubEntry: function(text, type) {
var el;
@ -4412,8 +4395,7 @@
thisPost = UI.checkbox('thisPost', ' This post', true);
replies = UI.checkbox('replies', ' Hide replies', Conf['Recursive Hiding']);
makeStub = UI.checkbox('makeStub', ' Make stub', Conf['Stubs']);
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(post) {
@ -4451,8 +4433,7 @@
href: 'javascript:;'
});
$.on(hideStubLink, 'click', PostHiding.menu.hideStub);
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(post) {
@ -4482,8 +4463,7 @@
}
]
});
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: hideStubLink,
order: 15,
open: function(post) {
@ -4814,8 +4794,7 @@
});
$.on(apply, 'click', ThreadHiding.menu.hide);
makeStub = UI.checkbox('Stubs', ' Make stub');
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(_arg) {
@ -4841,8 +4820,7 @@
href: 'javascript:;'
});
$.on(div, 'click', ThreadHiding.menu.show);
UI.addMenuEntry({
type: 'post',
Menu.menu.addEntry({
el: div,
order: 20,
open: function(_arg) {
@ -4860,8 +4838,7 @@
href: 'javascript:;'
});
$.on(hideStubLink, 'click', ThreadHiding.menu.hideStub);
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: hideStubLink,
order: 15,
open: function(_arg) {
@ -5388,8 +5365,7 @@
});
input = $('input', this.controls);
$.on(input, 'change', this.toggle);
UI.addMenuEntry(this.entry = {
type: 'header',
Header.menu.addEntry(this.entry = {
el: this.controls,
order: 98
});
@ -6591,13 +6567,12 @@
});
ThreadUpdater.postID = postID;
$.event('QRPostSuccessful', {
board: {
ID: g.BOARD.ID
},
boardID: g.BOARD.ID,
threadID: threadID,
postID: postID
});
$.event('QRPostSuccessful_', {
boardID: g.BOARD.ID,
threadID: threadID,
postID: postID
});
@ -7486,8 +7461,7 @@
el.title = "" + type + " Tyme";
FappeTyme[lc] = input = el.firstElementChild;
$.on(input, 'change', FappeTyme.cb.toggle.bind(input));
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: el,
order: 97
});
@ -7586,8 +7560,7 @@
createSubEntry = Gallery.menu.createSubEntry;
for (name in Config.gallery) {
el = createSubEntry(name).el;
UI.addMenuEntry({
type: 'gallery',
nodes.menu.addEntry({
el: el,
order: 0
});
@ -7821,8 +7794,7 @@
for (name in Config.gallery) {
subEntries.push(createSubEntry(name));
}
return UI.addMenuEntry({
type: 'header',
return Header.menu.addEntry({
el: el,
order: 105,
subEntries: subEntries
@ -8155,8 +8127,7 @@
conf = _ref[name];
subEntries.push(createSubEntry(name, conf[1]));
}
return UI.addMenuEntry({
type: 'header',
return Header.menu.addEntry({
el: el,
order: 105,
subEntries: subEntries
@ -8317,8 +8288,7 @@
});
this.el = prefetch.firstElementChild;
$.on(this.el, 'change', this.toggle);
return UI.addMenuEntry({
type: 'header',
return Header.menu.addEntry({
el: prefetch,
order: 104
});
@ -9075,7 +9045,6 @@
textContent: 'Archive'
});
entry = {
type: 'post',
el: div,
order: 90,
open: function(_arg) {
@ -9094,7 +9063,7 @@
type = _ref[_i];
entry.subEntries.push(this.createSubEntry(type[0], type[1]));
}
return UI.addMenuEntry(entry);
return Menu.menu.addEntry(entry);
},
createSubEntry: function(text, type) {
var el, open;
@ -9171,8 +9140,7 @@
return true;
}
};
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: div,
order: 40,
open: function(post) {
@ -9296,8 +9264,7 @@
};
})(this));
});
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: a,
order: 100,
open: function(_arg) {
@ -9365,8 +9332,7 @@
textContent: 'Report this post'
});
$.on(a, 'click', ReportLink.report);
return UI.addMenuEntry({
type: 'post',
return Menu.menu.addEntry({
el: a,
order: 10,
open: function(post) {
@ -9613,8 +9579,7 @@
subEntries.push({
el: this.settings
});
UI.addMenuEntry(this.entry = {
type: 'header',
Header.menu.addEntry(this.entry = {
el: $.el('span', {
textContent: 'Updater'
}),
@ -9724,9 +9689,7 @@
ThreadUpdater.thread.kill();
$.event('ThreadUpdate', {
404: true,
thread: {
fullID: ThreadUpdater.thread.fullID
}
threadID: ThreadUpdater.thread.fullID
});
break;
default:
@ -9820,7 +9783,7 @@
return new Notice('info', "The thread is " + change + ".", 30);
},
parse: function(postObjects) {
var OP, count, deletedFiles, deletedPosts, files, index, node, num, post, postObject, posts, root, scroll, _i, _j, _len, _len1;
var OP, count, files, index, node, num, post, postObject, posts, root, scroll, _i, _j, _len, _len1;
OP = postObjects[0];
Build.spoilerRange[ThreadUpdater.thread.board] = OP.custom_spoiler;
ThreadUpdater.updateThreadStatus('Sticky', !!OP.sticky);
@ -9845,25 +9808,15 @@
node = Build.postFromObject(postObject, ThreadUpdater.thread.board.ID);
posts.push(new Post(node, ThreadUpdater.thread, ThreadUpdater.thread.board));
}
deletedPosts = [];
deletedFiles = [];
ThreadUpdater.thread.posts.forEach(function(post) {
var ID;
ID = +post.ID;
if (__indexOf.call(index, ID) < 0) {
post.kill();
deletedPosts.push({
ID: post.ID,
fullID: post.fullID
});
} else if (post.isDead) {
post.resurrect();
} else if (post.file && !(post.file.isDead || __indexOf.call(files, ID) >= 0)) {
post.kill(true);
deletedFiles.push({
ID: post.ID,
fullID: post.fullID
});
}
if (ThreadUpdater.postID && ThreadUpdater.postID === ID) {
return ThreadUpdater.foundPost = true;
@ -9915,24 +9868,10 @@
}
return $.event('ThreadUpdate', {
404: false,
thread: {
ID: ThreadUpdater.thread.ID,
fullID: ThreadUpdater.thread.fullID
},
newPosts: (function() {
var _k, _len2, _results;
_results = [];
for (_k = 0, _len2 = posts.length; _k < _len2; _k++) {
post = posts[_k];
_results.push({
ID: post.ID,
fullID: post.fullID
});
}
return _results;
})(),
deletedPosts: deletedPosts,
deletedFiles: deletedFiles,
threadID: ThreadUpdater.thread.fullID,
newPosts: posts.map(function(post) {
return post.fullID;
}),
postCount: OP.replies + 1,
fileCount: OP.images + (!!ThreadUpdater.thread.OP.file && !ThreadUpdater.thread.OP.file.isDead)
});
@ -10067,14 +10006,14 @@
return ThreadWatcher.rm(boardID, +threadID);
},
post: function(e) {
var board, postID, threadID, _ref;
_ref = e.detail, board = _ref.board, postID = _ref.postID, threadID = _ref.threadID;
var boardID, postID, threadID, _ref;
_ref = e.detail, boardID = _ref.boardID, threadID = _ref.threadID, postID = _ref.postID;
if (postID === threadID) {
if (Conf['Auto Watch']) {
return $.set('AutoWatch', threadID);
}
} else if (Conf['Auto Watch Reply']) {
return ThreadWatcher.add(g.boards[board.ID].threads[threadID]);
return ThreadWatcher.add(g.threads[boardID + '.' + threadID]);
}
},
onIndexRefresh: function() {
@ -10104,7 +10043,7 @@
},
onThreadRefresh: function(e) {
var thread;
thread = g.threads[e.detail.thread.fullID];
thread = g.threads[e.detail.threadID];
if (!(e.detail[404] && ThreadWatcher.db.get({
boardID: thread.board.ID,
threadID: thread.ID
@ -10316,7 +10255,7 @@
if (!Conf['Thread Watcher']) {
return;
}
menu = new UI.Menu('thread watcher');
menu = this.menu = new UI.Menu('thread watcher');
$.on($('.menu-button', ThreadWatcher.dialog), 'click', function(e) {
return menu.toggle(e, this, ThreadWatcher);
});
@ -10331,8 +10270,7 @@
entryEl = $.el('a', {
href: 'javascript:;'
});
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: entryEl,
order: 60
});
@ -10353,7 +10291,6 @@
entries.push({
cb: ThreadWatcher.cb.openAll,
entry: {
type: 'thread watcher',
el: $.el('a', {
textContent: 'Open all threads'
})
@ -10365,7 +10302,6 @@
entries.push({
cb: ThreadWatcher.cb.checkThreads,
entry: {
type: 'thread watcher',
el: $.el('a', {
textContent: 'Check 404\'d threads'
})
@ -10377,7 +10313,6 @@
entries.push({
cb: ThreadWatcher.cb.pruneDeads,
entry: {
type: 'thread watcher',
el: $.el('a', {
textContent: 'Prune 404\'d threads'
})
@ -10394,7 +10329,6 @@
}
entries.push({
entry: {
type: 'thread watcher',
el: $.el('span', {
textContent: 'Settings'
}),
@ -10412,7 +10346,7 @@
if (refresh) {
this.refreshers.push(refresh.bind(entry));
}
UI.addMenuEntry(entry);
this.menu.addEntry(entry);
}
},
createSubEntry: function(name, desc) {
@ -10589,20 +10523,12 @@
};
},
onUpdate: function(e) {
var post;
if (e.detail[404]) {
return Unread.update();
} else if (!QuoteThreading.enabled) {
return Unread.addPosts((function() {
var _i, _len, _ref, _results;
_ref = e.detail.newPosts;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
post = _ref[_i];
_results.push(g.posts[post.fullID]);
}
return _results;
})());
return Unread.addPosts(e.detail.newPosts.map(function(fullID) {
return g.posts[fullID];
}));
} else {
Unread.read();
return Unread.update();
@ -10810,7 +10736,6 @@
return;
}
entry = {
type: 'header',
el: $.el('a', {
textContent: 'Show announcement',
className: 'show-announcement',
@ -10821,7 +10746,7 @@
return psa.hidden;
}
};
UI.addMenuEntry(entry);
Header.menu.addEntry(entry);
$.on(entry.el, 'click', PSAHiding.toggle);
PSAHiding.btn = btn = $.el('span', {
innerHTML: '[<a href="javascript:;">Dismiss</a>]',
@ -10974,8 +10899,7 @@
input = $('input', el);
$.on(input, 'change', this.toggle);
$.sync('Header catalog links', CatalogLinks.set);
UI.addMenuEntry({
type: 'header',
Header.menu.addEntry({
el: el,
order: 95
});
@ -11472,7 +11396,7 @@
});
}
if (board === 'sci') {
$.globalEval('window.addEventListener(\'jsmath\', function(e) {\n if (!jsMath) return;\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(document.getElementById(\'p\' + e.detail));\n } else if (jsMath.Autoload && jsMath.Autoload.checked) {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push(\'ProcessBeforeShowing\', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);');
$.globalEval('window.addEventListener(\'jsmath\', function(e) {\n if (!jsMath) return;\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(document.getElementById(e.detail));\n } else if (jsMath.Autoload && jsMath.Autoload.checked) {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push(\'ProcessBeforeShowing\', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);');
return Post.callbacks.push({
name: 'Parse /sci/ math',
cb: this.math
@ -11505,7 +11429,7 @@
};
})(this)), (function(_this) {
return function() {
return $.event('jsmath', _this.ID, window);
return $.event('jsmath', _this.nodes.post.id, window);
};
})(this));
},
@ -12353,7 +12277,7 @@
Settings.dialog = dialog = $.el('div', {
id: 'fourchanx-settings',
className: 'dialog',
innerHTML: '<nav><div class=sections-list></div><p class=\'imp-exp-result warning\'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href=\'https://github.com/ccd0/4chan-x\' target=_blank>4chan X</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md\' target=_blank>1.8.0</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/issues\' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class=\'close fa fa-times\' title=Close></a></div></nav><div class=section-container><section></section></div>'
innerHTML: '<nav><div class=sections-list></div><p class=\'imp-exp-result warning\'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href=\'https://github.com/ccd0/4chan-x\' target=_blank>4chan X</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md\' target=_blank>1.8.1</a>&nbsp|&nbsp<a href=\'https://github.com/ccd0/4chan-x/issues\' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class=\'close fa fa-times\' title=Close></a></div></nav><div class=section-container><section></section></div>'
});
$.on($('.export', Settings.dialog), 'click', Settings["export"]);
$.on($('.import', Settings.dialog), 'click', Settings["import"]);
@ -13184,7 +13108,7 @@
}
if (previousversion) {
el = $.el('span', {
innerHTML: '4chan X has been updated to <a href="https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md" target="_blank">version 1.8.0</a>.'
innerHTML: '4chan X has been updated to <a href="https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md" target="_blank">version 1.8.1</a>.'
});
new Notice('info', el, 15);
} else {
@ -13227,25 +13151,6 @@
};
return softTask();
},
addCallback: function(e) {
var Klass, obj;
obj = e.detail;
if (typeof obj.callback.name !== 'string') {
throw new Error("Invalid callback name: " + obj.callback.name);
}
switch (obj.type) {
case 'Post':
Klass = Post;
break;
case 'Thread':
Klass = Thread;
break;
default:
return;
}
obj.callback.isAddon = true;
return Klass.callbacks.push(obj.callback);
},
handleErrors: function(errors) {
var div, error, logs, _i, _len;
if (!(errors instanceof Array)) {

View File

@ -1,6 +1,6 @@
{
"name": "4chan-X",
"version": "1.8.0",
"version": "1.8.1",
"description": "Cross-browser userscript for maximum lurking on 4chan.",
"meta": {
"name": "4chan X",