Aller au contenu

Des questions techniques et métaphysiques⚓︎

Versions⚓︎

0.8
  • Correctif majeur du système de sauvegarde des travaux élèves évitant le problème de doublons et IDE avec les mauvais énoncés : sur le navigateur, cliquer sur outils de développement puis dans la console javascript, écrivez : localStorage.clear().
  • Ajout d'un nouveau système de gestion des palettes de couleur et des modes jour/nuit. La palette de couleur utilisé par Pyodide-MkDocs est automatiquement la couleur primaire utilisé par le site sous MkDocs. Il est possible de spécifier les themes de coloration de l'éditeur ACE via le mkdocs.yml comme dans l'exemple ci-dessous :
    extra:
        ace_style: # https://ace.c9.io/build/kitchen-sink.html pour avoir plus de themes
            default: crimson_editor  # mode jour
            slate: tomorrow_night_bright   # mode nuit
            # slate: tomorrow_night_bright|youtube (si votre mode sombre est youtube par exemple)
    
  • Ajout d'un système d'activation/désactivation des tests publics.
  • Raccourci clavier pour autocomplétion modifié : AltTab ;
  • Correction affichage des tooltip pour les boutons ;
  • Correction bug existant avec IDE vide et disparition de ligne.

Todo list⚓︎

❌ QCM intégré à MkDocs

❌ intégration de drawSVG

❌ variable dans le mkdocs.yml pour positionner le fichier REM à l'endroit où on le souhaite

❌ Démarrer le comptage des 5 essais avant révélation du code si les premiers tests sont passés.

❌ La fenêtre d’édition est réservée au code de l’élève. Les premiers tests sont dans une fenêtre collée, juste en dessous, visible mais non éditable. Ils peuvent être masqués/affichés.

❌ Amélioration des performances d'affichage

❌ télécharger tous les codes écrits dans les éditeurs de la page en un seul fichier

❌ Doctests

✅ Rendre la couleur de l'IDE plus robuste aux changements de palette

✅ Adaptable size tooltip

✅ Toggle tests on/off

✅ Colorisation automatique de l'IDE

✅ Bug plusieurs onglets: voir

✅ Autocomplétion du code avec une touche simple (pas de Live autocomplétion -_-)

✅ eval désactivé en fonction de la présence du mot-clé SANS = 'eval,max' dans l'appel à IDE(..., SANS = ...). Prendre en compte les erreurs du créateur SANS = 'eval, MaX , min'.

✅ Erreur d'assertions et gestion de crash de code

  • Mode verbose pour les tests / mode simple
  • Mode infini pour les tentatives

✅ sauvegarde des codes lors d'un rechargement de la page (oui!!!!)

✅ gestion des fichiers d'initialisation (pour les codes longs)

✅ Le code solution apparait dans le code source... A cacher d'une manière ou d'une autre

✅ Mode sombre / Mode clair (réglage indépendant du choix de palette)

✅ Caractères non-ASCII pour nom de fichier et contenu

✅ Fichier de remarque, <nom_du_truc>_rem.txt

  • Solution en page externe pour les fichiers longs (exclue du menu de navigation avec le hack)
  • Solution en menu déroulant pour les fichiers courts

✅ Modifications des emoji par des svg classe

✅ Infobulles

✅ Chemins relatifs

✅ Nombre d'essais variés

En développement⚓︎

Inclure des fichiers externes avec macros fonctionnels

Jinja syntax to include an external remark file, including an IDE to give the correction :

{% include 'scripts/demo/demo2_rem.txt' %}

This is the future of the online judge

Can include automatically a correction. Needs lots of refactoring though ⏳⏳⏳.

REPL > IDE

Une reprise complète de la dénomination a été faite. Les REPL s'appellent maintenant (et à raison) IDE Merci Fred Leleu pour le travail supplémentaire 😍 .

Fichiers javascripts

C'est le bazar dans l'appel des fichiers JS. Si quelqu'un peut me mettre de l'ordre dans tout cela, je suis preneur !

J'ai repris l'organisation générale. C'est toujours un peu le bazar mais cela me semble acceptable.

Importation automatique de module

Pyodide propose un module micropip permettant de charger les modules manquants. Nous pourrions faire des interfaces graphiques à l'aide de cela mais est-ce vraiment utile ?

Evaluateur de code

Avec l'utilisation du code de fjunier, nous pourrions intégrer un juge en ligne ? Utile ou non ?

L'évaluateur de code est fonctionnel et permet de faire des benchmarks complexes.

Le bouton du juge en ligne n'apparaitra que s'il existe un fichier de benchmark test_nom_de_script.py.

Le corrigé n'apparaitra que si un fichier de corr_nom_de_script.py est présent.

Il faudra créer un pipe pour générer automatiquement un fichier de benchmark depuis un script de corrigé.

Javascript et IDE

La solution avec le -1 dans main.py, discutée dans le guide technique du IDE, est vraiment naze. Il faut trouver autre chose.

Je devais vraiment dormir. On peut tout simplement ajouter une ligne dans le template Jinja2 main.html du custom_dir de mkdocs. Cela permet de charger le javascript nécessaire au bon fonctionnement des IDE sans s'embêter.

