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' commander.register('greenhouse', function(args, sinks) local gh = Greenhouse(sinks.out) local buffer = '' local display = '' 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])) end } function gh:resize() local size = terminal.size() self.region = { width = size.width, height = size.height - 2 } end 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 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 elseif c == 'Backspace' then buffer = buffer:sub(0, -2) if buffer == '' then command = false else goto update end end if command then ansikit.showCursor() if buffer:match '^:' then buffer = buffer .. c else buffer = c end else ansikit.hideCursor() end ::update:: gh:update() end gh:resize() gh:keybind('Enter', function(self) if self.isSpecial then self:jump(self.specialPageIdx) self:special(true) 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 '' end self:update() end end) if sinks['in'].pipe then local page = Page('', sinks['in']:readAll()) gh:addPage(page) end for _, name in ipairs(args) do local f = 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 gh:initUi() end)