rhymix/addons/autolink/autolink.js
taggon 27c622bdfc add/modify comments
git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6909 201d5d3c-b55e-5fd7-737f-ddc643e51545
2009-11-03 09:16:48 +00:00

67 lines
No EOL
1.8 KiB
JavaScript

/**
* @file autolink.js
* @brief javascript code for autolink addon
* @author taggon (gonom9@gmail.com)
*/
(function($){
var protocol_re = '(https?|ftp|news|telnet|irc)://';
var domain_re = '(?:[\\w\\-]+\\.)+(?:[a-z]+)';
var max_255_re = '(?:1[0-9]{2}|2[0-4][0-9]|25[0-5])';
var ip_re = '(?:'+max_255_re+'\\.){3}'+max_255_re;
var port_re = '(?::([0-9]+))?';
var path_re = '((?:/[\\w!"$-/:-@]+)*)';
var hash_re = '(?:#([\\w!-@]+))?';
var url_regex = new RegExp('('+protocol_re+'('+domain_re+'|'+ip_re+')'+port_re+path_re+hash_re+')', 'ig');
var AutoLink = xe.createPlugin("autolink", {
targets : [],
init : function() {
this.targets = [];
},
API_ONREADY : function() {
var thisPlugin = this;
// extract target text nodes
this.extractTargets($('.xe_content'));
$(this.targets).each(function(){
thisPlugin.cast('AUTOLINK', [this]);
});
},
API_AUTOLINK : function(oSender, params) {
var textNode = params[0];
var content = textNode.nodeValue;
var dummy = $('<span>');
content = content.replace(/</g, '&lt;').replace(/>/g, '&gt;');
content = content.replace(url_regex, '<a href="$1" target="_blank">$1</a>');
$(textNode).before(dummy);
$(textNode).replaceWith(content);
params[0] = dummy.next('a');
dummy.remove();
},
extractTargets : function(obj) {
var thisPlugin = this;
$(obj)
.contents()
.each(function(){
// FIX ME : When this meanless code wasn't executed, url_regex do not run correctly. why?
url_regex.exec('');
if (!$(this).is('a,pre,xml,code,script,style,:input')) {
if (this.nodeType == 3 && url_regex.test(this.nodeValue)) { // text node
thisPlugin.targets.push(this);
} else {
thisPlugin.extractTargets(this);
}
}
});
}
});
xe.registerPlugin(new AutoLink());
})(jQuery);