|
2 | 2 | from sphinx.util.docutils import SphinxDirective |
3 | 3 | from sphinx.util.nodes import nested_parse_with_titles |
4 | 4 | from docutils.statemachine import ViewList |
| 5 | +import yaml |
| 6 | +import re |
5 | 7 | from generate_parameter_library_py.parse_yaml import ( |
6 | 8 | GenerateCode, |
7 | 9 | ) |
8 | 10 | from generate_parameter_library_py.generate_markdown import ( |
9 | 11 | DefaultConfigMarkdown, |
10 | | - ParameterDetailMarkdown |
| 12 | + ParameterDetailMarkdown, |
| 13 | + RuntimeParameterDetailMarkdown |
11 | 14 | ) |
12 | 15 |
|
| 16 | +def insert_additional_parameters_after(items, keys, insert_map): |
| 17 | + for key in insert_map.keys(): |
| 18 | + # Define the level you're looking for |
| 19 | + level_to_find = key.split('.')[0] |
| 20 | + |
| 21 | + # Reverse keys and find the index of the first occurrence of the level |
| 22 | + reversed_keys = list(reversed(keys)) |
| 23 | + reversed_index = next((index for (index, item) in enumerate(reversed_keys) if item.split('.')[0] == level_to_find), None) |
| 24 | + |
| 25 | + if reversed_index is not None: |
| 26 | + # If the level is found, insert the runtime_param_item after it in the original list |
| 27 | + index = len(keys) - 1 - reversed_index |
| 28 | + items = items[:index+1] + [insert_map[key]] + items[index+1:] |
| 29 | + keys = keys[:index+1] + [key] + keys[index+1:] |
| 30 | + else: |
| 31 | + # If the level is not found, append the runtime_param_item to the end of the list |
| 32 | + items.append(insert_map[key]) |
| 33 | + keys.append(key) |
| 34 | + return items, keys |
| 35 | + |
| 36 | +def insert_additional_parameters_before(items, keys, insert_map): |
| 37 | + for key in insert_map.keys(): |
| 38 | + # Define the level you're looking for |
| 39 | + level_to_find = key.split('.')[0] |
| 40 | + |
| 41 | + # Find the index of the first occurrence of the level in items |
| 42 | + index = next((index for (index, item) in enumerate(keys) if item.split('.')[0] == level_to_find), None) |
| 43 | + |
| 44 | + if index is not None: |
| 45 | + # If the level is found, insert the runtime_param_item after it |
| 46 | + items = items[:index] + [insert_map[key]] + items[index:] |
| 47 | + keys = keys[:index] + [key] + keys[index:] |
| 48 | + else: |
| 49 | + # If the level is not found, append the runtime_param_item to the end of the list |
| 50 | + items.append(insert_map[key]) |
| 51 | + keys.append(key) |
| 52 | + return items, keys |
| 53 | + |
13 | 54 | class GeneraterParameterLibraryDetails(SphinxDirective): |
14 | 55 | required_arguments = 1 |
15 | | - optional_arguments = 0 |
| 56 | + optional_arguments = 1 # context yaml file, "key: string" |
16 | 57 |
|
17 | 58 | def run(self): |
18 | 59 | # get the absolute path from sphinx tree |
19 | 60 | yaml_file = self.env.relfn2path(self.arguments[0], self.env.docname)[0] |
| 61 | + if len(self.arguments) > 1: |
| 62 | + context_yaml_file = self.env.relfn2path(self.arguments[1], self.env.docname)[0] |
| 63 | + with open(context_yaml_file, 'r') as file: |
| 64 | + context_yaml_data = yaml.safe_load(file) |
| 65 | + else: |
| 66 | + context_yaml_data = {} |
20 | 67 |
|
21 | 68 | gen_param_struct = GenerateCode("rst") |
22 | 69 | gen_param_struct.parse(yaml_file, "") |
23 | 70 |
|
| 71 | + # general parameters |
24 | 72 | param_details = [ |
25 | 73 | ParameterDetailMarkdown(param) |
26 | 74 | for param in gen_param_struct.declare_parameters |
27 | 75 | ] |
28 | | - docs = "\n".join(str(val) for val in param_details) |
| 76 | + # runtime parameters, i.e., such with a __map_ key |
| 77 | + runtime_param_details = [ |
| 78 | + RuntimeParameterDetailMarkdown(param) |
| 79 | + for param in gen_param_struct.declare_dynamic_parameters |
| 80 | + ] |
| 81 | + |
| 82 | + param_strings_keys = [detail.declare_parameters.parameter_name for detail in param_details] |
| 83 | + param_items = [str(detail) for detail in param_details] |
| 84 | + runtime_param_strings_map = {detail.declare_parameters.parameter_name: str(detail) for detail in runtime_param_details} |
| 85 | + # add optional context data from yaml. we don't use a jinja template here -> add the indent manually |
| 86 | + context_strings_map = {key: str(key) + "\n" + |
| 87 | + '\n'.join(' ' + line for line in str(value).replace('\\t', ' ').splitlines()) + "\n" |
| 88 | + for key, value in context_yaml_data.items()} |
| 89 | + |
| 90 | + param_items, param_strings_keys = insert_additional_parameters_after(param_items, param_strings_keys, runtime_param_strings_map) |
| 91 | + param_items, param_strings_keys = insert_additional_parameters_before(param_items, param_strings_keys, context_strings_map) |
| 92 | + |
| 93 | + docs = "\n".join(param_items) |
| 94 | + |
29 | 95 | # print(docs) |
30 | 96 |
|
31 | 97 | # Add the content one line at a time. |
|
0 commit comments