diff --git a/LICENSE b/LICENSE index 421aff5d5..628192571 100755 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ /* -* 4chan X - Version 1.4.1 - 2014-03-15 +* 4chan X - Version 1.4.1 - 2014-03-20 * * Licensed under the MIT license. * https://github.com/Spittie/4chan-x/blob/master/LICENSE diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js index 08df4ad62..06a5640e1 100644 --- a/builds/4chan-X.user.js +++ b/builds/4chan-X.user.js @@ -24,7 +24,7 @@ // ==/UserScript== /* -* 4chan X - Version 1.4.1 - 2014-03-15 +* 4chan X - Version 1.4.1 - 2014-03-20 * * Licensed under the MIT license. * https://github.com/Spittie/4chan-x/blob/master/LICENSE @@ -8453,28 +8453,26 @@ if (Conf['Comment Expansion']) { ExpandComment.callbacks.push(this.node); } - if (Conf['Title Link']) { - $.sync('CachedTitles', Linkify.titleSync); - } return Post.callbacks.push({ name: 'Linkify', cb: this.node }); }, - node: function() { - var data, el, end, endNode, i, index, items, length, link, links, node, result, saved, snapshot, space, test, word, _i, _len, _ref; - if (this.isClone) { - if (Conf['Embedding']) { - i = 0; - items = $$('.embed', this.nodes.comment); - while (el = items[i++]) { - $.on(el, 'click', Linkify.cb.toggle); - if ($.hasClass(el, 'embedded')) { - Linkify.cb.toggle.call(el); - } - } + events: function(post) { + var el, i, items; + i = 0; + items = $$('.embedder', post.nodes.comment); + while (el = items[i++]) { + $.on(el, 'click', Linkify.cb.toggle); + if ($.hasClass(el, 'embedded')) { + Linkify.cb.toggle.call(el); } - return; + } + }, + node: function() { + var data, end, endNode, i, index, length, link, links, node, result, saved, snapshot, space, test, word; + if (this.isClone) { + return (Conf['Embedding'] ? Linkify.events(this) : null); } if (!Linkify.regString.test(this.info.comment)) { return; @@ -8486,7 +8484,7 @@ links = []; while (node = snapshot.snapshotItem(i++)) { data = node.data; - if (node.parentElement.nodeName === "A" || !data) { + if (!data || node.parentElement.nodeName === "A") { continue; } while (result = test.exec(data)) { @@ -8518,25 +8516,20 @@ } } } - _ref = links.reverse(); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - this.nodes.links.push(Linkify.makeLink(link, this)); - link.detach(); + i = links.length; + while (i--) { + link = links[i]; + Linkify.embedProcess(Linkify.makeLink(link, this)); } - if (!(Conf['Embedding'] || Conf['Link Title'])) { - return; - } - links = this.nodes.links; - i = 0; - while (link = links[i++]) { - if (data = Linkify.services(link)) { - if (Conf['Embedding']) { - Linkify.embed(data); - } - if (Conf['Link Title']) { - Linkify.title(data); - } + }, + embedProcess: function(link) { + var data; + if (data = Linkify.services(link)) { + if (Conf['Embedding']) { + Linkify.embed(data); + } + if (Conf['Link Title']) { + return Linkify.title(data); } } }, @@ -8549,7 +8542,7 @@ return range; }, makeLink: function(range) { - var a, char, i, text; + var a, i, t, text; text = range.toString(); i = 0; while (/[(\[{<>]/.test(text.charAt(i))) { @@ -8565,8 +8558,8 @@ } } i = 0; - while (/[)\]}>.,]/.test(char = text.charAt(text.length - (1 + i)))) { - if (!(/[.,]/.test(char) || (text.match(/[()\[\]{}<>]/g)).length % 2)) { + while (/[)\]}>.,]/.test(t = text.charAt(text.length - (1 + i)))) { + if (!(/[.,]/.test(t) || (text.match(/[()\[\]{}<>]/g)).length % 2)) { break; } i++; @@ -8591,6 +8584,7 @@ }); $.add(a, range.extractContents()); range.insertNode(a); + range.detach(); return a; }, services: function(link) { @@ -8599,10 +8593,9 @@ _ref = Linkify.types; for (key in _ref) { type = _ref[key]; - if (!(match = type.regExp.exec(href))) { - continue; + if (match = type.regExp.exec(href)) { + return [key, match[1], match[2], link]; } - return [key, match[1], match[2], link]; } }, embed: function(data) { @@ -8631,7 +8624,7 @@ if (Conf['Auto-embed']) { Linkify.cb.toggle.call(embed); } - data.push(embed); + return data.push(embed); }, title: function(data) { var embed, err, key, link, options, service, title, titles, uid; @@ -8649,9 +8642,9 @@ } } else { try { - $.cache(service.api(uid), function() { - return title = Linkify.cb.title(this, data); - }, { + return $.cache(service.api(uid), (function() { + return Linkify.cb.title(this, data); + }), { responseType: 'json' }); } catch (_error) { @@ -8659,17 +8652,9 @@ if (link) { link.innerHTML = "[" + key + "] Title Link Blocked (are you using NoScript?)"; } - return; - } - if (title) { - titles[uid] = [title, Date.now()]; - return $.set('CachedTitles', titles); } } }, - titleSync: function(value) { - return Conf['CachedTitles'] = value; - }, cb: { toggle: function() { var string, _ref; @@ -8695,26 +8680,26 @@ $.addClass(el, a.dataset.key); return el; }, - title: function(response, data) { - var embed, key, link, options, service, text, uid; + title: function(req, data) { + var embed, key, link, options, service, status, text, uid; key = data[0], uid = data[1], options = data[2], link = data[3], embed = data[4]; + status = req.status; service = Linkify.types[key].title; - switch (response.status) { - case 200: - case 304: - text = "" + (service.text(response.response)); - if (Conf['Embedding']) { - embed.dataset.title = text; - } - break; - case 404: - text = "[" + key + "] Not Found"; - break; - case 403: - text = "[" + key + "] Forbidden or Private"; - break; - default: - text = "[" + key + "] " + this.status + "'d"; + text = "[" + key + "] " + ((function() { + switch (status) { + case 200: + case 304: + return service.text(req.response); + case 404: + return "Not Found"; + case 403: + return "Forbidden or Private"; + default: + return "" + status + "'d"; + } + })()); + if (Conf['Embedding'] && (status === 200 || status === 304)) { + embed.dataset.title = text; } if (link) { return link.textContent = text; @@ -12460,8 +12445,8 @@ if (g.BOARD.ID === 'f' || !Conf['JSON Navigation']) { return; } + $.on(window, 'popstate', Navigate.popstate); $.ready(function() { - $.on(window, 'popstate', Navigate.popstate); Navigate.makeBreadCrumb(window.location, g.VIEW, g.BOARD.ID, g.THREADID); return $.add(Index.navLinks, Navigate.el); }); @@ -12674,7 +12659,9 @@ Index.update(); } } - e.preventDefault(); + if (e != null) { + e.preventDefault(); + } return; } $.addClass(Index.button, 'fa-spin'); @@ -12682,7 +12669,7 @@ if ('f' === boardID || 'f' === g.BOARD.ID) { return; } - if (e) { + if (e != null) { e.preventDefault(); } if (Index.isSearching) { @@ -13645,11 +13632,10 @@ }); $.before(styleSelector.previousSibling, [$.tn('['), passLink, $.tn(']\u00A0\u00A0')]); } - if (!(Conf['JSON Navigation'] && g.VIEW === 'index')) { + if (!Conf['JSON Navigation'] || g.VIEW === 'thread') { Main.initThread(); - } else { - $.event('4chanXInitFinished'); } + $.event('4chanXInitFinished'); test = $.el('span'); test.classList.add('a', 'b'); if (test.className !== 'a b') { @@ -13704,7 +13690,6 @@ } Thread.callbacks.execute(threads); Post.callbacks.execute(posts); - $.event('4chanXInitFinished'); } return $.get('previousversion', null, function(_arg) { var changelog, el, previousversion; diff --git a/builds/crx/script.js b/builds/crx/script.js index f4954c799..1a6782edf 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -1,6 +1,6 @@ // Generated by CoffeeScript /* -* 4chan X - Version 1.4.1 - 2014-03-15 +* 4chan X - Version 1.4.1 - 2014-03-20 * * Licensed under the MIT license. * https://github.com/Spittie/4chan-x/blob/master/LICENSE @@ -8468,28 +8468,26 @@ if (Conf['Comment Expansion']) { ExpandComment.callbacks.push(this.node); } - if (Conf['Title Link']) { - $.sync('CachedTitles', Linkify.titleSync); - } return Post.callbacks.push({ name: 'Linkify', cb: this.node }); }, - node: function() { - var data, el, end, endNode, i, index, items, length, link, links, node, result, saved, snapshot, space, test, word, _i, _len, _ref; - if (this.isClone) { - if (Conf['Embedding']) { - i = 0; - items = $$('.embed', this.nodes.comment); - while (el = items[i++]) { - $.on(el, 'click', Linkify.cb.toggle); - if ($.hasClass(el, 'embedded')) { - Linkify.cb.toggle.call(el); - } - } + events: function(post) { + var el, i, items; + i = 0; + items = $$('.embedder', post.nodes.comment); + while (el = items[i++]) { + $.on(el, 'click', Linkify.cb.toggle); + if ($.hasClass(el, 'embedded')) { + Linkify.cb.toggle.call(el); } - return; + } + }, + node: function() { + var data, end, endNode, i, index, length, link, links, node, result, saved, snapshot, space, test, word; + if (this.isClone) { + return (Conf['Embedding'] ? Linkify.events(this) : null); } if (!Linkify.regString.test(this.info.comment)) { return; @@ -8501,7 +8499,7 @@ links = []; while (node = snapshot.snapshotItem(i++)) { data = node.data; - if (node.parentElement.nodeName === "A" || !data) { + if (!data || node.parentElement.nodeName === "A") { continue; } while (result = test.exec(data)) { @@ -8533,25 +8531,20 @@ } } } - _ref = links.reverse(); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - this.nodes.links.push(Linkify.makeLink(link, this)); - link.detach(); + i = links.length; + while (i--) { + link = links[i]; + Linkify.embedProcess(Linkify.makeLink(link, this)); } - if (!(Conf['Embedding'] || Conf['Link Title'])) { - return; - } - links = this.nodes.links; - i = 0; - while (link = links[i++]) { - if (data = Linkify.services(link)) { - if (Conf['Embedding']) { - Linkify.embed(data); - } - if (Conf['Link Title']) { - Linkify.title(data); - } + }, + embedProcess: function(link) { + var data; + if (data = Linkify.services(link)) { + if (Conf['Embedding']) { + Linkify.embed(data); + } + if (Conf['Link Title']) { + return Linkify.title(data); } } }, @@ -8564,7 +8557,7 @@ return range; }, makeLink: function(range) { - var a, char, i, text; + var a, i, t, text; text = range.toString(); i = 0; while (/[(\[{<>]/.test(text.charAt(i))) { @@ -8580,8 +8573,8 @@ } } i = 0; - while (/[)\]}>.,]/.test(char = text.charAt(text.length - (1 + i)))) { - if (!(/[.,]/.test(char) || (text.match(/[()\[\]{}<>]/g)).length % 2)) { + while (/[)\]}>.,]/.test(t = text.charAt(text.length - (1 + i)))) { + if (!(/[.,]/.test(t) || (text.match(/[()\[\]{}<>]/g)).length % 2)) { break; } i++; @@ -8606,6 +8599,7 @@ }); $.add(a, range.extractContents()); range.insertNode(a); + range.detach(); return a; }, services: function(link) { @@ -8614,10 +8608,9 @@ _ref = Linkify.types; for (key in _ref) { type = _ref[key]; - if (!(match = type.regExp.exec(href))) { - continue; + if (match = type.regExp.exec(href)) { + return [key, match[1], match[2], link]; } - return [key, match[1], match[2], link]; } }, embed: function(data) { @@ -8646,7 +8639,7 @@ if (Conf['Auto-embed']) { Linkify.cb.toggle.call(embed); } - data.push(embed); + return data.push(embed); }, title: function(data) { var embed, err, key, link, options, service, title, titles, uid; @@ -8664,9 +8657,9 @@ } } else { try { - $.cache(service.api(uid), function() { - return title = Linkify.cb.title(this, data); - }, { + return $.cache(service.api(uid), (function() { + return Linkify.cb.title(this, data); + }), { responseType: 'json' }); } catch (_error) { @@ -8674,17 +8667,9 @@ if (link) { link.innerHTML = "[" + key + "] Title Link Blocked (are you using NoScript?)"; } - return; - } - if (title) { - titles[uid] = [title, Date.now()]; - return $.set('CachedTitles', titles); } } }, - titleSync: function(value) { - return Conf['CachedTitles'] = value; - }, cb: { toggle: function() { var string, _ref; @@ -8710,26 +8695,26 @@ $.addClass(el, a.dataset.key); return el; }, - title: function(response, data) { - var embed, key, link, options, service, text, uid; + title: function(req, data) { + var embed, key, link, options, service, status, text, uid; key = data[0], uid = data[1], options = data[2], link = data[3], embed = data[4]; + status = req.status; service = Linkify.types[key].title; - switch (response.status) { - case 200: - case 304: - text = "" + (service.text(response.response)); - if (Conf['Embedding']) { - embed.dataset.title = text; - } - break; - case 404: - text = "[" + key + "] Not Found"; - break; - case 403: - text = "[" + key + "] Forbidden or Private"; - break; - default: - text = "[" + key + "] " + this.status + "'d"; + text = "[" + key + "] " + ((function() { + switch (status) { + case 200: + case 304: + return service.text(req.response); + case 404: + return "Not Found"; + case 403: + return "Forbidden or Private"; + default: + return "" + status + "'d"; + } + })()); + if (Conf['Embedding'] && (status === 200 || status === 304)) { + embed.dataset.title = text; } if (link) { return link.textContent = text; @@ -12471,11 +12456,16 @@ Navigate = { path: window.location.pathname, init: function() { + var popstateHack; if (g.BOARD.ID === 'f' || !Conf['JSON Navigation']) { return; } + popstateHack = function() { + $.off(window, 'popstate', popstateHack); + return $.on(window, 'popstate', Navigate.popstate); + }; + $.on(window, 'popstate', popstateHack); $.ready(function() { - $.on(window, 'popstate', Navigate.popstate); Navigate.makeBreadCrumb(window.location, g.VIEW, g.BOARD.ID, g.THREADID); return $.add(Index.navLinks, Navigate.el); }); @@ -12688,7 +12678,9 @@ Index.update(); } } - e.preventDefault(); + if (e != null) { + e.preventDefault(); + } return; } $.addClass(Index.button, 'fa-spin'); @@ -12696,7 +12688,7 @@ if ('f' === boardID || 'f' === g.BOARD.ID) { return; } - if (e) { + if (e != null) { e.preventDefault(); } if (Index.isSearching) { @@ -13657,11 +13649,10 @@ }); $.before(styleSelector.previousSibling, [$.tn('['), passLink, $.tn(']\u00A0\u00A0')]); } - if (!(Conf['JSON Navigation'] && g.VIEW === 'index')) { + if (!Conf['JSON Navigation'] || g.VIEW === 'thread') { Main.initThread(); - } else { - $.event('4chanXInitFinished'); } + $.event('4chanXInitFinished'); try { return localStorage.getItem('4chan-settings'); } catch (_error) { @@ -13701,7 +13692,6 @@ } Thread.callbacks.execute(threads); Post.callbacks.execute(posts); - $.event('4chanXInitFinished'); } return $.get('previousversion', null, function(_arg) { var changelog, el, previousversion; diff --git a/src/General/Main.coffee b/src/General/Main.coffee index 2910386be..119cb6769 100755 --- a/src/General/Main.coffee +++ b/src/General/Main.coffee @@ -187,10 +187,10 @@ Main = $.before styleSelector.previousSibling, [$.tn '['; passLink, $.tn ']\u00A0\u00A0'] # Parse HTML or skip it and start building from JSON. - unless Conf['JSON Navigation'] and g.VIEW is 'index' + if !Conf['JSON Navigation'] or g.VIEW is 'thread' Main.initThread() - else - $.event '4chanXInitFinished' + + $.event '4chanXInitFinished' <% if (type === 'userscript') { %> test = $.el 'span' @@ -233,8 +233,6 @@ Main = Thread.callbacks.execute threads Post.callbacks.execute posts - $.event '4chanXInitFinished' - $.get 'previousversion', null, ({previousversion}) -> return if previousversion is g.VERSION if previousversion diff --git a/src/General/Navigate.coffee b/src/General/Navigate.coffee index 7e8e536cf..e06d89c32 100644 --- a/src/General/Navigate.coffee +++ b/src/General/Navigate.coffee @@ -3,9 +3,18 @@ Navigate = init: -> return if g.BOARD.ID is 'f' or !Conf['JSON Navigation'] + <% if (type === 'crx') { %> + # blink/webkit throw a popstate on page load. Not what we want. + popstateHack = -> + $.off window, 'popstate', popstateHack + $.on window, 'popstate', Navigate.popstate + + $.on window, 'popstate', popstateHack + <% } else { %> + $.on window, 'popstate', Navigate.popstate + <% } %> + $.ready -> - # blink/webkit throw a popstate on page load. Not what we want. - $.on window, 'popstate', Navigate.popstate Navigate.makeBreadCrumb window.location, g.VIEW, g.BOARD.ID, g.THREADID $.add Index.navLinks, Navigate.el @@ -173,8 +182,7 @@ Navigate = navigate: (e) -> return if @hostname isnt 'boards.4chan.org' or window.location.hostname is 'rs.4chan.org' if e - if e.shiftKey or e.ctrlKey or (e.type is 'click' and e.button isnt 0) # Not simply a left click - return + return if e.shiftKey or e.ctrlKey or (e.type is 'click' and e.button isnt 0) # Not simply a left click if @pathname is Navigate.path if g.VIEW is 'thread' @@ -182,7 +190,7 @@ Navigate = else unless Index.searchTest() Index.update() - e.preventDefault() + e?.preventDefault() return $.addClass Index.button, 'fa-spin' @@ -190,7 +198,7 @@ Navigate = [_, boardID, view, threadID] = @pathname.split '/' return if 'f' in [boardID, g.BOARD.ID] - e.preventDefault() if e + e?.preventDefault() Index.clearSearch() if Index.isSearching Navigate.title = -> return diff --git a/src/Linkification/Linkify.coffee b/src/Linkification/Linkify.coffee index 8f6aa1e61..682b33cf4 100755 --- a/src/Linkification/Linkify.coffee +++ b/src/Linkification/Linkify.coffee @@ -5,35 +5,30 @@ Linkify = if Conf['Comment Expansion'] ExpandComment.callbacks.push @node - if Conf['Title Link'] - $.sync 'CachedTitles', Linkify.titleSync - Post.callbacks.push name: 'Linkify' cb: @node + events: (post) -> + i = 0 + items = $$ '.embedder', post.nodes.comment + while el = items[i++] + $.on el, 'click', Linkify.cb.toggle + Linkify.cb.toggle.call el if $.hasClass el, 'embedded' + return + node: -> - if @isClone - if Conf['Embedding'] - i = 0 - items = $$ '.embed', @nodes.comment - while el = items[i++] - $.on el, 'click', Linkify.cb.toggle - Linkify.cb.toggle.call el if $.hasClass el, 'embedded' - - return - + return (if Conf['Embedding'] then Linkify.events @ else null) if @isClone return unless Linkify.regString.test @info.comment - - test = /[^\s'"]+/g - space = /[\s'"]/ - + + test = /[^\s'"]+/g + space = /[\s'"]/ snapshot = $.X './/br|.//text()', @nodes.comment i = 0 links = [] while node = snapshot.snapshotItem i++ {data} = node - continue if node.parentElement.nodeName is "A" or not data + continue if !data or node.parentElement.nodeName is "A" while result = test.exec data {index} = result @@ -58,41 +53,33 @@ Linkify = i-- break - if Linkify.regString.exec word - links.push Linkify.makeRange node, endNode, index, length + links.push Linkify.makeRange node, endNode, index, length if Linkify.regString.exec word break unless test.lastIndex and node is endNode - for link in links.reverse() - @nodes.links.push Linkify.makeLink link, @ - link.detach() - - return unless Conf['Embedding'] or Conf['Link Title'] - - {links} = @nodes - i = 0 - while link = links[i++] - if data = Linkify.services link - Linkify.embed data if Conf['Embedding'] - Linkify.title data if Conf['Link Title'] - + i = links.length + while i-- + link = links[i] + Linkify.embedProcess Linkify.makeLink link, @ return + embedProcess: (link) -> + if data = Linkify.services link + Linkify.embed data if Conf['Embedding'] + Linkify.title data if Conf['Link Title'] + regString: ///( # http, magnet, ftp, etc (https?|mailto|git|magnet|ftp|irc):( [a-z\d%/] ) - | - # This should account for virtually all links posted without http: + | # This should account for virtually all links posted without http: [-a-z\d]+[.]( aero|asia|biz|cat|com|coop|info|int|jobs|mobi|museum|name|net|org|post|pro|tel|travel|xxx|edu|gov|mil|[a-z]{2} )(/|(?!.)) - | - # IPv4 Addresses + | # IPv4 Addresses [\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3} - | - # E-mails + | # E-mails [-\w\d.@]+@[a-z\d.-]+\.[a-z\d] )///i @@ -105,7 +92,7 @@ Linkify = makeLink: (range) -> text = range.toString() - # Clean leading brackets, > + # Clean start of range i = 0 i++ while /[(\[{<>]/.test text.charAt i @@ -115,10 +102,10 @@ Linkify = range.setStart range.startContainer, range.startOffset + i if i - # Clean hanging brackets, commas, periods + # Clean end of range i = 0 - while /[)\]}>.,]/.test char = text.charAt text.length - (1 + i) - break unless /[.,]/.test(char) or (text.match /[()\[\]{}<>]/g).length % 2 + while /[)\]}>.,]/.test t = text.charAt text.length - (1 + i) + break unless /[.,]/.test(t) or (text.match /[()\[\]{}<>]/g).length % 2 i++ if i @@ -128,6 +115,7 @@ Linkify = if i range.setEnd range.endContainer, range.endOffset - i + # Make our link 'valid' if it is formatted incorrectly. unless /(https?|mailto|git|magnet|ftp|irc):/.test text text = ( if /@/.test text @@ -141,15 +129,17 @@ Linkify = rel: 'nofollow noreferrer' target: '_blank' href: text + + # Insert the range into the anchor, the anchor into the range's DOM location, and destroy the range. $.add a, range.extractContents() range.insertNode a + range.detach() + a services: (link) -> - href = link.href - - for key, type of Linkify.types - continue unless match = type.regExp.exec href + {href} = link + for key, type of Linkify.types when match = type.regExp.exec href return [key, match[1], match[2], link] return @@ -161,9 +151,7 @@ Linkify = href: 'javascript:;' textContent: '(embed)' - for name, value of {key, href, uid, options} - embed.dataset[name] = value - + embed.dataset[name] = value for name, value of {key, href, uid, options} embed.dataset.nodedata = link.innerHTML $.addClass link, "#{embed.dataset.key}" @@ -171,13 +159,10 @@ Linkify = $.on embed, 'click', Linkify.cb.toggle $.after link, [$.tn(' '), embed] - if Conf['Auto-embed'] - Linkify.cb.toggle.call embed + Linkify.cb.toggle.call embed if Conf['Auto-embed'] data.push embed - return - title: (data) -> [key, uid, options, link, embed] = data return unless service = Linkify.types[key].title @@ -190,20 +175,11 @@ Linkify = embed.dataset.title = title[0] else try - $.cache service.api(uid), - -> title = Linkify.cb.title @, data - , - responseType: 'json' + $.cache service.api(uid), (-> Linkify.cb.title @, data), responseType: 'json' catch err if link link.innerHTML = "[#{key}] Title Link Blocked (are you using NoScript?)" return - if title - titles[uid] = [title, Date.now()] - $.set 'CachedTitles', titles - - titleSync: (value) -> - Conf['CachedTitles'] = value cb: toggle: -> @@ -239,21 +215,24 @@ Linkify = return el - title: (response, data) -> + title: (req, data) -> [key, uid, options, link, embed] = data + {status} = req service = Linkify.types[key].title - switch response.status + + text = "[#{key}] #{switch status when 200, 304 - text = "#{service.text response.response}" - if Conf['Embedding'] - embed.dataset.title = text + service.text req.response when 404 - text = "[#{key}] Not Found" + "Not Found" when 403 - text = "[#{key}] Forbidden or Private" + "Forbidden or Private" else - text = "[#{key}] #{@status}'d" - link.textContent = text if link + "#{status}'d" + }" + + embed.dataset.title = text if Conf['Embedding'] and status in [200, 304] + link.textContent = text if link types: audio: