]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/ui/url.js
Belt and braces against flashing overload, also fix a bug in auth in conventional...
[irc/quakenet/qwebirc.git] / js / ui / url.js
CommitLineData
2cd9e32d 1qwebirc.ui.urlificate = function(element, text, execfn, cmdfn, window) {
57031aa3 2 var punct_re = /[[\)|\]]?(\.*|[\,;])$/;
83f9b8b2 3
8e327eaa
CP
4 var txtprocess = function(text, regex, appendfn, matchfn) {
5 for(;;) {
6 var index = text.search(regex);
7 if(index == -1) {
8 appendfn(text);
9 break;
10 }
11 var match = text.match(regex);
dbd61667 12
8e327eaa
CP
13 var before = text.substring(0, index);
14 var matched = match[0];
15 var after = text.substring(index + matched.length);
83f9b8b2 16
8e327eaa 17 appendfn(before);
841a451d 18 var more = matchfn(matched, appendfn);
8e327eaa
CP
19 if(!more)
20 more = "";
21 text = more + after;
22 }
23 };
24
25 var appendText = function(text) {
1d6756bc 26 qwebirc.util.NBSPCreate(text, element);
8e327eaa
CP
27 };
28
29 var appendChan = function(text) {
30 var newtext = text.replace(punct_re, "");
31 var punct = text.substring(newtext.length);
32
7cb09779 33 var a = new Element("span");
dbd61667 34 a.href = "#";
7cb09779 35 a.addClass("hyperlink-channel");
dbd61667
CP
36 a.addEvent("click", function(e) {
37 new Event(e).stop();
8e327eaa 38 execfn("/JOIN " + newtext);
dbd61667 39 });
8e327eaa
CP
40 a.appendChild(document.createTextNode(newtext));
41 element.appendChild(a);
42
43 return punct;
44 };
45
841a451d
CP
46 var appendURL = function(text, appendfn) {
47 var url = text.replace(punct_re, "");
48 var punct = text.substring(url.length);
49
50 var href = "";
51 var fn = null;
52 var target = "new";
53 var disptext = url;
925fc357
CP
54 var elementType = "a";
55 var addClass;
841a451d
CP
56
57 var ma = url.match(/^qwebirc:\/\/(.*)$/);
58 if(ma) {
925fc357 59 var m = ma[1].match(/^([^\/]+)\/([^\/]+)\/?(.*)$/);
841a451d
CP
60 if(!m) {
61 appendfn(text);
62 return;
63 }
64
2cd9e32d 65 var cmd = cmdfn(m[1], window);
841a451d 66 if(cmd) {
925fc357
CP
67 addClass = m[1];
68 elementType = cmd[0];
69 if(cmd[0] != "a") {
70 url = null;
71 } else {
72 url = "#";
73 }
74 fn = cmd[1];
841a451d
CP
75 disptext = unescape(m[2]);
76 target = null;
77 } else {
78 appendfn(text);
79 return;
80 }
925fc357
CP
81 if(m[3])
82 punct = m[3] + punct;
841a451d
CP
83 } else {
84 if(url.match(/^www\./))
85 url = "http://" + url;
86 }
dbd61667 87
925fc357
CP
88 var a = new Element(elementType);
89 if(addClass)
90 a.addClass("hyperlink-" + addClass);
91
92 if(url) {
93 a.href = url;
841a451d 94
925fc357
CP
95 if(target)
96 a.target = target;
97 }
841a451d
CP
98 a.appendChild(document.createTextNode(disptext));
99
dbd61667 100 element.appendChild(a);
841a451d
CP
101 if($defined(fn))
102 a.addEvent("click", function(e) { new Event(e).stop(); fn(disptext); });
8e327eaa
CP
103
104 return punct;
105 };
106
841a451d 107 txtprocess(text, /\b((https?|ftp|qwebirc):\/\/|www\.)[^ ]+/, function(text) {
8e327eaa
CP
108 txtprocess(text, /\B#[^ ,]+/, appendText, appendChan);
109 }, appendURL);
83f9b8b2 110}