DocumenterInterLinks.jl
DocumenterInterLinks.jl is a plugin for Documenter.jl to link to external projects. It is interoperable with Intersphinx for Python projects.
Installation
As usual, the package can be installed via
] add DocumenterInterLinksin the Julia REPL, or by adding
DocumenterInterLinks = "d12716ef-a0f6-4df4-a9f1-a5a34e75c656"to the relevant Project.toml file (e.g., docs/Project.toml).
Usage
- In your
docs/make.jlfile, load theDocumenterInterLinkspackage (using DocumenterInterLinks). - Declare external projects by instantiating an
InterLinksobject and passing it as part ofpluginstoDocumenter.makedocs. - Reference items from any external project with an
@extreflink in your documentation.
Declaring External Projects
In docs/make.jl, instantiate an InterLinks object to define external projects you want to link to. For example,
using DocumenterInterLinks
links = InterLinks(
"sphinx" => "https://www.sphinx-doc.org/en/master/",
"matplotlib" => "https://matplotlib.org/3.7.3/objects.inv",
"Julia" => (
"https://docs.julialang.org/en/v1/",
joinpath(@__DIR__, "inventories", "Julia.toml")
),
"Documenter" => (
"https://documenter.juliadocs.org/stable/",
"https://documenter.juliadocs.org/stable/objects.inv",
joinpath(@__DIR__, "inventories", "Documenter.toml")
),
);defines the external projects "sphinx", "matplotlib", "Julia" and "Documenter". For each project, it specifies the root URL of that project's online documentation and the location of an inventory file.
The above examples illustrates three possibilities for specifying the root URL and inventory location:
- Map that project name to project root URL. This will look for an inventory file
objects.invdirectly underneath the given URL. In the"sphinx"entry of the example, the inventory file would be loaded fromhttps://www.sphinx-doc.org/en/master/objects.inv. This is the recommended form in most cases. - Map the project name to the URL of an inventory file. The project root URL is the given URL without the filename. In the
"matplotlib"entry of the example, the project root URL would behttps://matplotlib.org/3.7.3/. This form would only be used if the name of the inventory file is not the standardobjects.inv. - Map the project name to a tuple containing the root URL first, and then one or more possible locations for an inventory file. These may be local file paths, which allows using a self-maintained inventory file for a project that does not provide one.
- In the
"Julia"entry of the example, the inventory would be loaded only from the local filedocs/src/inventories/Julia.toml. As of Julia 1.11, the online documentation provides an inventory file, so using a local inventory for Julia is no longer necessary. - In the
"Documenter"entry of the example, the inventory would first be loaded from the standard online location. Only if this fails (e.g., because the network connection fails), a "backup inventory" is loaded fromdocs/src/inventories/Documenter.toml.
- In the
See the doc-string of InterLinks for details.
The instantiated links object must be passed to Documenter.makedocs as an element to the plugins keyword argument.
Inventories
The inventory files referenced when instantiating InterLinks are assumed to have been created by a documentation generator, see Inventory Generation. The DocInventories package is used as a backend to parse these files into DocInventories.Inventory objects. These are accessible by using links as a dict:
links["sphinx"]Inventory(
project="Sphinx",
version="8.3.0",
root_url="https://www.sphinx-doc.org/en/master/",
items=[
InventoryItem(":js:function:`\$.getJSON`" => "usage/domains/javascript.html#getJSON"),
InventoryItem(":c:member:`@alias.data`" => "usage/domains/c.html#c.\$", dispname="[anonymous].data"),
InventoryItem(":c:function:`@alias.f`" => "usage/domains/c.html#c.\$", dispname="[anonymous].f"),
InventoryItem(":c:functionParam:`@alias.f.k`" => "usage/domains/c.html#c.@alias.f", dispname="[anonymous].f.k"),
InventoryItem(":cpp:type:`CustomList`" => "tutorial/describing-code.html#_CPPv410\$"),
⋮ (1766 elements in total)
InventoryItem(":std:event:`write-started`" => "extdev/event_callbacks.html#event-\$", priority=1),
InventoryItem(":std:label:`writing-builders`" => "extdev/builderapi.html#\$", dispname="Builder API"),
InventoryItem(":std:confval:`xml_pretty`" => "usage/configuration.html#confval-\$", priority=1),
InventoryItem(":std:label:`xref`" => "usage/referencing.html#\$", dispname="Cross-references"),
InventoryItem(":std:label:`xref-modifiers`" => "usage/referencing.html#\$"),
InventoryItem(":std:label:`xref-syntax`" => "usage/referencing.html#\$", dispname="Syntax"),
]
)
As we can see, inventories contain a mapping of names to linkable locations relative to the root URL of a project's online documentation, see DocInventories.InventoryItem.
The DocInventories package provides tools for interactively searching inventories for items to reference. See Exploring Inventories and How do I figure out the correct name for the @extref link?.
Using External References
The DocumenterInterLinks plugin adds support for @extref link targets to Documenter. At the most fundamental level, they work just like Documenter's standard @ref link targets. Replacing @ref with @extref switches from a local reference to an external one:
* [`Documenter.makedocs`](@extref)
* [Documenter's `makedocs` function](@extref Documenter.makedocs)
* See the section about Documenter's [Writers](@extref).The above markdown code renders as follows:
Documenter.makedocs- Documenter's
makedocsfunction- See the section about Documenter's Writers.
To disambiguate (and speed up) the references, the name of the inventory (as defined when instantiating InterLinks) can be included in the @extref. In particular, the last example should have been written as
* See the section about Documenter's [Writers](@extref Documenter).to clarify that we are linking to the section name "Writers" found in links["Documenter"]. When the link text and link target differ, the inventory name should be given between @extref and the target name, e.g., [`Regex`](@extref Julia Base.Regex), which turns into "Regex".
Since DocumenterInterLinks is fully compatible with Sphinx inventories, it also provides an extended @extref syntax that builds on the Sphinx concept of "domains" and "roles". You will see these when inspecting an InventoryItem:
using DocInventories
DocInventories.show_full(links["Documenter"]["Documenter.makedocs"])InventoryItem(
name="Documenter.makedocs",
domain="jl",
role="function",
priority=1,
uri="lib/public/#Documenter.makedocs",
dispname="Documenter.makedocs"
)We can include the domain and role in an @extref link as
* [`makedocs`](@extref :function:`Documenter.makedocs`)
* [`makedocs`](@extref :jl:function:`Documenter.makedocs`)using a syntax that is reminiscent of the Sphinx cross-referencing syntax. The use of domains and roles in DocumenterInterLinks (unlike in Sphinx) is for disambiguation only, in case there are multiple items with the same name. In general, follow the Recommended Syntax guidelines.
Public API and Changelog
The DocumenterInterLinks project follows Semantic Versioning. See the CHANGELOG for changes after v1.0. The "public API" extends to the documented @extref Syntax and to the instantiation of the InterLinks plugin. Other Internals or features marked as "experimental" may change in minor versions.