tokenizers
99 строк · 2.5 Кб
1from docutils import nodes
2
3import sphinx
4from sphinx.locale import _
5
6from conf import rust_version
7
8logger = sphinx.util.logging.getLogger(__name__)
9
10
11class RustRef:
12def __call__(self, name, rawtext, text, lineno, inliner, options={}, content=[]):
13doctype = name.split("_")[1]
14parts = text.split("::")
15
16if text.startswith("~"):
17title = parts[-1]
18parts[0] = parts[0][1:]
19else:
20content = text
21link = self.base_link()
22
23if doctype == "struct":
24l, title = self.make_struct_link(parts, title)
25if doctype == "func":
26l, title = self.make_func_link(parts, title)
27if doctype == "meth":
28l, title = self.make_meth_link(parts, title)
29if doctype == "trait":
30l, title = self.make_trait_link(parts, title)
31link += l
32
33node = nodes.reference(internal=False, refuri=link, text=title)
34wrapper = nodes.literal(classes=["xref"])
35wrapper += node
36
37return [wrapper], []
38
39def base_link(self):
40return f"https://docs.rs/tokenizers/{rust_version}"
41
42def make_struct_link(self, parts, title):
43link = ""
44struct_name = parts[-1]
45path = parts[:-1]
46
47for p in path:
48link += f"/{p}"
49link += f"/struct.{struct_name}.html"
50
51return link, title
52
53def make_func_link(self, parts, title):
54link = ""
55fn_name = parts[-1]
56
57path = parts[:-1]
58for p in path:
59link += f"/{p}"
60link += f"/fn.{fn_name}.html"
61
62return link, title
63
64def make_meth_link(self, parts, title):
65meth_name = parts[-1]
66if meth_name.endswith("()"):
67meth_name = meth_name[:-2]
68
69link, title = self.make_struct_link(parts[:-1], title)
70link += f"#method.{meth_name}"
71
72if not title.endswith(")"):
73title += "()"
74
75return link, title
76
77def make_trait_link(self, parts, title):
78link = ""
79trait_name = parts[-1]
80
81path = parts[:-1]
82for p in path:
83link += f"/{p}"
84link += f"/trait.{trait_name}.html"
85
86return link, title
87
88
89def setup(app):
90app.add_role("rust_struct", RustRef())
91app.add_role("rust_func", RustRef())
92app.add_role("rust_meth", RustRef())
93app.add_role("rust_trait", RustRef())
94
95return {
96"version": "0.1",
97"parallel_read_safe": True,
98"parallel_write_safe": True,
99}
100