From 7d5c8b550d0c61ff5dc9a9a37adb353f8bec62d1 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Thu, 4 Oct 2012 08:56:43 -0400 Subject: [PATCH] add override flag to overview toggle, code cleanup --- js/reveal.js | 126 ++++++++++++++++++++++++++--------------------- js/reveal.min.js | 56 ++++++++++----------- 2 files changed, 98 insertions(+), 84 deletions(-) diff --git a/js/reveal.js b/js/reveal.js index 11b8815..1b4d1f3 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -1,5 +1,5 @@ /*! - * reveal.js 2.1 r26 + * reveal.js 2.1 r27 * http://lab.hakim.se/reveal-js * MIT licensed * @@ -171,7 +171,7 @@ var Reveal = (function(){ // Extension may contain callback functions if( typeof s.callback === 'function' ) { - head.ready( s.src.match( /([\w\d_-]*)\.?[^\\\/]*$/i )[0], s.callback ); + head.ready( s.src.match( /([\w\d_\-]*)\.?[^\\\/]*$/i )[0], s.callback ); } } } @@ -232,8 +232,9 @@ var Reveal = (function(){ // Load the theme in the config, if it's not already loaded if( config.theme && dom.theme ) { var themeURL = dom.theme.getAttribute( 'href' ); - var themeFinder = /[^/]*?(?=\.css)/; + var themeFinder = /[^\/]*?(?=\.css)/; var themeName = themeURL.match(themeFinder)[0]; + if( config.theme !== themeName ) { themeURL = themeURL.replace(themeFinder, config.theme); dom.theme.setAttribute( 'href', themeURL ); @@ -335,6 +336,17 @@ var Reveal = (function(){ window.scrollTo( 0, 1 ); }, 0 ); } + + /** + * Dispatches an event of the specified type from the + * reveal DOM element. + */ + function dispatchEvent( type, properties ) { + var event = document.createEvent( "HTMLEvents", 1, 2 ); + event.initEvent( type, true, true ); + extend( event, properties ); + dom.wrapper.dispatchEvent( event ); + } /** * Handler for the document level 'keydown' event. @@ -345,30 +357,32 @@ var Reveal = (function(){ // Disregard the event if the target is editable or a // modifier is present if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return; - - var triggered = false; + + var triggered = true; switch( event.keyCode ) { // p, page up - case 80: case 33: navigatePrev(); triggered = true; break; + case 80: case 33: navigatePrev(); break; // n, page down - case 78: case 34: navigateNext(); triggered = true; break; + case 78: case 34: navigateNext(); break; // h, left - case 72: case 37: navigateLeft(); triggered = true; break; + case 72: case 37: navigateLeft(); break; // l, right - case 76: case 39: navigateRight(); triggered = true; break; + case 76: case 39: navigateRight(); break; // k, up - case 75: case 38: navigateUp(); triggered = true; break; + case 75: case 38: navigateUp(); break; // j, down - case 74: case 40: navigateDown(); triggered = true; break; + case 74: case 40: navigateDown(); break; // home - case 36: navigateTo( 0 ); triggered = true; break; + case 36: navigateTo( 0 ); break; // end - case 35: navigateTo( Number.MAX_VALUE ); triggered = true; break; + case 35: navigateTo( Number.MAX_VALUE ); break; // space - case 32: overviewIsActive() ? deactivateOverview() : navigateNext(); triggered = true; break; + case 32: overviewIsActive() ? deactivateOverview() : navigateNext(); break; // return - case 13: if( overviewIsActive() ) { deactivateOverview(); triggered = true; } break; + case 13: overviewIsActive() ? deactivateOverview() : triggered = false; break; + default: + triggered = false; } // If the input resulted in a triggered action we should prevent @@ -507,6 +521,24 @@ var Reveal = (function(){ readURL(); } + /** + * Invoked when a slide is and we're in the overview. + */ + function onOverviewSlideClicked( event ) { + // TODO There's a bug here where the event listeners are not + // removed after deactivating the overview. + if( overviewIsActive() ) { + event.preventDefault(); + + deactivateOverview(); + + indexh = this.getAttribute( 'data-index-h' ); + indexv = this.getAttribute( 'data-index-v' ); + + slide(); + } + } + /** * Wrap all links in 3D goodness. */ @@ -625,24 +657,6 @@ var Reveal = (function(){ return dom.wrapper.classList.contains( 'overview' ); } - /** - * Invoked when a slide is and we're in the overview. - */ - function onOverviewSlideClicked( event ) { - // TODO There's a bug here where the event listeners are not - // removed after deactivating the overview. - if( overviewIsActive() ) { - event.preventDefault(); - - deactivateOverview(); - - indexh = this.getAttribute( 'data-index-h' ); - indexv = this.getAttribute( 'data-index-v' ); - - slide(); - } - } - /** * Updates one dimension of slides by showing the slide * with the specified index. @@ -730,8 +744,12 @@ var Reveal = (function(){ } /** - * Updates the visual slides to represent the currently - * set indices. + * Steps from the current point in the presentation to the + * slide which matches the specified horizontal and vertical + * indices. + * + * @param {int} h Horizontal index of the target slide + * @param {int} v Vertical index of the target slide */ function slide( h, v ) { // Remember where we were at before @@ -777,7 +795,7 @@ var Reveal = (function(){ dom.progressbar.style.width = ( indexh / ( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ).length - 1 ) ) * window.innerWidth + 'px'; } - // Close the overview if it's active + // If the overview is active, re-activate it to update positions if( overviewIsActive() ) { activateOverview(); } @@ -848,8 +866,8 @@ var Reveal = (function(){ * @return {Object} containing four booleans: left/right/up/down */ function availableRoutes() { - var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); - var verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR ); + var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ), + verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR ); return { left: indexh > 0, @@ -871,7 +889,7 @@ var Reveal = (function(){ // If the first bit is invalid and there is a name we can // assume that this is a named link - if( isNaN( parseInt( bits[0] ) ) && name.length ) { + if( isNaN( parseInt( bits[0], 10 ) ) && name.length ) { // Find the slide with the specified name var slide = document.querySelector( '#' + name ); @@ -887,8 +905,8 @@ var Reveal = (function(){ } else { // Read the index components of the hash - var h = parseInt( bits[0] ) || 0, - v = parseInt( bits[1] ) || 0; + var h = parseInt( bits[0], 10 ) || 0, + v = parseInt( bits[1], 10 ) || 0; navigateTo( h, v ); } @@ -911,17 +929,6 @@ var Reveal = (function(){ } } - /** - * Dispatches an event of the specified type from the - * reveal DOM element. - */ - function dispatchEvent( type, properties ) { - var event = document.createEvent( "HTMLEvents", 1, 2 ); - event.initEvent( type, true, true ); - extend( event, properties ); - dom.wrapper.dispatchEvent( event ); - } - /** * Navigate to the next slide fragment. * @@ -1016,18 +1023,21 @@ var Reveal = (function(){ slide( indexh - 1, 0 ); } } + function navigateRight() { // Prioritize revealing fragments if( overviewIsActive() || nextFragment() === false ) { slide( indexh + 1, 0 ); } } + function navigateUp() { // Prioritize hiding fragments if( overviewIsActive() || previousFragment() === false ) { slide( indexh, indexv - 1 ); } } + function navigateDown() { // Prioritize revealing fragments if( overviewIsActive() || nextFragment() === false ) { @@ -1076,13 +1086,17 @@ var Reveal = (function(){ /** * Toggles the slide overview mode on and off. + * + * @param {Boolean} override Optional flag which overrides the + * toggle logic and forcibly sets the desired state. True means + * overview is open, false means it's closed. */ - function toggleOverview() { - if( overviewIsActive() ) { - deactivateOverview(); + function toggleOverview( override ) { + if( typeof override === 'boolean' ) { + override ? activateOverview() : deactivateOverview(); } else { - activateOverview(); + overviewIsActive() ? deactivateOverview() : activateOverview(); } } diff --git a/js/reveal.min.js b/js/reveal.min.js index d6c6fd6..80e20e1 100644 --- a/js/reveal.min.js +++ b/js/reveal.min.js @@ -1,20 +1,20 @@ /*! - * reveal.js 2.1 r26 + * reveal.js 2.1 r27 * http://lab.hakim.se/reveal-js * MIT licensed * * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se */ -var Reveal=(function(){var j=".reveal .slides>section",b=".reveal .slides>section.present>section",M={controls:true,progress:true,history:false,keyboard:true,overview:true,loop:false,autoSlide:0,mouseWheel:true,rollingLinks:true,theme:"default",transition:"default",dependencies:[]},k=0,c=0,v,D,ab=[],d={},O="WebkitPerspective" in document.body.style||"MozPerspective" in document.body.style||"msPerspective" in document.body.style||"OPerspective" in document.body.style||"perspective" in document.body.style,l="WebkitTransform" in document.body.style||"MozTransform" in document.body.style||"msTransform" in document.body.style||"OTransform" in document.body.style||"transform" in document.body.style,w=0,i=0,A=0,V={startX:0,startY:0,startSpan:0,startCount:0,handled:false,threshold:40}; +var Reveal=(function(){var j=".reveal .slides>section",b=".reveal .slides>section.present>section",M={controls:true,progress:true,history:false,keyboard:true,overview:true,loop:false,autoSlide:0,mouseWheel:true,rollingLinks:true,theme:"default",transition:"default",dependencies:[]},k=0,c=0,v,D,ab=[],d={},O="WebkitPerspective" in document.body.style||"MozPerspective" in document.body.style||"msPerspective" in document.body.style||"OPerspective" in document.body.style||"perspective" in document.body.style,l="WebkitTransform" in document.body.style||"MozTransform" in document.body.style||"msTransform" in document.body.style||"OTransform" in document.body.style||"transform" in document.body.style,w=0,i=0,z=0,V={startX:0,startY:0,startSpan:0,startCount:0,handled:false,threshold:40}; function g(ac){if((!l&&!O)){document.body.setAttribute("class","no-transforms");return;}q(M,ac);d.theme=document.querySelector("#theme");d.wrapper=document.querySelector(".reveal"); d.progress=document.querySelector(".reveal .progress");d.progressbar=document.querySelector(".reveal .progress span");if(M.controls){d.controls=document.querySelector(".reveal .controls"); d.controlsLeft=document.querySelector(".reveal .controls .left");d.controlsRight=document.querySelector(".reveal .controls .right");d.controlsUp=document.querySelector(".reveal .controls .up"); d.controlsDown=document.querySelector(".reveal .controls .down");}Q();if(navigator.userAgent.match(/(iphone|ipod|android)/i)){document.documentElement.style.overflow="scroll"; document.body.style.height="120%";window.addEventListener("load",W,false);window.addEventListener("orientationchange",W,false);}}function Q(){var ad=[],ah=[]; for(var ae=0,ac=M.dependencies.length;aeV.threshold){V.handled=true;if(agV.threshold&&Math.abs(ad)>Math.abs(ac)){V.handled=true;y();}else{if(ad<-V.threshold&&Math.abs(ad)>Math.abs(ac)){V.handled=true;h();}else{if(ac>V.threshold){V.handled=true; r();}else{if(ac<-V.threshold){V.handled=true;C();}}}}}}ah.preventDefault();}}function R(ac){V.handled=false;}function m(ac){clearTimeout(w);w=setTimeout(function(){var ad=ac.detail||-ac.wheelDelta; -if(ad>0){u();}else{T();}},100);}function t(ac){G();}function I(){if(O&&!("msPerspective" in document.body.style)){var ad=document.querySelectorAll(".reveal .slides section a:not(.image)"); -for(var ae=0,ac=ad.length;ae'+af.innerHTML+"";}}}}function F(){if(M.overview){d.wrapper.classList.add("overview");var ac=document.querySelectorAll(j); -for(var ah=0,af=ac.length;ah0){u();}else{T();}},100);}function t(ac){G();}function A(ac){if(U()){ac.preventDefault();X();k=this.getAttribute("data-index-h");c=this.getAttribute("data-index-v"); +a();}}function I(){if(O&&!("msPerspective" in document.body.style)){var ad=document.querySelectorAll(".reveal .slides section a:not(.image)");for(var ae=0,ac=ad.length; +ae'+af.innerHTML+""; +}}}}function F(){if(M.overview){d.wrapper.classList.add("overview");var ac=document.querySelectorAll(j);for(var ah=0,af=ac.length;ah3?"none":"block";}ah[ag].classList.remove("past");ah[ag].classList.remove("present");ah[ag].classList.remove("future");if(agaf){ah[ag].classList.add("future");}}if(ac.querySelector("section")){ah[ag].classList.add("stack");}}ah[af].classList.add("present");var ae=ah[af].getAttribute("data-state"); if(ae){ab=ab.concat(ae.split(" "));}}else{af=0;}return af;}function a(ai,am){v=D;var af=ab.concat();ab.length=0;var al=k,ad=c;k=aa(j,ai===undefined?k:ai); c=aa(b,am===undefined?c:am);stateLoop:for(var ag=0,aj=ab.length;ag0,right:k0,down:c0||c>0){ac+=k;}if(c>0){ac+="/"+c;}window.location.hash=ac;}}function o(ad,ac){var ae=document.createEvent("HTMLEvents",1,2);ae.initEvent(ad,true,true); -q(ae,ac);d.wrapper.dispatchEvent(ae);}function s(){if(document.querySelector(b+".present")){var ad=document.querySelectorAll(b+".present .fragment:not(.visible)"); +}if(ac.down){d.controlsDown.classList.add("enabled");}}function e(){var ac=document.querySelectorAll(j),ad=document.querySelectorAll(b);return{left:k>0,right:k0,down:c0||c>0){ac+=k;}if(c>0){ac+="/"+c;}window.location.hash=ac;}}function s(){if(document.querySelector(b+".present")){var ad=document.querySelectorAll(b+".present .fragment:not(.visible)"); if(ad.length){ad[0].classList.add("visible");o("fragmentshown",{fragment:ad[0]});return true;}}else{var ac=document.querySelectorAll(j+".present .fragment:not(.visible)"); if(ac.length){ac[0].classList.add("visible");o("fragmentshown",{fragment:ac[0]});return true;}}return false;}function L(){if(document.querySelector(b+".present")){var ad=document.querySelectorAll(b+".present .fragment.visible"); if(ad.length){ad[ad.length-1].classList.remove("visible");o("fragmenthidden",{fragment:ad[ad.length-1]});return true;}}else{var ac=document.querySelectorAll(j+".present .fragment.visible"); if(ac.length){ac[ac.length-1].classList.remove("visible");o("fragmenthidden",{fragment:ac[ac.length-1]});return true;}}return false;}function J(){clearTimeout(i); if(M.autoSlide){i=setTimeout(u,M.autoSlide);}}function K(ad,ac){a(ad,ac);}function y(){if(U()||L()===false){a(k-1,0);}}function h(){if(U()||s()===false){a(k+1,0); }}function r(){if(U()||L()===false){a(k,c-1);}}function C(){if(U()||s()===false){a(k,c+1);}}function T(){if(L()===false){if(e().up){r();}else{var ac=document.querySelector(".reveal .slides>section.past:nth-child("+k+")"); -if(ac){c=(ac.querySelectorAll("section").length+1)||0;k--;a();}}}}function u(){if(s()===false){e().down?C():h();}J();}function S(){if(U()){X();}else{F(); -}}return{initialize:g,navigateTo:K,navigateLeft:y,navigateRight:h,navigateUp:r,navigateDown:C,navigatePrev:T,navigateNext:u,toggleOverview:S,addEventListeners:B,removeEventListeners:P,getIndices:function(ac){var ag=k,ae=c; +if(ac){c=(ac.querySelectorAll("section").length+1)||0;k--;a();}}}}function u(){if(s()===false){e().down?C():h();}J();}function S(ac){if(typeof ac==="boolean"){ac?F():X(); +}else{U()?X():F();}}return{initialize:g,navigateTo:K,navigateLeft:y,navigateRight:h,navigateUp:r,navigateDown:C,navigatePrev:T,navigateNext:u,toggleOverview:S,addEventListeners:B,removeEventListeners:P,getIndices:function(ac){var ag=k,ae=c; if(ac){var ah=!!ac.parentNode.nodeName.match(/section/gi);var af=ah?ac.parentNode:ac;var ad=Array.prototype.slice.call(document.querySelectorAll(j));ag=Math.max(ad.indexOf(af),0); if(ah){ae=Math.max(Array.prototype.slice.call(ac.parentNode.children).indexOf(ac),0);}}return{h:ag,v:ae};},getPreviousSlide:function(){return v;},getCurrentSlide:function(){return D; },getQueryHash:function(){var ac={};location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(ad){ac[ad.split("=").shift()]=ad.split("=").pop();});return ac;