""" A directive for organization/areas.rst to render the area tables. """ from docutils import nodes from docutils.parsers.rst import Directive import re area_table_rows = ("Communication", "GitHub reviews", "GitHub labels", "Triage project", "Maintainers") channel_re = re.compile(r'#([\w-]+)') godot_team_re = re.compile(r'@godotengine/([\w-]+)') labels_re = re.compile(r'(.+?)') triage_re = re.compile(r'(.*?)') lead_re = re.compile(r'(.*?)') def transform_channels(match: re.Match): old_value = match.group(1) transformed = f'#{old_value}' return transformed def transform_github_teams(match: re.Match): old_value = match.group(1) transformed = f'@godotengine/{old_value}' return transformed def transform_github_labels(match: re.Match): old_value = match.group(1) transformed = f'{old_value} (issues, PRs)' return transformed def transform_github_triage(match: re.Match): number = match.group(1) name = match.group(2) transformed = f'{name}' return transformed def transform_lead(match: re.Match): name = match.group(1) transformed = f'{name}' return transformed class TableDirective(Directive): has_content = False required_arguments = 0 optional_arguments = 0 final_argument_whitespace = False option_spec = {column.lower().replace(" ", "_"): str for column in area_table_rows} def run(self): # Create a table node with the parsed header and data table = nodes.container() table.setdefault('classes', []).append("gdarea-table") # Create and add the table body for column_title in area_table_rows: row_text = self.options.get(column_title.lower().replace(" ", "_"), '') if not row_text: continue row = nodes.container() entry = nodes.container() entry.setdefault('classes', []).append("gdarea-table-header") entry += nodes.paragraph(text=column_title) row += entry row_text = channel_re.sub(transform_channels, row_text) row_text = godot_team_re.sub(transform_github_teams, row_text) row_text = labels_re.sub(transform_github_labels, row_text) row_text = triage_re.sub(transform_github_triage, row_text) row_text = lead_re.sub(transform_lead, row_text) entry = nodes.container() paragraph = nodes.paragraph() paragraph += nodes.raw('', row_text, format='html') entry += paragraph row += entry table += row return [table] def setup(app): app.add_directive('gdareatable', TableDirective)