1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
from docutils import nodes
from pathlib import Path
from typing import TYPE_CHECKING
from sphinx.application import Sphinx
from sphinx.util.docutils import SphinxDirective
if TYPE_CHECKING:
from sphinx.util.typing import ExtensionMetadata
class FlashromAuthorsDirective(SphinxDirective):
required_arguments = 1
has_content = True
def make_table(self, list_file: Path):
body = nodes.tbody()
with list_file.open("r") as f:
for line in f:
count, _, name = line.strip().partition("\t")
body += nodes.row(
"",
nodes.entry("", nodes.paragraph(text=name)),
nodes.entry("", nodes.paragraph(text=count)),
)
return nodes.table(
"",
nodes.tgroup(
"",
nodes.colspec(colname="name"),
nodes.colspec(colname="count"),
nodes.thead(
"",
nodes.row(
"",
nodes.entry("", nodes.paragraph(text="Name")),
nodes.entry("", nodes.paragraph(text="Number of changes")),
),
),
body,
cols=2,
),
)
def make_placeholder(self, contents):
return nodes.admonition(
"",
nodes.title("", text="List not available"),
*contents,
)
def run(self) -> list[nodes.Node]:
config = self.config.flashrom_authors_list_files
source_name = self.arguments[0]
list_file = (config or {}).get(source_name)
if list_file is None:
if config is not None:
available_names = ','.join(config.keys())
raise self.error(
'Undefined authors list file: "{}" (available names: {})'.format(
source_name, available_names
)
)
container = nodes.Element()
self.state.nested_parse(self.content, 0, container)
return [self.make_placeholder(container.children)]
else:
return [self.make_table(Path(list_file))]
def setup(app: Sphinx) -> 'ExtensionMetadata':
app.add_config_value(
"flashrom_authors_list_files", default=None, rebuild="html", types=[dict]
)
app.add_directive("flashrom-authors", FlashromAuthorsDirective)
return {
"version": "1",
}
|