summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES1
-rw-r--r--sphinx/domains/std.py24
-rw-r--r--tests/test_domain_std.py13
3 files changed, 37 insertions, 1 deletions
diff --git a/CHANGES b/CHANGES
index 0e65f89b4..0ae22b611 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 could not match case-insensitively
* #7461: autodoc: empty tuple in type annotation is not shown correctly
* C++, fix spacing issue in east-const declarations.
* #7414: LaTeX: Xindy language options were incorrect
diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py
index 52546fb4c..74e901779 100644
--- a/sphinx/domains/std.py
+++ b/sphinx/domains/std.py
@@ -789,6 +789,8 @@ class StandardDomain(Domain):
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 @@ class StandardDomain(Domain):
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 0032c18ef..33a000a3f 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