aboutsummaryrefslogtreecommitdiff
path: root/scripts/gen_help_html.lua
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/gen_help_html.lua')
-rw-r--r--scripts/gen_help_html.lua35
1 files changed, 27 insertions, 8 deletions
diff --git a/scripts/gen_help_html.lua b/scripts/gen_help_html.lua
index 13601b91f5..c647484905 100644
--- a/scripts/gen_help_html.lua
+++ b/scripts/gen_help_html.lua
@@ -249,6 +249,16 @@ local function getbuflinestr(node, bufnr, offset)
return table.concat(lines, '\n')
end
+-- Gets the whitespace just before `node` from the raw buffer text.
+-- Needed for preformatted `old` lines.
+local function getws(node, bufnr)
+ local line1, c1, line2, _ = node:range()
+ local raw = vim.fn.getbufline(bufnr, line1 + 1, line2 + 1)[1]
+ local text_before = raw:sub(1, c1)
+ local leading_ws = text_before:match('%s+$') or ''
+ return leading_ws
+end
+
local function get_tagname(node, bufnr)
local text = vim.treesitter.get_node_text(node, bufnr)
local tag = (node:type() == 'optionlink' or node:parent():type() == 'optionlink') and ("'%s'"):format(text) or text
@@ -354,12 +364,21 @@ local function visit_node(root, level, lang_tree, headings, opt, stats)
local parent = root:parent() and root:parent():type() or nil
local text = ''
local trimmed
- local function node_text(node)
- return vim.treesitter.get_node_text(node or root, opt.buf)
+ -- Gets leading whitespace of `node`.
+ local function ws(node)
+ node = node or root
+ local ws_ = getws(node, opt.buf)
+ -- XXX: first node of a (line) includes whitespace, even after
+ -- https://github.com/neovim/tree-sitter-vimdoc/pull/31 ?
+ if ws_ == '' then
+ ws_ = vim.treesitter.get_node_text(node, opt.buf):match('^%s+') or ''
+ end
+ return ws_
end
- -- Gets leading whitespace of the current node.
- local function ws()
- return node_text():match('^%s+') or ''
+ local function node_text(node, ws_)
+ node = node or root
+ ws_ = (ws_ == nil or ws_ == true) and getws(node, opt.buf) or ''
+ return string.format('%s%s', ws_, vim.treesitter.get_node_text(node, opt.buf))
end
if root:named_child_count() == 0 or node_name == 'ERROR' then
@@ -401,7 +420,7 @@ local function visit_node(root, level, lang_tree, headings, opt, stats)
if root:has_error() then
return text
end
- return ('<div class="help-column_heading">%s%s</div>'):format(ws(), trimmed)
+ return ('<div class="help-column_heading">%s</div>'):format(text)
elseif node_name == 'block' then
if is_blank(text) then
return ''
@@ -462,9 +481,9 @@ local function visit_node(root, level, lang_tree, headings, opt, stats)
end
local in_heading = vim.tbl_contains({'h1', 'h2', 'h3'}, parent)
local cssclass = (not in_heading and get_indent(node_text()) > 8) and 'help-tag-right' or 'help-tag'
- local tagname = node_text(root:child(1))
+ local tagname = node_text(root:child(1), false)
if vim.tbl_count(stats.first_tags) < 2 then
- -- First 2 tags in the doc will be anchored at the main heading.
+ -- Force the first 2 tags in the doc to be anchored at the main heading.
table.insert(stats.first_tags, tagname)
return ''
end