move read/write url to location controller
This commit is contained in:
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