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