move read/write url to location controller
							parent
							
								
									3683ad255d
								
							
						
					
					
						commit
						e32f38740c
					
				
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -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 ); | ||||
|  |  | |||
|  | @ -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 ); | ||||
| 		} | ||||
|  |  | |||
							
								
								
									
										109
									
								
								js/reveal.js
								
								
								
								
							
							
						
						
									
										109
									
								
								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 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Hakim El Hattab
						Hakim El Hattab