.. include:: special.rst

Sphinx
++++++

A quoi sert Sphinx ?
--------------------

Sphinx permet d'écrire un ouvrage technique ou alors de documenter du code . Ici on se concentrera sur comment utiliser Sphinx pour générer une documentation . Pour ce faire , nous utiliserons la syntaxe reStructuredText et nous verrons la manière dont elle s'utilise. 

Comment l'installer ? (version Linux)
------------------------------------

Tout d'abord , pour pouvoir installer Sphinx sous Linux il faut s'assurer d'avoir Python 3 d'installer sur notre ordinateur ( le logiciel Sphinx étant développé sous Python) .

.. code-block:: python

	sudo apt-get install python3-sphinx

Ensuite , il suffit d'exécuter la commande suivante pour débuter l'installation de Sphinx

.. code-block :: python

	pip install sphinx

Et c'est tout ! Sphinx est installé .

Générer la documentation
------------------------

Maintenant qu'on a vu comment installer Sphinx , on va maintenant voir comment générer une documentation sous Sphinx . Pour ce faire une simple commande existe :

.. code-block :: python

	sphinx-quickstart

Suite à l'exécution de cette commande , Sphinx posera plusieurs questions à propos de la création de votre projet . A vous de nommer votre document et d'y inscrire votre nom d'auteur , la date du projet et sa version . 

.. image:: image/Quick1.png



Le répertoire par défaut d'installation sera le répertoire ``root`` . A l'intérieur vous y retrouverez les dossiers ``source`` et ``build`` . Ces dossiers permettent la génération de la documentation .

.. image:: image/root.png

Pour générer les fichiers RST en fichiers HTML depuis le repertoire ``source`` il suffit d'exécuter cette commande :

.. code :: python
	
	make html

.. warning :: 
	Si vous avez modifié les répertoires par défaut la commande sera : 

	.. code :: python 
		
		sphinx-build -b html (chemin_répertoire_source) (chemin répertoire_build)

Vous aurez , suite à cela , vos fichiers HTML qui seront générés dans le dossier ``build`` .
Mais , allons plus en profondeur dans la structure des document Sphinx

Structure
---------

Dans le dossier source, vous trouverez alors de base quatre éléments.


Le dossier ``source``
_____________________

Dans ce dossier source se trouve les fichiers les plus importants , c'est à dire :

.. image:: image/source.png

``_static``
###########

Le dossier ``_static`` est le dossier par défaut contenant les images qui seront utilisées dans la documentation.

Pour une compatibilité optimale, je vous conseille le format PNG, qui permet entre autres la transparence.

``_templates``
##############

Ce dossier qui contiendra vos templates supplémentaires si besoin

``index.rst``
#############

C'est le fichier d'index, votre page de démarrage en quelque sorte. L'extension rst correspond au fichier ReST.

Nous reviendrons sur son fonctionnement, une fois les bases du langage ReST passées en revues

.. image :: image/index.png

``conf.py``
###########

Le fichier ``conf.py`` est le fichier contenant toute la configuration du projet de documentation : nom du projet, version, auteur, où trouver les images, log, quelles sont les options activées…

L'ensemble des éléments pouvant être paramétrés sont listés `ICI <https://www.sphinx-doc.org/en/master/usage/configuration.html>`_ . 

Nous allons passer en revue les principaux et plus utiles.

Dans le fichier ``conf.py``, ils sont presque tous présents, mais commentés. Pour en activer et modifier un, il vous suffit donc de le décommenter.

.. warning::
        Bien définir le chemin de ce fichier conf.py avec :
        
        .. code-block :: bash
	
		export PYTHONPATH=/chemin/répertoire/source
		

Le dossier ``build``
____________________

Dans ce dossier build , se trouve les fichiers HTML réalisés depuis les fichiers RST insérés dans le dossier source .

.. image :: image/build.png

``_images``
###########

C'est à l'intérieur que sont contenus toutes nos images préalablement mit dans notre dossier source

``_sources``
############

Contient tout les fichiers RST utilisés reconvertie en fichier texte

``_static``
###########

Contient tout les éléments graphique dont les fichiers css si nous en avons un

Les fichiers HTML 
#################

Ce sont les pages générées à partir de nos pages RST via Sphinx

