Javascript Link Fixer

Converts Javascript links that open new windows into regular old links

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