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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/README.md +1 -1
- data/lib/slide_hero/version.rb +1 -1
- data/lib/slide_hero/views/layout.html.erb +2 -2
- data/vendor/reveal.js/.gitignore +3 -1
- data/vendor/reveal.js/.travis.yml +1 -1
- data/vendor/reveal.js/CONTRIBUTING.md +19 -0
- data/vendor/reveal.js/Gruntfile.js +58 -21
- data/vendor/reveal.js/LICENSE +1 -1
- data/vendor/reveal.js/README.md +154 -74
- data/vendor/reveal.js/css/print/paper.css +193 -167
- data/vendor/reveal.js/css/print/pdf.css +20 -53
- data/vendor/reveal.js/css/reveal.css +912 -1651
- data/vendor/reveal.js/css/reveal.scss +1316 -0
- data/vendor/reveal.js/css/theme/README.md +1 -1
- data/vendor/reveal.js/css/theme/beige.css +177 -60
- data/vendor/reveal.js/css/theme/black.css +261 -0
- data/vendor/reveal.js/css/theme/blood.css +191 -75
- data/vendor/reveal.js/css/theme/league.css +267 -0
- data/vendor/reveal.js/css/theme/moon.css +168 -51
- data/vendor/reveal.js/css/theme/night.css +165 -42
- data/vendor/reveal.js/css/theme/serif.css +181 -58
- data/vendor/reveal.js/css/theme/simple.css +173 -50
- data/vendor/reveal.js/css/theme/sky.css +170 -47
- data/vendor/reveal.js/css/theme/solarized.css +168 -51
- data/vendor/reveal.js/css/theme/source/beige.scss +1 -12
- data/vendor/reveal.js/css/theme/source/black.scss +49 -0
- data/vendor/reveal.js/css/theme/source/blood.scss +4 -4
- data/vendor/reveal.js/css/theme/source/{default.scss → league.scss} +5 -13
- data/vendor/reveal.js/css/theme/source/moon.scss +1 -12
- data/vendor/reveal.js/css/theme/source/serif.scss +1 -1
- data/vendor/reveal.js/css/theme/source/sky.scss +1 -1
- data/vendor/reveal.js/css/theme/source/solarized.scss +1 -12
- data/vendor/reveal.js/css/theme/source/white.scss +49 -0
- data/vendor/reveal.js/css/theme/template/settings.scss +13 -4
- data/vendor/reveal.js/css/theme/template/theme.scss +182 -13
- data/vendor/reveal.js/css/theme/white.css +261 -0
- data/vendor/reveal.js/index.html +198 -178
- data/vendor/reveal.js/js/reveal.js +1286 -392
- data/vendor/reveal.js/lib/css/zenburn.css +74 -71
- data/vendor/reveal.js/lib/font/{league_gothic_license → league-gothic/LICENSE} +0 -0
- data/vendor/reveal.js/lib/font/league-gothic/league-gothic.css +10 -0
- data/vendor/reveal.js/lib/font/league-gothic/league-gothic.eot +0 -0
- data/vendor/reveal.js/lib/font/league-gothic/league-gothic.ttf +0 -0
- data/vendor/reveal.js/lib/font/league-gothic/league-gothic.woff +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/LICENSE +45 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.eot +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.ttf +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.woff +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.eot +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.ttf +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.woff +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.eot +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.ttf +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.woff +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff +0 -0
- data/vendor/reveal.js/lib/font/source-sans-pro/source-sans-pro.css +39 -0
- data/vendor/reveal.js/package.json +9 -7
- data/vendor/reveal.js/plugin/highlight/highlight.js +2 -4
- data/vendor/reveal.js/plugin/leap/leap.js +4 -2
- data/vendor/reveal.js/plugin/markdown/example.html +2 -2
- data/vendor/reveal.js/plugin/markdown/markdown.js +8 -7
- data/vendor/reveal.js/plugin/notes/notes.html +321 -182
- data/vendor/reveal.js/plugin/notes/notes.js +89 -45
- data/vendor/reveal.js/plugin/notes-server/client.js +49 -46
- data/vendor/reveal.js/plugin/notes-server/index.js +28 -21
- data/vendor/reveal.js/plugin/notes-server/notes.html +351 -97
- data/vendor/reveal.js/plugin/print-pdf/print-pdf.js +24 -20
- data/vendor/reveal.js/plugin/zoom-js/zoom.js +77 -57
- data/vendor/reveal.js/test/examples/barebones.html +2 -2
- data/vendor/reveal.js/test/examples/embedded-media.html +2 -2
- data/vendor/reveal.js/test/examples/math.html +2 -2
- data/vendor/reveal.js/test/examples/slide-backgrounds.html +29 -7
- data/vendor/reveal.js/test/test-markdown-element-attributes.html +6 -6
- data/vendor/reveal.js/test/test-markdown-slide-attributes.html +7 -7
- data/vendor/reveal.js/test/test-markdown.html +4 -4
- data/vendor/reveal.js/test/test-pdf.html +83 -0
- data/vendor/reveal.js/test/test-pdf.js +15 -0
- data/vendor/reveal.js/test/test.html +5 -4
- data/vendor/reveal.js/test/test.js +143 -9
- metadata +31 -13
- data/vendor/reveal.js/css/reveal.min.css +0 -7
- data/vendor/reveal.js/css/theme/default.css +0 -148
- data/vendor/reveal.js/js/reveal.min.js +0 -9
- data/vendor/reveal.js/lib/font/league_gothic-webfont.eot +0 -0
- data/vendor/reveal.js/lib/font/league_gothic-webfont.svg +0 -230
- data/vendor/reveal.js/lib/font/league_gothic-webfont.ttf +0 -0
- data/vendor/reveal.js/lib/font/league_gothic-webfont.woff +0 -0
- data/vendor/reveal.js/plugin/postmessage/example.html +0 -39
- 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=
|
|
17
|
+
var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1100,height=700' );
|
|
11
18
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
55
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
connect();
|
|
63
97
|
}
|
|
64
98
|
|
|
65
|
-
|
|
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
|
-
|
|
72
|
-
|
|
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
|
-
|
|
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
|
|
4
|
-
|
|
5
|
-
var socket = io.connect(window.location.origin)
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
if
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
19
|
-
|
|
17
|
+
io.sockets.on( 'connection', function( socket ) {
|
|
18
|
+
|
|
19
|
+
socket.on( 'connect', function( data ) {
|
|
20
|
+
socket.broadcast.emit( 'connect', data );
|
|
20
21
|
});
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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(
|
|
33
|
-
|
|
34
|
-
|
|
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(
|
|
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
|
-
|
|
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 =
|
|
61
|
+
var slidesLocation = 'http://localhost' + ( opts.port ? ( ':' + opts.port ) : '' );
|
|
55
62
|
|
|
56
|
-
console.log( brown +
|
|
57
|
-
console.log(
|
|
58
|
-
console.log(
|
|
59
|
-
console.log(
|
|
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' );
|