Skip to content

Commit

Permalink
feat(lsp): render markdown in docs hover neovim#22766
Browse files Browse the repository at this point in the history
Problem:
LSP docs hover (textDocument/hover) doesn't handle HTML escape seqs in markdown.

Solution:
Convert common HTML escape seqs to a nicer form, to display in the float.
closees neovim#22757

Signed-off-by: Kasama <robertoaall@gmail.com>
  • Loading branch information
Kasama authored and folke committed May 22, 2023
1 parent 5100da6 commit 2ec9e7c
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 0 deletions.
14 changes: 14 additions & 0 deletions runtime/lua/vim/lsp/util.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1378,6 +1378,20 @@ function M.stylize_markdown(bufnr, contents, opts)
end
end

-- Handle some common html escape sequences
stripped = vim.tbl_map(function(line)
local escapes = {
['&gt;'] = '>',
['&lt;'] = '<',
['&quot;'] = '"',
['&apos;'] = "'",
['&ensp;'] = ' ',
['&emsp;'] = ' ',
['&amp;'] = '&',
}
return (string.gsub(line, '&[^ ;]+;', escapes))
end, stripped)

-- Compute size of float needed to show (wrapped) lines
opts.wrap_at = opts.wrap_at or (vim.wo['wrap'] and api.nvim_win_get_width(0))
local width = M._make_floating_popup_size(stripped, opts)
Expand Down
75 changes: 75 additions & 0 deletions test/functional/plugin/lsp/utils_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
local helpers = require('test.functional.helpers')(after_each)

local eq = helpers.eq
local exec_lua = helpers.exec_lua

describe('vim.lsp.util', function()
before_each(helpers.clear)

describe('stylize_markdown', function()
local stylize_markdown = function(content, opts)
return exec_lua([[
local bufnr = vim.uri_to_bufnr("file:///fake/uri")
vim.fn.bufload(bufnr)
local args = { ... }
local content = args[1]
local opts = args[2]
local stripped_content = vim.lsp.util.stylize_markdown(bufnr, content, opts)
return stripped_content
]], content, opts)
end

it('code fences', function()
local lines = {
"```lua",
"local hello = 'world'",
"```",
}
local expected = {
"local hello = 'world'",
}
local opts = {}
eq(expected, stylize_markdown(lines, opts))
end)

it('adds separator after code block', function()
local lines = {
"```lua",
"local hello = 'world'",
"```",
"",
"something",
}
local expected = {
"local hello = 'world'",
"─────────────────────",
"something",
}
local opts = { separator = true }
eq(expected, stylize_markdown(lines, opts))
end)

it('replaces supported HTML entities', function()
local lines = {
"1 &lt; 2",
"3 &gt; 2",
"&quot;quoted&quot;",
"&apos;apos&apos;",
"&ensp; &emsp;",
"&amp;",
}
local expected = {
"1 < 2",
"3 > 2",
'"quoted"',
"'apos'",
" ",
"&",
}
local opts = {}
eq(expected, stylize_markdown(lines, opts))
end)
end)
end)

0 comments on commit 2ec9e7c

Please sign in to comment.