Start working on the new HTML format.
This commit is contained in:
parent
77cc33ad75
commit
55cbf0ddf4
@ -72,7 +72,7 @@
|
||||
*/
|
||||
|
||||
(function() {
|
||||
var $, $$, Anonymize, AutoGif, Conf, Config, ExpandComment, ExpandThread, Favicon, FileInfo, Filter, GetTitle, ImageExpand, ImageHover, Keybinds, Main, Nav, Options, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, Quotify, Redirect, ReplyHiding, ReportButton, RevealSpoilers, Sauce, StrikethroughQuotes, ThreadHiding, ThreadStats, Threading, Time, TitlePost, UI, Unread, Updater, Watcher, d, g, _base;
|
||||
var $, $$, Anonymize, AutoGif, Conf, Config, ExpandComment, ExpandThread, Favicon, FileInfo, Filter, GetTitle, ImageExpand, ImageHover, Keybinds, Main, Nav, Options, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, Quotify, Redirect, ReplyHiding, ReportButton, RevealSpoilers, Sauce, StrikethroughQuotes, ThreadHiding, ThreadStats, Time, TitlePost, UI, Unread, Updater, Watcher, d, g, _base;
|
||||
|
||||
Config = {
|
||||
main: {
|
||||
@ -791,7 +791,6 @@
|
||||
}
|
||||
doc = d.implementation.createHTMLDocument('');
|
||||
doc.documentElement.innerHTML = req.response;
|
||||
Threading.op($('body > form', doc).firstChild);
|
||||
node = d.importNode(doc.getElementById(replyID));
|
||||
quotes = node.getElementsByClassName('quotelink');
|
||||
for (_i = 0, _len = quotes.length; _i < _len; _i++) {
|
||||
@ -1347,7 +1346,7 @@
|
||||
}
|
||||
return $('textarea', QR.el).focus();
|
||||
});
|
||||
$.before($('form[name=post]'), link);
|
||||
$.before($.id('postForm'), link);
|
||||
}
|
||||
script = $.el('script', {
|
||||
textContent: 'Recaptcha.focus_response_field=function(){}'
|
||||
@ -1841,7 +1840,7 @@
|
||||
});
|
||||
ta.style.cssText = $.get('QR.size', '');
|
||||
}
|
||||
mimeTypes = $('.rules').firstChild.textContent.match(/: (.+) /)[1].toLowerCase().replace(/\w+/g, function(type) {
|
||||
mimeTypes = $('ul.rules').firstElementChild.textContent.match(/: (.+) /)[1].toLowerCase().replace(/\w+/g, function(type) {
|
||||
switch (type) {
|
||||
case 'jpg':
|
||||
return 'image/jpeg';
|
||||
@ -2379,46 +2378,6 @@
|
||||
}
|
||||
};
|
||||
|
||||
Threading = {
|
||||
op: function(node) {
|
||||
var nodes, op;
|
||||
nodes = [];
|
||||
while (node.nodeName !== 'BLOCKQUOTE') {
|
||||
nodes.push(node);
|
||||
node = node.nextSibling;
|
||||
}
|
||||
nodes.push(node);
|
||||
node = node.nextSibling;
|
||||
op = $.el('div', {
|
||||
className: 'op'
|
||||
});
|
||||
$.add(op, nodes);
|
||||
op.id = $('input', op).name;
|
||||
return $.before(node, op);
|
||||
},
|
||||
thread: function(node) {
|
||||
var div, nodes;
|
||||
node = Threading.op(node);
|
||||
if (g.REPLY) {
|
||||
return;
|
||||
}
|
||||
nodes = [];
|
||||
while (node.nodeName !== 'HR') {
|
||||
nodes.push(node);
|
||||
node = node.nextElementSibling;
|
||||
}
|
||||
div = $.el('div', {
|
||||
className: 'thread'
|
||||
});
|
||||
$.add(div, nodes);
|
||||
$.before(node, div);
|
||||
node = node.nextElementSibling;
|
||||
if (!(node.align || node.nodeName === 'CENTER')) {
|
||||
return Threading.thread(node);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ThreadHiding = {
|
||||
init: function() {
|
||||
var a, hiddenThreads, op, thread, _i, _len, _ref;
|
||||
@ -3078,18 +3037,19 @@
|
||||
};
|
||||
|
||||
GetTitle = function(thread) {
|
||||
var el, span;
|
||||
el = $('.filetitle', thread);
|
||||
var el, op, span;
|
||||
op = $('.op', thread);
|
||||
el = $('.subject', op);
|
||||
if (!el.textContent) {
|
||||
el = $('blockquote', thread);
|
||||
el = $('blockquote', op);
|
||||
if (!el.textContent) {
|
||||
el = $('.postername', thread);
|
||||
el = $('.nameBlock', op);
|
||||
}
|
||||
}
|
||||
span = $.el('span', {
|
||||
innerHTML: el.innerHTML.replace(/<br>/g, ' ')
|
||||
});
|
||||
return "/" + g.BOARD + "/ - " + span.textContent;
|
||||
return "/" + g.BOARD + "/ - " + (span.textContent.trim());
|
||||
};
|
||||
|
||||
TitlePost = {
|
||||
@ -3254,7 +3214,7 @@
|
||||
}
|
||||
doc = d.implementation.createHTMLDocument('');
|
||||
doc.documentElement.innerHTML = req.response;
|
||||
node = id === threadID ? Threading.op($('body > form', doc).firstChild) : doc.getElementById(id);
|
||||
node = doc.getElementById(id);
|
||||
newInline = QuoteInline.table(id, node.innerHTML);
|
||||
_ref = $$('.quotelink', newInline);
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
@ -3355,7 +3315,7 @@
|
||||
}
|
||||
doc = d.implementation.createHTMLDocument('');
|
||||
doc.documentElement.innerHTML = req.response;
|
||||
node = id === threadID ? Threading.op($('body > form', doc).firstChild) : doc.getElementById(id);
|
||||
node = doc.getElementById(id);
|
||||
qp.innerHTML = node.innerHTML;
|
||||
post = {
|
||||
root: qp,
|
||||
@ -3961,7 +3921,6 @@
|
||||
val = Conf[key];
|
||||
Conf[key] = $.get(key, val);
|
||||
}
|
||||
$.on(window, 'message', Main.message);
|
||||
switch (location.hostname) {
|
||||
case 'sys.4chan.org':
|
||||
if (/report/.test(location.search)) {
|
||||
@ -3984,11 +3943,12 @@
|
||||
}
|
||||
$.ready(Options.init);
|
||||
if (Conf['Quick Reply'] && Conf['Hide Original Post Form'] && g.BOARD !== 'f') {
|
||||
Main.css += 'form[name=post] { display: none; }';
|
||||
Main.css += '#postForm { display: none; }';
|
||||
}
|
||||
Main.addStyle();
|
||||
now = Date.now();
|
||||
if (Conf['Check for Updates'] && $.get('lastUpdate', 0) < now - 6 * $.HOUR) {
|
||||
$.on(window, 'message', Main.message);
|
||||
$.ready(function() {
|
||||
return $.add(d.head, $.el('script', {
|
||||
src: 'https://raw.github.com/mayhemydg/4chan-x/master/latest.js'
|
||||
@ -4071,7 +4031,7 @@
|
||||
return $.ready(Main.ready);
|
||||
},
|
||||
ready: function() {
|
||||
var MutationObserver, form, nav, node, nodes, observer, _i, _j, _len, _len1, _ref, _ref1;
|
||||
var MutationObserver, a, board, nav, node, nodes, observer, _i, _j, _len, _len1, _ref, _ref1;
|
||||
if (d.title === '4chan - 404') {
|
||||
Redirect.init();
|
||||
return;
|
||||
@ -4081,13 +4041,13 @@
|
||||
}
|
||||
$.addClass(d.body, "chanx_" + (Main.version.split('.')[1]));
|
||||
$.addClass(d.body, $.engine);
|
||||
_ref = ['navtop', 'navbot'];
|
||||
_ref = ['boardNavDesktop', 'boardNavDesktopFoot'];
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
nav = _ref[_i];
|
||||
$.addClass($("a[href$='/" + g.BOARD + "/']", $.id(nav)), 'current');
|
||||
if (a = $("a[href$='/" + g.BOARD + "/']", $.id(nav))) {
|
||||
$.addClass(a, 'current');
|
||||
}
|
||||
}
|
||||
form = $('form[name=delform]');
|
||||
Threading.thread(form.firstElementChild);
|
||||
Favicon.init();
|
||||
if (Conf['Quick Reply']) {
|
||||
QR.init();
|
||||
@ -4147,8 +4107,9 @@
|
||||
});
|
||||
}
|
||||
}
|
||||
board = $('.board');
|
||||
nodes = [];
|
||||
_ref1 = $$('.op, a + table', form);
|
||||
_ref1 = $$('.post', board);
|
||||
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
||||
node = _ref1[_j];
|
||||
nodes.push(Main.preParse(node));
|
||||
@ -4156,12 +4117,12 @@
|
||||
Main.node(nodes, true);
|
||||
if (MutationObserver = window.WebKitMutationObserver || window.MozMutationObserver || window.OMutationObserver || window.MutationObserver) {
|
||||
observer = new MutationObserver(Main.observer);
|
||||
return observer.observe(form, {
|
||||
return observer.observe(board, {
|
||||
childList: true,
|
||||
subtree: true
|
||||
});
|
||||
} else {
|
||||
return $.on(form, 'DOMNodeInserted', Main.listener);
|
||||
return $.on(board, 'DOMNodeInserted', Main.listener);
|
||||
}
|
||||
},
|
||||
flatten: function(parent, obj) {
|
||||
@ -4196,13 +4157,13 @@
|
||||
var klass, post;
|
||||
klass = node.className;
|
||||
post = {
|
||||
root: node,
|
||||
el: klass === 'op' ? node : node.firstChild.firstChild.lastChild,
|
||||
root: node.parentNode,
|
||||
el: node,
|
||||
"class": klass,
|
||||
id: node.getElementsByTagName('input')[0].name,
|
||||
threadId: g.THREAD_ID || $.x('ancestor::div[@class="thread"]', node).firstChild.id,
|
||||
id: node.id.slice(1),
|
||||
threadId: g.THREAD_ID || $.x('ancestor::div[@class="thread"]', node).id.slice(1),
|
||||
isInlined: /\binline\b/.test(klass),
|
||||
filesize: node.getElementsByClassName('filesize')[0] || false,
|
||||
fileinfo: node.getElementsByClassName('fileInfo')[0] || false,
|
||||
quotes: node.getElementsByClassName('quotelink'),
|
||||
backlinks: node.getElementsByClassName('backlink')
|
||||
};
|
||||
@ -4275,6 +4236,9 @@ a[href="javascript:;"] {\
|
||||
display: none;\
|
||||
}\
|
||||
\
|
||||
h1 {\
|
||||
text-align: center;\
|
||||
}\
|
||||
.autohide:not(:hover) > form {\
|
||||
display: none;\
|
||||
}\
|
||||
|
||||
100
script.coffee
100
script.coffee
@ -628,7 +628,6 @@ ExpandComment =
|
||||
doc = d.implementation.createHTMLDocument ''
|
||||
doc.documentElement.innerHTML = req.response
|
||||
|
||||
Threading.op $('body > form', doc).firstChild
|
||||
# Import the node to fix quote.hashes
|
||||
# as they're empty when in a different document.
|
||||
node = d.importNode doc.getElementById replyID
|
||||
@ -1014,9 +1013,9 @@ QR =
|
||||
link = $.el 'h1', innerHTML: "<a href=javascript:;>#{if g.REPLY then 'Quick Reply' else 'New Thread'}</a>"
|
||||
$.on link.firstChild, 'click', ->
|
||||
QR.open()
|
||||
$('select', QR.el).value = 'new' unless g.REPLY
|
||||
$('select', QR.el).value = 'new' unless g.REPLY
|
||||
$('textarea', QR.el).focus()
|
||||
$.before $('form[name=post]'), link
|
||||
$.before $.id('postForm'), link
|
||||
|
||||
# Prevent original captcha input from being focused on reload.
|
||||
script = $.el 'script',
|
||||
@ -1405,7 +1404,7 @@ QR =
|
||||
ta.style.cssText = $.get 'QR.size', ''
|
||||
|
||||
# Allow only this board's supported files.
|
||||
mimeTypes = $('.rules').firstChild.textContent.match(/: (.+) /)[1].toLowerCase().replace /\w+/g, (type) ->
|
||||
mimeTypes = $('ul.rules').firstElementChild.textContent.match(/: (.+) /)[1].toLowerCase().replace /\w+/g, (type) ->
|
||||
switch type
|
||||
when 'jpg'
|
||||
'image/jpeg'
|
||||
@ -1876,39 +1875,6 @@ Options =
|
||||
Unread.update true
|
||||
@nextElementSibling.innerHTML = "<img src=#{Favicon.unreadSFW}> <img src=#{Favicon.unreadNSFW}> <img src=#{Favicon.unreadDead}>"
|
||||
|
||||
Threading =
|
||||
op: (node) ->
|
||||
nodes = []
|
||||
until node.nodeName is 'BLOCKQUOTE'
|
||||
nodes.push node
|
||||
node = node.nextSibling
|
||||
nodes.push node # Add the blockquote.
|
||||
node = node.nextSibling
|
||||
op = $.el 'div',
|
||||
className: 'op'
|
||||
$.add op, nodes
|
||||
op.id = $('input', op).name
|
||||
$.before node, op
|
||||
|
||||
thread: (node) ->
|
||||
node = Threading.op node
|
||||
|
||||
return if g.REPLY
|
||||
|
||||
nodes = []
|
||||
until node.nodeName is 'HR'
|
||||
nodes.push node
|
||||
node = node.nextElementSibling # Skip text nodes.
|
||||
div = $.el 'div',
|
||||
className: 'thread'
|
||||
$.add div, nodes
|
||||
$.before node, div
|
||||
|
||||
node = node.nextElementSibling
|
||||
# {N,}SFW
|
||||
unless node.align or node.nodeName is 'CENTER'
|
||||
Threading.thread node
|
||||
|
||||
ThreadHiding =
|
||||
init: ->
|
||||
hiddenThreads = $.get "hiddenThreads/#{g.BOARD}/", {}
|
||||
@ -2407,13 +2373,14 @@ FileInfo =
|
||||
r: -> FileInfo.data.resolution
|
||||
|
||||
GetTitle = (thread) ->
|
||||
el = $ '.filetitle', thread
|
||||
if not el.textContent
|
||||
el = $ 'blockquote', thread
|
||||
if not el.textContent
|
||||
el = $ '.postername', thread
|
||||
op = $ '.op', thread
|
||||
el = $ '.subject', op
|
||||
unless el.textContent
|
||||
el = $ 'blockquote', op
|
||||
unless el.textContent
|
||||
el = $ '.nameBlock', op
|
||||
span = $.el 'span', innerHTML: el.innerHTML.replace /<br>/g, ' '
|
||||
"/#{g.BOARD}/ - #{span.textContent}"
|
||||
"/#{g.BOARD}/ - #{span.textContent.trim()}"
|
||||
|
||||
TitlePost =
|
||||
init: ->
|
||||
@ -2525,11 +2492,7 @@ QuoteInline =
|
||||
doc = d.implementation.createHTMLDocument ''
|
||||
doc.documentElement.innerHTML = req.response
|
||||
|
||||
node =
|
||||
if id is threadID #OP
|
||||
Threading.op $('body > form', doc).firstChild
|
||||
else
|
||||
doc.getElementById id
|
||||
node = doc.getElementById id
|
||||
newInline = QuoteInline.table id, node.innerHTML
|
||||
for quote in $$ '.quotelink', newInline
|
||||
if (href = quote.getAttribute 'href') is quote.hash #add pathname to normal quotes
|
||||
@ -2599,11 +2562,7 @@ QuotePreview =
|
||||
doc = d.implementation.createHTMLDocument ''
|
||||
doc.documentElement.innerHTML = req.response
|
||||
|
||||
node =
|
||||
if id is threadID #OP
|
||||
Threading.op $('body > form', doc).firstChild
|
||||
else
|
||||
doc.getElementById id
|
||||
node = doc.getElementById id
|
||||
qp.innerHTML = node.innerHTML
|
||||
post =
|
||||
root: qp
|
||||
@ -3043,12 +3002,10 @@ Main =
|
||||
g.REPLY = true
|
||||
g.THREAD_ID = pathname[2]
|
||||
|
||||
#load values from localStorage
|
||||
# Load values from localStorage.
|
||||
for key, val of Conf
|
||||
Conf[key] = $.get key, val
|
||||
|
||||
$.on window, 'message', Main.message
|
||||
|
||||
switch location.hostname
|
||||
when 'sys.4chan.org'
|
||||
if /report/.test location.search
|
||||
@ -3063,12 +3020,13 @@ Main =
|
||||
$.ready Options.init
|
||||
|
||||
if Conf['Quick Reply'] and Conf['Hide Original Post Form'] and g.BOARD isnt 'f'
|
||||
Main.css += 'form[name=post] { display: none; }'
|
||||
Main.css += '#postForm { display: none; }'
|
||||
|
||||
Main.addStyle()
|
||||
|
||||
now = Date.now()
|
||||
if Conf['Check for Updates'] and $.get('lastUpdate', 0) < now - 6*$.HOUR
|
||||
$.on window, 'message', Main.message
|
||||
$.ready -> $.add d.head, $.el 'script', src: 'https://raw.github.com/mayhemydg/4chan-x/master/latest.js'
|
||||
$.set 'lastUpdate', now
|
||||
|
||||
@ -3153,10 +3111,10 @@ Main =
|
||||
return
|
||||
$.addClass d.body, "chanx_#{Main.version.split('.')[1]}"
|
||||
$.addClass d.body, $.engine
|
||||
for nav in ['navtop', 'navbot']
|
||||
$.addClass $("a[href$='/#{g.BOARD}/']", $.id nav), 'current'
|
||||
form = $ 'form[name=delform]'
|
||||
Threading.thread form.firstElementChild
|
||||
for nav in ['boardNavDesktop', 'boardNavDesktopFoot']
|
||||
if a = $ "a[href$='/#{g.BOARD}/']", $.id nav
|
||||
# Gotta make it work in temporary boards.
|
||||
$.addClass a, 'current'
|
||||
Favicon.init()
|
||||
|
||||
# Major features.
|
||||
@ -3201,18 +3159,19 @@ Main =
|
||||
if Conf['Index Navigation']
|
||||
setTimeout -> Nav.init()
|
||||
|
||||
board = $ '.board'
|
||||
nodes = []
|
||||
for node in $$ '.op, a + table', form
|
||||
for node in $$ '.post', board
|
||||
nodes.push Main.preParse node
|
||||
Main.node nodes, true
|
||||
|
||||
if MutationObserver = window.WebKitMutationObserver or window.MozMutationObserver or window.OMutationObserver or window.MutationObserver
|
||||
observer = new MutationObserver Main.observer
|
||||
observer.observe form,
|
||||
observer.observe board,
|
||||
childList: true
|
||||
subtree: true
|
||||
else
|
||||
$.on form, 'DOMNodeInserted', Main.listener
|
||||
$.on board, 'DOMNodeInserted', Main.listener
|
||||
|
||||
flatten: (parent, obj) ->
|
||||
if obj instanceof Array
|
||||
@ -3239,13 +3198,13 @@ Main =
|
||||
preParse: (node) ->
|
||||
klass = node.className
|
||||
post =
|
||||
root: node
|
||||
el: if klass is 'op' then node else node.firstChild.firstChild.lastChild
|
||||
root: node.parentNode
|
||||
el: node
|
||||
class: klass
|
||||
id: node.getElementsByTagName('input')[0].name
|
||||
threadId: g.THREAD_ID or $.x('ancestor::div[@class="thread"]', node).firstChild.id
|
||||
id: node.id[1..]
|
||||
threadId: g.THREAD_ID or $.x('ancestor::div[@class="thread"]', node).id[1..]
|
||||
isInlined: /\binline\b/.test klass
|
||||
filesize: node.getElementsByClassName('filesize')[0] or false
|
||||
fileinfo: node.getElementsByClassName('fileInfo')[0] or false
|
||||
quotes: node.getElementsByClassName 'quotelink'
|
||||
backlinks: node.getElementsByClassName 'backlink'
|
||||
post.img = if post.filesize then node.getElementsByTagName('img')[0] else false
|
||||
@ -3292,6 +3251,9 @@ a[href="javascript:;"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
h1 {
|
||||
text-align: center;
|
||||
}
|
||||
.autohide:not(:hover) > form {
|
||||
display: none;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user