Hilbish/nature/commands/greenhouse.lua

124 lines
2.6 KiB
Lua
Raw Normal View History

2023-02-18 20:57:27 +00:00
local ansikit = require 'ansikit'
local bait = require 'bait'
local commander = require 'commander'
local hilbish = require 'hilbish'
local terminal = require 'terminal'
local Greenhouse = require 'nature.greenhouse'
local Page = require 'nature.greenhouse.page'
2023-02-18 20:57:27 +00:00
commander.register('greenhouse', function(args, sinks)
local gh = Greenhouse(sinks.out)
2023-07-10 03:07:32 +00:00
local buffer = ''
local display = ''
2023-07-10 03:07:32 +00:00
local command = false
local commands = {
q = function()
gh.keybinds['Ctrl-D'](gh)
end,
['goto'] = function(args)
if not args[1] then
return 'nuh uh'
end
gh:jump(tonumber(args[1]))
2023-07-10 03:07:32 +00:00
end
}
function gh:resize()
local size = terminal.size()
self.region = {
width = size.width,
height = size.height - 2
}
end
2023-07-10 03:07:32 +00:00
local oldDraw = gh.draw
function gh:draw()
oldDraw(self)
local workingPage = self.pages[self.curPage]
local offset = self.offset
if self.isSpecial then
offset = self.specialOffset
workingPage = self.specialPage
end
self.sink:write(ansikit.getCSI((self.region.height + 2) - self.start.. ';1', 'H'))
if not self.isSpecial then
self.sink:write(string.format('\27[0mPage %d', self.curPage))
if workingPage.title ~= '' then
self.sink:writeln('' .. workingPage.title)
else
self.sink:writeln('')
end
end
self.sink:write(buffer == '' and display or buffer)
end
2023-07-10 03:07:32 +00:00
function gh:input(c)
-- command handling
if c == ':' and not command then
command = true
end
if c == 'Escape' then
if command then
command = false
buffer = ''
else
if self.isSpecial then gh:special() end
end
2023-07-10 03:07:32 +00:00
elseif c == 'Backspace' then
buffer = buffer:sub(0, -2)
if buffer == '' then
command = false
else
goto update
end
2023-07-10 03:07:32 +00:00
end
if command then
ansikit.showCursor()
if buffer:match '^:' then buffer = buffer .. c else buffer = c end
else
ansikit.hideCursor()
2023-07-10 03:07:32 +00:00
end
::update::
gh:update()
end
gh:resize()
gh:keybind('Enter', function(self)
if self.isSpecial then
self:jump(self.specialPageIdx)
self:special(false)
2023-07-10 03:07:32 +00:00
else
if buffer:len() < 2 then return end
local splitBuf = string.split(buffer, " ")
local command = commands[splitBuf[1]:sub(2)]
if command then
table.remove(splitBuf, 1)
buffer = command(splitBuf) or ''
2023-07-10 03:07:32 +00:00
end
self:update()
end
end)
2023-02-18 20:57:27 +00:00
if sinks['in'].pipe then
local page = Page('', sinks['in']:readAll())
gh:addPage(page)
end
for _, name in ipairs(args) do
local f <close> = io.open(name, 'r')
if not f then
sinks.err:writeln(string.format('could not open file %s', name))
end
local page = Page(name, f:read '*a')
gh:addPage(page)
end
ansikit.hideCursor()
2023-04-12 00:44:29 +00:00
gh:initUi()
2023-02-18 20:57:27 +00:00
end)