]>
Commit | Line | Data |
---|---|---|
2cd9e32d | 1 | qwebirc.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 | } |