]> jfr.im git - irc/quakenet/qwebirc.git/blob - js/ui/colour.js
notifier now uses themes
[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 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 }