Javascript Link Fixer

Converts Javascript links that open new windows into regular old links

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

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