Bläddra i källkod

move read/write url to location controller

Hakim El Hattab 5 år sedan
förälder
incheckning
e32f38740c
4 ändrade filer med 115 tillägg och 108 borttagningar
  1. 0 0
      dist/reveal.min.js
  2. 1 1
      js/controllers/fragments.js
  3. 110 2
      js/controllers/location.js
  4. 4 105
      js/reveal.js

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/reveal.min.js


+ 1 - 1
js/controllers/fragments.js

@@ -264,7 +264,7 @@ export default class Fragments {
 				this.Reveal.updateProgress();
 
 				if( this.Reveal.getConfig().fragmentInURL ) {
-					this.Reveal.writeURL();
+					this.Reveal.location.writeURL();
 				}
 
 				return !!( changedFragments.shown.length || changedFragments.hidden.length );

+ 110 - 2
js/controllers/location.js

@@ -9,6 +9,113 @@ export default class Location {
 
 		this.Reveal = Reveal;
 
+		// Delays updates to the URL due to a Chrome thumbnailer bug
+		this.writeURLTimeout = 0;
+
+	}
+
+	/**
+	 * Reads the current URL (hash) and navigates accordingly.
+	 */
+	readURL() {
+
+		let config = this.Reveal.getConfig();
+		let indices = this.Reveal.getIndices();
+		let currentSlide = this.Reveal.getCurrentSlide();
+
+		let hash = window.location.hash;
+
+		// Attempt to parse the hash as either an index or name
+		let bits = hash.slice( 2 ).split( '/' ),
+			name = hash.replace( /#|\//gi, '' );
+
+		// If the first bit is not fully numeric and there is a name we
+		// can assume that this is a named link
+		if( !/^[0-9]*$/.test( bits[0] ) && name.length ) {
+			let element;
+
+			// Ensure the named link is a valid HTML ID attribute
+			try {
+				element = document.getElementById( decodeURIComponent( name ) );
+			}
+			catch ( error ) { }
+
+			// Ensure that we're not already on a slide with the same name
+			let isSameNameAsCurrentSlide = currentSlide ? currentSlide.getAttribute( 'id' ) === name : false;
+
+			if( element ) {
+				// If the slide exists and is not the current slide...
+				if ( !isSameNameAsCurrentSlide ) {
+					// ...find the position of the named slide and navigate to it
+					let elementIndex = this.Reveal.getIndices(element);
+					this.Reveal.slide(elementIndex.h, elementIndex.v);
+				}
+			}
+			// If the slide doesn't exist, navigate to the current slide
+			else {
+				this.Reveal.slide( indices.h || 0, indices.v || 0 );
+			}
+		}
+		else {
+			let hashIndexBase = config.hashOneBasedIndex ? 1 : 0;
+
+			// Read the index components of the hash
+			let h = ( parseInt( bits[0], 10 ) - hashIndexBase ) || 0,
+				v = ( parseInt( bits[1], 10 ) - hashIndexBase ) || 0,
+				f;
+
+			if( config.fragmentInURL ) {
+				f = parseInt( bits[2], 10 );
+				if( isNaN( f ) ) {
+					f = undefined;
+				}
+			}
+
+			if( h !== indices.h || v !== indices.v || f !== undefined ) {
+				this.Reveal.slide( h, v, f );
+			}
+		}
+
+	}
+
+	/**
+	 * Updates the page URL (hash) to reflect the current
+	 * state.
+	 *
+	 * @param {number} delay The time in ms to wait before
+	 * writing the hash
+	 */
+	writeURL( delay ) {
+
+		let config = this.Reveal.getConfig();
+		let currentSlide = this.Reveal.getCurrentSlide();
+
+		// Make sure there's never more than one timeout running
+		clearTimeout( this.writeURLTimeout );
+
+		// If a delay is specified, timeout this call
+		if( typeof delay === 'number' ) {
+			this.writeURLTimeout = setTimeout( this.writeURL, delay );
+		}
+		else if( currentSlide ) {
+			// If we're configured to push to history OR the history
+			// API is not avaialble.
+			if( config.history || !window.history ) {
+				window.location.hash = this.getHash();
+			}
+			// If we're configured to reflect the current slide in the
+			// URL without pushing to history.
+			else if( config.hash ) {
+				window.history.replaceState( null, null, '#' + this.getHash() );
+			}
+			// If history and hash are both disabled, a hash may still
+			// be added to the URL by clicking on a href with a hash
+			// target. Counter this by always removing the hash.
+			else {
+				window.history.replaceState( null, null, window.location.pathname + window.location.search );
+			}
+		}
+
 	}
 
 	/**
@@ -16,12 +123,13 @@ export default class Location {
 	 *
 	 * @param {HTMLElement} [slide=currentSlide] The slide to link to
 	 */
-	getHash( slide = this.Reveal.getCurrentSlide() ) {
+	getHash( slide ) {
 
 		let url = '/';
 
 		// Attempt to create a named link based on the slide's ID
-		let id = slide ? slide.getAttribute( 'id' ) : null;
+		let s = slide || this.Reveal.getCurrentSlide();
+		let id = s ? s.getAttribute( 'id' ) : null;
 		if( id ) {
 			id = encodeURIComponent( id );
 		}

+ 4 - 105
js/reveal.js

@@ -108,9 +108,6 @@ export default function( revealElement, options ) {
 		// Throttles mouse wheel navigation
 		lastMouseWheelStep = 0,
 
-		// Delays updates to the URL due to a Chrome thumbnailer bug
-		writeURLTimeout = 0,
-
 		// Is the mouse pointer currently hidden from view
 		cursorHidden = false,
 
@@ -189,7 +186,7 @@ export default function( revealElement, options ) {
 		configure();
 
 		// Read the initial hash
-		readURL();
+		location.readURL();
 
 		// Update all backgrounds
 		updateBackground( true );
@@ -1836,7 +1833,7 @@ export default function( revealElement, options ) {
 		fragments.update();
 
 		// Update the URL hash
-		writeURL();
+		location.writeURL();
 
 		cueAutoSlide();
 
@@ -1886,7 +1883,7 @@ export default function( revealElement, options ) {
 		createBackgrounds();
 
 		// Write the current hash to the URL
-		writeURL();
+		location.writeURL();
 
 		fragments.sortAll();
 
@@ -2639,103 +2636,6 @@ export default function( revealElement, options ) {
 
 	}
 
-	/**
-	 * Reads the current URL (hash) and navigates accordingly.
-	 */
-	function readURL() {
-
-		let hash = window.location.hash;
-
-		// Attempt to parse the hash as either an index or name
-		let bits = hash.slice( 2 ).split( '/' ),
-			name = hash.replace( /#|\//gi, '' );
-
-		// If the first bit is not fully numeric and there is a name we
-		// can assume that this is a named link
-		if( !/^[0-9]*$/.test( bits[0] ) && name.length ) {
-			let element;
-
-			// Ensure the named link is a valid HTML ID attribute
-			try {
-				element = document.getElementById( decodeURIComponent( name ) );
-			}
-			catch ( error ) { }
-
-			// Ensure that we're not already on a slide with the same name
-			let isSameNameAsCurrentSlide = currentSlide ? currentSlide.getAttribute( 'id' ) === name : false;
-
-			if( element ) {
-				// If the slide exists and is not the current slide...
-				if ( !isSameNameAsCurrentSlide ) {
-					// ...find the position of the named slide and navigate to it
-					let indices = Reveal.getIndices(element);
-					slide(indices.h, indices.v);
-				}
-			}
-			// If the slide doesn't exist, navigate to the current slide
-			else {
-				slide( indexh || 0, indexv || 0 );
-			}
-		}
-		else {
-			let hashIndexBase = config.hashOneBasedIndex ? 1 : 0;
-
-			// Read the index components of the hash
-			let h = ( parseInt( bits[0], 10 ) - hashIndexBase ) || 0,
-				v = ( parseInt( bits[1], 10 ) - hashIndexBase ) || 0,
-				f;
-
-			if( config.fragmentInURL ) {
-				f = parseInt( bits[2], 10 );
-				if( isNaN( f ) ) {
-					f = undefined;
-				}
-			}
-
-			if( h !== indexh || v !== indexv || f !== undefined ) {
-				slide( h, v, f );
-			}
-		}
-
-	}
-
-	/**
-	 * Updates the page URL (hash) to reflect the current
-	 * state.
-	 *
-	 * @param {number} delay The time in ms to wait before
-	 * writing the hash
-	 */
-	function writeURL( delay ) {
-
-		// Make sure there's never more than one timeout running
-		clearTimeout( writeURLTimeout );
-
-		// If a delay is specified, timeout this call
-		if( typeof delay === 'number' ) {
-			writeURLTimeout = setTimeout( writeURL, delay );
-		}
-		else if( currentSlide ) {
-			// If we're configured to push to history OR the history
-			// API is not avaialble.
-			if( config.history || !window.history ) {
-				window.location.hash = location.getHash();
-			}
-			// If we're configured to reflect the current slide in the
-			// URL without pushing to history.
-			else if( config.hash ) {
-				window.history.replaceState( null, null, '#' + location.getHash() );
-			}
-			// If history and hash are both disabled, a hash may still
-			// be added to the URL by clicking on a href with a hash
-			// target. Counter this by always removing the hash.
-			else {
-				window.history.replaceState( null, null, window.location.pathname + window.location.search );
-			}
-		}
-
-	}
-
 	/**
 	 * Retrieves the h/v location and fragment of the current,
 	 * or specified, slide.
@@ -3498,7 +3398,7 @@ export default function( revealElement, options ) {
 	 */
 	function onWindowHashChange( event ) {
 
-		readURL();
+		location.readURL();
 
 	}
 
@@ -3764,7 +3664,6 @@ export default function( revealElement, options ) {
 		updateControls,
 		updateProgress,
 		updateSlidesVisibility,
-		writeURL,
 		transformSlides,
 		cueAutoSlide,
 		cancelAutoSlide

Vissa filer visades inte eftersom för många filer har ändrats