Start working on the new HTML format.

This commit is contained in:
Nicolas Stepien 2012-04-28 14:54:48 +02:00
parent 77cc33ad75
commit 55cbf0ddf4
2 changed files with 61 additions and 135 deletions

View File

@ -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;\
}\

View File

@ -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;
}