/* encoding: utf-8 **** linkify plugin for jQuery - automatically finds and changes URLs in text content into proper hyperlinks **** Version: 1.0 Copyright (c) 2009 Már Örlygsson (http://mar.anomy.net/) & Hugsmiðjan ehf. (http://www.hugsmidjan.is) Dual licensed under a MIT licence (http://en.wikipedia.org/wiki/MIT_License) and GPL 2.0 or above (http://www.gnu.org/licenses/old-licenses/gpl-2.0.html). ----------------------------------------------------------------------------- Demo and Qunit-tests: * <./jquery.linkify-1.0-demo.html> * <./jquery.linkify-1.0-test.html> Documentation: * ... Get updates from: * * ----------------------------------------------------------------------------- Requires: * jQuery (1.2.6 or later) Usage: jQuery('.articlebody').linkify(); // adding plugins: jQuery.extend( jQuery.fn.linkify.plugins, { name1: { re: RegExp tmpl: String/Function }, name2: function(html){ return html; } }); // Uses all plugins by default: jQuery('.articlebody').linkify(); // Use only certain plugins: jQuery('.articlebody').linkify( 'name1,name2' ); jQuery('.articlebody').linkify({ use: 'name1,name2' }); jQuery('.articlebody').linkify({ use: ['name1','name2'] }); // Explicitly use all plugins: jQuery('.articlebody').linkify('*'); jQuery('.articlebody').linkify({ use: '*' }); jQuery('.articlebody').linkify({ use: ['*'] }); // Use no plugins: jQuery('.articlebody').linkify(''); jQuery('.articlebody').linkify({ use: '' }); jQuery('.articlebody').linkify({ use: [] }); jQuery('.articlebody').linkify({ use: [''] }); // Perfmorm actions on all newly created links: jQuery('.articlebody').linkify( function (links){ links.addClass('linkified'); } ); jQuery('.articlebody').linkify({ handleLinks: function (links){ links.addClass('linkified'); } }); */ (function($){ var noProtocolUrl = /(^|["'(\s]|<)(www\..+?\..+?)((?:[:?]|\.+)?(?:\s|$)|>|[)"',])/g, httpOrMailtoUrl = /(^|["'(\s]|<)((?:(?:https?|ftp):\/\/|mailto:).+?)((?:[:?]|\.+)?(?:\s|$)|>|[)"',])/g, linkifier = function ( html ) { return html .replace( noProtocolUrl, '$1$2$3' ) // NOTE: we escape `"http` as `"<``>` to make sure `httpOrMailtoUrl` below doesn't find it as a false-positive .replace( httpOrMailtoUrl, '$1$2$3' ) .replace( /"<``>/g, '"http' ); // reinsert `"http` }, linkify = $.fn.linkify = function ( cfg ) { if ( !$.isPlainObject( cfg ) ) { cfg = { use: (typeof cfg == 'string') ? cfg : undefined, handleLinks: $.isFunction(cfg) ? cfg : arguments[1] }; } var use = cfg.use, allPlugins = linkify.plugins || {}, plugins = [linkifier], tmpCont, newLinks = [], callback = cfg.handleLinks; if ( use == undefined || use == '*' ) // use === undefined || use === null { for ( var name in allPlugins ) { plugins.push( allPlugins[name] ); } } else { use = $.isArray( use ) ? use : $.trim(use).split( / *, */ ); var plugin, name; for ( var i=0, l=use.length; i1 && /\S/.test(html) ) { var htmlChanged, preHtml; tmpCont = tmpCont || $('
')[0]; tmpCont.innerHTML = ''; tmpCont.appendChild( n.cloneNode(false) ); var tmpContNodes = tmpCont.childNodes; for (var j=0, plugin; (plugin = plugins[j]); j++) { var k = tmpContNodes.length, tmpNode; while ( k-- ) { tmpNode = tmpContNodes[k]; if ( tmpNode.nodeType == 3 ) { html = tmpNode.nodeValue; if ( html.length>1 && /\S/.test(html) ) { preHtml = html; html = html .replace( /&/g, '&' ) .replace( //g, '>' ); html = $.isFunction( plugin ) ? plugin( html ): html.replace( plugin.re, plugin.tmpl ); htmlChanged = htmlChanged || preHtml!=html; preHtml!=html && $(tmpNode).after(html).remove(); } } } } html = tmpCont.innerHTML; if ( callback ) { html = $('
').html(html); //newLinks.push.apply( newLinks, html.find('a').toArray() ); newLinks = newLinks.concat( html.find('a').toArray().reverse() ); html = html.contents(); } htmlChanged && $(n).after(html).remove(); } } else if ( n.nodeType == 1 && !/^(a|button|textarea|code|pre)$/i.test(n.tagName) ) { arguments.callee.call( n ); } }; }); callback && callback( $(newLinks.reverse()) ); return this; }; linkify.plugins = { // default mailto: plugin mailto: { re: /(^|["'(\s]|<)([^"'(\s&]+?@.+\.[a-z]{2,7})(([:?]|\.+)?(\s|$)|>|[)"',])/gi, tmpl: '$1$2$3' } }; })(jQuery);