Level 2 (or 3?): documenting the code using Sphinx
==================================================
(There is a lot to say. I'm writing down here what I had to learn through trial and error. Expect
to spend a few days understanding how all the pieces fit together. The result is worth it.)
`Sphinx `_ is an amazing tool to generate documentation
from `reStructuredText `_, Markdown or Jupyter notebook
files.
How to start using Sphinx
-------------------------
The best way is to start with an existing project. I have made a 
`sample Sphinx project `_ so that you can
play with Sphinx immediately.
For a more involved project, including ``level 2``-style packaging of the Python source code,
see my `configpile `_ library.
reStructuredText vs Markdown vs Jupyter notebooks
-------------------------------------------------
Advantages of reStructuredText:
* Amazing VS Code support including code completion, and markup checking using the 
  `esbonio `_ extension.
* More principled way of extending the markup language.
* Easier to use at first because of all the Sphinx examples out there.
Advantages of Markdown:
* Supports all Sphinx syntax using Markdown extensions, through the 
  `MyST-NB `_ parser.
* Slightly easier to read and write
* Can be cut'n'pasted
* Can be previewed directly in GitHub
Advantages of Jupyter Notebooks:
* Include code examples and results
* Stand on their own
**Convert between markup formats using `Pandoc `_!**
Sphinx extensions I use
-----------------------
The clearer theme (I find):
* ``sphinx_book_theme``
To put the magic file for GitHub pages:
* ``sphinx.ext.githubpages``
To include Markdown files, or simply Jupyter notebooks:
* ``myst_nb``
To automatically document API of the code:
* ``sphinx.ext.autodoc`` (automatically document modules/classes)
* ``sphinx.ext.autosummary`` (automatically recurse through Python files)
* ``sphinx.ext.napoleon`` (Google style shorter docstrings)
* ``sphinx_autodoc_typehints`` (recover types from annotations)
To provide hyperlinks to the API of other Python packages:
* ``sphinx.ext.intersphinx``
To include LaTeX math:
* ``sphinx.ext.mathjax``
To install reStructuredText support in VS Code
----------------------------------------------
Install the esbonio server:
.. code-block::
    
    poetry add --dev esbonio
Then add to your ``.vscode/settings.json`` file:
.. code-block:: json
    "esbonio.server.enabled": true,
    "esbonio.sphinx.confDir": "${workspaceFolder}/docs/source",
    "esbonio.sphinx.srcDir": "${workspaceFolder}/docs/source",
    "esbonio.sphinx.buildDir": "${workspaceFolder}/docs/build",
Replace of course the directories depending on the folder structure you use.
Esbonio can be fiddly and a bit resource hungry in VS Code. Use it in projects that are in top
shape.
Use a GitHub action to publish your documentation everytime your code changes
-----------------------------------------------------------------------------
* Add a workflow so that your website is rebuilt every time something is pushed to your
  master/main branch.
  See `this workflow `_
  for an example.
  The workflow will push a copy of the built HTML website in a new ``gh-pages`` branch.
* Activate the `GitHub Pages `_ website in your repository settings.
Alternative: use `Read the Docs `_ who is providing a similar service.