Release 4chan X v1.7.37.
This commit is contained in:
parent
74e9dca89b
commit
61983c537c
10
CHANGELOG.md
10
CHANGELOG.md
@ -1,3 +1,13 @@
|
|||||||
|
### v1.7.37
|
||||||
|
*2014-05-14*
|
||||||
|
|
||||||
|
**DamonGant**
|
||||||
|
- Innovandalism Archive is now Deniable Plausibility.
|
||||||
|
|
||||||
|
**ccd0**
|
||||||
|
- Disable HTML both in custom board titles and file info formatting. This shuts down a means for a malicious script injected into the page to permanently install itself, to be run each time you browse 4chan. I expect few or no people were actually using their own HTML in these fields; if you want it back, make a request on the [issues](https://github.com/ccd0/4chan-x/issues) page, and I will consider working on a secure implementation.
|
||||||
|
- Bug fixes.
|
||||||
|
|
||||||
### v1.7.36
|
### v1.7.36
|
||||||
*2014-05-13*
|
*2014-05-13*
|
||||||
|
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* 4chan X - Version 1.7.36 - 2014-05-13
|
* 4chan X - Version 1.7.37 - 2014-05-14
|
||||||
*
|
*
|
||||||
* Licensed under the MIT license.
|
* Licensed under the MIT license.
|
||||||
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
|
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @name 4chan X
|
// @name 4chan X
|
||||||
// @version 1.7.36
|
// @version 1.7.37
|
||||||
// @minGMVer 1.14
|
// @minGMVer 1.14
|
||||||
// @minFFVer 26
|
// @minFFVer 26
|
||||||
// @namespace 4chan-X
|
// @namespace 4chan-X
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
// Generated by CoffeeScript
|
// Generated by CoffeeScript
|
||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @name 4chan X
|
// @name 4chan X
|
||||||
// @version 1.7.36
|
// @version 1.7.37
|
||||||
// @minGMVer 1.14
|
// @minGMVer 1.14
|
||||||
// @minFFVer 26
|
// @minFFVer 26
|
||||||
// @namespace 4chan-X
|
// @namespace 4chan-X
|
||||||
@ -24,7 +24,7 @@
|
|||||||
// ==/UserScript==
|
// ==/UserScript==
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 4chan X - Version 1.7.36 - 2014-05-13
|
* 4chan X - Version 1.7.37 - 2014-05-14
|
||||||
*
|
*
|
||||||
* Licensed under the MIT license.
|
* Licensed under the MIT license.
|
||||||
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
|
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
|
||||||
@ -154,7 +154,7 @@
|
|||||||
'Color User IDs': [false, 'Assign unique colors to user IDs on boards that use them'],
|
'Color User IDs': [false, 'Assign unique colors to user IDs on boards that use them'],
|
||||||
'Remove Spoilers': [false, 'Remove all spoilers in text.'],
|
'Remove Spoilers': [false, 'Remove all spoilers in text.'],
|
||||||
'Reveal Spoilers': [false, 'Indicate spoilers if Remove Spoilers is enabled, or make the text appear hovered if Remove Spoiler is disabled.'],
|
'Reveal Spoilers': [false, 'Indicate spoilers if Remove Spoilers is enabled, or make the text appear hovered if Remove Spoiler is disabled.'],
|
||||||
'Show Support Message': [true, 'Warn if your browser is unsupported. 4chan X may not operate correctly on unsupported browser versions.']
|
'Show Support Message': [true, 'Warn if your browser or configuration is unsupported and may cause 4chan X to not operate correctly.']
|
||||||
},
|
},
|
||||||
'Linkification': {
|
'Linkification': {
|
||||||
'Linkify': [true, 'Convert text into links where applicable.'],
|
'Linkify': [true, 'Convert text into links where applicable.'],
|
||||||
@ -372,7 +372,7 @@
|
|||||||
doc = d.documentElement;
|
doc = d.documentElement;
|
||||||
|
|
||||||
g = {
|
g = {
|
||||||
VERSION: '1.7.36',
|
VERSION: '1.7.37',
|
||||||
NAMESPACE: '4chan X.',
|
NAMESPACE: '4chan X.',
|
||||||
boards: {}
|
boards: {}
|
||||||
};
|
};
|
||||||
@ -552,15 +552,21 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
$.addClass = function() {
|
$.addClass = function() {
|
||||||
var className, el, _ref;
|
var className, classNames, el, _i, _len;
|
||||||
el = arguments[0], className = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
el = arguments[0], classNames = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
||||||
return (_ref = el.classList).add.apply(_ref, className);
|
for (_i = 0, _len = classNames.length; _i < _len; _i++) {
|
||||||
|
className = classNames[_i];
|
||||||
|
el.classList.add(className);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
$.rmClass = function() {
|
$.rmClass = function() {
|
||||||
var className, el, _ref;
|
var className, classNames, el, _i, _len;
|
||||||
el = arguments[0], className = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
el = arguments[0], classNames = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
||||||
return (_ref = el.classList).remove.apply(_ref, className);
|
for (_i = 0, _len = classNames.length; _i < _len; _i++) {
|
||||||
|
className = classNames[_i];
|
||||||
|
el.classList.remove(className);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
$.toggleClass = function(el, className) {
|
$.toggleClass = function(el, className) {
|
||||||
@ -2284,7 +2290,7 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
el = $.el('span', {
|
el = $.el('span', {
|
||||||
innerHTML: "Desktop notification permissions are not granted.\n[<a href='https://github.com/MayhemYDG/4chan-x/wiki/FAQ#desktop-notifications' target=_blank>FAQ</a>]<br>\n<button>Authorize</button> or <button>Disable</button>"
|
innerHTML: '4chan X needs your permission to show desktop notifications.\n[<a href=\'https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions#why-is-4chan-x-asking-for-permission-to-show-desktop-notifications\' target=_blank>FAQ</a>]<br>\n<button>Authorize</button> or <button>Disable</button>'
|
||||||
});
|
});
|
||||||
_ref = $$('button', el), authorize = _ref[0], disable = _ref[1];
|
_ref = $$('button', el), authorize = _ref[0], disable = _ref[1];
|
||||||
$.on(authorize, 'click', function() {
|
$.on(authorize, 'click', function() {
|
||||||
@ -3092,7 +3098,7 @@
|
|||||||
o.file = {
|
o.file = {
|
||||||
name: data.filename + data.ext,
|
name: data.filename + data.ext,
|
||||||
timestamp: "" + data.tim + data.ext,
|
timestamp: "" + data.tim + data.ext,
|
||||||
url: boardID === 'f' ? ("//i.4cdn.org/" + boardID + "/" + data.filename + data.ext).replace(/'/g, ''') : "//i.4cdn.org/" + boardID + "/" + data.tim + data.ext,
|
url: boardID === 'f' ? ("//i.4cdn.org/" + boardID + "/" + (encodeURIComponent(data.filename)) + data.ext).replace(/'/g, ''') : "//i.4cdn.org/" + boardID + "/" + data.tim + data.ext,
|
||||||
height: data.h,
|
height: data.h,
|
||||||
width: data.w,
|
width: data.w,
|
||||||
MD5: data.md5,
|
MD5: data.md5,
|
||||||
@ -3172,7 +3178,7 @@
|
|||||||
a.textContent = Build.shortFilename(filename);
|
a.textContent = Build.shortFilename(filename);
|
||||||
shortFilename = a.innerHTML;
|
shortFilename = a.innerHTML;
|
||||||
a.textContent = filename;
|
a.textContent = filename;
|
||||||
filename = a.innerHTML.replace(/'/g, ''');
|
filename = a.innerHTML.replace(/'/g, ''');
|
||||||
fileDims = file.name.slice(-3) === 'pdf' ? 'PDF' : "" + file.width + "x" + file.height;
|
fileDims = file.name.slice(-3) === 'pdf' ? 'PDF' : "" + file.width + "x" + file.height;
|
||||||
fileInfo = ("<div class=fileText id=fT" + postID + (file.isSpoiler ? " title='" + filename + "'" : '') + ">File: <a href='" + file.url + "' target=_blank>" + file.timestamp + "</a>") + ("-(" + fileSize + ", " + fileDims + (file.isSpoiler ? '' : ", <span" + (filename !== shortFilename ? " title='" + filename + "'" : '') + ">" + shortFilename + "</span>")) + ")</div>";
|
fileInfo = ("<div class=fileText id=fT" + postID + (file.isSpoiler ? " title='" + filename + "'" : '') + ">File: <a href='" + file.url + "' target=_blank>" + file.timestamp + "</a>") + ("-(" + fileSize + ", " + fileDims + (file.isSpoiler ? '' : ", <span" + (filename !== shortFilename ? " title='" + filename + "'" : '') + ">" + shortFilename + "</span>")) + ")</div>";
|
||||||
fileHTML = "<div class=file id=f" + postID + ">" + fileInfo + imgSrc + "</div>";
|
fileHTML = "<div class=file id=f" + postID + ">" + fileInfo + imgSrc + "</div>";
|
||||||
@ -3521,13 +3527,13 @@
|
|||||||
|
|
||||||
UI = (function() {
|
UI = (function() {
|
||||||
var Menu, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, touchend, touchmove;
|
var Menu, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, touchend, touchmove;
|
||||||
dialog = function(id, position, html) {
|
dialog = function(id, position, properties) {
|
||||||
var child, el, move, _i, _len, _ref;
|
var child, el, move, _i, _len, _ref;
|
||||||
el = $.el('div', {
|
el = $.el('div', {
|
||||||
className: 'dialog',
|
className: 'dialog',
|
||||||
innerHTML: html,
|
|
||||||
id: id
|
id: id
|
||||||
});
|
});
|
||||||
|
$.extend(el, properties);
|
||||||
el.style.cssText = position;
|
el.style.cssText = position;
|
||||||
$.get("" + id + ".position", position, function(item) {
|
$.get("" + id + ".position", position, function(item) {
|
||||||
return el.style.cssText = item["" + id + ".position"];
|
return el.style.cssText = item["" + id + ".position"];
|
||||||
@ -6207,7 +6213,9 @@
|
|||||||
dialog: function() {
|
dialog: function() {
|
||||||
var dialog, elm, event, i, items, name, node, nodes, prop, rules, save, setNode, _, _i, _len, _ref, _ref1, _ref2;
|
var dialog, elm, event, i, items, name, node, nodes, prop, rules, save, setNode, _, _i, _len, _ref, _ref1, _ref2;
|
||||||
QR.nodes = nodes = {
|
QR.nodes = nodes = {
|
||||||
el: dialog = UI.dialog('qr', 'top:0;right:0;', "<div class=move><label><input type=checkbox id=autohide title=Auto-hide>Quick Reply</label><a href=javascript:; class=close title=Close>×</a><select data-name=thread title='Create a new thread / Reply'><option value=new>New thread</option></select></div><form><div class=persona><input name=name data-name=name list=\"list-name\" placeholder=Name class=field size=1 tabindex=10><input name=email data-name=email list=\"list-email\" placeholder=E-mail class=field size=1 tabindex=20><input name=sub data-name=sub list=\"list-sub\" placeholder=Subject class=field size=1 tabindex=30> </div><div class=textarea><textarea data-name=com placeholder=Comment class=field tabindex=40></textarea><span id=char-count></span></div><div id=dump-list-container><div id=dump-list></div><a id=add-post href=javascript:; title=\"Add a post\" tabindex=50>+</a></div><div id=file-n-submit><span id=qr-filename-container class=field tabindex=60><span id=qr-no-file>No selected file</span><input id=\"qr-filename\" data-name=\"filename\" spellcheck=\"false\"><span id=qr-extras-container><a id=qr-filerm href=javascript:; title='Remove file'><i class=\"fa fa-times-circle\"></i></a><a id=url-button title='Post from url'><i class=\"fa fa-link\"></i></a><a id=dump-button title='Dump list'><i class=\"fa fa-plus-square\"></i></a></span></span><label id=qr-spoiler-label><input type=checkbox id=qr-file-spoiler title='Spoiler image' tabindex=70></label><input type=submit tabindex=80></div><input type=file multiple></form><datalist id=\"list-name\"></datalist><datalist id=\"list-email\"></datalist><datalist id=\"list-sub\"></datalist> ")
|
el: dialog = UI.dialog('qr', 'top:0;right:0;', {
|
||||||
|
innerHTML: "<div class=move><label><input type=checkbox id=autohide title=Auto-hide>Quick Reply</label><a href=javascript:; class=close title=Close>×</a><select data-name=thread title='Create a new thread / Reply'><option value=new>New thread</option></select></div><form><div class=persona><input name=name data-name=name list=\"list-name\" placeholder=Name class=field size=1 tabindex=10><input name=email data-name=email list=\"list-email\" placeholder=E-mail class=field size=1 tabindex=20><input name=sub data-name=sub list=\"list-sub\" placeholder=Subject class=field size=1 tabindex=30> </div><div class=textarea><textarea data-name=com placeholder=Comment class=field tabindex=40></textarea><span id=char-count></span></div><div id=dump-list-container><div id=dump-list></div><a id=add-post href=javascript:; title=\"Add a post\" tabindex=50>+</a></div><div id=file-n-submit><span id=qr-filename-container class=field tabindex=60><span id=qr-no-file>No selected file</span><input id=\"qr-filename\" data-name=\"filename\" spellcheck=\"false\"><span id=qr-extras-container><a id=qr-filerm href=javascript:; title='Remove file'><i class=\"fa fa-times-circle\"></i></a><a id=url-button title='Post from url'><i class=\"fa fa-link\"></i></a><a id=dump-button title='Dump list'><i class=\"fa fa-plus-square\"></i></a></span></span><label id=qr-spoiler-label><input type=checkbox id=qr-file-spoiler title='Spoiler image' tabindex=70></label><input type=submit tabindex=80></div><input type=file multiple></form><datalist id=\"list-name\"></datalist><datalist id=\"list-email\"></datalist><datalist id=\"list-sub\"></datalist> "
|
||||||
|
})
|
||||||
};
|
};
|
||||||
setNode = function(name, query) {
|
setNode = function(name, query) {
|
||||||
return nodes[name] = $(query, dialog);
|
return nodes[name] = $(query, dialog);
|
||||||
@ -6263,7 +6271,7 @@
|
|||||||
if (g.BOARD.ID === 'f') {
|
if (g.BOARD.ID === 'f') {
|
||||||
nodes.flashTag = $.el('select', {
|
nodes.flashTag = $.el('select', {
|
||||||
name: 'filetag',
|
name: 'filetag',
|
||||||
innerHTML: "<option value=0>Hentai</option>\n<option value=6>Porn</option>\n<option value=1>Japanese</option>\n<option value=2>Anime</option>\n<option value=3>Game</option>\n<option value=5>Loop</option>\n<option value=4 selected>Other</option>"
|
innerHTML: '<option value=0>Hentai</option>\n<option value=6>Porn</option>\n<option value=1>Japanese</option>\n<option value=2>Anime</option>\n<option value=3>Game</option>\n<option value=5>Loop</option>\n<option value=4 selected>Other</option>'
|
||||||
});
|
});
|
||||||
nodes.flashTag.dataset["default"] = '4';
|
nodes.flashTag.dataset["default"] = '4';
|
||||||
$.add(nodes.form, nodes.flashTag);
|
$.add(nodes.form, nodes.flashTag);
|
||||||
@ -6456,7 +6464,7 @@
|
|||||||
QR.cooldown.auto = false;
|
QR.cooldown.auto = false;
|
||||||
QR.status();
|
QR.status();
|
||||||
return QR.error($.el('span', {
|
return QR.error($.el('span', {
|
||||||
innerHTML: "4chan X encountered an error while posting. \n[<a href=\"//4chan.org/banned\" target=_blank>Banned?</a>] [<a href=\"https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions#what-does-4chan-x-encountered-an-error-while-posting-please-try-again-mean\" target=_blank>More info</a>]"
|
innerHTML: '4chan X encountered an error while posting. \n[<a href="//4chan.org/banned" target=_blank>Banned?</a>] [<a href="https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions#what-does-4chan-x-encountered-an-error-while-posting-please-try-again-mean" target=_blank>More info</a>]'
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -7519,7 +7527,7 @@
|
|||||||
nodes = Gallery.nodes = {};
|
nodes = Gallery.nodes = {};
|
||||||
nodes.el = dialog = $.el('div', {
|
nodes.el = dialog = $.el('div', {
|
||||||
id: 'a-gallery',
|
id: 'a-gallery',
|
||||||
innerHTML: "<div class=gal-viewport>\n <span class=gal-buttons>\n <a class=\"menu-button\" href=\"javascript:;\"><i></i></a>\n <a href=javascript:; class=gal-close>×</a>\n </span>\n <a class=gal-name target=\"_blank\"></a>\n <span class=gal-count><span class='count'></span> / <span class='total'></span></a></span>\n <div class=gal-prev></div>\n <div class=gal-image>\n <a href=javascript:;><img></a>\n </div>\n <div class=gal-next></div>\n</div>\n<div class=gal-thumbnails></div>"
|
innerHTML: '<div class=gal-viewport>\n <span class=gal-buttons>\n <a class="menu-button" href="javascript:;"><i></i></a>\n <a href=javascript:; class=gal-close>×</a>\n </span>\n <a class=gal-name target="_blank"></a>\n <span class=gal-count><span class=\'count\'></span> / <span class=\'total\'></span></a></span>\n <div class=gal-prev></div>\n <div class=gal-image>\n <a href=javascript:;><img></a>\n </div>\n <div class=gal-next></div>\n</div>\n<div class=gal-thumbnails></div>'
|
||||||
});
|
});
|
||||||
_ref = {
|
_ref = {
|
||||||
frame: '.gal-image',
|
frame: '.gal-image',
|
||||||
@ -9428,7 +9436,7 @@
|
|||||||
}
|
}
|
||||||
if (Conf['Updater and Stats in Header']) {
|
if (Conf['Updater and Stats in Header']) {
|
||||||
this.dialog = sc = $.el('span', {
|
this.dialog = sc = $.el('span', {
|
||||||
innerHTML: "<span id=post-count>0</span> / <span id=file-count>0</span>" + (Conf["Page Count in Stats"] ? " / <span id=page-count>0</span>" : ""),
|
innerHTML: "<span id=post-count>0</span> / <span id=file-count>0</span>" + (Conf['Page Count in Stats'] ? ' / <span id=page-count>0</span>' : ''),
|
||||||
id: 'thread-stats',
|
id: 'thread-stats',
|
||||||
title: 'Post Count / File Count' + (Conf["Page Count in Stats"] ? " / Page Count" : "")
|
title: 'Post Count / File Count' + (Conf["Page Count in Stats"] ? " / Page Count" : "")
|
||||||
});
|
});
|
||||||
@ -9436,7 +9444,9 @@
|
|||||||
return Header.addShortcut(sc);
|
return Header.addShortcut(sc);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.dialog = sc = UI.dialog('thread-stats', 'bottom: 0px; right: 0px;', "<div class=move title='Post Count / File Count" + (Conf["Page Count in Stats"] ? " / Page Count" : "") + "'><span id=post-count>0</span> / <span id=file-count>0</span>" + (Conf["Page Count in Stats"] ? " / <span id=page-count>0</span>" : "") + "</div>");
|
this.dialog = sc = UI.dialog('thread-stats', 'bottom: 0px; right: 0px;', {
|
||||||
|
innerHTML: "<div class=move title='Post Count / File Count" + (Conf['Page Count in Stats'] ? ' / Page Count' : '') + "'><span id=post-count>0</span> / <span id=file-count>0</span>" + (Conf['Page Count in Stats'] ? ' / <span id=page-count>0</span>' : '') + "</div>"
|
||||||
|
});
|
||||||
$.ready((function(_this) {
|
$.ready((function(_this) {
|
||||||
return function() {
|
return function() {
|
||||||
return $.add(d.body, sc);
|
return $.add(d.body, sc);
|
||||||
@ -9547,14 +9557,16 @@
|
|||||||
}
|
}
|
||||||
if (Conf['Updater and Stats in Header']) {
|
if (Conf['Updater and Stats in Header']) {
|
||||||
this.dialog = sc = $.el('span', {
|
this.dialog = sc = $.el('span', {
|
||||||
innerHTML: "<span id=update-status></span><span id=update-timer title='Update now'></span>",
|
innerHTML: '<span id=update-status></span><span id=update-timer title="Update now"></span>',
|
||||||
id: 'updater'
|
id: 'updater'
|
||||||
});
|
});
|
||||||
$.ready(function() {
|
$.ready(function() {
|
||||||
return Header.addShortcut(sc);
|
return Header.addShortcut(sc);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.dialog = sc = UI.dialog('updater', 'bottom: 0px; left: 0px;', "<div class=move></div><span id=update-status></span><span id=update-timer title='Update now'></span>");
|
this.dialog = sc = UI.dialog('updater', 'bottom: 0px; left: 0px;', {
|
||||||
|
innerHTML: '<div class=move></div><span id=update-status></span><span id=update-timer title="Update now"></span>'
|
||||||
|
});
|
||||||
$.addClass(doc, 'float');
|
$.addClass(doc, 'float');
|
||||||
$.ready((function(_this) {
|
$.ready((function(_this) {
|
||||||
return function() {
|
return function() {
|
||||||
@ -9956,7 +9968,9 @@
|
|||||||
className: 'disabled fa fa-eye'
|
className: 'disabled fa fa-eye'
|
||||||
});
|
});
|
||||||
this.db = new DataBoard('watchedThreads', this.refresh, true);
|
this.db = new DataBoard('watchedThreads', this.refresh, true);
|
||||||
this.dialog = UI.dialog('thread-watcher', 'top: 50px; left: 0px;', "<div class=\"move\">Thread Watcher <span id=\"watcher-status\"></span><a class=\"menu-button\" href=\"javascript:;\"><i class=\"fa fa-angle-down\"></i></a><a class=close href=javascript:;>×</a></span></div><div id=\"watched-threads\"></div>");
|
this.dialog = UI.dialog('thread-watcher', 'top: 50px; left: 0px;', {
|
||||||
|
innerHTML: "<div class=\"move\">Thread Watcher <span id=\"watcher-status\"></span><a class=\"menu-button\" href=\"javascript:;\"><i class=\"fa fa-angle-down\"></i></a><a class=close href=javascript:;>×</a></span></div><div id=\"watched-threads\"></div>"
|
||||||
|
});
|
||||||
this.status = $('#watcher-status', this.dialog);
|
this.status = $('#watcher-status', this.dialog);
|
||||||
this.list = this.dialog.lastElementChild;
|
this.list = this.dialog.lastElementChild;
|
||||||
$.on(d, 'QRPostSuccessful', this.cb.post);
|
$.on(d, 'QRPostSuccessful', this.cb.post);
|
||||||
@ -10767,7 +10781,7 @@
|
|||||||
}
|
}
|
||||||
return Redirect.data = o;
|
return Redirect.data = o;
|
||||||
},
|
},
|
||||||
archives: [{"uid":0,"name":"Foolz","domain":"archive.foolz.us","http":true,"https":true,"software":"foolfuuka","boards":["a","biz","co","diy","gd","jp","m","sci","sp","tg","tv","vg","vp","vr","wsg"],"files":["a","biz","diy","gd","jp","m","sci","tg","vg","vp","vr","wsg"]},{"uid":1,"name":"NSFW Foolz","domain":"nsfw.foolz.us","http":true,"https":true,"software":"foolfuuka","boards":["u"],"files":["u"]},{"uid":2,"name":"The Dark Cave","domain":"archive.thedarkcave.org","http":true,"https":true,"software":"foolfuuka","boards":["c","int","out","po"],"files":["c","po"]},{"uid":3,"name":"4plebs Archive","domain":"archive.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["adv","hr","o","pol","s4s","tg","trv","tv","x"],"files":["adv","hr","o","pol","s4s","tg","trv","tv","x"]},{"uid":18,"name":"4plebs Flash Archive","domain":"flash.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["f"],"files":["f"]},{"uid":4,"name":"Nyafuu","domain":"archive.nyafuu.org","http":true,"https":true,"software":"foolfuuka","boards":["c","e","w","wg"],"files":["c","e","w","wg"]},{"uid":5,"name":"Love is Over","domain":"archive.loveisover.me","http":true,"https":true,"software":"foolfuuka","boards":["d","i","lgbt"],"files":["d","i","lgbt"]},{"uid":8,"name":"Rebecca Black Tech","domain":"rbt.asia","http":false,"https":true,"software":"fuuka","boards":["cgl","g","mu","w"],"files":["cgl","g","mu","w"]},{"uid":9,"name":"Heinessen","domain":"archive.heinessen.com","http":true,"https":false,"software":"fuuka","boards":["an","fit","k","mlp","r9k","toy"],"files":["an","fit","k","mlp","r9k","toy"]},{"uid":10,"name":"warosu","domain":"fuuka.warosu.org","http":false,"https":true,"software":"fuuka","boards":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"],"files":["3","biz","cgl","ck","diy","fa","ic","jp","lit","sci","tg","vr"]},{"uid":15,"name":"fgts","domain":"fgts.eu","http":true,"https":true,"software":"foolfuuka","boards":["asp","b","cm","h","hc","hm","n","p","r","s","soc","y"],"files":["asp","cm","h","hc","hm","n","p","r","s","soc","y"]},{"uid":16,"name":"maware","domain":"archive.mawa.re","http":true,"https":false,"software":"foolfuuka","boards":["t"],"files":["t"]},{"uid":17,"name":"installgentoo.com","domain":"chan.installgentoo.com","http":true,"https":false,"software":"foolfuuka","boards":["g","t"],"files":["g","t"]},{"uid":19,"name":"Innovandalism Archive","domain":"boards.innovandalism.eu","http":true,"https":false,"software":"foolfuuka","boards":["v"],"files":[]},{"uid":13,"name":"Foolz Beta","domain":"beta.foolz.us","http":true,"https":true,"withCredentials":true,"software":"foolfuuka","boards":["a","biz","co","d","diy","gd","h","i","jp","m","mlp","s4s","sci","sp","tg","tv","u","v","vg","vp","vr","wsg"],"files":[]}],
|
archives: [{"uid":0,"name":"Foolz","domain":"archive.foolz.us","http":true,"https":true,"software":"foolfuuka","boards":["a","biz","co","diy","gd","jp","m","sci","sp","tg","tv","vg","vp","vr","wsg"],"files":["a","biz","diy","gd","jp","m","sci","tg","vg","vp","vr","wsg"]},{"uid":1,"name":"NSFW Foolz","domain":"nsfw.foolz.us","http":true,"https":true,"software":"foolfuuka","boards":["u"],"files":["u"]},{"uid":2,"name":"The Dark Cave","domain":"archive.thedarkcave.org","http":true,"https":true,"software":"foolfuuka","boards":["c","int","out","po"],"files":["c","po"]},{"uid":3,"name":"4plebs Archive","domain":"archive.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["adv","hr","o","pol","s4s","tg","trv","tv","x"],"files":["adv","hr","o","pol","s4s","tg","trv","tv","x"]},{"uid":18,"name":"4plebs Flash Archive","domain":"flash.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["f"],"files":["f"]},{"uid":4,"name":"Nyafuu","domain":"archive.nyafuu.org","http":true,"https":true,"software":"foolfuuka","boards":["c","e","w","wg"],"files":["c","e","w","wg"]},{"uid":5,"name":"Love is Over","domain":"archive.loveisover.me","http":true,"https":true,"software":"foolfuuka","boards":["d","i","lgbt"],"files":["d","i","lgbt"]},{"uid":8,"name":"Rebecca Black Tech","domain":"rbt.asia","http":false,"https":true,"software":"fuuka","boards":["cgl","g","mu","w"],"files":["cgl","g","mu","w"]},{"uid":9,"name":"Heinessen","domain":"archive.heinessen.com","http":true,"https":false,"software":"fuuka","boards":["an","fit","k","mlp","r9k","toy"],"files":["an","fit","k","mlp","r9k","toy"]},{"uid":10,"name":"warosu","domain":"fuuka.warosu.org","http":false,"https":true,"software":"fuuka","boards":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"],"files":["3","biz","cgl","ck","diy","fa","ic","jp","lit","sci","tg","vr"]},{"uid":15,"name":"fgts","domain":"fgts.eu","http":true,"https":true,"software":"foolfuuka","boards":["asp","b","cm","h","hc","hm","n","p","r","s","soc","y"],"files":["asp","cm","h","hc","hm","n","p","r","s","soc","y"]},{"uid":16,"name":"maware","domain":"archive.mawa.re","http":true,"https":false,"software":"foolfuuka","boards":["t"],"files":["t"]},{"uid":17,"name":"installgentoo.com","domain":"chan.installgentoo.com","http":true,"https":false,"software":"foolfuuka","boards":["g","t"],"files":["g","t"]},{"uid":13,"name":"Foolz Beta","domain":"beta.foolz.us","http":true,"https":true,"withCredentials":true,"software":"foolfuuka","boards":["a","biz","co","d","diy","gd","h","i","jp","m","mlp","s4s","sci","sp","tg","tv","u","v","vg","vp","vr","wsg"],"files":[]},{"uid":19,"name":"Deniable Plausibility","domain":"boards.deniableplausibility.net","http":true,"https":false,"software":"foolfuuka","boards":["v"],"files":["v"]}],
|
||||||
to: function(dest, data) {
|
to: function(dest, data) {
|
||||||
var archive;
|
var archive;
|
||||||
archive = (dest === 'search' ? Redirect.data.thread : Redirect.data[dest])[data.boardID];
|
archive = (dest === 'search' ? Redirect.data.thread : Redirect.data[dest])[data.boardID];
|
||||||
@ -10940,11 +10954,10 @@
|
|||||||
},
|
},
|
||||||
focus: function() {
|
focus: function() {
|
||||||
var items, string, string2;
|
var items, string, string2;
|
||||||
this.textContent = this.innerHTML;
|
|
||||||
string = "" + g.BOARD + "." + this.className;
|
string = "" + g.BOARD + "." + this.className;
|
||||||
string2 = "" + string + ".orig";
|
string2 = "" + string + ".orig";
|
||||||
items = {
|
items = {
|
||||||
title: this.innerHTML
|
title: this.textContent
|
||||||
};
|
};
|
||||||
items[string] = '';
|
items[string] = '';
|
||||||
items[string2] = false;
|
items[string2] = false;
|
||||||
@ -10955,14 +10968,13 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
blur: function() {
|
blur: function() {
|
||||||
this.innerHTML = this.textContent;
|
|
||||||
this.contentEditable = false;
|
this.contentEditable = false;
|
||||||
return $.set("" + g.BOARD + "." + this.className, this.textContent);
|
return $.set("" + g.BOARD + "." + this.className, this.textContent);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
custom: function(child) {
|
custom: function(child) {
|
||||||
var cachedTest, string;
|
var cachedTest, string;
|
||||||
cachedTest = child.innerHTML;
|
cachedTest = child.textContent;
|
||||||
string = "" + g.BOARD + "." + child.className;
|
string = "" + g.BOARD + "." + child.className;
|
||||||
$.on(child, 'click keydown focus blur', function(e) {
|
$.on(child, 'click keydown focus blur', function(e) {
|
||||||
return Banner.cb[e.type].apply(this, [e]);
|
return Banner.cb[e.type].apply(this, [e]);
|
||||||
@ -10973,12 +10985,12 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Conf['Persistent Custom Board Titles']) {
|
if (Conf['Persistent Custom Board Titles']) {
|
||||||
return child.innerHTML = title;
|
return child.textContent = title;
|
||||||
}
|
}
|
||||||
string2 = "" + string + ".orig";
|
string2 = "" + string + ".orig";
|
||||||
return $.get(string2, cachedTest, function(itemb) {
|
return $.get(string2, cachedTest, function(itemb) {
|
||||||
if (cachedTest === itemb[string2]) {
|
if (cachedTest === itemb[string2]) {
|
||||||
return child.innerHTML = title;
|
return child.textContent = title;
|
||||||
} else {
|
} else {
|
||||||
$.set(string, cachedTest);
|
$.set(string, cachedTest);
|
||||||
return $.set(string2, cachedTest);
|
return $.set(string2, cachedTest);
|
||||||
@ -11427,11 +11439,11 @@
|
|||||||
return this.file.text.innerHTML = "<span class=file-info>" + (FileInfo.format(Conf['fileInfo'], this)) + "</span>";
|
return this.file.text.innerHTML = "<span class=file-info>" + (FileInfo.format(Conf['fileInfo'], this)) + "</span>";
|
||||||
},
|
},
|
||||||
format: function(formatString, post) {
|
format: function(formatString, post) {
|
||||||
return formatString.replace(/%([A-Za-z])/g, function(s, c) {
|
return formatString.replace(/%([A-Za-z])|[^%]+/g, function(s, c) {
|
||||||
if (c in FileInfo.formatters) {
|
if (c in FileInfo.formatters) {
|
||||||
return FileInfo.formatters[c].call(post);
|
return FileInfo.formatters[c].call(post);
|
||||||
} else {
|
} else {
|
||||||
return s;
|
return FileInfo.escape(s);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -11451,7 +11463,7 @@
|
|||||||
return name.replace(/[&"'<>]/g, function(c) {
|
return name.replace(/[&"'<>]/g, function(c) {
|
||||||
return {
|
return {
|
||||||
'&': '&',
|
'&': '&',
|
||||||
"'": ''',
|
"'": ''',
|
||||||
'"': '"',
|
'"': '"',
|
||||||
'<': '<',
|
'<': '<',
|
||||||
'>': '>'
|
'>': '>'
|
||||||
@ -13521,7 +13533,7 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
initReady: function() {
|
initReady: function() {
|
||||||
var GMver, err, href, i, passLink, styleSelector, test, v, _i, _len, _ref, _ref1;
|
var GMver, err, href, i, passLink, styleSelector, v, _i, _len, _ref, _ref1;
|
||||||
if ((_ref = d.title) === '4chan - Temporarily Offline' || _ref === '4chan - 404 Not Found') {
|
if ((_ref = d.title) === '4chan - Temporarily Offline' || _ref === '4chan - 404 Not Found') {
|
||||||
if (Conf['404 Redirect'] && g.VIEW === 'thread') {
|
if (Conf['404 Redirect'] && g.VIEW === 'thread') {
|
||||||
href = Redirect.to('thread', {
|
href = Redirect.to('thread', {
|
||||||
@ -13549,10 +13561,8 @@
|
|||||||
} else {
|
} else {
|
||||||
$.event('4chanXInitFinished');
|
$.event('4chanXInitFinished');
|
||||||
}
|
}
|
||||||
test = $.el('span');
|
if (!Conf['Show Support Message']) {
|
||||||
test.classList.add('a', 'b');
|
return;
|
||||||
if (test.className !== 'a b' && Conf['Show Support Message']) {
|
|
||||||
new Notice('warning', "Your version of Firefox is outdated (v26 minimum) and 4chan X may not operate correctly.", 30);
|
|
||||||
}
|
}
|
||||||
GMver = GM_info.version.split('.');
|
GMver = GM_info.version.split('.');
|
||||||
_ref1 = "1.14".split('.');
|
_ref1 = "1.14".split('.');
|
||||||
|
|||||||
BIN
builds/crx.crx
BIN
builds/crx.crx
Binary file not shown.
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "4chan X",
|
"name": "4chan X",
|
||||||
"version": "1.7.36",
|
"version": "1.7.37",
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"description": "Cross-browser userscript for maximum lurking on 4chan.",
|
"description": "Cross-browser userscript for maximum lurking on 4chan.",
|
||||||
"icons": {
|
"icons": {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
// Generated by CoffeeScript
|
// Generated by CoffeeScript
|
||||||
/*
|
/*
|
||||||
* 4chan X - Version 1.7.36 - 2014-05-13
|
* 4chan X - Version 1.7.37 - 2014-05-14
|
||||||
*
|
*
|
||||||
* Licensed under the MIT license.
|
* Licensed under the MIT license.
|
||||||
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
|
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
|
||||||
@ -130,7 +130,7 @@
|
|||||||
'Color User IDs': [false, 'Assign unique colors to user IDs on boards that use them'],
|
'Color User IDs': [false, 'Assign unique colors to user IDs on boards that use them'],
|
||||||
'Remove Spoilers': [false, 'Remove all spoilers in text.'],
|
'Remove Spoilers': [false, 'Remove all spoilers in text.'],
|
||||||
'Reveal Spoilers': [false, 'Indicate spoilers if Remove Spoilers is enabled, or make the text appear hovered if Remove Spoiler is disabled.'],
|
'Reveal Spoilers': [false, 'Indicate spoilers if Remove Spoilers is enabled, or make the text appear hovered if Remove Spoiler is disabled.'],
|
||||||
'Show Support Message': [true, 'Warn if your browser is unsupported. 4chan X may not operate correctly on unsupported browser versions.']
|
'Show Support Message': [true, 'Warn if your browser or configuration is unsupported and may cause 4chan X to not operate correctly.']
|
||||||
},
|
},
|
||||||
'Linkification': {
|
'Linkification': {
|
||||||
'Linkify': [true, 'Convert text into links where applicable.'],
|
'Linkify': [true, 'Convert text into links where applicable.'],
|
||||||
@ -348,7 +348,7 @@
|
|||||||
doc = d.documentElement;
|
doc = d.documentElement;
|
||||||
|
|
||||||
g = {
|
g = {
|
||||||
VERSION: '1.7.36',
|
VERSION: '1.7.37',
|
||||||
NAMESPACE: '4chan X.',
|
NAMESPACE: '4chan X.',
|
||||||
boards: {}
|
boards: {}
|
||||||
};
|
};
|
||||||
@ -528,15 +528,21 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
$.addClass = function() {
|
$.addClass = function() {
|
||||||
var className, el, _ref;
|
var className, classNames, el, _i, _len;
|
||||||
el = arguments[0], className = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
el = arguments[0], classNames = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
||||||
return (_ref = el.classList).add.apply(_ref, className);
|
for (_i = 0, _len = classNames.length; _i < _len; _i++) {
|
||||||
|
className = classNames[_i];
|
||||||
|
el.classList.add(className);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
$.rmClass = function() {
|
$.rmClass = function() {
|
||||||
var className, el, _ref;
|
var className, classNames, el, _i, _len;
|
||||||
el = arguments[0], className = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
el = arguments[0], classNames = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
||||||
return (_ref = el.classList).remove.apply(_ref, className);
|
for (_i = 0, _len = classNames.length; _i < _len; _i++) {
|
||||||
|
className = classNames[_i];
|
||||||
|
el.classList.remove(className);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
$.toggleClass = function(el, className) {
|
$.toggleClass = function(el, className) {
|
||||||
@ -2325,7 +2331,7 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
el = $.el('span', {
|
el = $.el('span', {
|
||||||
innerHTML: "Desktop notification permissions are not granted.\n[<a href='https://github.com/MayhemYDG/4chan-x/wiki/FAQ#desktop-notifications' target=_blank>FAQ</a>]<br>\n<button>Authorize</button> or <button>Disable</button>"
|
innerHTML: '4chan X needs your permission to show desktop notifications.\n[<a href=\'https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions#why-is-4chan-x-asking-for-permission-to-show-desktop-notifications\' target=_blank>FAQ</a>]<br>\n<button>Authorize</button> or <button>Disable</button>'
|
||||||
});
|
});
|
||||||
_ref = $$('button', el), authorize = _ref[0], disable = _ref[1];
|
_ref = $$('button', el), authorize = _ref[0], disable = _ref[1];
|
||||||
$.on(authorize, 'click', function() {
|
$.on(authorize, 'click', function() {
|
||||||
@ -3133,7 +3139,7 @@
|
|||||||
o.file = {
|
o.file = {
|
||||||
name: data.filename + data.ext,
|
name: data.filename + data.ext,
|
||||||
timestamp: "" + data.tim + data.ext,
|
timestamp: "" + data.tim + data.ext,
|
||||||
url: boardID === 'f' ? ("//i.4cdn.org/" + boardID + "/" + data.filename + data.ext).replace(/'/g, ''') : "//i.4cdn.org/" + boardID + "/" + data.tim + data.ext,
|
url: boardID === 'f' ? ("//i.4cdn.org/" + boardID + "/" + (encodeURIComponent(data.filename)) + data.ext).replace(/'/g, ''') : "//i.4cdn.org/" + boardID + "/" + data.tim + data.ext,
|
||||||
height: data.h,
|
height: data.h,
|
||||||
width: data.w,
|
width: data.w,
|
||||||
MD5: data.md5,
|
MD5: data.md5,
|
||||||
@ -3213,7 +3219,7 @@
|
|||||||
a.textContent = Build.shortFilename(filename);
|
a.textContent = Build.shortFilename(filename);
|
||||||
shortFilename = a.innerHTML;
|
shortFilename = a.innerHTML;
|
||||||
a.textContent = filename;
|
a.textContent = filename;
|
||||||
filename = a.innerHTML.replace(/'/g, ''');
|
filename = a.innerHTML.replace(/'/g, ''');
|
||||||
fileDims = file.name.slice(-3) === 'pdf' ? 'PDF' : "" + file.width + "x" + file.height;
|
fileDims = file.name.slice(-3) === 'pdf' ? 'PDF' : "" + file.width + "x" + file.height;
|
||||||
fileInfo = ("<div class=fileText id=fT" + postID + (file.isSpoiler ? " title='" + filename + "'" : '') + ">File: <a href='" + file.url + "' target=_blank>" + file.timestamp + "</a>") + ("-(" + fileSize + ", " + fileDims + (file.isSpoiler ? '' : ", <span" + (filename !== shortFilename ? " title='" + filename + "'" : '') + ">" + shortFilename + "</span>")) + ")</div>";
|
fileInfo = ("<div class=fileText id=fT" + postID + (file.isSpoiler ? " title='" + filename + "'" : '') + ">File: <a href='" + file.url + "' target=_blank>" + file.timestamp + "</a>") + ("-(" + fileSize + ", " + fileDims + (file.isSpoiler ? '' : ", <span" + (filename !== shortFilename ? " title='" + filename + "'" : '') + ">" + shortFilename + "</span>")) + ")</div>";
|
||||||
fileHTML = "<div class=file id=f" + postID + ">" + fileInfo + imgSrc + "</div>";
|
fileHTML = "<div class=file id=f" + postID + ">" + fileInfo + imgSrc + "</div>";
|
||||||
@ -3562,13 +3568,13 @@
|
|||||||
|
|
||||||
UI = (function() {
|
UI = (function() {
|
||||||
var Menu, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, touchend, touchmove;
|
var Menu, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, touchend, touchmove;
|
||||||
dialog = function(id, position, html) {
|
dialog = function(id, position, properties) {
|
||||||
var child, el, move, _i, _len, _ref;
|
var child, el, move, _i, _len, _ref;
|
||||||
el = $.el('div', {
|
el = $.el('div', {
|
||||||
className: 'dialog',
|
className: 'dialog',
|
||||||
innerHTML: html,
|
|
||||||
id: id
|
id: id
|
||||||
});
|
});
|
||||||
|
$.extend(el, properties);
|
||||||
el.style.cssText = position;
|
el.style.cssText = position;
|
||||||
$.get("" + id + ".position", position, function(item) {
|
$.get("" + id + ".position", position, function(item) {
|
||||||
return el.style.cssText = item["" + id + ".position"];
|
return el.style.cssText = item["" + id + ".position"];
|
||||||
@ -6243,7 +6249,9 @@
|
|||||||
dialog: function() {
|
dialog: function() {
|
||||||
var dialog, elm, event, i, items, name, node, nodes, prop, rules, save, setNode, _, _i, _len, _ref, _ref1, _ref2;
|
var dialog, elm, event, i, items, name, node, nodes, prop, rules, save, setNode, _, _i, _len, _ref, _ref1, _ref2;
|
||||||
QR.nodes = nodes = {
|
QR.nodes = nodes = {
|
||||||
el: dialog = UI.dialog('qr', 'top:0;right:0;', "<div class=move><label><input type=checkbox id=autohide title=Auto-hide>Quick Reply</label><a href=javascript:; class=close title=Close>×</a><select data-name=thread title='Create a new thread / Reply'><option value=new>New thread</option></select></div><form><div class=persona><input name=name data-name=name list=\"list-name\" placeholder=Name class=field size=1 tabindex=10><input name=email data-name=email list=\"list-email\" placeholder=E-mail class=field size=1 tabindex=20><input name=sub data-name=sub list=\"list-sub\" placeholder=Subject class=field size=1 tabindex=30> </div><div class=textarea><textarea data-name=com placeholder=Comment class=field tabindex=40></textarea><span id=char-count></span></div><div id=dump-list-container><div id=dump-list></div><a id=add-post href=javascript:; title=\"Add a post\" tabindex=50>+</a></div><div id=file-n-submit><span id=qr-filename-container class=field tabindex=60><span id=qr-no-file>No selected file</span><input id=\"qr-filename\" data-name=\"filename\" spellcheck=\"false\"><span id=qr-extras-container><a id=qr-filerm href=javascript:; title='Remove file'><i class=\"fa fa-times-circle\"></i></a><a id=url-button title='Post from url'><i class=\"fa fa-link\"></i></a><a id=dump-button title='Dump list'><i class=\"fa fa-plus-square\"></i></a></span></span><label id=qr-spoiler-label><input type=checkbox id=qr-file-spoiler title='Spoiler image' tabindex=70></label><input type=submit tabindex=80></div><input type=file multiple></form><datalist id=\"list-name\"></datalist><datalist id=\"list-email\"></datalist><datalist id=\"list-sub\"></datalist> ")
|
el: dialog = UI.dialog('qr', 'top:0;right:0;', {
|
||||||
|
innerHTML: "<div class=move><label><input type=checkbox id=autohide title=Auto-hide>Quick Reply</label><a href=javascript:; class=close title=Close>×</a><select data-name=thread title='Create a new thread / Reply'><option value=new>New thread</option></select></div><form><div class=persona><input name=name data-name=name list=\"list-name\" placeholder=Name class=field size=1 tabindex=10><input name=email data-name=email list=\"list-email\" placeholder=E-mail class=field size=1 tabindex=20><input name=sub data-name=sub list=\"list-sub\" placeholder=Subject class=field size=1 tabindex=30> </div><div class=textarea><textarea data-name=com placeholder=Comment class=field tabindex=40></textarea><span id=char-count></span></div><div id=dump-list-container><div id=dump-list></div><a id=add-post href=javascript:; title=\"Add a post\" tabindex=50>+</a></div><div id=file-n-submit><span id=qr-filename-container class=field tabindex=60><span id=qr-no-file>No selected file</span><input id=\"qr-filename\" data-name=\"filename\" spellcheck=\"false\"><span id=qr-extras-container><a id=qr-filerm href=javascript:; title='Remove file'><i class=\"fa fa-times-circle\"></i></a><a id=url-button title='Post from url'><i class=\"fa fa-link\"></i></a><a id=dump-button title='Dump list'><i class=\"fa fa-plus-square\"></i></a></span></span><label id=qr-spoiler-label><input type=checkbox id=qr-file-spoiler title='Spoiler image' tabindex=70></label><input type=submit tabindex=80></div><input type=file multiple></form><datalist id=\"list-name\"></datalist><datalist id=\"list-email\"></datalist><datalist id=\"list-sub\"></datalist> "
|
||||||
|
})
|
||||||
};
|
};
|
||||||
setNode = function(name, query) {
|
setNode = function(name, query) {
|
||||||
return nodes[name] = $(query, dialog);
|
return nodes[name] = $(query, dialog);
|
||||||
@ -6299,7 +6307,7 @@
|
|||||||
if (g.BOARD.ID === 'f') {
|
if (g.BOARD.ID === 'f') {
|
||||||
nodes.flashTag = $.el('select', {
|
nodes.flashTag = $.el('select', {
|
||||||
name: 'filetag',
|
name: 'filetag',
|
||||||
innerHTML: "<option value=0>Hentai</option>\n<option value=6>Porn</option>\n<option value=1>Japanese</option>\n<option value=2>Anime</option>\n<option value=3>Game</option>\n<option value=5>Loop</option>\n<option value=4 selected>Other</option>"
|
innerHTML: '<option value=0>Hentai</option>\n<option value=6>Porn</option>\n<option value=1>Japanese</option>\n<option value=2>Anime</option>\n<option value=3>Game</option>\n<option value=5>Loop</option>\n<option value=4 selected>Other</option>'
|
||||||
});
|
});
|
||||||
nodes.flashTag.dataset["default"] = '4';
|
nodes.flashTag.dataset["default"] = '4';
|
||||||
$.add(nodes.form, nodes.flashTag);
|
$.add(nodes.form, nodes.flashTag);
|
||||||
@ -6481,7 +6489,7 @@
|
|||||||
QR.cooldown.auto = false;
|
QR.cooldown.auto = false;
|
||||||
QR.status();
|
QR.status();
|
||||||
return QR.error($.el('span', {
|
return QR.error($.el('span', {
|
||||||
innerHTML: "4chan X encountered an error while posting. \n[<a href=\"//4chan.org/banned\" target=_blank>Banned?</a>] [<a href=\"https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions#what-does-4chan-x-encountered-an-error-while-posting-please-try-again-mean\" target=_blank>More info</a>]"
|
innerHTML: '4chan X encountered an error while posting. \n[<a href="//4chan.org/banned" target=_blank>Banned?</a>] [<a href="https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions#what-does-4chan-x-encountered-an-error-while-posting-please-try-again-mean" target=_blank>More info</a>]'
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -7538,7 +7546,7 @@
|
|||||||
nodes = Gallery.nodes = {};
|
nodes = Gallery.nodes = {};
|
||||||
nodes.el = dialog = $.el('div', {
|
nodes.el = dialog = $.el('div', {
|
||||||
id: 'a-gallery',
|
id: 'a-gallery',
|
||||||
innerHTML: "<div class=gal-viewport>\n <span class=gal-buttons>\n <a class=\"menu-button\" href=\"javascript:;\"><i></i></a>\n <a href=javascript:; class=gal-close>×</a>\n </span>\n <a class=gal-name target=\"_blank\"></a>\n <span class=gal-count><span class='count'></span> / <span class='total'></span></a></span>\n <div class=gal-prev></div>\n <div class=gal-image>\n <a href=javascript:;><img></a>\n </div>\n <div class=gal-next></div>\n</div>\n<div class=gal-thumbnails></div>"
|
innerHTML: '<div class=gal-viewport>\n <span class=gal-buttons>\n <a class="menu-button" href="javascript:;"><i></i></a>\n <a href=javascript:; class=gal-close>×</a>\n </span>\n <a class=gal-name target="_blank"></a>\n <span class=gal-count><span class=\'count\'></span> / <span class=\'total\'></span></a></span>\n <div class=gal-prev></div>\n <div class=gal-image>\n <a href=javascript:;><img></a>\n </div>\n <div class=gal-next></div>\n</div>\n<div class=gal-thumbnails></div>'
|
||||||
});
|
});
|
||||||
_ref = {
|
_ref = {
|
||||||
frame: '.gal-image',
|
frame: '.gal-image',
|
||||||
@ -9425,7 +9433,7 @@
|
|||||||
}
|
}
|
||||||
if (Conf['Updater and Stats in Header']) {
|
if (Conf['Updater and Stats in Header']) {
|
||||||
this.dialog = sc = $.el('span', {
|
this.dialog = sc = $.el('span', {
|
||||||
innerHTML: "<span id=post-count>0</span> / <span id=file-count>0</span>" + (Conf["Page Count in Stats"] ? " / <span id=page-count>0</span>" : ""),
|
innerHTML: "<span id=post-count>0</span> / <span id=file-count>0</span>" + (Conf['Page Count in Stats'] ? ' / <span id=page-count>0</span>' : ''),
|
||||||
id: 'thread-stats',
|
id: 'thread-stats',
|
||||||
title: 'Post Count / File Count' + (Conf["Page Count in Stats"] ? " / Page Count" : "")
|
title: 'Post Count / File Count' + (Conf["Page Count in Stats"] ? " / Page Count" : "")
|
||||||
});
|
});
|
||||||
@ -9433,7 +9441,9 @@
|
|||||||
return Header.addShortcut(sc);
|
return Header.addShortcut(sc);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.dialog = sc = UI.dialog('thread-stats', 'bottom: 0px; right: 0px;', "<div class=move title='Post Count / File Count" + (Conf["Page Count in Stats"] ? " / Page Count" : "") + "'><span id=post-count>0</span> / <span id=file-count>0</span>" + (Conf["Page Count in Stats"] ? " / <span id=page-count>0</span>" : "") + "</div>");
|
this.dialog = sc = UI.dialog('thread-stats', 'bottom: 0px; right: 0px;', {
|
||||||
|
innerHTML: "<div class=move title='Post Count / File Count" + (Conf['Page Count in Stats'] ? ' / Page Count' : '') + "'><span id=post-count>0</span> / <span id=file-count>0</span>" + (Conf['Page Count in Stats'] ? ' / <span id=page-count>0</span>' : '') + "</div>"
|
||||||
|
});
|
||||||
$.ready((function(_this) {
|
$.ready((function(_this) {
|
||||||
return function() {
|
return function() {
|
||||||
return $.add(d.body, sc);
|
return $.add(d.body, sc);
|
||||||
@ -9544,14 +9554,16 @@
|
|||||||
}
|
}
|
||||||
if (Conf['Updater and Stats in Header']) {
|
if (Conf['Updater and Stats in Header']) {
|
||||||
this.dialog = sc = $.el('span', {
|
this.dialog = sc = $.el('span', {
|
||||||
innerHTML: "<span id=update-status></span><span id=update-timer title='Update now'></span>",
|
innerHTML: '<span id=update-status></span><span id=update-timer title="Update now"></span>',
|
||||||
id: 'updater'
|
id: 'updater'
|
||||||
});
|
});
|
||||||
$.ready(function() {
|
$.ready(function() {
|
||||||
return Header.addShortcut(sc);
|
return Header.addShortcut(sc);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.dialog = sc = UI.dialog('updater', 'bottom: 0px; left: 0px;', "<div class=move></div><span id=update-status></span><span id=update-timer title='Update now'></span>");
|
this.dialog = sc = UI.dialog('updater', 'bottom: 0px; left: 0px;', {
|
||||||
|
innerHTML: '<div class=move></div><span id=update-status></span><span id=update-timer title="Update now"></span>'
|
||||||
|
});
|
||||||
$.addClass(doc, 'float');
|
$.addClass(doc, 'float');
|
||||||
$.ready((function(_this) {
|
$.ready((function(_this) {
|
||||||
return function() {
|
return function() {
|
||||||
@ -9953,7 +9965,9 @@
|
|||||||
className: 'disabled fa fa-eye'
|
className: 'disabled fa fa-eye'
|
||||||
});
|
});
|
||||||
this.db = new DataBoard('watchedThreads', this.refresh, true);
|
this.db = new DataBoard('watchedThreads', this.refresh, true);
|
||||||
this.dialog = UI.dialog('thread-watcher', 'top: 50px; left: 0px;', "<div class=\"move\">Thread Watcher <span id=\"watcher-status\"></span><a class=\"menu-button\" href=\"javascript:;\"><i class=\"fa fa-angle-down\"></i></a><a class=close href=javascript:;>×</a></span></div><div id=\"watched-threads\"></div>");
|
this.dialog = UI.dialog('thread-watcher', 'top: 50px; left: 0px;', {
|
||||||
|
innerHTML: "<div class=\"move\">Thread Watcher <span id=\"watcher-status\"></span><a class=\"menu-button\" href=\"javascript:;\"><i class=\"fa fa-angle-down\"></i></a><a class=close href=javascript:;>×</a></span></div><div id=\"watched-threads\"></div>"
|
||||||
|
});
|
||||||
this.status = $('#watcher-status', this.dialog);
|
this.status = $('#watcher-status', this.dialog);
|
||||||
this.list = this.dialog.lastElementChild;
|
this.list = this.dialog.lastElementChild;
|
||||||
$.on(d, 'QRPostSuccessful', this.cb.post);
|
$.on(d, 'QRPostSuccessful', this.cb.post);
|
||||||
@ -10770,7 +10784,7 @@
|
|||||||
}
|
}
|
||||||
return Redirect.data = o;
|
return Redirect.data = o;
|
||||||
},
|
},
|
||||||
archives: [{"uid":0,"name":"Foolz","domain":"archive.foolz.us","http":true,"https":true,"software":"foolfuuka","boards":["a","biz","co","diy","gd","jp","m","sci","sp","tg","tv","vg","vp","vr","wsg"],"files":["a","biz","diy","gd","jp","m","sci","tg","vg","vp","vr","wsg"]},{"uid":1,"name":"NSFW Foolz","domain":"nsfw.foolz.us","http":true,"https":true,"software":"foolfuuka","boards":["u"],"files":["u"]},{"uid":2,"name":"The Dark Cave","domain":"archive.thedarkcave.org","http":true,"https":true,"software":"foolfuuka","boards":["c","int","out","po"],"files":["c","po"]},{"uid":3,"name":"4plebs Archive","domain":"archive.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["adv","hr","o","pol","s4s","tg","trv","tv","x"],"files":["adv","hr","o","pol","s4s","tg","trv","tv","x"]},{"uid":18,"name":"4plebs Flash Archive","domain":"flash.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["f"],"files":["f"]},{"uid":4,"name":"Nyafuu","domain":"archive.nyafuu.org","http":true,"https":true,"software":"foolfuuka","boards":["c","e","w","wg"],"files":["c","e","w","wg"]},{"uid":5,"name":"Love is Over","domain":"archive.loveisover.me","http":true,"https":true,"software":"foolfuuka","boards":["d","i","lgbt"],"files":["d","i","lgbt"]},{"uid":8,"name":"Rebecca Black Tech","domain":"rbt.asia","http":false,"https":true,"software":"fuuka","boards":["cgl","g","mu","w"],"files":["cgl","g","mu","w"]},{"uid":9,"name":"Heinessen","domain":"archive.heinessen.com","http":true,"https":false,"software":"fuuka","boards":["an","fit","k","mlp","r9k","toy"],"files":["an","fit","k","mlp","r9k","toy"]},{"uid":10,"name":"warosu","domain":"fuuka.warosu.org","http":false,"https":true,"software":"fuuka","boards":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"],"files":["3","biz","cgl","ck","diy","fa","ic","jp","lit","sci","tg","vr"]},{"uid":15,"name":"fgts","domain":"fgts.eu","http":true,"https":true,"software":"foolfuuka","boards":["asp","b","cm","h","hc","hm","n","p","r","s","soc","y"],"files":["asp","cm","h","hc","hm","n","p","r","s","soc","y"]},{"uid":16,"name":"maware","domain":"archive.mawa.re","http":true,"https":false,"software":"foolfuuka","boards":["t"],"files":["t"]},{"uid":17,"name":"installgentoo.com","domain":"chan.installgentoo.com","http":true,"https":false,"software":"foolfuuka","boards":["g","t"],"files":["g","t"]},{"uid":19,"name":"Innovandalism Archive","domain":"boards.innovandalism.eu","http":true,"https":false,"software":"foolfuuka","boards":["v"],"files":[]},{"uid":13,"name":"Foolz Beta","domain":"beta.foolz.us","http":true,"https":true,"withCredentials":true,"software":"foolfuuka","boards":["a","biz","co","d","diy","gd","h","i","jp","m","mlp","s4s","sci","sp","tg","tv","u","v","vg","vp","vr","wsg"],"files":[]}],
|
archives: [{"uid":0,"name":"Foolz","domain":"archive.foolz.us","http":true,"https":true,"software":"foolfuuka","boards":["a","biz","co","diy","gd","jp","m","sci","sp","tg","tv","vg","vp","vr","wsg"],"files":["a","biz","diy","gd","jp","m","sci","tg","vg","vp","vr","wsg"]},{"uid":1,"name":"NSFW Foolz","domain":"nsfw.foolz.us","http":true,"https":true,"software":"foolfuuka","boards":["u"],"files":["u"]},{"uid":2,"name":"The Dark Cave","domain":"archive.thedarkcave.org","http":true,"https":true,"software":"foolfuuka","boards":["c","int","out","po"],"files":["c","po"]},{"uid":3,"name":"4plebs Archive","domain":"archive.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["adv","hr","o","pol","s4s","tg","trv","tv","x"],"files":["adv","hr","o","pol","s4s","tg","trv","tv","x"]},{"uid":18,"name":"4plebs Flash Archive","domain":"flash.4plebs.org","http":true,"https":true,"software":"foolfuuka","boards":["f"],"files":["f"]},{"uid":4,"name":"Nyafuu","domain":"archive.nyafuu.org","http":true,"https":true,"software":"foolfuuka","boards":["c","e","w","wg"],"files":["c","e","w","wg"]},{"uid":5,"name":"Love is Over","domain":"archive.loveisover.me","http":true,"https":true,"software":"foolfuuka","boards":["d","i","lgbt"],"files":["d","i","lgbt"]},{"uid":8,"name":"Rebecca Black Tech","domain":"rbt.asia","http":false,"https":true,"software":"fuuka","boards":["cgl","g","mu","w"],"files":["cgl","g","mu","w"]},{"uid":9,"name":"Heinessen","domain":"archive.heinessen.com","http":true,"https":false,"software":"fuuka","boards":["an","fit","k","mlp","r9k","toy"],"files":["an","fit","k","mlp","r9k","toy"]},{"uid":10,"name":"warosu","domain":"fuuka.warosu.org","http":false,"https":true,"software":"fuuka","boards":["3","biz","cgl","ck","diy","fa","g","ic","jp","lit","sci","tg","vr"],"files":["3","biz","cgl","ck","diy","fa","ic","jp","lit","sci","tg","vr"]},{"uid":15,"name":"fgts","domain":"fgts.eu","http":true,"https":true,"software":"foolfuuka","boards":["asp","b","cm","h","hc","hm","n","p","r","s","soc","y"],"files":["asp","cm","h","hc","hm","n","p","r","s","soc","y"]},{"uid":16,"name":"maware","domain":"archive.mawa.re","http":true,"https":false,"software":"foolfuuka","boards":["t"],"files":["t"]},{"uid":17,"name":"installgentoo.com","domain":"chan.installgentoo.com","http":true,"https":false,"software":"foolfuuka","boards":["g","t"],"files":["g","t"]},{"uid":13,"name":"Foolz Beta","domain":"beta.foolz.us","http":true,"https":true,"withCredentials":true,"software":"foolfuuka","boards":["a","biz","co","d","diy","gd","h","i","jp","m","mlp","s4s","sci","sp","tg","tv","u","v","vg","vp","vr","wsg"],"files":[]},{"uid":19,"name":"Deniable Plausibility","domain":"boards.deniableplausibility.net","http":true,"https":false,"software":"foolfuuka","boards":["v"],"files":["v"]}],
|
||||||
to: function(dest, data) {
|
to: function(dest, data) {
|
||||||
var archive;
|
var archive;
|
||||||
archive = (dest === 'search' ? Redirect.data.thread : Redirect.data[dest])[data.boardID];
|
archive = (dest === 'search' ? Redirect.data.thread : Redirect.data[dest])[data.boardID];
|
||||||
@ -10943,11 +10957,10 @@
|
|||||||
},
|
},
|
||||||
focus: function() {
|
focus: function() {
|
||||||
var items, string, string2;
|
var items, string, string2;
|
||||||
this.textContent = this.innerHTML;
|
|
||||||
string = "" + g.BOARD + "." + this.className;
|
string = "" + g.BOARD + "." + this.className;
|
||||||
string2 = "" + string + ".orig";
|
string2 = "" + string + ".orig";
|
||||||
items = {
|
items = {
|
||||||
title: this.innerHTML
|
title: this.textContent
|
||||||
};
|
};
|
||||||
items[string] = '';
|
items[string] = '';
|
||||||
items[string2] = false;
|
items[string2] = false;
|
||||||
@ -10958,14 +10971,13 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
blur: function() {
|
blur: function() {
|
||||||
this.innerHTML = this.textContent;
|
|
||||||
this.contentEditable = false;
|
this.contentEditable = false;
|
||||||
return $.set("" + g.BOARD + "." + this.className, this.textContent);
|
return $.set("" + g.BOARD + "." + this.className, this.textContent);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
custom: function(child) {
|
custom: function(child) {
|
||||||
var cachedTest, string;
|
var cachedTest, string;
|
||||||
cachedTest = child.innerHTML;
|
cachedTest = child.textContent;
|
||||||
string = "" + g.BOARD + "." + child.className;
|
string = "" + g.BOARD + "." + child.className;
|
||||||
$.on(child, 'click keydown focus blur', function(e) {
|
$.on(child, 'click keydown focus blur', function(e) {
|
||||||
return Banner.cb[e.type].apply(this, [e]);
|
return Banner.cb[e.type].apply(this, [e]);
|
||||||
@ -10976,12 +10988,12 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Conf['Persistent Custom Board Titles']) {
|
if (Conf['Persistent Custom Board Titles']) {
|
||||||
return child.innerHTML = title;
|
return child.textContent = title;
|
||||||
}
|
}
|
||||||
string2 = "" + string + ".orig";
|
string2 = "" + string + ".orig";
|
||||||
return $.get(string2, cachedTest, function(itemb) {
|
return $.get(string2, cachedTest, function(itemb) {
|
||||||
if (cachedTest === itemb[string2]) {
|
if (cachedTest === itemb[string2]) {
|
||||||
return child.innerHTML = title;
|
return child.textContent = title;
|
||||||
} else {
|
} else {
|
||||||
$.set(string, cachedTest);
|
$.set(string, cachedTest);
|
||||||
return $.set(string2, cachedTest);
|
return $.set(string2, cachedTest);
|
||||||
@ -11430,11 +11442,11 @@
|
|||||||
return this.file.text.innerHTML = "<span class=file-info>" + (FileInfo.format(Conf['fileInfo'], this)) + "</span>";
|
return this.file.text.innerHTML = "<span class=file-info>" + (FileInfo.format(Conf['fileInfo'], this)) + "</span>";
|
||||||
},
|
},
|
||||||
format: function(formatString, post) {
|
format: function(formatString, post) {
|
||||||
return formatString.replace(/%([A-Za-z])/g, function(s, c) {
|
return formatString.replace(/%([A-Za-z])|[^%]+/g, function(s, c) {
|
||||||
if (c in FileInfo.formatters) {
|
if (c in FileInfo.formatters) {
|
||||||
return FileInfo.formatters[c].call(post);
|
return FileInfo.formatters[c].call(post);
|
||||||
} else {
|
} else {
|
||||||
return s;
|
return FileInfo.escape(s);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -11454,7 +11466,7 @@
|
|||||||
return name.replace(/[&"'<>]/g, function(c) {
|
return name.replace(/[&"'<>]/g, function(c) {
|
||||||
return {
|
return {
|
||||||
'&': '&',
|
'&': '&',
|
||||||
"'": ''',
|
"'": ''',
|
||||||
'"': '"',
|
'"': '"',
|
||||||
'<': '<',
|
'<': '<',
|
||||||
'>': '>'
|
'>': '>'
|
||||||
@ -13554,6 +13566,9 @@
|
|||||||
} else {
|
} else {
|
||||||
$.event('4chanXInitFinished');
|
$.event('4chanXInitFinished');
|
||||||
}
|
}
|
||||||
|
if (!Conf['Show Support Message']) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
return localStorage.getItem('4chan-settings');
|
return localStorage.getItem('4chan-settings');
|
||||||
} catch (_error) {
|
} catch (_error) {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
|
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
|
||||||
<app appid='lacclbnghgdicfifcamcmcnilckjamag'>
|
<app appid='lacclbnghgdicfifcamcmcnilckjamag'>
|
||||||
<updatecheck codebase='https://ccd0.github.io/4chan-x/builds/crx.crx' version='1.7.36' />
|
<updatecheck codebase='https://ccd0.github.io/4chan-x/builds/crx.crx' version='1.7.37' />
|
||||||
</app>
|
</app>
|
||||||
</gupdate>
|
</gupdate>
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "4chan-X",
|
"name": "4chan-X",
|
||||||
"version": "1.7.36",
|
"version": "1.7.37",
|
||||||
"description": "Cross-browser userscript for maximum lurking on 4chan.",
|
"description": "Cross-browser userscript for maximum lurking on 4chan.",
|
||||||
"meta": {
|
"meta": {
|
||||||
"name": "4chan X",
|
"name": "4chan X",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user