]> jfr.im git - irc/quakenet/qwebirc.git/blobdiff - js/ui/url.js
Merge pull request #305 from retropc/master
[irc/quakenet/qwebirc.git] / js / ui / url.js
index dd4f5b0d89fd1f62b77b9db2a3c35741c0e303c5..36634ad090b7106660c5f031c95468682286787b 100644 (file)
@@ -1,6 +1,7 @@
-function urlificate(element, text, execfn, cmdfn) {
-  var punct_re = /(\.*|\,|;)$/;
-
+qwebirc.ui.urlificate = function(element, text, execfn, cmdfn, window) {
+  var punct_re = /[[\)|\]>]?(\.*|[\,;])$/;
+  var addedText = [];
+  
   var txtprocess = function(text, regex, appendfn, matchfn) {
     for(;;) {
       var index = text.search(regex);
@@ -23,15 +24,17 @@ function urlificate(element, text, execfn, cmdfn) {
   };
   
   var appendText = function(text) {
-    element.appendChild(document.createTextNode(text));  
+    addedText.push(text);
+    qwebirc.util.NBSPCreate(text, element);
   };
   
   var appendChan = function(text) {
     var newtext = text.replace(punct_re, "");
+    addedText.push(newtext);
     var punct = text.substring(newtext.length);
 
-    var a = new Element("a");
-    a.href = "#";
+    var a = new Element("span");
+    a.addClass("hyperlink-channel");
     a.addEvent("click", function(e) {
       new Event(e).stop();
       execfn("/JOIN " + newtext);
@@ -48,37 +51,53 @@ function urlificate(element, text, execfn, cmdfn) {
     
     var href = "";
     var fn = null;
-    var target = "new";
+    var target = "_blank";
     var disptext = url;
+    var elementType = "a";
+    var addClass;
     
     var ma = url.match(/^qwebirc:\/\/(.*)$/);
     if(ma) {
-      var m = ma[1].match(/^([^\/]+)\/(.+)$/);
+      var m = ma[1].match(/^([^\/]+)\/([^\/]+)\/?(.*)$/);
       if(!m) {
         appendfn(text);
         return; 
       }
       
-      var cmd = cmdfn(m[1]);
+      var cmd = cmdfn(m[1], window);
       if(cmd) {
-        url = "#";
-        fn = cmd;
+        addClass = m[1];
+        elementType = cmd[0];
+        if(cmd[0] != "a") {
+          url = null;
+        } else {
+          url = "#";
+        }
+        fn = cmd[1];
         disptext = unescape(m[2]);
         target = null;
       } else {
         appendfn(text);
         return;
       }
+      if(m[3])
+        punct = m[3] + punct;
     } else {
       if(url.match(/^www\./))
         url = "http://" + url;
     }
     
-    var a = new Element("a");
-    a.href = url;
+    var a = new Element(elementType);
+    if(addClass)
+      a.addClass("hyperlink-" + addClass);
+      
+    if(url) {
+      a.href = url;
     
-    if(target)
-      a.target = target;
+      if(target)
+        a.target = target;
+    }
+    addedText.push(disptext);
     a.appendChild(document.createTextNode(disptext));
     
     element.appendChild(a);
@@ -91,4 +110,6 @@ function urlificate(element, text, execfn, cmdfn) {
   txtprocess(text, /\b((https?|ftp|qwebirc):\/\/|www\.)[^ ]+/, function(text) {
     txtprocess(text, /\B#[^ ,]+/, appendText, appendChan);
   }, appendURL);
+  
+  return addedText.join("");
 }