From 0740711fdeadb4765a2e1f495ed85b4846ef926f Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Sun, 23 Jun 2019 12:42:22 +0200 Subject: Began presentation --- presentation/plugin/notes-server/client.js | 67 ++++ presentation/plugin/notes-server/index.js | 69 ++++ presentation/plugin/notes-server/notes.html | 590 ++++++++++++++++++++++++++++ 3 files changed, 726 insertions(+) create mode 100644 presentation/plugin/notes-server/client.js create mode 100644 presentation/plugin/notes-server/index.js create mode 100644 presentation/plugin/notes-server/notes.html (limited to 'presentation/plugin/notes-server') diff --git a/presentation/plugin/notes-server/client.js b/presentation/plugin/notes-server/client.js new file mode 100644 index 0000000..6a4d2e4 --- /dev/null +++ b/presentation/plugin/notes-server/client.js @@ -0,0 +1,67 @@ +(function () { + + // don't emit events from inside the previews themselves + if (window.location.search.match(/receiver/gi)) { + return; + } + + var socket = io.connect(window.location.origin), + socketId = Math.random().toString().slice(2); + + console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId); + + window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId); + + /** + * Posts the current slide data to the notes window + */ + function post() { + + var slideElement = Reveal.getCurrentSlide(), + notesElement = slideElement.querySelector('aside.notes'); + + var messageData = { + notes: '', + markdown: false, + socketId: socketId, + state: Reveal.getState() + }; + + // Look for notes defined in a slide attribute + if (slideElement.hasAttribute('data-notes')) { + messageData.notes = slideElement.getAttribute('data-notes'); + } + + // Look for notes defined in an aside element + if (notesElement) { + messageData.notes = notesElement.innerHTML; + messageData.markdown = typeof notesElement.getAttribute('data-markdown') === 'string'; + } + + socket.emit('statechanged', messageData); + + } + + // When a new notes window connects, post our current state + socket.on('new-subscriber', function (data) { + post(); + }); + + // When the state changes from inside of the speaker view + socket.on('statechanged-speaker', function (data) { + Reveal.setState(data.state); + }); + + // Monitor events that trigger a change in state + Reveal.addEventListener('slidechanged', post); + Reveal.addEventListener('fragmentshown', post); + Reveal.addEventListener('fragmenthidden', post); + Reveal.addEventListener('overviewhidden', post); + Reveal.addEventListener('overviewshown', post); + Reveal.addEventListener('paused', post); + Reveal.addEventListener('resumed', post); + + // Post the initial state + post(); + +}()); diff --git a/presentation/plugin/notes-server/index.js b/presentation/plugin/notes-server/index.js new file mode 100644 index 0000000..61d0180 --- /dev/null +++ b/presentation/plugin/notes-server/index.js @@ -0,0 +1,69 @@ +var http = require('http'); +var express = require('express'); +var fs = require('fs'); +var io = require('socket.io'); +var Mustache = require('mustache'); + +var app = express(); +var staticDir = express.static; +var server = http.createServer(app); + +io = io(server); + +var opts = { + port: 1947, + baseDir: __dirname + '/../../' +}; + +io.on('connection', function (socket) { + + socket.on('new-subscriber', function (data) { + socket.broadcast.emit('new-subscriber', data); + }); + + socket.on('statechanged', function (data) { + delete data.state.overview; + socket.broadcast.emit('statechanged', data); + }); + + socket.on('statechanged-speaker', function (data) { + delete data.state.overview; + socket.broadcast.emit('statechanged-speaker', data); + }); + +}); + +['css', 'js', 'images', 'plugin', 'lib'].forEach(function (dir) { + app.use('/' + dir, staticDir(opts.baseDir + dir)); +}); + +app.get('/', function (req, res) { + + res.writeHead(200, {'Content-Type': 'text/html'}); + fs.createReadStream(opts.baseDir + '/index.html').pipe(res); + +}); + +app.get('/notes/:socketId', function (req, res) { + + fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function (err, data) { + res.send(Mustache.to_html(data.toString(), { + socketId: req.params.socketId + })); + }); + +}); + +// Actually listen +server.listen(opts.port || null); + +var brown = '\033[33m', + green = '\033[32m', + reset = '\033[0m'; + +var slidesLocation = 'http://localhost' + (opts.port ? (':' + opts.port) : ''); + +console.log(brown + 'reveal.js - Speaker Notes' + reset); +console.log('1. Open the slides at ' + green + slidesLocation + reset); +console.log('2. Click on the link in your JS console to go to the notes page'); +console.log('3. Advance through your slides and your notes will advance automatically'); diff --git a/presentation/plugin/notes-server/notes.html b/presentation/plugin/notes-server/notes.html new file mode 100644 index 0000000..7a42256 --- /dev/null +++ b/presentation/plugin/notes-server/notes.html @@ -0,0 +1,590 @@ + + + + + + reveal.js - Slide Notes + + + + + + +
+
Upcoming
+
+
+

Time Click to Reset

+
+ 0:00 AM +
+
+ 00:00:00 +
+
+
+ + +
+
+ + +
+ + + + + + + + -- cgit v1.2.3