Linkify·改

文本转超链接

  1. // ==UserScript==
  2. // @name Linkify·改
  3. // @version 1.1.5.1
  4. // @author 极品小猫
  5. // @description 文本转超链接
  6. // @en:description Looks for things in the page that look like URLs but aren't hyperlinked, and converts them to clickable links.
  7. // @include *://*/*
  8. // @exclude http*://www.baidu.com/*
  9. // @exclude http*://www.google.com/*
  10. // @exclude http*://note.sdo.com/*
  11. // @exclude https://pan.baidu.com/*
  12. // @require https://cdn.staticfile.org/jquery/2.1.4/jquery.min.js
  13. // @run-at document-idle
  14. // @grant GM_addStyle
  15. // @grant GM_notification
  16. // @grant GM_registerMenuCommand
  17. // @grant unsafeWindow
  18. // @namespace https://gf.qytechs.cn/users/3128
  19. // @license GPL-3.0
  20. // ==/UserScript==
  21.  
  22. function Linkify() {
  23. GM_addStyle('.newhref{border:2px dashed red!important;display:inline-block!important;padding:5px!important;margin:5px 0!important;}.newhref:hover{border-color:#E9aa2f!important;}');
  24.  
  25. let matchRule = `[^\\s+"\\\'<>,\\[\\]()\:\\*\\u4E00-\\u9FFF]`,
  26. urlRegexRule=[ //协议规则,正则模式,\需要转义\\
  27. `https?:\\/\\/[^\\/]+/?(${matchRule}+|$)`, //ALLhttp通用规则
  28. '(?:https?:\\/\\/)?\\w+(%E7%82%B9|点)\\w+(%E7%82%B9|点)\\w+\\/[^\\s+"\\\'<>,\\[\\]()\:\\*\\u4E00-\\u9FFF]+', //域名中包含中文 . → 点
  29. 'https?:\\/\\/mega.nz\\/#!\w+![^\\s+"\'<>,\\]]+', //mega 专用规则
  30. 'ed2k:\\/\\/\\|file\\|[^\\|]+\\|\\d+\\|\\w{32}\\|(?:h=\\w{32}\\|)?\\/', //ed2k专用规则
  31. 'magnet:\\?xt=urn:btih:\\w{40}(&[\\w\\s]+)?' //magnet 专用规则
  32. ], urlRegexStr=urlRegexRule.join('|');
  33. var urlRegex=new RegExp(`\\b(${urlRegexStr})`,'ig'); //协议规则,正则模式,\需要转义\\
  34.  
  35. //ed2k://|file|mura-041616_381.mp4|1874185231|E7D60A7A854CF7AE0FF77AC306808760|h=SYGOH7KKTWHJNA4OBVAEOANW27FT5RJE|/
  36.  
  37. // tags we will scan looking for un-hyperlinked urls
  38. var allowedParents = [ //允许处理的文本的父标签
  39. "body",
  40. "code", "blockquote",
  41. "abbr", "acronym", "address", "applet", "b", "bdo", "big",
  42. "caption", "center", "cite", "dd", "del", "div", "dfn", "dt", "em",
  43. "fieldset", "font", "form", "i", "iframe",
  44. "ins", "kdb", "li", "object", "pre[not(contains(@class, 'brush'))]", "p", "q", "samp", "small", "span", "strike", "font",
  45. "s", "strong", "sub", "sup", "td", "th", "tt", "u", "var",
  46. "h1", "h2", "h3", "h4", "h5", "h6",
  47. 'url','img'
  48. ];
  49. //[not(contains(@class, "brush"))],避免与 SyntaxHighlighter 高亮插件冲突
  50.  
  51. let allowedParentsRule = allowedParents.join(" or parent::");
  52. let xpath = `//text()[(parent::${allowedParentsRule}) and (contains(translate(., 'HTTP', 'http'), 'http') or contains(translate(., 'MAGNET', 'magnet'), 'magnet') or contains(translate(., 'ED2K', 'ed2k'), 'ed2k'))]`;
  53.  
  54. var candidates = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  55.  
  56. for (var cand = null, i = 0; (cand = candidates.snapshotItem(i)); i++) {
  57. if (urlRegex.test(cand.nodeValue)) {
  58. var span = document.createElement("span"); //为超链接创建span标签作为容器
  59. var source = cand.nodeValue;
  60. //console.log(cand);
  61.  
  62. cand.parentNode.replaceChild(span, cand);
  63.  
  64. urlRegex.lastIndex = 0;
  65. for (var match = null, lastLastIndex = 0; (match = urlRegex.exec(source)); )
  66. {
  67. span.appendChild(document.createTextNode(source.substring(lastLastIndex, match.index)));
  68. //console.log(match);
  69.  
  70. if(/\.(?:gif|jpg|png|bmp|webp)(?:\?.+?)?$/.test(match[0])){//如果是图片链接,则创建有图片地址的连接
  71. span.innerHTML='<img src="'+match[0]+'" class="newhref"/><br>';
  72. }
  73.  
  74. var Mtxt=match[0]; //取得链接
  75. var Rtxt=/paco-\d{6}_\d{3}/i.test(Mtxt) ? Mtxt.replace(/paco-(\d{6}_\d{3})/i,'pacopacomama $1') : Mtxt; //替换链接内容
  76.  
  77. var a = document.createElement("a");
  78. a.href=Rtxt;
  79. a.className='newhref';
  80. a.target="blank";
  81. a.appendChild(document.createTextNode(decodeURIComponent(Rtxt)));
  82. span.appendChild(a);
  83.  
  84. lastLastIndex = urlRegex.lastIndex;
  85. }
  86.  
  87. span.appendChild(document.createTextNode(source.substring(lastLastIndex)));
  88. span.normalize();
  89. }
  90. }
  91. }
  92.  
  93. function ViewIMG(){
  94. var oA=document.getElementsByTagName('a');
  95. for(var i in oA){
  96. //console.log(oA[i].href);
  97. if(!oA.selector('img')) {
  98. if(/\.(?:jpg|png|gif)$/i.test(oA[i].href)){
  99. oA[i].innerHTML+='<img src="'+oA[i].href+'">';
  100. }
  101. }
  102. }
  103. }
  104.  
  105. function ViewVideo(){
  106. $('a[href*=".mp4"], a[href*=".m3u8"]').each(function(){
  107. $('<video controls preload>').attr({'src':this.href}).insertAfter(this);
  108. });
  109. }
  110.  
  111. var Host=location.hostname.replace(/^www\./i,'').toLowerCase();
  112. var paths=location.pathname;
  113. var search=location.search;
  114.  
  115. if(localStorage['Linkify']){
  116. Linkify();
  117. } else if(/(\/thread-\d+-)/i.test(paths)||/mod=viewthread/i.test(search)) {
  118. //DZ论坛监听
  119. Linkify();
  120. window.addEventListener('load', function(){
  121. addMutationObserver('#postlist', Linkify);
  122. });
  123. }
  124.  
  125. function addMutationObserver(selector, callback, Kill) {
  126. var watch = document.querySelector(selector);
  127.  
  128. if (!watch) return;
  129. var observer = new MutationObserver(function(mutations){
  130. var nodeAdded = mutations.some(function(x){ return x.addedNodes.length > 0;});
  131. if (nodeAdded) {
  132. callback(mutations);
  133. }
  134. });
  135. observer.observe(watch, {childList: true, subtree: true});
  136. }
  137.  
  138. function LS_Setting(conf_name, tips, fn){
  139. if(localStorage[conf_name]) {
  140. delete localStorage[conf_name];
  141. NotifMe('已关闭【自动】' + tips + ',\n请刷新页面。');
  142. } else {
  143. localStorage[conf_name]=true;
  144. NotifMe('已打开【自动】' + tips);
  145. fn();
  146. }
  147. }
  148.  
  149. var NotifMe = function(text){
  150. GM_notification(
  151. {
  152. 'text' : text,
  153. 'timeout' : 5*1000,
  154. 'image' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABgFBMVEX///8AAAAiIiIkJCT///8AAAD///////////////8AAAD///////////////8mJib///8GBgYDAwP///8MDAz///8JCQn///8ODg4cHBwZGRkUFBT///8REREhISH////AwMAeHh7///////9bW1tycnL///////////////8WFhYAAABcXFwrKyvGxsb///8fHx9xcXH////////X19f///////////////////////////////8/Pz9lZWWpqak8PDx6enrDw8Py8vL///9FRUVsbGx1dXWHh4eLi4ucnJyysrL////19fX///84ODhMTExPT09YWFhgYGCWlpaurq69vb3////MzMzo6Oj///////////////////////////////////////////////////8yMjI1NTVUVFSUlJSRkZGioqK6urrMzMzb29vs7Oz19fX///////9/f3+kpKShoaGhoaGsrKzQ0NDg4OD39/dUVFRZWVn///////+LY0rSAAAAgHRSTlOZAOvqjPuTkZeY+bOpnI7qifb3lfSk9Yrz7u7xn/Lssa3tt6bYy5CEd2fv/dfnrHrszLWrpIJVU1BGNRYI3dC44Mitmn/czsvFw72xoZqG4NvY1NO+t6+up6BuYVdNQTw6NykjFAsG5OPWwMC3saujoZ6DEsq6ura0o6KU2th0EeQqZS4AAAWWSURBVFjDtZf3U9swFMfdWLZl2XE84pGdkJKdpoWy96asQhmF7r333v3XK9lxHUAO3PWqH7iL8Oer9/SGJOZMyBi7e/N6pQwEAZQr12/eHQv7ji5wb3AgKks5uWjiUZRzkhwdGLx3WoGHI++KkpyOMh0jmpal4ruRh6cQGB8y8HoMZWCbjKHxkwRu8ZLJiAx1iIwp8be6Coy1JFkMwRloGJCRpdZYuMCddC4agvNAFQyoqADm0nfCBG7kZEjHBbD+aXlyeuLC8hdeNXM36ALVvjSdF8HBTEzntIyD/zx+zvM9VZrAtZ4Q8w17NcFlsmwED/Z8vP5kH/RcOy5QDeN5MIMsTPuDRdae7dsQCAyF871cEvPBiMX1WdAzdFhgNJcO5xOEZwspK54qsK6C9ZqXRjsFfq/J8ARes5pPt5qW5f5Am4q59r5DoJIL4y9wBdd+NL06x/NzX6YR+ZVFL1WpFQjc7ouewHM/SzYPIW+XziI8wepbgijd9gUeGbLYlc9yDaXkzSnKhI6nkok3gmw8agsM94XwvSjBkthz24rgz9qv4olI5Lz+CYh9w57AuGGKXdZnE9wiEIK0gpczxIcrAjSNcVdgRKLWHlji3PVTaAbzwbwwqWGvMtOMwUgjrsBAP80AdcXjM/qOzTPHBJwJaIj9A0TgPrX/gFdaCvMxR1tVgxAHLqBJRcQ96j4WGKR5APkneozknJafB/5kxyYW4nsK/iENYoF5mSJgT6GIu/65yu5z0GFCSZkmYUzFGOKXPH+GeRBN0wxY0Ei0nXOVPKp/DpwQQAOxrgeAbFw6+oAZ7adsAf+mkCT5u/xrVnNq6IUttnmlwZHETFqvFbdR948yw7QtAB+185FILbKet+IxHMgptc2fdfkIt2R7H0rDTPXqEeuJx/YlREK19T3BNd1Q5kEHz6LHRjszrlaZinzYeDgFecZ+TgSsKyDvWMRlKzknRH37WS2JHfCGXGHKxUM8WKwvAt6zIDMNy/spVwFnI1/y+dpF2/++WGaAeaR+aqgXbDzTs3irkgcl+2LSYbEWK5Y26+xRnjEBI5hH+0+CW1IPkm4ULqjixkv9PK4+tKtuowLb5gMBwRcI+AibrS+BhTgWSGj5DShsxl0fNvB/CzGfDwSAebR+Y4419W6FI+ZmrFlVfYa84lGwf3rS4wMXgk00vPolPfecyq/HHNarhdYKypLcfWvwYNvx+WAT/TCK6qWAJ8XAYdeJNfldnQg03/I4xt9KbTIIo59IYE+veWsSnoHKZN09ReofpvRIW4CBQWfxE8lPZWEuYQXrt9Men4fcpLLpuEnF0zq/NOwXE/iAAr6tsM0luUbrhbud3LJK4UkxeeWMNy1D+p+D+aB0e+s/5vc14lnBmlWO86Sc2w0FfCQ7lUVT5c68FHbtr7rjHiQTAs0Ded5vafYyx5Jg88ahm0VrX4/HSEahWUDhSUvzmirkr1gkdZ8ddlTNay4fwQUmUnjSVL22boiXM0Rgx6byXKPEU3jc1v2DxRAnHCKwolL5s4pAc8A/WMahCUuLJFv0C0A8PS+acNw/XBmcx6QLZ96A06+PD9fgeAerpIuy2pbihRtu7J3IB8f7mdsShE8cN+Ea31XB4G3wwnK680zUv2CQ0cqpO17D1h/vHMytrz5FqRN4KFU67kjv19aEpk4Q1kGxZjOuZ9kTeDm4ZJExKvHnNMeFsrUUuc1158W0NHr0ogle6nHC+YPNduGjfUPHr7p23kIR9i+fqjfC+Z4q7bINvi5wWjJL8ESKq10qhfK0yzaxgVc+LyR1PRNHmWbvRdWg8zDdVw15cEimKnxbeXp5YWZ2DpSYEL6Yu9HlySMKQDAgUAwxzHz85On+6GKgATFNx0Xy6PrHZ99/fHgGT98y/elbHnn4Hx7f//z8/wPVQMFGiQjPbgAAAABJRU5ErkJggg==',
  155. });
  156. }
  157.  
  158. GM_registerMenuCommand('开/关【自动】文本转超链接', function(){
  159. LS_Setting('Linkify', '文本转超链接功能', Linkify)
  160. });
  161. GM_registerMenuCommand('开/关【自动】图片链接显示', function(){
  162. LS_Setting('LinkifyIMG', '图片链接显示', ViewIMG);
  163. })
  164.  
  165. GM_registerMenuCommand('文本转链接', Linkify);
  166. GM_registerMenuCommand('显示直连链接图片', ViewIMG);
  167. GM_registerMenuCommand('显示直连视频', ViewVideo);

QingJ © 2025

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