From ab668396fc449ecba7788338ea4357fc99dde158 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sun, 12 May 2019 14:52:03 +0900 Subject: [PATCH] Fix #6351: "Hyperlink target is not referenced" message is shown even if referenced --- CHANGES | 2 ++ sphinx/io.py | 11 ++++++++++- sphinx/transforms/references.py | 19 ++++++++++++++++++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index c337b2087..aa94dd076 100644 --- a/CHANGES +++ b/CHANGES @@ -96,6 +96,8 @@ Bugs fixed * commented term in glossary directive is wrongly recognized * #6299: rst domain: rst:directive directive generates waste space * #6331: man: invalid output when doctest follows rubric +* #6351: "Hyperlink target is not referenced" message is shown even if + referenced Testing -------- diff --git a/sphinx/io.py b/sphinx/io.py index b5b57d065..5f4ec3351 100644 --- a/sphinx/io.py +++ b/sphinx/io.py @@ -16,6 +16,7 @@ from docutils.io import FileInput, NullOutput from docutils.parsers.rst import Parser as RSTParser from docutils.readers import standalone from docutils.statemachine import StringList, string2lines +from docutils.transforms.references import DanglingReferences from docutils.writers import UnfilteredWriter from sphinx.deprecation import RemovedInSphinx30Warning @@ -64,7 +65,15 @@ class SphinxBaseReader(standalone.Reader): def get_transforms(self): # type: () -> List[Type[Transform]] - return super().get_transforms() + self.transforms + transforms = super().get_transforms() + self.transforms + + # remove transforms which is not needed for Sphinx + unused = [DanglingReferences] + for transform in unused: + if transform in transforms: + transforms.remove(transform) + + return transforms def new_document(self): # type: () -> nodes.document diff --git a/sphinx/transforms/references.py b/sphinx/transforms/references.py index de512f437..9cdc28c78 100644 --- a/sphinx/transforms/references.py +++ b/sphinx/transforms/references.py @@ -9,7 +9,7 @@ """ from docutils import nodes -from docutils.transforms.references import Substitutions +from docutils.transforms.references import DanglingReferences, Substitutions from sphinx.transforms import SphinxTransform @@ -31,6 +31,22 @@ class SubstitutionDefinitionsRemover(SphinxTransform): node.parent.remove(node) +class SphinxDanglingReferences(DanglingReferences): + """DanglingReferences transform which does not output info messages.""" + + def apply(self, **kwargs): + # type: (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 @@ -44,6 +60,7 @@ class SphinxDomains(SphinxTransform): def setup(app): # type: (Sphinx) -> Dict[str, Any] app.add_transform(SubstitutionDefinitionsRemover) + app.add_transform(SphinxDanglingReferences) app.add_transform(SphinxDomains) return {