reveal.rb 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/Gemfile.lock +15 -1
  4. data/README.md +8 -1
  5. data/Rakefile +7 -0
  6. data/lib/reveal/cli.rb +15 -97
  7. data/lib/reveal/command.rb +109 -0
  8. data/lib/reveal/templates/revealjs/css/print/paper.css +193 -167
  9. data/lib/reveal/templates/revealjs/css/print/pdf.css +20 -53
  10. data/lib/reveal/templates/revealjs/css/reveal.css +1175 -0
  11. data/lib/reveal/templates/revealjs/css/theme/beige.css +183 -60
  12. data/lib/reveal/templates/revealjs/css/theme/black.css +267 -0
  13. data/lib/reveal/templates/revealjs/css/theme/blood.css +190 -80
  14. data/lib/reveal/templates/revealjs/css/theme/league.css +273 -0
  15. data/lib/reveal/templates/revealjs/css/theme/moon.css +174 -51
  16. data/lib/reveal/templates/revealjs/css/theme/night.css +171 -42
  17. data/lib/reveal/templates/revealjs/css/theme/serif.css +187 -58
  18. data/lib/reveal/templates/revealjs/css/theme/simple.css +179 -50
  19. data/lib/reveal/templates/revealjs/css/theme/sky.css +176 -47
  20. data/lib/reveal/templates/revealjs/css/theme/solarized.css +174 -51
  21. data/lib/reveal/templates/revealjs/css/theme/white.css +267 -0
  22. data/lib/reveal/templates/revealjs/index.html +411 -0
  23. data/lib/reveal/templates/revealjs/js/reveal.js +4508 -0
  24. data/lib/reveal/templates/revealjs/lib/css/zenburn.css +74 -71
  25. data/lib/reveal/templates/revealjs/lib/font/{league_gothic_license → league-gothic/LICENSE} +0 -0
  26. data/lib/reveal/templates/revealjs/lib/font/league-gothic/league-gothic.css +10 -0
  27. data/lib/reveal/templates/revealjs/lib/font/league-gothic/league-gothic.eot +0 -0
  28. data/lib/reveal/templates/revealjs/lib/font/league-gothic/league-gothic.ttf +0 -0
  29. data/lib/reveal/templates/revealjs/lib/font/league-gothic/league-gothic.woff +0 -0
  30. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/LICENSE +45 -0
  31. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-italic.eot +0 -0
  32. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-italic.ttf +0 -0
  33. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-italic.woff +0 -0
  34. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-regular.eot +0 -0
  35. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-regular.ttf +0 -0
  36. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-regular.woff +0 -0
  37. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-semibold.eot +0 -0
  38. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-semibold.ttf +0 -0
  39. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-semibold.woff +0 -0
  40. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot +0 -0
  41. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf +0 -0
  42. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff +0 -0
  43. data/lib/reveal/templates/revealjs/lib/font/source-sans-pro/source-sans-pro.css +39 -0
  44. data/lib/reveal/templates/revealjs/lib/js/html5shiv.js +0 -0
  45. data/lib/reveal/templates/revealjs/plugin/highlight/highlight.js +2 -4
  46. data/lib/reveal/templates/revealjs/plugin/leap/leap.js +4 -2
  47. data/lib/reveal/templates/revealjs/plugin/markdown/example.html +3 -3
  48. data/lib/reveal/templates/revealjs/plugin/markdown/example.md +0 -0
  49. data/lib/reveal/templates/revealjs/plugin/markdown/markdown.js +10 -9
  50. data/lib/reveal/templates/revealjs/plugin/markdown/marked.js +2 -33
  51. data/lib/reveal/templates/revealjs/plugin/math/math.js +1 -1
  52. data/lib/reveal/templates/revealjs/plugin/multiplex/client.js +0 -0
  53. data/lib/reveal/templates/revealjs/plugin/multiplex/index.js +0 -0
  54. data/lib/reveal/templates/revealjs/plugin/multiplex/master.js +0 -0
  55. data/lib/reveal/templates/revealjs/plugin/notes/notes.html +321 -182
  56. data/lib/reveal/templates/revealjs/plugin/notes/notes.js +89 -45
  57. data/lib/reveal/templates/revealjs/plugin/notes-server/client.js +49 -46
  58. data/lib/reveal/templates/revealjs/plugin/notes-server/index.js +28 -21
  59. data/lib/reveal/templates/revealjs/plugin/notes-server/notes.html +351 -97
  60. data/lib/reveal/templates/revealjs/plugin/print-pdf/print-pdf.js +24 -20
  61. data/lib/reveal/templates/revealjs/plugin/remotes/remotes.js +0 -0
  62. data/lib/reveal/templates/revealjs/plugin/search/search.js +0 -0
  63. data/lib/reveal/templates/revealjs/plugin/zoom-js/zoom.js +78 -58
  64. data/lib/reveal/templates/template.html +17 -24
  65. data/lib/reveal/version.rb +1 -1
  66. data/lib/reveal.rb +1 -0
  67. data/reveal.rb.gemspec +3 -0
  68. data/spec/lib/reveal/cli_spec.rb +26 -0
  69. data/spec/lib/reveal/command_spec.rb +165 -0
  70. metadata +65 -28
  71. data/lib/reveal/templates/revealjs/css/reveal.min.css +0 -7
  72. data/lib/reveal/templates/revealjs/css/theme/README.md +0 -25
  73. data/lib/reveal/templates/revealjs/css/theme/default.css +0 -148
  74. data/lib/reveal/templates/revealjs/css/theme/source/beige.scss +0 -50
  75. data/lib/reveal/templates/revealjs/css/theme/source/blood.scss +0 -91
  76. data/lib/reveal/templates/revealjs/css/theme/source/default.scss +0 -42
  77. data/lib/reveal/templates/revealjs/css/theme/source/moon.scss +0 -68
  78. data/lib/reveal/templates/revealjs/css/theme/source/night.scss +0 -35
  79. data/lib/reveal/templates/revealjs/css/theme/source/serif.scss +0 -35
  80. data/lib/reveal/templates/revealjs/css/theme/source/simple.scss +0 -38
  81. data/lib/reveal/templates/revealjs/css/theme/source/sky.scss +0 -46
  82. data/lib/reveal/templates/revealjs/css/theme/source/solarized.scss +0 -74
  83. data/lib/reveal/templates/revealjs/css/theme/template/mixins.scss +0 -29
  84. data/lib/reveal/templates/revealjs/css/theme/template/settings.scss +0 -34
  85. data/lib/reveal/templates/revealjs/css/theme/template/theme.scss +0 -170
  86. data/lib/reveal/templates/revealjs/js/reveal.min.js +0 -9
  87. data/lib/reveal/templates/revealjs/lib/font/league_gothic-webfont.eot +0 -0
  88. data/lib/reveal/templates/revealjs/lib/font/league_gothic-webfont.svg +0 -230
  89. data/lib/reveal/templates/revealjs/lib/font/league_gothic-webfont.ttf +0 -0
  90. data/lib/reveal/templates/revealjs/lib/font/league_gothic-webfont.woff +0 -0
  91. data/lib/reveal/templates/revealjs/plugin/postmessage/example.html +0 -39
  92. data/lib/reveal/templates/revealjs/plugin/postmessage/postmessage.js +0 -42
