resolve notes merge conflict

edit
Hakim El Hattab 2018-10-04 12:32:28 +02:00
commit 8582c9aac8
4 changed files with 173 additions and 81 deletions

View File

@ -24,8 +24,23 @@
<body> <body>
<div class="reveal"> <div class="reveal">
<div class="slides"> <div class="slides">
<section>Slide 1</section> <section data-timing="6">
<section>Slide 2</section> Slide 1
<aside>
these are not notes
</aside>
<aside class="notes">
these are notes for the first slide
</aside>
</section>
<section>
Slide 2
<aside class="notes">
these are the nodes for the second slide
</aside>
</section>
</div> </div>
</div> </div>
@ -42,7 +57,9 @@
{ src: 'plugin/markdown/markdown.js' }, { src: 'plugin/markdown/markdown.js' },
{ src: 'plugin/notes/notes.js', async: true }, { src: 'plugin/notes/notes.js', async: true },
{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } } { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
] ],
controlsTutorial: false,
defaultTiming: 3
}); });
</script> </script>
</body> </body>

View File

@ -4098,6 +4098,23 @@
} }
/**
* Returns an array of objects where each object represents the attributes on its respective slide.
*/
function getSlidesMetaInfo() {
var slides = getSlides();
return slides.map( function (slide) {
var meta = {};
for( var i = 0; i < slide.attributes.length; i++ ) {
var attribute = slide.attributes[ i ];
meta[ attribute.name ] = attribute.value;
}
return meta;
} );
}
/** /**
* Retrieves the total number of slides in this presentation. * Retrieves the total number of slides in this presentation.
* *
@ -5454,6 +5471,10 @@
// Returns an Array of all slides // Returns an Array of all slides
getSlides: getSlides, getSlides: getSlides,
// Returns an Array of objects representing the attributes on
// the slides
getSlidesMetaInfo: getSlidesMetaInfo,
// Returns the total number of slides // Returns the total number of slides
getTotalSlides: getTotalSlides, getTotalSlides: getTotalSlides,

View File

@ -347,6 +347,8 @@
upcomingSlide, upcomingSlide,
layoutLabel, layoutLabel,
layoutDropdown, layoutDropdown,
pendingCalls = {},
lastRevealApiCallId = 0,
connected = false; connected = false;
var SPEAKER_LAYOUTS = { var SPEAKER_LAYOUTS = {
@ -382,6 +384,10 @@
else if( data.type === 'state' ) { else if( data.type === 'state' ) {
handleStateMessage( data ); handleStateMessage( data );
} }
else if( data.type === 'return' ) {
pendingCalls[data.callId](data.result);
delete pendingCalls[data.callId];
}
} }
// Messages sent by the reveal.js inside of the current slide preview // Messages sent by the reveal.js inside of the current slide preview
else if( data && data.namespace === 'reveal' ) { else if( data && data.namespace === 'reveal' ) {
@ -398,6 +404,21 @@
} ); } );
/**
* Asynchronously calls the Reveal.js API of the main frame.
*/
function callRevealApi( methodName, methodArguments, callback ) {
var callId = ++lastRevealApiCallId;
pendingCalls[callId] = callback;
window.opener.postMessage( JSON.stringify( {
namespace: 'reveal-notes',
type: 'call',
callId: callId,
methodName: methodName,
arguments: methodArguments
} ), '*' );
}
/** /**
* Called when the main window is trying to establish a * Called when the main window is trying to establish a
* connection. * connection.
@ -512,19 +533,22 @@
} }
function getTimings() { function getTimings( callback ) {
var slides = Reveal.getSlides(); callRevealApi( 'getSlidesMetaInfo', [], function ( slides ) {
var defaultTiming = Reveal.getConfig().defaultTiming; callRevealApi( 'getConfig', [], function ( config ) {
var defaultTiming = config.defaultTiming;
if (defaultTiming == null) { if (defaultTiming == null) {
return null; callback(null);
return;
} }
var timings = []; var timings = [];
for ( var i in slides ) { for ( var i in slides ) {
var slide = slides[i]; var slide = slides[ i ];
var timing = defaultTiming; var timing = defaultTiming;
if( slide.hasAttribute( 'data-timing' )) { if( slide.hasOwnProperty( 'data-timing' )) {
var t = slide.getAttribute( 'data-timing' ); var t = slide[ 'data-timing' ];
timing = parseInt(t); timing = parseInt(t);
if( isNaN(timing) ) { if( isNaN(timing) ) {
console.warn("Could not parse timing '" + t + "' of slide " + i + "; using default of " + defaultTiming); console.warn("Could not parse timing '" + t + "' of slide " + i + "; using default of " + defaultTiming);
@ -533,7 +557,10 @@
} }
timings.push(timing); timings.push(timing);
} }
return timings;
callback( timings );
} );
} );
} }
@ -541,15 +568,15 @@
* Return the number of seconds allocated for presenting * Return the number of seconds allocated for presenting
* all slides up to and including this one. * all slides up to and including this one.
*/ */
function getTimeAllocated(timings) { function getTimeAllocated( timings, callback ) {
var slides = Reveal.getSlides(); callRevealApi( 'getSlidePastCount', [], function ( currentSlide ) {
var allocated = 0; var allocated = 0;
var currentSlide = Reveal.getSlidePastCount(); for (var i in timings.slice(0, currentSlide + 1)) {
for (var i in slides.slice(0, currentSlide + 1)) {
allocated += timings[i]; allocated += timings[i];
} }
return allocated; callback( allocated );
} );
} }
@ -571,12 +598,51 @@
pacingMinutesEl = pacingEl.querySelector( '.minutes-value' ), pacingMinutesEl = pacingEl.querySelector( '.minutes-value' ),
pacingSecondsEl = pacingEl.querySelector( '.seconds-value' ); pacingSecondsEl = pacingEl.querySelector( '.seconds-value' );
var timings = getTimings(); var timings = null;
if (timings !== null) { getTimings( function ( _timings ) {
timings = _timings;
if (_timings !== null) {
pacingTitleEl.style.removeProperty('display'); pacingTitleEl.style.removeProperty('display');
pacingEl.style.removeProperty('display'); pacingEl.style.removeProperty('display');
} }
// Update once directly
_updateTimer();
// Then update every second
setInterval( _updateTimer, 1000 );
} );
function _resetTimer() {
if (timings == null) {
start = new Date();
_updateTimer();
}
else {
// Reset timer to beginning of current slide
getTimeAllocated( timings, function ( slideEndTimingSeconds ) {
var slideEndTiming = slideEndTimingSeconds * 1000;
callRevealApi( 'getSlidePastCount', [], function ( currentSlide ) {
var currentSlideTiming = timings[currentSlide] * 1000;
var previousSlidesTiming = slideEndTiming - currentSlideTiming;
var now = new Date();
start = new Date(now.getTime() - previousSlidesTiming);
_updateTimer();
} );
} );
}
}
timeEl.addEventListener( 'click', function() {
_resetTimer();
return false;
} );
function _displayTime( hrEl, minEl, secEl, time) { function _displayTime( hrEl, minEl, secEl, time) {
var sign = Math.sign(time) == -1 ? "-" : ""; var sign = Math.sign(time) == -1 ? "-" : "";
@ -618,8 +684,10 @@
function _updatePacing(diff) { function _updatePacing(diff) {
var slideEndTiming = getTimeAllocated(timings) * 1000; getTimeAllocated( timings, function ( slideEndTimingSeconds ) {
var currentSlide = Reveal.getSlidePastCount(); var slideEndTiming = slideEndTimingSeconds * 1000;
callRevealApi( 'getSlidePastCount', [], function ( currentSlide ) {
var currentSlideTiming = timings[currentSlide] * 1000; var currentSlideTiming = timings[currentSlide] * 1000;
var timeLeftCurrentSlide = slideEndTiming - diff; var timeLeftCurrentSlide = slideEndTiming - diff;
if (timeLeftCurrentSlide < 0) { if (timeLeftCurrentSlide < 0) {
@ -632,37 +700,9 @@
pacingEl.className = 'pacing ahead'; pacingEl.className = 'pacing ahead';
} }
_displayTime( pacingHoursEl, pacingMinutesEl, pacingSecondsEl, timeLeftCurrentSlide ); _displayTime( pacingHoursEl, pacingMinutesEl, pacingSecondsEl, timeLeftCurrentSlide );
}
// Update once directly
_updateTimer();
// Then update every second
setInterval( _updateTimer, 1000 );
function _resetTimer() {
if (timings == null) {
start = new Date();
}
else {
// Reset timer to beginning of current slide
var slideEndTiming = getTimeAllocated(timings) * 1000;
var currentSlide = Reveal.getSlidePastCount();
var currentSlideTiming = timings[currentSlide] * 1000;
var previousSlidesTiming = slideEndTiming - currentSlideTiming;
var now = new Date();
start = new Date(now.getTime() - previousSlidesTiming);
}
_updateTimer();
}
timeEl.addEventListener( 'click', function() {
_resetTimer();
return false;
} ); } );
} );
}
} }

View File

@ -26,9 +26,6 @@ var RevealNotes = (function() {
return; return;
} }
// Allow popup window access to Reveal API
notesPopup.Reveal = window.Reveal;
/** /**
* Connect to the notes window through a postmessage handshake. * Connect to the notes window through a postmessage handshake.
* Using postmessage enables us to work in situations where the * Using postmessage enables us to work in situations where the
@ -52,9 +49,26 @@ var RevealNotes = (function() {
clearInterval( connectInterval ); clearInterval( connectInterval );
onConnected(); onConnected();
} }
if( data && data.namespace === 'reveal-notes' && data.type === 'call' ) {
callRevealApi( data.methodName, data.arguments, data.callId );
}
} ); } );
} }
/**
* Calls the specified Reveal.js method with the provided argument and then pushes the result to the notes
* frame.
*/
function callRevealApi( methodName, methodArguments, callId ) {
var result = Reveal[methodName].call(Reveal, methodArguments);
notesPopup.postMessage( JSON.stringify( {
namespace: 'reveal-notes',
type: 'return',
result: result,
callId: callId
} ), '*' );
}
/** /**
* Posts the current slide data to the notes window * Posts the current slide data to the notes window
*/ */