summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
authortimb <opuscule@gmail.com>2015-04-16 10:28:33 -0700
committertimb <opuscule@gmail.com>2015-04-16 10:28:33 -0700
commitcc4fb936a8d95b78ff71548d7b6919fedec0dc16 (patch)
tree412db88ae9a909cbc9b66ab13fec130d5b3d60af /js
parente56f2ca44bdbf620b36829886399891f83cf3624 (diff)
import mirc/irssi colorcodes
Diffstat (limited to 'js')
-rw-r--r--js/clipboard.js40
-rw-r--r--js/parse.js131
2 files changed, 169 insertions, 2 deletions
diff --git a/js/clipboard.js b/js/clipboard.js
index d2d1592..b20528a 100644
--- a/js/clipboard.js
+++ b/js/clipboard.js
@@ -9,7 +9,7 @@ var clipboard = (function () {
import_ascii.addEventListener("change", exports.setFormat("ascii"))
import_irssi.addEventListener("change", exports.setFormat("irssi"))
import_mirc.addEventListener("change", exports.setFormat("mirc"))
- import_button.addEventListener("click", exports.import_text)
+ import_button.addEventListener("click", exports.import_colorcode)
import_html.addEventListener("click", exports.import_html)
export_button.addEventListener("click", exports.export_data)
import_textarea.addEventListener("focus", exports.focus)
@@ -112,10 +112,46 @@ var clipboard = (function () {
})
})
},
+
+ import_colorcode: function () {
+ var data = import_textarea.value
+
+ var irssi_style_regex = /^\s*\/exec -out printf "/;
+
+ // turn irssi style into mirc style
+ if (data.match(irssi_style_regex)){
+ data = data.replace(/\\x03/gm, '\x03')
+ data = data.replace(/\\n/gm, '\n')
+ data = data.replace(irssi_style_regex, '')
+ data = data.replace(/"\s*$/, '')
+ }
+
+ // not a colorcode
+ if (!data.match(/\x03/))
+ return exports.import_text();
+
+ var json = colorcode_to_json(data)
+
+ canvas.resize(json.w, json.h)
+ canvas.clear()
+
+ for (var y = 0, line; line = json.lines[y]; y++){
+ var row = canvas.aa[y]
+ for (var x = 0, char; char = line[x]; x++){
+ var lex = row[x]
+ lex.char = String.fromCharCode(char.value)
+ lex.fg = char.fg
+ lex.bg = char.bg
+ lex.opacity = 1
+ lex.build()
+ }
+ }
+
+ },
import_text: function () {
var data = import_textarea.value
- lines = data.split("\n")
+ var lines = data.split("\n")
var width = lines.reduce(function(a,b){ console.log(a,b); return Math.max(a, b.length) }, 0)
var height = lines.length
if (width > 200) {
diff --git a/js/parse.js b/js/parse.js
new file mode 100644
index 0000000..8697afd
--- /dev/null
+++ b/js/parse.js
@@ -0,0 +1,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;
+
+})();