mirror of
https://github.com/neovim/neovim.git
synced 2024-12-29 14:41:06 -07:00
feat(lsp): render markdown in docs hover #22766
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 #22757 Signed-off-by: Kasama <robertoaall@gmail.com>
This commit is contained in:
parent
74f05a152d
commit
257d894d75
@ -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 = {
|
||||
['>'] = '>',
|
||||
['<'] = '<',
|
||||
['"'] = '"',
|
||||
['''] = "'",
|
||||
[' '] = ' ',
|
||||
[' '] = ' ',
|
||||
['&'] = '&',
|
||||
}
|
||||
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)
|
||||
|
75
test/functional/plugin/lsp/utils_spec.lua
Normal file
75
test/functional/plugin/lsp/utils_spec.lua
Normal file
@ -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 < 2",
|
||||
"3 > 2",
|
||||
""quoted"",
|
||||
"'apos'",
|
||||
"   ",
|
||||
"&",
|
||||
}
|
||||
local expected = {
|
||||
"1 < 2",
|
||||
"3 > 2",
|
||||
'"quoted"',
|
||||
"'apos'",
|
||||
" ",
|
||||
"&",
|
||||
}
|
||||
local opts = {}
|
||||
eq(expected, stylize_markdown(lines, opts))
|
||||
end)
|
||||
end)
|
||||
end)
|
Loading…
Reference in New Issue
Block a user