diff options
author | Federico Fissore <federico@fissore.org> | 2012-11-05 16:38:24 +0100 |
---|---|---|
committer | Federico Fissore <federico@fissore.org> | 2012-11-05 16:38:24 +0100 |
commit | 6ffa60f5d2e19b9e93fed34672ac860c4206e3c4 (patch) | |
tree | 221ead3406edfd6bb5180982f8aa6cfea0b3e6cb /js | |
parent | f51067b00e8099bb576858e70db6e2fc44ce3d61 (diff) | |
download | fosdem-2018-presentation-6ffa60f5d2e19b9e93fed34672ac860c4206e3c4.tar fosdem-2018-presentation-6ffa60f5d2e19b9e93fed34672ac860c4206e3c4.tar.gz |
working on #227
Diffstat (limited to 'js')
-rw-r--r-- | js/reveal.js | 107 |
1 files changed, 80 insertions, 27 deletions
diff --git a/js/reveal.js b/js/reveal.js index d92ee76..58cb58e 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -60,6 +60,9 @@ var Reveal = (function(){ // The horizontal and verical index of the currently active slide indexh = 0, indexv = 0, + + // the fragment index + indexf = 0, // The previous and current slide HTML elements previousSlide, @@ -626,7 +629,7 @@ var Reveal = (function(){ * @param {int} h Horizontal index of the target slide * @param {int} v Vertical index of the target slide */ - function slide( h, v ) { + function slide( h, v, f) { // Remember where we were at before previousSlide = currentSlide; @@ -642,6 +645,24 @@ var Reveal = (function(){ // Activate and transition to the new slide indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h ); indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v ); + + // Show fragment, if specified + if ( typeof f !== undefined ) { + // Hide all fragments in current slide + while ( previousFragment() ) { + // loop + } + if ( f !== 0 ) { + var fragmentIndex = 0; + while ( indexf < f && nextFragment() ) { + fragmentIndex++; + } + // We cannot trust nextFragment for setting indexf: it can go beyond the max number of fragments available + indexf = fragmentIndex; + } + } else { + indexf = 0; + } // Apply the new state stateLoop: for( var i = 0, len = state.length; i < len; i++ ) { @@ -677,10 +698,7 @@ var Reveal = (function(){ updateControls(); - // Update the URL hash after a delay since updating it mid-transition - // is likely to cause visual lag - clearTimeout( writeURLTimeout ); - writeURLTimeout = setTimeout( writeURL, 1500 ); + updateURL(); // Query all horizontal slides in the deck var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); @@ -855,9 +873,11 @@ var Reveal = (function(){ function readURL() { var hash = window.location.hash; + var hashParts = hash.split( '?' ); + // Attempt to parse the hash as either an index or name - var bits = hash.slice( 2 ).split( '/' ), - name = hash.replace( /#|\//gi, '' ); + var bits = hashParts[0].slice( 2 ).split( '/' ), + name = hashParts[0].replace( /#|\//gi, '' ); // If the first bit is invalid and there is a name we can // assume that this is a named link @@ -879,10 +899,22 @@ var Reveal = (function(){ // Read the index components of the hash var h = parseInt( bits[0], 10 ) || 0, v = parseInt( bits[1], 10 ) || 0; + + var f = 0; + if ( hashParts.length > 1 ) { + f = parseInt( hashParts[1] ); + } - slide( h, v ); + slide( h, v, f ); } } + + function updateURL () { + // Update the URL hash after a delay since updating it mid-transition + // is likely to cause visual lag + clearTimeout( writeURLTimeout ); + writeURLTimeout = setTimeout( writeURL, 1500 ); + } /** * Updates the page URL (hash) to reflect the current @@ -896,6 +928,7 @@ var Reveal = (function(){ // the URL if( indexh > 0 || indexv > 0 ) url += indexh; if( indexv > 0 ) url += '/' + indexv; + if( indexf > 0 ) url += '?' + indexf; window.location.hash = url; } @@ -944,14 +977,15 @@ var Reveal = (function(){ */ function nextFragment() { // Vertical slides: + var fragment, + fragmentFound = false; + if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) { var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' ); if( verticalFragments.length ) { verticalFragments[0].classList.add( 'visible' ); - - // Notify subscribers of the change - dispatchEvent( 'fragmentshown', { fragment: verticalFragments[0] } ); - return true; + fragment = verticalFragments[0]; + fragmentFound = true; } } // Horizontal slides: @@ -959,14 +993,23 @@ var Reveal = (function(){ var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' ); if( horizontalFragments.length ) { horizontalFragments[0].classList.add( 'visible' ); - - // Notify subscribers of the change - dispatchEvent( 'fragmentshown', { fragment: horizontalFragments[0] } ); - return true; + fragment = horizontalFragments[0]; + fragmentFound = true; } } + + if ( fragmentFound ) { + indexf++; + + // Notify subscribers of the change + dispatchEvent( 'fragmentshown', { fragment: fragment, index: indexf } ); - return false; + updateURL(); + } else { + indexf = 0; + } + + return fragmentFound; } /** @@ -976,15 +1019,16 @@ var Reveal = (function(){ * false otherwise */ function previousFragment() { + var fragment, + fragmentFound = false; + // Vertical slides: if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) { var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment.visible' ); if( verticalFragments.length ) { verticalFragments[ verticalFragments.length - 1 ].classList.remove( 'visible' ); - - // Notify subscribers of the change - dispatchEvent( 'fragmenthidden', { fragment: verticalFragments[ verticalFragments.length - 1 ] } ); - return true; + fragment = verticalFragments[ verticalFragments.length - 1 ]; + fragmentFound = true; } } // Horizontal slides: @@ -992,14 +1036,23 @@ var Reveal = (function(){ var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment.visible' ); if( horizontalFragments.length ) { horizontalFragments[ horizontalFragments.length - 1 ].classList.remove( 'visible' ); - - // Notify subscribers of the change - dispatchEvent( 'fragmenthidden', { fragment: horizontalFragments[ horizontalFragments.length - 1 ] } ); - return true; + fragment = horizontalFragments[ horizontalFragments.length - 1 ]; + fragmentFound = true; } } - return false; + if ( fragmentFound ) { + indexf--; + + // Notify subscribers of the change + dispatchEvent( 'fragmenthidden', { fragment: fragment, index: indexf } ); + + updateURL(); + } else { + indexf = 0; + } + + return fragmentFound; } /** @@ -1017,7 +1070,7 @@ var Reveal = (function(){ function navigateLeft() { // Prioritize hiding fragments if( availableRoutes().left && ( isOverviewActive() || previousFragment() === false ) ) { - slide( indexh - 1, 0 ); + slide( indexh - 1, 0, Number.MAX_VALUE ); } } |