Syntaxe reStructuredText
------------------------

Pour pouvoir rédiger des pages Sphinx , nous devons respecter une certaine syntaxe :

Les titres
__________

Pour pouvoir rédiger un titre il suffit de rédiger notre titre et d'y inclure une ligne de l'un de ses caractère :: 

= - ` : ' " ~ ^ _ * + # < >

.. image :: image/Titre.png

Structure de texte
__________________

Pour pouvoir structurer son texte rien de plus simple , il suffit de mettre le même décalage pour les mêmes paragraphes

.. image :: image/structure.png


Style de texte
______________

Il existe des marqueurs pour pouvoir mettre le texte en **gras** :code:`**gras**` et/ou en *italique* :code:`*italique*`

Si vous voulez faire du code inline comme : ``code`` il vous suffit de mettre ````code````

La syntaxe reStructuredText est assez malin , ce qui fait que l'utilisation de l'un de ces caractères "spéciaux" est totalement possible sans problème . 

Cet astérisque * est traité correctement. 

Si vous souhaitez par contre \*entourer un texte par des astérisques*\ **sans** qu'il soit en italique, il est nécessaire d'indiquer que l'astérisque ne doit pas être interprété. Pour cela il suffit de placer une barre oblique inversée juste avant lui, comme ça ``\*`` 
 
Listes
______

reStructuredText permet d'utiliser trois types de listes : **numérotées** , **avec puces** et de **définitions** .

Dans chaque cas, nous pouvons avoir autant de paragraphes, sous-listes, etc. que l'on souhaite, tant que le décalage à gauche est aligné sur la première ligne.

Les listes doivent toujours démarrer un nouveau paragraphe , c'est à dire qu'il doit y avoir un saut de ligne juste avant.

Listes **numérotées**
#####################

En démarrant une ligne avec un numéro ou une lettre suivie d'un point ".", une parenthèse droite ")" ou entouré par des parenthèses -- comme vous préférez. Toutes ces formes sont reconnues:

.. code :: python

	1. nombres

	A. Lettres en majuscule
   	   qui continue sur plusieurs ligne

   		avec deux paragraphes et tout !

	a. lettres minuscules

   		3. avec une sous-liste qui démarre à un nombre différent
   		4. faites attention à garder une séquence de nombre correcte !

	I. majuscules en chiffres romains

	i. minuscules en chiffres romains

	(1) des nombres à nouveau

	1) et encore

Le résultat (note : Tous les styles de listes ne sont pas toujours supportés par tous les navigateurs, vous ne verrez donc pas forcément les effets complets) :


1. nombres

A. Lettres en majuscule
   qui continue sur plusieurs ligne

   avec deux paragraphes et tout !

a. lettres minuscules

   3. avec une sous-liste qui démarre à un nombre différent
   4. faites attention à garder une séquence de nombre correcte !

I. majuscules en chiffres romains

i. minuscules en chiffres romains

(1) des nombres à nouveau

1) et encore

Listes à puces
##############

De la même manière que pour les listes numérotées, il faut démarrer la première ligne avec une puce -- soit "-", "+" ou "*":

.. code :: python

	* une puce "*"

  		- une sous-liste avec "-"

    		 	+ à nouveau une sous-liste

 		 - une autre option

Le résultat :
	
* une puce "*"

  		- une sous-liste avec "-"

    		 	+ à nouveau une sous-liste

 		 - une autre option

Listes de définitions
#####################

Comme les deux autres, les listes de définitions consistent en un terme et la définition de ce terme. Le format est le suivant:

.. code :: 

 	Quoi
  	    Les listes de définitions associent un terme avec une définition.

 	*Comment*
  		Le terme est une phrase d'une ligne, et la définition est un
  		ou plusieurs paragraphes ou éléments, décalés par rapport au terme.
  		Les lignes vides ne sont pas autorisées entre le terme et la définition

Le résultat :

	Quoi
  	    Les listes de définitions associent un terme avec une définition.

 	*Comment*
  		Le terme est une phrase d'une ligne, et la définition est d'un
  		ou plusieurs paragraphes ou éléments, décalés par rapport au terme.
  		Les lignes vides ne sont pas autorisées entre le terme et la définition
		



Préformatage
____________

Pour inclure un texte préformaté sans traitement il suffit de terminer le paragraphe par "::" . Le texte préformaté est terminé lorsqu'une ligne retombre au niveau du décalage précédent.

Par exemple:

.. code ::

	Un exemple::

   	 	     Espaces, nouvelles lignes, lignes vides, et toutes sortes de marqueurs
       			    (comme *ceci* ou \cela) sont préservés dans les bloc préformatés.

 		Regardez ici, je suis descendu d'un niveau.
 		(mais pas assez) 

	Fin de l'exemple

Le résultat:

Un exemple::

    Espaces, nouvelles lignes, lignes vides, et toutes sortes de marqueurs
       (comme *ceci* ou \cela) sont préservés dans les bloc préformatés.

 Regardez ici, je suis descendu d'un niveau.
 (mais pas assez)

Fin de l'exemple

Notez que si le paragraphe contient seulement "::", il est ignoré.

.. code ::

	Ceci est un texte préformaté,
	le paragraphe "::" est ignoré.





Images et Gif
_____________

Pour inclure une image dans votre document, vous devez utiliser la directive ``image``.

Par exemple:

.. code :: 
	
	.. image:: image/Logo.png

Le résultat:

.. image:: image/Logo.png
	:height: 100
  	:width: 200
  	:scale: 50

Et pour les gifs :

.. image:: image/nyan-cat-gif-1.gif
	:height: 100
  	:width: 200
  	:scale: 50

La partie ``Logo.png`` / ``nyan-cat-gif-1.gif`` indique le chemin d'accès au fichier de l'image qui doit apparaître. Il n'y a pas de restriction sur l'image (format, taille etc). Si l'image doit apparaître en HTML et que vous souhaitez lui ajouter des informations:

.. code :: 
	
	.. image:: Logo.png
	   :height: 100
  	   :width: 200
  	   :scale: 50
   	   :alt: texte alternatif


Plus d'informations juste `ici <https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/WritingReST/Images.html>`_
Liens
_____

Liens externe
#############

Pour faire des liens, c'est aussi simple (notez bien l'espace avant le "<", il est très important) :


```site du CNAM <https://www.cnam-paysdelaloire.fr/le-mans/le-mans-840946.kjsp>`_``

