From 1a048327755263b793d8410f6f9a5e6284e0c092 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Schl=C3=BCter?= Date: Thu, 28 Mar 2024 19:06:42 +0100 Subject: [PATCH 1/2] Add RISE-lab plugin for jupyterlab_rise --- plugins/rise-lab.js | 69 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 plugins/rise-lab.js diff --git a/plugins/rise-lab.js b/plugins/rise-lab.js new file mode 100644 index 0000000..2d00fc4 --- /dev/null +++ b/plugins/rise-lab.js @@ -0,0 +1,69 @@ +// Plugin for jupyterlab_rise presentations, based on the generic plugin. +// Slides are advanced by key presses; the deck is over when the URL stays unchanged. + +export const help = +`Exports a jupyterlab_rise presentation by advancing with space key presses and +ending when the part after the # in the URL did not change. To use it, start +"jupyter lab", and call decktape with a URL of the form: +http://server:port/rise/your_path/your_notebook.ipynb?token=your_token`; + +export const create = page => new RISElab(page); + +class RISElab { + constructor(page) { + this.page = page; + this.currentSlide = undefined; + } + + getName() { + return 'RISE-lab'; + } + + isActive() { + return true; + } + + async configure() { + // Wait for the presentation to be fully loaded + await this.page.waitForSelector('.reveal-viewport', { timeout: 30000 }); + await this.page.evaluate(_ => { + // Hide "click here to add a new cell" + const footers = document.getElementsByClassName('jp-Notebook-footer'); + for (var i = 0; i < footers.length; i++) { + footers[i].style.display = 'none'; + } + // Hide help button so we do not need to wait for it to fade + const help_btn = document.getElementById('help-b'); + if (help_btn) { + help_btn.style.display = 'none'; + } + }); + this.currentSlide = await this.currentSlideIndex(); + } + + slideCount() { + return undefined; + } + + async hasNextSlide() { + // We try to advance and check whether the URL changed + await this.page.keyboard.press('Space'); + const nextSlide = await this.currentSlideIndex(); + if (nextSlide != this.currentSlide) { + this.currentSlide = nextSlide; + return true; + } + return false; + } + + nextSlide() { + // We already advanced in hasNextSlide(), nothing to do + } + + async currentSlideIndex() { + // We use the part after the # in the URL as the slide name + const hash = await this.page.evaluate(_ => window.location.hash); + const [, fragment] = hash.match(/^#\/?([^?]*)/) || []; + return fragment; + } +} From 64c27d5ad9184f405ab54b599b84ad99e1471746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Schl=C3=BCter?= Date: Tue, 9 Apr 2024 16:30:44 +0200 Subject: [PATCH 2/2] Activate RISE-lab only on a probable jupyterlab_rise page --- plugins/rise-lab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/rise-lab.js b/plugins/rise-lab.js index 2d00fc4..c7fd7d8 100644 --- a/plugins/rise-lab.js +++ b/plugins/rise-lab.js @@ -20,7 +20,7 @@ class RISElab { } isActive() { - return true; + return this.page.evaluate(_ => { return document.title == 'Rise' }); } async configure() {