From 1e5056852064dd33fa2e7062f4fcc9b376406714 Mon Sep 17 00:00:00 2001 From: Nicolas Stepien Date: Thu, 3 May 2012 10:10:44 +0200 Subject: [PATCH] Fix Quote Inlining. ohboyherewego.diff --- 4chan_x.user.js | 127 +++++++++++++++++++++++++----------------------- script.coffee | 105 ++++++++++++++++++++------------------- 2 files changed, 120 insertions(+), 112 deletions(-) diff --git a/4chan_x.user.js b/4chan_x.user.js index c63b4d499..2669e119e 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -3117,11 +3117,11 @@ return; } e.preventDefault(); - id = this.hash.slice(1); + id = this.hash.slice(2); if (/\binlined\b/.test(this.className)) { QuoteInline.rm(this, id); } else { - if ($.x("ancestor::*[@id='" + id + "']", this)) { + if ($.x("ancestor::div[contains(@id,'p" + id + "')]", this)) { return; } QuoteInline.add(this, id); @@ -3129,61 +3129,60 @@ return this.classList.toggle('inlined'); }, add: function(q, id) { - var el, i, inline, pathname, root, table, threadID; - root = q.parentNode.nodeName === 'FONT' ? q.parentNode : q.nextSibling ? q.nextSibling : q; - if (el = $.id(id)) { - inline = QuoteInline.table(id, el.innerHTML); - if ((i = Unread.replies.indexOf(el.parentNode.parentNode.parentNode)) !== -1) { + var clonePost, el, i, inline, pathname, root; + root = $.x('ancestor::*[parent::blockquote]', q); + if (el = $.id("p" + id)) { + $.removeClass(el, 'qphl'); + clonePost = QuoteInline.clone(id, el); + if (/\bbacklink\b/.test(q.className)) { + $.after(q.parentNode, clonePost); + if (Conf['Forward Hiding']) { + $.addClass(el.parentNode, 'forwarded'); + ++el.dataset.forwarded || (el.dataset.forwarded = 1); + } + } else { + $.after(root, clonePost); + } + if ((i = Unread.replies.indexOf(el)) !== -1) { Unread.replies.splice(i, 1); Unread.update(true); } - if (/\bbacklink\b/.test(q.className)) { - $.after(q.parentNode, inline); - if (Conf['Forward Hiding']) { - table = $.x('ancestor::table', el); - $.addClass(table, 'forwarded'); - ++table.title || (table.title = 1); - } - return; - } - return $.after(root, inline); - } else { - inline = $.el('td', { - className: 'reply inline', - id: "i" + id, - innerHTML: "Loading " + id + "..." - }); - $.after(root, inline); - pathname = q.pathname; - threadID = pathname.split('/').pop(); - return $.cache(pathname, (function() { - return QuoteInline.parse(this, pathname, id, threadID, inline); - })); + return; } + inline = $.el('div', { + className: 'inline', + id: "i" + id, + textContent: "Loading " + id + "..." + }); + $.after(root, inline); + pathname = q.pathname; + return $.cache(pathname, function() { + return QuoteInline.parse(this, pathname, id, inline); + }); }, rm: function(q, id) { - var inlined, table, _i, _len, _ref; - table = $.x("following::*[@id='i" + id + "']", q); - $.rm(table); + var div, inlined, _i, _len, _ref; + div = $.x("following::div[@id='i_pc" + id + "']", q); + $.rm(div); if (!Conf['Forward Hiding']) { return; } - _ref = $$('.backlink.inlined', table); + _ref = $$('.backlink.inlined', div); for (_i = 0, _len = _ref.length; _i < _len; _i++) { inlined = _ref[_i]; - table = $.x('ancestor::table', $.id(inlined.hash.slice(1))); - if (!--table.title) { - $.removeClass(table, 'forwarded'); + div = $.id(inlined.hash.slice(1)); + if (!--div.dataset.forwarded) { + $.removeClass(div.parentNode, 'forwarded'); } } if (/\bbacklink\b/.test(q.className)) { - table = $.x('ancestor::table', $.id(id)); - if (!--table.title) { - return $.removeClass(table, 'forwarded'); + div = $.id("p" + id); + if (!--div.dataset.forwarded) { + return $.removeClass(div.parentNode, 'forwarded'); } } }, - parse: function(req, pathname, id, threadID, inline) { + parse: function(req, pathname, id, inline) { var doc, href, link, newInline, node, quote, _i, _len, _ref; if (!inline.parentNode) { return; @@ -3194,29 +3193,36 @@ } doc = d.implementation.createHTMLDocument(''); doc.documentElement.innerHTML = req.response; - node = doc.getElementById(id); - newInline = QuoteInline.table(id, node.innerHTML); + node = doc.getElementById("p" + id); + newInline = QuoteInline.clone(id, node); _ref = $$('.quotelink', newInline); for (_i = 0, _len = _ref.length; _i < _len; _i++) { quote = _ref[_i]; - if ((href = quote.getAttribute('href')) === quote.hash) { - quote.pathname = pathname; - } else if (!g.REPLY && href !== quote.href) { - quote.href = "res/" + href; + href = quote.getAttribute('href'); + if (href[0] === '/') { + continue; } + quote.href = "res/" + href; } - link = $('.quotejs', newInline); - link.href = "" + pathname + "#" + id; + link = $('.postInfo > .postNum > a:first-child', newInline); + link.href = "" + pathname + "#p" + id; link.nextSibling.href = "" + pathname + "#q" + id; $.addClass(newInline, 'crossquote'); return $.replace(inline, newInline); }, - table: function(id, html) { - return $.el('table', { - className: 'inline', - id: "i" + id, - innerHTML: "" + html + "" + clone: function(id, el) { + var clone, node, _i, _len, _ref; + clone = $.el('div', { + className: 'postContainer inline', + id: "i_pc" + id }); + $.add(clone, el.cloneNode(true)); + _ref = $$('[id]', clone); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + node = _ref[_i]; + node.id = "i_" + node.id; + } + return clone; } }; @@ -3240,7 +3246,7 @@ } }, mouseover: function(e) { - var el, id, qp, quote, replyID, threadID, _i, _len, _ref; + var el, id, qp, quote, replyID, _i, _len, _ref; if (/\binlined\b/.test(this.className)) { return; } @@ -3265,10 +3271,9 @@ } } else { qp.textContent = "Loading " + id + "..."; - threadID = this.pathname.split('/').pop(); - $.cache(this.pathname, (function() { - return QuotePreview.parse(this, id, threadID); - })); + $.cache(this.pathname, function() { + return QuotePreview.parse(this, id); + }); UI.hover(e); } $.on(this, 'mousemove', UI.hover); @@ -3276,14 +3281,14 @@ }, mouseout: function() { var el; + UI.hoverend(); if (el = $.id(this.hash.slice(1))) { $.removeClass(el, 'qphl'); } - UI.hoverend(); $.off(this, 'mousemove', UI.hover); return $.off(this, 'mouseout click', QuotePreview.mouseout); }, - parse: function(req, id, threadID) { + parse: function(req, id) { var doc, node, post, qp; if (!((qp = UI.el) && qp.textContent === ("Loading " + id + "..."))) { return; @@ -3405,7 +3410,7 @@ ReportButton = { init: function() { this.a = $.el('a', { - className: 'reportbutton', + className: 'report_button', innerHTML: '[ ! ]', href: 'javascript:;' }); diff --git a/script.coffee b/script.coffee index 44ca9c4b0..301c296ca 100644 --- a/script.coffee +++ b/script.coffee @@ -2417,53 +2417,53 @@ QuoteInline = toggle: (e) -> return if e.shiftKey or e.altKey or e.ctrlKey or e.metaKey or e.button isnt 0 e.preventDefault() - id = @hash[1..] + id = @hash[2..] if /\binlined\b/.test @className QuoteInline.rm @, id else - return if $.x "ancestor::*[@id='#{id}']", @ + return if $.x "ancestor::div[contains(@id,'p#{id}')]", @ QuoteInline.add @, id @classList.toggle 'inlined' add: (q, id) -> - root = if q.parentNode.nodeName is 'FONT' then q.parentNode else if q.nextSibling then q.nextSibling else q - if el = $.id id - inline = QuoteInline.table id, el.innerHTML - if (i = Unread.replies.indexOf el.parentNode.parentNode.parentNode) isnt -1 + root = $.x 'ancestor::*[parent::blockquote]', q + if el = $.id "p#{id}" + $.removeClass el, 'qphl' + clonePost = QuoteInline.clone id, el + if /\bbacklink\b/.test q.className + $.after q.parentNode, clonePost + if Conf['Forward Hiding'] + $.addClass el.parentNode, 'forwarded' + # Will only unhide if there's no inlined backlinks of it anymore. + ++el.dataset.forwarded or el.dataset.forwarded = 1 + else + $.after root, clonePost + if (i = Unread.replies.indexOf el) isnt -1 Unread.replies.splice i, 1 Unread.update true - if /\bbacklink\b/.test q.className - $.after q.parentNode, inline - if Conf['Forward Hiding'] - table = $.x 'ancestor::table', el - $.addClass table, 'forwarded' - # Will only unhide if there's no inlined backlinks of it anymore. - ++table.title or table.title = 1 - return - $.after root, inline - else - inline = $.el 'td', - className: 'reply inline' - id: "i#{id}" - innerHTML: "Loading #{id}..." - $.after root, inline - {pathname} = q - threadID = pathname.split('/').pop() - $.cache pathname, (-> QuoteInline.parse @, pathname, id, threadID, inline) + return + + inline = $.el 'div', + className: 'inline' + id: "i#{id}" + textContent: "Loading #{id}..." + $.after root, inline + {pathname} = q + $.cache pathname, -> QuoteInline.parse @, pathname, id, inline rm: (q, id) -> - #select the corresponding table or loading td - table = $.x "following::*[@id='i#{id}']", q - $.rm table + # select the corresponding inlined quote or loading quote + div = $.x "following::div[@id='i_pc#{id}']", q + $.rm div return unless Conf['Forward Hiding'] - for inlined in $$ '.backlink.inlined', table - table = $.x 'ancestor::table', $.id inlined.hash[1..] - $.removeClass table, 'forwarded' unless --table.title + for inlined in $$ '.backlink.inlined', div + div = $.id inlined.hash[1..] + $.removeClass div.parentNode, 'forwarded' unless --div.dataset.forwarded if /\bbacklink\b/.test q.className - table = $.x 'ancestor::table', $.id id - $.removeClass table, 'forwarded' unless --table.title + div = $.id "p#{id}" + $.removeClass div.parentNode, 'forwarded' unless --div.dataset.forwarded - parse: (req, pathname, id, threadID, inline) -> + parse: (req, pathname, id, inline) -> return unless inline.parentNode if req.status isnt 200 @@ -2473,23 +2473,27 @@ QuoteInline = doc = d.implementation.createHTMLDocument '' doc.documentElement.innerHTML = req.response - node = doc.getElementById id - newInline = QuoteInline.table id, node.innerHTML + node = doc.getElementById "p#{id}" + newInline = QuoteInline.clone id, node for quote in $$ '.quotelink', newInline - if (href = quote.getAttribute 'href') is quote.hash #add pathname to normal quotes - quote.pathname = pathname - else if !g.REPLY and href isnt quote.href #fix x-thread links, not x-board ones - quote.href = "res/#{href}" - link = $ '.quotejs', newInline - link.href = "#{pathname}##{id}" + href = quote.getAttribute 'href' + continue if href[0] is '/' # Cross-board quote + quote.href = "res/#{href}" # Fix pathnames + link = $ '.postInfo > .postNum > a:first-child', newInline + link.href = "#{pathname}#p#{id}" link.nextSibling.href = "#{pathname}#q#{id}" $.addClass newInline, 'crossquote' $.replace inline, newInline - table: (id, html) -> - $.el 'table', - className: 'inline' - id: "i#{id}" - innerHTML: "#{html}" + + clone: (id, el) -> + clone = $.el 'div', + className: 'postContainer inline' + id: "i_pc#{id}" + $.add clone, el.cloneNode true + for node in $$ '[id]', clone + # Don't mess with other features + node.id = "i_#{node.id}" + clone QuotePreview = init: -> @@ -2517,18 +2521,17 @@ QuotePreview = $.addClass quote, 'forwardlink' else qp.textContent = "Loading #{id}..." - threadID = @pathname.split('/').pop() - $.cache @pathname, (-> QuotePreview.parse @, id, threadID) + $.cache @pathname, -> QuotePreview.parse @, id UI.hover e $.on @, 'mousemove', UI.hover $.on @, 'mouseout click', QuotePreview.mouseout mouseout: -> + UI.hoverend() if el = $.id @hash[1..] $.removeClass el, 'qphl' - UI.hoverend() $.off @, 'mousemove', UI.hover $.off @, 'mouseout click', QuotePreview.mouseout - parse: (req, id, threadID) -> + parse: (req, id) -> return unless (qp = UI.el) and qp.textContent is "Loading #{id}..." if req.status isnt 200 @@ -2637,7 +2640,7 @@ Quotify = ReportButton = init: -> @a = $.el 'a', - className: 'reportbutton' + className: 'report_button' innerHTML: '[ ! ]' href: 'javascript:;' Main.callbacks.push @node