Ce qui donne


lien vers le `site du CNAM <https://www.cnam-paysdelaloire.fr/le-mans/le-mans-840946.kjsp>`_

Liens interne
#############

Pour créer un lien qui permet de télécharger un fichier il suffit de mettre la balise `:download:` :

``:download:`Le fichier css <download/custom.css>```

Ce qui donne : :download:`Le fichier css <download/custom.css>`


Notes, avertissement importantes
________________________________

Si vous voulez mettre en évidence des notes, des avertissements ou des choses importantes, c'est également possible :

.. code ::

	.. NOTE::

   	Ceci est une note.

	.. WARNING::

   	Ceci est un avertissement !

	.. IMPORTANT::

  	 Ceci est important !

Ce qui donne :

.. NOTE::

   Ceci est une note.

.. WARNING::

   Ceci est un avertissement !

.. IMPORTANT::

   Ceci est important !


Tableau
_______

Pour ce qui est des tableaux plusieurs manières existent :

.. code ::

	+-----------+-----------+-----------+
	| Heading 1 | Heading 2 | Heading 3 |
	+===========+===========+===========+
	| Hello     | World     |           |
	+-----------+-----------+-----------+
	| foo       |                       |
	+-----------+          bar          |
	| baz       |                       |
	+-----------+-----------------------+

Ce qui donne :

	+-----------+-----------+-----------+
	| Heading 1 | Heading 2 | Heading 3 |
	+===========+===========+===========+
	| Hello     | World     |           |
	+-----------+-----------+-----------+
	| foo       |                       |
	+-----------+          bar          |
	| baz       |                       |
	+-----------+-----------------------+

Ou bien :

.. code ::

	.. list-table ::

		* - Bonjour
		  - Au revoir
		* - Salut
		  - Ciao

Qui donne :

	.. list-table ::

		* - Bonjour
		  - Au revoir
		* - Salut
		  - Ciao



Code
____

Pour inserer du code dans son texte plusieurs manières existent :

 .. code ::

	Cette ``manière``

