From: <mi...@us...> - 2025-06-16 12:36:13
|
Revision: 10170 http://sourceforge.net/p/docutils/code/10170 Author: milde Date: 2025-06-16 12:36:11 +0000 (Mon, 16 Jun 2025) Log Message: ----------- Update/fix handling of duplicate identifiers. Update the code in `nodes.document.set_duplicate_name_id()` to * simplify the logic, * don't insert INFO level `<system_message> at places where it is invalid, * don't insert backlinks from a system message to an invisible target element (an external `<target>` is not visible in HMTL and LaTeX output). Highlight targeted system-message in "responsive.css" style sheet. Modified Paths: -------------- trunk/docutils/HISTORY.rst trunk/docutils/docutils/nodes.py trunk/docutils/docutils/writers/html5_polyglot/responsive.css trunk/docutils/test/test_parsers/test_rst/test_inline_markup.py trunk/docutils/test/test_parsers/test_rst/test_targets.py trunk/docutils/test/test_transforms/test_hyperlinks.py Modified: trunk/docutils/HISTORY.rst =================================================================== --- trunk/docutils/HISTORY.rst 2025-06-16 10:05:35 UTC (rev 10169) +++ trunk/docutils/HISTORY.rst 2025-06-16 12:36:11 UTC (rev 10170) @@ -17,6 +17,11 @@ Release 0.22rc4 (unpublished) ============================= +* docutils/nodes.py + + Don't include a "backlink" reference in system messages, if the + referenced element is an external target (not visible in the output). + * docutils/parsers/rst/directives/references.py Remove "name" from `TargetNotes.option_spec`. Modified: trunk/docutils/docutils/nodes.py =================================================================== --- trunk/docutils/docutils/nodes.py 2025-06-16 10:05:35 UTC (rev 10169) +++ trunk/docutils/docutils/nodes.py 2025-06-16 12:36:11 UTC (rev 10170) @@ -1922,52 +1922,56 @@ msgnode: Element, explicit: bool, ) -> None: - old_id = self.nameids[name] + old_id = self.nameids[name] # None if name is only dupname old_explicit = self.nametypes[name] old_node = self.ids.get(old_id) + level = 0 # system message level: 1-info, 2-warning + self.nametypes[name] = old_explicit or explicit + if explicit: if old_explicit: level = 2 + s = f'Duplicate explicit target name: "{name}".' + dupname(node, name) if old_id is not None: - if 'refuri' in node: - refuri = node['refuri'] - if (old_node['names'] - and 'refuri' in old_node - and old_node['refuri'] == refuri): - level = 1 # just inform if refuri is identical - if level > 1: + if ('refuri' in node and 'refuri' in old_node + and node['refuri'] == old_node['refuri']): + level = 1 # keep old target, just inform + else: dupname(old_node, name) self.nameids[name] = None - msg = self.reporter.system_message( - level, 'Duplicate explicit target name: "%s".' % name, - backrefs=[id], base_node=node) - if msgnode is not None: - # append <system_message> if valid at this place - msgnode += msg - try: - msgnode.validate(recursive=False) - except ValidationError: - msgnode.pop() - msg.parent = None - dupname(node, name) - else: # new explicit, old implicit -> silently overwrite + else: # new explicit, old implicit -> override self.nameids[name] = id if old_id is not None: + level = 1 + s = f'Target name overrides implicit target name "{name}".' dupname(old_node, name) else: # new name is implicit + level = 1 + s = f'Duplicate implicit target name: "{name}".' + dupname(node, name) if old_id is not None and not old_explicit: + dupname(old_node, name) self.nameids[name] = None - dupname(old_node, name) - dupname(node, name) - if not explicit or (not old_explicit and old_id is not None): - if explicit: - s = f'Target name overrides implicit target name "{name}".' - else: - s = f'Duplicate implicit target name: "{name}".' - msg = self.reporter.info(s, backrefs=[id], base_node=node) + + if level: + backrefs = [id] + # don't add backref id for empty targets (not shown in output) + if isinstance(node, target) and 'refuri' in node: + backrefs = [] + msg = self.reporter.system_message(level, s, + backrefs=backrefs, + base_node=node) + # try appending near to the problem: if msgnode is not None: msgnode += msg + try: + msgnode.validate(recursive=False) + except ValidationError: + # detach -> will be handled by `Messages` transform + msgnode.pop() + msg.parent = None def has_name(self, name: str) -> bool: return name in self.nameids Modified: trunk/docutils/docutils/writers/html5_polyglot/responsive.css =================================================================== --- trunk/docutils/docutils/writers/html5_polyglot/responsive.css 2025-06-16 10:05:35 UTC (rev 10169) +++ trunk/docutils/docutils/writers/html5_polyglot/responsive.css 2025-06-16 12:36:11 UTC (rev 10170) @@ -293,6 +293,7 @@ dt:target, span:target, p:target, .contents :target, .contents:target > .topic-title, +aside.system-message:target, [role="doc-biblioentry"]:target, [role="doc-biblioref"]:target, [role="note"]:target, /* Docutils 0.18 and 0.19 */ Modified: trunk/docutils/test/test_parsers/test_rst/test_inline_markup.py =================================================================== --- trunk/docutils/test/test_parsers/test_rst/test_inline_markup.py 2025-06-16 10:05:35 UTC (rev 10169) +++ trunk/docutils/test/test_parsers/test_rst/test_inline_markup.py 2025-06-16 12:36:11 UTC (rev 10170) @@ -1169,7 +1169,7 @@ <target ids="anonymous-html" names="anonymous.html"> anonymous.html . - <system_message backrefs="named-txt-1" level="2" line="4" source="test data" type="WARNING"> + <system_message level="2" line="4" source="test data" type="WARNING"> <paragraph> Duplicate explicit target name: "named.txt". <paragraph> Modified: trunk/docutils/test/test_parsers/test_rst/test_targets.py =================================================================== --- trunk/docutils/test/test_parsers/test_rst/test_targets.py 2025-06-16 10:05:35 UTC (rev 10169) +++ trunk/docutils/test/test_parsers/test_rst/test_targets.py 2025-06-16 12:36:11 UTC (rev 10170) @@ -199,7 +199,7 @@ <paragraph> Duplicate external targets (different URIs): <target dupnames="target" ids="target" refuri="first"> - <system_message backrefs="target-1" level="2" line="5" source="test data" type="WARNING"> + <system_message level="2" line="5" source="test data" type="WARNING"> <paragraph> Duplicate explicit target name: "target". <target dupnames="target" ids="target-1" refuri="second"> @@ -216,7 +216,7 @@ <paragraph> Duplicate external targets (same URIs): <target ids="target" names="target" refuri="first"> - <system_message backrefs="target-1" level="1" line="5" source="test data" type="INFO"> + <system_message level="1" line="5" source="test data" type="INFO"> <paragraph> Duplicate explicit target name: "target". <target dupnames="target" ids="target-1" refuri="first"> @@ -416,7 +416,7 @@ <target dupnames="target" ids="target-3"> <paragraph> Explicit internal target. - <system_message backrefs="target-4" level="2" line="16" source="test data" type="WARNING"> + <system_message level="2" line="16" source="test data" type="WARNING"> <paragraph> Duplicate explicit target name: "target". <target dupnames="target" ids="target-4" refuri="Explicit_external_target"> Modified: trunk/docutils/test/test_transforms/test_hyperlinks.py =================================================================== --- trunk/docutils/test/test_transforms/test_hyperlinks.py 2025-06-16 10:05:35 UTC (rev 10169) +++ trunk/docutils/test/test_transforms/test_hyperlinks.py 2025-06-16 12:36:11 UTC (rev 10170) @@ -764,7 +764,7 @@ target_ 's (different URIs): <target dupnames="target" ids="target" refuri="first"> - <system_message backrefs="target-1" level="2" line="5" source="test data" type="WARNING"> + <system_message level="2" line="5" source="test data" type="WARNING"> <paragraph> Duplicate explicit target name: "target". <target dupnames="target" ids="target-1" refuri="second"> @@ -784,7 +784,7 @@ <paragraph> Duplicate external targets (different URIs) without reference: <target dupnames="target" ids="target" refuri="first"> - <system_message backrefs="target-1" level="2" line="5" source="test data" type="WARNING"> + <system_message level="2" line="5" source="test data" type="WARNING"> <paragraph> Duplicate explicit target name: "target". <target dupnames="target" ids="target-1" refuri="second"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |