From b29032537c8eac3e2bfb4a2606cec3c4adcd25dc Mon Sep 17 00:00:00 2001 From: Aire-One Date: Sat, 10 Dec 2022 01:37:23 +0100 Subject: [PATCH] fix(scraper): extract_section_functions coupling 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. --- src/awesomewm.d.tl/scraper/module_doc.tl | 46 ++++++++++++++++-------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/src/awesomewm.d.tl/scraper/module_doc.tl b/src/awesomewm.d.tl/scraper/module_doc.tl index 33d14ca..57d188f 100644 --- a/src/awesomewm.d.tl/scraper/module_doc.tl +++ b/src/awesomewm.d.tl/scraper/module_doc.tl @@ -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), + 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), + } end ) end