fix(man): filter OSC 8 hyperlink markup #29171

Problem: `man cmake` shows "8;;https://cmake.orghttps://cmake.org8;;"
Solution: Remove noise so that it shows as "https://cmake.org".
See also: https://en.wikipedia.org/wiki/ANSI_escape_code#OSC
This commit is contained in:
Lennard Hofmann 2024-06-07 21:43:17 +02:00 committed by GitHub
parent f3632e14e3
commit da6f68ee69
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 3 deletions

View File

@ -35,7 +35,7 @@ local function highlight_line(line, linenr)
---@type string[]
local chars = {}
local prev_char = ''
local overstrike, escape = false, false
local overstrike, escape, osc8 = false, false, false
---@type table<integer,{attr:integer,start:integer,final:integer}>
local hls = {} -- Store highlight groups as { attr, start, final }
@ -139,6 +139,12 @@ local function highlight_line(line, linenr)
prev_char = ''
byte = byte + #char
chars[#chars + 1] = char
elseif osc8 then
-- eat characters until String Terminator or bell
if (prev_char == '\027' and char == '\\') or char == '\a' then
osc8 = false
end
prev_char = char
elseif escape then
-- Use prev_char to store the escape sequence
prev_char = prev_char .. char
@ -157,8 +163,11 @@ local function highlight_line(line, linenr)
add_attr_hl(match + 0) -- coerce to number
end
escape = false
elseif not prev_char:match('^%[[\032-\063]*$') then
-- Stop looking if this isn't a partial CSI sequence
elseif prev_char == ']8;' then
osc8 = true
escape = false
elseif not prev_char:match('^[][][\032-\063]*$') then
-- Stop looking if this isn't a partial CSI or OSC sequence
escape = false
end
elseif char == '\027' then

View File

@ -117,6 +117,29 @@ describe(':Man', function()
]])
end)
it('clears OSC 8 hyperlink markup from text', function()
feed(
[[
ithis <C-v><ESC>]8;;http://example.com<C-v><ESC>\Link Title<C-v><ESC>]8;;<C-v><ESC>\<ESC>]]
)
screen:expect {
grid = [=[
this {c:^[}]8;;http://example.com{c:^[}\Link Title{c:^[}]8;;{c:^[}^\ |
{eob:~ }|*3
|
]=],
}
exec_lua [[require'man'.init_pager()]]
screen:expect([[
^this Link Title |
{eob:~ }|*3
|
]])
end)
it('highlights multibyte text', function()
feed(
[[