]>
Commit | Line | Data |
---|---|---|
1 | qwebirc.ui.Colourise = function(line, entity, execfn, cmdfn, window) { | |
2 | var fg; | |
3 | var bg; | |
4 | var underline = false; | |
5 | var bold = false; | |
6 | var italic = false; | |
7 | var autoNickColour = false; | |
8 | ||
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() { | |
48 | var data = ""; | |
49 | if(out.length > 0) { | |
50 | var o = out.join(""); | |
51 | if (execfn) { | |
52 | data = qwebirc.ui.urlificate(element, o, execfn, cmdfn, window); | |
53 | } else { | |
54 | data = o; | |
55 | element.appendChild(document.createTextNode(o)); | |
56 | } | |
57 | entity.appendChild(element); | |
58 | out = []; | |
59 | } | |
60 | element = document.createElement("span"); | |
61 | return data; | |
62 | } | |
63 | ||
64 | function emitStartToken() { | |
65 | if(autoNickColour) | |
66 | return element; | |
67 | ||
68 | var classes = [] | |
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"); | |
77 | if(italic) | |
78 | classes.push("Xi"); | |
79 | element.className = classes.join(" "); | |
80 | } | |
81 | ||
82 | var nickColouring = window.parentObject.uiOptions.NICK_COLOURS; /* HACK */ | |
83 | var capturingNick = false; | |
84 | for(var i=0;i<xline.length;i++) { | |
85 | var lc = xline[i]; | |
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 | ||
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 | ||
124 | emitStartToken(); | |
125 | } else if(lc == "\x1D") { | |
126 | emitEndToken(); | |
127 | ||
128 | italic = !italic; | |
129 | ||
130 | emitStartToken(); | |
131 | } else if(lc == "\x0F") { | |
132 | emitEndToken(); | |
133 | ||
134 | fg = undefined; | |
135 | bg = undefined; | |
136 | underline = false; | |
137 | italic = false; | |
138 | bold = false; | |
139 | } else if(lc == "\x03") { | |
140 | emitEndToken(); | |
141 | ||
142 | i = parseColours(xline, i); | |
143 | if(bg >= 99) | |
144 | bg = undefined; | |
145 | if(fg >= 99) | |
146 | fg = undefined; | |
147 | ||
148 | emitStartToken(); | |
149 | } else { | |
150 | out.push(lc); | |
151 | } | |
152 | } | |
153 | ||
154 | emitEndToken(); | |
155 | } | |
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 | } |