fix(gen_help_html): handle delimiter, heading #29415

Problem:
vimdoc grammar added new forms that are not handled in our HTML
generator. https://github.com/neovim/tree-sitter-vimdoc/pull/134

Solution:
Update `gen_help_html.lua`.

Fixes #29277
This commit is contained in:
Justin M. Keyes
2024-06-19 09:45:40 -07:00
committed by GitHub
parent e5e81262af
commit ceea6898a8
2 changed files with 33 additions and 26 deletions

View File

@ -448,9 +448,9 @@ trust the files you are editing: >
:set nomodeline :set nomodeline
Use this format for the modeline: Use this format for the modeline: >
any-text vim:set {option}={value} ... : any-text ~ any-text vim:set {option}={value} ... : any-text
The "any-text" indicates that you can put any text before and after the part The "any-text" indicates that you can put any text before and after the part
that Vim will use. This allows making it look like a comment, like what was that Vim will use. This allows making it look like a comment, like what was
@ -462,9 +462,9 @@ using something like "gvim:" will not work.
typing the ":set" command, except that you need to insert a backslash before a typing the ":set" command, except that you need to insert a backslash before a
colon (otherwise it would be seen as the end of the modeline). colon (otherwise it would be seen as the end of the modeline).
Another example: Another example: >
// vim:set textwidth=72 dir=c\:\tmp: use c:\tmp here ~ // vim:set textwidth=72 dir=c\:\tmp: use c:\tmp here
There is an extra backslash before the first colon, so that it's included in There is an extra backslash before the first colon, so that it's included in
the ":set" command. The text after the second colon is ignored, thus a remark the ":set" command. The text after the second colon is ignored, thus a remark

View File

@ -490,7 +490,6 @@ local function visit_node(root, level, lang_tree, headings, opt, stats)
or nil or nil
-- Parent kind (string). -- Parent kind (string).
local parent = root:parent() and root:parent():type() or nil local parent = root:parent() and root:parent():type() or nil
local text = ''
-- Gets leading whitespace of `node`. -- Gets leading whitespace of `node`.
local function ws(node) local function ws(node)
node = node or root node = node or root
@ -508,6 +507,7 @@ local function visit_node(root, level, lang_tree, headings, opt, stats)
return string.format('%s%s', ws_, vim.treesitter.get_node_text(node, opt.buf)) return string.format('%s%s', ws_, vim.treesitter.get_node_text(node, opt.buf))
end end
local text = ''
local trimmed ---@type string local trimmed ---@type string
if root:named_child_count() == 0 or node_name == 'ERROR' then if root:named_child_count() == 0 or node_name == 'ERROR' then
text = node_text() text = node_text()
@ -537,12 +537,17 @@ local function visit_node(root, level, lang_tree, headings, opt, stats)
if is_noise(text, stats.noise_lines) then if is_noise(text, stats.noise_lines) then
return '' -- Discard common "noise" lines. return '' -- Discard common "noise" lines.
end end
-- Remove "===" and tags from ToC text. -- Remove tags from ToC text.
local hname = (node_text():gsub('%-%-%-%-+', ''):gsub('%=%=%=%=+', ''):gsub('%*.*%*', '')) local heading_node = first(root, 'heading')
local hname = trim(node_text(heading_node):gsub('%*.*%*', ''))
if not heading_node or hname == '' then
return '' -- Spurious "===" or "---" in the help doc.
end
-- Use the first *tag* node as the heading anchor, if any. -- Use the first *tag* node as the heading anchor, if any.
local tagnode = first(root, 'tag') local tagnode = first(heading_node, 'tag')
-- Use the *tag* as the heading anchor id, if possible. -- Use the *tag* as the heading anchor id, if possible.
local tagname = tagnode and url_encode(node_text(tagnode:child(1), false)) local tagname = tagnode and url_encode(trim(node_text(tagnode:child(1), false)))
or to_heading_tag(hname) or to_heading_tag(hname)
if node_name == 'h1' or #headings == 0 then if node_name == 'h1' or #headings == 0 then
---@type nvim.gen_help_html.heading ---@type nvim.gen_help_html.heading
@ -555,7 +560,9 @@ local function visit_node(root, level, lang_tree, headings, opt, stats)
) )
end end
local el = node_name == 'h1' and 'h2' or 'h3' local el = node_name == 'h1' and 'h2' or 'h3'
return ('<%s id="%s" class="help-heading">%s</%s>\n'):format(el, tagname, text, el) return ('<%s id="%s" class="help-heading">%s</%s>\n'):format(el, tagname, trimmed, el)
elseif node_name == 'heading' then
return trimmed
elseif node_name == 'column_heading' or node_name == 'column_name' then elseif node_name == 'column_heading' or node_name == 'column_name' then
if root:has_error() then if root:has_error() then
return text return text
@ -695,7 +702,7 @@ local function visit_node(root, level, lang_tree, headings, opt, stats)
return string.format('%s</span>', s) return string.format('%s</span>', s)
end end
return s return s
elseif node_name == 'modeline' then elseif node_name == 'delimiter' or node_name == 'modeline' then
return '' return ''
elseif node_name == 'ERROR' then elseif node_name == 'ERROR' then
if ignore_parse_error(opt.fname, trimmed) then if ignore_parse_error(opt.fname, trimmed) then