qui donne :

Cette ``manière``

ou alors

.. code ::
	
	Cette :code:`manière`

qui donne :

Cette :code:`manière`

ou encore :

.. code ::

	.. code :: (langage)
		
		Cette manière
		
qui donne

.. code ::

	Cette manière

Expression mathématiques
________________________

Le module pngmath vous permet de saisir des formules mathématiques, au format LaTeX, et de les afficher sous la forme d'images. La directive est « math ».

Voici la syntaxe LaTeX :

.. list-table ::
	
	* - Désignation mathématique
	  - Écriture LaTeX
	* - Puissance
	  - a^2
	* - Indice
	  - a_2
	* - Mix
	  - a^{2}_{3}
	* - Fraction
	  - \\frac{numerateur}{denominateur}
	* - Racine carrée
	  - \\sqrt[puissance]{valeur}
	* - Sinus , cosinus , tangente
   	  - \\sin, \\cos, \\tan, \\arcsin, \\arccos, \\arctan
	* - Somme
	  - \\sum_{valeur inferieure}^{valeur superieure}
	* - Intégrale
	  - \\int_{valeur inferieure}^{valeur superieure}
	* - Infini
	  - \\infty
	* - Pi
	  - \\pi

Inclure des fonctions via python
________________________________

Sphinx a la possibilité de documenter vos documents Python très facilement :

Tout d'abord ajouter l'extension ```sphinx.ext.autodoc``` à votre dossier ``conf.py``

.. image:: image/conf.png

Ensuite , ajouter votre code python dans un fichier python qui sera dans le dossier ``source``

Dans votre fichier RST , rajouter le modulte ``automodule`` comme cela :

.. code :: python

	.. automodule:: doc-python
		:members:

.. WARNING :: 

	N'oubliez pas le ``:members:`` sinon votre fonction ne s'affichera pas

.. WARNING :: 

	Si une erreur vous disant que le module n'a pas été trouvé , écrivez dans le terminal la commande :code:`export PYTHONPATH=votre/chemin/du/repertoire/source`

Plus d'informations juste `ici <https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#module-sphinx.ext.autodoc>`_

Le module toctree
_________________

Il permet de crée des sommaires , comme vous pouvez le voir , l'index est un toctree 

.. image :: image/toctree.png

Ici , l'option ``:maxdepth: 2`` signifie qu'il ne peut y a voir que 2 titres d'afficher ( titre et sous-titre )

L'option ``:caption:`` quant à elle permet de donner un nom à notre toctree ici ``Sommaire``

Le module code-block
____________________

Le module code-block comme vu précédemment permet d'inclure du code dans notre page Sphinx , mais celui-ci possède des attributs qui peuvent être activé ou non.

Pour ajouter un attribut cela se passe comme cela :

.. code :: python

        .. code-block :: (langage)
                :attribut:

                Code blabla

Les attribut les plus important sont : 

- ``linenos`` qui permet de rajouter les numéros de ligne sur le coté

- ``caption`` qui permet de rajouter un titre à notre block de code 

D'autre attribut exisent , vous pouvez les retrouvez juste `ici <https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-code-block>`_

.. WARNING ::

        L'extension `copy-button` vue juste en dessous entre en conflit avec l'attribut `linenos`. En effet , le bouton copié copieras aussi les chiffres des lignes .

Personnaliser son site Sphinx :
-------------------------------

Sphinx possède un large panel de modification possible , la mise en forme d'une page est très importante pour la différencier des autres

Bouton Copie-Colle pour les lignes de codes
___________________________________________

Il est possible d'inclure un bouton copié collé pour nos lignes de codes comme le fait cette documentation Sphinx . Pour se faire , il suffit de rajouter l'extenstion `sphinx_copybutton` dans notre fichier `conf.py` et de saisir la commande : 

.. code :: python

        pip install sphinx-copybutton

Et c'est tout , un bouton copié collé sera disponible ( plus d'informations `ici <https://sphinx-copybutton.readthedocs.io/en/latest/>`_ )

Texte en couleur
________________

Inclure des couleurs dans son texte Sphinx est un peu plus compliqué , il va nous falloir 2 fichiers et rajouter une ligne dans le fichier ``conf.py``:

