Aller au contenu

Pyodide-Mkdocs-Theme : Éditeurs & terminaux python dans MkDocs#

Version actuelle : 4.2.6



Tant que ce sablier animé est présent dans le bandeau supérieur, des éléments de la page sont inactifs :
l'environnement pyodide est en cours de démarrage.

Mise Ă  jour depuis pyodide-mkdocs

Si vous voulez mettre à jour un projet créé avec pyodide-mkdocs vers pyodide-mkdocs-theme, consultez la rubrique MAJ depuis pyodide-mkdocs.


Introduction#

Pyodide-MkDocs-Theme est un thÚme pour MkDocs qui permet de construire des sites pouvant intégrer, cÎté client:

  • des IDEs (Ă©diteurs de code),
  • des consoles python interactives,
  • un juge en ligne pour tester des fonctions rĂ©digĂ©e par l'utilisateur, associĂ© Ă  des corrections et remarques,
  • et quelques autres fonctionnalitĂ©s variĂ©es (qcms, ...).


Garanties :

  • Sans cookie
  • Sans inscription
  • CrĂ©Ă© par des enseignants pour les enseignants


"CĂŽtĂ© cuisine", le thĂšme est fourni avec un ensemble de fonctionnalitĂ©s prĂȘtes Ă  l'emploi pour faciliter la vie du rĂ©dacteur :

  • Le thĂšme Ă©tend mkdocs-material, donc toutes les fonctionnalitĂ©s de ce dernier sont disponibles.
  • PrĂ©configuration de MathJax, pour utiliser des expressions LaTex.
  • Installation "one shot" : installer le thĂšme installe Ă©galement toutes les dĂ©pendances.

Ce projet est une refonte du prototype pyodide-mkdocs créé par Vincent Bouillot.

Comment ça marche?

La technologie permettant ce tour de force s'appelle Pyodide. Elle est associée à des éléments javascript, comme jquery.terminal et ACE Editor.

Pyodide utilise WebAssembly pour faire le lien entre Python et Javascript et proposer un environnement permettant de manipuler le DOM Javascript avec Python, ou inversement de manipuler Python depuis Javascript.

Aperçus#

Créer des IDEs#

Une installation du thÚme permet d'obtenir l'éditeurs ci-dessous, en ajoutant cette commande dans un fichier markdown et les fichiers nécessaires à la création de l'IDE :

{{ IDE('exo') }}