@@ -1,78 +1,122 @@
1
1
  /**
2
2
  * Handles opening of and synchronization with the reveal.js
3
3
  * notes window.
4
+ *
5
+ * Handshake process:
6
+ * 1. This window posts 'connect' to notes window
7
+ * - Includes URL of presentation to show
8
+ * 2. Notes window responds with 'connected' when it is available
9
+ * 3. This window proceeds to send the current presentation state
10
+ * to the notes window
4
11
  */
5
12
  var RevealNotes = (function() {
6
13
 
7
14
  function openNotes() {
8
15
  var jsFileLocation = document.querySelector('script[src$="notes.js"]').src; // this js file path
9
16
  jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, ''); // the js folder path
10
- var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1120,height=850' );
17
+ var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1100,height=700' );
11
18
 
12
- // Fires when slide is changed
13
- Reveal.addEventListener( 'slidechanged', post );
14
-
15
- // Fires when a fragment is shown
16
- Reveal.addEventListener( 'fragmentshown', post );
19
+ /**
20
+ * Connect to the notes window through a postmessage handshake.
21
+ * Using postmessage enables us to work in situations where the
22
+ * origins differ, such as a presentation being opened from the
23
+ * file system.
24
+ */
25
+ function connect() {
26
+ // Keep trying to connect until we get a 'connected' message back
27
+ var connectInterval = setInterval( function() {
28
+ notesPopup.postMessage( JSON.stringify( {
29
+ namespace: 'reveal-notes',
30
+ type: 'connect',
31
+ url: window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search,
32
+ state: Reveal.getState()
33
+ } ), '*' );
34
+ }, 500 );
17
35
 
18
- // Fires when a fragment is hidden
19
- Reveal.addEventListener( 'fragmenthidden', post );
36
+ window.addEventListener( 'message', function( event ) {
37
+ var data = JSON.parse( event.data );
38
+ if( data && data.namespace === 'reveal-notes' && data.type === 'connected' ) {
39
+ clearInterval( connectInterval );
40
+ onConnected();
41
+ }
42
+ } );
43
+ }
20
44
 
21
45
  /**
22
46
  * Posts the current slide data to the notes window
23
47
  */
24
48
  function post() {
49
+
25
50
  var slideElement = Reveal.getCurrentSlide(),
26
- slideIndices = Reveal.getIndices(),
27
- messageData;
28
-
29
- var notes = slideElement.querySelector( 'aside.notes' ),
30
- nextindexh,
31
- nextindexv;
32
-
33
- if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) {
34
- nextindexh = slideIndices.h;
35
- nextindexv = slideIndices.v + 1;
36
- } else {
37
- nextindexh = slideIndices.h + 1;
38
- nextindexv = 0;
39
- }
51
+ notesElement = slideElement.querySelector( 'aside.notes' );
40
52
 
41
- messageData = {
42
- notes : notes ? notes.innerHTML : '',
43
- indexh : slideIndices.h,
44
- indexv : slideIndices.v,
45
- indexf : slideIndices.f,
46
- nextindexh : nextindexh,
47
- nextindexv : nextindexv,
48
- markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false
53
+ var messageData = {
54
+ namespace: 'reveal-notes',
55
+ type: 'state',
56
+ notes: '',
57
+ markdown: false,
58
+ state: Reveal.getState()
49
59
  };
50
60
 
61
+ // Look for notes defined in a slide attribute
62
+ if( slideElement.hasAttribute( 'data-notes' ) ) {
63
+ messageData.notes = slideElement.getAttribute( 'data-notes' );
64
+ }
65
+
66
+ // Look for notes defined in an aside element
67
+ if( notesElement ) {
68
+ messageData.notes = notesElement.innerHTML;
69
+ messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string';
70
+ }
71
+
51
72
  notesPopup.postMessage( JSON.stringify( messageData ), '*' );
73
+
52
74
  }
53
75
 
54
- // Navigate to the current slide when the notes are loaded
55
- notesPopup.addEventListener( 'load', function( event ) {
76
+ /**
77
+ * Called once we have established a connection to the notes
78
+ * window.
79
+ */
80
+ function onConnected() {
81
+
82
+ // Monitor events that trigger a change in state
83
+ Reveal.addEventListener( 'slidechanged', post );
84
+ Reveal.addEventListener( 'fragmentshown', post );
85
+ Reveal.addEventListener( 'fragmenthidden', post );
86
+ Reveal.addEventListener( 'overviewhidden', post );
87
+ Reveal.addEventListener( 'overviewshown', post );
88
+ Reveal.addEventListener( 'paused', post );
89
+ Reveal.addEventListener( 'resumed', post );
90
+
91
+ // Post the initial state
56
92
  post();
57
- }, false );
58
- }
59
93
 
60
- // If the there's a 'notes' query set, open directly
61
- if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
62
- openNotes();
94
+ }
95
+
96
+ connect();
63
97
  }
