:: Matrix GUI :: :::: /hook/hymn/matr/app :: /? 310 |% ++ cdnj |=(a=tape ;script(src "//cdnjs.cloudflare.com/ajax/libs/{a}");) -- :: :::: :: ^- manx ;html ;head ;title: Matrix ;* %- turn :_ cdnj ^- wall :~ "jquery/2.1.1/jquery.min.js" "mousetrap/1.4.6/mousetrap.js" "react/0.11.0/react.js" == ;script(src "/~/at/home/lib/urb.js"); ;script: urb.appl = 'sole' ;style:''' #term { width: 100%; } #term * { margin: 0px; } ''' == ;body ;div#err; ;div#term:"" ;script(type "text/coffeescript") ;- %- trip ''' [DOM,recl,rend] = [React.DOM, React.createClass, React.renderComponent] [div, pre] = [DOM.div, DOM.pre] Matr = recl render: -> [pro,cur] = [@props.prompt + " ", @props.cursor + 1] prompt = "#{pro.slice(0,cur)}\u0332#{pro.slice(cur)}" lines = [prompt, @props.rows...] div {}, lines.slice().reverse().map (lin)-> pre {}, lin $ -> termRev = 0 pressed = [] deltim = null met = $('
').text('m').css(display: 'none').appendTo(term).width() subs = "" # $(window).resize -> # window.termWif = ($(term).width() / met).toFixed() # path = "/new/#{termWif}" # if path is subs # return # if subs # urb.unsubscribe {path:subs} # subs = path # urb.subscribe {path}, (err,dat)-> # if err or dat.data.ok # return; # syncRev = dat.data.rev # unless termRev > syncRev # termRev = syncRev # matr.setProps rows: dat.data.stak # document.title = "Matrix" # XX debug # $(window).resize() matr = rend (Matr rows:[], prompt:"", cursor:1), term flash = ($el, background)-> $el.css {background} if background setTimeout (()-> flash $el,''), 50 peer = (ruh) -> switch false when !ruh.map then ruh.map peer when !ruh.pro then matr.setProps prompt: ruh.pro when !ruh.hop then matr.setProps cursor: ruh.hop when !ruh.out matr.setProps rows: [ruh.out, matr.props.rows...] when !ruh.act then switch ruh.act when 'clr' then matr.setProps rows:[] when 'bel' then flash ($ 'body'), 'black' else throw "Unknown "+(JSON.stringify ruh) else console.log ruh urb.bind "", (err,d)-> if d.data then peer d.data #later = (data)-> # if data # pressed.push data # clearTimeout deltim # setTimeout (-> # if urb.reqq.length > 0 # return deltim = later() # urb.send data: pressed # pressed = [] # ), 500 Mousetrap.handleKey = (char, mod, e)-> norm = { capslock: 'caps' pageup: 'pgup' pagedown: 'pgdn' backspace: 'baxp' enter: 'entr' } key = if char.length is 1 if e.type is 'keypress' str: char else if e.type is 'keydown' if char isnt 'space' act: norm[char] ? char else if e.type is 'keyup' and norm[key] is 'caps' act: 'uncap' if key e.preventDefault() urb.send mark: 'dill-belt', data: {mod,key} # amod = (arr)-> # for i in arr # unless mod.indexOf(i) < 0 # return yes # no # if key.str or key.act is 'baxp' or key.act is 'entr' # termRev++ # [bot, rest...] = old = matr.props.rows # matr.setProps rows:( # switch key.act # when 'baxp' # if amod ['ctrl', 'meta'] # ['', rest...] # else if amod ['alt'] # [(bot.replace /\ *[^ ]*$/, ''), rest...] # else if bot and bot.length # [bot.slice(0, -1), rest...] # else if rest[0] and rest[0].length # res = rest.slice() # res[0] = res[0].slice(0, -1) # res # else rest # when 'entr' # ['', old...] # when undefined # if mod.length > 1 or (mod.length and !amod ['shift']) # old # else unless old and bot isnt null # [key.str] # #else if bot.length is termWif # # [key.str, old...] # else [bot + key.str, rest...] # ) # document.title = "Matri" # XX debug # later {mod, key} ''' == ;+ (cdnj "coffee-script/1.7.1/coffee-script.min.js") == ==