###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein Ă©cran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier
Évaluations restantes : 5/5
.128013Rt19o/h4ak3p;=PF5 :ul_%iwé(d)gbenSÚ.mrfqvysc2050C0G0c0j0y0v0R0s0S0v0j0R0R0o010c0y0m010406050R0u0L0L0j0M0Q040I0f0v0u0.0f0H050g0^0`0|0~0?0m04051e171h0g1e0?0C0y0P0$0(0*0,0h0y0E0h0v1v0h0c0;050X0F0v0G1q0)0+011u1w1y1w0c1E1G1C0c0M1f0c0h0$110R0m0j0H0,0T011I1s010N0Z0G0H0j0L0G1C1#1%1,1K1/1G1=1@0;0a0s0p0M0f0m0f0R0y140H0s0V1Z0M0M0G0S2c171`0H1f0g1X2p1U1W1V1D0C1|0,1y0H1;291C1n1p0%1J2z0y2B0H0f2F1C0m2i1f2n2p2T0@1$2d2H1-2M0M0{0v0;0d2m2X0=2W1{2Z1K2#2%0;0T2+1%2-2n2y012=0j2(040l2_2o0?2|2:0,2 310i342{2X2}3a0;0r3d1i2R172F2s0C1W2x38010S2N1^1f3o1g3m2V182,053v0V2S3f3t0k0;0V0N3k371r1K0z0;0s3P3J3R390N0;0G0R0c0w1$0y0M3W2/3Y010:040B3-2Y3/0H0;163D2`2.3^2I3:0;0D0t3d060s483V3Q413L042i0c0u0M3|2T4a3X410f3T042M0c3d4l3.413`4q3@2}0f0;0x4z3t0L0y2@46364m2!0;0N0Y0v4t3 4A0;0o4R4b1-0k0S0;0q300R0G4t494S3t0S0d0;030s0b2j0h0|0E0G0M0s0(0s1$4`0s0W1Z0v1G4|0S1H3G1H0C1%0#0v02030l0e0n0A1n0c0G4h4 0f5p0P0f3+46495x5y5x4,3/4.4:0$1H0O0u5g5i0n0Z0s4(4 1J5G0u1%2x1G0#5n3%0#1$0*1;0c0s0j0P2j5N0u0S0S0J0R0K5=46175a2p2Q0G2p3z2q3q172t610j1F5|3n1o2-0g0V0X0Z0R04.


Le thĂšme propose un Ă©cosystĂšme complet avec :

Outre toutes les fonctionnalités proposées, le thÚme reste particuliÚrement flexible !
En effet, il est toujours possible de :

  • DĂ©finir vos propres macros, Ă  utiliser en plus de celles du thĂšme.
  • Personnaliser les styles et les Ă©lĂ©ments javascript, de mĂȘme que les plugins, extensions, ... Comme avec n'importe quelle documentation MkDocs !

Créer des qcms#

Un QCM avec mélange automatique des questions (bouton en bas pour recommencer)

(Une description additionnelle peut ĂȘtre ajoutĂ©e au dĂ©but de l'admonition...)

  1. On a saisi le code suivant :
    n = 8
    while n > 1:
        n = n // 2
    

    Que vaut n aprÚs l'exécution du code ?

    • 0

    • 1

    • 2

    • 4

  2. Quelle est la machine qui va exécuter un programme JavaScript inclus dans une page HTML ?

    • La machine de l’utilisateur sur laquelle s’exĂ©cute le navigateur web.

    • La machine de l’utilisateur ou du serveur, selon celle qui est la plus disponible.

    • La machine de l’utilisateur ou du serveur, suivant la conïŹdentialitĂ© des donnĂ©es manipulĂ©es.

    • Le serveur web sur lequel est stockĂ©e la page HTML.

  3. Cocher toutes les bonnes réponses, avec :
    meubles = ['Table', 'Commode', 'Armoire', 'Placard', 'Buffet']
    

    • meubles[1] vaut Table

    • meubles[1] vaut Commode

    • meubles[4] vaut Buffet

    • meubles[5] vaut Buffet

Installation#

Mise Ă  jour depuis pyodide-mkdocs

Presque toutes les fonctionnalitĂ©s de pyodide-mkdocs restent prĂ©sentes dans pmt-pypi, mais certaines modifications ont dĂ» ĂȘtre apportĂ©es au projet.

Ainsi, le passage Ă  la version "thĂšme" nĂ©cessitera d'appliquer quelques modifications Ă  votre documentation, aussi bien du cĂŽtĂ© de l'environnement (packages installĂ©s) que de la documentation elle-mĂȘme.
Voir la page concernant la mise Ă  jour vers pyodide-mkdocs-theme, si c'est ce que vous voulez faire.

Installation via pip #

Le thĂšme fonctionne avec Python 3.8+ et est disponible sur PyPI. Il peut donc ĂȘtre installĂ© dans n'importe quel projet en exĂ©cutant cette commande dans un terminal, sur une machine avec une connexion internet :

pip install pyodide-mkdocs-theme

DĂ©marrer un nouveau projet#

Si le travail est effectué en local et une fois le thÚme installé, il est possible de démarrer un nouveau projet de documentation grùce à l'un des scripts disponibles avec le thÚme :

python -m pyodide_mkdocs_theme --new PROJECT_NAME


Cette commande, exécutée dans un terminal, crée un nouveau dossier nommé PROJECT_NAME dans le répertoire en cours, et y ajoute les fichiers de base pour démarrer un projet avec le thÚme :

Fichiers & dossiers créés

...
└── PROJECT_NAME
    ├── docs
    │   ├── index.md
    │   └── exo.py
    ├── .gitignore
    ├── main.py
    ├── mkdocs.yml
    └── requirements.txt
  • mkdocs.yml, avec une configuration minimale nĂ©cessaire pour le thĂšme. Ne pas oublier d'y modifier ensuite les champs site_name et site_url.
  • requirements.txt, qui contient toutes les dĂ©pendances du projet.
  • .gitignore, avec des rĂ©glages gĂ©nĂ©riques pour un projet de documentation avec python.
  • main.py, avec la logistique pour modifier certains messages du thĂšme en place. Ce fichier est optionnel et peut ĂȘtre supprimĂ© ou modifiĂ© (ajout de macros personnalisĂ©es).
  • docs/index.md et docs/exo.py, qui donnent des exemples d'utilisation des macros du thĂšme.

DĂ©pendances #

Le thĂšme est compatible python 3.8+.
Les dépendances sont téléchargées et installées automatiquement lors de l'installation :


Comme le thÚme hérite de mkdocs-material toutes les fonctionnalités de ce dernier sont également disponibles.

Pour les versions de pyodide-mkdocs-theme antérieures à la v2.2.0

Gestion des plugins de mkdocs-material

Pour les versions strictement antĂ©rieures Ă  la 2.2.0, les plugins issus de mkdocs-material devaient ĂȘtre prĂ©fixĂ©s en leur ajoutant material/ lors de leur enregistrement dans mkdocs.yml:plugins :

    material/blog
    material/group
    material/info
    material/offline
    material/privacy
    material/search
    material/social
    material/tags

À partir de la version 2.2.0, c'est l'inverse : ces plugins doivent maintenant ĂȘtre enregistrĂ©s sans prĂ©fixes ou ils ne fonctionneront plus correctement.


Si la notion de dossier partials vous parle, vous pourriez ĂȘtre Ă©galement concernĂ©s par ceci :

À partir de la mĂȘme version, PMT utilise 2 nouvelles surcharges de fichiers de material, dans custom_dir/partials: content.html et header.html.
Voici pour rappel la liste complÚte des fichiers surchargés :

  • content.html
  • copyright.html
  • footer.html
  • header.html
  • social.html

Si vous avez surchargé l'un de ces fichiers, il vous faudra aller récupérer les versions utilisées dans PMT pour y inclure vos modifications.

mkdocs.yml : réglages #

Danger

Si l'argument --file ou -F pointe vers un fichier existant, ce fichier sera écrasé sans demande de confirmation préalable.

Configuration par défaut pour le thÚme#

Si le thÚme est déjà installé, il est possible de récupérer un fichier mkdocs.yml préconfiguré en exécutant le script ci-dessous.
Il est Ă©galement possible de simplement afficher le contenu du fichier modĂšle dans le terminal, si l'argument --file est omis :

python -m pyodide_mkdocs_theme --yml --file "mkdocs_.yml"

Configuration du fichier#

Voici ci-dessous le contenu d'une configuration minimale requise pour utiliser le thĂšme avec mkdocs.

Ne pas utiliser navigation.instant

Le thĂšme n'est pas compatible avec l'outil navigation.instant de mkdocs-material.
Si cette extension est activée par mégarde, une erreur sera levée.


theme:
    name: pyodide-mkdocs-theme
##   features:
##       - navigation.instant   # /!\ Cette option est incompatible avec le thĂšme !


plugins:
  - search
  - pyodide_macros
      on_error_fail: true   # Fortement conseillé...


## exclude_docs nécessite mkdocs 1.6+ pour fonctionner correctement. Sinon, vous pouvez utiliser
## le plugin mkdocs-exclude Ă  la place.
## Ne surtout pas mettre de commentaires sur la ligne d'exclusion des fichiers python... !
exclude_docs: |
  **/*_REM.md
  **/*.py


markdown_extensions:
  - md_in_html              # !!REQUIS!!
  - admonition              # !!REQUIS!! Blocs colorés:  !!! info "ma remarque"
  - attr_list               # !!REQUIS!! Un peu de CSS et des attributs HTML, ex: { #id .class style="display:none" }
  - pymdownx.details        # !!REQUIS!! Admonition: ??? -> peuvent se déplier ; ???+ -> peuvent se replier.
  - pymdownx.emoji:         # !!REQUIS!! Émojis:  :boom:
      emoji_index: !!python/name:material.extensions.emoji.twemoji
      emoji_generator: !!python/name:material.extensions.emoji.to_svg
  - pymdownx.highlight      # !!REQUIS!! Coloration syntaxique du code
  - pymdownx.inlinehilite   # !!REQUIS!! Coloration syntaxique pour les "code spans": `#!python  code_python`
  - pymdownx.snippets:      # !!REQUIS!! Inclusion de fichiers
      check_paths: true     # Fortement conseillé...
  - pymdownx.superfences:   # !!REQUIS!!
      custom_fences:        # (custom_fences: uniquement si vous comptez utiliser mermaid)
        - name: mermaid
          class: mermaid
          format: !!python/name:pymdownx.superfences.fence_code_format
  - pymdownx.arithmatex:    # !!REQUIS!! Pour LaTex
      generic: true

alt

Changer la palette de couleurs#

Il est possible de modifier la palette de couleurs utilisée pour les modes "jour" et "nuit".

Comme le thÚme vient avec un réglage par défaut pour les modes jour/nuit, il est nécessaire de redéfinir l'intégralité de la palette de couleurs dans la section theme, pour que tout fonctionne correctement :

theme:

  palette:        # Palettes de couleurs jour/nuit
    - media: "(prefers-color-scheme: light)"
      scheme: default
      primary: orange
      accent: deep orange
      toggle:
        icon: material/weather-sunny
        name: Passer au mode nuit
    - media: "(prefers-color-scheme: dark)"
      scheme: slate
      primary: orange
      accent: deep orange
      toggle:
        icon: material/weather-night
        name: Passer au mode jour

Configuration du plugin du thĂšme, pyodide_macros#

Le thÚme vient avec son propre plugin, qui permet de mettre en place toutes les fonctionnalités nécessaires.

De trĂšs nombreuses options peuvent y ĂȘtre configurĂ©es pour modifier le comportement du thĂšme selon vos besoins.

Hiérarchie complÚte de toutes les options du plugin

Les explications dĂ©taillĂ©es peuvent ĂȘtre trouvĂ©es dans cette page.

plugins:
    - pyodide_macros:
        args:
            IDE:
                SANS: ""
                WHITE: ""
                REC_LIMIT: -1
                MERMAID: false
                AUTO_RUN: false
                MAX: 5
                LOGS: true
                MODE: null
                MIN_SIZE: 3
                MAX_SIZE: 30
                TERM_H: 10
                TEST: ""
                TWO_COLS: false
                STD_KEY: ""
                EXPORT: false

            terminal:
                SANS: ""
                WHITE: ""
                REC_LIMIT: -1
                MERMAID: false
                AUTO_RUN: false
                TERM_H: 10
                FILL: ""

            py_btn:
                SANS: ""
                WHITE: ""
                REC_LIMIT: -1
                ICON: ""
                HEIGHT: null
                WIDTH: null
                SIZE: null
                TIP: "Exécuter le code"
                TIP_SHIFT: 50
                TIP_WIDTH: 0.0
                WRAPPER: "div"
                MERMAID: false
                AUTO_RUN: false

            run:
                SANS: ""
                WHITE: ""
                REC_LIMIT: -1
                MERMAID: false

            multi_qcm:
                description: ""
                hide: false
                multi: false
                shuffle: false
                shuffle_questions: false
                shuffle_items: false
                admo_kind: "!!!"
                admo_class: "tip"
                qcm_title: "Question"
                tag_list_of_qs: null
                DEBUG: false

            figure:
                div_id: "figure1"
                div_class: ""
                inner_text: "Votre tracé sera ici"
                admo_kind: "!!!"
                admo_class: "tip"
                admo_title: "Votre figure"
                p5_buttons: null

        build:
            deprecation_level: "error"
            encrypted_js_data: true
            forbid_macros_override: true
            ignore_macros_plugin_diffs: false
            limit_pypi_install_to: null
            load_yaml_encoding: "utf-8"
            macros_with_indents: []
            meta_yaml_allow_extras: false
            meta_yaml_encoding: "utf-8"
            python_libs: ["py_libs"]
            skip_py_md_paths_names_validation: false
            tab_to_spaces: -1

        ides:
            ace_style_dark: "tomorrow_night_bright"
            ace_style_light: "crimson_editor"
            deactivate_stdout_for_secrets: true
            decrease_attempts_on_user_code_failure: "editor"
            editor_font_family: "monospace"
            editor_font_size: 15
            encrypt_alpha_mode: "direct"
            encrypt_corrections_and_rems: true
            export_zip_prefix: ""
            export_zip_with_names: false
            forbid_corr_and_REMs_with_infinite_attempts: true
            forbid_hidden_corr_and_REMs_without_secrets: true
            forbid_secrets_without_corr_or_REMs: true
            show_only_assertion_errors_for_secrets: false

        qcms:
            forbid_no_correct_answers_with_multi: true

        terms:
            cut_feedback: true
            stdout_cut_off: 200

        testing:
            empty_section_fallback: "skip"
            include: "null"
            load_buttons: null
            page: "test_ides"

        force_render_paths: ""
        include_dir: ""
        include_yaml: []
        j2_block_end_string: ""
        j2_block_start_string: ""
        j2_comment_end_string: ""
        j2_comment_start_string: ""
        j2_variable_end_string: ""
        j2_variable_start_string: ""
        module_name: "main"
        modules: []
        on_error_fail: false
        on_undefined: "keep"
        render_by_default: true
        verbose: false

Plugins : piĂšges Ă  Ă©viter#

Tous les plugins ne s'ignorent pas les uns les autres, et il peut parfois y avoir des interactions indésirables lors de leur enregistrement, voire des plantages durant un build/serve s'ils sont enregistrés dans un ordre inapproprié. Le problÚme principal étant que c'est en général à l'utilisateur de découvrir quel est le bon ordre...

Voici quelques informations glanées ici et là concernant les enregistrements des plugins.

Plugin Contrainte d'enregistrement
awesome-pages Toujours en premier (en fait, avant tags)
search Toujours en premier (ou juste aprĂšs awesome-pages / plugin de material)
tags Toujours aprĂšs awesome-pages / plugin de material
sqlite-console Toujours aprĂšs search et pyodide_macros
exclude-search Toujours aprĂšs search
glightbox Pas de contrainte au niveau de l'ordre de déclaration pour le plugin mkdocs-glightbox mais, s'il est utilisé, il faut ajouter la classe html skip_light_box dans l'option skip_classes afin que les boutons du thÚme soient affichés correctement.
Pour les versions de pyodide-mkdocs-theme antérieures à la v2.2.0

Gestion des plugins de mkdocs-material

Pour les versions strictement antĂ©rieures Ă  la 2.2.0, les plugins issus de mkdocs-material devaient ĂȘtre prĂ©fixĂ©s en leur ajoutant material/ lors de leur enregistrement dans mkdocs.yml:plugins :

    material/blog
    material/group
    material/info
    material/offline
    material/privacy
    material/search
    material/social
    material/tags

À partir de la version 2.2.0, c'est l'inverse : ces plugins doivent maintenant ĂȘtre enregistrĂ©s sans prĂ©fixes ou ils ne fonctionneront plus correctement.


Si la notion de dossier partials vous parle, vous pourriez ĂȘtre Ă©galement concernĂ©s par ceci :

À partir de la mĂȘme version, PMT utilise 2 nouvelles surcharges de fichiers de material, dans custom_dir/partials: content.html et header.html.
Voici pour rappel la liste complÚte des fichiers surchargés :

  • content.html
  • copyright.html
  • footer.html
  • header.html
  • social.html

Si vous avez surchargé l'un de ces fichiers, il vous faudra aller récupérer les versions utilisées dans PMT pour y inclure vos modifications.

L'option use_directory_urls#

Le thÚme fonctionne quel que soit le réglage utilisé pour l'option use_directory_urls (par défaut: true).

Le choix des noms de fichiers markdown de la documentation n'a pas non plus d'effet sur la façon de renseigner les fichiers python utilisés pour les macros du thÚme (IDE, IDEv, terminal, ...), quels que soient :

  • La valeur de l'option use_directory_urls.
  • Le nom du fichier markdown source: index.md ou mon_fichier.md (le second cas ayant un comportement Ă  part pour certaines opĂ©rations, lorsque use_directory_urls vaut true).


Construire une version locale de la documentation

Moyennant certaines contraintes Ă  respecter, il est possible de crĂ©er une version locale de la documentation, qui peut ĂȘtre ouverte directement dans un navigateur, aprĂšs avoir fait un mkdocs build.
Les réglages à modifier dans le fichier mkdocs.yml avant le build sont :

  1. site_url: ""
  2. use_directory_urls: false
  3. DĂ©sactiver le plugin de recherche (en commentant la ligne / Nota: le plugin n'empĂȘche pas le rendu, mais ne fonctionne pas normalement, dans cette situation).

Noter cependant qu'une connexion internet active reste indispensable au bon fonctionnement des pages : seul l'hébergement en ligne de la documentation est évité.