Boutons et IDE

La solution avec le -1 dans main.py, discutée dans le guide technique du IDE, est vraiment naze. Il faut trouver autre chose.

Ajout de boutons permettant de télécharger les scripts écrits et téléverser les scripts disponibles localement. Evaluateur de code ajouté.

Partis pris⚓︎

Namespace partagé

Je trouve ce mode très pratique car on conserve nos fonctions et variables d'un terminal à l'autre au cours d'une leçon.

Pédagogiquement, c'est plus discutable car certaines variables seront initialisées dans le Terminal 1 et utilisées dans le Terminal 2. Cela cache la notion d'initialisation.

IDE vertical

Est-ce vraiment utile de les conserver ?

Cela ralentit le chargement de la page web et consomme des ressources pour l'auto-redimensionnement de la partie terminal du IDE. Cela est spécialement visible sur mobile (ou ce mode est d'ailleurs inutile).

Quelques modifications ont permis de les conserver sans altérer les performances.

macro Python

Ma solution est un peu sale mais a-t-on vraiment le choix avec l'inclusion de balise HTML ?

J'ai choisi de diviser le problème en sous-fonctions. Cela semble plus lisible à présent avec : lecture de fichier avec def read_ext_file() et def generate_content(), une seule macro IDE avec deux modes ('v' et 'h' par défaut).

Palette Ideas

// __md_scope=new URL(".",location) // __md_get=(e,=localStorage,t=__md_scope)=>JSON.parse(.getItem(t.pathname+"."+e)) // console.log('BLAM', __md_scope) // console.log('localStorage', localStorage) // console.log('localStorage 2', __md_scope.pathname+"."+"__palette") // console.log('localStorage 3', localStorage.getItem(__md_scope.pathname+"."+"__palette")) // console.log('localStorage 4', __md_get("__palette").index, __md_get("__palette").color.scheme)

Macros Plugin Environment⚓︎

General List⚓︎

All available variables and filters within the macros plugin:

