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 where discovered. There are some scenarios where
selected nodes weren't from the same function definition. It causes the
generated teal to mix up the functions parameters.
This commit is contained in:
Aire-One 2022-12-10 01:37:23 +01:00
parent 8127e457d4
commit b29032537c
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