fix(scraper): extract_section_functions coupling
ci/woodpecker/pr/build Pipeline was successful Details
ci/woodpecker/pr/docker-build Pipeline was successful Details
ci/woodpecker/pr/lint Pipeline was successful Details

Before this fix, the `extract_section_functions` function had issues
with how the elements were discovered. There are some scenarios where
selected nodes weren't from the same function definition. It causes the
generated teal to mix up the function's parameters.
This commit is contained in:
Aire-One 2022-12-10 01:37:23 +01:00
parent 8127e457d4
commit 4b4af7416c
1 changed files with 31 additions and 15 deletions

View File

@ -115,28 +115,44 @@ end
local function extract_section_functions(dl: string): { Function_Info.Function_Info }
local query_selectors = {
function_name = "dt a",
function_parameters = "dd table",
function_return_type = "dd ol",
header = "dt",
body = "dd",
parameters = "table",
return_types = "ol",
}
return scraper_utils.scrape_tuples(
dl,
{ query_selectors.function_name, query_selectors.function_parameters, query_selectors.function_return_type },
{ query_selectors.header, query_selectors.body },
function(nodes: { string : scan.HTMLNode | nil }): Function_Info.Function_Info
local function_info = Function_Info()
function_info.name =
extract_item_name(nodes[query_selectors.function_name])
function_info.parameters =
List(extract_function_parameters(nodes[query_selectors.function_parameters]))
function_info.return_types = List(
extract_function_return_types(
nodes[query_selectors.function_return_type]
if not nodes[query_selectors.header] or not nodes[query_selectors.body] then
log:warn(
logger.message_with_metadata(
"Missing header or body",
{ nodes = nodes }
)
)
error("Missing header or body")
end
local header = nodes[query_selectors.header] as scan.HTMLNode
local body = nodes[query_selectors.body] as scan.HTMLNode
local body_elements = scraper_utils.extract_nodes(
body:outer_html(),
{ query_selectors.parameters, query_selectors.return_types }
)
return function_info
return {
name = scraper_utils.scrape(
header:outer_html(),
"a",
extract_item_name
)[1],
parameters = #body_elements:get(query_selectors.parameters) ~= 0 and
List(extract_function_parameters(body_elements:get(query_selectors.parameters)[1])) or
(List() as List<Function_Info.Parameter>),
return_types = #body_elements:get(query_selectors.return_types) ~= 0 and
List(extract_function_return_types(body_elements:get(query_selectors.return_types)[1])) or
(List() as List<string>),
}
end
)
end