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