]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/ui/colour.js
iframes should not have borders -- breaks page layout
[irc/quakenet/qwebirc.git] / js / ui / colour.js
CommitLineData
2cd9e32d 1qwebirc.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
157String.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}