pyodide-mkdocs-theme 5.6.7__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.
Files changed (159) hide show
  1. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/PKG-INFO +1 -1
  2. pyodide_mkdocs_theme-5.6.8/pyodide_mkdocs_theme/__version__.py +1 -0
  3. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/base0_extractors.py +3 -3
  4. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/html_builder/_html_builder.py +10 -3
  5. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_base.py +3 -3
  6. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_files.py +1 -2
  7. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/definitions/macros_configs.py +2 -2
  8. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/test_cases.py +1 -0
  9. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/functoolsUi.js +5 -2
  10. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/2-0-runnersManager-runners.js +3 -4
  11. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/2-pyodideSectionsRunner-runner-pyodide.js +35 -38
  12. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/3-terminalRunner-term.js +2 -2
  13. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/4-0-idesManager-ide.js +2 -2
  14. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/4-ideLogistic-ide.js +26 -17
  15. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/4-ideRunner-ide.js +33 -26
  16. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/6-idePlayground-playground.js +2 -1
  17. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyproject.toml +1 -1
  18. pyodide_mkdocs_theme-5.6.7/pyodide_mkdocs_theme/__version__.py +0 -1
  19. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/LICENSE +0 -0
  20. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/README.md +0 -0
  21. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/p5/__init__.py +0 -0
  22. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/p5/cdns.txt +0 -0
  23. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/p5v2/__init__.py +0 -0
  24. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/p5v2/cdns.txt +0 -0
  25. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/vis/__init__.py +0 -0
  26. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/vis/cdns.txt +0 -0
  27. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/vis_network/__init__.py +0 -0
  28. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/PMT_tools/vis_network/cdns.txt +0 -0
  29. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/__init__.py +0 -0
  30. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/__main__.py +0 -0
  31. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/basthon_p5_to_pmt.py +0 -0
  32. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/__init__.py +0 -0
  33. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/exceptions.py +0 -0
  34. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/__init__.py +0 -0
  35. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/_inclusions_tools.py +0 -0
  36. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/base1_contents_extractor.py +0 -0
  37. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/base2_inclusions.py +0 -0
  38. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/base3_generic_extractors.py +0 -0
  39. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/files_extractors/concrete_extractors.py +0 -0
  40. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/html_builder/__init__.py +0 -0
  41. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/html_dependencies/__init__.py +0 -0
  42. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/html_dependencies/deps.py +0 -0
  43. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/html_dependencies/deps_class.py +0 -0
  44. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/indent_parser.py +0 -0
  45. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/__init__.py +0 -0
  46. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/figure.py +0 -0
  47. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_ide.py +0 -0
  48. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_manager.py +0 -0
  49. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_playground.py +0 -0
  50. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_py_btn.py +0 -0
  51. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_run_macro.py +0 -0
  52. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_term_ide.py +0 -0
  53. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_terminal.py +0 -0
  54. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/ide_tester.py +0 -0
  55. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/py_script.py +0 -0
  56. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/qcm.py +0 -0
  57. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/macros/runners_macros.py +0 -0
  58. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/__init__.py +0 -0
  59. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/classes.py +0 -0
  60. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/de_lang.py +0 -0
  61. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/en_lang.py +0 -0
  62. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/fr_lang.py +0 -0
  63. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/messages/proxy.py +0 -0
  64. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/parsing.py +0 -0
  65. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/paths_utils.py +0 -0
  66. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/__init__.py +0 -0
  67. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/config.py +0 -0
  68. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_contracts.py +0 -0
  69. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_indent.py +0 -0
  70. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_macros.py +0 -0
  71. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_meta.py +0 -0
  72. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/maestro_templates.py +0 -0
  73. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin/pyodide_macros_plugin.py +0 -0
  74. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/__init__.py +0 -0
  75. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/_string_tools_and_constants.py +0 -0
  76. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/common_tree_src.py +0 -0
  77. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/config_option_src.py +0 -0
  78. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/definitions/__init__.py +0 -0
  79. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/definitions/docs_dirs_config.py +0 -0
  80. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/definitions/plugin_config.py +0 -0
  81. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/definitions/sub_configs.py +0 -0
  82. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/dumpers.py +0 -0
  83. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/lang_src.py +0 -0
  84. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/macro_config_src.py +0 -0
  85. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/plugin_config_src.py +0 -0
  86. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_config/sub_config_src.py +0 -0
  87. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/__init__.py +0 -0
  88. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/ide_tests.py +0 -0
  89. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/macros_data.py +0 -0
  90. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/maestro_tools.py +0 -0
  91. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/options_alterations.py +0 -0
  92. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/plugin_tools/pages_and_macros_py_configs.py +0 -0
  93. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/pyodide_logger.py +0 -0
  94. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/pyodide_macros/tools_and_constants.py +0 -0
  95. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/de/docs/exo.py +0 -0
  96. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/de/docs/index.md +0 -0
  97. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/de/mkdocs.yml +0 -0
  98. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/en/docs/exo.py +0 -0
  99. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/en/docs/index.md +0 -0
  100. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/en/mkdocs.yml +0 -0
  101. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/fr/docs/exo.py +0 -0
  102. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/fr/docs/index.md +0 -0
  103. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/fr/mkdocs.yml +0 -0
  104. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/.gitignore +0 -0
  105. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/main.py +0 -0
  106. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/mkdocs.yml +0 -0
  107. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/pyodide_plot.py +0 -0
  108. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/requirements.txt +0 -0
  109. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/scripts/models/toolbox.py +0 -0
  110. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/README.md +0 -0
  111. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/__init__.py +0 -0
  112. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/.qcm-circle.svg +0 -0
  113. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-check-64.png +0 -0
  114. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-download-64.png +0 -0
  115. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-pause-64.png +0 -0
  116. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-play-64.png +0 -0
  117. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-restart-64.png +0 -0
  118. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-save-64.png +0 -0
  119. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-step-64.png +0 -0
  120. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-stop-64.png +0 -0
  121. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-upload-64.png +0 -0
  122. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/assets/images/icons8-zip-64.png +0 -0
  123. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/base_pmt.html +0 -0
  124. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/0-config.js +0 -0
  125. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/0-legacy-subscriber.js +0 -0
  126. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/functools.js +0 -0
  127. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/functoolsStorage.js +0 -0
  128. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/functoolsTxt.js +0 -0
  129. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/functoolsUiBuilder.js +0 -0
  130. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/jsLogger.js +0 -0
  131. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/mathjax-libs.js +0 -0
  132. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-libs/process_and_gui.js +0 -0
  133. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/0-generic-python-snippets-pyodide.js +0 -0
  134. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/1-error_logs-pyodide.js +0 -0
  135. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/1-packagesInstaller-install-pyodide.js +0 -0
  136. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/1-runtimeManager-runtime-pyodide.js +0 -0
  137. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/3-btnRunner-py_btn.js +0 -0
  138. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/5-2-virtualizer-ides_test.js +0 -0
  139. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/5-3-avl-ides_test.mjs +0 -0
  140. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/5-ideTester-ides_test.js +0 -0
  141. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/qcms-qcm.js +0 -0
  142. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-per-pages/start-pyodide.js +0 -0
  143. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-scripts/overlord.js +0 -0
  144. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/js-scripts/subscriptions.js +0 -0
  145. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/main.html +0 -0
  146. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/mkdocs_theme.yml +0 -0
  147. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/partials/content.html +0 -0
  148. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/partials/copyright.html +0 -0
  149. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/partials/footer.html +0 -0
  150. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/partials/header.html +0 -0
  151. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/partials/social.html +0 -0
  152. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/0-generic.css +0 -0
  153. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/btns-header.css +0 -0
  154. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/history.css +0 -0
  155. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/hourglass.css +0 -0
  156. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/ide.css +0 -0
  157. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/qcm.css +0 -0
  158. {pyodide_mkdocs_theme-5.6.7 → pyodide_mkdocs_theme-5.6.8}/pyodide_mkdocs_theme/templates/pyodide-css/terminal.css +0 -0
  159. {pyodide_mkdocs_theme-5.6.7 → 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.7
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 file is automatically refreshed when a local file has been modified.
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
@@ -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
@@ -256,7 +255,8 @@ class BaseExtractorWithCache(BaseFilesExtractor):
256
255
  @classmethod
257
256
  def get_dirty_pages(cls, *, all=False):
258
257
  """
259
- Yields all registered Extractor instances that aren't considered up to date at the moment.
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
260
  """
261
261
  unique = {
262
262
  uri: page
@@ -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('<','&lt;').replace('>','&gt;')
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
- ) + suffix_attrs
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 for to properly work, the class hierarchy has to
65
- extend MacrosPlugin at some point.
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 whet the user configured
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
 
@@ -210,7 +210,6 @@ class MaestroGeneratedPages(BaseMaestro):
210
210
  files.append(file)
211
211
 
212
212
  # "Make dirty" all pages with file extractors that aren't up to date at the moment:
213
- # (handle only sources)
214
213
  for page in FileExtractor.get_dirty_pages():
215
214
  src_path = Path(page.file.abs_src_path)
216
215
  target_path = Path(page.file.abs_dest_path)
@@ -245,7 +244,7 @@ class MaestroPyLibs(MaestroGeneratedPages):
245
244
 
246
245
  base_py_libs: Set[str] = None # added on the fly
247
246
  """
248
- Set of all the python_libs paths strings, as declared in the plugins config (meta or not).
247
+ Set of all the python_libs paths strings, as declared in the plugin's config (meta or not).
249
248
  """
250
249
 
251
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 "SKIP"` sont autorisées pour les macros `run`,
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
  """}
@@ -298,6 +298,7 @@ class Case:
298
298
  - `stdKey`
299
299
  - `stdoutCutOff`
300
300
  - `twoCols`
301
+ - `useLocalStorage`
301
302
  - `userContent`
302
303
  - `whiteList`
303
304
  """
@@ -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 = {"&lt;":'<', "&gt;":'>', "\\<": '<'}
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(/\\</g, "<")
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
- /**args: generally: [sectionName, Runtime], but might be ["command"] for terminals. */
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 // Because always used for validations
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: deactivate again, so that it's always done, even on JS errors.
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
- 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
- }
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
- // Getters so that the RunnersManager can identify which is what more easily (if ever needed)
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
- makeDirty(){ throw new Error('Not implemented') } // sink with security
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
- /**Tell if the last run was successful or not, or if the content has been modified without
633
- * being run (handled unconditionally for all elements, even if they aren't "in sequential
634
- * runs". The GlobalRunnersManager handles what is actually to be run or not).
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(isDirty=true){
641
- this.isDirty = isDirty
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
 
@@ -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
- getStorage(editorId=null){
108
- editorId ??= this.id
109
- const extractForThis = editorId==this.id
110
- const storage = getIdeDataFromStorage(editorId, extractForThis?this:null)
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._updateInternalStorage(changes)
116
- localStorage.setItem(this.id, JSON.stringify(this.storage))
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
- resetElement(){
120
- super.resetElement()
121
- this.storage = freshStore({ide: this})
122
- localStorage.removeItem(this.id)
128
+ if(this.useLocalStorage){
129
+ localStorage.setItem(this.id, JSON.stringify(this.storage))
130
+ }
123
131
  }
124
132
 
125
- _updateInternalStorage(changes){
126
- if(changes){
127
- if(!this.storage) this.storage = {}
128
- for(const k in changes) this.storage[k] = changes[k]
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
 
@@ -66,11 +66,27 @@ class IdeAceManager extends IdeSplitScreenManager {
66
66
  }
67
67
 
68
68
 
69
- makeDirty(isDirty=true){
70
- super.makeDirty(isDirty)
71
- if(isDirty){
72
- this.setOrangeBox(true)
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){ // ...but ensure the default ending message is shown, ...
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
- // During public tests, if a validation button is present while running the public tests,
302
- // remind the user to try the validations if the IDE has the orange box or was not a success
303
- // on the last validation (keeping that consistent with the visuals, rather than the isDirty
304
- // implementation. This is because, for example, the starting state for isDirty and the box
305
- // are not aligned at all, so sequential runs cannot rely on the orange box and vice versa):
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=true){ // CodCap override: if @doFocus is true, send notifications to Capytale).
1128
- super.resetElement() // This marks the runner as dirty
1129
- // Cancel the orange box on resets (coming with this.makeDirty() in the super call)
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
- return this._applyAllCodesFromFileContent(this.storage.code)
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.7"
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"
@@ -1 +0,0 @@
1
- __version__ = "5.6.7"