Javascript Link Fixer

Converts Javascript links that open new windows into regular old links

目前为 2016-01-30 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Javascript Link Fixer
  3. // @namespace DoomTay
  4. // @description Converts Javascript links that open new windows into regular old links
  5. // @version 1.2.3
  6. // @grant none
  7.  
  8. // ==/UserScript==
  9.  
  10. var links = document.querySelectorAll("[href *= 'javascript:']");
  11.  
  12. var paramTable = {};
  13. paramTable["open"] = 0;
  14. paramTable["window.open"] = 0;
  15.  
  16. for (var l = 0; l < links.length; l++)
  17. {
  18. if(links[l].href == undefined) continue;
  19. if(links[l].href.indexOf("void") > -1) continue;
  20. if(links[l].href.substring(11) == "" || links[l].href.substring(11) == ";") continue;
  21. var hrefSplitter = /javascript:(\S+)\((\S+(?:,(?: )\S+)*)?\)/.exec(links[l].href);
  22. if(hrefSplitter == null) continue;
  23. var functionName = decodeURIComponent(hrefSplitter[1]).trim();
  24. var params = hrefSplitter[2] ? eval("[" + decodeURIComponent(hrefSplitter[2]) + "]") : [];
  25. var functionDig = deconstructFunction(functionName,params);
  26. if(functionDig != null)
  27. {
  28. links[l].setAttribute("onclick",decodeURIComponent(links[l].href).substring(links[l].href.indexOf("javascript:") + 11) + "; return false");
  29. links[l].href = functionDig;
  30. }
  31. }
  32.  
  33. function deconstructFunction(functionName,params)
  34. {
  35. if(functionName == "history.go") return null;
  36. var sourceCode = uneval(window[functionName]);
  37. var functionBody = sourceCode.substring(sourceCode.indexOf("{") + 1,sourceCode.lastIndexOf("}")).trim();
  38. while(functionBody.indexOf(functionName + ".arguments") > -1) functionBody = functionBody.replace(functionName + ".arguments","params");
  39. var args = /\(((?: )?\S+(?:,(?: )\S+)*)?(?: )?\)/.exec(sourceCode);
  40. args = args && args[1] ? args[1].split(/\s*,\s*/) : [];
  41. var containedFunctions = functionBody.match(/(\S+\(\S+(?:,(?: )?\S+)*\))/g) || [];
  42. var ifCollection = functionBody.match(/if ?\([a-zA-z '?=+&.<>!()0-9;]+\)[ \n\t]+?{[\s\S][\na-zA-z '?=+.,">\/()0-9;!@#$%^&*\t]+[\s]+}/g);
  43. var variableMatches = functionBody.match(/(\S+ ?= ?.+)/g);
  44. var variableDefs = [];
  45. if(variableMatches)
  46. {
  47. for(var m = 0; m < variableMatches.length; m++)
  48. {
  49. if(variableMatches[m].indexOf("==") > -1 || variableMatches[m].indexOf("!=") > -1 || variableMatches[m].indexOf("//") > -1 || variableMatches[m].indexOf(">=") > -1 || variableMatches[m].indexOf("<=") > -1) continue;
  50. if(containedFunctions != null && containedFunctions.some(elem => variableMatches[m].substring(variableMatches[m].indexOf("=") + 1).trim().indexOf(elem) > -1)) continue;
  51. if(/.+\(/.test(variableMatches[m]) && variableMatches[m].indexOf("eval(") == -1) continue;
  52. if(variableMatches[m].indexOf("+=") > -1) continue;
  53. variableDefs.push(variableMatches[m].match(/(\S+) ?= ?(.+?;)/).slice(1, 3));
  54. }
  55. }
  56.  
  57. for(var a = 0; a < params.length; a++)
  58. {
  59. eval(args[a] + "= \"" + params[a] + "\"");
  60. }
  61.  
  62. if(variableDefs)
  63. {
  64. for(var v = 0; v < variableDefs.length; v++)
  65. {
  66. //Making sure we're not altering any properties
  67. if(variableDefs[v][0].indexOf(".") == -1)
  68. {
  69. if(variableDefs[v][1].indexOf("eval(") > -1) variableDefs[v][1] = variableDefs[v][1].replace(/eval\((.+)\)/,"$1");
  70. console.log("Evaling",variableDefs[v]);
  71. if(variableDefs[v][0] == "location" || variableDefs[v][0].indexOf("window.location")) continue;
  72. eval(variableDefs[v][0] + "= " + variableDefs[v][1].toString());
  73. }
  74. }
  75. }
  76. if(ifCollection)
  77. {
  78. for(var i = 0; i < ifCollection.length; i++)
  79. {
  80. eval(ifCollection[i]);
  81. }
  82. }
  83. if(variableDefs)
  84. {
  85. for(var v = 0; v < variableDefs.length; v++)
  86. {
  87. if(variableDefs[v][0].indexOf(".location") > -1)
  88. {
  89. return eval(variableDefs[v][1]);
  90. }
  91. }
  92. }
  93. if(containedFunctions)
  94. {
  95. for(var f = 0; f < containedFunctions.length; f++)
  96. {
  97. var capture = /(\S+)\((\S+(?:,(?: )?\S+)*)?\);?/.exec(containedFunctions[f]);
  98. var statementName = capture[1];
  99. if(statementName == "if") continue;
  100. var statementParams = capture[2];
  101. statementParams = eval("[" + statementParams + "]");
  102. if(paramTable.hasOwnProperty(statementName)) return(statementParams[paramTable[statementName]]);
  103. var digDeeper = deconstructFunction(statementName,statementParams);
  104. if(digDeeper) return digDeeper;
  105. }
  106. }
  107. if(functionBody.indexOf(".location = ") > -1)
  108. {
  109. var test = /\.location ?= ?(\S+);/.exec(functionBody)[1];
  110. for(var p = 0; p < params.length; p++)
  111. {
  112. if(test == args[p]) return params[p];
  113. }
  114. }
  115. return null;
  116. }