-
Couldn't load subscription status.
- Fork 216
Description
What version of myst-parser are you using?
4.0.1
What version dependencies are you using?
sphinx 8.2.3
docutils 0.21.2
What operating system are you using?
Linux
Describe the Bug
An explicit, relative link (e.g. [Section title](document.md#section-title)) will produce an error if document.md is a symlink outside the documentation directory.
If document.md is a symlink to, for example, ../README.md, you will get:
/path/to/project/docs/referrer.md:266: WARNING: Unknown source document '/path/to/project/README' [myst.xref_missing]
and the link will fail to render.
This exhibits here:
MyST-Parser/myst_parser/sphinx_ext/myst_refs.py
Lines 129 to 145 in 8a44f5d
| def resolve_myst_ref_doc(self, node: pending_xref): | |
| """Resolve a reference, from a markdown link, to another document, | |
| optionally with a target id within that document. | |
| """ | |
| from_docname = node.get("refdoc", self.env.docname) | |
| ref_docname: str = node["reftarget"] | |
| ref_id: str | None = node["reftargetid"] | |
| if ref_docname not in self.env.all_docs: | |
| self.log_warning( | |
| ref_docname, | |
| f"Unknown source document {ref_docname!r}", | |
| MystWarnings.XREF_MISSING, | |
| location=node, | |
| ) | |
| node.replace_self(node[0].deepcopy()) | |
| return |
I believe the source of the node with the bad reftarget is here:
MyST-Parser/myst_parser/mdit_to_docutils/sphinx_.py
Lines 88 to 105 in 8a44f5d
| _, abs_path = self.sphinx_env.relfn2path(path_dest, self.sphinx_env.docname) | |
| docname = self.sphinx_env.path2doc(abs_path) | |
| if not docname: | |
| self.create_warning( | |
| f"Could not find document: {abs_path}", | |
| MystWarnings.XREF_MISSING, | |
| line=token_line(token, 0), | |
| append_to=self.current_node, | |
| ) | |
| return self.render_link_url(token) | |
| wrap_node = addnodes.pending_xref( | |
| refdomain="doc", | |
| reftarget=docname, | |
| reftargetid=path_id, | |
| refdoc=self.sphinx_env.docname, | |
| reftype="myst", | |
| refexplicit=explicit, | |
| ) |
And I believe this happens because sphinx_env.relfn2path uses Path.resolve() instead of normalizing a path:
I don't know if this issue properly belongs in sphinx, but it only seems to cause problems for a particular style of Markdown link.
Expected Behavior
[Section title](document.md#section-title) should become <a href="document.html#section-title">Section title</a>.
To Reproduce
Using uv:
mkdir docs
cat <<EOF > README.md
# Header
## Section
Text
EOF
uv init --bare --name=reproduction --no-workspace
uv add sphinx myst-parser
uv run sphinx-quickstart --project="Reproduction" --author="Author Name" \
--no-sep -r '' -l en --extensions myst_parser \
docs/
ln -s ../README.md docs/description.md
cat <<EOF >> docs/conf.py
myst_heading_anchors = 2
EOF
cat <<EOF > docs/document.md
# Document Title
Explicitly linking to [Section](description.md#section).
EOF
cat <<EOF >> docs/index.rst
description.md
document.md
EOF
uv run sphinx-build -b html docs docs/_build/html