diff --git a/CHANGELOG.md b/CHANGELOG.md index 021edf7..e6eeed8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,9 @@ hilbish.run('wc -l', { }) ``` +### Fixed +- Fix ansi attributes causing issues with text when cut off in greenhouse + ## [2.2.3] - 2024-04-27 ### Fixed - Highligher and hinter work now, since it was regressed from the previous minor release. diff --git a/nature/doc.lua b/nature/doc.lua index 657af51..f0b7e11 100644 --- a/nature/doc.lua +++ b/nature/doc.lua @@ -17,8 +17,8 @@ function M.renderCodeBlock(text) end for i, line in ipairs(lines) do - lines[i] = ' ' .. M.highlight(line:sub(0, longest)) - .. string.rep(' ', longest - line:len()) .. ' ' + lines[i] = lunacolors.format('{greyBg}' .. ' ' .. M.highlight(line:sub(0, longest)) + .. string.rep(' ', longest - line:len()) .. ' ') end return '\n' .. lunacolors.format('{greyBg}' .. table.concat(lines, '\n')) .. '\n' diff --git a/nature/greenhouse/init.lua b/nature/greenhouse/init.lua index e58faf7..fe4c31c 100644 --- a/nature/greenhouse/init.lua +++ b/nature/greenhouse/init.lua @@ -61,17 +61,24 @@ function Greenhouse:updateCurrentPage(text) page:setText(text) end +local ansiPatters = { + '\x1b%[%d+;%d+;%d+;%d+;%d+%w', + '\x1b%[%d+;%d+;%d+;%d+%w', + '\x1b%[%d+;%d+;%d+%w', + '\x1b%[%d+;%d+%w', + '\x1b%[%d+%w' +} + function Greenhouse:sub(str, offset, limit) local overhead = 0 local function addOverhead(s) overhead = overhead + string.len(s) end - local s = str:gsub('\x1b%[%d+;%d+;%d+;%d+;%d+%w', addOverhead) - :gsub('\x1b%[%d+;%d+;%d+;%d+%w', addOverhead) - :gsub('\x1b%[%d+;%d+;%d+%w',addOverhead) - :gsub('\x1b%[%d+;%d+%w', addOverhead) - :gsub('\x1b%[%d+%w', addOverhead) + local s = str + for _, pat in ipairs(ansiPatters) do + s = s:gsub(pat, addOverhead) + end return s:sub(offset, utf8.offset(str, limit + overhead) or limit + overhead) --return s:sub(offset, limit + overhead) @@ -94,14 +101,40 @@ function Greenhouse:draw() self.sink:write(ansikit.getCSI(2, 'J')) local writer = self.sink.writeln + self.attributes = {} for i = offset, offset + self.region.height - 1 do + local resetEnd = false if i > #lines then break end if i == offset + self.region.height - 1 then writer = self.sink.write end self.sink:write(ansikit.getCSI(self.start + i - offset .. ';1', 'H')) local line = lines[i]:gsub('{separator}', function() return self.separator:rep(self.region.width - 1) end) - writer(self.sink, self:sub(line:gsub('\t', ' '), self.horizOffset, self.region.width)) + for _, pat in ipairs(ansiPatters) do + line:gsub(pat, function(s) + if s == lunacolors.formatColors.reset then + self.attributes = {} + resetEnd = true + else + --resetEnd = false + --table.insert(self.attributes, s) + end + end) + end + +--[[ + if #self.attributes ~= 0 then + for _, attr in ipairs(self.attributes) do + --writer(self.sink, attr) + end + end +]]-- + + self.sink:write(lunacolors.formatColors.reset) + writer(self.sink, self:sub(line:gsub('\t', ' '), self.horizOffset, self.region.width + self.horizOffset)) + if resetEnd then + self.sink:write(lunacolors.formatColors.reset) + end end writer(self.sink, '\27[0m') self:render()