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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Capytale Jupyter Notebook : more tools
// @namespace    http://tampermonkey.net/
// @version      2025-01-20d
// @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
// @author       James Web (in the area)
// @supportURL   https://codeberg.org/jrm-omg/userscripts
// @include      https://capytale2.ac-paris.fr/p/basthon/**
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    // Wait until Basthon's ready
    let ticTac;
    function myCallback() {
        if (document.querySelector('#MathJax_Message')) {
            // Basthon is ready, go go go !
            clearInterval(ticTac);

            // (1) Admonition's question button feature
            function addAdmoQuestion() {
                let cell = Jupyter.notebook.insert_cell_below('markdown')
                cell.set_text('!!! question\n\n!!!')
            }
            let qEl = document.createElement('button');
            qEl.className = 'btn btn-default';
            qEl.title = 'Ajouter une admonition « question » après la cellule active';
            qEl.innerHTML = '<i class="fa-question-circle fa"></i>';
            qEl.addEventListener('click', addAdmoQuestion);

            // (2) Admonition's note button feature
            function addAdmoNote() {
                let cell = Jupyter.notebook.insert_cell_below('markdown')
                cell.set_text('!!! note\n\n!!!')
            }
            let nEl = document.createElement('button');
            nEl.className = 'btn btn-default';
            nEl.title = 'Ajouter une admonition « note » après la cellule active';
            nEl.innerHTML = '<i class="fa-pencil fa"></i>';
            nEl.addEventListener('click', addAdmoNote);

            // (3) Admonition's spoiler button feature
            function addAdmoSpoiler() {
                let cell = Jupyter.notebook.insert_cell_below('markdown')
                cell.set_text('??? quote Indice *— à ouvrir uniquement en cas de difficultés*\n\n???')
            }
            let sEl = document.createElement('button');
            sEl.className = 'btn btn-default';
            sEl.title = 'Ajouter une admonition « spoiler » après la cellule active';
            sEl.innerHTML = '<i class="fa-envelope-o fa"></i>';
            sEl.addEventListener('click', addAdmoSpoiler);

            // (4) Restart & clear all cells outputs shortcut
            function restartAndClean() {
                document.querySelector('#restart_run_all').click();
                setTimeout(()=>{
                    document.querySelector('.modal-footer .btn-danger').click();
                    setTimeout(()=>{
                        document.querySelector('#restart_clear_output').click();
                        setTimeout(()=>{
                            document.querySelector('.modal-footer .btn-danger').click();
                        }, 500)
                    }, 500)
                }, 500)
            }
            let rEl = document.createElement('button');
            rEl.className = 'btn btn-default';
            rEl.title = 'Tout exécuter + Effacer les sorties';
            rEl.innerHTML = '<i class="fa-truck fa"></i>';
            rEl.addEventListener('click', restartAndClean);

            // Hiding the #cmd_palette .btn-group (to get more space)
            document.querySelector('#cmd_palette').style.display = 'none';

            // Insert new buttons inside the user-scripts-group
            let usgEl = document.querySelector('.user-scripts-group');
            if (!usgEl) {
                usgEl = document.createElement('div');
                usgEl.className = 'btn-group user-scripts-group';
                document.querySelector('#maintoolbar-container').append(usgEl);
            }
            usgEl.append(qEl);
            usgEl.append(nEl);
            usgEl.append(sEl);
            usgEl.append(rEl);
        }
    }
    ticTac = setInterval(myCallback, 500);
})();