Sphinx: Link to HTML from MyST Markdown
TL;DR: If you try to create a link in Sphinx from MyST Markdown to an HTML file in the _static directory, Sphinx seems to only include the individual file you link to, and places it in the _downloads directory. If you want to include a group of HTML files, use {.external} as shown below.
If you are using Sphinx, and want to both:
- Write your documentation in MyST Markdown (
*.md)… - …and, include some pre-built HTML (
*.html) alongside the HTML generated from your Sphinx documentation.
Then read on!
The static directory §
To include some pre-built HTML with your Sphinx documentation, a good place to put it is in the _static directory. Ensure you have html_static_path defined in your conf.py as follows:
html_static_path = ['_static']Then you can place your pre-built HTML inside the source/_static directory. For example, here we have a directory named my_html_pages, which includes a bunch of pre-built HTML, complete with multiple pages and sub-directories:
.
└── my_package/
├── public
└── source/
├── _static/
│ └── my_html_pages/
│ ├── index.html
│ └── foo/
│ ├── page_1.html
│ └── page_2.html
├── a_section/
│ └── introduction.md
└── index.mdBuilding §
At build time, everything in the source/_static directory is copied to a public/_static directory, so then we end upp with:
.
└── my_package/
├── public/
│ ├── _static/
│ │ └── my_html_pages/
│ │ ├── index.html
│ │ └── foo/
│ │ ├── page_1.html
│ │ └── page_2.html
│ ├── index.html
│ └── a_section/
│ └── introduction.html
└── source/
├── _static/
│ └── my_html_pages/
│ ├── index.html
│ └── foo/
│ ├── page_1.html
│ └── page_2.html
├── a_section/
│ └── introduction.md
└── index.mdLinking from MyST Markdown to HTML (the problem) §
If we want to link from a_section/introduction.md to _static/my_html_pages/index.html, at first we might try this:
# Introduction
Click [here](../_static/my_html_pages/index.html) to open the HTML page.However, Sphinx treats this type of link as a download, which it handles by placing a copy of just the linked file in the _downloads directory, and uses that for the link target.
This type of linking is fine for individual files, e.g. a PDF for download, but does not work for linking to a collection of HTML files.
For example, in our case, it copies source/_static/my_html_pages/index.html to public/_downloads/6c3d04a91d0a2d2f7f774041e8670d2d/index.html, but does not copy source/_static/my_html_pages/foo/!
So how do we link to the entire collection of pre-built HTML files?
Linking from MyST Markdown to HTML (the solution) §
The solution is to append {.external} to the link1, which tell Sphinx MyST Markdown this is an external link:
# Introduction
Click [here](../_static/my_html_pages/index.html){.external} to open the HTML page.The link will then point to _static/my_html_pages/index.html, where all the pre-built HTML files are, rather than _downloads/<hash>/index.html. The relative links from _static/my_html_pages/index.html to foo/page_1.html and foo/page_2.html will then also work.