From 5a8da0555cd08a97864582359ca51609badd416c Mon Sep 17 00:00:00 2001
From: rajgoel <github@telematique.eu>
Date: Fri, 20 Dec 2013 16:22:32 +0100
Subject: [PATCH] Add auto-slide API and data-autoslide for fragments

---
 js/reveal.js | 57 ++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 53 insertions(+), 4 deletions(-)

diff --git a/js/reveal.js b/js/reveal.js
index ef4add9..86eb825 100644
--- a/js/reveal.js
+++ b/js/reveal.js
@@ -1448,6 +1448,33 @@ var Reveal = (function(){
 
 	}
 
+	/**
+	 * Toggles the auto slide mode on and off.
+	 *
+	 * @param {Boolean} override Optional flag which sets the desired state. 
+	 * True means autoplay starts, false means it stops.
+	 */
+
+	function toggleAutoSlide( override ) {
+		if( typeof override === 'boolean' ) {
+			override ? resumeAutoSlide() : pauseAutoSlide();
+		}
+
+		else {
+			autoSlidePaused ? resumeAutoSlide() : pauseAutoSlide();
+		}
+
+	}
+
+	/**
+	 * Checks if the auto slide mode is currently on.
+	 */
+	function isSliding() {
+
+		return !autoSlidePaused;
+
+	}
+
 	/**
 	 * Steps from the current point in the presentation to the
 	 * slide which matches the specified horizontal and vertical
@@ -2473,14 +2500,26 @@ var Reveal = (function(){
 
 		if( currentSlide ) {
 
+			var fragmentAutoSlide = null;
+			// it is assumed that any given data-autoslide value (for each of the current fragments) can be chosen
+			toArray( Reveal.getCurrentSlide().querySelectorAll( '.current-fragment' ) ).forEach( function( el ) {
+				if( el.hasAttribute( 'data-autoslide' ) ) {
+					fragmentAutoSlide = el.getAttribute( 'data-autoslide' );
+				}
+			} );
+
 			var parentAutoSlide = currentSlide.parentNode ? currentSlide.parentNode.getAttribute( 'data-autoslide' ) : null;
 			var slideAutoSlide = currentSlide.getAttribute( 'data-autoslide' );
 
 			// Pick value in the following priority order:
-			// 1. Current slide's data-autoslide
-			// 2. Parent slide's data-autoslide
-			// 3. Global autoSlide setting
-			if( slideAutoSlide ) {
+			// 1. Current fragment's data-autoslide
+			// 2. Current slide's data-autoslide
+			// 3. Parent slide's data-autoslide
+			// 4. Global autoSlide setting
+			if( fragmentAutoSlide ) {
+				autoSlide = parseInt( fragmentAutoSlide, 10 );
+			}
+			else if( slideAutoSlide ) {
 				autoSlide = parseInt( slideAutoSlide, 10 );
 			}
 			else if( parentAutoSlide ) {
@@ -2533,6 +2572,7 @@ var Reveal = (function(){
 	function pauseAutoSlide() {
 
 		autoSlidePaused = true;
+		dispatchEvent( 'autoslidepaused' );
 		clearTimeout( autoSlideTimeout );
 
 		if( autoSlidePlayer ) {
@@ -2544,6 +2584,7 @@ var Reveal = (function(){
 	function resumeAutoSlide() {
 
 		autoSlidePaused = false;
+		dispatchEvent( 'autoslideresumed' );
 		cueAutoSlide();
 
 	}
@@ -2661,6 +2702,8 @@ var Reveal = (function(){
 	 */
 	function onDocumentKeyDown( event ) {
 
+		// store auto slide value to be able to toggle auto sliding
+		var currentAutoSlideValue = autoSlidePaused;
 		onUserInput( event );
 
 		// Check if there's a focused element that could be using
@@ -2737,6 +2780,8 @@ var Reveal = (function(){
 				case 66: case 190: case 191: togglePause(); break;
 				// f
 				case 70: enterFullscreen(); break;
+				// a
+				case 65: if ( config.autoSlideStoppable ) toggleAutoSlide( currentAutoSlideValue ); break;
 				default:
 					triggered = false;
 			}
@@ -3289,9 +3334,13 @@ var Reveal = (function(){
 		// Toggles the "black screen" mode on/off
 		togglePause: togglePause,
 
+		// Toggles the auto slide mode on/off
+		toggleAutoSlide: toggleAutoSlide,
+
 		// State checks
 		isOverview: isOverview,
 		isPaused: isPaused,
+		isSliding: isSliding,
 
 		// Adds or removes all internal event listeners (such as keyboard)
 		addEventListeners: addEventListeners,
-- 
GitLab