69 lines
1.8 KiB
Lua
69 lines
1.8 KiB
Lua
local M = {}
|
|
|
|
-- Parses markdown files and returns a table of SymbolInformation[] which is
|
|
-- used by the plugin to show the outline.
|
|
-- We do this because markdown does not have a LSP.
|
|
-- Note that the headings won't have any hierarchy (as of now).
|
|
---@return table
|
|
function M.handle_markdown()
|
|
local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
|
|
local level_symbols = { { children = {} } }
|
|
local max_level = 1
|
|
local is_inside_code_block = false
|
|
|
|
for line, value in ipairs(lines) do
|
|
if string.find(value, '^```') then
|
|
is_inside_code_block = not is_inside_code_block
|
|
end
|
|
|
|
header, title = string.match(value, '^(#+)%s+(.*)$')
|
|
if header and not is_inside_code_block then
|
|
depth = #header + 1
|
|
|
|
for i = depth - 1, 1, -1 do
|
|
if level_symbols[i] ~= nil then
|
|
parent = level_symbols[i].children
|
|
break
|
|
end
|
|
end
|
|
|
|
for i = depth, max_level do
|
|
if level_symbols[i] ~= nil then
|
|
level_symbols[i].selectionRange['end'].line = line - 1
|
|
level_symbols[i].range['end'].line = line - 1
|
|
level_symbols[i] = nil
|
|
end
|
|
end
|
|
max_level = depth
|
|
|
|
entry = {
|
|
kind = 13,
|
|
name = title,
|
|
selectionRange = {
|
|
start = { character = 1, line = line - 1 },
|
|
['end'] = { character = 1, line = line - 1 },
|
|
},
|
|
range = {
|
|
start = { character = 1, line = line - 1 },
|
|
['end'] = { character = 1, line = line - 1 },
|
|
},
|
|
children = {},
|
|
}
|
|
|
|
parent[#parent + 1] = entry
|
|
level_symbols[depth] = entry
|
|
end
|
|
end
|
|
|
|
for i = 2, max_level do
|
|
if level_symbols[i] ~= nil then
|
|
level_symbols[i].selectionRange['end'].line = #lines
|
|
level_symbols[i].range['end'].line = #lines
|
|
end
|
|
end
|
|
|
|
return level_symbols[1].children
|
|
end
|
|
|
|
return M
|