From e454ab0d7003a039db2a5235fb217f5875977980 Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 18 Feb 2023 16:57:27 -0400 Subject: [PATCH 01/10] feat: add greenhouse pager --- nature/commands/greenhouse.lua | 67 ++++++++++++++++++++++++++++++++++ nature/greenhouse.lua | 47 ++++++++++++++++++++++++ nature/object.lua | 59 ++++++++++++++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 nature/commands/greenhouse.lua create mode 100644 nature/greenhouse.lua create mode 100644 nature/object.lua diff --git a/nature/commands/greenhouse.lua b/nature/commands/greenhouse.lua new file mode 100644 index 0000000..916c29a --- /dev/null +++ b/nature/commands/greenhouse.lua @@ -0,0 +1,67 @@ +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' + +commander.register('greenhouse', function(args, sinks) + local fname = args[1] + local done = false + local f = io.open(fname, 'r') + if not f then + sinks.err:writeln(string.format('could not open file %s', fname)) + end + + bait.catch('signal.sigint', function() + done = true + end) + + local gh = Greenhouse(sinks.out) + gh:setText(f:read '*a') + + ansikit.screenAlt() + ansikit.clear(true) + gh:draw() + + hilbish.goro(function() + while not done do + local c = read() + if c == 3 then + done = true + end + + if c == 27 then + local c1 = read() + if c1 == 91 then + local c2 = read() + if c2 == 66 then -- arrow down + gh:scroll 'down' + elseif c2 == 65 then -- arrow up + gh:scroll 'up' + end + end + goto continue + end + print('\nchar:') + print(c) + + ::continue:: + end + end) + + while not done do + -- + end + ansikit.clear() + ansikit.screenMain() +end) + +function read() + terminal.saveState() + terminal.setRaw() + local c = io.read(1) + + terminal.restoreState() + return c:byte() +end diff --git a/nature/greenhouse.lua b/nature/greenhouse.lua new file mode 100644 index 0000000..44947da --- /dev/null +++ b/nature/greenhouse.lua @@ -0,0 +1,47 @@ +-- Greenhouse is a simple text scrolling handler for terminal program. +-- The idea is that it can be set a region to do its scrolling and paging +-- job and then the user can draw whatever outside it. +-- This reduces code duplication for the message viewer +-- and flowerbook. + +local ansikit = require 'ansikit' +local terminal = require 'terminal' +local Object = require 'nature.object' + +local Greenhouse = Object:extend() + +function Greenhouse:new(sink) + local size = terminal.size() + self.region = size + self.start = 1 + self.offset = 0 + self.sink = sink + + return self +end + +function Greenhouse:setText(text) + self.lines = string.split(text, '\n') +end + +function Greenhouse:draw() + self.sink:write(ansikit.getCSI(self.start .. ';1', 'H')) + + for i = 1, #self.lines do + if i > self.region.height - 1 then break end + if not self.lines[i + self.offset] then break end + + self.sink:writeln(self.lines[i + self.offset]:gsub('\t', ' '):sub(0, self.region.width - 2)) + end +end + +function Greenhouse:scroll(direction) + if direction == 'down' then + self.offset = self.offset + 1 + elseif direction == 'up' then + self.offset = self.offset - 1 + end + self:draw() +end + +return Greenhouse diff --git a/nature/object.lua b/nature/object.lua new file mode 100644 index 0000000..053be4a --- /dev/null +++ b/nature/object.lua @@ -0,0 +1,59 @@ +---@class nature.object +---@field super nature.object +local Object = {} +Object.__index = Object + +---Can be overrided by child objects to implement a constructor. +function Object:new() end + +---@return nature.object +function Object:extend() + local cls = {} + for k, v in pairs(self) do + if k:find("__") == 1 then + cls[k] = v + end + end + cls.__index = cls + cls.super = self + setmetatable(cls, self) + return cls +end + +---Check if the object is strictly of the given type. +---@param T any +---@return boolean +function Object:is(T) + return getmetatable(self) == T +end + +---Check if the object inherits from the given type. +---@param T any +---@return boolean +function Object:extends(T) + local mt = getmetatable(self) + while mt do + if mt == T then + return true + end + mt = getmetatable(mt) + end + return false +end + +---Metamethod to get a string representation of an object. +---@return string +function Object:__tostring() + return "Object" +end + +---Methamethod to allow using the object call as a constructor. +---@return nature.object +function Object:__call(...) + local obj = setmetatable({}, self) + obj:new(...) + return obj +end + + +return Object From 45eb3d17e30bd2aa066f701ae3e5a3b4a4078ecb Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 18 Feb 2023 17:57:03 -0400 Subject: [PATCH 02/10] fix(nature/greenhouse): draw pager body properly --- nature/greenhouse.lua | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/nature/greenhouse.lua b/nature/greenhouse.lua index 44947da..fb090c1 100644 --- a/nature/greenhouse.lua +++ b/nature/greenhouse.lua @@ -14,7 +14,7 @@ function Greenhouse:new(sink) local size = terminal.size() self.region = size self.start = 1 - self.offset = 0 + self.offset = 1 self.sink = sink return self @@ -27,11 +27,9 @@ end function Greenhouse:draw() self.sink:write(ansikit.getCSI(self.start .. ';1', 'H')) - for i = 1, #self.lines do - if i > self.region.height - 1 then break end - if not self.lines[i + self.offset] then break end - - self.sink:writeln(self.lines[i + self.offset]:gsub('\t', ' '):sub(0, self.region.width - 2)) + for i = self.offset, self.offset + (self.region.height - self.start) - 1 do + self.sink:write(ansikit.getCSI(2, 'K')) + self.sink:writeln(self.lines[i]:gsub('\t', ' '):sub(0, self.region.width - 2)) end end From e368ba3e0a10373ca742ea1d33127b842c7f40f2 Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 18 Feb 2023 17:57:46 -0400 Subject: [PATCH 03/10] fix(nature/greenhouse): add limit to text offset for scrolling --- nature/greenhouse.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nature/greenhouse.lua b/nature/greenhouse.lua index fb090c1..390c454 100644 --- a/nature/greenhouse.lua +++ b/nature/greenhouse.lua @@ -35,9 +35,9 @@ end function Greenhouse:scroll(direction) if direction == 'down' then - self.offset = self.offset + 1 + self.offset = math.min(self.offset + 1, #self.lines) elseif direction == 'up' then - self.offset = self.offset - 1 + self.offset = math.max(self.offset - 1, 1) end self:draw() end From bb9a6fe39edd66a8637d581806dbff8464a4c968 Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 18 Feb 2023 18:58:16 -0400 Subject: [PATCH 04/10] fix(nature/greenhouse): handle raw mode and term resize --- nature/commands/greenhouse.lua | 8 ++++++-- nature/greenhouse.lua | 11 +++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/nature/commands/greenhouse.lua b/nature/commands/greenhouse.lua index 916c29a..df01196 100644 --- a/nature/commands/greenhouse.lua +++ b/nature/commands/greenhouse.lua @@ -13,12 +13,16 @@ commander.register('greenhouse', function(args, sinks) sinks.err:writeln(string.format('could not open file %s', fname)) end + local gh = Greenhouse(sinks.out) + gh:setText(f:read '*a') + bait.catch('signal.sigint', function() done = true end) - local gh = Greenhouse(sinks.out) - gh:setText(f:read '*a') + bait.catch('signal.resize', function() + gh:update() + end) ansikit.screenAlt() ansikit.clear(true) diff --git a/nature/greenhouse.lua b/nature/greenhouse.lua index 390c454..1e292e2 100644 --- a/nature/greenhouse.lua +++ b/nature/greenhouse.lua @@ -1,4 +1,4 @@ --- Greenhouse is a simple text scrolling handler for terminal program. +-- Greenhouse is a simple text scrolling handler for terminal programs. -- The idea is that it can be set a region to do its scrolling and paging -- job and then the user can draw whatever outside it. -- This reduces code duplication for the message viewer @@ -29,8 +29,9 @@ function Greenhouse:draw() for i = self.offset, self.offset + (self.region.height - self.start) - 1 do self.sink:write(ansikit.getCSI(2, 'K')) - self.sink:writeln(self.lines[i]:gsub('\t', ' '):sub(0, self.region.width - 2)) + self.sink:writeln('\r' .. self.lines[i]:gsub('\t', ' '):sub(0, self.region.width - 2)) end + self.sink:write '\r' end function Greenhouse:scroll(direction) @@ -39,6 +40,12 @@ function Greenhouse:scroll(direction) elseif direction == 'up' then self.offset = math.max(self.offset - 1, 1) end +end + +function Greenhouse:update() + local size = terminal.size() + self.region = size + self:draw() end From 8b5b9b3c1c7039500b5457da3b6019e57a4f8b17 Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 18 Feb 2023 18:58:44 -0400 Subject: [PATCH 05/10] fix(nature/greenhouse): dont redraw if scroll pos stays the same --- nature/greenhouse.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nature/greenhouse.lua b/nature/greenhouse.lua index 1e292e2..a2c9b97 100644 --- a/nature/greenhouse.lua +++ b/nature/greenhouse.lua @@ -35,11 +35,14 @@ function Greenhouse:draw() end function Greenhouse:scroll(direction) + local oldOffset = self.offset if direction == 'down' then self.offset = math.min(self.offset + 1, #self.lines) elseif direction == 'up' then self.offset = math.max(self.offset - 1, 1) end + + if self.offset ~= oldOffset then self:draw() end end function Greenhouse:update() From 179bec7ae5c7087ef6bcfbfbe3ba9fe8ef38afa6 Mon Sep 17 00:00:00 2001 From: sammyette Date: Sun, 19 Feb 2023 16:53:39 -0400 Subject: [PATCH 06/10] feat(nature/greenhouse): support setting multiple pages --- nature/commands/greenhouse.lua | 35 +++++++++++++---- .../{greenhouse.lua => greenhouse/init.lua} | 38 ++++++++++++++++--- nature/greenhouse/page.lua | 13 +++++++ 3 files changed, 72 insertions(+), 14 deletions(-) rename nature/{greenhouse.lua => greenhouse/init.lua} (53%) create mode 100644 nature/greenhouse/page.lua diff --git a/nature/commands/greenhouse.lua b/nature/commands/greenhouse.lua index df01196..2baf3cc 100644 --- a/nature/commands/greenhouse.lua +++ b/nature/commands/greenhouse.lua @@ -4,17 +4,21 @@ 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 fname = args[1] - local done = false - local f = io.open(fname, 'r') - if not f then - sinks.err:writeln(string.format('could not open file %s', fname)) - end - local gh = Greenhouse(sinks.out) - gh:setText(f:read '*a') + local done = false + + 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(f:read '*a') + gh:addPage(page) + end bait.catch('signal.sigint', function() done = true @@ -44,6 +48,21 @@ commander.register('greenhouse', function(args, sinks) elseif c2 == 65 then -- arrow up gh:scroll 'up' end + + if c2 == 49 then + local c3 = read() + if c3 == 59 then + local c4 = read() + if c4 == 53 then + local c5 = read() + if c5 == 67 then + gh:next() + elseif c5 == 68 then + gh:previous() + end + end + end + end end goto continue end diff --git a/nature/greenhouse.lua b/nature/greenhouse/init.lua similarity index 53% rename from nature/greenhouse.lua rename to nature/greenhouse/init.lua index a2c9b97..ef1d3ff 100644 --- a/nature/greenhouse.lua +++ b/nature/greenhouse/init.lua @@ -16,28 +16,43 @@ function Greenhouse:new(sink) self.start = 1 self.offset = 1 self.sink = sink + self.pages = {} + self.curPage = 1 return self end -function Greenhouse:setText(text) - self.lines = string.split(text, '\n') +function Greenhouse:addPage(page) + table.insert(self.pages, page) +end + +function Greenhouse:updateCurrentPage(text) + local page = self.pages[self.curPage] + page:setText(text) end function Greenhouse:draw() + local lines = self.pages[self.curPage].lines self.sink:write(ansikit.getCSI(self.start .. ';1', 'H')) + self.sink:write(ansikit.getCSI(2, 'J')) - for i = self.offset, self.offset + (self.region.height - self.start) - 1 do - self.sink:write(ansikit.getCSI(2, 'K')) - self.sink:writeln('\r' .. self.lines[i]:gsub('\t', ' '):sub(0, self.region.width - 2)) + -- the -2 negate is for the command and status line + for i = self.offset, self.offset + (self.region.height - self.start) - 2 do + if i > #lines then break end + self.sink:writeln('\r' .. lines[i]:gsub('\t', ' '):sub(0, self.region.width - 2)) end self.sink:write '\r' + + self.sink:write(ansikit.getCSI(self.region.height - self.start.. ';1', 'H')) + self.sink:writeln(string.format('Page %d', self.curPage)) end function Greenhouse:scroll(direction) + local lines = self.pages[self.curPage].lines + local oldOffset = self.offset if direction == 'down' then - self.offset = math.min(self.offset + 1, #self.lines) + self.offset = math.min(self.offset + 1, #lines) elseif direction == 'up' then self.offset = math.max(self.offset - 1, 1) end @@ -52,4 +67,15 @@ function Greenhouse:update() self:draw() end +function Greenhouse:next() + self.curPage = math.min(self.curPage + 1, #self.pages) + self.sink:write(ansikit.getCSI(2, 'J')) + self:draw() +end + +function Greenhouse:previous() + self.curPage = math.max(self.curPage - 1, 1) + self:draw() +end + return Greenhouse diff --git a/nature/greenhouse/page.lua b/nature/greenhouse/page.lua new file mode 100644 index 0000000..09f1e91 --- /dev/null +++ b/nature/greenhouse/page.lua @@ -0,0 +1,13 @@ +local Object = require 'nature.object' + +local Page = Object:extend() + +function Page:new(text) + self:setText(text) +end + +function Page:setText(text) + self.lines = string.split(text, '\n') +end + +return Page From ec0692edeb1c610ea04ee96aca990d7e4f6673fd Mon Sep 17 00:00:00 2001 From: sammyette Date: Sun, 19 Feb 2023 17:05:25 -0400 Subject: [PATCH 07/10] fix(nature/greenhouse): reset line offset when switching pages --- nature/greenhouse/init.lua | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/nature/greenhouse/init.lua b/nature/greenhouse/init.lua index ef1d3ff..0b710c2 100644 --- a/nature/greenhouse/init.lua +++ b/nature/greenhouse/init.lua @@ -68,14 +68,21 @@ function Greenhouse:update() end function Greenhouse:next() + local oldCurrent = self.curPage self.curPage = math.min(self.curPage + 1, #self.pages) - self.sink:write(ansikit.getCSI(2, 'J')) - self:draw() + if self.curPage ~= oldCurrent then + self.offset = 1 + self:draw() + end end function Greenhouse:previous() + local oldCurrent = self.curPage self.curPage = math.max(self.curPage - 1, 1) - self:draw() + if self.curPage ~= oldCurrent then + self.offset = 1 + self:draw() + end end return Greenhouse From d196799abf5da57f397456193559c757e4af51ff Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 25 Mar 2023 18:12:51 -0400 Subject: [PATCH 08/10] feat(commands/greenhouse): support reading from pipes --- nature/commands/greenhouse.lua | 5 +++++ sink.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/nature/commands/greenhouse.lua b/nature/commands/greenhouse.lua index 2baf3cc..351b120 100644 --- a/nature/commands/greenhouse.lua +++ b/nature/commands/greenhouse.lua @@ -10,6 +10,11 @@ commander.register('greenhouse', function(args, sinks) local gh = Greenhouse(sinks.out) local done = false + 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 diff --git a/sink.go b/sink.go index 2ecc19d..62e9bec 100644 --- a/sink.go +++ b/sink.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "os" + "strings" "hilbish/util" @@ -31,6 +32,7 @@ func setupSinkType(rtm *rt.Runtime) { sinkFuncs := map[string]util.LuaExport{ "flush": {luaSinkFlush, 1, false}, "read": {luaSinkRead, 1, false}, + "readAll": {luaSinkReadAll, 1, false}, "autoFlush": {luaSinkAutoFlush, 2, false}, "write": {luaSinkWrite, 2, false}, "writeln": {luaSinkWriteln, 2, false}, @@ -65,6 +67,38 @@ func setupSinkType(rtm *rt.Runtime) { l.SetRegistry(sinkMetaKey, rt.TableValue(sinkMeta)) } + +// #member +// read() -> string +// --- @returns string +// Reads input from the sink. +func luaSinkReadAll(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { + if err := c.Check1Arg(); err != nil { + return nil, err + } + + s, err := sinkArg(c, 0) + if err != nil { + return nil, err + } + + lines := []string{} + for { + line, err := s.reader.ReadString('\n') + if err != nil { + if err == io.EOF { + break + } + + return nil, err + } + + lines = append(lines, line) + } + + return c.PushingNext1(t.Runtime, rt.StringValue(strings.Join(lines, ""))), nil +} + // #member // read() -> string // --- @returns string From 076118d2371abdcc2e79353236917bd91e66a87c Mon Sep 17 00:00:00 2001 From: sammyette Date: Tue, 11 Apr 2023 20:44:29 -0400 Subject: [PATCH 09/10] feat: make doc command use pager --- nature/commands/doc.lua | 7 ++- nature/commands/greenhouse.lua | 69 +---------------------------- nature/greenhouse/init.lua | 80 +++++++++++++++++++++++++++++++++- 3 files changed, 86 insertions(+), 70 deletions(-) diff --git a/nature/commands/doc.lua b/nature/commands/doc.lua index d37e677..841f912 100644 --- a/nature/commands/doc.lua +++ b/nature/commands/doc.lua @@ -1,6 +1,8 @@ local commander = require 'commander' local fs = require 'fs' local lunacolors = require 'lunacolors' +local Greenhouse = require 'nature.greenhouse' +local Page = require 'nature.greenhouse.page' commander.register('doc', function(args, sinks) local moddocPath = hilbish.dataDir .. '/docs/' @@ -85,8 +87,9 @@ Available sections: ]] .. table.concat(modules, ', ') f:close() end + local gh = Greenhouse(sinks.out) local backtickOccurence = 0 - sinks.out:writeln(lunacolors.format(doc:gsub('`', function() + local page = Page(lunacolors.format(doc:gsub('`', function() backtickOccurence = backtickOccurence + 1 if backtickOccurence % 2 == 0 then return '{reset}' @@ -97,4 +100,6 @@ Available sections: ]] .. table.concat(modules, ', ') local signature = t:gsub('<.->(.-)', '{underline}%1'):gsub('\\', '<') return '{bold}{yellow}' .. signature .. '{reset}' end))) + gh:addPage(page) + gh:initUi() end) diff --git a/nature/commands/greenhouse.lua b/nature/commands/greenhouse.lua index 351b120..7b38d33 100644 --- a/nature/commands/greenhouse.lua +++ b/nature/commands/greenhouse.lua @@ -8,7 +8,6 @@ local Page = require 'nature.greenhouse.page' commander.register('greenhouse', function(args, sinks) local gh = Greenhouse(sinks.out) - local done = false if sinks['in'].pipe then local page = Page(sinks['in']:readAll()) @@ -25,71 +24,5 @@ commander.register('greenhouse', function(args, sinks) gh:addPage(page) end - bait.catch('signal.sigint', function() - done = true - end) - - bait.catch('signal.resize', function() - gh:update() - end) - - ansikit.screenAlt() - ansikit.clear(true) - gh:draw() - - hilbish.goro(function() - while not done do - local c = read() - if c == 3 then - done = true - end - - if c == 27 then - local c1 = read() - if c1 == 91 then - local c2 = read() - if c2 == 66 then -- arrow down - gh:scroll 'down' - elseif c2 == 65 then -- arrow up - gh:scroll 'up' - end - - if c2 == 49 then - local c3 = read() - if c3 == 59 then - local c4 = read() - if c4 == 53 then - local c5 = read() - if c5 == 67 then - gh:next() - elseif c5 == 68 then - gh:previous() - end - end - end - end - end - goto continue - end - print('\nchar:') - print(c) - - ::continue:: - end - end) - - while not done do - -- - end - ansikit.clear() - ansikit.screenMain() + gh:initUi() end) - -function read() - terminal.saveState() - terminal.setRaw() - local c = io.read(1) - - terminal.restoreState() - return c:byte() -end diff --git a/nature/greenhouse/init.lua b/nature/greenhouse/init.lua index 0b710c2..3cd4133 100644 --- a/nature/greenhouse/init.lua +++ b/nature/greenhouse/init.lua @@ -44,7 +44,7 @@ function Greenhouse:draw() self.sink:write '\r' self.sink:write(ansikit.getCSI(self.region.height - self.start.. ';1', 'H')) - self.sink:writeln(string.format('Page %d', self.curPage)) + self.sink:writeln(string.format('\27[0mPage %d', self.curPage)) end function Greenhouse:scroll(direction) @@ -85,4 +85,82 @@ function Greenhouse:previous() end end +function Greenhouse:initUi() + local ansikit = require 'ansikit' + local bait = require 'bait' + local commander = require 'commander' + local hilbish = require 'hilbish' + local terminal = require 'terminal' + local Page = require 'nature.greenhouse.page' + local done = false + + bait.catch('signal.sigint', function() + ansikit.clear() + done = true + end) + + bait.catch('signal.resize', function() + self:update() + end) + + ansikit.screenAlt() + ansikit.clear(true) + self:draw() + + hilbish.goro(function() + while not done do + local c = read() + if c == 3 then + done = true + end + + if c == 27 then + local c1 = read() + if c1 == 91 then + local c2 = read() + if c2 == 66 then -- arrow down + self:scroll 'down' + elseif c2 == 65 then -- arrow up + self:scroll 'up' + end + + if c2 == 49 then + local c3 = read() + if c3 == 59 then + local c4 = read() + if c4 == 53 then + local c5 = read() + if c5 == 67 then + self:next() + elseif c5 == 68 then + self:previous() + end + end + end + end + end + goto continue + end + print('\nchar:') + print(c) + + ::continue:: + end + end) + + while not done do + -- + end + ansikit.screenMain() +end + +function read() + terminal.saveState() + terminal.setRaw() + local c = io.read(1) + + terminal.restoreState() + return c:byte() +end + return Greenhouse From f9546e10e499ac356a99bdc0b423edb1fbcd03ef Mon Sep 17 00:00:00 2001 From: sammyette Date: Fri, 14 Apr 2023 00:45:30 -0400 Subject: [PATCH 10/10] docs: update doc strings for sink read functions --- sink.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sink.go b/sink.go index 62e9bec..3aa5507 100644 --- a/sink.go +++ b/sink.go @@ -69,9 +69,9 @@ func setupSinkType(rtm *rt.Runtime) { // #member -// read() -> string +// readAll() -> string // --- @returns string -// Reads input from the sink. +// Reads all input from the sink. func luaSinkReadAll(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -102,7 +102,7 @@ func luaSinkReadAll(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // #member // read() -> string // --- @returns string -// Reads input from the sink. +// Reads a liine of input from the sink. func luaSinkRead(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err