You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
asciinema.org/app/assets/javascripts/player/vt/vt.js.coffee

234 lines
4.4 KiB
CoffeeScript

class AsciiIo.VT
constructor: (@cols, @lines) ->
_.extend(this, Backbone.Events)
@interpreter = new AsciiIo.AnsiInterpreter @onChange
@reset()
onChange: (action, args...) =>
@[action](args...)
feed: (data) ->
rest = @interpreter.parse data
rest.length is 0
reset: ->
@interpreter.reset()
@resetTerminal()
bell: ->
@trigger 'bell'
state: ->
changes: @buffer.changes()
cursorX: @buffer.cursorX
cursorY: @buffer.cursorY
clearChanges: ->
@buffer.clearChanges()
# ==== Screen buffer operations
clearScreen: ->
@buffer.clear()
switchToNormalBuffer: ->
@buffer = @normalBuffer
@updateScreen()
switchToAlternateBuffer: ->
@alternateBuffer.setBrush(@normalBuffer.getBrush())
@alternateBuffer.setCharset(@normalBuffer.getCharset())
@buffer = @alternateBuffer
@updateScreen()
updateScreen: ->
@buffer.updateScreen()
carriageReturn: ->
@buffer.goToFirstColumn()
backspace: ->
@buffer.priorColumn()
# === ANSI handlers
# ------ Cursor control
showCursor: ->
@trigger 'cursor-visibility', true
hideCursor: ->
@trigger 'cursor-visibility', false
# ----- Scroll control
reverseIndex: ->
@buffer.goToPriorRow()
lineFeed: ->
@buffer.goToNextRow()
verticalTab: ->
@buffer.goToNextRow()
formFeed: ->
@buffer.goToNextRow()
index: ->
@buffer.goToNextRow()
newLine: ->
@buffer.goToNextRowFirstColumn()
# === Commands
# ----- Scroll control
setScrollRegion: (top, bottom) ->
if top < 1
top = 1
if bottom > @lines
bottom = @lines
if bottom > top
@scrollRegion.setTop(top - 1)
@scrollRegion.setBottom(bottom - 1)
setHorizontalTabStop: ->
@tabStops.add(@cursorX)
# ----- Terminal control
resetTerminal: ->
@scrollRegion = new AsciiIo.ScrollRegion(0, @lines - 1)
@tabStops = new AsciiIo.TabStops(@cols)
@normalBuffer = new AsciiIo.ScreenBuffer(@cols, @lines, @scrollRegion, @tabStops)
@alternateBuffer = new AsciiIo.ScreenBuffer(@cols, @lines, @scrollRegion, @tabStops)
@buffer = @normalBuffer
@fg = @bg = undefined
@bright = false
@underline = false
@italic = false
@updateScreen()
saveTerminalState: ->
@buffer.saveCursor()
@scrollRegion.save()
@buffer.saveBrush()
restoreTerminalState: ->
@buffer.restoreBrush()
@scrollRegion.restore()
@buffer.restoreCursor()
reportRowAndColumn: ->
setUkCharset: ->
@buffer.setCharset('uk')
setUsCharset: ->
@buffer.setCharset('us')
setSpecialCharset: ->
@buffer.setCharset('special')
# ---- new
print: (text) ->
@buffer.print text
insertCharacters: (n) ->
@buffer.insertCharacters n
priorRow: (n) ->
@buffer.priorRow n
nextRow: (n) ->
@buffer.nextRow n
nextColumn: (n) ->
@buffer.nextColumn n
priorColumn: (n) ->
@buffer.priorColumn n
nextRowFirstColumn: (n) ->
@buffer.nextRowFirstColumn n
priorRowFirstColumn: (n) ->
@buffer.priorRowFirstColumn n
goToColumn: (n) ->
@buffer.goToColumn n
goToRowAndColumn: (n, m) ->
@buffer.goToRowAndColumn n, m
goToNextHorizontalTabStop: (n = 1) ->
@buffer.goToNextHorizontalTabStop n
eraseScreen: ->
@buffer.eraseScreen()
eraseFromScreenStart: ->
@buffer.eraseFromScreenStart()
eraseToScreenEnd: ->
@buffer.eraseToScreenEnd()
eraseRow: ->
@buffer.eraseRow()
eraseFromRowStart: ->
@buffer.eraseFromRowStart()
eraseToRowEnd: ->
@buffer.eraseToRowEnd()
insertLine: (n) ->
@buffer.insertLine n
deleteLine: (n) ->
@buffer.deleteLine n
deleteCharacters: (n) ->
@buffer.deleteCharacters n
scrollUp: (n) ->
@buffer.scrollUp n
scrollDown: (n) ->
@buffer.scrollDown n
eraseCharacters: (n) ->
@buffer.eraseCharacters n
goToPriorHorizontalTabStop: (n) ->
@buffer.goToPriorHorizontalTabStop n
repeatLastCharacter: (n) ->
@buffer.repeatLastCharacter n
goToRow: (n) ->
@buffer.goToRow n
clearHorizontalTabStop: ->
@buffer.clearHorizontalTabStop()
clearAllHorizontalTabStops: ->
@buffer.clearAllHorizontalTabStops()
# References:
# http://en.wikipedia.org/wiki/ANSI_escape_code
# http://ttssh2.sourceforge.jp/manual/en/about/ctrlseq.html
# http://real-world-systems.com/docs/ANSIcode.html
# http://www.shaels.net/index.php/propterm/documents
# http://manpages.ubuntu.com/manpages/lucid/man7/urxvt.7.html
# http://vt100.net/docs/vt102-ug/chapter5.html