async = require 'async' fs = require 'fs' class Terminal # public: constructor: (width, height) -> @width = 1 @height = 1 @text = [""] @attributes = [0] @x = 0 @y = 0 @partial = '' @resize width, height @text_callbacks = [] @sequence_callbacks = [] on: (evt, callback) -> @["#{evt}_callbacks"].push callback resize: (width, height) -> # FIXME: write a version that retains some of the data @text = [] @attributes = [] for i in [0...height] @text[i] = "" @attributes[i] = new Array(width) # pass data from stdout update: (data) -> return unless data?.length > 0 if @partial.length > 0 data = @partial + data @partial = '' parts = data.split(/\x1b\[/) if parts.length > 1 if -1 is @escape_sequence_length parts[parts.length - 1] @partial = parts.pop() if parts.length > 0 for i in [0...parts.length] if i is 0 @update_text parts[i] else @update_sequence_then_text parts[i] return # str has no escape sequences update_text: (str) -> return unless str.length > 0 for c in @text_callbacks c str console.log "text: \"#{str}\"" # FIXME # str is the whole escape sequence (minus the esc[ prefix) update_sequence: (str) -> for c in @sequence_callbacks c str console.log "sequence: \"#{str}\"" # FIXME update_sequence_then_text: (str) -> len = @escape_sequence_length str if len is -1 console.log "couldn't find escape sequence here: #{str.substr 0, 25}" @update_text "ESC[" + str else @update_sequence str.substr 0, len @update_text str.substr len escape_sequence_length: (str) -> parts = str.match(/^[0-9;?]{0,25}./) return -1 unless parts? return parts[0].length exports.new = (width, height) -> return new Terminal width, height