aboutsummaryrefslogtreecommitdiff
path: root/lib/slidenotes
diff options
context:
space:
mode:
Diffstat (limited to 'lib/slidenotes')
-rw-r--r--lib/slidenotes/index.js48
-rw-r--r--lib/slidenotes/notes.html85
2 files changed, 133 insertions, 0 deletions
diff --git a/lib/slidenotes/index.js b/lib/slidenotes/index.js
new file mode 100644
index 0000000..26b0463
--- /dev/null
+++ b/lib/slidenotes/index.js
@@ -0,0 +1,48 @@
+var express = require('express');
+var fs = require('fs');
+var io = require('socket.io');
+var _ = require('underscore');
+var Mustache = require('mustache');
+
+var app = express.createServer();
+var staticDir = express.static;
+
+io = io.listen(app);
+
+var opts = {
+ port : 1947,
+ baseDir : __dirname + '/../../'
+};
+
+io.sockets.on('connection', function(socket) {
+ socket.on('slidechanged', function(slideData) {
+ socket.broadcast.emit('slidedata', slideData);
+ });
+});
+
+app.configure(function() {
+ [ 'css', 'assets', 'js', 'lib' ].forEach(function(dir) {
+ app.use('/' + dir, staticDir(opts.baseDir + dir));
+ });
+});
+
+app.get("/", function(req, res) {
+ fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
+});
+
+app.get("/_notes/:socketId", function(req, res) {
+
+ fs.readFile(opts.baseDir + 'slidenotes/notes.html', function(err, data) {
+ res.send(Mustache.to_html(data.toString(), {
+ socketId : req.params.socketId
+ }));
+ });
+ // fs.createReadStream(opts.baseDir + 'slidenotes/notes.html').pipe(res);
+});
+
+// Actually listen
+app.listen(opts.port || null);
+
+console.log("Your slides are at http://localhost" + (opts.port ? (':' + opts.port) : ''));
+console.log("Your notes are at http://localhost" + (opts.port ? (':' + opts.port) : '') + '/_notes');
+console.log("Advance through your slides and your speaker notes will advance automatically");
diff --git a/lib/slidenotes/notes.html b/lib/slidenotes/notes.html
new file mode 100644
index 0000000..58c2516
--- /dev/null
+++ b/lib/slidenotes/notes.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+
+ <title>Slide Notes</title>
+
+ <style>
+ #notes {
+ font-family: Helvetica;
+ font-size: 24px;
+ width: 640px;
+ }
+
+ #wrap-slides {
+ width: 640px;
+ height: 512px;
+ float: left;
+ }
+
+ #slides {
+ width: 1280px;
+ height: 1024px;
+ border: 1px solid black;
+ -moz-transform: scale(0.5);
+ -moz-transform-origin: 0 0;
+ -o-transform: scale(0.5);
+ -o-transform-origin: 0 0;
+ -webkit-transform: scale(0.5);
+ -webkit-transform-origin: 0 0;
+ }
+
+ #wrap-next-slide {
+ width: 320px;
+ height: 256px;
+ float: left;
+ margin: 0 0 0 50px;
+ }
+
+ #next-slide {
+ width: 1280px;
+ height: 1024px;
+ border: 1px solid black;
+ -moz-transform: scale(0.25);
+ -moz-transform-origin: 0 0;
+ -o-transform: scale(0.25);
+ -o-transform-origin: 0 0;
+ -webkit-transform: scale(0.25);
+ -webkit-transform-origin: 0 0;
+ }
+ </style>
+ </head>
+
+ <body>
+
+ <div id="wrap-slides">
+ <iframe src="/?receiver" width="1280" height="1024" id="slides"></iframe>
+ </div>
+
+ <div id="wrap-next-slide">
+ <iframe src="/?receiver" width="640" height="512" id="next-slide"></iframe>
+ </div>
+ <div id="notes"></div>
+
+ <script src="/socket.io/socket.io.js"></script>
+
+ <script>
+ var socketId = '{{socketId}}';
+ var socket = io.connect(window.location.origin);
+ var notes = document.getElementById('notes');
+ var slides = document.getElementById('slides');
+ var nextSlide = document.getElementById('next-slide');
+
+ socket.on('slidedata', function(data) {
+ // ignore data from sockets that aren't ours
+ if (data.socketId !== socketId) { return; }
+
+ notes.innerHTML = data.notes;
+ slides.contentWindow.Reveal.navigateTo(data.indexh, data.indexv);
+ nextSlide.contentWindow.Reveal.navigateTo(data.nextindexh, data.nextindexv);
+ });
+ </script>
+
+ </body>
+</html>