Javascript Link Fixer

Converts Javascript links that open new windows into regular old links

当前为 2016-01-11 提交的版本,查看 最新版本

// ==UserScript==
// @name          Javascript Link Fixer
// @namespace     DoomTay
// @description   Converts Javascript links that open new windows into regular old links
// @version       1.1.3
// @grant         none

// ==/UserScript==

var links = document.querySelectorAll("a[href *= 'javascript:']");

var paramTable = {};
	paramTable["open"] = 0;
	paramTable["window.open"] = 0;

for (var l = 0; l < links.length; l++)
{
	if(links[l].href.indexOf("void") > -1) continue;
	var hrefSplitter = /javascript:(\S+)\((\S+(?:,(?: )\S+)*)?\)/.exec(links[l].href);
	if(hrefSplitter == null) continue;
	var functionName = hrefSplitter[1];
	var params = hrefSplitter[2] ? decodeURIComponent(hrefSplitter[2]).split(",") : [];
	var functionDig = deconstructFunction(functionName,params);
	if(functionDig != null) links[l].href = functionDig;
}

function deconstructFunction(functionName,params)
{
	var sourceCode = uneval(window[functionName]);
	var functionBody = sourceCode.substring(sourceCode.indexOf("{") + 1,sourceCode.indexOf("}")).trim();
	var args = /\(((?: )?\S+(?:,(?: )\S+)*)?(?: )?\)/.exec(sourceCode);
	args = args ? args[1].split(/\s*,\s*/) : [];
	var containedFunctions = (/(\S+\(\S+(?:,(?: )\S+)*\);)/g.exec(functionBody));
	var variableDefs = /(\S+) ?= ?(.+);/g.exec(functionBody);
	if(containedFunctions)
	{
		containedFunctions.shift();
		for(var s = 0; s < containedFunctions.length; s++)
		{
			var capture = /(\S+)\((\S+(?:,(?: )\S+)*)?\);/.exec(containedFunctions[s]);
			var statementName = capture[1];
			var statementParams = capture[2];
			if(variableDefs)
			{
				for(var v = 1; v < variableDefs.length; v += 2)
				{
					statementParams = statementParams.replace(new RegExp(" ?\\+ ?" + variableDefs[v],"g"), " + " + variableDefs[v + 1]);
					statementParams = statementParams.replace(new RegExp(variableDefs[v],"g"), variableDefs[v + 1]);
				}
			}
			for(var a = 0; a < params.length; a++)
			{
				statementParams = statementParams.replace(new RegExp(" ?\\+ ?" + args[a],"g"), " + " + params[a]);
				statementParams = statementParams.replace(new RegExp(args[a],"g"), params[a]);
			}
			statementParams = eval("[" + statementParams + "]");
			if(paramTable.hasOwnProperty(statementName)) return(statementParams[paramTable[statementName]]);
			var digDeeper = deconstructFunction(statementName,statementParams);
			if(digDeeper) return digDeeper;
		}
	}
	if(functionBody.indexOf(".location = ") > -1)
	{
		var test = /\.location ?= ?(\S+);/.exec(functionBody)[1];
		for(var p = 0; p < params.length; p++)
		{
			if(test == args[p]) return params[p];
		}
	}
	return null;
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址