aboutsummaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
authorFederico Fissore <federico@fissore.org>2012-11-05 16:38:24 +0100
committerFederico Fissore <federico@fissore.org>2012-11-05 16:38:24 +0100
commit6ffa60f5d2e19b9e93fed34672ac860c4206e3c4 (patch)
tree221ead3406edfd6bb5180982f8aa6cfea0b3e6cb /js
parentf51067b00e8099bb576858e70db6e2fc44ce3d61 (diff)
downloadfosdem-2018-presentation-6ffa60f5d2e19b9e93fed34672ac860c4206e3c4.tar
fosdem-2018-presentation-6ffa60f5d2e19b9e93fed34672ac860c4206e3c4.tar.gz
working on #227
Diffstat (limited to 'js')
-rw-r--r--js/reveal.js107
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 );
}
}