slide_hero 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/README.md +1 -1
  4. data/lib/slide_hero/version.rb +1 -1
  5. data/lib/slide_hero/views/layout.html.erb +2 -2
  6. data/vendor/reveal.js/.gitignore +3 -1
  7. data/vendor/reveal.js/.travis.yml +1 -1
  8. data/vendor/reveal.js/CONTRIBUTING.md +19 -0
  9. data/vendor/reveal.js/Gruntfile.js +58 -21
  10. data/vendor/reveal.js/LICENSE +1 -1
  11. data/vendor/reveal.js/README.md +154 -74
  12. data/vendor/reveal.js/css/print/paper.css +193 -167
  13. data/vendor/reveal.js/css/print/pdf.css +20 -53
  14. data/vendor/reveal.js/css/reveal.css +912 -1651
  15. data/vendor/reveal.js/css/reveal.scss +1316 -0
  16. data/vendor/reveal.js/css/theme/README.md +1 -1
  17. data/vendor/reveal.js/css/theme/beige.css +177 -60
  18. data/vendor/reveal.js/css/theme/black.css +261 -0
  19. data/vendor/reveal.js/css/theme/blood.css +191 -75
  20. data/vendor/reveal.js/css/theme/league.css +267 -0
  21. data/vendor/reveal.js/css/theme/moon.css +168 -51
  22. data/vendor/reveal.js/css/theme/night.css +165 -42
  23. data/vendor/reveal.js/css/theme/serif.css +181 -58
  24. data/vendor/reveal.js/css/theme/simple.css +173 -50
  25. data/vendor/reveal.js/css/theme/sky.css +170 -47
  26. data/vendor/reveal.js/css/theme/solarized.css +168 -51
  27. data/vendor/reveal.js/css/theme/source/beige.scss +1 -12
  28. data/vendor/reveal.js/css/theme/source/black.scss +49 -0
  29. data/vendor/reveal.js/css/theme/source/blood.scss +4 -4
  30. data/vendor/reveal.js/css/theme/source/{default.scss → league.scss} +5 -13
  31. data/vendor/reveal.js/css/theme/source/moon.scss +1 -12
  32. data/vendor/reveal.js/css/theme/source/serif.scss +1 -1
  33. data/vendor/reveal.js/css/theme/source/sky.scss +1 -1
  34. data/vendor/reveal.js/css/theme/source/solarized.scss +1 -12
  35. data/vendor/reveal.js/css/theme/source/white.scss +49 -0
  36. data/vendor/reveal.js/css/theme/template/settings.scss +13 -4
  37. data/vendor/reveal.js/css/theme/template/theme.scss +182 -13
  38. data/vendor/reveal.js/css/theme/white.css +261 -0
  39. data/vendor/reveal.js/index.html +198 -178
  40. data/vendor/reveal.js/js/reveal.js +1286 -392
  41. data/vendor/reveal.js/lib/css/zenburn.css +74 -71
  42. data/vendor/reveal.js/lib/font/{league_gothic_license → league-gothic/LICENSE} +0 -0
  43. data/vendor/reveal.js/lib/font/league-gothic/league-gothic.css +10 -0
  44. data/vendor/reveal.js/lib/font/league-gothic/league-gothic.eot +0 -0
  45. data/vendor/reveal.js/lib/font/league-gothic/league-gothic.ttf +0 -0
  46. data/vendor/reveal.js/lib/font/league-gothic/league-gothic.woff +0 -0
  47. data/vendor/reveal.js/lib/font/source-sans-pro/LICENSE +45 -0
  48. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.eot +0 -0
  49. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.ttf +0 -0
  50. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.woff +0 -0
  51. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.eot +0 -0
  52. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.ttf +0 -0
  53. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.woff +0 -0
  54. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.eot +0 -0
  55. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.ttf +0 -0
  56. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.woff +0 -0
  57. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot +0 -0
  58. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf +0 -0
  59. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff +0 -0
  60. data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro.css +39 -0
  61. data/vendor/reveal.js/package.json +9 -7
  62. data/vendor/reveal.js/plugin/highlight/highlight.js +2 -4
  63. data/vendor/reveal.js/plugin/leap/leap.js +4 -2
  64. data/vendor/reveal.js/plugin/markdown/example.html +2 -2
  65. data/vendor/reveal.js/plugin/markdown/markdown.js +8 -7
  66. data/vendor/reveal.js/plugin/notes/notes.html +321 -182
  67. data/vendor/reveal.js/plugin/notes/notes.js +89 -45
  68. data/vendor/reveal.js/plugin/notes-server/client.js +49 -46
  69. data/vendor/reveal.js/plugin/notes-server/index.js +28 -21
  70. data/vendor/reveal.js/plugin/notes-server/notes.html +351 -97
  71. data/vendor/reveal.js/plugin/print-pdf/print-pdf.js +24 -20
  72. data/vendor/reveal.js/plugin/zoom-js/zoom.js +77 -57
  73. data/vendor/reveal.js/test/examples/barebones.html +2 -2
  74. data/vendor/reveal.js/test/examples/embedded-media.html +2 -2
  75. data/vendor/reveal.js/test/examples/math.html +2 -2
  76. data/vendor/reveal.js/test/examples/slide-backgrounds.html +29 -7
  77. data/vendor/reveal.js/test/test-markdown-element-attributes.html +6 -6
  78. data/vendor/reveal.js/test/test-markdown-slide-attributes.html +7 -7
  79. data/vendor/reveal.js/test/test-markdown.html +4 -4
  80. data/vendor/reveal.js/test/test-pdf.html +83 -0
  81. data/vendor/reveal.js/test/test-pdf.js +15 -0
  82. data/vendor/reveal.js/test/test.html +5 -4
  83. data/vendor/reveal.js/test/test.js +143 -9
  84. metadata +31 -13
  85. data/vendor/reveal.js/css/reveal.min.css +0 -7
  86. data/vendor/reveal.js/css/theme/default.css +0 -148
  87. data/vendor/reveal.js/js/reveal.min.js +0 -9
  88. data/vendor/reveal.js/lib/font/league_gothic-webfont.eot +0 -0
  89. data/vendor/reveal.js/lib/font/league_gothic-webfont.svg +0 -230
  90. data/vendor/reveal.js/lib/font/league_gothic-webfont.ttf +0 -0
  91. data/vendor/reveal.js/lib/font/league_gothic-webfont.woff +0 -0
  92. data/vendor/reveal.js/plugin/postmessage/example.html +0 -39
  93. data/vendor/reveal.js/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,
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' );