From fd95e0b753591f83d9d01cfd5356e72509677512 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 18 Apr 2020 18:23:27 +0900 Subject: [PATCH] Fix #7418: std domain: term role matches case-sensitively --- CHANGES | 1 + sphinx/domains/std.py | 24 ++++++++++++++++++++++++ tests/test_domain_std.py | 13 ++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 04646ca5a3..37e505bcdc 100644 --- a/CHANGES +++ b/CHANGES @@ -20,6 +20,7 @@ Bugs fixed ---------- * #7461: py domain: fails with IndexError for empty tuple in type annotation +* #7418: std domain: :rst:role:`term` role matches case-sensitively * #7461: autodoc: empty tuple in type annotation is not shown correctly * C++, fix spacing issue in east-const declarations. diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py index 52546fb4c7..74e9017790 100644 --- a/sphinx/domains/std.py +++ b/sphinx/domains/std.py @@ -789,6 +789,8 @@ def resolve_xref(self, env: "BuildEnvironment", fromdocname: str, builder: "Buil RemovedInSphinx40Warning) domain = env.get_domain('citation') return domain.resolve_xref(env, fromdocname, builder, typ, target, node, contnode) + elif typ == 'term': + resolver = self._resolve_term_xref else: resolver = self._resolve_obj_xref @@ -923,6 +925,28 @@ def _resolve_option_xref(self, env: "BuildEnvironment", fromdocname: str, return make_refnode(builder, fromdocname, docname, labelid, contnode) + def _resolve_term_xref(self, env: "BuildEnvironment", fromdocname: str, + builder: "Builder", typ: str, target: str, + node: pending_xref, contnode: Element) -> Element: + result = self._resolve_obj_xref(env, fromdocname, builder, typ, + target, node, contnode) + if result: + return result + else: + for objtype, term in self.objects: + if objtype == 'term' and term.lower() == target.lower(): + docname, labelid = self.objects[objtype, term] + logger.warning(__('term %s not found in case sensitive match.' + 'made a reference to %s instead.'), + target, term, location=node, type='ref', subtype='term') + break + else: + docname, labelid = '', '' + if not docname: + return None + return make_refnode(builder, fromdocname, docname, + labelid, contnode) + def _resolve_obj_xref(self, env: "BuildEnvironment", fromdocname: str, builder: "Builder", typ: str, target: str, node: pending_xref, contnode: Element) -> Element: diff --git a/tests/test_domain_std.py b/tests/test_domain_std.py index 0032c18ef3..33a000a3fb 100644 --- a/tests/test_domain_std.py +++ b/tests/test_domain_std.py @@ -141,12 +141,23 @@ def test_glossary(app): [nodes.definition, nodes.paragraph, "description"]) # index - objects = list(app.env.get_domain("std").get_objects()) + domain = app.env.get_domain("std") + objects = list(domain.get_objects()) assert ("term1", "term1", "term", "index", "term-term1", -1) in objects assert ("TERM2", "TERM2", "term", "index", "term-TERM2", -1) in objects assert ("term3", "term3", "term", "index", "term-term3", -1) in objects assert ("term4", "term4", "term", "index", "term-term4", -1) in objects + # term reference (case sensitive) + refnode = domain.resolve_xref(app.env, 'index', app.builder, 'term', 'term1', + pending_xref(), nodes.paragraph()) + assert_node(refnode, nodes.reference, refid="term-term1") + + # term reference (case insensitive) + refnode = domain.resolve_xref(app.env, 'index', app.builder, 'term', 'term2', + pending_xref(), nodes.paragraph()) + assert_node(refnode, nodes.reference, refid="term-TERM2") + def test_glossary_warning(app, status, warning): # empty line between terms