diff --git a/CHANGELOG.md b/CHANGELOG.md index 90bea7173..1c3a15525 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +### v1.7.32 +*2014-05-10* + **Zixaphir, ccd0** - Bug fixes in linkification/embedding. diff --git a/LICENSE b/LICENSE index 571cc1e1a..4743564a3 100755 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ /* -* 4chan X - Version 1.7.31 - 2014-05-08 +* 4chan X - Version 1.7.32 - 2014-05-10 * * Licensed under the MIT license. * https://github.com/ccd0/4chan-x/blob/master/LICENSE diff --git a/builds/4chan-X.meta.js b/builds/4chan-X.meta.js index d965c4f88..5dffebcdd 100755 --- a/builds/4chan-X.meta.js +++ b/builds/4chan-X.meta.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan X -// @version 1.7.31 +// @version 1.7.32 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js index 6d2d2bb31..ee1939fdf 100644 --- a/builds/4chan-X.user.js +++ b/builds/4chan-X.user.js @@ -1,7 +1,7 @@ // Generated by CoffeeScript // ==UserScript== // @name 4chan X -// @version 1.7.31 +// @version 1.7.32 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X @@ -24,7 +24,7 @@ // ==/UserScript== /* -* 4chan X - Version 1.7.31 - 2014-05-08 +* 4chan X - Version 1.7.32 - 2014-05-10 * * Licensed under the MIT license. * https://github.com/ccd0/4chan-x/blob/master/LICENSE @@ -372,7 +372,7 @@ doc = d.documentElement; g = { - VERSION: '1.7.31', + VERSION: '1.7.32', NAMESPACE: '4chan X.', boards: {} }; @@ -8488,7 +8488,6 @@ if (g.VIEW === 'catalog' || !Conf['Linkify']) { return; } - this.regString = /((https?|mailto|git|magnet|ftp|irc):([a-z\d%\/])|[-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})(\/|(?!.))|[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}|[-\w\d.@]+@[a-z\d.-]+\.[a-z\d])/i; this.types = {}; _ref = this.ordered_types; for (_i = 0, _len = _ref.length; _i < _len; _i++) { @@ -8498,27 +8497,28 @@ 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); } + } + }, + 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; } test = /[^\s'"]+/g; @@ -8528,7 +8528,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)) { @@ -8560,28 +8560,25 @@ } } } - _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), 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, post) { + var data; + if (data = Linkify.services(link)) { + data.push(post); + if (Conf['Embedding']) { + Linkify.embed(data); + } + if (Conf['Link Title']) { + return Linkify.title(data); } } }, + regString: /((https?|mailto|git|magnet|ftp|irc):([a-z\d%\/])|[-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})([:\/]|(?!.))|[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}|[-\w\d.@]+@[a-z\d.-]+\.[a-z\d])/i, makeRange: function(startNode, endNode, startOffset, endOffset) { var range; range = document.createRange(); @@ -8590,7 +8587,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))) { @@ -8606,8 +8603,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++; @@ -8621,7 +8618,7 @@ range.setEnd(range.endContainer, range.endOffset - i); } } - if (!/(https?|mailto|git|magnet|ftp|irc):/.test(text)) { + if (!/(mailto:|.+:\/\/)/.test(text)) { text = (/@/.test(text) ? 'mailto:' : 'http://') + text; } a = $.el('a', { @@ -8632,6 +8629,7 @@ }); $.add(a, range.extractContents()); range.insertNode(a); + range.detach(); return a; }, services: function(link) { @@ -8644,14 +8642,14 @@ continue; } if (type.dummy) { - break; + return; } return [type.key, match[1], match[2], link]; } }, embed: function(data) { - var embed, href, key, link, name, options, uid, value, _ref; - key = data[0], uid = data[1], options = data[2], link = data[3]; + var embed, href, key, link, name, options, post, uid, value, _ref; + key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; href = link.href; embed = $.el('a', { className: 'embedder', @@ -8668,57 +8666,47 @@ value = _ref[name]; embed.dataset[name] = value; } - embed.dataset.nodedata = link.innerHTML; $.addClass(link, "" + embed.dataset.key); $.on(embed, 'click', Linkify.cb.toggle); $.after(link, [$.tn(' '), embed]); if (Conf['Auto-embed']) { - Linkify.cb.toggle.call(embed); + return Linkify.cb.toggle.call(embed); } - data.push(embed); }, title: function(data) { - var embed, err, key, link, options, service, title, titles, uid; - key = data[0], uid = data[1], options = data[2], link = data[3], embed = data[4]; + var err, key, link, options, post, service, title, titles, uid; + key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; if (!(service = Linkify.types[key].title)) { return; } titles = Conf['CachedTitles']; if (title = titles[uid]) { - if (link) { - link.textContent = title[0]; - } - if (Conf['Embedding']) { - return embed.dataset.title = title[0]; - } + return link.textContent = title[0]; } 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) { err = _error; - if (link) { - link.innerHTML = "[" + key + "] Title Link Blocked (are you using NoScript?)"; - } - return; - } - if (title) { - titles[uid] = [title, Date.now()]; - return $.set('CachedTitles', titles); + link.innerHTML = 'Title Link Blocked (are you using NoScript?)'; + $.prepend(link, $.tn("[" + key + "] ")); } } }, - titleSync: function(value) { - return Conf['CachedTitles'] = value; - }, cb: { toggle: function() { - var string, _ref; - _ref = $.hasClass(this, "embedded") ? ['unembed', '(embed)'] : ['embed', '(unembed)'], string = _ref[0], this.textContent = _ref[1]; - $.replace(this.previousElementSibling, Linkify.cb[string](this)); + if ($.hasClass(this, "embedded")) { + $.rm(this.previousElementSibling); + this.previousElementSibling.hidden = false; + this.textContent = '(embed)'; + } else { + this.previousElementSibling.hidden = true; + $.before(this, Linkify.cb.embed(this)); + this.textContent = '(unembed)'; + } return $.toggleClass(this, 'embedded'); }, embed: function(a) { @@ -8727,45 +8715,35 @@ el.style.cssText = type.style != null ? type.style : "border: 0; width: 640px; height: 390px"; return el; }, - unembed: function(a) { - var el; - el = $.el('a', { - rel: 'nofollow noreferrer', - target: 'blank', - className: 'linkify', - href: a.dataset.href - }); - if (a.dataset.title) { - el.textContent = a.dataset.title; - } else { - el.innerHTML = a.dataset.nodedata; - } - $.addClass(el, a.dataset.key); - return el; - }, - title: function(response, data) { - var embed, key, link, options, service, text, uid; - key = data[0], uid = data[1], options = data[2], link = data[3], embed = data[4]; + title: function(req, data) { + var key, link, link2, options, post, post2, service, status, text, uid, _i, _j, _len, _len1, _ref, _ref1; + key = data[0], uid = data[1], options = data[2], link = data[3], post = 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; + 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"; + } + })()); + link.textContent = text; + _ref = post.clones; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + post2 = _ref[_i]; + _ref1 = $$('a', post2.nodes.comment); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + link2 = _ref1[_j]; + if (link2.href === link.href) { + link2.textContent = text; } - break; - case 404: - text = "[" + key + "] Not Found"; - break; - case 403: - text = "[" + key + "] Forbidden or Private"; - break; - default: - text = "[" + key + "] " + this.status + "'d"; - } - if (link) { - return link.textContent = text; + } } } }, @@ -8809,18 +8787,11 @@ regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/, style: 'border: 0; width: auto; height: auto;', el: function(a) { - var div, img, link; - img = $.el('img', { - src: a.dataset.href - }); - link = $.el('a', { - target: '_blank', - href: a.dataset.href - }); - div = $.el('div'); - $.add(link, img); - $.add(div, link); - return div; + var el; + el = $.el('div'); + el.innerHTML = ''; + el.firstChild.href = el.firstChild.firstChild.src = a.dataset.href; + return el; } }, { key: 'InstallGentoo', @@ -8860,13 +8831,13 @@ var el; el = $.el('div'); $.cache("https://mediacru.sh/" + a.dataset.uid + ".json", function() { - var embed, file, files, status, type, _i, _j, _len, _len1, _ref; + var embed, ext, file, files, i, status, type, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _results, _results1; status = this.status; if (status !== 200 && status !== 304) { return el.textContent = "ERROR " + status; } files = this.response.files; - _ref = ['video/mp4', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'image/svg', 'audio/mpeg']; + _ref = ['video/mp4', 'video/webm', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'audio/mpeg', 'audio/ogg']; for (_i = 0, _len = _ref.length; _i < _len; _i++) { type = _ref[_i]; for (_j = 0, _len1 = files.length; _j < _len1; _j++) { @@ -8885,20 +8856,35 @@ } switch (embed.type) { case 'video/mp4': + case 'video/webm': case 'video/ogv': - return el.innerHTML = ""; + el.innerHTML = ''; + _ref1 = ['mp4', 'webm', 'ogv']; + _results = []; + for (i = _k = 0, _len2 = _ref1.length; _k < _len2; i = ++_k) { + ext = _ref1[i]; + _results.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); + } + return _results; + break; + case 'image/svg+xml': case 'image/png': case 'image/gif': case 'image/jpeg': - case 'image/svg': - case 'image/svg+xml': - return $.add(el, $.el('a', { - target: '_blank', - href: a.dataset.href, - innerHTML: "" - })); + el.innerHTML = ''; + el.firstChild.href = a.dataset.href; + return el.firstChild.firstChild.src = "https://mediacru.sh/" + file.file; case 'audio/mpeg': - return el.innerHTML = ""; + case 'audio/ogg': + el.innerHTML = ''; + _ref2 = ['ogg', 'mp3']; + _results1 = []; + for (i = _l = 0, _len3 = _ref2.length; _l < _len3; i = ++_l) { + ext = _ref2[i]; + _results1.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); + } + return _results1; + break; default: return el.textContent = "ERROR: No valid filetype."; } @@ -8926,23 +8912,15 @@ }, { key: 'SoundCloud', regExp: /.*(?:soundcloud.com\/|snd.sc\/)([^#\&\?]*).*/, - style: 'height: auto; width: 500px; display: inline-block;', + style: 'border: 0; width: 500px; height: 400px;', el: function(a) { - var div; - div = $.el('div', { - className: "soundcloud", - name: "soundcloud" + return $.el('iframe', { + src: "//w.soundcloud.com/player/?visual=true&show_comments=false&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(a.dataset.uid)) }); - $.ajax("//soundcloud.com/oembed?show_artwork=false&&maxwidth=500px&show_comments=false&format=json&url=https://www.soundcloud.com/" + a.dataset.uid, { - onloadend: function() { - return div.innerHTML = JSON.parse(this.responseText).html; - } - }, false); - return div; }, title: { api: function(uid) { - return "//soundcloud.com/oembed?show_artwork=false&&maxwidth=500px&show_comments=false&format=json&url=https://www.soundcloud.com/" + uid; + return "//soundcloud.com/oembed?format=json&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(uid)); }, text: function(_) { return _.title; @@ -8962,19 +8940,27 @@ regExp: /.*(?:twitch.tv\/)([^#\&\?]*).*/, style: "border: none; width: 640px; height: 360px;", el: function(a) { - var channel, chapter, result, _; - if (result = /(\w+)\/(?:[a-z]\/)?(\d+)/i.exec(a.dataset.uid)) { - _ = result[0], channel = result[1], chapter = result[2]; - return $.el('object', { - data: 'http://www.twitch.tv/widgets/archive_embed_player.swf', - innerHTML: "\n" + var channel, id, idparam, obj, result, type, _; + if (result = /(\w+)\/([bc])\/(\d+)/i.exec(a.dataset.uid)) { + _ = result[0], channel = result[1], type = result[2], id = result[3]; + idparam = { + 'b': 'archive_id', + 'c': 'chapter_id' + }; + obj = $.el('object', { + data: 'http://www.twitch.tv/widgets/archive_embed_player.swf' }); + obj.innerHTML = ''; + obj.children[1].value = "channel=" + channel + "&start_volume=25&auto_play=false&" + idparam[type] + "=" + id; + return obj; } else { channel = (/(\w+)/.exec(a.dataset.uid))[0]; - return $.el('object', { - data: "http://www.twitch.tv/widgets/live_embed_player.swf?channel=" + channel, - innerHTML: "\n\n" + obj = $.el('object', { + data: "http://www.twitch.tv/widgets/live_embed_player.swf?channel=" + channel }); + obj.innerHTML = ''; + obj.children[1].value = "hostname=www.twitch.tv&channel=" + channel + "&auto_play=true&start_volume=25"; + return obj; } } }, { diff --git a/builds/crx.crx b/builds/crx.crx index 4e185824a..0640219ca 100644 Binary files a/builds/crx.crx and b/builds/crx.crx differ diff --git a/builds/crx/manifest.json b/builds/crx/manifest.json index 1205a2341..92d1e2997 100755 --- a/builds/crx/manifest.json +++ b/builds/crx/manifest.json @@ -1,6 +1,6 @@ { "name": "4chan X", - "version": "1.7.31", + "version": "1.7.32", "manifest_version": 2, "description": "Cross-browser userscript for maximum lurking on 4chan.", "icons": { diff --git a/builds/crx/script.js b/builds/crx/script.js index 71a97cd0a..7a06d0041 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -1,6 +1,6 @@ // Generated by CoffeeScript /* -* 4chan X - Version 1.7.31 - 2014-05-08 +* 4chan X - Version 1.7.32 - 2014-05-10 * * Licensed under the MIT license. * https://github.com/ccd0/4chan-x/blob/master/LICENSE @@ -348,7 +348,7 @@ doc = d.documentElement; g = { - VERSION: '1.7.31', + VERSION: '1.7.32', NAMESPACE: '4chan X.', boards: {} }; @@ -8485,7 +8485,6 @@ if (g.VIEW === 'catalog' || !Conf['Linkify']) { return; } - this.regString = /((https?|mailto|git|magnet|ftp|irc):([a-z\d%\/])|[-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})(\/|(?!.))|[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}|[-\w\d.@]+@[a-z\d.-]+\.[a-z\d])/i; this.types = {}; _ref = this.ordered_types; for (_i = 0, _len = _ref.length; _i < _len; _i++) { @@ -8495,27 +8494,28 @@ 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); } + } + }, + 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; } test = /[^\s'"]+/g; @@ -8525,7 +8525,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)) { @@ -8557,28 +8557,25 @@ } } } - _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), 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, post) { + var data; + if (data = Linkify.services(link)) { + data.push(post); + if (Conf['Embedding']) { + Linkify.embed(data); + } + if (Conf['Link Title']) { + return Linkify.title(data); } } }, + regString: /((https?|mailto|git|magnet|ftp|irc):([a-z\d%\/])|[-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})([:\/]|(?!.))|[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}|[-\w\d.@]+@[a-z\d.-]+\.[a-z\d])/i, makeRange: function(startNode, endNode, startOffset, endOffset) { var range; range = document.createRange(); @@ -8587,7 +8584,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))) { @@ -8603,8 +8600,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++; @@ -8618,7 +8615,7 @@ range.setEnd(range.endContainer, range.endOffset - i); } } - if (!/(https?|mailto|git|magnet|ftp|irc):/.test(text)) { + if (!/(mailto:|.+:\/\/)/.test(text)) { text = (/@/.test(text) ? 'mailto:' : 'http://') + text; } a = $.el('a', { @@ -8629,6 +8626,7 @@ }); $.add(a, range.extractContents()); range.insertNode(a); + range.detach(); return a; }, services: function(link) { @@ -8641,14 +8639,14 @@ continue; } if (type.dummy) { - break; + return; } return [type.key, match[1], match[2], link]; } }, embed: function(data) { - var embed, href, key, link, name, options, uid, value, _ref; - key = data[0], uid = data[1], options = data[2], link = data[3]; + var embed, href, key, link, name, options, post, uid, value, _ref; + key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; href = link.href; embed = $.el('a', { className: 'embedder', @@ -8665,57 +8663,47 @@ value = _ref[name]; embed.dataset[name] = value; } - embed.dataset.nodedata = link.innerHTML; $.addClass(link, "" + embed.dataset.key); $.on(embed, 'click', Linkify.cb.toggle); $.after(link, [$.tn(' '), embed]); if (Conf['Auto-embed']) { - Linkify.cb.toggle.call(embed); + return Linkify.cb.toggle.call(embed); } - data.push(embed); }, title: function(data) { - var embed, err, key, link, options, service, title, titles, uid; - key = data[0], uid = data[1], options = data[2], link = data[3], embed = data[4]; + var err, key, link, options, post, service, title, titles, uid; + key = data[0], uid = data[1], options = data[2], link = data[3], post = data[4]; if (!(service = Linkify.types[key].title)) { return; } titles = Conf['CachedTitles']; if (title = titles[uid]) { - if (link) { - link.textContent = title[0]; - } - if (Conf['Embedding']) { - return embed.dataset.title = title[0]; - } + return link.textContent = title[0]; } 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) { err = _error; - if (link) { - link.innerHTML = "[" + key + "] Title Link Blocked (are you using NoScript?)"; - } - return; - } - if (title) { - titles[uid] = [title, Date.now()]; - return $.set('CachedTitles', titles); + link.innerHTML = 'Title Link Blocked (are you using NoScript?)'; + $.prepend(link, $.tn("[" + key + "] ")); } } }, - titleSync: function(value) { - return Conf['CachedTitles'] = value; - }, cb: { toggle: function() { - var string, _ref; - _ref = $.hasClass(this, "embedded") ? ['unembed', '(embed)'] : ['embed', '(unembed)'], string = _ref[0], this.textContent = _ref[1]; - $.replace(this.previousElementSibling, Linkify.cb[string](this)); + if ($.hasClass(this, "embedded")) { + $.rm(this.previousElementSibling); + this.previousElementSibling.hidden = false; + this.textContent = '(embed)'; + } else { + this.previousElementSibling.hidden = true; + $.before(this, Linkify.cb.embed(this)); + this.textContent = '(unembed)'; + } return $.toggleClass(this, 'embedded'); }, embed: function(a) { @@ -8724,45 +8712,35 @@ el.style.cssText = type.style != null ? type.style : "border: 0; width: 640px; height: 390px"; return el; }, - unembed: function(a) { - var el; - el = $.el('a', { - rel: 'nofollow noreferrer', - target: 'blank', - className: 'linkify', - href: a.dataset.href - }); - if (a.dataset.title) { - el.textContent = a.dataset.title; - } else { - el.innerHTML = a.dataset.nodedata; - } - $.addClass(el, a.dataset.key); - return el; - }, - title: function(response, data) { - var embed, key, link, options, service, text, uid; - key = data[0], uid = data[1], options = data[2], link = data[3], embed = data[4]; + title: function(req, data) { + var key, link, link2, options, post, post2, service, status, text, uid, _i, _j, _len, _len1, _ref, _ref1; + key = data[0], uid = data[1], options = data[2], link = data[3], post = 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; + 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"; + } + })()); + link.textContent = text; + _ref = post.clones; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + post2 = _ref[_i]; + _ref1 = $$('a', post2.nodes.comment); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + link2 = _ref1[_j]; + if (link2.href === link.href) { + link2.textContent = text; } - break; - case 404: - text = "[" + key + "] Not Found"; - break; - case 403: - text = "[" + key + "] Forbidden or Private"; - break; - default: - text = "[" + key + "] " + this.status + "'d"; - } - if (link) { - return link.textContent = text; + } } } }, @@ -8806,18 +8784,11 @@ regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/, style: 'border: 0; width: auto; height: auto;', el: function(a) { - var div, img, link; - img = $.el('img', { - src: a.dataset.href - }); - link = $.el('a', { - target: '_blank', - href: a.dataset.href - }); - div = $.el('div'); - $.add(link, img); - $.add(div, link); - return div; + var el; + el = $.el('div'); + el.innerHTML = ''; + el.firstChild.href = el.firstChild.firstChild.src = a.dataset.href; + return el; } }, { key: 'InstallGentoo', @@ -8857,13 +8828,13 @@ var el; el = $.el('div'); $.cache("https://mediacru.sh/" + a.dataset.uid + ".json", function() { - var embed, file, files, status, type, _i, _j, _len, _len1, _ref; + var embed, ext, file, files, i, status, type, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _results, _results1; status = this.status; if (status !== 200 && status !== 304) { return el.textContent = "ERROR " + status; } files = this.response.files; - _ref = ['video/mp4', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'image/svg', 'audio/mpeg']; + _ref = ['video/mp4', 'video/webm', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'audio/mpeg', 'audio/ogg']; for (_i = 0, _len = _ref.length; _i < _len; _i++) { type = _ref[_i]; for (_j = 0, _len1 = files.length; _j < _len1; _j++) { @@ -8882,20 +8853,35 @@ } switch (embed.type) { case 'video/mp4': + case 'video/webm': case 'video/ogv': - return el.innerHTML = ""; + el.innerHTML = ''; + _ref1 = ['mp4', 'webm', 'ogv']; + _results = []; + for (i = _k = 0, _len2 = _ref1.length; _k < _len2; i = ++_k) { + ext = _ref1[i]; + _results.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); + } + return _results; + break; + case 'image/svg+xml': case 'image/png': case 'image/gif': case 'image/jpeg': - case 'image/svg': - case 'image/svg+xml': - return $.add(el, $.el('a', { - target: '_blank', - href: a.dataset.href, - innerHTML: "" - })); + el.innerHTML = ''; + el.firstChild.href = a.dataset.href; + return el.firstChild.firstChild.src = "https://mediacru.sh/" + file.file; case 'audio/mpeg': - return el.innerHTML = ""; + case 'audio/ogg': + el.innerHTML = ''; + _ref2 = ['ogg', 'mp3']; + _results1 = []; + for (i = _l = 0, _len3 = _ref2.length; _l < _len3; i = ++_l) { + ext = _ref2[i]; + _results1.push(el.firstChild.children[i].src = "https://mediacru.sh/" + a.dataset.uid + "." + ext); + } + return _results1; + break; default: return el.textContent = "ERROR: No valid filetype."; } @@ -8923,23 +8909,15 @@ }, { key: 'SoundCloud', regExp: /.*(?:soundcloud.com\/|snd.sc\/)([^#\&\?]*).*/, - style: 'height: auto; width: 500px; display: inline-block;', + style: 'border: 0; width: 500px; height: 400px;', el: function(a) { - var div; - div = $.el('div', { - className: "soundcloud", - name: "soundcloud" + return $.el('iframe', { + src: "//w.soundcloud.com/player/?visual=true&show_comments=false&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(a.dataset.uid)) }); - $.ajax("//soundcloud.com/oembed?show_artwork=false&&maxwidth=500px&show_comments=false&format=json&url=https://www.soundcloud.com/" + a.dataset.uid, { - onloadend: function() { - return div.innerHTML = JSON.parse(this.responseText).html; - } - }, false); - return div; }, title: { api: function(uid) { - return "//soundcloud.com/oembed?show_artwork=false&&maxwidth=500px&show_comments=false&format=json&url=https://www.soundcloud.com/" + uid; + return "//soundcloud.com/oembed?format=json&url=https%3A%2F%2Fsoundcloud.com%2F" + (encodeURIComponent(uid)); }, text: function(_) { return _.title; @@ -8959,19 +8937,27 @@ regExp: /.*(?:twitch.tv\/)([^#\&\?]*).*/, style: "border: none; width: 640px; height: 360px;", el: function(a) { - var channel, chapter, result, _; - if (result = /(\w+)\/(?:[a-z]\/)?(\d+)/i.exec(a.dataset.uid)) { - _ = result[0], channel = result[1], chapter = result[2]; - return $.el('object', { - data: 'http://www.twitch.tv/widgets/archive_embed_player.swf', - innerHTML: "\n" + var channel, id, idparam, obj, result, type, _; + if (result = /(\w+)\/([bc])\/(\d+)/i.exec(a.dataset.uid)) { + _ = result[0], channel = result[1], type = result[2], id = result[3]; + idparam = { + 'b': 'archive_id', + 'c': 'chapter_id' + }; + obj = $.el('object', { + data: 'http://www.twitch.tv/widgets/archive_embed_player.swf' }); + obj.innerHTML = ''; + obj.children[1].value = "channel=" + channel + "&start_volume=25&auto_play=false&" + idparam[type] + "=" + id; + return obj; } else { channel = (/(\w+)/.exec(a.dataset.uid))[0]; - return $.el('object', { - data: "http://www.twitch.tv/widgets/live_embed_player.swf?channel=" + channel, - innerHTML: "\n\n" + obj = $.el('object', { + data: "http://www.twitch.tv/widgets/live_embed_player.swf?channel=" + channel }); + obj.innerHTML = ''; + obj.children[1].value = "hostname=www.twitch.tv&channel=" + channel + "&auto_play=true&start_volume=25"; + return obj; } } }, { diff --git a/builds/updates.xml b/builds/updates.xml index 83fb3a91f..41d78133c 100644 --- a/builds/updates.xml +++ b/builds/updates.xml @@ -1,7 +1,7 @@ - + diff --git a/package.json b/package.json index 9b066166f..db4899930 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "4chan-X", - "version": "1.7.31", + "version": "1.7.32", "description": "Cross-browser userscript for maximum lurking on 4chan.", "meta": { "name": "4chan X",