Convert Any links to Clickable Links

Convert plain text URLs and domain names into clickable links

目前为 2025-02-23 提交的版本。查看 最新版本

// ==UserScript==
// @name         Convert Any links to Clickable Links 
// @namespace    kdroidwin.hatenablog.com/
// @version      1.0
// @description  Convert plain text URLs and domain names into clickable links 
// @author       Kdroidwin
// @match        *://*/* 
// @grant        none
// @license MIT 
// ==/UserScript==

(function() { 'use strict';

function convertTextToLinks() {
    const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, {
        acceptNode: node => {
            if (node.parentNode && node.parentNode.tagName !== 'A' && /(https?:\/\/[^\s]+|(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,})/.test(node.nodeValue)) {
                return NodeFilter.FILTER_ACCEPT;
            }
            return NodeFilter.FILTER_REJECT;
        }
    });
    
    let nodes = [];
    while (walker.nextNode()) {
        nodes.push(walker.currentNode);
    }
    
    nodes.forEach(node => {
        const fragment = document.createDocumentFragment();
        const parts = node.nodeValue.split(/(https?:\/\/[^\s]+|(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,})/g);
        
        parts.forEach(part => {
            if (/https?:\/\//.test(part)) {
                const link = document.createElement('a');
                link.href = part;
                link.textContent = part;
                link.target = '_blank';
                fragment.appendChild(link);
            } else if (/(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}/.test(part)) {
                const link = document.createElement('a');
                link.href = 'https://' + part;
                link.textContent = part;
                link.target = '_blank';
                fragment.appendChild(link);
            } else {
                fragment.appendChild(document.createTextNode(part));
            }
        });
        
        node.parentNode.replaceChild(fragment, node);
    });
}

convertTextToLinks();
new MutationObserver(convertTextToLinks).observe(document.body, { childList: true, subtree: true });

})();