]>
Commit | Line | Data |
---|---|---|
2cd9e32d | 1 | qwebirc.ui.urlificate = function(element, text, execfn, cmdfn, window) { |
1f06a70a | 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 | ||
f56167ba | 33 | var a = new Element("a"); |
dbd61667 CP |
34 | a.href = "#"; |
35 | a.addEvent("click", function(e) { | |
36 | new Event(e).stop(); | |
8e327eaa | 37 | execfn("/JOIN " + newtext); |
dbd61667 | 38 | }); |
8e327eaa CP |
39 | a.appendChild(document.createTextNode(newtext)); |
40 | element.appendChild(a); | |
41 | ||
42 | return punct; | |
43 | }; | |
44 | ||
841a451d CP |
45 | var appendURL = function(text, appendfn) { |
46 | var url = text.replace(punct_re, ""); | |
47 | var punct = text.substring(url.length); | |
48 | ||
49 | var href = ""; | |
50 | var fn = null; | |
51 | var target = "new"; | |
52 | var disptext = url; | |
53 | ||
54 | var ma = url.match(/^qwebirc:\/\/(.*)$/); | |
55 | if(ma) { | |
56 | var m = ma[1].match(/^([^\/]+)\/(.+)$/); | |
57 | if(!m) { | |
58 | appendfn(text); | |
59 | return; | |
60 | } | |
61 | ||
2cd9e32d | 62 | var cmd = cmdfn(m[1], window); |
841a451d CP |
63 | if(cmd) { |
64 | url = "#"; | |
65 | fn = cmd; | |
66 | disptext = unescape(m[2]); | |
67 | target = null; | |
68 | } else { | |
69 | appendfn(text); | |
70 | return; | |
71 | } | |
72 | } else { | |
73 | if(url.match(/^www\./)) | |
74 | url = "http://" + url; | |
75 | } | |
dbd61667 | 76 | |
f56167ba | 77 | var a = new Element("a"); |
841a451d CP |
78 | a.href = url; |
79 | ||
80 | if(target) | |
81 | a.target = target; | |
82 | a.appendChild(document.createTextNode(disptext)); | |
83 | ||
dbd61667 | 84 | element.appendChild(a); |
841a451d CP |
85 | if($defined(fn)) |
86 | a.addEvent("click", function(e) { new Event(e).stop(); fn(disptext); }); | |
8e327eaa CP |
87 | |
88 | return punct; | |
89 | }; | |
90 | ||
841a451d | 91 | txtprocess(text, /\b((https?|ftp|qwebirc):\/\/|www\.)[^ ]+/, function(text) { |
8e327eaa CP |
92 | txtprocess(text, /\B#[^ ,]+/, appendText, appendChan); |
93 | }, appendURL); | |
83f9b8b2 | 94 | } |