1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
(function(){
var char_color = '\x03';
var regexp_color = /(^[\d]{1,2})?(?:,([\d]{1,2}))?/;
var style_chars = {
'\x02': 'bold',
'\x1d': 'italic',
'\x1f': 'underline',
'\x0f': 'reset',
'\x16': 'inverse'
};
var Style = function(style){
this.b = style.b;
this.i = style.i;
this.u = style.u;
this.fg = style.fg;
this.bg = style.bg;
};
var style_fns = {};
style_fns.bold = function(style){ style.b = !style.b };
style_fns.italic = function(style){ style.i = !style.i };
style_fns.underline = function(style){ style.u = !style.u };
style_fns.inverse = function(style){
var tmp = style.fg;
style.fg = style.bg;
style.bg = tmp;
};
style_fns.reset = function(style, base_style){
style.b = base_style.b;
style.i = base_style.i;
style.u = base_style.u;
style.fg = base_style.fg;
style.bg = base_style.bg;
};
var colorcode_to_json = function(string, opts){
opts = opts || {};
var d = colorcode_to_json.defaults;
var base_style = {
b: "b" in opts ? opts.b : d.b,
i: "i" in opts ? opts.i : d.i,
u: "u" in opts ? opts.u : d.u,
fg: "fg" in opts ? opts.fg : d.fg,
bg: "bg" in opts ? opts.bg : d.bg
};
var lines_in = string.split(/\r?\n/);
var lines_out = [];
var w = 0, h = 0;
for (var i=0; i<lines_in.length; i++){
var line = lines_in[i];
if (line.length === 0) continue; // skip blank lines
var json_line = line_to_json(line, base_style);
if (w < json_line.length) w = json_line.length;
lines_out.push(json_line);
h++;
}
return {w:w, h:h, lines:lines_out};
};
colorcode_to_json.defaults = {
b: false
, i: false
, u: false
, fg: 0
, bg: 1
};
var line_to_json = function(line, base_style){
var out = [];
var pos = -1;
var len = line.length -1;
var char;
var style = new Style(base_style);
while (pos < len){ pos++;
char = line[pos];
// next char is a styling char
if (char in style_chars){
style_fns[style_chars[char]](style, base_style);
continue;
}
// next char is a color styling char, with possible color nums after
if (char === char_color){
var matches = line.substr(pos+1,5).match(regexp_color);
// \x03 without color code is a soft style reset
if (matches[1] === undefined && matches[2] === undefined) {
style.fg = base_style.fg;
style.bg = base_style.bg;
continue;
}
if (matches[1] !== undefined)
style.fg = Number(matches[1]);
if (matches[2] !== undefined)
style.bg = Number(matches[2]);
pos += matches[0].length;
continue;
}
// otherwise, next char is treated as normal content
var data = new Style(style);
//data.value = char;
data.value = char.charCodeAt(0);
out.push(data);
}
return out;
};
window.colorcode_to_json = colorcode_to_json;
})();
|