| Sphinx |
| ====== |
| |
| Docs are generated using :doc:`Sphinx <sphinx:usage/index>` using the |
| :doc:`reStructuredText <sphinx:usage/restructuredtext/basics>` syntax. |
| |
| Sphinx was chosen because it's widely used (Python official docs, Linux Kernel, |
| Read the Docs, etc.), open source, actively maintained, has code highlighting, |
| and a good client-side search implementation. |
| |
| Writing Documentation |
| --------------------- |
| |
| reStructuredText syntax references can be found here: |
| |
| * :doc:`Sphinx reStructuredText Primer <sphinx:usage/restructuredtext/basics>` |
| * `rst cheat sheet <https://github.com/ralsina/rst-cheatsheet/blob/master/rst-cheatsheet.rst>`_ |
| |
| rST creates headings by underlining the heading with a series of symbol |
| characters. There is no specific required order for these, but for consistency |
| most ONF docs use the following symbols/order to represent heading levels:: |
| |
| H1: = |
| H2: - |
| H3: " |
| H4: ' |
| H5: ^ |
| H6: + |
| |
| Linking within Documentation |
| """""""""""""""""""""""""""" |
| |
| |
| Referencing other Documentation |
| """"""""""""""""""""""""""""""" |
| |
| Other Sphinx-built documentation, both ONF and non-ONF can be linked to using |
| :doc:`InterSphinx <sphinx:usage/extensions/intersphinx>`, which allows you to |
| create links that will work even if the other site moves or reorganizes |
| content. |
| |
| New InterSphinx reference requires modifying the ``intersphinx_mapping`` |
| variables of the ``conf.py`` file. |
| |
| You can see all link targets available on a remote Sphinx's docs by running:: |
| |
| python -msphinx.ext.intersphinx http://otherdocs/objects.inv |
| |
| More information about InterSphinx: |
| |
| * :doc:`Read the Docs InterSphinx Guide <rtd:guides/intersphinx>` |
| |
| Adding Images and Diagrams |
| """""""""""""""""""""""""" |
| |
| There are multiple ways to add images and diagrams to the documentation. |
| |
| Generally, you should prefer using `SVG |
| <https://en.wikipedia.org/wiki/Scalable_Vector_Graphics>`_ images, as these can |
| be scaled to any size without quality loss. |
| |
| If you're creating diagrams, there are multiple tools available. |
| :doc:`Graphviz <sphinx:usage/extensions/graphviz>` can render inline text-based |
| graphs definitions and diagrams within the documentation, and is best choice for |
| simple diagrams. |
| |
| More complex diagrams can be created in `Diagrams.net/Draw.io |
| <https://www.diagrams.net/>`_ format, which is available as a standalone app, |
| web app, or integrated with various other tools like Google Workspace. When |
| saving these diagrams, use the SVG format, and check the **Include a copy of my |
| diagram** box. This will let someone open the SVG later within Diagrams.net |
| from file saved in the documentation and edit it without any loss in |
| functionality or quality. |
| |
| The last resort is to use raster (bitmap) images. If they're drawings or screen |
| captures, use the `PNG |
| <https://en.wikipedia.org/wiki/Portable_Network_Graphics>`_ format. Consider |
| optimizing the PNG files with a tool like `OptiPNG |
| <http://optipng.sourceforge.net/>`_, or `pngquant <https://pngquant.org/>`_ to |
| save space and data transfer required. |
| |
| If you need to include a photograph, use `JPEG |
| <https://en.wikipedia.org/wiki/JPEG>`_. |
| |
| Building the Documentation |
| -------------------------- |
| |
| The documentation build process is stored in a ``Makefile``. Building docs |
| requires Python to be installed, and most steps will create a virtualenv |
| (usually ``venv-docs``) which contains the required tools. You may also need |
| to install the ``enchant`` C library using your system's package manager for |
| the spelling checker to function properly. |
| |
| Run ``make html`` to generate html documentation in ``_build/html``. |
| |
| There is also a test target, ``make test``, which will run all the following |
| checks - this is what Jenkins does on patchset validation, so: |
| |
| * ``make lint``: Check the formatting of documentation using `doc8 |
| <https://github.com/PyCQA/doc8>`_. |
| |
| * ``make license``: Verifies licensing is correct using :ref:`REUSE |
| <policies/licensing:REUSE License Tool>` |
| |
| * ``make spelling``: Checks spelling on all documentation. If there are |
| additional words that are correctly spelled but not in the dictionary |
| (acronyms, nouns, etc.) please add them to the ``dict.txt`` file, which |
| should be alphabetized using ``sort`` |
| |
| * ``make linkcheck``: Verifies that links in the document are working and |
| accessible, using Sphinx's built in linkcheck tool. If there are links that |
| don't work with this, please see the ``linkcheck_ignore`` section of |
| ``conf.py``. |
| |
| Some sites may have the ability to build a PDF file of the documentation using |
| ``make latexpdf``. This requires that you have a recent LaTeX installation and |
| ``latexmk`` installed. |
| |
| Versioning Documentation |
| """""""""""""""""""""""" |
| |
| To change the version shown on the built site, change the contents of the |
| ``VERSION`` file to be released SemVer version. This will create a tag on the |
| repo. |
| |
| Then when ``make multiversion`` target can be used which will build all |
| versions tagged or branched on the remote to ``_build/multiversion``. This will |
| use a fork of `sphinx-multiversion |
| <https://github.com/Holzhaus/sphinx-multiversion>`_ to build multiple versions |
| and a menu on the site. |
| |
| There are variables in ``conf.py`` to determine which tags/branches to build. |