:: Console front-end :: :::: /hook/hymn/fab/sole/pub :: /? 310 |% ++ cdnj |=(a=tape ;script(src "//cdnjs.cloudflare.com/ajax/libs/{a}");) -- :: :::: :: ^- manx ;html ;head ;title: Sole ;* %- 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/main/lib/urb.js"); ;script: urb.appl = 'dojo' ;style:''' #term { width: 100%; } #term * { margin: 0px; } ''' == ;body ;div#err; ;div#term:"" ;script@"src/share.coffee"(type "text/coffeescript"); ;script(type "text/coffeescript") ;- %- trip ''' [DOM,recl,rend] = [React.DOM, React.createClass, React.renderComponent] [div, pre, span] = [DOM.div, DOM.pre, DOM.span] str = JSON.stringify Prompt = recl render: -> [pro,cur,buf] = [@props.prompt, @props.cursor, @props.input + " "] pre {}, pro, span {style: background: 'lightgray'}, buf.slice(0,cur), "\u0332", buf.slice(cur) Matr = recl render: -> lines = @props.rows.slice().reverse().map (lin)-> pre {}, lin, " " lines.push Prompt {prompt:@props.prompt, input:@props.input, cursor:@props.cursor} div {}, lines $ -> 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()

        flash = ($el, background)->
          $el.css {background}
          if background
            setTimeout (-> flash $el,''), 50
            
        matr = rend (Matr rows:[], prompt:"", input:"", history:[], cursor:0), term
        update = (a) -> matr.setProps a
        buffer = new Share ""
        window.buffer = buffer
        sync = (ted)-> 
          update input: buffer.buf, cursor: buffer.transpose ted, matr.props.cursor
        
        peer = (ruh) ->
          if ruh.map then return ruh.map peer
          switch Object.keys(ruh)[0]
            when 'txt' then update rows: [ruh.txt, matr.props.rows...]
            when 'tan' then ruh.tan.split("\n").reverse().map (txt)-> peer {txt}
            when 'hop' then update cursor: buffer.transpose ruh.hop #; peer act:'bel'
            when 'pro' then update prompt: ruh.pro.cad
            when 'blk' then console.log "Stub #{str ruh}"
            when 'det' then buffer.receive ruh.det; sync ruh.det.ted
            when 'act' then switch ruh.act
              when 'clr' then update rows:[]
              when 'bel' then flash ($ 'body'), 'black'
              when 'nex' then update
                input: ""
                cursor: 0
                history: [matr.props.input, matr.props.history...]
            #   else throw "Unknown "+(JSON.stringify ruh)
            else v = Object.keys(ruh); console.log v, ruh[v[0]]
        
        urb.bind "/sole", {wire:"/"}, (err,d)->
          if err then console.log err
          else if d.data then peer d.data
          
        
        pressed = []
        deltim = null
        #later = (data)->
        #  if data
        #    pressed.push data
        #  clearTimeout deltim
        #  setTimeout (->
        #    if urb.reqq.length > 0 
        #      return deltim = later()
        #    urb.send data: pressed
        #    pressed = []
        #  ), 500

        sendAction = (data)->
          urb.send {mark: 'sole-action', data}, (e,res)->
            if res.status isnt 200 then $('#err')[0].innerText = res.data.mess
        
        doEdit = (ted)->
          det = buffer.transmit ted
          sync ted
          sendAction {det}
        
        
        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()
            curs = matr.props.cursor
            if key.str
              doEdit ins: cha: key.str, at: curs
              update cursor: curs+1
            switch key.act
              when 'entr' then sendAction 'ret'
              when 'left' then if curs > 0 
                update cursor: curs-1
              when 'right' then if curs < buffer.buf.length
                update cursor: curs+1
              when 'baxp' then if curs > 0
                doEdit del: curs-1
              #else (if key.act then console.log key.act)
                
            # 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")
==  ==