]>
Commit | Line | Data |
---|---|---|
2cd9e32d | 1 | qwebirc.ui.Colourise = function(line, entity, execfn, cmdfn, window) { |
9e769c12 CP |
2 | var fg; |
3 | var bg; | |
4 | var underline = false; | |
5 | var bold = false; | |
9b12ea32 | 6 | var italic = false; |
f121b688 | 7 | var autoNickColour = false; |
9b12ea32 | 8 | |
9e769c12 CP |
9 | var out = []; |
10 | var xline = line.split(""); | |
11 | var element = document.createElement("span"); | |
12 | ||
13 | entity.addClass("colourline"); | |
14 | ||
15 | function isNum(x) { | |
16 | return x >= '0' && x <= '9'; | |
17 | } | |
18 | ||
19 | function parseColours(xline, i) { | |
20 | if(!isNum(xline[i + 1])) { | |
21 | fg = undefined; | |
22 | bg = undefined; | |
23 | return i; | |
24 | } | |
25 | i++; | |
26 | if(isNum(xline[i + 1])) { | |
27 | fg = parseInt(xline[i] + xline[i + 1]); | |
28 | i++; | |
29 | } else { | |
30 | fg = parseInt(xline[i]); | |
31 | } | |
32 | if(xline[i + 1] != ",") | |
33 | return i; | |
34 | if(!isNum(xline[i + 2])) | |
35 | return i; | |
36 | i+=2; | |
37 | ||
38 | if(isNum(xline[i + 1])) { | |
39 | bg = parseInt(xline[i] + xline[i + 1]); | |
40 | i++; | |
41 | } else { | |
42 | bg = parseInt(xline[i]); | |
43 | } | |
44 | return i; | |
45 | } | |
46 | ||
47 | function emitEndToken() { | |
6ace0378 | 48 | var data = ""; |
9e769c12 | 49 | if(out.length > 0) { |
2326e8d5 CP |
50 | var o = out.join(""); |
51 | if (execfn) { | |
289e5856 | 52 | data = qwebirc.ui.urlificate(element, o, execfn, cmdfn, window); |
2326e8d5 | 53 | } else { |
289e5856 | 54 | data = o; |
2326e8d5 CP |
55 | element.appendChild(document.createTextNode(o)); |
56 | } | |
9e769c12 CP |
57 | entity.appendChild(element); |
58 | out = []; | |
59 | } | |
60 | element = document.createElement("span"); | |
f121b688 | 61 | return data; |
9e769c12 | 62 | } |
f121b688 | 63 | |
9e769c12 | 64 | function emitStartToken() { |
f121b688 CP |
65 | if(autoNickColour) |
66 | return element; | |
67 | ||
2a802692 | 68 | var classes = [] |
9e769c12 CP |
69 | if(fg != undefined) |
70 | classes.push("Xc" + fg); | |
71 | if(bg != undefined) | |
72 | classes.push("Xbc" + bg); | |
73 | if(bold) | |
74 | classes.push("Xb"); | |
75 | if(underline) | |
76 | classes.push("Xu"); | |
9b12ea32 CP |
77 | if(italic) |
78 | classes.push("Xi"); | |
9e769c12 CP |
79 | element.className = classes.join(" "); |
80 | } | |
81 | ||
f121b688 CP |
82 | var nickColouring = window.parentObject.uiOptions.NICK_COLOURS; /* HACK */ |
83 | var capturingNick = false; | |
29453513 | 84 | for(var i=0;i<xline.length;i++) { |
9e769c12 | 85 | var lc = xline[i]; |
f121b688 CP |
86 | |
87 | if(nickColouring) { | |
88 | if(!capturingNick) { | |
89 | if(lc == "\x00") { | |
90 | capturingNick = true; | |
91 | emitEndToken(); | |
92 | continue; | |
93 | } | |
94 | } else { | |
95 | if(lc != "\x00") { | |
96 | out.push(lc); | |
97 | } else { | |
98 | autoNickColour = true; | |
99 | var e = emitStartToken(); | |
100 | var text = emitEndToken(); | |
101 | ||
102 | var c = text.toHSBColour(window.client); | |
103 | if($defined(c)) | |
104 | e.style.color = c.rgbToHex(); | |
105 | capturingNick = autoNickColour = false; | |
106 | } | |
107 | continue; | |
108 | } | |
109 | } else if(lc == "\x00") { | |
110 | continue; | |
111 | } | |
112 | ||
9e769c12 CP |
113 | if(lc == "\x02") { |
114 | emitEndToken(); | |
115 | ||
116 | bold = !bold; | |
117 | ||
118 | emitStartToken(); | |
119 | } else if(lc == "\x1F") { | |
120 | emitEndToken(); | |
121 | ||
122 | underline = !underline; | |
123 | ||
9b12ea32 CP |
124 | emitStartToken(); |
125 | } else if(lc == "\x1D") { | |
126 | emitEndToken(); | |
127 | ||
128 | italic = !italic; | |
129 | ||
9e769c12 CP |
130 | emitStartToken(); |
131 | } else if(lc == "\x0F") { | |
132 | emitEndToken(); | |
133 | ||
134 | fg = undefined; | |
135 | bg = undefined; | |
136 | underline = false; | |
9b12ea32 | 137 | italic = false; |
9e769c12 CP |
138 | bold = false; |
139 | } else if(lc == "\x03") { | |
140 | emitEndToken(); | |
141 | ||
142 | i = parseColours(xline, i); | |
e832c717 | 143 | if(bg >= 99) |
9e769c12 | 144 | bg = undefined; |
e832c717 | 145 | if(fg >= 99) |
9e769c12 CP |
146 | fg = undefined; |
147 | ||
148 | emitStartToken(); | |
149 | } else { | |
150 | out.push(lc); | |
151 | } | |
152 | } | |
153 | ||
154 | emitEndToken(); | |
e20e5a6b | 155 | } |
f121b688 CP |
156 | |
157 | String.prototype.toHSBColour = function(client) { | |
158 | var lower = client.toIRCLower(client.stripPrefix(this)); | |
159 | if(lower == client.lowerNickname) | |
160 | return null; | |
161 | ||
162 | var hash = 0; | |
163 | for(var i=0;i<lower.length;i++) | |
164 | hash = 31 * hash + lower.charCodeAt(i); | |
165 | ||
166 | var hue = Math.abs(hash) % 360; | |
167 | ||
168 | return new Color([hue, 70, 60], "hsb"); | |
169 | } |