64
98
 
65
- // Open the notes when the 's' key is hit
66
- document.addEventListener( 'keydown', function( event ) {
67
- // Disregard the event if the target is editable or a
68
- // modifier is present
69
- if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
99
+ if( !/receiver/i.test( window.location.search ) ) {
70
100
 
71
- if( event.keyCode === 83 ) {
72
- event.preventDefault();
101
+ // If the there's a 'notes' query set, open directly
102
+ if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
73
103
  openNotes();
74
104
  }
75
- }, false );
105
+
106
+ // Open the notes when the 's' key is hit
107
+ document.addEventListener( 'keydown', function( event ) {
108
+ // Disregard the event if the target is editable or a
109
+ // modifier is present
110
+ if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
111
+
112
+ if( event.keyCode === 83 ) {
113
+ event.preventDefault();
114
+ openNotes();
115
+ }
116
+ }, false );
117
+
118
+ }
76
119
 
77
120
  return { open: openNotes };
121
+
78
122
  })();
@@ -1,57 +1,60 @@
1
1
  (function() {
2
+
2
3
  // don't emit events from inside the previews themselves
3
- if ( window.location.search.match( /receiver/gi ) ) { return; }
4
-
5
- var socket = io.connect(window.location.origin);
6
- var socketId = Math.random().toString().slice(2);
7
-
8
- console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
9
- window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId);
10
-
11
- // Fires when a fragment is shown
12
- Reveal.addEventListener( 'fragmentshown', function( event ) {
13
- var fragmentData = {
14
- fragment : 'next',
15
- socketId : socketId
16
- };
17
- socket.emit('fragmentchanged', fragmentData);
18
- } );
4
+ if( window.location.search.match( /receiver/gi ) ) { return; }
5
+
6
+ var socket = io.connect( window.location.origin ),
7
+ socketId = Math.random().toString().slice( 2 );
8
+
9
+ console.log( 'View slide notes at ' + window.location.origin + '/notes/' + socketId );
10
+
11
+ window.open( window.location.origin + '/notes/' + socketId, 'notes-' + socketId );
12
+
13
+ /**
14
+ * Posts the current slide data to the notes window
15
+ */
16
+ function post() {
17
+
18
+ var slideElement = Reveal.getCurrentSlide(),
19
+ notesElement = slideElement.querySelector( 'aside.notes' );
19
20
 
20
- // Fires when a fragment is hidden
21
- Reveal.addEventListener( 'fragmenthidden', function( event ) {
22
- var fragmentData = {
23
- fragment : 'previous',
24
- socketId : socketId
21
+ var messageData = {
22
+ notes: '',
23
+ markdown: false,
24
+ socketId: socketId,
25
+ state: Reveal.getState()
25
26
  };
26
- socket.emit('fragmentchanged', fragmentData);
27
- } );
28
27
 
29
- // Fires when slide is changed
30
- Reveal.addEventListener( 'slidechanged', function( event ) {
31
- var nextindexh;
32
- var nextindexv;
33
- var slideElement = event.currentSlide;
34
-
35
- if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
36
- nextindexh = event.indexh;
37
- nextindexv = event.indexv + 1;
38
- } else {
39
- nextindexh = event.indexh + 1;
40
- nextindexv = 0;
28
+ // Look for notes defined in a slide attribute
29
+ if( slideElement.hasAttribute( 'data-notes' ) ) {
30
+ messageData.notes = slideElement.getAttribute( 'data-notes' );
31
+ }
32
+
33
+ // Look for notes defined in an aside element
34
+ if( notesElement ) {
35
+ messageData.notes = notesElement.innerHTML;
36
+ messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string';
41
37
  }
42
38
 
43
- var notes = slideElement.querySelector('aside.notes');
44
- var slideData = {
45
- notes : notes ? notes.innerHTML : '',
46
- indexh : event.indexh,
47
- indexv : event.indexv,
48
- nextindexh : nextindexh,
49
- nextindexv : nextindexv,
50
- socketId : socketId,
51
- markdown : notes ? typeof notes.getAttribute('data-markdown') === 'string' : false
39
+ socket.emit( 'statechanged', messageData );
52
40
 
53
- };
41
+ }
54
42
 
55
- socket.emit('slidechanged', slideData);
43
+ // When a new notes window connects, post our current state
44
+ socket.on( 'connect', function( data ) {
45
+ post();
56
46
  } );
47
+
48
+ // Monitor events that trigger a change in state
49
+ Reveal.addEventListener( 'slidechanged', post );
50
+ Reveal.addEventListener( 'fragmentshown', post );
51
+ Reveal.addEventListener( 'fragmenthidden', post );
52
+ Reveal.addEventListener( 'overviewhidden', post );
53
+ Reveal.addEventListener( 'overviewshown', post );
54
+ Reveal.addEventListener( 'paused', post );
55
+ Reveal.addEventListener( 'resumed', post );
56
+
57
+ // Post the initial state
58
+ post();
59
+
57
60
  }());
@@ -14,46 +14,53 @@ var opts = {
14
14
  baseDir : __dirname + '/../../'
15
15
  };
16
16
 
17
- io.sockets.on('connection', function(socket) {
18
- socket.on('slidechanged', function(slideData) {
19
- socket.broadcast.emit('slidedata', slideData);
17
+ io.sockets.on( 'connection', function( socket ) {
18
+
19
+ socket.on( 'connect', function( data ) {
20
+ socket.broadcast.emit( 'connect', data );
20
21
  });
21
- socket.on('fragmentchanged', function(fragmentData) {
22
- socket.broadcast.emit('fragmentdata', fragmentData);
22
+
23
+ socket.on( 'statechanged', function( data ) {
24
+ socket.broadcast.emit( 'statechanged', data );
23
25
  });
26
+
24
27
  });
25
28
 
26
- app.configure(function() {
27
- [ 'css', 'js', 'images', 'plugin', 'lib' ].forEach(function(dir) {
28
- app.use('/' + dir, staticDir(opts.baseDir + dir));
29
+ app.configure( function() {
30
+
31
+ [ 'css', 'js', 'images', 'plugin', 'lib' ].forEach( function( dir ) {
32
+ app.use( '/' + dir, staticDir( opts.baseDir + dir ) );
29
33
  });
34
+
30
35
  });
31
36
 
32
- app.get("/", function(req, res) {
33
- res.writeHead(200, {'Content-Type': 'text/html'});
34
- fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
37
+ app.get('/', function( req, res ) {
38
+
39
+ res.writeHead( 200, { 'Content-Type': 'text/html' } );
40
+ fs.createReadStream( opts.baseDir + '/index.html' ).pipe( res );
41
+
35
42
  });
36
43
 
37
- app.get("/notes/:socketId", function(req, res) {
44
+ app.get( '/notes/:socketId', function( req, res ) {
38
45
 
39
- fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function(err, data) {
40
- res.send(Mustache.to_html(data.toString(), {
46
+ fs.readFile( opts.baseDir + 'plugin/notes-server/notes.html', function( err, data ) {
47
+ res.send( Mustache.to_html( data.toString(), {
41
48
  socketId : req.params.socketId
42
49
  }));
43
50
  });
44
- // fs.createReadStream(opts.baseDir + 'notes-server/notes.html').pipe(res);
51
+
45
52
  });
46
53
 
47
54
  // Actually listen
48
- app.listen(opts.port || null);
55
+ app.listen( opts.port || null );
49
56
 
50
57
  var brown = '\033[33m',
51
58
  green = '\033[32m',
52
59
  reset = '\033[0m';
53
60
 
54
- var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
61
+ var slidesLocation = 'http://localhost' + ( opts.port ? ( ':' + opts.port ) : '' );
55
62
 
56
- console.log( brown + "reveal.js - Speaker Notes" + reset );
57
- console.log( "1. Open the slides at " + green + slidesLocation + reset );
58
- console.log( "2. Click on the link your JS console to go to the notes page" );
59
- console.log( "3. Advance through your slides and your notes will advance automatically" );
63
+ console.log( brown + 'reveal.js - Speaker Notes' + reset );
64
+ console.log( '1. Open the slides at ' + green + slidesLocation + reset );
65
+ console.log( '2. Click on the link your JS console to go to the notes page' );
66
+ console.log( '3. Advance through your slides and your notes will advance automatically' );