From bf14d3a401e4ffa245e3daf316d85100157d6c9f Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 22 May 2021 14:13:19 +0900 Subject: [PATCH] Concept: Close #9016: linkcheck builder failed to check the anchors of github.com --- sphinx/builders/linkcheck.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/sphinx/builders/linkcheck.py b/sphinx/builders/linkcheck.py index a46b80c081b..db389123228 100644 --- a/sphinx/builders/linkcheck.py +++ b/sphinx/builders/linkcheck.py @@ -627,6 +627,10 @@ def run(self, **kwargs: Any) -> None: if 'refuri' not in refnode: continue uri = refnode['refuri'] + newuri = self.app.emit_firstresult('linkcheck-process-uri', uri) + if newuri: + uri = newuri + lineno = get_node_line(refnode) uri_info = Hyperlink(uri, self.env.docname, lineno) if uri not in hyperlinks: @@ -636,12 +640,29 @@ def run(self, **kwargs: Any) -> None: for imgnode in self.document.traverse(nodes.image): uri = imgnode['candidates'].get('?') if uri and '://' in uri: + newuri = self.app.emit_firstresult('linkcheck-process-uri', uri) + if newuri: + uri = newuri + lineno = get_node_line(imgnode) uri_info = Hyperlink(uri, self.env.docname, lineno) if uri not in hyperlinks: hyperlinks[uri] = uri_info +def rewrite_github_anchor(app: Sphinx, uri: str) -> Optional[str]: + """Rewrite anchor name of the hyperlink to github.com + + The hyperlink anchors in github.com are dynamically generated. This rewrites + them before checking and makes them comparable. + """ + if re.search('://github.com/', uri) and '#' in uri: + baseuri, anchor = uri.split('#', 1) + return '#'.join([baseuri, 'user-content-' + anchor]) + else: + return None + + def setup(app: Sphinx) -> Dict[str, Any]: app.add_builder(CheckExternalLinksBuilder) app.add_post_transform(HyperlinkCollector) @@ -658,6 +679,9 @@ def setup(app: Sphinx) -> Dict[str, Any]: app.add_config_value('linkcheck_anchors_ignore', ["^!"], None) app.add_config_value('linkcheck_rate_limit_timeout', 300.0, None) + app.add_event('linkcheck-process-uri') + app.connect('linkcheck-process-uri', rewrite_github_anchor) + return { 'version': 'builtin', 'parallel_read_safe': True,