// ==UserScript== // @name Direct links // @name:ru Прямые ссылки // @namespace FIX // @version 0.0.1 // @description Direct links out // @description:ru Замена ссылок на прямые // @author raletag // @match *://*/* // @grant unsafeWindow // @downloadURL none // ==/UserScript== (function() { 'use strict'; console.time('Direct links load'); var win = unsafeWindow || window; function Handler (e) { console.time('HandlerTime'); try { var link = e.target, url = link.href, tourl, base64; if (!url) { while (!url && link !== this) { link = link.parentNode; url = link.href; } } link.removeEventListener('mouseover', Handler, false); if (!url) { return true; } tourl = decodeURIComponent((url.match(/[?&](url|r|to|u|go)=([^&]*)(&|$)/i)||url.match(/(\/leech_out\.php\?.:|\/phpBB2\/goto\/|\/go\/\?)([^&]*)(&|$)/i)||[])[2]); if (!tourl) { return true; } try { base64 = win.atob(tourl); } catch (err) { } if (base64) { tourl = base64; } if (tourl.match(/^http(|s):\/\/([^&]*)/i)) { tourl = decodeURIComponent(escape(tourl)); console.group("Direct links"); console.info(url); console.info(tourl); console.timeEnd('HandlerTime'); console.groupEnd(); link.href = tourl; } } catch (err) { console.error('Direct links error: ' + err); console.timeEnd('HandlerTime'); alert('Direct links error: ' + err); return true; } return true; } var links = document.getElementsByTagName('a'); for (var i = links.length - 1; i >= 0; --i) { links[i].addEventListener('mouseover', Handler, false); } document.addEventListener('DOMNodeInserted',function(e){ if (!e.currentTarget) return true; var links = e.currentTarget.getElementsByTagName('a'); for (var i = links.length - 1; i >= 0; --i) { links[i].addEventListener('mouseover', Handler, false); } }); console.timeEnd('Direct links load'); })();