46 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
(function () {
 | 
						|
    var re = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-]*)?\??(?:[\-\+:=&;%@\.\w]*)#?(?:[\.\!\/\\\w]*))?)/g;
 | 
						|
    function textNodesUnder(node) {
 | 
						|
        var textNodes = [];
 | 
						|
        if(typeof document.createTreeWalker === 'function') {
 | 
						|
            // Efficient TreeWalker
 | 
						|
            var currentNode, walker;
 | 
						|
            walker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null, false);
 | 
						|
            while(currentNode = walker.nextNode()) {
 | 
						|
                textNodes.push(currentNode);
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            // Less efficient recursive function
 | 
						|
            for(node = node.firstChild; node; node = node.nextSibling) {
 | 
						|
                if(node.nodeType === 3) {
 | 
						|
                    textNodes.push(node);
 | 
						|
                } else {
 | 
						|
                    textNodes = textNodes.concat(textNodesUnder(node));
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return textNodes;
 | 
						|
    }
 | 
						|
 | 
						|
    function processNode(node) {
 | 
						|
        re.lastIndex = 0;
 | 
						|
        var results = re.exec(node.textContent);
 | 
						|
        if(results !== null) {
 | 
						|
            if($(node).parents().filter('code').length === 0) {
 | 
						|
                $(node).replaceWith(
 | 
						|
                    $('<span />').html(
 | 
						|
                        node.nodeValue.replace(re, '<a href="$1">$1</a>')
 | 
						|
                    )
 | 
						|
                );
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    jQuery.fn.autolink = function () {
 | 
						|
        this.each(function () {
 | 
						|
            textNodesUnder(this).forEach(processNode);
 | 
						|
        });
 | 
						|
        return this;
 | 
						|
    };
 | 
						|
})();
 |