1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
// this doesn't properly deal with eg, .gov.uk .co.ck etc
function parseDomain(host){
var chunks = host.split(".")
if (chunks.length == 1) return chunks[0]
else return chunks[chunks.length - 2]
}
function escapeHtml(txt) {
if (!txt) { return ""; }
// txt = annoyingCaps(txt)
return $("<span>").text(txt).html()
}
URLRegex = /((\b(http\:\/\/|https\:\/\/|ftp\:\/\/)|(www\.))+(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
PicRegex = /\.(jpg|jpeg|png|gif|bmp|svg|fid)$/i;
RecipRegex = /(^|\s)@\w+/g;
TopicRegex = /(^|\s)#\w+/g;
function getImagesAsArray(text) {
var imgs = []
var urls = text.match(URLRegex)
if (urls === null) return imgs
for (var i = 0; i<urls.length; i++){
var url = urls[i]
var urlWithoutParams = url.replace(/\?.*$/i, "");
if (PicRegex.test(urlWithoutParams))
imgs.push(url)
}
return imgs
}
function topicReplace(text) {
text = $.trim(text).toLowerCase();
var topicLabel = text.substring(1);
return ' <a target="_blank" href="'+ RootDomain + 't/' + topicLabel + '">' + text + '</a> ';
}
function recipientReplace(atText, recips) {
recips = recips || [];
var space = '';
if (atText[0] == ' ') {
atText = atText.slice(1);
space = ' ';
}
var nick = atText.slice(1).toLowerCase();
var matchedRecip;
for (var i = 0; i < recips.length; i++) {
if (recips[i].toLowerCase() == nick) {
matchedRecip = recips[i];
break;
}
}
if (matchedRecip) {
return space + '<a target="_blank" href="' + RootDomain + matchedRecip + '">@' + matchedRecip + '</a>';
} else {
return space + atText;
}
}
function linkify(text, recips) {
LastMsgContainsImage = false;
var recipWrapper = function(text) { return recipientReplace(text, recips); };
return text
.replace(URLRegex, linkReplace)
.replace(RecipRegex, recipWrapper)
.replace(TopicRegex, topicReplace);
}
// use this in escapeHtml to turn everyone's text lIkE tHiS
function annoyingCaps(text){
var chunks = text.split(" ")
for(var i=0; i<chunks.length; i++){
var chunk = chunks[i]
if (!chunk.length || chunk.substr(0,4) == 'http') continue;
var letters=chunk.split("")
for(var j = 0; j<letters.length; j++){
if (j % 2) letters[j] = letters[j].toUpperCase()
else letters[j] = letters[j].toLowerCase()
}
chunks[i] = letters.join("")
}
return chunks.join(" ")
}
function imgClickHandler() {
// Ugly hack. Don't open new links in chat, only in logs.
// Ugly hack mkII: ensure middle-click opens images in new tab
// c.f. http://code.google.com/p/chromium/issues/detail?id=255
if ($.browser.webkit && event.button != 0) {
event.stopPropagation();
} else {
return $('#chatrap').length == 0;
}
}
// durty hack to use a global to check this... but otherwise i'd have to rewrite the String.replace function? :/
var LastMsgContainsImage = false
function linkReplace(url) {
var lowerurl = url.toLowerCase();
if (lowerurl.indexOf('http://') == 0 || lowerurl.indexOf('https://') == 0 || lowerurl.indexOf('ftp://') == 0)
linkUrl = url;
else
linkUrl = 'http://' + url;
var uri = parseUri(url)
var type = getUriType(uri)
if (type == 'image') {
LastMsgContainsImage = true;
return "<a target='_blank' href='" + linkUrl + "' class='img-wrapper' onclick='return imgClickHandler()'><img src='" + linkUrl + "' class='unbound'></a>";
} else if (type == 'youtube') {
Youtube.startAnimation();
return "<a target='_blank' class='youtube' href='" + linkUrl + "'>" +
"<img class='youtube-thumb' width='130' height='97' src='"+Youtube.nextThumbUrl(uri.queryKey.v)+"'>" +
"<img class='youtube-controls' src='/static/img/youtube.controls.png'></a>"
} else if (type == 'midi' || type == 'wav') {
return '<embed src="'+linkUrl+'" loop="false" autostart="false" volume="80" width="150" height="20" style="vertical-align:bottom"> <a href="'+linkUrl+'">'+uri.file+'</a>'
} else
return "<a target='_blank' href='" + linkUrl + "'>" + url + "</a>";
}
function getUriType(uri){
if (PicRegex.test(uri.file.toLowerCase()))
return "image";
var domain = parseDomain(uri.host)
if (domain == "gstatic" && uri.path == "/images" && 'q' in uri.queryKey)
return "image";
// actual image url = uri.queryKey['q'].split(":").slice(2).join(":") but often the original image is broken...
if (domain == "youtube" && ('v' in uri.queryKey || uri.anchor.indexOf('v') != -1))
return "youtube";
if (uri.path.substr(-4) == ".mid" || uri.path.substr(-5) == ".midi")
return "midi"
if (uri.path.substr(-4) == ".wav")
return "wav"
return "link";
}
function linkifyWithoutImage(text) {
LastMsgContainsImage = false
return text.replace(URLRegex, linkReplaceWithoutImage);
}
function linkReplaceWithoutImage(url){
var urlWithoutParams = url.replace(/\?.*$/i, "");
linkUrl = url.indexOf('http://') == 0 ? url : 'http://' + url;
return "<a target='_blank' href='" + linkUrl + "'>" + url + "</a>"
}
|