summaryrefslogtreecommitdiffstats
path: root/sphinx/transforms/references.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/transforms/references.py')
-rw-r--r--sphinx/transforms/references.py47
1 files changed, 47 insertions, 0 deletions
diff --git a/sphinx/transforms/references.py b/sphinx/transforms/references.py
new file mode 100644
index 0000000..5de3a95
--- /dev/null
+++ b/sphinx/transforms/references.py
@@ -0,0 +1,47 @@
+"""Docutils transforms used by Sphinx."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+from docutils.transforms.references import DanglingReferences
+
+from sphinx.transforms import SphinxTransform
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+
+class SphinxDanglingReferences(DanglingReferences):
+ """DanglingReferences transform which does not output info messages."""
+
+ def apply(self, **kwargs: Any) -> None:
+ try:
+ reporter = self.document.reporter
+ report_level = reporter.report_level
+
+ # suppress INFO level messages for a while
+ reporter.report_level = max(reporter.WARNING_LEVEL, reporter.report_level)
+ super().apply()
+ finally:
+ reporter.report_level = report_level
+
+
+class SphinxDomains(SphinxTransform):
+ """Collect objects to Sphinx domains for cross references."""
+ default_priority = 850
+
+ def apply(self, **kwargs: Any) -> None:
+ for domain in self.env.domains.values():
+ domain.process_doc(self.env, self.env.docname, self.document)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_transform(SphinxDanglingReferences)
+ app.add_transform(SphinxDomains)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }