Compare commits

..

4 Commits

Author SHA1 Message Date
sammyette 19bb05f001
feat: pager improvements
- make use of full terminal space properly in doc and greenhouse
commands
- add some info in doc command like currently viewed doc
and description at the bottom instead of top of doc (this makes it persistent)
- add contents function to Greenhouse to allow showing custom contents
in the table of contents (this will be used for lazy loading in the future)
2023-07-11 22:29:15 -04:00
sammyette b9bb14497f
fix(greenhouse): print contents properly
on the last line that can be displayed, don't print with a newline
this removes the space at the end
2023-07-11 22:28:11 -04:00
sammyette 7d0c3f3bf0
fix: set old moddocpath 2023-07-11 22:27:11 -04:00
sammyette 48a06f8022
fix: doc command not displaying correct subdocs when using shorthand api doc access 2023-07-11 20:56:24 -04:00
4 changed files with 73 additions and 33 deletions

View File

@ -7,6 +7,7 @@
- `flush()` and `autoFlush()` related to flushing outputs - `flush()` and `autoFlush()` related to flushing outputs
- `pipe` property to check if a sink with input is a pipe (like stdin) - `pipe` property to check if a sink with input is a pipe (like stdin)
- Show indexes on cdr list - Show indexes on cdr list
- Fix doc command not displaying correct subdocs when using shorthand api doc access (`doc api hilbish.jobs` as an example)
### Fixed ### Fixed
- Replaced `sed` in-place editing with `grep` and `mv` for compatibility with BSD utils - Replaced `sed` in-place editing with `grep` and `mv` for compatibility with BSD utils

View File

@ -1,3 +1,4 @@
local ansikit = require 'ansikit'
local commander = require 'commander' local commander = require 'commander'
local fs = require 'fs' local fs = require 'fs'
local lunacolors = require 'lunacolors' local lunacolors = require 'lunacolors'
@ -11,11 +12,6 @@ commander.register('doc', function(args, sinks)
-- hilbish git -- hilbish git
moddocPath = './docs/' moddocPath = './docs/'
end end
local apidocHeader = [[
# %s
{grayBg} {white}{italic}%s {reset}
]]
local modules = table.map(fs.readdir(moddocPath), function(f) local modules = table.map(fs.readdir(moddocPath), function(f)
return lunacolors.underline(lunacolors.blue(string.gsub(f, '.md', ''))) return lunacolors.underline(lunacolors.blue(string.gsub(f, '.md', '')))
@ -27,6 +23,8 @@ to Hilbish.
Usage: doc <section> [subdoc] Usage: doc <section> [subdoc]
Available sections: ]] .. table.concat(modules, ', ') Available sections: ]] .. table.concat(modules, ', ')
local vals = {}
if #args > 0 then if #args > 0 then
local mod = args[1] local mod = args[1]
@ -34,18 +32,18 @@ Available sections: ]] .. table.concat(modules, ', ')
local funcdocs = nil local funcdocs = nil
local subdocName = args[2] local subdocName = args[2]
if not f then if not f then
-- assume subdir
-- dataDir/docs/<mod>/<mod>.md
moddocPath = moddocPath .. mod .. '/' moddocPath = moddocPath .. mod .. '/'
if not subdocName then if not subdocName then
subdocName = '_index' subdocName = '_index'
end end
f = io.open(moddocPath .. subdocName .. '.md', 'rb') f = io.open(moddocPath .. subdocName .. '.md', 'rb')
local oldmoddocPath = moddocPath
if not f then if not f then
f = io.open(moddocPath .. subdocName:match '%w+' .. '/' .. subdocName .. '.md', 'rb') moddocPath = moddocPath .. subdocName:match '%w+' .. '/'
f = io.open(moddocPath .. subdocName .. '.md', 'rb')
end end
if not f then if not f then
moddocPath = moddocPath .. subdocName .. '/' moddocPath = oldmoddocPath .. subdocName .. '/'
subdocName = args[3] or '_index' subdocName = args[3] or '_index'
f = io.open(moddocPath .. subdocName .. '.md', 'rb') f = io.open(moddocPath .. subdocName .. '.md', 'rb')
end end
@ -60,11 +58,10 @@ Available sections: ]] .. table.concat(modules, ', ')
return lunacolors.underline(lunacolors.blue(string.gsub(fname, '.md', ''))) return lunacolors.underline(lunacolors.blue(string.gsub(fname, '.md', '')))
end) end)
if #moddocs ~= 0 then if #moddocs ~= 0 then
funcdocs = funcdocs .. '\nSubdocs: ' .. table.concat(subdocs, ', ') funcdocs = funcdocs .. '\nSubdocs: ' .. table.concat(subdocs, ', ') .. '\n\n'
end end
local valsStr = funcdocs:match '%-%-%-\n([^%-%-%-]+)\n' local valsStr = funcdocs:match '%-%-%-\n([^%-%-%-]+)\n'
local vals = {}
if valsStr then if valsStr then
local _, endpos = funcdocs:find('---\n' .. valsStr .. '\n---\n\n', 1, true) local _, endpos = funcdocs:find('---\n' .. valsStr .. '\n---\n\n', 1, true)
funcdocs = funcdocs:sub(endpos + 1, #funcdocs) funcdocs = funcdocs:sub(endpos + 1, #funcdocs)
@ -80,14 +77,38 @@ Available sections: ]] .. table.concat(modules, ', ')
end end
end end
end end
if mod == 'api' then
funcdocs = string.format(apidocHeader, vals.title, vals.description or 'no description.') .. funcdocs
end
doc = funcdocs:sub(1, #funcdocs - 1) doc = funcdocs:sub(1, #funcdocs - 1)
f:close() f:close()
end end
local gh = Greenhouse(sinks.out) local gh = Greenhouse(sinks.out)
function gh:resize()
local size = terminal.size()
self.region = {
width = size.width,
height = size.height - 3
}
end
gh:resize()
function gh:render()
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 .. ';1', 'H'))
if not self.isSpecial then
if args[1] == 'api' then
self.sink:writeln(lunacolors.reset(string.format('%s', vals.title)))
self.sink:write(lunacolors.format(string.format('{grayBg} ↳ {white}{italic}%s {reset}', vals.description)))
else
self.sink:write(lunacolors.reset(string.format('Viewing doc page %s', moddocPath)))
end
end
end
local backtickOccurence = 0 local backtickOccurence = 0
local page = Page(nil, lunacolors.format(doc:gsub('`', function() local page = Page(nil, lunacolors.format(doc:gsub('`', function()
backtickOccurence = backtickOccurence + 1 backtickOccurence = backtickOccurence + 1
@ -101,5 +122,6 @@ Available sections: ]] .. table.concat(modules, ', ')
return '{bold}{yellow}' .. signature .. '{reset}' return '{bold}{yellow}' .. signature .. '{reset}'
end))) end)))
gh:addPage(page) gh:addPage(page)
ansikit.hideCursor()
gh:initUi() gh:initUi()
end) end)

