BeamerReveal

 view release on metacpan or  search on metacpan

beamer-reveal-example_files/libs/revealjs/plugin/notes/jojo.html  view on Meta::CPAN

	  <span class="hours-value">00</span><span class="minutes-value">:00</span><span class="seconds-value">:00</span>
	</div>
	<div class="clear"></div>

	<h4 class="label pacing-title" style="display: none">Pacing – Time to finish current slide</h4>
	<div class="pacing" style="display: none">
	  <span class="hours-value">00</span><span class="minutes-value">:00</span><span class="seconds-value">:00</span>
	</div>
      </div>

      <div class="speaker-controls-notes hidden">
	<h4 class="label">Notes</h4>
	<div class="value"></div>
      </div>
    </div>
    <div id="speaker-layout" class="overlay-element interactive">
      <span class="speaker-layout-label"></span>
      <select class="speaker-layout-dropdown"></select>
    </div>

    <script>

      (function() {

	  var notes,
	      notesValue,
	      currentState,
	      currentSlide,
	      upcomingSlide,
	      layoutLabel,
	      layoutDropdown,
	      pendingCalls = {},
	      lastRevealApiCallId = 0,
	      connected = false

	  var connectionStatus = document.querySelector( '#connection-status' );

	  var SPEAKER_LAYOUTS = {
	      'default': 'Default',
	      'wide': 'Wide',
	      'tall': 'Tall',
	      'notes-only': 'Notes only'
	  };

	  setupLayout();

	  let openerOrigin;

	  try {
	      openerOrigin = window.opener.location.origin;
	  }
	  catch ( error ) { console.warn( error ) }

	  // In order to prevent XSS, the speaker view will only run if its
	  // opener has the same origin as itself
	  if( window.location.origin !== openerOrigin ) {
	      connectionStatus.innerHTML = 'Cross origin error.<br>The speaker window can only be opened from the same origin.';
	      return;
	  }

	  var connectionTimeout = setTimeout( function() {
	      connectionStatus.innerHTML = 'Error connecting to main window.<br>Please try closing and reopening the speaker view.';
	  }, 5000 );

	  window.addEventListener( 'message', function( event ) {

	      // Validate the origin of all messages to avoid parsing messages
	      // that aren't meant for us. Ignore when running off file:// so
	      // that the speaker view continues to work without a web server.
	      if( window.location.origin !== event.origin && window.location.origin !== 'file://' ) {
		  return
	      }

	      clearTimeout( connectionTimeout );
	      connectionStatus.style.display = 'none';

	      var data = JSON.parse( event.data );

	      // The overview mode is only useful to the reveal.js instance
	      // where navigation occurs so we don't sync it
	      if( data.state ) delete data.state.overview;

	      // Messages sent by the notes plugin inside of the main window
	      if( data && data.namespace === 'reveal-notes' ) {
		  if( data.type === 'connect' ) {
		      handleConnectMessage( data );
		  }
		  else if( data.type === 'state' ) {
		      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
	      else if( data && data.namespace === 'reveal' ) {
		  const supportedEvents = [
		      'slidechanged',
		      'fragmentshown',
		      'fragmenthidden',
		      'paused',
		      'resumed',
		      'previewiframe',
		      'previewimage',
		      'previewvideo',
		      'closeoverlay'
		  ];

		  if( /ready/.test( data.eventName ) ) {
		      // Send a message back to notify that the handshake is complete
		      window.opener.postMessage( JSON.stringify({ namespace: 'reveal-notes', type: 'connected'} ), '*' );
		  }
		  else if( supportedEvents.includes( data.eventName ) && currentState !== JSON.stringify( data.state ) ) {
		      dispatchStateToMainWindow( data.state );
		  }
	      }

	  } );

	  /**
	   * Updates the presentation in the main window to match the state
	   * of the presentation in the notes window.
	   */
	  const dispatchStateToMainWindow = debounce(( state ) => {
	      window.opener.postMessage( JSON.stringify({ method: 'setState', args: [ state ]} ), '*' );
	  }, 500);

	  /**
	   * Asynchronously calls the Reveal.js API of the main frame.
	   */
	  function callRevealApi( methodName, methodArguments, callback ) {

	      var callId = ++lastRevealApiCallId;

beamer-reveal-example_files/libs/revealjs/plugin/notes/jojo.html  view on Meta::CPAN

	      // Persist locally
	      if( supportsLocalStorage() ) {
		  window.localStorage.setItem( 'reveal-speaker-layout', value );
	      }

	  }

	  /**
	   * Returns the ID of the most recently set speaker layout
	   * or our default layout if none has been set.
	   */
	  function getLayout() {

	      if( supportsLocalStorage() ) {
		  var layout = window.localStorage.getItem( 'reveal-speaker-layout' );
		  if( layout ) {
		      return layout;
		  }
	      }

	      // Default to the first record in the layouts hash
	      for( var id in SPEAKER_LAYOUTS ) {
		  return id;
	      }

	  }

	  function supportsLocalStorage() {

	      try {
		  localStorage.setItem('test', 'test');
		  localStorage.removeItem('test');
		  return true;
	      }
	      catch( e ) {
		  return false;
	      }

	  }

	  function zeroPadInteger( num ) {

	      var str = '00' + parseInt( num );
	      return str.substring( str.length - 2 );

	  }

	  /**
	   * Limits the frequency at which a function can be called.
	   */
	  function debounce( fn, ms ) {

	      var lastTime = 0,
		  timeout;

	      return function() {

		  var args = arguments;
		  var context = this;

		  clearTimeout( timeout );

		  var timeSinceLastCall = Date.now() - lastTime;
		  if( timeSinceLastCall > ms ) {
		      fn.apply( context, args );
		      lastTime = Date.now();
		  }
		  else {
		      timeout = setTimeout( function() {
			  fn.apply( context, args );
			  lastTime = Date.now();
		      }, ms - timeSinceLastCall );
		  }

	      }

	  }

      })();

    </script>
  </body>
</html>



( run in 0.865 second using v1.01-cache-2.11-cpan-ceb78f64989 )