Files
neovim/test/functional/plugin/lsp/utils_spec.lua
Mike 251ca45ac9 fix(lsp): markdown code fence should allow space before info string #24364
Problem:
Bash language server returns "hover" markdown content that starts with
a code fence and info string of `man` preceded by whitespace, which Nvim
does not render properly.

See 0ee73c53ce/server/src/server.ts (L821C15-L821C15)
```typescript
function getMarkdownContent(documentation: string, language?: string): LSP.MarkupContent {
  return {
    value: language
      ? // eslint-disable-next-line prefer-template
        ['``` ' + language, documentation, '```'].join('\n')
      : documentation,
    kind: LSP.MarkupKind.Markdown,
  }
}
```

For example,
```
    ``` man
    NAME
       git - the stupid content tracker
    ```
```

If I remove the white space, then it is properly formatted. 
```    
    ```man instead of ``` man
```

Per CommonMark Spec https://spec.commonmark.org/0.30/#info-string
whitespace is allowed before and after the `info string` which
identifies the language in a codeblock.
> The line with the opening code fence may optionally contain some text
> following the code fence; this is trimmed of leading and trailing
> spaces or tabs and called the [info
> string](https://spec.commonmark.org/0.30/#info-string). If the [info
> string](https://spec.commonmark.org/0.30/#info-string) comes after
> a backtick fence, it may not contain any backtick characters. (The
> reason for this restriction is that otherwise some inline code would
> be incorrectly interpreted as the beginning of a fenced code block.)

 Solution:
 Adjust stylize_markdown() to allow whitespace before codeblock info.
2023-07-16 03:11:45 -07:00

89 lines
2.1 KiB
Lua

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('code fences with whitespace surrounded info string', 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)