Capytale Jupyter Notebook : more tools

New features for Capytale's Jupyter's notebooks : (1) admonition's question quick add, (1) admonition's note quick add, (3) Admonition's spoiler button feature, (4) restart & clear all cells outputs shortcut

  1. // ==UserScript==
  2. // @name Capytale Jupyter Notebook : more tools
  3. // @namespace http://tampermonkey.net/
  4. // @version 2025-01-20d
  5. // @description New features for Capytale's Jupyter's notebooks : (1) admonition's question quick add, (1) admonition's note quick add, (3) Admonition's spoiler button feature, (4) restart & clear all cells outputs shortcut
  6. // @author James Web (in the area)
  7. // @supportURL https://codeberg.org/jrm-omg/userscripts
  8. // @include https://capytale2.ac-paris.fr/p/basthon/**
  9. // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
  10. // @grant none
  11. // @license MIT
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16. // Wait until Basthon's ready
  17. let ticTac;
  18. function myCallback() {
  19. if (document.querySelector('#MathJax_Message')) {
  20. // Basthon is ready, go go go !
  21. clearInterval(ticTac);
  22.  
  23. // (1) Admonition's question button feature
  24. function addAdmoQuestion() {
  25. let cell = Jupyter.notebook.insert_cell_below('markdown')
  26. cell.set_text('!!! question\n\n!!!')
  27. }
  28. let qEl = document.createElement('button');
  29. qEl.className = 'btn btn-default';
  30. qEl.title = 'Ajouter une admonition « question » après la cellule active';
  31. qEl.innerHTML = '<i class="fa-question-circle fa"></i>';
  32. qEl.addEventListener('click', addAdmoQuestion);
  33.  
  34. // (2) Admonition's note button feature
  35. function addAdmoNote() {
  36. let cell = Jupyter.notebook.insert_cell_below('markdown')
  37. cell.set_text('!!! note\n\n!!!')
  38. }
  39. let nEl = document.createElement('button');
  40. nEl.className = 'btn btn-default';
  41. nEl.title = 'Ajouter une admonition « note » après la cellule active';
  42. nEl.innerHTML = '<i class="fa-pencil fa"></i>';
  43. nEl.addEventListener('click', addAdmoNote);
  44.  
  45. // (3) Admonition's spoiler button feature
  46. function addAdmoSpoiler() {
  47. let cell = Jupyter.notebook.insert_cell_below('markdown')
  48. cell.set_text('??? quote Indice *— à ouvrir uniquement en cas de difficultés*\n\n???')
  49. }
  50. let sEl = document.createElement('button');
  51. sEl.className = 'btn btn-default';
  52. sEl.title = 'Ajouter une admonition « spoiler » après la cellule active';
  53. sEl.innerHTML = '<i class="fa-envelope-o fa"></i>';
  54. sEl.addEventListener('click', addAdmoSpoiler);
  55.  
  56. // (4) Restart & clear all cells outputs shortcut
  57. function restartAndClean() {
  58. document.querySelector('#restart_run_all').click();
  59. setTimeout(()=>{
  60. document.querySelector('.modal-footer .btn-danger').click();
  61. setTimeout(()=>{
  62. document.querySelector('#restart_clear_output').click();
  63. setTimeout(()=>{
  64. document.querySelector('.modal-footer .btn-danger').click();
  65. }, 500)
  66. }, 500)
  67. }, 500)
  68. }
  69. let rEl = document.createElement('button');
  70. rEl.className = 'btn btn-default';
  71. rEl.title = 'Tout exécuter + Effacer les sorties';
  72. rEl.innerHTML = '<i class="fa-truck fa"></i>';
  73. rEl.addEventListener('click', restartAndClean);
  74.  
  75. // Hiding the #cmd_palette .btn-group (to get more space)
  76. document.querySelector('#cmd_palette').style.display = 'none';
  77.  
  78. // Insert new buttons inside the user-scripts-group
  79. let usgEl = document.querySelector('.user-scripts-group');
  80. if (!usgEl) {
  81. usgEl = document.createElement('div');
  82. usgEl.className = 'btn-group user-scripts-group';
  83. document.querySelector('#maintoolbar-container').append(usgEl);
  84. }
  85. usgEl.append(qEl);
  86. usgEl.append(nEl);
  87. usgEl.append(sEl);
  88. usgEl.append(rEl);
  89. }
  90. }
  91. ticTac = setInterval(myCallback, 500);
  92. })();