Javascript Link Fixer

Converts Javascript links that open new windows into regular old links

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

  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.1.3
  6. // @grant none
  7.  
  8. // ==/UserScript==
  9.  
  10. var links = document.querySelectorAll("a[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.indexOf("void") > -1) continue;
  19. var hrefSplitter = /javascript:(\S+)\((\S+(?:,(?: )\S+)*)?\)/.exec(links[l].href);
  20. if(hrefSplitter == null) continue;
  21. var functionName = hrefSplitter[1];
  22. var params = hrefSplitter[2] ? decodeURIComponent(hrefSplitter[2]).split(",") : [];
  23. var functionDig = deconstructFunction(functionName,params);
  24. if(functionDig != null) links[l].href = functionDig;
  25. }
  26.  
  27. function deconstructFunction(functionName,params)
  28. {
  29. var sourceCode = uneval(window[functionName]);
  30. var functionBody = sourceCode.substring(sourceCode.indexOf("{") + 1,sourceCode.indexOf("}")).trim();
  31. var args = /\(((?: )?\S+(?:,(?: )\S+)*)?(?: )?\)/.exec(sourceCode);
  32. args = args ? args[1].split(/\s*,\s*/) : [];
  33. var containedFunctions = (/(\S+\(\S+(?:,(?: )\S+)*\);)/g.exec(functionBody));
  34. var variableDefs = /(\S+) ?= ?(.+);/g.exec(functionBody);
  35. if(containedFunctions)
  36. {
  37. containedFunctions.shift();
  38. for(var s = 0; s < containedFunctions.length; s++)
  39. {
  40. var capture = /(\S+)\((\S+(?:,(?: )\S+)*)?\);/.exec(containedFunctions[s]);
  41. var statementName = capture[1];
  42. var statementParams = capture[2];
  43. if(variableDefs)
  44. {
  45. for(var v = 1; v < variableDefs.length; v += 2)
  46. {
  47. statementParams = statementParams.replace(new RegExp(" ?\\+ ?" + variableDefs[v],"g"), " + " + variableDefs[v + 1]);
  48. statementParams = statementParams.replace(new RegExp(variableDefs[v],"g"), variableDefs[v + 1]);
  49. }
  50. }
  51. for(var a = 0; a < params.length; a++)
  52. {
  53. statementParams = statementParams.replace(new RegExp(" ?\\+ ?" + args[a],"g"), " + " + params[a]);
  54. statementParams = statementParams.replace(new RegExp(args[a],"g"), params[a]);
  55. }
  56. statementParams = eval("[" + statementParams + "]");
  57. if(paramTable.hasOwnProperty(statementName)) return(statementParams[paramTable[statementName]]);
  58. var digDeeper = deconstructFunction(statementName,statementParams);
  59. if(digDeeper) return digDeeper;
  60. }
  61. }
  62. if(functionBody.indexOf(".location = ") > -1)
  63. {
  64. var test = /\.location ?= ?(\S+);/.exec(functionBody)[1];
  65. for(var p = 0; p < params.length; p++)
  66. {
  67. if(test == args[p]) return params[p];
  68. }
  69. }
  70. return null;
  71. }