function Matrix (w,h,f){ this.w = w this.h = h this.f = f this.initialize() } Matrix.prototype.initialize = function(){ var w = this.w || 1, h = this.h || 1, f = this.f var aa = new Array (h) for (var y = 0; y < h; y++) { aa[y] = new Array (w) for (var x = 0; x < w; x++) { aa[y][x] = f(x,y) } } this.aa = aa } Matrix.prototype.rebuild = function (){ this.demolish() this.initialize() this.append() this.bind() this.generate && this.generate() } Matrix.prototype.bind = function () {} Matrix.prototype.demolish = function (){ this.forEach(function(lex){ lex.demolish() }) while (this.rapper.firstChild) { this.rapper.removeChild(this.rapper.firstChild); } this.aa.forEach(function(row){ row.length = 0 }) this.aa.length = 0 } Matrix.prototype.forEach = function(f){ this.aa.forEach(function(row, y){ row.forEach(function(lex, x){ f(lex, x, y) }) }) } Matrix.prototype.focusLex = function(y,x){ this.aa[mod(y,this.h)][mod(x,this.w)].focus() } Matrix.prototype.clear = function(){ this.forEach(function(lex,x,y){ lex.clear() }) } Matrix.prototype.fill = function(fg, bg){ this.fg = fg this.bg = bg this.forEach(function(lex,x,y){ lex.fg = fg lex.bg = bg lex.build() }) } Matrix.prototype.build = function(){ this.forEach(function(lex,x,y){ lex.build() }) } Matrix.prototype.append = function(rapper){ rapper = this.rapper = rapper || this.rapper this.aa.forEach(function(row, y){ var div = document.createElement("div") row.forEach(function(lex, x) { div.appendChild(lex.span) }) rapper.appendChild( div ) }) } Matrix.prototype.region = function(w,h,x,y) { w = w || 1 h = h || 1 x = x || 0 y = y || 0 var parent = this var mat = new Matrix(w, h, function(x,y){ return parent.aa[y][x] }) mat.f = this.f } Matrix.prototype.ascii = function () { var lines = this.aa.map(function(row, y){ var last, line = "" row.forEach(function(lex, x) { if (lex.eq(last)) { line += lex.char } else { if (x > 0 && last && (last.bg != 1 || last.fg != 0)) line += "\\x03" line += lex.irc() last = lex } }) if (last && ! last.isClear()) { line += "\\x03" } return line.replace(/\s+$/,"").replace(/\"/g, '\\\"') }).filter(function(line){ return line.length > 0 }) var txt = '/exec -out printf "' + lines.join("\\n") + '"\n' return txt } Matrix.prototype.expand = function(i){ var w = this.w = clamp(this.w+i, 1, 9), h = this.h = clamp(this.h+i, 1, 9) console.log(w,h) controls.width.char = ""+w controls.width.build() controls.height.char = ""+h controls.height.build() this.rebuild() } Matrix.prototype.contract = function(i){ brush.expand(-i) }