]> jfr.im git - irc/quakenet/qwebirc.git/blob - js/ui/colour.js
iframes should not have borders -- breaks page layout
[irc/quakenet/qwebirc.git] / js / ui / colour.js
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 }