mirror of https://github.com/Hilbis/Hilbish
fix(greenhouse): reset at end and beginning of line to fix colors leaking to other lines
parent
bbd5637e9b
commit
ff6e08902f
|
@ -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.
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue