Release 4chan X v1.9.21.0.

This commit is contained in:
ccd0 2015-01-26 19:32:02 -08:00
parent a720609a1c
commit e2c7a9553e
14 changed files with 330 additions and 645 deletions

View File

@ -2,6 +2,15 @@ The attributions below are for work that has been incorporated into the script a
The links to individual versions below are to copies of the script with the update URL removed. If you want automatic updates, install the script from the links on the [main page](https://github.com/ccd0/4chan-x).
<!-- v1.9.21.x -->
### v1.9.21.0
*2015-01-26* - [[Firefox](https://raw.githubusercontent.com/ccd0/4chan-x/1.9.21.0/builds/4chan-X-noupdate.user.js "Firefox version")] [[Chromium](https://raw.githubusercontent.com/ccd0/4chan-x/1.9.21.0/builds/4chan-X-noupdate.crx "Chromium version")]
- WebMs with controls now contract on click, provided the click is not on or near the controls. The contract button and dragging to the left have been removed. If `Autoplay` is disabled, the first click expands the video, the second click plays the video, and the third click contracts it.
- (Zixaphir) Restore downloading by original filename in the gallery.
- (Zixaphir) Embedded content is now shown after and underneath the `(embed)` link.
- Minor bugfixes.
<!-- v1.9.20.x -->
### v1.9.20.8
*2015-01-24* - [[Firefox](https://raw.githubusercontent.com/ccd0/4chan-x/1.9.20.8/builds/4chan-X-noupdate.user.js "Firefox version")] [[Chromium](https://raw.githubusercontent.com/ccd0/4chan-x/1.9.20.8/builds/4chan-X-noupdate.crx "Chromium version")]

View File

@ -1,5 +1,5 @@
/*
* 4chan X - Version 1.9.20.8
* 4chan X - Version 1.9.21.0
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE

Binary file not shown.

View File

@ -1,6 +1,6 @@
// ==UserScript==
// @name 4chan X beta
// @version 1.9.20.8
// @version 1.9.21.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X

View File

@ -1,7 +1,7 @@
// Generated by CoffeeScript
// ==UserScript==
// @name 4chan X beta
// @version 1.9.20.8
// @version 1.9.21.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@ -25,12 +25,12 @@
// ==/UserScript==
/*
* 4chan X - Version 1.9.20.8
* 4chan X - Version 1.9.21.0
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
*
* Appchan X Copyright © 2013-2014 Zixaphir <zixaphirmoxphar@gmail.com>
* Appchan X Copyright © 2013-2015 Zixaphir <zixaphirmoxphar@gmail.com>
* http://zixaphir.github.io/appchan-x/
* 4chan x Copyright © 2009-2011 James Campos <james.r.campos@gmail.com>
* https://github.com/aeosynth/4chan-x
@ -195,7 +195,7 @@
'Werk Tyme': [false, 'Hide all post images when header menu item is checked.'],
'Autoplay': [true, 'Videos begin playing immediately when opened.'],
'Restart when Opened': [true, 'Restart GIFs and WebMs when you hover over or expand them.'],
'Show Controls': [true, 'Show controls on videos expanded inline. Turn this off if you want to contract videos by clicking on them.'],
'Show Controls': [true, 'Show controls on videos expanded inline.'],
'Loop in New Tab': [true, 'Loop videos opened in their own tabs.']
},
'Menu': {
@ -396,7 +396,7 @@
doc = d.documentElement;
g = {
VERSION: '1.9.20.8',
VERSION: '1.9.21.0',
NAMESPACE: '4chan X.',
NAME: '4chan X',
FAQ: 'https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions',
@ -1511,7 +1511,6 @@
this.file.text = file.firstElementChild;
this.file.thumb = $('.fileThumb > [data-md5]', file);
this.file.fullImage = $('.full-image', file);
this.file.videoControls = $('.video-controls', this.file.text);
if (contractThumb) {
ImageExpand.contract(this);
}
@ -3749,8 +3748,6 @@
};
flag = !flagCode ? {
innerHTML: ""
} : false ? {
innerHTML: " <img src=\"//s.4cdn.org/image/country/troll/" + E(flagCode.toLowerCase()) + ".gif\" alt=\"" + E(flagCode) + "\" title=\"" + E(flagName) + "\" class=\"countryFlag\">"
} : {
innerHTML: " <span title=\"" + E(flagName) + "\" class=\"flag flag-" + E(flagCode.toLowerCase()) + "\"></span>"
};
@ -6614,17 +6611,20 @@
mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'application/vnd.adobe.flash.movie', 'application/x-shockwave-flash', 'video/webm'],
init: function() {
var noscript, sc;
if (!Conf['Quick Reply'] || g.VIEW === 'archive') {
if (!Conf['Quick Reply']) {
return;
}
this.db = new DataBoard('yourPosts');
this.posts = [];
if (g.VIEW === 'archive') {
return;
}
$.globalEval('document.documentElement.dataset.jsEnabled = true;');
noscript = Conf['Force Noscript Captcha'] || !doc.dataset.jsEnabled;
this.captcha = Captcha[noscript ? 'noscript' : 'v2'];
if (Conf['QR Shortcut']) {
sc = $.el('a', {
className: "qr-shortcut fa fa-comment-o " + (!Conf['Persistent QR'] ? 'disabled' : ''),
className: 'qr-shortcut fa fa-comment-o disabled',
textContent: 'QR',
title: 'Quick Reply',
href: 'javascript:;'
@ -6635,11 +6635,9 @@
}
if (Conf['Persistent QR'] || !QR.nodes || QR.nodes.el.hidden) {
QR.open();
QR.nodes.com.focus();
return $.rmClass(this, 'disabled');
return QR.nodes.com.focus();
} else {
QR.close();
return $.addClass(this, 'disabled');
return QR.close();
}
});
Header.addShortcut(sc);
@ -6674,12 +6672,8 @@
});
QR.link = link.firstElementChild;
$.on(link.firstChild, 'click', function() {
$.event('CloseMenu');
QR.open();
QR.nodes.com.focus();
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.nodes.com.focus();
});
if (Conf['Bottom QR Link'] && g.VIEW === 'thread') {
linkBot = $.el('div', {
@ -6689,12 +6683,8 @@
innerHTML: "<a href=\"javascript:;\" class=\"qr-link-bottom\">Reply to Thread</a>"
});
$.on(linkBot.firstElementChild, 'click', function() {
$.event('CloseMenu');
QR.open();
QR.nodes.com.focus();
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.nodes.com.focus();
});
$.prepend($('.navLinksBot'), linkBot);
}
@ -6739,17 +6729,21 @@
}
QR.nodes.el.hidden = false;
QR.unhide();
return;
} else {
try {
QR.dialog();
} catch (_error) {
err = _error;
delete QR.nodes;
Main.handleErrors({
message: 'Quick Reply dialog creation crashed.',
error: err
});
return;
}
}
try {
return QR.dialog();
} catch (_error) {
err = _error;
delete QR.nodes;
return Main.handleErrors({
message: 'Quick Reply dialog creation crashed.',
error: err
});
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
},
close: function() {
@ -6763,7 +6757,7 @@
d.activeElement.blur();
$.rmClass(QR.nodes.el, 'dump');
if (Conf['QR Shortcut']) {
$.toggleClass($('.qr-shortcut'), 'disabled');
$.addClass($('.qr-shortcut'), 'disabled');
}
new QR.post(true);
_ref = QR.posts.splice(0, QR.posts.length - 1);
@ -6957,10 +6951,7 @@
com.setSelectionRange(range, range);
com.focus();
QR.selected.save(com);
QR.selected.save(thread);
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.selected.save(thread);
},
characterCount: function() {
var count, counter;
@ -7281,7 +7272,6 @@
nodes.flashTag.dataset["default"] = '4';
$.add(nodes.form, nodes.flashTag);
}
QR.flagsInput();
$.on(nodes.filename.parentNode, 'click keydown', QR.openFileInput);
$.on(nodes.autohide, 'change', QR.toggleHide);
$.on(nodes.close, 'click', QR.close);
@ -7303,7 +7293,7 @@
return QR.selected.nodes.spoiler.click();
});
$.on(nodes.fileInput, 'change', QR.handleFiles);
items = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'flag'];
items = ['thread', 'name', 'email', 'sub', 'com', 'filename'];
i = 0;
save = function() {
return QR.selected.save(this);
@ -7336,43 +7326,6 @@
QR.captcha.setup();
return $.event('QRDialogCreation', null, dialog);
},
flags: function() {
var flag, fn, select, _i, _len, _ref;
select = $.el('select', {
name: 'flag',
className: 'flagSelector'
});
fn = function(val) {
return $.add(select, $.el('option', {
value: val[0],
textContent: val[1]
}));
};
_ref = [['0', 'None'], ['US', 'American'], ['KP', 'Best Korean'], ['BL', 'Black Nationalist'], ['CM', 'Communist'], ['CF', 'Confederate'], ['RE', 'Conservative'], ['EU', 'European'], ['GY', 'Gay'], ['PC', 'Hippie'], ['IL', 'Israeli'], ['DM', 'Liberal'], ['RP', 'Libertarian'], ['MF', 'Muslim'], ['NZ', 'Nazi'], ['OB', 'Obama'], ['PR', 'Pirate'], ['RB', 'Rebel'], ['TP', 'Tea Partier'], ['TX', 'Texan'], ['TR', 'Tree Hugger'], ['WP', 'White Supremacist']];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
flag = _ref[_i];
fn(flag);
}
return select;
},
flagsInput: function() {
var flag, nodes;
nodes = QR.nodes;
if (!nodes) {
return;
}
if (nodes.flag) {
$.rm(nodes.flag);
delete nodes.flag;
}
if (false) {
flag = QR.flags();
flag.dataset.name = 'flag';
flag.dataset["default"] = '0';
nodes.flag = flag;
return $.add(nodes.form, flag);
}
},
submit: function(e) {
var captcha, cb, err, extra, filetag, formData, options, post, textOnly, thread, threadID;
if (e != null) {
@ -7438,7 +7391,6 @@
upfile: post.file,
filetag: filetag,
spoiler: post.spoiler,
flag: post.flag,
textonly: textOnly,
mode: 'regist',
pwd: QR.persona.pwd
@ -8460,8 +8412,7 @@
persona = _arg['QR.persona'];
persona = {
name: post.name,
email: /^sage$/.test(post.email) ? persona.email : post.email,
flag: post.flag
email: /^sage$/.test(post.email) ? persona.email : post.email
};
return $.set('QR.persona', persona);
});
@ -8522,9 +8473,6 @@
_this.name = 'name' in QR.persona.always ? QR.persona.always.name : prev ? prev.name : persona.name;
_this.email = 'email' in QR.persona.always ? QR.persona.always.email : prev && !/^sage$/.test(prev.email) ? prev.email : persona.email;
_this.sub = 'sub' in QR.persona.always ? QR.persona.always.sub : '';
if (QR.nodes.flag) {
_this.flag = prev ? prev.flag : persona.flag;
}
if (QR.selected === _this) {
return _this.load();
}
@ -8567,7 +8515,7 @@
if (this !== QR.selected) {
return;
}
_ref = ['thread', 'name', 'email', 'sub', 'com', 'fileButton', 'filename', 'spoiler', 'flag'];
_ref = ['thread', 'name', 'email', 'sub', 'com', 'fileButton', 'filename', 'spoiler'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
name = _ref[_i];
if (node = QR.nodes[name]) {
@ -8601,7 +8549,7 @@
_Class.prototype.load = function() {
var name, node, _i, _len, _ref;
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'flag'];
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
name = _ref[_i];
if (!(node = QR.nodes[name])) {
@ -8651,7 +8599,7 @@
if (this !== QR.selected) {
return;
}
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'spoiler', 'flag'];
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'spoiler'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
name = _ref[_i];
if (!(node = QR.nodes[name])) {
@ -8826,7 +8774,7 @@
FappeTyme = {
init: function() {
var el, lc, type, _i, _len, _ref, _ref1;
if (!(Conf['Fappe Tyme'] || Conf['Werk Tyme']) || ((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || g.BOARD === 'f') {
if (!((Conf['Fappe Tyme'] || Conf['Werk Tyme']) && ((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
this.nodes = {};
@ -8898,7 +8846,7 @@
Gallery = {
init: function() {
var el, _ref;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || g.BOARD === 'f' || !Conf['Gallery']) {
if (!(this.enabled = Conf['Gallery'] && ((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
this.delay = Conf['Slide Delay'];
@ -8970,6 +8918,7 @@
cb = Gallery.cb;
$.on(nodes.frame, 'click', cb.blank);
$.on(nodes.next, 'click', cb.click);
$.on(nodes.name, 'click', ImageCommon.download);
$.on($('.gal-prev', dialog), 'click', cb.prev);
$.on($('.gal-next', dialog), 'click', cb.next);
$.on($('.gal-start', dialog), 'click', cb.start);
@ -9168,7 +9117,7 @@
case 'Right':
return Gallery.cb.next;
case 'Enter':
return Gallery.cb.enterKey;
return Gallery.cb.advance;
case 'Left':
case '':
return Gallery.cb.prev;
@ -9204,16 +9153,20 @@
next: function() {
return Gallery.cb.open.call(Gallery.images[+Gallery.nodes.current.dataset.id + 1] || Gallery.images[0]);
},
enterKey: function() {
click: function(e) {
if (ImageCommon.onControls(e)) {
return;
}
e.preventDefault();
return Gallery.cb.advance();
},
advance: function() {
if (Gallery.nodes.current.paused) {
return Gallery.nodes.current.play();
} else {
return Gallery.cb.next();
}
},
click: function() {
return Gallery.cb[Gallery.nodes.current.controls ? 'stop' : 'enterKey']();
},
toggle: function() {
return (Gallery.nodes ? Gallery.cb.close : Gallery.build)();
},
@ -9285,8 +9238,8 @@
},
menu: {
init: function() {
var el, _ref;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || !Conf['Gallery']) {
var el;
if (!Gallery.enabled) {
return;
}
el = $.el('span', {
@ -9440,13 +9393,32 @@
});
};
return $.on(video, 'mouseover', handler);
},
onControls: function(e) {
return e.target.controls && e.target.getBoundingClientRect().bottom - e.clientY < 35;
},
download: function(e) {
if (this.protocol === 'blob:') {
return true;
}
e.preventDefault();
return CrossOrigin.file(this.href, (function(_this) {
return function(blob) {
if (blob) {
_this.href = URL.createObjectURL(blob);
return _this.click();
} else {
return new Notice('error', "Could not download " + _this.href, 30);
}
};
})(this));
}
};
ImageExpand = {
init: function() {
var _ref;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || !Conf['Image Expansion']) {
if (!(this.enabled = Conf['Image Expansion'] && ((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
this.EAI = $.el('a', {
@ -9458,12 +9430,6 @@
$.on(this.EAI, 'click', this.cb.toggleAll);
Header.addShortcut(this.EAI, 3);
$.on(d, 'scroll visibilitychange', this.cb.playVideos);
this.videoControls = $.el('span', {
className: 'video-controls'
});
$.extend(this.videoControls, {
innerHTML: " <a href=\"javascript:;\" title=\"You can also contract the video by dragging it to the left.\">contract</a>"
});
return Post.callbacks.push({
name: 'Image Expansion',
cb: this.node
@ -9480,7 +9446,6 @@
ImageExpand.contract(this);
return ImageExpand.expand(this);
} else if (this.file.isExpanded && this.file.isVideo) {
ImageExpand.setupVideoCB(this);
return ImageExpand.setupVideo(this, !((_ref = this.origin.file.fullImage) != null ? _ref.paused : void 0) || this.origin.file.wasPlaying, this.file.fullImage.controls);
}
} else if (ImageExpand.on && !this.isHidden && !this.isFetchedQuote && (Conf['Expand spoilers'] || !this.file.isSpoiler) && (Conf['Expand videos'] || !this.file.isVideo)) {
@ -9489,17 +9454,21 @@
},
cb: {
toggle: function(e) {
var file, post;
var file, post, _ref;
if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) {
return;
}
post = Get.postFromNode(this);
file = post.file;
if (file.isExpanded && file.isVideo && file.fullImage.controls) {
if (file.isExpanded && ImageCommon.onControls(e)) {
return;
}
e.preventDefault();
return ImageExpand.toggle(post);
if ((_ref = file.fullImage) != null ? _ref.paused : void 0) {
return file.fullImage.play();
} else {
return ImageExpand.toggle(post);
}
},
toggleAll: function() {
var func, toggle;
@ -9581,7 +9550,7 @@
}
},
contract: function(post) {
var bottom, cb, el, eventName, file, oldHeight, scrollY, top, x, _i, _len, _ref, _ref1;
var bottom, el, file, oldHeight, scrollY, top, x, _i, _len, _ref;
file = post.file;
if (el = file.fullImage) {
top = Header.getTopOf(el);
@ -9591,12 +9560,9 @@
}
$.rmClass(post.nodes.root, 'expanded-image');
$.rmClass(file.thumb, 'expanding');
if (file.videoControls) {
$.rm(file.videoControls);
}
file.thumb.parentNode.href = file.URL;
file.thumb.parentNode.target = '_blank';
_ref = ['isExpanding', 'isExpanded', 'videoControls', 'wasPlaying', 'scrollIntoView'];
_ref = ['isExpanding', 'isExpanded', 'wasPlaying', 'scrollIntoView'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
x = _ref[_i];
delete file[x];
@ -9618,11 +9584,6 @@
ImageCommon.pushCache(el);
if (file.isVideo) {
el.pause();
_ref1 = ImageExpand.videoCB;
for (eventName in _ref1) {
cb = _ref1[eventName];
$.off(el, eventName, cb);
}
}
if (Conf['Restart when Opened']) {
ImageCommon.rewind(file.thumb);
@ -9666,14 +9627,9 @@
el.className = 'full-image';
$.after(thumb, el);
if (isVideo) {
if (Conf['Show Controls'] && !file.videoControls) {
file.videoControls = ImageExpand.videoControls.cloneNode(true);
$.add(file.text, file.videoControls);
}
thumb.parentNode.removeAttribute('href');
thumb.parentNode.removeAttribute('target');
el.loop = true;
ImageExpand.setupVideoCB(post);
}
if (!isVideo) {
return $.asap((function() {
@ -9741,49 +9697,6 @@
return ImageCommon.addControls(fullImage);
}
},
videoCB: (function() {
var mousedown;
mousedown = false;
return {
mouseover: function() {
return mousedown = false;
},
mousedown: function(e) {
if (e.button === 0) {
return mousedown = true;
}
},
mouseup: function(e) {
if (e.button === 0) {
return mousedown = false;
}
},
mouseout: function(e) {
if (mousedown && e.clientX <= this.getBoundingClientRect().left) {
return ImageExpand.toggle(Get.postFromNode(this));
}
},
click: function(e) {
if (this.paused && !this.controls) {
this.play();
return e.stopPropagation();
}
}
};
})(),
setupVideoCB: function(post) {
var cb, eventName, _ref;
_ref = ImageExpand.videoCB;
for (eventName in _ref) {
cb = _ref[eventName];
$.on(post.file.fullImage, eventName, cb);
}
if (post.file.videoControls) {
return $.on(post.file.videoControls.firstElementChild, 'click', function() {
return ImageExpand.toggle(post);
});
}
},
error: function() {
var post;
post = Get.postFromNode(this);
@ -9809,8 +9722,8 @@
},
menu: {
init: function() {
var conf, createSubEntry, el, name, subEntries, _ref, _ref1;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || !Conf['Image Expansion']) {
var conf, createSubEntry, el, name, subEntries, _ref;
if (!ImageExpand.enabled) {
return;
}
el = $.el('span', {
@ -9819,9 +9732,9 @@
});
createSubEntry = ImageExpand.menu.createSubEntry;
subEntries = [];
_ref1 = Config.imageExpansion;
for (name in _ref1) {
conf = _ref1[name];
_ref = Config.imageExpansion;
for (name in _ref) {
conf = _ref[name];
subEntries.push(createSubEntry(name, conf[1]));
}
return Header.menu.addEntry({
@ -9967,7 +9880,7 @@
ImageLoader = {
init: function() {
var prefetch, _ref;
if ((_ref = g.VIEW) !== 'index' && _ref !== 'thread') {
if (!(((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
if (!(Conf['Image Prefetching'] || Conf['Replace JPG'] || Conf['Replace PNG'] || Conf['Replace GIF'] || Conf['Replace WEBM'])) {
@ -10434,23 +10347,20 @@
return;
}
if ($.hasClass(this, "embedded")) {
if (!$.hasClass(this.previousElementSibling, 'linkify')) {
$.rm(this.previousElementSibling);
}
this.previousElementSibling.hidden = false;
$.rm(this.nextElementSibling);
this.textContent = '(embed)';
} else {
this.previousElementSibling.hidden = true;
$.before(this, Embedding.cb.embed(this));
$.after(this, Embedding.cb.embed(this));
this.textContent = '(unembed)';
}
return $.toggleClass(this, 'embedded');
},
embed: function(a) {
var el, type;
el = (type = Embedding.types[a.dataset.key]).el(a);
el.style.cssText = type.style != null ? type.style : "border: 0; width: 640px; height: 390px";
return el;
var container, el, type;
container = $.el('div');
$.add(container, el = (type = Embedding.types[a.dataset.key]).el(a));
el.style.cssText = type.style != null ? type.style : "border:0;width:640px;height:390px";
return container;
},
title: function(req, data) {
var key, link, link2, options, post, post2, service, status, text, uid, _i, _j, _len, _len1, _ref, _ref1;
@ -11226,22 +11136,7 @@
className: 'download-link',
textContent: 'Download file'
});
$.on(a, 'click', function(e) {
if (this.protocol === 'blob:') {
return true;
}
e.preventDefault();
return CrossOrigin.file(this.href, (function(_this) {
return function(blob) {
if (blob) {
_this.href = URL.createObjectURL(blob);
return _this.click();
} else {
return new Notice('error', "Could not download " + _this.href, 30);
}
};
})(this));
});
$.on(a, 'click', ImageCommon.download);
return Menu.menu.addEntry({
el: a,
order: 100,
@ -14101,7 +13996,7 @@
return Conf[hotkey] = key;
},
keydown: function(e) {
var form, key, notification, notifications, op, searchInput, target, thread, threadRoot, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6;
var form, key, notification, notifications, op, searchInput, target, thread, threadRoot, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
if (!(key = Keybinds.keyCode(e))) {
return;
}
@ -14128,10 +14023,13 @@
Header.toggleBarVisibility();
break;
case Conf['Open empty QR']:
if (!QR.postingIsEnabled) {
return;
}
Keybinds.qr();
break;
case Conf['Open QR']:
if (!threadRoot) {
if (!(QR.postingIsEnabled && threadRoot)) {
return;
}
Keybinds.qr(threadRoot);
@ -14222,31 +14120,31 @@
ThreadWatcher.toggle(thread);
break;
case Conf['Expand image']:
if (!threadRoot) {
if (!(ImageExpand.enabled && threadRoot)) {
return;
}
Keybinds.img(threadRoot);
break;
case Conf['Expand images']:
if (!threadRoot) {
if (!(ImageExpand.enabled && threadRoot)) {
return;
}
Keybinds.img(threadRoot, true);
break;
case Conf['Open Gallery']:
if ((_ref2 = g.VIEW) !== 'index' && _ref2 !== 'thread') {
if (!Gallery.enabled) {
return;
}
Gallery.cb.toggle();
break;
case Conf['fappeTyme']:
if (!Conf['Fappe Tyme'] || ((_ref3 = g.VIEW) !== 'index' && _ref3 !== 'thread') || g.BOARD === 'f') {
if (!(Conf['Fappe Tyme'] && ((_ref2 = g.VIEW) === 'index' || _ref2 === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
FappeTyme.toggle('fappe');
break;
case Conf['werkTyme']:
if (!Conf['Werk Tyme'] || ((_ref4 = g.VIEW) !== 'index' && _ref4 !== 'thread') || g.BOARD === 'f') {
if (!(Conf['Werk Tyme'] && ((_ref3 = g.VIEW) === 'index' || _ref3 === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
FappeTyme.toggle('werk');
@ -14266,7 +14164,7 @@
return;
}
if (Conf['JSON Navigation']) {
if ((_ref5 = Conf['Index Mode']) !== 'paged' && _ref5 !== 'infinite') {
if ((_ref4 = Conf['Index Mode']) !== 'paged' && _ref4 !== 'infinite') {
return;
}
$('.next button', Index.pagelist).click();
@ -14281,7 +14179,7 @@
return;
}
if (Conf['JSON Navigation']) {
if ((_ref6 = Conf['Index Mode']) !== 'paged' && _ref6 !== 'infinite') {
if ((_ref5 = Conf['Index Mode']) !== 'paged' && _ref5 !== 'infinite') {
return;
}
$('.prev button', Index.pagelist).click();
@ -14425,17 +14323,11 @@
return key;
},
qr: function(thread) {
if (!(Conf['Quick Reply'] && QR.postingIsEnabled)) {
return;
}
QR.open();
if (thread != null) {
QR.quote.call($('input', $('.post.highlight', thread) || thread));
}
QR.nodes.com.focus();
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.nodes.com.focus();
},
tags: function(tag, ta) {
var range, selEnd, selStart, supported, value;

Binary file not shown.

View File

@ -1,7 +1,7 @@
// Generated by CoffeeScript
// ==UserScript==
// @name 4chan X
// @version 1.9.20.8
// @version 1.9.21.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@ -24,12 +24,12 @@
// ==/UserScript==
/*
* 4chan X - Version 1.9.20.8
* 4chan X - Version 1.9.21.0
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
*
* Appchan X Copyright © 2013-2014 Zixaphir <zixaphirmoxphar@gmail.com>
* Appchan X Copyright © 2013-2015 Zixaphir <zixaphirmoxphar@gmail.com>
* http://zixaphir.github.io/appchan-x/
* 4chan x Copyright © 2009-2011 James Campos <james.r.campos@gmail.com>
* https://github.com/aeosynth/4chan-x
@ -194,7 +194,7 @@
'Werk Tyme': [false, 'Hide all post images when header menu item is checked.'],
'Autoplay': [true, 'Videos begin playing immediately when opened.'],
'Restart when Opened': [true, 'Restart GIFs and WebMs when you hover over or expand them.'],
'Show Controls': [true, 'Show controls on videos expanded inline. Turn this off if you want to contract videos by clicking on them.'],
'Show Controls': [true, 'Show controls on videos expanded inline.'],
'Loop in New Tab': [true, 'Loop videos opened in their own tabs.']
},
'Menu': {
@ -395,7 +395,7 @@
doc = d.documentElement;
g = {
VERSION: '1.9.20.8',
VERSION: '1.9.21.0',
NAMESPACE: '4chan X.',
NAME: '4chan X',
FAQ: 'https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions',
@ -1510,7 +1510,6 @@
this.file.text = file.firstElementChild;
this.file.thumb = $('.fileThumb > [data-md5]', file);
this.file.fullImage = $('.full-image', file);
this.file.videoControls = $('.video-controls', this.file.text);
if (contractThumb) {
ImageExpand.contract(this);
}
@ -3748,8 +3747,6 @@
};
flag = !flagCode ? {
innerHTML: ""
} : false ? {
innerHTML: " <img src=\"//s.4cdn.org/image/country/troll/" + E(flagCode.toLowerCase()) + ".gif\" alt=\"" + E(flagCode) + "\" title=\"" + E(flagName) + "\" class=\"countryFlag\">"
} : {
innerHTML: " <span title=\"" + E(flagName) + "\" class=\"flag flag-" + E(flagCode.toLowerCase()) + "\"></span>"
};
@ -6613,17 +6610,20 @@
mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'application/vnd.adobe.flash.movie', 'application/x-shockwave-flash', 'video/webm'],
init: function() {
var noscript, sc;
if (!Conf['Quick Reply'] || g.VIEW === 'archive') {
if (!Conf['Quick Reply']) {
return;
}
this.db = new DataBoard('yourPosts');
this.posts = [];
if (g.VIEW === 'archive') {
return;
}
$.globalEval('document.documentElement.dataset.jsEnabled = true;');
noscript = Conf['Force Noscript Captcha'] || !doc.dataset.jsEnabled;
this.captcha = Captcha[noscript ? 'noscript' : 'v2'];
if (Conf['QR Shortcut']) {
sc = $.el('a', {
className: "qr-shortcut fa fa-comment-o " + (!Conf['Persistent QR'] ? 'disabled' : ''),
className: 'qr-shortcut fa fa-comment-o disabled',
textContent: 'QR',
title: 'Quick Reply',
href: 'javascript:;'
@ -6634,11 +6634,9 @@
}
if (Conf['Persistent QR'] || !QR.nodes || QR.nodes.el.hidden) {
QR.open();
QR.nodes.com.focus();
return $.rmClass(this, 'disabled');
return QR.nodes.com.focus();
} else {
QR.close();
return $.addClass(this, 'disabled');
return QR.close();
}
});
Header.addShortcut(sc);
@ -6673,12 +6671,8 @@
});
QR.link = link.firstElementChild;
$.on(link.firstChild, 'click', function() {
$.event('CloseMenu');
QR.open();
QR.nodes.com.focus();
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.nodes.com.focus();
});
if (Conf['Bottom QR Link'] && g.VIEW === 'thread') {
linkBot = $.el('div', {
@ -6688,12 +6682,8 @@
innerHTML: "<a href=\"javascript:;\" class=\"qr-link-bottom\">Reply to Thread</a>"
});
$.on(linkBot.firstElementChild, 'click', function() {
$.event('CloseMenu');
QR.open();
QR.nodes.com.focus();
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.nodes.com.focus();
});
$.prepend($('.navLinksBot'), linkBot);
}
@ -6738,17 +6728,21 @@
}
QR.nodes.el.hidden = false;
QR.unhide();
return;
} else {
try {
QR.dialog();
} catch (_error) {
err = _error;
delete QR.nodes;
Main.handleErrors({
message: 'Quick Reply dialog creation crashed.',
error: err
});
return;
}
}
try {
return QR.dialog();
} catch (_error) {
err = _error;
delete QR.nodes;
return Main.handleErrors({
message: 'Quick Reply dialog creation crashed.',
error: err
});
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
},
close: function() {
@ -6762,7 +6756,7 @@
d.activeElement.blur();
$.rmClass(QR.nodes.el, 'dump');
if (Conf['QR Shortcut']) {
$.toggleClass($('.qr-shortcut'), 'disabled');
$.addClass($('.qr-shortcut'), 'disabled');
}
new QR.post(true);
_ref = QR.posts.splice(0, QR.posts.length - 1);
@ -6956,10 +6950,7 @@
com.setSelectionRange(range, range);
com.focus();
QR.selected.save(com);
QR.selected.save(thread);
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.selected.save(thread);
},
characterCount: function() {
var count, counter;
@ -7280,7 +7271,6 @@
nodes.flashTag.dataset["default"] = '4';
$.add(nodes.form, nodes.flashTag);
}
QR.flagsInput();
$.on(nodes.filename.parentNode, 'click keydown', QR.openFileInput);
$.on(nodes.autohide, 'change', QR.toggleHide);
$.on(nodes.close, 'click', QR.close);
@ -7302,7 +7292,7 @@
return QR.selected.nodes.spoiler.click();
});
$.on(nodes.fileInput, 'change', QR.handleFiles);
items = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'flag'];
items = ['thread', 'name', 'email', 'sub', 'com', 'filename'];
i = 0;
save = function() {
return QR.selected.save(this);
@ -7335,43 +7325,6 @@
QR.captcha.setup();
return $.event('QRDialogCreation', null, dialog);
},
flags: function() {
var flag, fn, select, _i, _len, _ref;
select = $.el('select', {
name: 'flag',
className: 'flagSelector'
});
fn = function(val) {
return $.add(select, $.el('option', {
value: val[0],
textContent: val[1]
}));
};
_ref = [['0', 'None'], ['US', 'American'], ['KP', 'Best Korean'], ['BL', 'Black Nationalist'], ['CM', 'Communist'], ['CF', 'Confederate'], ['RE', 'Conservative'], ['EU', 'European'], ['GY', 'Gay'], ['PC', 'Hippie'], ['IL', 'Israeli'], ['DM', 'Liberal'], ['RP', 'Libertarian'], ['MF', 'Muslim'], ['NZ', 'Nazi'], ['OB', 'Obama'], ['PR', 'Pirate'], ['RB', 'Rebel'], ['TP', 'Tea Partier'], ['TX', 'Texan'], ['TR', 'Tree Hugger'], ['WP', 'White Supremacist']];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
flag = _ref[_i];
fn(flag);
}
return select;
},
flagsInput: function() {
var flag, nodes;
nodes = QR.nodes;
if (!nodes) {
return;
}
if (nodes.flag) {
$.rm(nodes.flag);
delete nodes.flag;
}
if (false) {
flag = QR.flags();
flag.dataset.name = 'flag';
flag.dataset["default"] = '0';
nodes.flag = flag;
return $.add(nodes.form, flag);
}
},
submit: function(e) {
var captcha, cb, err, extra, filetag, formData, options, post, textOnly, thread, threadID;
if (e != null) {
@ -7437,7 +7390,6 @@
upfile: post.file,
filetag: filetag,
spoiler: post.spoiler,
flag: post.flag,
textonly: textOnly,
mode: 'regist',
pwd: QR.persona.pwd
@ -8459,8 +8411,7 @@
persona = _arg['QR.persona'];
persona = {
name: post.name,
email: /^sage$/.test(post.email) ? persona.email : post.email,
flag: post.flag
email: /^sage$/.test(post.email) ? persona.email : post.email
};
return $.set('QR.persona', persona);
});
@ -8521,9 +8472,6 @@
_this.name = 'name' in QR.persona.always ? QR.persona.always.name : prev ? prev.name : persona.name;
_this.email = 'email' in QR.persona.always ? QR.persona.always.email : prev && !/^sage$/.test(prev.email) ? prev.email : persona.email;
_this.sub = 'sub' in QR.persona.always ? QR.persona.always.sub : '';
if (QR.nodes.flag) {
_this.flag = prev ? prev.flag : persona.flag;
}
if (QR.selected === _this) {
return _this.load();
}
@ -8566,7 +8514,7 @@
if (this !== QR.selected) {
return;
}
_ref = ['thread', 'name', 'email', 'sub', 'com', 'fileButton', 'filename', 'spoiler', 'flag'];
_ref = ['thread', 'name', 'email', 'sub', 'com', 'fileButton', 'filename', 'spoiler'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
name = _ref[_i];
if (node = QR.nodes[name]) {
@ -8600,7 +8548,7 @@
_Class.prototype.load = function() {
var name, node, _i, _len, _ref;
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'flag'];
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
name = _ref[_i];
if (!(node = QR.nodes[name])) {
@ -8650,7 +8598,7 @@
if (this !== QR.selected) {
return;
}
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'spoiler', 'flag'];
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'spoiler'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
name = _ref[_i];
if (!(node = QR.nodes[name])) {
@ -8825,7 +8773,7 @@
FappeTyme = {
init: function() {
var el, lc, type, _i, _len, _ref, _ref1;
if (!(Conf['Fappe Tyme'] || Conf['Werk Tyme']) || ((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || g.BOARD === 'f') {
if (!((Conf['Fappe Tyme'] || Conf['Werk Tyme']) && ((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
this.nodes = {};
@ -8897,7 +8845,7 @@
Gallery = {
init: function() {
var el, _ref;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || g.BOARD === 'f' || !Conf['Gallery']) {
if (!(this.enabled = Conf['Gallery'] && ((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
this.delay = Conf['Slide Delay'];
@ -8969,6 +8917,7 @@
cb = Gallery.cb;
$.on(nodes.frame, 'click', cb.blank);
$.on(nodes.next, 'click', cb.click);
$.on(nodes.name, 'click', ImageCommon.download);
$.on($('.gal-prev', dialog), 'click', cb.prev);
$.on($('.gal-next', dialog), 'click', cb.next);
$.on($('.gal-start', dialog), 'click', cb.start);
@ -9167,7 +9116,7 @@
case 'Right':
return Gallery.cb.next;
case 'Enter':
return Gallery.cb.enterKey;
return Gallery.cb.advance;
case 'Left':
case '':
return Gallery.cb.prev;
@ -9203,16 +9152,20 @@
next: function() {
return Gallery.cb.open.call(Gallery.images[+Gallery.nodes.current.dataset.id + 1] || Gallery.images[0]);
},
enterKey: function() {
click: function(e) {
if (ImageCommon.onControls(e)) {
return;
}
e.preventDefault();
return Gallery.cb.advance();
},
advance: function() {
if (Gallery.nodes.current.paused) {
return Gallery.nodes.current.play();
} else {
return Gallery.cb.next();
}
},
click: function() {
return Gallery.cb[Gallery.nodes.current.controls ? 'stop' : 'enterKey']();
},
toggle: function() {
return (Gallery.nodes ? Gallery.cb.close : Gallery.build)();
},
@ -9284,8 +9237,8 @@
},
menu: {
init: function() {
var el, _ref;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || !Conf['Gallery']) {
var el;
if (!Gallery.enabled) {
return;
}
el = $.el('span', {
@ -9439,13 +9392,32 @@
});
};
return $.on(video, 'mouseover', handler);
},
onControls: function(e) {
return e.target.controls && e.target.getBoundingClientRect().bottom - e.clientY < 35;
},
download: function(e) {
if (this.protocol === 'blob:') {
return true;
}
e.preventDefault();
return CrossOrigin.file(this.href, (function(_this) {
return function(blob) {
if (blob) {
_this.href = URL.createObjectURL(blob);
return _this.click();
} else {
return new Notice('error', "Could not download " + _this.href, 30);
}
};
})(this));
}
};
ImageExpand = {
init: function() {
var _ref;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || !Conf['Image Expansion']) {
if (!(this.enabled = Conf['Image Expansion'] && ((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
this.EAI = $.el('a', {
@ -9457,12 +9429,6 @@
$.on(this.EAI, 'click', this.cb.toggleAll);
Header.addShortcut(this.EAI, 3);
$.on(d, 'scroll visibilitychange', this.cb.playVideos);
this.videoControls = $.el('span', {
className: 'video-controls'
});
$.extend(this.videoControls, {
innerHTML: " <a href=\"javascript:;\" title=\"You can also contract the video by dragging it to the left.\">contract</a>"
});
return Post.callbacks.push({
name: 'Image Expansion',
cb: this.node
@ -9479,7 +9445,6 @@
ImageExpand.contract(this);
return ImageExpand.expand(this);
} else if (this.file.isExpanded && this.file.isVideo) {
ImageExpand.setupVideoCB(this);
return ImageExpand.setupVideo(this, !((_ref = this.origin.file.fullImage) != null ? _ref.paused : void 0) || this.origin.file.wasPlaying, this.file.fullImage.controls);
}
} else if (ImageExpand.on && !this.isHidden && !this.isFetchedQuote && (Conf['Expand spoilers'] || !this.file.isSpoiler) && (Conf['Expand videos'] || !this.file.isVideo)) {
@ -9488,17 +9453,21 @@
},
cb: {
toggle: function(e) {
var file, post;
var file, post, _ref;
if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) {
return;
}
post = Get.postFromNode(this);
file = post.file;
if (file.isExpanded && file.isVideo && file.fullImage.controls) {
if (file.isExpanded && ImageCommon.onControls(e)) {
return;
}
e.preventDefault();
return ImageExpand.toggle(post);
if ((_ref = file.fullImage) != null ? _ref.paused : void 0) {
return file.fullImage.play();
} else {
return ImageExpand.toggle(post);
}
},
toggleAll: function() {
var func, toggle;
@ -9580,7 +9549,7 @@
}
},
contract: function(post) {
var bottom, cb, el, eventName, file, oldHeight, scrollY, top, x, _i, _len, _ref, _ref1;
var bottom, el, file, oldHeight, scrollY, top, x, _i, _len, _ref;
file = post.file;
if (el = file.fullImage) {
top = Header.getTopOf(el);
@ -9590,12 +9559,9 @@
}
$.rmClass(post.nodes.root, 'expanded-image');
$.rmClass(file.thumb, 'expanding');
if (file.videoControls) {
$.rm(file.videoControls);
}
file.thumb.parentNode.href = file.URL;
file.thumb.parentNode.target = '_blank';
_ref = ['isExpanding', 'isExpanded', 'videoControls', 'wasPlaying', 'scrollIntoView'];
_ref = ['isExpanding', 'isExpanded', 'wasPlaying', 'scrollIntoView'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
x = _ref[_i];
delete file[x];
@ -9617,11 +9583,6 @@
ImageCommon.pushCache(el);
if (file.isVideo) {
el.pause();
_ref1 = ImageExpand.videoCB;
for (eventName in _ref1) {
cb = _ref1[eventName];
$.off(el, eventName, cb);
}
}
if (Conf['Restart when Opened']) {
ImageCommon.rewind(file.thumb);
@ -9665,14 +9626,9 @@
el.className = 'full-image';
$.after(thumb, el);
if (isVideo) {
if (Conf['Show Controls'] && !file.videoControls) {
file.videoControls = ImageExpand.videoControls.cloneNode(true);
$.add(file.text, file.videoControls);
}
thumb.parentNode.removeAttribute('href');
thumb.parentNode.removeAttribute('target');
el.loop = true;
ImageExpand.setupVideoCB(post);
}
if (!isVideo) {
return $.asap((function() {
@ -9740,49 +9696,6 @@
return ImageCommon.addControls(fullImage);
}
},
videoCB: (function() {
var mousedown;
mousedown = false;
return {
mouseover: function() {
return mousedown = false;
},
mousedown: function(e) {
if (e.button === 0) {
return mousedown = true;
}
},
mouseup: function(e) {
if (e.button === 0) {
return mousedown = false;
}
},
mouseout: function(e) {
if (mousedown && e.clientX <= this.getBoundingClientRect().left) {
return ImageExpand.toggle(Get.postFromNode(this));
}
},
click: function(e) {
if (this.paused && !this.controls) {
this.play();
return e.stopPropagation();
}
}
};
})(),
setupVideoCB: function(post) {
var cb, eventName, _ref;
_ref = ImageExpand.videoCB;
for (eventName in _ref) {
cb = _ref[eventName];
$.on(post.file.fullImage, eventName, cb);
}
if (post.file.videoControls) {
return $.on(post.file.videoControls.firstElementChild, 'click', function() {
return ImageExpand.toggle(post);
});
}
},
error: function() {
var post;
post = Get.postFromNode(this);
@ -9808,8 +9721,8 @@
},
menu: {
init: function() {
var conf, createSubEntry, el, name, subEntries, _ref, _ref1;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || !Conf['Image Expansion']) {
var conf, createSubEntry, el, name, subEntries, _ref;
if (!ImageExpand.enabled) {
return;
}
el = $.el('span', {
@ -9818,9 +9731,9 @@
});
createSubEntry = ImageExpand.menu.createSubEntry;
subEntries = [];
_ref1 = Config.imageExpansion;
for (name in _ref1) {
conf = _ref1[name];
_ref = Config.imageExpansion;
for (name in _ref) {
conf = _ref[name];
subEntries.push(createSubEntry(name, conf[1]));
}
return Header.menu.addEntry({
@ -9966,7 +9879,7 @@
ImageLoader = {
init: function() {
var prefetch, _ref;
if ((_ref = g.VIEW) !== 'index' && _ref !== 'thread') {
if (!(((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
if (!(Conf['Image Prefetching'] || Conf['Replace JPG'] || Conf['Replace PNG'] || Conf['Replace GIF'] || Conf['Replace WEBM'])) {
@ -10433,23 +10346,20 @@
return;
}
if ($.hasClass(this, "embedded")) {
if (!$.hasClass(this.previousElementSibling, 'linkify')) {
$.rm(this.previousElementSibling);
}
this.previousElementSibling.hidden = false;
$.rm(this.nextElementSibling);
this.textContent = '(embed)';
} else {
this.previousElementSibling.hidden = true;
$.before(this, Embedding.cb.embed(this));
$.after(this, Embedding.cb.embed(this));
this.textContent = '(unembed)';
}
return $.toggleClass(this, 'embedded');
},
embed: function(a) {
var el, type;
el = (type = Embedding.types[a.dataset.key]).el(a);
el.style.cssText = type.style != null ? type.style : "border: 0; width: 640px; height: 390px";
return el;
var container, el, type;
container = $.el('div');
$.add(container, el = (type = Embedding.types[a.dataset.key]).el(a));
el.style.cssText = type.style != null ? type.style : "border:0;width:640px;height:390px";
return container;
},
title: function(req, data) {
var key, link, link2, options, post, post2, service, status, text, uid, _i, _j, _len, _len1, _ref, _ref1;
@ -11225,22 +11135,7 @@
className: 'download-link',
textContent: 'Download file'
});
$.on(a, 'click', function(e) {
if (this.protocol === 'blob:') {
return true;
}
e.preventDefault();
return CrossOrigin.file(this.href, (function(_this) {
return function(blob) {
if (blob) {
_this.href = URL.createObjectURL(blob);
return _this.click();
} else {
return new Notice('error', "Could not download " + _this.href, 30);
}
};
})(this));
});
$.on(a, 'click', ImageCommon.download);
return Menu.menu.addEntry({
el: a,
order: 100,
@ -14100,7 +13995,7 @@
return Conf[hotkey] = key;
},
keydown: function(e) {
var form, key, notification, notifications, op, searchInput, target, thread, threadRoot, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6;
var form, key, notification, notifications, op, searchInput, target, thread, threadRoot, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
if (!(key = Keybinds.keyCode(e))) {
return;
}
@ -14127,10 +14022,13 @@
Header.toggleBarVisibility();
break;
case Conf['Open empty QR']:
if (!QR.postingIsEnabled) {
return;
}
Keybinds.qr();
break;
case Conf['Open QR']:
if (!threadRoot) {
if (!(QR.postingIsEnabled && threadRoot)) {
return;
}
Keybinds.qr(threadRoot);
@ -14221,31 +14119,31 @@
ThreadWatcher.toggle(thread);
break;
case Conf['Expand image']:
if (!threadRoot) {
if (!(ImageExpand.enabled && threadRoot)) {
return;
}
Keybinds.img(threadRoot);
break;
case Conf['Expand images']:
if (!threadRoot) {
if (!(ImageExpand.enabled && threadRoot)) {
return;
}
Keybinds.img(threadRoot, true);
break;
case Conf['Open Gallery']:
if ((_ref2 = g.VIEW) !== 'index' && _ref2 !== 'thread') {
if (!Gallery.enabled) {
return;
}
Gallery.cb.toggle();
break;
case Conf['fappeTyme']:
if (!Conf['Fappe Tyme'] || ((_ref3 = g.VIEW) !== 'index' && _ref3 !== 'thread') || g.BOARD === 'f') {
if (!(Conf['Fappe Tyme'] && ((_ref2 = g.VIEW) === 'index' || _ref2 === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
FappeTyme.toggle('fappe');
break;
case Conf['werkTyme']:
if (!Conf['Werk Tyme'] || ((_ref4 = g.VIEW) !== 'index' && _ref4 !== 'thread') || g.BOARD === 'f') {
if (!(Conf['Werk Tyme'] && ((_ref3 = g.VIEW) === 'index' || _ref3 === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
FappeTyme.toggle('werk');
@ -14265,7 +14163,7 @@
return;
}
if (Conf['JSON Navigation']) {
if ((_ref5 = Conf['Index Mode']) !== 'paged' && _ref5 !== 'infinite') {
if ((_ref4 = Conf['Index Mode']) !== 'paged' && _ref4 !== 'infinite') {
return;
}
$('.next button', Index.pagelist).click();
@ -14280,7 +14178,7 @@
return;
}
if (Conf['JSON Navigation']) {
if ((_ref6 = Conf['Index Mode']) !== 'paged' && _ref6 !== 'infinite') {
if ((_ref5 = Conf['Index Mode']) !== 'paged' && _ref5 !== 'infinite') {
return;
}
$('.prev button', Index.pagelist).click();
@ -14424,17 +14322,11 @@
return key;
},
qr: function(thread) {
if (!(Conf['Quick Reply'] && QR.postingIsEnabled)) {
return;
}
QR.open();
if (thread != null) {
QR.quote.call($('input', $('.post.highlight', thread) || thread));
}
QR.nodes.com.focus();
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.nodes.com.focus();
},
tags: function(tag, ta) {
var range, selEnd, selStart, supported, value;

Binary file not shown.

View File

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

View File

@ -1,7 +1,7 @@
// Generated by CoffeeScript
// ==UserScript==
// @name 4chan X
// @version 1.9.20.8
// @version 1.9.21.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@ -25,12 +25,12 @@
// ==/UserScript==
/*
* 4chan X - Version 1.9.20.8
* 4chan X - Version 1.9.21.0
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
*
* Appchan X Copyright © 2013-2014 Zixaphir <zixaphirmoxphar@gmail.com>
* Appchan X Copyright © 2013-2015 Zixaphir <zixaphirmoxphar@gmail.com>
* http://zixaphir.github.io/appchan-x/
* 4chan x Copyright © 2009-2011 James Campos <james.r.campos@gmail.com>
* https://github.com/aeosynth/4chan-x
@ -195,7 +195,7 @@
'Werk Tyme': [false, 'Hide all post images when header menu item is checked.'],
'Autoplay': [true, 'Videos begin playing immediately when opened.'],
'Restart when Opened': [true, 'Restart GIFs and WebMs when you hover over or expand them.'],
'Show Controls': [true, 'Show controls on videos expanded inline. Turn this off if you want to contract videos by clicking on them.'],
'Show Controls': [true, 'Show controls on videos expanded inline.'],
'Loop in New Tab': [true, 'Loop videos opened in their own tabs.']
},
'Menu': {
@ -396,7 +396,7 @@
doc = d.documentElement;
g = {
VERSION: '1.9.20.8',
VERSION: '1.9.21.0',
NAMESPACE: '4chan X.',
NAME: '4chan X',
FAQ: 'https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions',
@ -1511,7 +1511,6 @@
this.file.text = file.firstElementChild;
this.file.thumb = $('.fileThumb > [data-md5]', file);
this.file.fullImage = $('.full-image', file);
this.file.videoControls = $('.video-controls', this.file.text);
if (contractThumb) {
ImageExpand.contract(this);
}
@ -3749,8 +3748,6 @@
};
flag = !flagCode ? {
innerHTML: ""
} : false ? {
innerHTML: " <img src=\"//s.4cdn.org/image/country/troll/" + E(flagCode.toLowerCase()) + ".gif\" alt=\"" + E(flagCode) + "\" title=\"" + E(flagName) + "\" class=\"countryFlag\">"
} : {
innerHTML: " <span title=\"" + E(flagName) + "\" class=\"flag flag-" + E(flagCode.toLowerCase()) + "\"></span>"
};
@ -6614,17 +6611,20 @@
mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'application/vnd.adobe.flash.movie', 'application/x-shockwave-flash', 'video/webm'],
init: function() {
var noscript, sc;
if (!Conf['Quick Reply'] || g.VIEW === 'archive') {
if (!Conf['Quick Reply']) {
return;
}
this.db = new DataBoard('yourPosts');
this.posts = [];
if (g.VIEW === 'archive') {
return;
}
$.globalEval('document.documentElement.dataset.jsEnabled = true;');
noscript = Conf['Force Noscript Captcha'] || !doc.dataset.jsEnabled;
this.captcha = Captcha[noscript ? 'noscript' : 'v2'];
if (Conf['QR Shortcut']) {
sc = $.el('a', {
className: "qr-shortcut fa fa-comment-o " + (!Conf['Persistent QR'] ? 'disabled' : ''),
className: 'qr-shortcut fa fa-comment-o disabled',
textContent: 'QR',
title: 'Quick Reply',
href: 'javascript:;'
@ -6635,11 +6635,9 @@
}
if (Conf['Persistent QR'] || !QR.nodes || QR.nodes.el.hidden) {
QR.open();
QR.nodes.com.focus();
return $.rmClass(this, 'disabled');
return QR.nodes.com.focus();
} else {
QR.close();
return $.addClass(this, 'disabled');
return QR.close();
}
});
Header.addShortcut(sc);
@ -6674,12 +6672,8 @@
});
QR.link = link.firstElementChild;
$.on(link.firstChild, 'click', function() {
$.event('CloseMenu');
QR.open();
QR.nodes.com.focus();
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.nodes.com.focus();
});
if (Conf['Bottom QR Link'] && g.VIEW === 'thread') {
linkBot = $.el('div', {
@ -6689,12 +6683,8 @@
innerHTML: "<a href=\"javascript:;\" class=\"qr-link-bottom\">Reply to Thread</a>"
});
$.on(linkBot.firstElementChild, 'click', function() {
$.event('CloseMenu');
QR.open();
QR.nodes.com.focus();
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.nodes.com.focus();
});
$.prepend($('.navLinksBot'), linkBot);
}
@ -6739,17 +6729,21 @@
}
QR.nodes.el.hidden = false;
QR.unhide();
return;
} else {
try {
QR.dialog();
} catch (_error) {
err = _error;
delete QR.nodes;
Main.handleErrors({
message: 'Quick Reply dialog creation crashed.',
error: err
});
return;
}
}
try {
return QR.dialog();
} catch (_error) {
err = _error;
delete QR.nodes;
return Main.handleErrors({
message: 'Quick Reply dialog creation crashed.',
error: err
});
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
},
close: function() {
@ -6763,7 +6757,7 @@
d.activeElement.blur();
$.rmClass(QR.nodes.el, 'dump');
if (Conf['QR Shortcut']) {
$.toggleClass($('.qr-shortcut'), 'disabled');
$.addClass($('.qr-shortcut'), 'disabled');
}
new QR.post(true);
_ref = QR.posts.splice(0, QR.posts.length - 1);
@ -6957,10 +6951,7 @@
com.setSelectionRange(range, range);
com.focus();
QR.selected.save(com);
QR.selected.save(thread);
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.selected.save(thread);
},
characterCount: function() {
var count, counter;
@ -7281,7 +7272,6 @@
nodes.flashTag.dataset["default"] = '4';
$.add(nodes.form, nodes.flashTag);
}
QR.flagsInput();
$.on(nodes.filename.parentNode, 'click keydown', QR.openFileInput);
$.on(nodes.autohide, 'change', QR.toggleHide);
$.on(nodes.close, 'click', QR.close);
@ -7303,7 +7293,7 @@
return QR.selected.nodes.spoiler.click();
});
$.on(nodes.fileInput, 'change', QR.handleFiles);
items = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'flag'];
items = ['thread', 'name', 'email', 'sub', 'com', 'filename'];
i = 0;
save = function() {
return QR.selected.save(this);
@ -7336,43 +7326,6 @@
QR.captcha.setup();
return $.event('QRDialogCreation', null, dialog);
},
flags: function() {
var flag, fn, select, _i, _len, _ref;
select = $.el('select', {
name: 'flag',
className: 'flagSelector'
});
fn = function(val) {
return $.add(select, $.el('option', {
value: val[0],
textContent: val[1]
}));
};
_ref = [['0', 'None'], ['US', 'American'], ['KP', 'Best Korean'], ['BL', 'Black Nationalist'], ['CM', 'Communist'], ['CF', 'Confederate'], ['RE', 'Conservative'], ['EU', 'European'], ['GY', 'Gay'], ['PC', 'Hippie'], ['IL', 'Israeli'], ['DM', 'Liberal'], ['RP', 'Libertarian'], ['MF', 'Muslim'], ['NZ', 'Nazi'], ['OB', 'Obama'], ['PR', 'Pirate'], ['RB', 'Rebel'], ['TP', 'Tea Partier'], ['TX', 'Texan'], ['TR', 'Tree Hugger'], ['WP', 'White Supremacist']];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
flag = _ref[_i];
fn(flag);
}
return select;
},
flagsInput: function() {
var flag, nodes;
nodes = QR.nodes;
if (!nodes) {
return;
}
if (nodes.flag) {
$.rm(nodes.flag);
delete nodes.flag;
}
if (false) {
flag = QR.flags();
flag.dataset.name = 'flag';
flag.dataset["default"] = '0';
nodes.flag = flag;
return $.add(nodes.form, flag);
}
},
submit: function(e) {
var captcha, cb, err, extra, filetag, formData, options, post, textOnly, thread, threadID;
if (e != null) {
@ -7438,7 +7391,6 @@
upfile: post.file,
filetag: filetag,
spoiler: post.spoiler,
flag: post.flag,
textonly: textOnly,
mode: 'regist',
pwd: QR.persona.pwd
@ -8460,8 +8412,7 @@
persona = _arg['QR.persona'];
persona = {
name: post.name,
email: /^sage$/.test(post.email) ? persona.email : post.email,
flag: post.flag
email: /^sage$/.test(post.email) ? persona.email : post.email
};
return $.set('QR.persona', persona);
});
@ -8522,9 +8473,6 @@
_this.name = 'name' in QR.persona.always ? QR.persona.always.name : prev ? prev.name : persona.name;
_this.email = 'email' in QR.persona.always ? QR.persona.always.email : prev && !/^sage$/.test(prev.email) ? prev.email : persona.email;
_this.sub = 'sub' in QR.persona.always ? QR.persona.always.sub : '';
if (QR.nodes.flag) {
_this.flag = prev ? prev.flag : persona.flag;
}
if (QR.selected === _this) {
return _this.load();
}
@ -8567,7 +8515,7 @@
if (this !== QR.selected) {
return;
}
_ref = ['thread', 'name', 'email', 'sub', 'com', 'fileButton', 'filename', 'spoiler', 'flag'];
_ref = ['thread', 'name', 'email', 'sub', 'com', 'fileButton', 'filename', 'spoiler'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
name = _ref[_i];
if (node = QR.nodes[name]) {
@ -8601,7 +8549,7 @@
_Class.prototype.load = function() {
var name, node, _i, _len, _ref;
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'flag'];
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
name = _ref[_i];
if (!(node = QR.nodes[name])) {
@ -8651,7 +8599,7 @@
if (this !== QR.selected) {
return;
}
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'spoiler', 'flag'];
_ref = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'spoiler'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
name = _ref[_i];
if (!(node = QR.nodes[name])) {
@ -8826,7 +8774,7 @@
FappeTyme = {
init: function() {
var el, lc, type, _i, _len, _ref, _ref1;
if (!(Conf['Fappe Tyme'] || Conf['Werk Tyme']) || ((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || g.BOARD === 'f') {
if (!((Conf['Fappe Tyme'] || Conf['Werk Tyme']) && ((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
this.nodes = {};
@ -8898,7 +8846,7 @@
Gallery = {
init: function() {
var el, _ref;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || g.BOARD === 'f' || !Conf['Gallery']) {
if (!(this.enabled = Conf['Gallery'] && ((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
this.delay = Conf['Slide Delay'];
@ -8970,6 +8918,7 @@
cb = Gallery.cb;
$.on(nodes.frame, 'click', cb.blank);
$.on(nodes.next, 'click', cb.click);
$.on(nodes.name, 'click', ImageCommon.download);
$.on($('.gal-prev', dialog), 'click', cb.prev);
$.on($('.gal-next', dialog), 'click', cb.next);
$.on($('.gal-start', dialog), 'click', cb.start);
@ -9168,7 +9117,7 @@
case 'Right':
return Gallery.cb.next;
case 'Enter':
return Gallery.cb.enterKey;
return Gallery.cb.advance;
case 'Left':
case '':
return Gallery.cb.prev;
@ -9204,16 +9153,20 @@
next: function() {
return Gallery.cb.open.call(Gallery.images[+Gallery.nodes.current.dataset.id + 1] || Gallery.images[0]);
},
enterKey: function() {
click: function(e) {
if (ImageCommon.onControls(e)) {
return;
}
e.preventDefault();
return Gallery.cb.advance();
},
advance: function() {
if (Gallery.nodes.current.paused) {
return Gallery.nodes.current.play();
} else {
return Gallery.cb.next();
}
},
click: function() {
return Gallery.cb[Gallery.nodes.current.controls ? 'stop' : 'enterKey']();
},
toggle: function() {
return (Gallery.nodes ? Gallery.cb.close : Gallery.build)();
},
@ -9285,8 +9238,8 @@
},
menu: {
init: function() {
var el, _ref;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || !Conf['Gallery']) {
var el;
if (!Gallery.enabled) {
return;
}
el = $.el('span', {
@ -9440,13 +9393,32 @@
});
};
return $.on(video, 'mouseover', handler);
},
onControls: function(e) {
return e.target.controls && e.target.getBoundingClientRect().bottom - e.clientY < 35;
},
download: function(e) {
if (this.protocol === 'blob:') {
return true;
}
e.preventDefault();
return CrossOrigin.file(this.href, (function(_this) {
return function(blob) {
if (blob) {
_this.href = URL.createObjectURL(blob);
return _this.click();
} else {
return new Notice('error', "Could not download " + _this.href, 30);
}
};
})(this));
}
};
ImageExpand = {
init: function() {
var _ref;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || !Conf['Image Expansion']) {
if (!(this.enabled = Conf['Image Expansion'] && ((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
this.EAI = $.el('a', {
@ -9458,12 +9430,6 @@
$.on(this.EAI, 'click', this.cb.toggleAll);
Header.addShortcut(this.EAI, 3);
$.on(d, 'scroll visibilitychange', this.cb.playVideos);
this.videoControls = $.el('span', {
className: 'video-controls'
});
$.extend(this.videoControls, {
innerHTML: " <a href=\"javascript:;\" title=\"You can also contract the video by dragging it to the left.\">contract</a>"
});
return Post.callbacks.push({
name: 'Image Expansion',
cb: this.node
@ -9480,7 +9446,6 @@
ImageExpand.contract(this);
return ImageExpand.expand(this);
} else if (this.file.isExpanded && this.file.isVideo) {
ImageExpand.setupVideoCB(this);
return ImageExpand.setupVideo(this, !((_ref = this.origin.file.fullImage) != null ? _ref.paused : void 0) || this.origin.file.wasPlaying, this.file.fullImage.controls);
}
} else if (ImageExpand.on && !this.isHidden && !this.isFetchedQuote && (Conf['Expand spoilers'] || !this.file.isSpoiler) && (Conf['Expand videos'] || !this.file.isVideo)) {
@ -9489,17 +9454,21 @@
},
cb: {
toggle: function(e) {
var file, post;
var file, post, _ref;
if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) {
return;
}
post = Get.postFromNode(this);
file = post.file;
if (file.isExpanded && file.isVideo && file.fullImage.controls) {
if (file.isExpanded && ImageCommon.onControls(e)) {
return;
}
e.preventDefault();
return ImageExpand.toggle(post);
if ((_ref = file.fullImage) != null ? _ref.paused : void 0) {
return file.fullImage.play();
} else {
return ImageExpand.toggle(post);
}
},
toggleAll: function() {
var func, toggle;
@ -9581,7 +9550,7 @@
}
},
contract: function(post) {
var bottom, cb, el, eventName, file, oldHeight, scrollY, top, x, _i, _len, _ref, _ref1;
var bottom, el, file, oldHeight, scrollY, top, x, _i, _len, _ref;
file = post.file;
if (el = file.fullImage) {
top = Header.getTopOf(el);
@ -9591,12 +9560,9 @@
}
$.rmClass(post.nodes.root, 'expanded-image');
$.rmClass(file.thumb, 'expanding');
if (file.videoControls) {
$.rm(file.videoControls);
}
file.thumb.parentNode.href = file.URL;
file.thumb.parentNode.target = '_blank';
_ref = ['isExpanding', 'isExpanded', 'videoControls', 'wasPlaying', 'scrollIntoView'];
_ref = ['isExpanding', 'isExpanded', 'wasPlaying', 'scrollIntoView'];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
x = _ref[_i];
delete file[x];
@ -9618,11 +9584,6 @@
ImageCommon.pushCache(el);
if (file.isVideo) {
el.pause();
_ref1 = ImageExpand.videoCB;
for (eventName in _ref1) {
cb = _ref1[eventName];
$.off(el, eventName, cb);
}
}
if (Conf['Restart when Opened']) {
ImageCommon.rewind(file.thumb);
@ -9666,14 +9627,9 @@
el.className = 'full-image';
$.after(thumb, el);
if (isVideo) {
if (Conf['Show Controls'] && !file.videoControls) {
file.videoControls = ImageExpand.videoControls.cloneNode(true);
$.add(file.text, file.videoControls);
}
thumb.parentNode.removeAttribute('href');
thumb.parentNode.removeAttribute('target');
el.loop = true;
ImageExpand.setupVideoCB(post);
}
if (!isVideo) {
return $.asap((function() {
@ -9741,49 +9697,6 @@
return ImageCommon.addControls(fullImage);
}
},
videoCB: (function() {
var mousedown;
mousedown = false;
return {
mouseover: function() {
return mousedown = false;
},
mousedown: function(e) {
if (e.button === 0) {
return mousedown = true;
}
},
mouseup: function(e) {
if (e.button === 0) {
return mousedown = false;
}
},
mouseout: function(e) {
if (mousedown && e.clientX <= this.getBoundingClientRect().left) {
return ImageExpand.toggle(Get.postFromNode(this));
}
},
click: function(e) {
if (this.paused && !this.controls) {
this.play();
return e.stopPropagation();
}
}
};
})(),
setupVideoCB: function(post) {
var cb, eventName, _ref;
_ref = ImageExpand.videoCB;
for (eventName in _ref) {
cb = _ref[eventName];
$.on(post.file.fullImage, eventName, cb);
}
if (post.file.videoControls) {
return $.on(post.file.videoControls.firstElementChild, 'click', function() {
return ImageExpand.toggle(post);
});
}
},
error: function() {
var post;
post = Get.postFromNode(this);
@ -9809,8 +9722,8 @@
},
menu: {
init: function() {
var conf, createSubEntry, el, name, subEntries, _ref, _ref1;
if (((_ref = g.VIEW) !== 'index' && _ref !== 'thread') || !Conf['Image Expansion']) {
var conf, createSubEntry, el, name, subEntries, _ref;
if (!ImageExpand.enabled) {
return;
}
el = $.el('span', {
@ -9819,9 +9732,9 @@
});
createSubEntry = ImageExpand.menu.createSubEntry;
subEntries = [];
_ref1 = Config.imageExpansion;
for (name in _ref1) {
conf = _ref1[name];
_ref = Config.imageExpansion;
for (name in _ref) {
conf = _ref[name];
subEntries.push(createSubEntry(name, conf[1]));
}
return Header.menu.addEntry({
@ -9967,7 +9880,7 @@
ImageLoader = {
init: function() {
var prefetch, _ref;
if ((_ref = g.VIEW) !== 'index' && _ref !== 'thread') {
if (!(((_ref = g.VIEW) === 'index' || _ref === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
if (!(Conf['Image Prefetching'] || Conf['Replace JPG'] || Conf['Replace PNG'] || Conf['Replace GIF'] || Conf['Replace WEBM'])) {
@ -10434,23 +10347,20 @@
return;
}
if ($.hasClass(this, "embedded")) {
if (!$.hasClass(this.previousElementSibling, 'linkify')) {
$.rm(this.previousElementSibling);
}
this.previousElementSibling.hidden = false;
$.rm(this.nextElementSibling);
this.textContent = '(embed)';
} else {
this.previousElementSibling.hidden = true;
$.before(this, Embedding.cb.embed(this));
$.after(this, Embedding.cb.embed(this));
this.textContent = '(unembed)';
}
return $.toggleClass(this, 'embedded');
},
embed: function(a) {
var el, type;
el = (type = Embedding.types[a.dataset.key]).el(a);
el.style.cssText = type.style != null ? type.style : "border: 0; width: 640px; height: 390px";
return el;
var container, el, type;
container = $.el('div');
$.add(container, el = (type = Embedding.types[a.dataset.key]).el(a));
el.style.cssText = type.style != null ? type.style : "border:0;width:640px;height:390px";
return container;
},
title: function(req, data) {
var key, link, link2, options, post, post2, service, status, text, uid, _i, _j, _len, _len1, _ref, _ref1;
@ -11226,22 +11136,7 @@
className: 'download-link',
textContent: 'Download file'
});
$.on(a, 'click', function(e) {
if (this.protocol === 'blob:') {
return true;
}
e.preventDefault();
return CrossOrigin.file(this.href, (function(_this) {
return function(blob) {
if (blob) {
_this.href = URL.createObjectURL(blob);
return _this.click();
} else {
return new Notice('error', "Could not download " + _this.href, 30);
}
};
})(this));
});
$.on(a, 'click', ImageCommon.download);
return Menu.menu.addEntry({
el: a,
order: 100,
@ -14101,7 +13996,7 @@
return Conf[hotkey] = key;
},
keydown: function(e) {
var form, key, notification, notifications, op, searchInput, target, thread, threadRoot, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6;
var form, key, notification, notifications, op, searchInput, target, thread, threadRoot, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
if (!(key = Keybinds.keyCode(e))) {
return;
}
@ -14128,10 +14023,13 @@
Header.toggleBarVisibility();
break;
case Conf['Open empty QR']:
if (!QR.postingIsEnabled) {
return;
}
Keybinds.qr();
break;
case Conf['Open QR']:
if (!threadRoot) {
if (!(QR.postingIsEnabled && threadRoot)) {
return;
}
Keybinds.qr(threadRoot);
@ -14222,31 +14120,31 @@
ThreadWatcher.toggle(thread);
break;
case Conf['Expand image']:
if (!threadRoot) {
if (!(ImageExpand.enabled && threadRoot)) {
return;
}
Keybinds.img(threadRoot);
break;
case Conf['Expand images']:
if (!threadRoot) {
if (!(ImageExpand.enabled && threadRoot)) {
return;
}
Keybinds.img(threadRoot, true);
break;
case Conf['Open Gallery']:
if ((_ref2 = g.VIEW) !== 'index' && _ref2 !== 'thread') {
if (!Gallery.enabled) {
return;
}
Gallery.cb.toggle();
break;
case Conf['fappeTyme']:
if (!Conf['Fappe Tyme'] || ((_ref3 = g.VIEW) !== 'index' && _ref3 !== 'thread') || g.BOARD === 'f') {
if (!(Conf['Fappe Tyme'] && ((_ref2 = g.VIEW) === 'index' || _ref2 === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
FappeTyme.toggle('fappe');
break;
case Conf['werkTyme']:
if (!Conf['Werk Tyme'] || ((_ref4 = g.VIEW) !== 'index' && _ref4 !== 'thread') || g.BOARD === 'f') {
if (!(Conf['Werk Tyme'] && ((_ref3 = g.VIEW) === 'index' || _ref3 === 'thread') && g.BOARD.ID !== 'f')) {
return;
}
FappeTyme.toggle('werk');
@ -14266,7 +14164,7 @@
return;
}
if (Conf['JSON Navigation']) {
if ((_ref5 = Conf['Index Mode']) !== 'paged' && _ref5 !== 'infinite') {
if ((_ref4 = Conf['Index Mode']) !== 'paged' && _ref4 !== 'infinite') {
return;
}
$('.next button', Index.pagelist).click();
@ -14281,7 +14179,7 @@
return;
}
if (Conf['JSON Navigation']) {
if ((_ref6 = Conf['Index Mode']) !== 'paged' && _ref6 !== 'infinite') {
if ((_ref5 = Conf['Index Mode']) !== 'paged' && _ref5 !== 'infinite') {
return;
}
$('.prev button', Index.pagelist).click();
@ -14425,17 +14323,11 @@
return key;
},
qr: function(thread) {
if (!(Conf['Quick Reply'] && QR.postingIsEnabled)) {
return;
}
QR.open();
if (thread != null) {
QR.quote.call($('input', $('.post.highlight', thread) || thread));
}
QR.nodes.com.focus();
if (Conf['QR Shortcut']) {
return $.rmClass($('.qr-shortcut'), 'disabled');
}
return QR.nodes.com.focus();
},
tags: function(tag, ta) {
var range, selEnd, selStart, supported, value;

Binary file not shown.

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/4chan-X-beta.crx' version='1.9.20.8' />
<updatecheck codebase='https://ccd0.github.io/4chan-x/builds/4chan-X-beta.crx' version='1.9.21.0' />
</app>
</gupdate>

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/4chan-X.crx' version='1.9.20.8' />
<updatecheck codebase='https://ccd0.github.io/4chan-x/builds/4chan-X.crx' version='1.9.21.0' />
</app>
</gupdate>

View File

@ -3,7 +3,7 @@
"description": "Cross-browser userscript for maximum lurking on 4chan.",
"meta": {
"name": "4chan X",
"version": "1.9.20.8",
"version": "1.9.21.0",
"repo": "https://github.com/ccd0/4chan-x/",
"page": "https://github.com/ccd0/4chan-x",
"downloads": "https://ccd0.github.io/4chan-x/builds/",