pyodide-mkdocs-theme 5.6.5__tar.gz → 5.6.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/PKG-INFO +1 -1
- pyodide_mkdocs_theme-5.6.8/pyodide_mkdocs_theme/__version__.py +1 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/base0_extractors.py +21 -11
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/html_builder/_html_builder.py +10 -3
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_base.py +3 -3
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_files.py +11 -1
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/definitions/macros_configs.py +2 -2
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/test_cases.py +1 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/functoolsUi.js +5 -2
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/2-0-runnersManager-runners.js +3 -4
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/2-pyodideSectionsRunner-runner-pyodide.js +35 -38
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/3-terminalRunner-term.js +3 -3
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/4-0-idesManager-ide.js +2 -2
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/4-ideLogistic-ide.js +27 -18
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/4-ideRunner-ide.js +33 -26
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/6-idePlayground-playground.js +2 -1
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyproject.toml +1 -1
- pyodide_mkdocs_theme-5.6.5/pyodide_mkdocs_theme/__version__.py +0 -1
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/LICENSE +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/README.md +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/p5/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/p5/cdns.txt +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/p5v2/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/p5v2/cdns.txt +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/vis/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/vis/cdns.txt +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/vis_network/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/vis_network/cdns.txt +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/__main__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/basthon_p5_to_pmt.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/exceptions.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/_inclusions_tools.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/base1_contents_extractor.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/base2_inclusions.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/base3_generic_extractors.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/concrete_extractors.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/html_builder/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/html_dependencies/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/html_dependencies/deps.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/html_dependencies/deps_class.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/indent_parser.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/figure.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_ide.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_manager.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_playground.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_py_btn.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_run_macro.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_term_ide.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_terminal.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_tester.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/py_script.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/qcm.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/runners_macros.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/classes.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/de_lang.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/en_lang.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/fr_lang.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/proxy.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/parsing.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/paths_utils.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/config.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_contracts.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_indent.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_macros.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_meta.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_templates.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/pyodide_macros_plugin.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/_string_tools_and_constants.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/common_tree_src.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/config_option_src.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/definitions/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/definitions/docs_dirs_config.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/definitions/plugin_config.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/definitions/sub_configs.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/dumpers.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/lang_src.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/macro_config_src.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/plugin_config_src.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/sub_config_src.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/ide_tests.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/macros_data.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/maestro_tools.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/options_alterations.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/pages_and_macros_py_configs.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/pyodide_logger.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/tools_and_constants.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/de/docs/exo.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/de/docs/index.md +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/de/mkdocs.yml +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/en/docs/exo.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/en/docs/index.md +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/en/mkdocs.yml +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/fr/docs/exo.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/fr/docs/index.md +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/fr/mkdocs.yml +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/.gitignore +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/main.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/mkdocs.yml +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/pyodide_plot.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/requirements.txt +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/toolbox.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/README.md +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/__init__.py +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/.qcm-circle.svg +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-check-64.png +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-download-64.png +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-pause-64.png +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-play-64.png +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-restart-64.png +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-save-64.png +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-step-64.png +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-stop-64.png +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-upload-64.png +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-zip-64.png +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/base_pmt.html +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/0-config.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/0-legacy-subscriber.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/functools.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/functoolsStorage.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/functoolsTxt.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/functoolsUiBuilder.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/jsLogger.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/mathjax-libs.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/process_and_gui.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/0-generic-python-snippets-pyodide.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/1-error_logs-pyodide.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/1-packagesInstaller-install-pyodide.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/1-runtimeManager-runtime-pyodide.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/3-btnRunner-py_btn.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/5-2-virtualizer-ides_test.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/5-3-avl-ides_test.mjs +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/5-ideTester-ides_test.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/qcms-qcm.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/start-pyodide.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-scripts/overlord.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-scripts/subscriptions.js +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/main.html +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/mkdocs_theme.yml +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/partials/content.html +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/partials/copyright.html +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/partials/footer.html +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/partials/header.html +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/partials/social.html +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/0-generic.css +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/btns-header.css +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/history.css +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/hourglass.css +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/ide.css +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/qcm.css +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/terminal.css +0 -0
- {pyodide_mkdocs_theme-5.6.5 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/testing.css +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pyodide-mkdocs-theme
|
|
3
|
-
Version: 5.6.
|
|
3
|
+
Version: 5.6.8
|
|
4
4
|
Summary: Package embedding the necessary tools to host pyodide, ACE editors, jQuery terminals in mkdocs documentations
|
|
5
5
|
License: GPL-3.0-or-later
|
|
6
6
|
Keywords: mkdocs,mkdocs-plugin,pyodide,IDE,terminal
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "5.6.8"
|
|
@@ -45,7 +45,7 @@ Context/Contracts/Goals:
|
|
|
45
45
|
* An Extractor instance is cached based on the absolute/resolved path to the targeted
|
|
46
46
|
file (aka `self.exo_file`).
|
|
47
47
|
|
|
48
|
-
* The
|
|
48
|
+
* The extractor object is automatically refreshed when a local file has been modified.
|
|
49
49
|
|
|
50
50
|
* The concrete contents of the files are stored in the instance, avoiding multiple HDD
|
|
51
51
|
reads operations. Note that the content is stored "as is", meaning the inclusions are not
|
|
@@ -62,7 +62,7 @@ from pathlib import Path
|
|
|
62
62
|
from dataclasses import dataclass, field
|
|
63
63
|
from typing import ClassVar, Dict, Iterable, Optional, Set, Tuple, TYPE_CHECKING, Type
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
from mkdocs.structure.pages import Page
|
|
66
66
|
|
|
67
67
|
from ..exceptions import PmtMacrosInvalidPmtFileError
|
|
68
68
|
|
|
@@ -95,7 +95,6 @@ class BaseFilesExtractor:
|
|
|
95
95
|
interface and contracts.
|
|
96
96
|
|
|
97
97
|
- source file and `arg_name` argument
|
|
98
|
-
- cache management
|
|
99
98
|
- file content extraction generic triggers
|
|
100
99
|
- hash and/or equality definitions
|
|
101
100
|
- abstract methods that must be implemented at some point in the hierarchy
|
|
@@ -241,21 +240,32 @@ class BaseExtractorWithCache(BaseFilesExtractor):
|
|
|
241
240
|
|
|
242
241
|
_CACHED_EXTRACTORS: ClassVar[Dict[Path, 'GenericExtractor']] = {}
|
|
243
242
|
"""
|
|
244
|
-
Class level cache of instances.
|
|
245
|
-
in the hierarchy, allowing different caches in different branches, all using the same
|
|
246
|
-
implementation.
|
|
243
|
+
Class level cache of instances.
|
|
247
244
|
"""
|
|
248
245
|
|
|
249
246
|
_mtime_infos: Dict[Path, Optional[int]] = None
|
|
250
247
|
|
|
251
248
|
|
|
252
|
-
in_pages:
|
|
249
|
+
in_pages: Dict[str,Page] = field(default_factory=dict)
|
|
253
250
|
"""
|
|
254
|
-
|
|
255
|
-
purposes only, aka, mkdocs-addresses)
|
|
251
|
+
Dict of page.file.src_uri -> Page of all the pages using the current Extractor.
|
|
256
252
|
"""
|
|
257
253
|
|
|
258
254
|
|
|
255
|
+
@classmethod
|
|
256
|
+
def get_dirty_pages(cls, *, all=False):
|
|
257
|
+
"""
|
|
258
|
+
Return a list of all pages instances that should be considered dirty (because a file
|
|
259
|
+
Extractor involved in the page has been modified).
|
|
260
|
+
"""
|
|
261
|
+
unique = {
|
|
262
|
+
uri: page
|
|
263
|
+
for ext in cls._CACHED_EXTRACTORS.values() if all or not ext.is_up_to_date()
|
|
264
|
+
for uri,page in ext.in_pages.items()
|
|
265
|
+
}
|
|
266
|
+
return list(unique.values())
|
|
267
|
+
|
|
268
|
+
|
|
259
269
|
@classmethod
|
|
260
270
|
def _get_file_extractor_for(
|
|
261
271
|
cls,
|
|
@@ -284,8 +294,8 @@ class BaseExtractorWithCache(BaseFilesExtractor):
|
|
|
284
294
|
elif not extractor.is_up_to_date():
|
|
285
295
|
extractor.extract_contents()
|
|
286
296
|
|
|
287
|
-
|
|
288
|
-
extractor.in_pages.
|
|
297
|
+
uri = env.page.file.src_uri
|
|
298
|
+
extractor.in_pages[uri] = env.page
|
|
289
299
|
return runner_file, extractor
|
|
290
300
|
|
|
291
301
|
|
|
@@ -55,16 +55,24 @@ def _build_html_attributes(
|
|
|
55
55
|
if attrs.get('for_'):
|
|
56
56
|
attrs['for'] = attrs.pop('for_')
|
|
57
57
|
|
|
58
|
+
# Merge style sources:
|
|
58
59
|
style = attrs.get('style')
|
|
59
60
|
if style and not isinstance(style, str):
|
|
60
61
|
raise ValueError(
|
|
61
62
|
f'The `style` argument should be given as a string, but was:\n{style!r}'
|
|
62
63
|
)
|
|
63
64
|
|
|
65
|
+
# Merge dataset sources:
|
|
64
66
|
if 'data' in attrs:
|
|
65
67
|
data: Dict = attrs.pop('data')
|
|
66
68
|
attrs.update({f'data-{ k }':v for k,v in data.items()})
|
|
67
69
|
|
|
70
|
+
# Escape html tags delimiters in data-tip-txt:
|
|
71
|
+
# (see https://github.com/Python-Markdown/markdown/issues/1647)
|
|
72
|
+
if 'data-tip-txt' in attrs:
|
|
73
|
+
attrs['data-tip-txt'] = attrs['data-tip-txt'].replace('<','<').replace('>','>')
|
|
74
|
+
|
|
75
|
+
# Handle "named only" properties
|
|
68
76
|
suffix_attrs = ""
|
|
69
77
|
for name in ('disabled', 'checked'):
|
|
70
78
|
if name in attrs:
|
|
@@ -74,9 +82,8 @@ def _build_html_attributes(
|
|
|
74
82
|
attributes = " ".join(
|
|
75
83
|
f'{ name }="{ value }"'
|
|
76
84
|
for name,value in attrs.items()
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
return attributes
|
|
85
|
+
)
|
|
86
|
+
return attributes + suffix_attrs
|
|
80
87
|
|
|
81
88
|
|
|
82
89
|
|
|
@@ -61,8 +61,8 @@ class BaseMaestro(BasePlugin[PyodideMacrosConfig]):
|
|
|
61
61
|
It is also used as "sink" for the super calls of other classes that are not implemented
|
|
62
62
|
on the MacrosPlugin class.
|
|
63
63
|
|
|
64
|
-
Note that, for the ConfigExtractor
|
|
65
|
-
|
|
64
|
+
Note that, for the ConfigExtractor to properly work, the class hierarchy has to extend
|
|
65
|
+
MacrosPlugin at some point.
|
|
66
66
|
"""
|
|
67
67
|
config: PyodideMacroConfig
|
|
68
68
|
|
|
@@ -341,7 +341,7 @@ class BaseMaestro(BasePlugin[PyodideMacrosConfig]):
|
|
|
341
341
|
|
|
342
342
|
top_args_IDE_TEST: str = ''
|
|
343
343
|
"""
|
|
344
|
-
Store the value of self.args_IDE_TEST at the top level, to know
|
|
344
|
+
Store the value of self.args_IDE_TEST at the top level, to know what the user configured
|
|
345
345
|
in the mkdocs.yml file.
|
|
346
346
|
"""
|
|
347
347
|
|
|
@@ -36,6 +36,7 @@ import pyodide_mkdocs_theme.PMT_tools as PMT_tools
|
|
|
36
36
|
from ..exceptions import PmtIdesTestingError, PmtMacrosPyLibsError
|
|
37
37
|
from ..pyodide_logger import logger
|
|
38
38
|
from ..tools_and_constants import PmtCte, PageInclusion
|
|
39
|
+
from ..files_extractors.concrete_extractors import FileExtractor
|
|
39
40
|
from ..macros.ide_term_ide import CommonGeneratedIde
|
|
40
41
|
from ..macros.ide_tester import IdeTester
|
|
41
42
|
from ..macros.ide_playground import IdePlayground
|
|
@@ -202,10 +203,19 @@ class MaestroGeneratedPages(BaseMaestro):
|
|
|
202
203
|
|
|
203
204
|
|
|
204
205
|
def on_files(self, files: Files, /, *, config: MkDocsConfig):
|
|
206
|
+
# Add all generated files
|
|
205
207
|
for generator in self._generated_pages:
|
|
206
208
|
if generator.is_built:
|
|
207
209
|
file = generator.generate_file(config)
|
|
208
210
|
files.append(file)
|
|
211
|
+
|
|
212
|
+
# "Make dirty" all pages with file extractors that aren't up to date at the moment:
|
|
213
|
+
for page in FileExtractor.get_dirty_pages():
|
|
214
|
+
src_path = Path(page.file.abs_src_path)
|
|
215
|
+
target_path = Path(page.file.abs_dest_path)
|
|
216
|
+
if (src_path.is_file() or page.file.generated_by) and target_path.is_file():
|
|
217
|
+
target_path.unlink()
|
|
218
|
+
|
|
209
219
|
return files
|
|
210
220
|
|
|
211
221
|
|
|
@@ -234,7 +244,7 @@ class MaestroPyLibs(MaestroGeneratedPages):
|
|
|
234
244
|
|
|
235
245
|
base_py_libs: Set[str] = None # added on the fly
|
|
236
246
|
"""
|
|
237
|
-
Set of all the python_libs paths strings, as declared in the
|
|
247
|
+
Set of all the python_libs paths strings, as declared in the plugin's config (meta or not).
|
|
238
248
|
"""
|
|
239
249
|
|
|
240
250
|
python_libs_in_pyodide: List[str] = None
|
|
@@ -905,8 +905,8 @@ RUN_MACRO = MacroConfigSrc.with_default_docs(
|
|
|
905
905
|
Chemin relatif vers le fichier python (sans extension) à exécuter au chargement de
|
|
906
906
|
la page (sections `env`, `post` et `ignore` uniquement).
|
|
907
907
|
"""},
|
|
908
|
-
RUN_GROUP = {'docs': """
|
|
909
|
-
Seules les valeurs `#!py None` et `#!py "
|
|
908
|
+
RUN_GROUP = {'docs': f"""
|
|
909
|
+
Seules les valeurs `#!py None` et `#!py "{ PmtCte.RUN_GROUP_SKIP }"` sont autorisées pour les macros `run`,
|
|
910
910
|
du fait qu'il serait impossible de déterminer quand passer d'une version à l'autre
|
|
911
911
|
sur le site construit.<br>
|
|
912
912
|
"""}
|
|
@@ -332,11 +332,14 @@ export const handlePmtTooltips=(()=>{
|
|
|
332
332
|
}
|
|
333
333
|
|
|
334
334
|
const validTags = '<br> <kbd> <code> <i> <u> <b>'.split(' ')
|
|
335
|
+
const unescapeTags = {"<":'<', ">":'>', "\\<": '<'}
|
|
335
336
|
|
|
336
337
|
const getValidHtml=(html)=>{
|
|
337
338
|
// In admonitions, tags are escaped somehow (dunno where exactly), so restore them,
|
|
338
|
-
// if they are allowed:
|
|
339
|
-
html = html.replace(
|
|
339
|
+
// if they are allowed + handle markdown 3.11:
|
|
340
|
+
html = html.replace(/&[lg]t;/g, s=>unescapeTags[s])
|
|
341
|
+
.replace(/\\</g, s=>unescapeTags[s])
|
|
342
|
+
// as a separated step, making sure no mixed escaping is missed
|
|
340
343
|
|
|
341
344
|
const tags = [...html.replace(/\//g,"").match(/<[^>]*>/g)||[]]
|
|
342
345
|
const tagsOk = tags.every(s=>validTags.includes(s))
|
|
@@ -289,7 +289,7 @@ class GlobalSequentialRunner extends GlobalAutoRunManager {
|
|
|
289
289
|
|
|
290
290
|
LOGGER_CONFIG.ACTIVATE && jsLogger('[Sequence] - Wrapped', pyoRunner.pyName)
|
|
291
291
|
|
|
292
|
-
|
|
292
|
+
// args: generally: [sectionName, Runtime], but might be ["command"] for terminals.
|
|
293
293
|
return async function sequentialAndNoReturn(...srcArgs){
|
|
294
294
|
|
|
295
295
|
// Always give the current runner the priority, first, in case it is not "the one"...
|
|
@@ -304,11 +304,10 @@ class GlobalSequentialRunner extends GlobalAutoRunManager {
|
|
|
304
304
|
let ranSome = false
|
|
305
305
|
|
|
306
306
|
let success = true
|
|
307
|
-
|
|
308
307
|
let previousRunner
|
|
309
308
|
|
|
310
309
|
pyoRunner.running = runningMan // Dirty override, but needed here or there... :rolleyes:
|
|
311
|
-
pyoRunner.allowPrint = !this.deactivateStdoutForSecrets
|
|
310
|
+
pyoRunner.allowPrint = !this.deactivateStdoutForSecrets
|
|
312
311
|
pyoRunner.lockDisplay()
|
|
313
312
|
pyoRunner.setupTerminalMessageRoutine()
|
|
314
313
|
|
|
@@ -345,7 +344,7 @@ class GlobalSequentialRunner extends GlobalAutoRunManager {
|
|
|
345
344
|
pyoRunner.unlockDisplay()
|
|
346
345
|
pyoRunner.allowPrint = true
|
|
347
346
|
|
|
348
|
-
// Defensive programming:
|
|
347
|
+
// Defensive programming: focus again so that it's always done, even on JS errors.
|
|
349
348
|
if(previousRunner) previousRunner.activateFocus(true)
|
|
350
349
|
}
|
|
351
350
|
|
|
@@ -57,15 +57,15 @@ class PyodideSectionsRunnerBase {
|
|
|
57
57
|
* */
|
|
58
58
|
static pyFuncs = {}
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
60
|
+
no_undefined = prop =>{
|
|
61
|
+
const getter = v => {
|
|
62
|
+
if(v!==undefined) return v
|
|
63
|
+
throw new Error(`Undefined is not allowed: ${this.constructor.name}.${prop}.`)
|
|
64
|
+
}
|
|
65
|
+
return getter
|
|
66
|
+
}
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
// Getters so that the RunnersManager can identify which is what more easily (if ever needed)
|
|
69
69
|
get isRunner() { return true } // Always true, so far... Kept just in case
|
|
70
70
|
get isPyBtn() { return false }
|
|
71
71
|
get hasTerminal(){ return false }
|
|
@@ -318,8 +318,6 @@ class PyodideSectionsRunnerBase {
|
|
|
318
318
|
this.takesGroupPriority() // This one must be kept (see global.on('click'...)) because
|
|
319
319
|
// the click is applied too late.
|
|
320
320
|
CONFIG.calledMermaid = false
|
|
321
|
-
const wasDirty = this.isDirty
|
|
322
|
-
this.makeDirty(false) // Assumes executions will go well (see note in `finally`)
|
|
323
321
|
this.running = runningMan
|
|
324
322
|
let runtime
|
|
325
323
|
|
|
@@ -345,25 +343,7 @@ class PyodideSectionsRunnerBase {
|
|
|
345
343
|
|
|
346
344
|
}finally{
|
|
347
345
|
LOGGER_CONFIG.ACTIVATE && jsLogger("[CheckPoint] - finally", actionName)
|
|
348
|
-
|
|
349
|
-
// For isDirty update, DO NOT only rely on `this.isDirty = runtime.stopped`, so that the
|
|
350
|
-
// runner itself can set the value on a success if needed, and it won't be overridden here
|
|
351
|
-
// (useful if a valid "play" is still considered dirty when a validation button exists...):
|
|
352
|
-
const anyError = !runtime || runtime.stopped
|
|
353
|
-
const keepDirtyOnPublicTestsIfCheckBtn = wasDirty && this.data.hasCheckBtn && runningMan.isPlaying
|
|
354
|
-
if(anyError || keepDirtyOnPublicTestsIfCheckBtn){
|
|
355
|
-
this.makeDirty() // This is also applying the "orange box", for IDEs
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// AFTER updating isDirty, FIX the orange box if needed:
|
|
359
|
-
if(this.isIde){
|
|
360
|
-
const cancelBox = runningMan.isValidating
|
|
361
|
-
|| runningMan.isPlaying && !anyError && !wasDirty && this.lastValidationWasSuccess()
|
|
362
|
-
if(cancelBox){
|
|
363
|
-
this.setOrangeBox(false)
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
|
|
346
|
+
this.makeDirty({runtime})
|
|
367
347
|
if(runtime){
|
|
368
348
|
await finallyTeardown.call(this, runtime)
|
|
369
349
|
}
|
|
@@ -407,9 +387,18 @@ class PyodideSectionsRunnerBase {
|
|
|
407
387
|
pyodideDelStorage(key) { noStorage() } // sink
|
|
408
388
|
|
|
409
389
|
|
|
410
|
-
resetElement(){ throw new Error('Not implemented') } // sink with security
|
|
390
|
+
resetElement(options){ throw new Error('Not implemented') } // sink with security
|
|
411
391
|
|
|
412
|
-
|
|
392
|
+
/**@options `{isDirty?: true, runtime?: RuntimeManager, box?: true, doFocus?:boolean}`
|
|
393
|
+
*
|
|
394
|
+
* All fields are optional. May be used at various levels in the class hierarchy.
|
|
395
|
+
* - When `runtime` is given, this call is the one concluding some executions.
|
|
396
|
+
* - `doFocus` is related to focusing the IDE's editor during `resetElement`
|
|
397
|
+
*
|
|
398
|
+
* @returns: the updated `options` object, so that overloaded method can get back the
|
|
399
|
+
* concrete/updated state.
|
|
400
|
+
* */
|
|
401
|
+
makeDirty(options={}){ throw new Error('Not implemented') } // sink with security
|
|
413
402
|
|
|
414
403
|
/**The current runner now takes priority in its group, regarding sequential executions.
|
|
415
404
|
* */
|
|
@@ -629,20 +618,28 @@ class PyodideSequentialRunner extends PyodideSectionsRunnerBase {
|
|
|
629
618
|
constructor(id){
|
|
630
619
|
super(id)
|
|
631
620
|
|
|
632
|
-
/**
|
|
633
|
-
*
|
|
634
|
-
*
|
|
621
|
+
/**This flag DOES NOT track any "un-/saved" related logic, but rather if the runner should
|
|
622
|
+
* be run or not to know if the current validation state is known or not. This is for example
|
|
623
|
+
* used in sequential runs (dirty runners have to be run).
|
|
624
|
+
*
|
|
625
|
+
* It _can_ often be seen as "modified or not?" flag, but that's not matching the value at
|
|
626
|
+
* page load time, were no runner has been modified, and yet, they all are in dirty state.
|
|
627
|
+
*
|
|
628
|
+
* In a similar way, no "orange boxes" are visible on validation buttons at page load time
|
|
629
|
+
* while all IDEs are dirty, so both ideas are related but still different...
|
|
635
630
|
* */
|
|
636
631
|
this.isDirty = true
|
|
637
632
|
}
|
|
638
633
|
|
|
639
634
|
|
|
640
|
-
makeDirty(
|
|
641
|
-
|
|
635
|
+
makeDirty(options={}){
|
|
636
|
+
options = {isDirty: true, box: true, ...options}
|
|
637
|
+
this.isDirty = options.isDirty
|
|
638
|
+
return options
|
|
642
639
|
}
|
|
643
640
|
|
|
644
|
-
resetElement(){
|
|
645
|
-
this.makeDirty()
|
|
641
|
+
resetElement(options){
|
|
642
|
+
this.makeDirty(options)
|
|
646
643
|
}
|
|
647
644
|
|
|
648
645
|
|
|
@@ -404,8 +404,8 @@ class _TerminalHandler extends PyodideSectionsRunner {
|
|
|
404
404
|
unlockDisplay(){ this.terminal.resume() }
|
|
405
405
|
|
|
406
406
|
|
|
407
|
-
resetElement(){
|
|
408
|
-
super.resetElement()
|
|
407
|
+
resetElement(options){
|
|
408
|
+
super.resetElement(options)
|
|
409
409
|
this.terminal.clear()
|
|
410
410
|
}
|
|
411
411
|
|
|
@@ -538,7 +538,7 @@ class _TerminalHandler extends PyodideSectionsRunner {
|
|
|
538
538
|
e.preventDefault()
|
|
539
539
|
e.stopPropagation()
|
|
540
540
|
await navigator.clipboard.writeText(txt)
|
|
541
|
-
return
|
|
541
|
+
return false
|
|
542
542
|
}
|
|
543
543
|
|
|
544
544
|
let currentCmd = this.terminal.get_command();
|
|
@@ -187,7 +187,7 @@ class GlobalZipImportIdesManager extends GlobalZipExportIdesManager{
|
|
|
187
187
|
|
|
188
188
|
readZipContentAndUpdateIdes(zipArchive){
|
|
189
189
|
|
|
190
|
-
Object.values(this.allRunners).forEach(runner=>runner.resetElement(false))
|
|
190
|
+
Object.values(this.allRunners).forEach(runner=>runner.resetElement({doFocus:false}))
|
|
191
191
|
|
|
192
192
|
const reader = new FileReader();
|
|
193
193
|
|
|
@@ -256,7 +256,7 @@ class GlobalRunnersManager extends GlobalZipImportIdesManager {
|
|
|
256
256
|
|
|
257
257
|
resetAllIdes(){
|
|
258
258
|
Object.values(this.allRunners).forEach(runner=>{
|
|
259
|
-
if(runner.isIde) runner.resetElement(false)
|
|
259
|
+
if(runner.isIde) runner.resetElement({doFocus: false})
|
|
260
260
|
})
|
|
261
261
|
}
|
|
262
262
|
}
|
|
@@ -82,6 +82,14 @@ class IdeStorageManager extends TerminalRunner {
|
|
|
82
82
|
get hasTerminal(){ return true }
|
|
83
83
|
get isTerminal(){ return false }
|
|
84
84
|
|
|
85
|
+
/**Allow to "unlink" internal behaviors from the actual browser's localStorage.
|
|
86
|
+
* Keep in mind users "interacting with localStorage from pyodide" actually interact with the
|
|
87
|
+
* internal storage representation, and not with the true localStorage itself, so the "link"
|
|
88
|
+
* can be cut safely if desired, without modifying the actual behaviors (...unless the user
|
|
89
|
+
* also interacts with the localStorage through the JS layer... :-/ )
|
|
90
|
+
*/
|
|
91
|
+
get useLocalStorage(){ return true } // CodCap
|
|
92
|
+
|
|
85
93
|
|
|
86
94
|
// (wut??) callInit = false: process to "re-initiate" the internal state of the IDE (useful for testing) */
|
|
87
95
|
constructor(editorId, callInit=false){
|
|
@@ -99,33 +107,34 @@ class IdeStorageManager extends TerminalRunner {
|
|
|
99
107
|
return this.storage.done > 0
|
|
100
108
|
}
|
|
101
109
|
|
|
102
|
-
|
|
103
110
|
getCodeFromStorage(){
|
|
104
|
-
return this.storage.code
|
|
111
|
+
return this.storage.code ?? "" // `?? ""` as an extra security: should never be used
|
|
105
112
|
}
|
|
106
113
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const storage = getIdeDataFromStorage(
|
|
114
|
+
/**Extract the localStorage content for the current IDE.
|
|
115
|
+
* */
|
|
116
|
+
getStorage(){
|
|
117
|
+
const storage = this.useLocalStorage ? getIdeDataFromStorage(this.id, this)
|
|
118
|
+
: freshStore({storage:{code:""}, ide:this})
|
|
111
119
|
return storage
|
|
112
120
|
}
|
|
113
121
|
|
|
122
|
+
/**Update the internal storage state, and store in the localStorage itself if needed.
|
|
123
|
+
* */
|
|
114
124
|
setStorage(changes={}){
|
|
115
|
-
this.
|
|
116
|
-
|
|
117
|
-
}
|
|
125
|
+
if(!this.storage) this.storage = {} // Still needed? ('don't think so...)
|
|
126
|
+
for(const k in changes) this.storage[k] = changes[k]
|
|
118
127
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
localStorage.removeItem(this.id)
|
|
128
|
+
if(this.useLocalStorage){
|
|
129
|
+
localStorage.setItem(this.id, JSON.stringify(this.storage))
|
|
130
|
+
}
|
|
123
131
|
}
|
|
124
132
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
133
|
+
resetElement(options){
|
|
134
|
+
super.resetElement(options)
|
|
135
|
+
this.storage = freshStore({ide: this})
|
|
136
|
+
if(this.useLocalStorage){
|
|
137
|
+
localStorage.removeItem(this.id)
|
|
129
138
|
}
|
|
130
139
|
}
|
|
131
140
|
|
|
@@ -241,7 +250,7 @@ class IdeZipManager extends IdeStorageManager {
|
|
|
241
250
|
/**Build and return the callback to export IDEs contents as zip, and also put in place the zip
|
|
242
251
|
* importation elements.
|
|
243
252
|
* */
|
|
244
|
-
buildZipExportsToolsAndCbk(jBtn){
|
|
253
|
+
buildZipExportsToolsAndCbk(jBtn){ // CodCap
|
|
245
254
|
// https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/File_drag_and_drop
|
|
246
255
|
// https://stackoverflow.com/questions/43180248/firefox-ondrop-event-datatransfer-is-null-after-update-to-version-52
|
|
247
256
|
|
|
@@ -66,11 +66,27 @@ class IdeAceManager extends IdeSplitScreenManager {
|
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
|
|
69
|
-
makeDirty(
|
|
70
|
-
|
|
71
|
-
if(
|
|
72
|
-
|
|
69
|
+
makeDirty(options={}){
|
|
70
|
+
|
|
71
|
+
if('runtime' in options){
|
|
72
|
+
const isSuccess = Boolean(options.runtime && !options.runtime.stopped)
|
|
73
|
+
const isNotValidWithCheckBtn = !this.running.isValidating && this.hasCheckBtn
|
|
74
|
+
options.isDirty = !isSuccess || isNotValidWithCheckBtn && this.isDirty
|
|
75
|
+
|
|
76
|
+
options.box = false
|
|
77
|
+
if(this.running.isPlaying){
|
|
78
|
+
const changedState = isSuccess !== this.lastValidationWasSuccess()
|
|
79
|
+
options.box = changedState || this.hasOrangeBox()
|
|
80
|
+
|
|
81
|
+
}else if(this.running.isTermCmd){ // Retain current state
|
|
82
|
+
options.box = this.hasOrangeBox()
|
|
83
|
+
}
|
|
73
84
|
}
|
|
85
|
+
|
|
86
|
+
options = super.makeDirty(options)
|
|
87
|
+
|
|
88
|
+
this.setOrangeBox(options.box)
|
|
89
|
+
return options
|
|
74
90
|
}
|
|
75
91
|
|
|
76
92
|
setOrangeBox(add){
|
|
@@ -128,7 +144,7 @@ class IdeAceManager extends IdeSplitScreenManager {
|
|
|
128
144
|
exerciseCode = exerciseCode.replace(/\n+$/,'')
|
|
129
145
|
if(!exerciseCode) exerciseCode = '\n'
|
|
130
146
|
|
|
131
|
-
return exerciseCode+"\n"
|
|
147
|
+
return exerciseCode + "\n"
|
|
132
148
|
}
|
|
133
149
|
|
|
134
150
|
|
|
@@ -290,7 +306,7 @@ class IdeFeedbackManager extends IdeHistoryManager {
|
|
|
290
306
|
|
|
291
307
|
let msg = `${ intro }${ section }: ${ okMsg }` // Default section message
|
|
292
308
|
if(!code) msg = "" // No default message if no code in the section...
|
|
293
|
-
if(isPlaying && !this.hasCheckBtn){
|
|
309
|
+
if(isPlaying && !this.hasCheckBtn){ // ...but ensure the default ending message is shown, ...
|
|
294
310
|
msg = CONFIG.lang.successMsgNoTests.msg // ...if this is "playing" and nothing else to do after.
|
|
295
311
|
}
|
|
296
312
|
|
|
@@ -298,11 +314,12 @@ class IdeFeedbackManager extends IdeHistoryManager {
|
|
|
298
314
|
|
|
299
315
|
// Prepare a "very final" message if needed:
|
|
300
316
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
317
|
+
/* During public tests, if a validation button is present while running the public tests,
|
|
318
|
+
remind the user to try the validations if the IDE had the orange box or if there was an error
|
|
319
|
+
on the last validation (keeping that consistent with the visuals, rather than the isDirty
|
|
320
|
+
implementation. This is because, for example, the starting state for isDirty and the box
|
|
321
|
+
are not aligned at all, so sequential runs cannot rely on the orange box and vice versa):
|
|
322
|
+
*/
|
|
306
323
|
if(isPlaying && this.hasCheckBtn && (this.hasOrangeBox() || !this.lastValidationWasSuccess())){
|
|
307
324
|
runtime.finalMsg = CONFIG.lang.unforgettable.msg
|
|
308
325
|
|
|
@@ -444,7 +461,6 @@ class IdeFeedbackManager extends IdeHistoryManager {
|
|
|
444
461
|
}
|
|
445
462
|
}
|
|
446
463
|
|
|
447
|
-
|
|
448
464
|
/**If @isDelayed is true, there are no tests/secrets, so:
|
|
449
465
|
* - Do not congratulate the user
|
|
450
466
|
* - if something revealable, announce the revelation, otherwise say nothing special
|
|
@@ -537,8 +553,6 @@ class IdeRunnerLogic extends IdeFeedbackManager {
|
|
|
537
553
|
}
|
|
538
554
|
|
|
539
555
|
|
|
540
|
-
|
|
541
|
-
|
|
542
556
|
/**Things to display in the terminal at the very beginning of the executions.
|
|
543
557
|
* */
|
|
544
558
|
terminalDisplayOnIdeStart(){
|
|
@@ -546,7 +560,6 @@ class IdeRunnerLogic extends IdeFeedbackManager {
|
|
|
546
560
|
}
|
|
547
561
|
|
|
548
562
|
|
|
549
|
-
|
|
550
563
|
async setupRuntimeIDE() {
|
|
551
564
|
LOGGER_CONFIG.ACTIVATE && jsLogger("[CheckPoint] - setupRuntimeIDE IdeRunner")
|
|
552
565
|
|
|
@@ -602,8 +615,6 @@ class IdeRunnerLogic extends IdeFeedbackManager {
|
|
|
602
615
|
)
|
|
603
616
|
}
|
|
604
617
|
|
|
605
|
-
|
|
606
|
-
|
|
607
618
|
async playThroughRunner(runtime){ // CodCap override
|
|
608
619
|
const code = this.getCodeToTest()
|
|
609
620
|
await this.runPythonCodeWithOptionsIfNoStdErr(code, runtime, CONFIG.section.editor)
|
|
@@ -611,6 +622,7 @@ class IdeRunnerLogic extends IdeFeedbackManager {
|
|
|
611
622
|
|
|
612
623
|
|
|
613
624
|
|
|
625
|
+
|
|
614
626
|
/**Build the validation tests runner routine.
|
|
615
627
|
* */
|
|
616
628
|
validateFactory(runningMan=RunningProfile.PROFILE.validate){
|
|
@@ -622,8 +634,6 @@ class IdeRunnerLogic extends IdeFeedbackManager {
|
|
|
622
634
|
)
|
|
623
635
|
}
|
|
624
636
|
|
|
625
|
-
|
|
626
|
-
|
|
627
637
|
async validateThroughRunner(runtime){
|
|
628
638
|
|
|
629
639
|
// env section is behaving like the editor one (should be changed...?)
|
|
@@ -697,7 +707,6 @@ class IdeRunnerLogic extends IdeFeedbackManager {
|
|
|
697
707
|
)
|
|
698
708
|
}
|
|
699
709
|
|
|
700
|
-
|
|
701
710
|
async setupRuntimeIDECorr() {
|
|
702
711
|
LOGGER_CONFIG.ACTIVATE && jsLogger("[CheckPoint] - corr_btn start")
|
|
703
712
|
|
|
@@ -712,7 +721,6 @@ class IdeRunnerLogic extends IdeFeedbackManager {
|
|
|
712
721
|
return await this.setupRuntimeIDE()
|
|
713
722
|
}
|
|
714
723
|
|
|
715
|
-
|
|
716
724
|
async teardownRuntimeIDECorr(runtime) {
|
|
717
725
|
LOGGER_CONFIG.ACTIVATE && jsLogger("[CheckPoint] - corr_btn validation done")
|
|
718
726
|
let out
|
|
@@ -1124,10 +1132,9 @@ export class IdeRunner extends IdeRunnerLogic {
|
|
|
1124
1132
|
* @doFocus can be seen as "triggered by the user?", hence, when it is false, some extra
|
|
1125
1133
|
* steps should be avoided, like autofocus of the element.
|
|
1126
1134
|
* */
|
|
1127
|
-
resetElement(doFocus
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
this.setOrangeBox(false)
|
|
1135
|
+
resetElement(options={doFocus: true}){ // CodCap override: if @doFocus is true, send notifications to Capytale).
|
|
1136
|
+
options.box = false
|
|
1137
|
+
super.resetElement(options) // This marks the runner as dirty
|
|
1131
1138
|
this.setStartingCode({extractFromLocalStorage: false, saveOnceApplied: false})
|
|
1132
1139
|
this.updateValidationBtnColor()
|
|
1133
1140
|
this.clearValidations()
|
|
@@ -1136,7 +1143,7 @@ export class IdeRunner extends IdeRunnerLogic {
|
|
|
1136
1143
|
}
|
|
1137
1144
|
$("#solution_" + this.id).addClass('py_mk_hidden')
|
|
1138
1145
|
this.hiddenDivContent = true
|
|
1139
|
-
if(doFocus) this.focusEditor()
|
|
1146
|
+
if(options.doFocus) this.focusEditor()
|
|
1140
1147
|
// clearPyodideScope() // PMT 4.2.0+: no scope cleaning anymore.
|
|
1141
1148
|
this.takesGroupPriority() // Keep this one because the method may be triggered from some code
|
|
1142
1149
|
// during the tests, without clicking on the IDE
|
|
@@ -159,7 +159,8 @@ class IdePlayground extends IdeRunner {
|
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
getCodeFromStorage(){
|
|
162
|
-
|
|
162
|
+
const store = super.getCodeFromStorage()
|
|
163
|
+
return this._applyAllCodesFromFileContent(store)
|
|
163
164
|
}
|
|
164
165
|
|
|
165
166
|
_buildPythonFileContent(){
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pyodide-mkdocs-theme"
|
|
3
|
-
version = "5.6.
|
|
3
|
+
version = "5.6.8"
|
|
4
4
|
requires-python = ">=3.9, <4.0"
|
|
5
5
|
license = { text = "GPL-3.0-or-later" }
|
|
6
6
|
description = "Package embedding the necessary tools to host pyodide, ACE editors, jQuery terminals in mkdocs documentations"
|