View File

@ -32,9 +32,7 @@ commander.register('greenhouse', function(args, sinks)
} }
end end
local oldDraw = gh.draw function gh:render()
function gh:draw()
oldDraw(self)
local workingPage = self.pages[self.curPage] local workingPage = self.pages[self.curPage]
local offset = self.offset local offset = self.offset
if self.isSpecial then if self.isSpecial then
@ -42,7 +40,7 @@ commander.register('greenhouse', function(args, sinks)
workingPage = self.specialPage workingPage = self.specialPage
end end
self.sink:write(ansikit.getCSI((self.region.height + 2) - self.start.. ';1', 'H')) self.sink:write(ansikit.getCSI(self.region.height + 1 .. ';1', 'H'))
if not self.isSpecial then if not self.isSpecial then
self.sink:write(string.format('\27[0mPage %d', self.curPage)) self.sink:write(string.format('\27[0mPage %d', self.curPage))
if workingPage.title ~= '' then if workingPage.title ~= '' then

View File

@ -15,7 +15,8 @@ local Greenhouse = Object:extend()
function Greenhouse:new(sink) function Greenhouse:new(sink)
local size = terminal.size() local size = terminal.size()
self.region = size self.region = size
self.start = 1 self.contents = nil -- or can be a table
self.start = 1 -- where to start drawing from (should replace with self.region.y)
self.offset = 1 -- vertical text offset self.offset = 1 -- vertical text offset
self.sink = sink self.sink = sink
self.pages = {} self.pages = {}
@ -71,11 +72,14 @@ function Greenhouse:draw()
self.sink:write(ansikit.getCSI(self.start .. ';1', 'H')) self.sink:write(ansikit.getCSI(self.start .. ';1', 'H'))
self.sink:write(ansikit.getCSI(2, 'J')) self.sink:write(ansikit.getCSI(2, 'J'))
for i = offset, offset + (self.region.height - 1) do for i = offset, offset + self.region.height - 1 do
if i > #lines then break end if i > #lines then break end
self.sink:writeln('\r' .. sub(lines[i]:gsub('\t', ' '), self.region.width - 2))
local writer = self.sink.writeln
if i == offset + self.region.height - 1 then writer = self.sink.write end
writer(self.sink, sub(lines[i]:gsub('\t', ' '), self.region.width))
end end
self.sink:write '\r'
self:render() self:render()
end end
@ -96,7 +100,7 @@ function Greenhouse:scroll(direction)
local oldOffset = self.offset local oldOffset = self.offset
if direction == 'down' then if direction == 'down' then
self.offset = math.min(self.offset + 1, math.max(1, #lines - self.region.height + 1)) self.offset = math.min(self.offset + 1, math.max(1, #lines - self.region.height))
elseif direction == 'up' then elseif direction == 'up' then
self.offset = math.max(self.offset - 1, 1) self.offset = math.max(self.offset - 1, 1)
end end
@ -128,6 +132,9 @@ end
function Greenhouse:updateSpecial() function Greenhouse:updateSpecial()
end end
function Greenhouse:contents()
end
function Greenhouse:toc(toggle) function Greenhouse:toc(toggle)
if not self.isSpecial then if not self.isSpecial then
self.specialPageIdx = self.curPage self.specialPageIdx = self.curPage
@ -140,17 +147,29 @@ function Greenhouse:toc(toggle)
]], lunacolors.cyan(lunacolors.bold '―― Table of Contents ――')) ]], lunacolors.cyan(lunacolors.bold '―― Table of Contents ――'))
local genericPageCount = 1 local genericPageCount = 1
for i, page in ipairs(self.pages) do local contents = self:contents()
local title = page.title if contents then
if title == 'Page' then for i, c in ipairs(contents) do
title = 'Page #' .. genericPageCount local title = c.title
genericPageCount = genericPageCount + 1 if c.active then
end title = lunacolors.invert(title)
if i == self.specialPageIdx then end
title = lunacolors.invert(title)
end
tocText = tocText .. title .. '\n' tocText = tocText .. title .. '\n'
end
else
for i, page in ipairs(self.pages) do
local title = page.title
if title == 'Page' then
title = 'Page #' .. genericPageCount
genericPageCount = genericPageCount + 1
end
if i == self.specialPageIdx then
title = lunacolors.invert(title)
end
tocText = tocText .. title .. '\n'
end
end end
self.specialPage = Page('TOC', tocText) self.specialPage = Page('TOC', tocText)
function self:updateSpecial() function self:updateSpecial()