text.love/main.lua
Kartik K. Agaram 3019442c02 confirm that we have access to all of the love API
love.graphics.line(1, 1, 500, 500)

However, we're now no longer printing results or errors. Time now to
design the data model. When do we (re)evaluate code. When do we display
results. Where do errors go.
2022-05-02 08:37:04 -07:00

97 lines
2.2 KiB
Lua

require 'keychord'
local utf8 = require 'utf8'
lines = {}
width, height, flags = 0, 0, nil
exec_payload = nil
function love.load()
table.insert(lines, '')
love.window.setMode(0, 0) -- maximize
width, height, flags = love.window.getMode()
love.keyboard.setTextInput(true) -- bring up keyboard on touch screen
end
function love.draw()
love.graphics.setColor(1, 1, 1)
love.graphics.rectangle('fill', 1, 1, width-1, height-1)
love.graphics.setColor(1, 1, 0)
love.graphics.rectangle('fill', 1, 1, 400, 10*12)
love.graphics.setColor(0, 0, 0)
local text
for i, line in ipairs(lines) do
text = love.graphics.newText(love.graphics.getFont(), line)
love.graphics.draw(text, 12, i*15)
end
-- cursor
love.graphics.print('_', 12+text:getWidth(), #lines*15)
if exec_payload then
call_gather(exec_payload)
end
end
function love.update(dt)
end
function love.textinput(t)
lines[#lines] = lines[#lines]..t
end
function keychord_pressed(chord)
-- Don't handle any keys here that would trigger love.textinput above.
if chord == 'return' then
table.insert(lines, '')
elseif chord == 'backspace' then
if #lines > 1 and lines[#lines] == '' then
table.remove(lines)
else
local byteoffset = utf8.offset(lines[#lines], -1)
if byteoffset then
lines[#lines] = string.sub(lines[#lines], 1, byteoffset-1)
end
end
elseif chord == 'C-r' then
eval(lines[#lines])
--? lines[#lines+1] = eval(lines[#lines])[1]
--? lines[#lines+1] = ''
end
end
function love.keyreleased(key, scancode)
end
function love.mousepressed(x, y, button)
end
function love.mousereleased(x, y, button)
end
function eval(buf)
local f = load('return '..buf, 'REPL')
if f then
exec_payload = f
return
--? return call_gather(f)
end
local f, err = load(buf, 'REPL')
if f then
exec_payload = f
return
--? return call_gather(f)
else
return {err}
end
end
-- based on https://github.com/hoelzro/lua-repl
function call_gather(f)
local success, results = gather_results(xpcall(f, function(...) return debug.traceback() end))
return results
end
function gather_results(success, ...)
local n = select('#', ...)
return success, { n = n, ... }
end