Tout d'abord commençons par les deux fichier : 
	:download:`Le fichier css <download/custom.css>`
	:download:`Le fichier rst <download/special.rst>`

Ces deux fichiers sont essentiels , ils nous permettent d'inclure la couleur à notre page

.. NOTE ::

	N'oubliez pas de rajouter la ligne ``.. include:: special.rst`` au début de chacun de vos fichiers RST pour utiliser les couleurs

.. NOTE ::

	la ligne de commande ``html_css_files = ["custom.css"]`` doit être incluse dans le fichier conf.py

.. WARNING ::
	
	Le fichier ``special.rst`` doit être inclus dans le dossier ``source``

.. WARNING ::

	Le fichier ``custom.css`` doit être inclus dans le dossier ``_static`` du dossier ``source``

Une fois cela fait , dans votre fichier RST , il ne vous reste qu'à faire ceci pour écrire en couleur : ``:red:`couleur``` , ce qui donne : :red:`couleur`

.. NOTE ::

	red est associé à la couleur rouge , à vous de la modifié selon la couleur que vous souhaitez , en anglais .
	

Modifier son thème
__________________

Comme vous l'avez peut-être remarqué , Sphinx met à votre disposition différents thèmes , celui par défaut est le thème dit **classique** le thème utilisé ici ( et aussi le + utilisé ) est le thème **RTD** . Certes moins personnalisable que le thème par défaut , le thème RTD propose une clarté et une organisation nettement supérieur à celui du thème classique .

L'installation de chaque thème est propre à chacun mais je vais vous montrer l'exemple avec le thème RTD.

Tout d'abord il faut télécharger le thème sur le net 

.. code :: bash

	pip install sphinx_rtd_theme

Une fois fait dans le fichier ``conf.py`` , il vous faut ajouter :

.. code :: python

	html_theme = 'sphinx_rtd_theme'

.. NOTE ::
	
	Le thème possède plusieurs possibilité de modification que vous pouvez retrouver juste `ici <https://sphinx-rtd-theme.readthedocs.io/en/stable/installing.html>`_

Modifier la couleur des texte ``inline``
________________________________________

Les codes ``ìnline`` possèdent par défaut une couleur rouge et un fond blanc , mais il existe un moyen de la modifier tout ca via le fichier ``custom.css`` il suffit d'inclure la ligne suivante :

.. code :: css

	code.literal {
    		color: #404040 !important;
    		background-color: #fbfbfb !important;
	}

- L'attribut ``color`` modifie la couleur du texte 
- L'attribut ``background-color`` modifie le fond 


Modifier le logo et l'icone
____________________________

Pour modifier l'icone du site et son logo , il vous faut tout d'abord inclure les images du logo et de l'icone dans le dossier ``_static``

Une fois fait il suffit d'ajouter ces deux lignes au fichier ``conf.py``

.. code :: python 	

	html_favicon = "Nom_De_Icone.ico" 
	html_logo = "Nom_Du_Logo.jpg"

Sphinx avec Docker
------------------

Il existe une manière beaucoup plus pratique d'utiliser Sphinx : L'utilisez dans un contenaire Docker !

Cela vous permettra plutôt que d'éviter de passez par plusieurs commandes de mettre a jour vos différents fichiers Sphinx en ne modifiant que le fichier dans le document source .

Pour ce faire nous réutilissons une image Docker  qui est ``pardahlman/sphinx`` 

Nous commençons par récuperer l'image docker : :code:`docker pull pardahlman/sphinx`

Ensuite direction les fichier "source" de sphinx , la ou sont situer les documents RST .

Exécuter ensuite la commande : :code:`docker run -d  -v .:/docs -p 8000:8000 pardahlman/sphinx`

Une fois cela fait rendez-vous sur internet et sur ``http://localhost:8000/``

Vous aurez directement votre documentation Sphinx . Lorsque vous effectuerez une modification sur les fichiers ``source`` elle s'effectueras automatiquement sur la version web .

.. IMPORTANT::

	Veillez à ce que le thème de votre Sphinx soit bien renseignez dans le fichier ``config.py`` de vos ressources sphinx .

.. WARNING::

	Cette manière de procèder vous emepechera d'installer des extensions comme ``sphinx-copybutton`` .