# Générateur de site statique Ceci est un projet proposé à des étudiants en Python. L'énoncé est volontairement long, pour apprendre à détecter l'essentiel dans un cahier des charges. C'est une compétence très utile en entreprise que de savoir prendre du recul. ## Qu'est-ce qu'un site statique Un site internet statique est un site composé uniquement de fichiers présents dans un dossier : * des fichiers HTML, * des fichiers CSS, * des fichiers JavaScript, * des images, * des vidéos, * … Cela s'oppose aux sites internet dynamiques, où certains de ces fichiers sont générés à la volée par du logiciel, à partir par exemple de données dans une base de données. ## Héberger un site statique Héberger un site dynamique est plus complexe que pour un site statique, il faut en effet installer le logiciel qui va générer les fichiers à la volée. Par contre, héberger un site statique est relativement simple, il suffit d'avoir un petit serveur web qui met à disposition le dossier contenant les fichiers statiques. ### Github Github fournit un hébergement gratuit de site statique. Il suffit de créer un dépôt git avec Github, et de committer dans une branche spécifique. Votre site est alors accessible à l'adresse suivante : https://votre_login.github.io/votre_nom_de_depot/ Plus de renseignement sur : * https://pages.github.com/ * https://www.christopheducamp.com/2013/12/21/demarrer-avec-pages-github/ * https://developer.mozilla.org/fr/docs/Apprendre/Utiliser_les_pages_GitHub ### Utiliser un serveur web Des outils commes Apache ou Nginx permettent de rendre accessible votre site par internet ou intranet : * https://httpd.apache.org/docs/trunk/fr/getting-started.html * http://sametmax.com/servir-des-fichiers-statiques-avec-nginx/ * https://doc.ubuntu-fr.org/nginx * https://nginxconfig.io/ Python vous fournit un serveur web minimaliste, par exemple pour aller sur http://localhost:8080/ et y voir le site statique dont les fichiers sont dans `./dossier_de_mon_site/`. ``` python -m http.server 8080 --directory ./dossier_de_mon_site/ ``` ## Génerer un site statique Les fichiers compris par un navigateur internet sont aux formats HTML/CSS/JavaScript. Vous n'avez peut-être pas envie de taper du HTML quand vous écrivez un blog. Il serait pratique de générer les pages web à partir d'un format textuel simple, comme le markdown (https://guides.github.com/pdfs/markdown-cheatsheet-online.pdf ou https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet), langage utilisé pour écrire le document que vous lisez actuellement (https://raw.githubusercontent.com/vpoulailleau/site_statique/master/README.md). Certains outils open-source le font déjà, dont certains connus et en Python : * https://blog.getpelican.com/ * https://www.getlektor.com/ * https://www.mkdocs.org/ * https://github.com/eudicots/Cactus * http://www.sphinx-doc.org/en/master/ * https://www.getnikola.com/ ## Projet Vous allez réaliser un outil convertissant un dossier de fichiers markdown et d'images en un autre dossier contenant les fichiers d'un site statique. Du HTML sera généré à partir du markdown, et cet HTML sera mélangé avec des modèles de pages web pour générer des pages toutes conformes au même modèle (par exemple avec le même logo, le même sommaire de site internet, le même fichier CSS référencé…). Les fichiers markdown peuvent être créés : * avec Visual Studio Code * avec https://github.com/ncornette/Python-Markdown-Editor * avec https://pandao.github.io/editor.md/en.html * avec https://dillinger.io/ * … L'extension classiquement utilisée pour les fichiers markdown est « .md ». Pour donner un ordre d'idée, la version la plus basique du projet peut être faite en moins de 100 lignes. ### Réalisation d'une interface en ligne de commande Vous allez réaliser un outil en ligne de commande pour générer les fichiers du site statique. Il prendra au moins comme paramètres : * `-i ./un_dossier` ou `--input-directory ./un_dossier` : le chemin du dossier de fichiers source (contenant les fichiers markdown) * `-o ./un_autre_dossier` ou `--output-directory ./un_autre_dossier` : le chemin du dossier où seront mis les fichiers générés pour le site statique * si le dossier existe déjà, libre à vous de soit l'effacer, soit écrire dedans pour faire des mises à jours (cela sera expliqué dans le mode d'emploi de votre outil) * vous pouvez choisir la convention de nommage qui vous plaît pour les fichiers générés, par exemple vous pouvez utiliser comme préfixe le nom du fichier markdown correspondant (cela sera aussi expliqué) * `-t ./autre_dossier` ou `--template-directory ./autre_dossier` : éventuellement le dossier contenant des modèles de pages web à compléter * `-h` ou `--help` : pour afficher de l'aide pour exliquer les paramètres de la commande Vous pouvez éventuellement ajouter des paramètres comme : * ce que vous voulez * `-k` ou `--kikoo-lol` qui ajoutera dans le texte des « kikoo », « lol », « mdr », « ptdr » ou qui répète des lettres comme dans Hellllo, et autres déformations du français (https://fr.wiktionary.org/wiki/kikoolol) * `-a` ou `--achtung` pour aider les allemands à lire nos blogs français. Si vous appliquez les règles décrites [ici](https://linuxfr.org/nodes/108129/comments/1642666), zela aidera dafantach no zami alemand dan la prononziation de notr langue et dan la kompréhenzion de no zékri Vous pouvez utiliser : * sys.argv (mais je ne vous le conseille pas, https://docs.python.org/fr/3/library/sys.html#sys.argv) * argparse (https://docs.python.org/fr/3/howto/argparse.html) * click (https://click.palletsprojects.com/en/7.x/) Il se peut donc que votre projet soit utilisé par exemple avec : ```bash python3.7 generateur.py --input-directory ./dossier_markdown --output-directory ./dossier_resultat/ --achtung -k ``` ### Conversion de markdown vers HTML Vous devez au moins convertir les syntaxes suivantes : * `#`, un titre de niveau 1 en `

` * `##`, un titre de niveau 2 en `

` * `###`, un titre de niveau 3 en `

` * Convertir les listes non ordonées en `