Variable Type Content
extra dict social = [{'icon': 'fontawesome/solid/paper-plane', 'link': 'mailto:prof-bouillot@protonmail.com', 'name': "Écrire à l'auteur"}], site_url = 'https://bouillotvincent.gitlab.io/pyodide-mkdocs/', ace_style [dict]
config MkDocsConfig {'config_file_path': '/builds/bouillotvincent/pyodide-mkdocs/mkdocs.yml', 'site_name': 'Terminal et IDE dans MkDocs', 'nav': [{'Terminal ▶️ et IDE 🖥 dans MkDocs': 'index.md'}, {'Guide du Terminal ⌨️': 'install_term.md'}, {"Guide de l'IDE 🐍": 'install_ide.md'}, {'Avancé ⭐️': 'advanced.md'}, {'Changelog 🧾': 'CHANGELOG.md'}, {'Bac à sable 🧾': 'sandbox.md'}], 'pages': None, 'site_url': 'https://bouillotvincent.gitlab.io/pyodide-mkdocs/', 'site_description': 'Tutoriel pour un IDE et un Terminal dans MkDocs Material', 'site_author': None, 'theme': Theme(name='material', dirs=['/builds/bouillotvincent/pyodide-mkdocs/my_theme_customizations/', '/usr/local/lib/python3.11/site-packages/material', '/usr/local/lib/python3.11/site-packages/mkdocs/templates'], static_templates=['404.html', 'sitemap.xml'], name='material', locale=Locale(language='en', territory=''), language='fr', direction=None, features=['navigation.instant', 'navigation.tabs', 'navigation.tabs.sticky', 'navigation.sections', 'navigation.tracking', 'navigation.top', 'toc.integrate'], palette=[{'media': '(prefers-color-scheme: light)', 'scheme': 'slate', 'primary': 'blue', 'accent': 'blue', 'toggle': {'icon': 'material/weather-night', 'name': 'Passer au mode jour'}}, {'media': '(prefers-color-scheme: dark)', 'scheme': 'default', 'primary': 'indigo', 'accent': 'indigo', 'toggle': {'icon': 'material/weather-sunny', 'name': 'Passer au mode nuit'}}], font=False, icon=None, favicon='assets/icon-py-mkdocs-color.png', logo='assets/thick-apacheairflow.svg'), 'docs_dir': '/builds/bouillotvincent/pyodide-mkdocs/docs', 'site_dir': '/builds/bouillotvincent/pyodide-mkdocs/public', 'copyright': 'Copyleft 🄯 2021 Vincent BOUILLOT\n', 'google_analytics': None, 'dev_addr': _IpAddressValue(host='127.0.0.1', port=8000), 'use_directory_urls': True, 'repo_url': 'https://gitlab.com/bouillotvincent/pyodide-mkdocs', 'repo_name': 'GitLab', 'edit_uri_template': None, 'edit_uri': 'tree/main/docs/', 'extra_css': ['xtra/stylesheets/ajustements.css'], 'extra_javascript': ['javascripts/config.js', 'https://polyfill.io/v3/polyfill.min.js?features=es6', 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'], 'extra_templates': [], 'markdown_extensions': ['toc', 'tables', 'fenced_code', 'meta', 'abbr', 'def_list', 'attr_list', 'footnotes', 'admonition', 'pymdownx.details', 'pymdownx.caret', 'pymdownx.mark', 'pymdownx.tilde', 'pymdownx.highlight', 'pymdownx.inlinehilite', 'pymdownx.snippets', 'pymdownx.tasklist', 'pymdownx.tabbed', 'pymdownx.superfences', 'pymdownx.keys', 'pymdownx.emoji', 'pymdownx.arithmatex'], 'mdx_configs': {'pymdownx.tasklist': {'custom_checkbox': True, 'clickable_checkbox': True}, 'pymdownx.tabbed': {'alternate_style': True}, 'pymdownx.superfences': {'preserve_tabs': True}, 'pymdownx.keys': {'separator': '+'}, 'pymdownx.emoji': {'emoji_index': , 'emoji_generator': }, 'pymdownx.arithmatex': {'generic': True}, 'toc': {'permalink': '⚓︎', 'toc_depth': 3}}, 'strict': False, 'remote_branch': 'gh-pages', 'remote_name': 'origin', 'extra': {'social': [{'icon': 'fontawesome/solid/paper-plane', 'link': 'mailto:prof-bouillot@protonmail.com', 'name': "Écrire à l'auteur"}], 'site_url': 'https://bouillotvincent.gitlab.io/pyodide-mkdocs/', 'ace_style': {'default': 'crimson_editor', 'slate': 'tomorrow_night_bright'}}, 'plugins': {'material/search': , 'macros': }, 'hooks': {}, 'watch': []}
environment dict system = 'Linux', system_version = '5.4.109+', python_version = '3.11.2', mkdocs_version = '1.4.2', macros_plugin_version = '0.7.0', jinja2_version = '3.1.2'
plugin LegacyConfig {'module_name': 'main', 'modules': [], 'include_dir': '', 'include_yaml': [], 'j2_block_start_string': '', 'j2_block_end_string': '', 'j2_variable_start_string': '', 'j2_variable_end_string': '', 'on_undefined': 'keep', 'on_error_fail': False, 'verbose': False}
git dict status = True, date [datetime], short_commit = '56895b7', commit = '56895b782fb302fc865a7245d01459c486b5777e', tag = '', author = 'Vincent Bouillot', author_email = 'vincent.bouillot@rx-solutions.com', committer = 'Vincent Bouillot', committer_email = 'vincent.bouillot@rx-solutions.com', date_ISO = 'Thu Mar 30 20:38:10 2023 +0000', message = '[MINOR] IDE : When creating a function inside a class, it fails.', raw = 'commit 56895b782fb302fc865a7245d01459c486b5777e\nAuthor: Vincent Bouillot \nDate: Thu Mar 30 20:38:10 2023 +0000\n\n [MINOR] IDE : When creating a function inside a class, it fails.', root_dir = '/builds/bouillotvincent/pyodide-mkdocs'
social list [{'icon': 'fontawesome/solid/paper-plane', 'link': 'mailto:prof-bouillot@protonmail.com', 'name': "Écrire à l'auteur"}]
site_url str 'https://bouillotvincent.gitlab.io/pyodide-mkdocs/'
ace_style dict default = 'crimson_editor', slate = 'tomorrow_night_bright'
compteur_exo int 0
term_counter int 2
IDE_counter int 4
macros SuperDict context [function], macros_info [function], now [function], fix_url [function], script [function], py [function], html_fig [function], exercice [function], cours [function], ext [function], tit [function], terminal [function], IDEv [function], create_button [function], insert_remark_file [function], IDE [function], mult_col [function], qcm [function], multi_qcm [function]
filters dict pretty [function]
filters_builtin dict abs [builtin_function_or_method], attr [function], batch [function], capitalize [function], center [function], count [builtin_function_or_method], d [function], default [function], dictsort [function], e [builtin_function_or_method], escape [builtin_function_or_method], filesizeformat [function], first [function], float [function], forceescape [function], format [function], groupby [function], indent [function], int [function], join [function], last [function], length [builtin_function_or_method], list [function], lower [function], items [function], map [function], min [function], max [function], pprint [function], random [function], reject [function], rejectattr [function], replace [function], reverse [function], round [function], safe [function], select [function], selectattr [function], slice [function], sort [function], string [builtin_function_or_method], striptags [function], sum [function], title [function], trim [function], truncate [function], unique [function], upper [function], urlencode [function], urlize [function], wordcount [function], wordwrap [function], xmlattr [function], tojson [function]
navigation Navigation Page(title='Terminal ▶️ et IDE 🖥 dans MkDocs', url='/pyodide-mkdocs/')
Page(title='Guide du Terminal ⌨️', url='/pyodide-mkdocs/install_term/')
Page(title='Guide de l'IDE 🐍', url='/pyodide-mkdocs/install_ide/')
Page(title='Avancé ⭐️', url='/pyodide-mkdocs/advanced/')
Page(title='Changelog 🧾', url='/pyodide-mkdocs/CHANGELOG/')
Page(title='Bac à sable 🧾', url='/pyodide-mkdocs/sandbox/')
files Files
page Page Page(title='Des questions techniques et métaphysiques', url='/pyodide-mkdocs/todo/')

Config Information⚓︎

Standard MkDocs configuration information. Do not try to modify.

e.g. {{ config.docs_dir }}

See also the MkDocs documentation on the config object.

Variable Type Content
config_file_path str '/builds/bouillotvincent/pyodide-mkdocs/mkdocs.yml'
site_name str 'Terminal et IDE dans MkDocs'
nav list [{'Terminal ▶️ et IDE 🖥 dans MkDocs': 'index.md'}, {'Guide du Terminal ⌨️': 'install_term.md'}, {"Guide de l'IDE 🐍": 'install_ide.md'}, {'Avancé ⭐️': 'advanced.md'}, {'Changelog 🧾': 'CHANGELOG.md'}, {'Bac à sable 🧾': 'sandbox.md'}]
pages NoneType None
site_url str 'https://bouillotvincent.gitlab.io/pyodide-mkdocs/'
site_description str 'Tutoriel pour un IDE et un Terminal dans MkDocs Material'
site_author NoneType None
theme Theme Theme(name='material', dirs=['/builds/bouillotvincent/pyodide-mkdocs/my_theme_customizations/', '/usr/local/lib/python3.11/site-packages/material', '/usr/local/lib/python3.11/site-packages/mkdocs/templates'], static_templates=['404.html', 'sitemap.xml'], name='material', locale=Locale(language='en', territory=''), language='fr', direction=None, features=['navigation.instant', 'navigation.tabs', 'navigation.tabs.sticky', 'navigation.sections', 'navigation.tracking', 'navigation.top', 'toc.integrate'], palette=[{'media': '(prefers-color-scheme: light)', 'scheme': 'slate', 'primary': 'blue', 'accent': 'blue', 'toggle': {'icon': 'material/weather-night', 'name': 'Passer au mode jour'}}, {'media': '(prefers-color-scheme: dark)', 'scheme': 'default', 'primary': 'indigo', 'accent': 'indigo', 'toggle': {'icon': 'material/weather-sunny', 'name': 'Passer au mode nuit'}}], font=False, icon=None, favicon='assets/icon-py-mkdocs-color.png', logo='assets/thick-apacheairflow.svg')
docs_dir str '/builds/bouillotvincent/pyodide-mkdocs/docs'
site_dir str '/builds/bouillotvincent/pyodide-mkdocs/public'
copyright str 'Copyleft 🄯 2021 Vincent BOUILLOT\n'
google_analytics NoneType None
dev_addr _IpAddressValue _IpAddressValue(host='127.0.0.1', port=8000)
use_directory_urls bool True
repo_url str 'https://gitlab.com/bouillotvincent/pyodide-mkdocs'
repo_name str 'GitLab'
edit_uri_template NoneType None
edit_uri str 'tree/main/docs/'
extra_css list ['xtra/stylesheets/ajustements.css']
extra_javascript list ['javascripts/config.js', 'https://polyfill.io/v3/polyfill.min.js?features=es6', 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js']
extra_templates list []
markdown_extensions list ['toc', 'tables', 'fenced_code', 'meta', 'abbr', 'def_list', 'attr_list', 'footnotes', 'admonition', 'pymdownx.details', 'pymdownx.caret', 'pymdownx.mark', 'pymdownx.tilde', 'pymdownx.highlight', 'pymdownx.inlinehilite', 'pymdownx.snippets', 'pymdownx.tasklist', 'pymdownx.tabbed', 'pymdownx.superfences', 'pymdownx.keys', 'pymdownx.emoji', 'pymdownx.arithmatex']
mdx_configs dict pymdownx.tasklist [dict], pymdownx.tabbed [dict], pymdownx.superfences [dict], pymdownx.keys [dict], pymdownx.emoji [dict], pymdownx.arithmatex [dict], toc [dict]
strict bool False
remote_branch str 'gh-pages'
remote_name str 'origin'
extra LegacyConfig {'social': [{'icon': 'fontawesome/solid/paper-plane', 'link': 'mailto:prof-bouillot@protonmail.com', 'name': "Écrire à l'auteur"}], 'site_url': 'https://bouillotvincent.gitlab.io/pyodide-mkdocs/', 'ace_style': {'default': 'crimson_editor', 'slate': 'tomorrow_night_bright'}}
plugins PluginCollection material/search [SearchPlugin], macros [MacrosPlugin]
hooks dict
watch list []

Macros⚓︎

These macros have been defined programmatically for this environment (module or pluglets).

Variable Type Content
{'context': .context at 0x7f005e96e700>, 'macros_info': .macros_info at 0x7f005e96e7a0>, 'now': .now at 0x7f005e96e8e0>, 'fix_url': , 'script': .script at 0x7f005e96dee0>, 'py': .py at 0x7f005e96e2a0>, 'html_fig': .html_fig at 0x7f005e96e160>, 'exercice': .exercice at 0x7f005e96dc60>, 'cours': .cours at 0x7f005e96dda0>, 'ext': .ext at 0x7f005e96de40>, 'tit': .tit at 0x7f005e96d940>, 'terminal': .terminal at 0x7f005e96dbc0>, 'IDEv': .IDEv at 0x7f005e7f4900>, 'create_button': .create_button at 0x7f005e7f4a40>, 'insert_remark_file': .insert_remark_file at 0x7f005e7f4fe0>, 'IDE': .IDE at 0x7f005e7f51c0>, 'mult_col': .mult_col at 0x7f005e7f5260>, 'qcm': .qcm at 0x7f005e7f5440>, 'multi_qcm': .multi_qcm at 0x7f005e7f5620>} SuperDict {'context': .context at 0x7f005e96e700>, 'macros_info': .macros_info at 0x7f005e96e7a0>, 'now': .now at 0x7f005e96e8e0>, 'fix_url': , 'script': .script at 0x7f005e96dee0>, 'py': .py at 0x7f005e96e2a0>, 'html_fig': .html_fig at 0x7f005e96e160>, 'exercice': .exercice at 0x7f005e96dc60>, 'cours': .cours at 0x7f005e96dda0>, 'ext': .ext at 0x7f005e96de40>, 'tit': .tit at 0x7f005e96d940>, 'terminal': .terminal at 0x7f005e96dbc0>, 'IDEv': .IDEv at 0x7f005e7f4900>, 'create_button': .create_button at 0x7f005e7f4a40>, 'insert_remark_file': .insert_remark_file at 0x7f005e7f4fe0>, 'IDE': .IDE at 0x7f005e7f51c0>, 'mult_col': .mult_col at 0x7f005e7f5260>, 'qcm': .qcm at 0x7f005e7f5440>, 'multi_qcm': .multi_qcm at 0x7f005e7f5620>}

Git Information⚓︎

Information available on the last commit and the git repository containing the documentation project:

e.g. {{ git.message }}

Variable Type Content
status bool True
date datetime datetime.datetime(2023, 3, 30, 20, 38, 10, tzinfo=tzlocal())
short_commit str '56895b7'
commit str '56895b782fb302fc865a7245d01459c486b5777e'
tag str ''
author str 'Vincent Bouillot'
author_email str 'vincent.bouillot@rx-solutions.com'
committer str 'Vincent Bouillot'
committer_email str 'vincent.bouillot@rx-solutions.com'
date_ISO str 'Thu Mar 30 20:38:10 2023 +0000'
message str '[MINOR] IDE : When creating a function inside a class, it fails.'
raw str 'commit 56895b782fb302fc865a7245d01459c486b5777e\nAuthor: Vincent Bouillot \nDate: Thu Mar 30 20:38:10 2023 +0000\n\n [MINOR] IDE : When creating a function inside a class, it fails.'
root_dir str '/builds/bouillotvincent/pyodide-mkdocs'

Page Attributes⚓︎

Provided by MkDocs. These attributes change for every page (the attributes shown are for this page).

e.g. {{ page.title }}

See also the MkDocs documentation on the page object.

Variable Type Content
file File page [Page], src_uri = 'todo.md', abs_src_path = '/builds/bouillotvincent/pyodide-mkdocs/docs/todo.md', name = 'todo', dest_uri = 'todo/index.html', abs_dest_path = '/builds/bouillotvincent/pyodide-mkdocs/public/todo/index.html', url = 'todo/'
title str 'Des questions techniques et métaphysiques'
parent NoneType None
children NoneType None
previous_page NoneType None
next_page NoneType None
_Page__active bool False
update_date str '2023-03-30'
canonical_url str 'https://bouillotvincent.gitlab.io/pyodide-mkdocs/todo/'
abs_url str '/pyodide-mkdocs/todo/'
edit_url str 'https://gitlab.com/bouillotvincent/pyodide-mkdocs/tree/main/docs/todo.md'
markdown str '# Des questions techniques et métaphysiques\n\n## Versions\n\n???+ warning "0.8"\n\n === "Ajouts majeurs"\n - Correctif majeur du système de sauvegarde des travaux élèves évitant le problème de doublons et IDE avec les mauvais énoncés : sur le navigateur, cliquer sur outils de développement puis dans la console javascript, écrivez : localStorage.clear().\n - Ajout d\'un nouveau système de gestion des palettes de couleur et des modes jour/nuit. La palette de couleur utilisé par Pyodide-MkDocs est automatiquement la couleur primaire utilisé par le site sous MkDocs. \n Il est possible de spécifier les themes de coloration de l\'éditeur ACE via le `mkdocs.yml` comme dans l\'exemple ci-dessous :\n ```yml\n extra:\n ace_style: # https://ace.c9.io/build/kitchen-sink.html pour avoir plus de themes\n default: crimson_editor # mode jour\n slate: tomorrow_night_bright # mode nuit\n # slate: tomorrow_night_bright|youtube (si votre mode sombre est youtube par exemple)\n ```\n - Ajout d\'un système d\'activation/désactivation des tests publics. \n\n === "Ajouts mineurs"\n - Raccourci clavier pour autocomplétion modifié : ++alt+tab++ ;\n - Correction affichage des tooltip pour les boutons ;\n - Correction bug existant avec IDE vide et disparition de ligne.\n\n## Todo list\n\n:x: QCM intégré à MkDocs\n\n:x: intégration de drawSVG\n\n:x: variable dans le mkdocs.yml pour positionner le fichier REM à l\'endroit où on le souhaite\n\n:x: Démarrer le comptage des 5 essais avant révélation du code si les premiers tests sont passés.\n\n:x: La fenêtre d’édition est réservée au code de l’élève. Les premiers tests sont dans une fenêtre collée, juste en dessous, visible mais non éditable. Ils peuvent être masqués/affichés.\n\n:x: Amélioration des performances d\'affichage\n\n:x: télécharger tous les codes écrits dans les éditeurs de la page en un seul fichier\n\n:x: Doctests\n\n:white_check_mark: Rendre la couleur de l\'IDE plus robuste aux changements de palette\n\n:white_check_mark: Adaptable size tooltip\n\n:white_check_mark: Toggle tests on/off\n\n:white_check_mark: Colorisation automatique de l\'IDE\n\n:white_check_mark: Bug plusieurs onglets: [voir](https://mooc-forums.inria.fr/moocnsi/t/re-pyodide-mkdocs/5715/4)\n\n:white_check_mark: Autocomplétion du code avec une touche simple (pas de Live autocomplétion -_-)\n\n:white_check_mark: `#!python eval` désactivé en fonction de la présence du mot-clé `#!md SANS = \'eval,max\'` dans l\'appel à `#!md IDE(..., SANS = ...)`. Prendre en compte les erreurs du créateur `#!md SANS = \'eval, MaX , min\'`.\n\n:white_check_mark: Erreur d\'assertions et gestion de crash de code\n\n- [x] Mode verbose pour les tests / mode simple\n- [x] Mode infini pour les tentatives\n\n:white_check_mark: sauvegarde des codes lors d\'un rechargement de la page (oui!!!!)\n\n:white_check_mark: gestion des fichiers d\'initialisation (pour les codes longs)\n\n:white_check_mark: Le code solution apparait dans le code source... A cacher d\'une manière ou d\'une autre\n\n:white_check_mark: Mode sombre / Mode clair (réglage indépendant du choix de palette)\n\n:white_check_mark: Caractères non-ASCII pour nom de fichier et contenu\n\n:white_check_mark: Fichier de remarque, `_rem.txt` \n\n- [x] Solution en page externe pour les fichiers longs (exclue du menu de navigation avec le hack)\n- [x] Solution en menu déroulant pour les fichiers courts\n\n:white_check_mark: Modifications des emoji par des svg classe\n\n:white_check_mark: Infobulles\n\n:white_check_mark: Chemins relatifs\n\n:white_check_mark: Nombre d\'essais variés\n\n\n## En développement\n\n!!! help "Inclure des fichiers externes avec macros fonctionnels"\n\n Jinja syntax to include an external remark file, including an IDE to give the correction :\n\n ```{{ "{% include \'scripts/demo/demo2_rem.txt\' %}" }}```\n\n This is the future of the online judge\n\n Can include automatically a correction. Needs lots of refactoring though ⏳⏳⏳. \n\n\n!!! success "REPL > IDE"\n\n Une reprise complète de la dénomination a été faite. Les REPL s\'appellent maintenant (et à raison) [IDE](https://fr.wikipedia.org/wiki/Environnement_de_développement "Définition IDE") Merci Fred Leleu pour le travail supplémentaire 😍 .\n\n!!! success "Fichiers javascripts"\n\n ~~C\'est le bazar dans l\'appel des fichiers JS. Si quelqu\'un peut me mettre de l\'ordre dans tout cela, je suis preneur !~~\n\n J\'ai repris l\'organisation générale. C\'est toujours un peu le bazar mais cela me semble acceptable.\n\n\n!!! help "Importation automatique de module"\n\n Pyodide propose un module `#!python micropip` permettant de charger les modules manquants. Nous pourrions faire des interfaces graphiques à l\'aide de cela mais est-ce vraiment utile ? \n\n!!! success "Evaluateur de code"\n\n ~~Avec l\'utilisation du code de [fjunier](https://mooc-forums.inria.fr/moocnsi/t/mkdocs-une-solution-ideale/1758/175), nous pourrions intégrer un juge en ligne ? Utile ou non ?~~\n\n L\'évaluateur de code est fonctionnel et permet de faire des benchmarks complexes.\n \n Le bouton du juge en ligne n\'apparaitra que s\'il existe un fichier de benchmark **`test_nom_de_script.py`**.\n\n Le corrigé n\'apparaitra que si un fichier de **`corr_nom_de_script.py`** est présent.\n\n Il faudra créer un pipe pour générer automatiquement un fichier de benchmark depuis un script de corrigé.\n\n\n!!! success "Javascript et IDE"\n\n ~~La solution avec le -1 dans `main.py`, discutée dans le guide technique du IDE, est vraiment naze. Il faut trouver autre chose.~~\n \n Je devais vraiment dormir. On peut tout simplement ajouter une ligne dans le template Jinja2 `main.html` du `custom_dir` de mkdocs. Cela permet de charger le javascript nécessaire au bon fonctionnement des IDE sans s\'embêter.\n\n!!! success "Boutons et IDE"\n\n ~~La solution avec le -1 dans `main.py`, discutée dans le guide technique du IDE, est vraiment naze. Il faut trouver autre chose.~~\n \n Ajout de boutons permettant de télécharger les scripts écrits et téléverser les scripts disponibles localement. Evaluateur de code ajouté.\n\n\n## Partis pris\n\n!!! warning "_Namespace_ partagé"\n \n Je trouve ce mode très pratique car on conserve nos fonctions et variables d\'un terminal à l\'autre au cours d\'une leçon. \n \n Pédagogiquement, c\'est plus discutable car certaines variables seront initialisées dans le Terminal 1 et utilisées dans le Terminal 2. Cela cache la notion d\'initialisation.\n\n!!! success "IDE vertical"\n\n Est-ce vraiment utile de les conserver ?\n \n ~~Cela ralentit le chargement de la page web et consomme des ressources pour l\'auto-redimensionnement de la partie terminal du IDE. Cela est spécialement visible sur mobile (ou ce mode est d\'ailleurs inutile).~~\n\n Quelques modifications ont permis de les conserver sans altérer les performances. \n\n!!! success "macro Python"\n\n ~~Ma solution est un peu sale mais a-t-on vraiment le choix avec l\'inclusion de balise HTML ?~~\n\n J\'ai choisi de diviser le problème en sous-fonctions. Cela semble plus lisible à présent avec : lecture de fichier avec `#!python def read_ext_file()` et `#!python def generate_content()`, une seule macro IDE avec deux modes (\'v\' et \'h\' par défaut).\n\n!!! warning "Palette Ideas"\n\n // __md_scope=new URL(".",location)\n // __md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e))\n // console.log(\'BLAM\', __md_scope)\n // console.log(\'localStorage\', localStorage)\n // console.log(\'localStorage 2\', __md_scope.pathname+"."+"__palette")\n // console.log(\'localStorage 3\', localStorage.getItem(__md_scope.pathname+"."+"__palette"))\n // console.log(\'localStorage 4\', __md_get("__palette").index, __md_get("__palette").color.scheme)\n\n{{ macros_info() }}\n\n'
content NoneType None
toc list []
meta dict

To have all titles of all pages, use:

{% for page in navigation.pages %}
- {{ page.title }}
{% endfor %}

Plugin Filters⚓︎

These filters are provided as a standard by the macros plugin.

Variable Type Content
pretty function (var_list, rows, header, e)

Default mkdocs_macro Prettify a dictionary or object (used for environment documentation, or debugging).

Builtin Jinja2 Filters⚓︎

These filters are provided by Jinja2 as a standard.

See also the Jinja2 documentation on builtin filters).

Variable Type Content
abs builtin_function_or_method

Return the absolute value of the argument.

attr function (environment, obj, name, value)

Get an attribute of an object. foo|attr("bar") works like foo.bar just that always an attribute is returned and items are not looked up.

batch function (value, linecount, fill_with, tmp, item)

A filter that batches items. It works pretty much like slice just the other way round. It returns a list of lists with the given number of items. If you provide a second parameter this is used to fill up missing items. See this example.

capitalize function (s)

Capitalize a value. The first character will be uppercase, all others lowercase.

center function (value, width)

Centers the value in a field of a given width.

count builtin_function_or_method

Return the number of items in a container.

d function (value, default_value, boolean)

If the value is undefined it will return the passed default value, otherwise the value of the variable.

default function (value, default_value, boolean)

If the value is undefined it will return the passed default value, otherwise the value of the variable.

dictsort function (value, case_sensitive, by, reverse, sort_func)

Sort a dict and yield (key, value) pairs. Python dicts may not be in the order you want to display them in, so sort them first.

e builtin_function_or_method

Replace the characters &, <, >, ', and " in the string with HTML-safe sequences. Use this if you need to display text that might contain such characters in HTML.

escape builtin_function_or_method

Replace the characters &, <, >, ', and " in the string with HTML-safe sequences. Use this if you need to display text that might contain such characters in HTML.

filesizeformat function (value, binary, bytes, base, prefixes, i, prefix, unit)

Format the value like a 'human-readable' file size (i.e. 13 kB, 4.1 MB, 102 Bytes, etc). Per default decimal prefixes are used (Mega, Giga, etc.), if the second parameter is set to True the binary prefixes are used (Mebi, Gibi).

first function (args, kwargs, b)

Return the first item of a sequence.

float function (value, default)

Convert the value into a floating point number. If the conversion doesn't work it will return 0.0. You can override this default using the first parameter.

forceescape function (value)

Enforce HTML escaping. This will probably double escape variables.

format function (value, args, kwargs)

Apply the given values to a printf-style_ format string, like string % values.

groupby function (args, kwargs, b)

Group a sequence of objects by an attribute using Python's :func:itertools.groupby. The attribute can use dot notation for nested access, like "address.city". Unlike Python's groupby, the values are sorted first so only one group is returned for each unique value.

indent function (s, width, first, blank, newline, rv, lines)

Return a copy of the string with each line indented by 4 spaces. The first line and blank lines are not indented by default.

int function (value, default, base)

Convert the value into an integer. If the conversion doesn't work it will return 0. You can override this default using the first parameter. You can also override the default base (10) in the second parameter, which handles input with prefixes such as 0b, 0o and 0x for bases 2, 8 and 16 respectively. The base is ignored for decimal numbers and non-string values.

join function (args, kwargs, b)

Return a string which is the concatenation of the strings in the sequence. The separator between elements is an empty string per default, you can define it with the optional parameter.

last function (environment, seq)

Return the last item of a sequence.

length builtin_function_or_method

Return the number of items in a container.

list function (args, kwargs, b)

Convert the value into a list. If it was a string the returned list will be a list of characters.

lower function (s)

Convert a value to lowercase.

items function (value)

Return an iterator over the (key, value) items of a mapping.

map function (args, kwargs, b)

Applies a filter on a sequence of objects or looks up an attribute. This is useful when dealing with lists of objects but you are really only interested in a certain value of it.

min function (environment, value, case_sensitive, attribute)

Return the smallest item from the sequence.

max function (environment, value, case_sensitive, attribute)

Return the largest item from the sequence.

pprint function (value)

Pretty print a variable. Useful for debugging.

random function (context, seq)

Return a random item from the sequence.

reject function (args, kwargs, b)

Filters a sequence of objects by applying a test to each object, and rejecting the objects with the test succeeding.

rejectattr function (args, kwargs, b)

Filters a sequence of objects by applying a test to the specified attribute of each object, and rejecting the objects with the test succeeding.

replace function (eval_ctx, s, old, new, count)

Return a copy of the value with all occurrences of a substring replaced with a new one. The first argument is the substring that should be replaced, the second is the replacement string. If the optional third argument count is given, only the first count occurrences are replaced.

reverse function (value, rv, e)

Reverse the object or return an iterator that iterates over it the other way round.

round function (value, precision, method, func)

Round the number to a given precision. The first parameter specifies the precision (default is 0), the second the rounding method.

safe function (value)

Mark the value as safe which means that in an environment with automatic escaping enabled this variable will not be escaped.

select function (args, kwargs, b)

Filters a sequence of objects by applying a test to each object, and only selecting the objects with the test succeeding.

selectattr function (args, kwargs, b)

Filters a sequence of objects by applying a test to the specified attribute of each object, and only selecting the objects with the test succeeding.

slice function (args, kwargs, b)

Slice an iterator and return a list of lists containing those items. Useful if you want to create a div containing three ul tags that represent columns.

sort function (environment, value, reverse, case_sensitive, attribute, key_func)

Sort an iterable using Python's :func:sorted.

string builtin_function_or_method

Convert an object to a string if it isn't already. This preserves a :class:Markup string rather than converting it back to a basic string, so it will still be marked as safe and won't be escaped again.

striptags function (value)

Strip SGML/XML tags and replace adjacent whitespace by one space.

sum function (args, kwargs, b)

Returns the sum of a sequence of numbers plus the value of parameter 'start' (which defaults to 0). When the sequence is empty it returns start.

title function (s)

Return a titlecased version of the value. I.e. words will start with uppercase letters, all remaining characters are lowercase.

trim function (value, chars)

Strip leading and trailing characters, by default whitespace.

truncate function (env, s, length, killwords, end, leeway, result)

Return a truncated copy of the string. The length is specified with the first parameter which defaults to 255. If the second parameter is true the filter will cut the text at length. Otherwise it will discard the last word. If the text was in fact truncated it will append an ellipsis sign ("..."). If you want a different ellipsis sign than "..." you can specify it using the third parameter. Strings that only exceed the length by the tolerance margin given in the fourth parameter will not be truncated.

unique function (environment, value, case_sensitive, attribute, getter, seen, item, key)

Returns a list of unique items from the given iterable.

upper function (s)

Convert a value to uppercase.

urlencode function (value, items)

Quote data for use in a URL path or query using UTF-8.

urlize function (eval_ctx, value, trim_url_limit, nofollow, target, rel, extra_schemes, policies, rel_parts, scheme, rv)

Convert URLs in text into clickable links.

wordcount function (s)

Count the words in that string.

wordwrap function (environment, s, width, break_long_words, wrapstring, break_on_hyphens)

Wrap a string to the given width. Existing newlines are treated as paragraphs to be wrapped separately.

xmlattr function (eval_ctx, d, autospace, rv)

Create an SGML/XML attribute string based on the items in a dict. All values that are neither none nor undefined are automatically escaped.

tojson function (eval_ctx, value, indent, policies, dumps, kwargs)

Serialize an object to a string of JSON, and mark it safe to render in HTML. This filter is only for use in HTML documents.