oont-contents/plugins/astra-addon/addons/blog-pro/assets/js/unminified/single-infinite.js
2025-02-08 15:10:23 +01:00

309 lines
9.9 KiB
JavaScript

(function ($) {
"use strict";
// Variables
var content_container = '#main.site-main';
var post_title_selector = 'h1.entry-title';
var nav_container = 'nav.post-navigation';
var comments_container = 'div#comments';
var remove_comments = 'yes';
var track_pageviews = 'yes';
var curr_url = window.location.href;
var post_count = 0;
var stop_reading = false;
var show_comments = astra.show_comments || 'Show Comments';
var edit_post_url = astra.edit_post_url || '';
var siteUrl = astra.site_url || '';
$( document ).ready( function() {
var in_customizer = false;
// check for wp.customize return boolean
if ( typeof wp !== 'undefined' ) {
in_customizer = typeof wp.customize !== 'undefined' ? true : false;
}
// Don't do this if looking for comments or in customizer.
if ( in_customizer || window.location.href.indexOf( '#comments' ) > -1 ) {
return;
}
// Remove Comments.
if ( remove_comments === 'yes' ) {
initialise_comment( comments_container );
}
var temp_content_container = $( content_container );
var post_ID = temp_content_container.find('.ast-article-single').attr('id');
if ( typeof post_ID !== typeof undefined && post_ID !== "" ) {
post_ID = post_ID.replace('post-', '');
}
// Add a post divider.
temp_content_container.prepend( DOMPurify.sanitize( '<hr style="height: 0" class="post-divider" data-title="' + window.document.title + '" data-url="' + window.location.href + '" data-post-id="' + post_ID + '"/>' ) );
// Initialise scrollSpy
initialise_scrollspy();
$('body').on( 'click', '.ast-show-comments', function( e ) {
var parent = $(this).closest('.ast-show-comments-data');
parent.hide();
parent.siblings().show();
});
/**
* Track Page View with Google Analytics.
*
* It will first detect if Google Analytics is installed before
* attempting to send a pageview.
*
* The tracker detects both classic and universal tracking methods.
*
* Also supports Google Analytics by Monster Insights should it be used.
*/
$('body').on( 'asta-post-changed', function( e, post_title, post_url, post_id, post_count, stop_reading ) {
if ( track_pageviews != 'yes' ) {
return;
}
if ( typeof pageTracker === "undefined" && typeof _gaq === 'undefined' && typeof ga === 'undefined' && typeof __gaTracker === 'undefined' ) {
return;
}
// Remove the base URL from the post_url.
var regexp = new RegExp(siteUrl, 'gi')
var postUrl = post_url.replace(regexp, '');
// This uses Asynchronous version of Google Analytics tracking method.
if ( typeof pageTracker !== "undefined" && pageTracker !== null ) {
pageTracker._trackPageview( postUrl );
}
// This uses Google's classic Google Analytics tracking method.
if ( typeof _gaq !== 'undefined' && _gaq !== null ) {
_gaq.push(['_trackPageview', postUrl]);
}
// This uses Google Analytics Universal Analytics tracking method.
if ( typeof ga !== 'undefined' && ga !== null ) {
ga( 'send', 'pageview', postUrl );
}
// This uses Monster Insights method of tracking Google Analytics.
if ( typeof __gaTracker !== 'undefined' && __gaTracker !== null ) {
__gaTracker( 'send', 'pageview', postUrl );
}
// This uses Google Analytics Universal Analytics tracking method.
if ( typeof gtag !== 'undefined' && gtag !== null ) {
gtag('event', 'page_view', {
'page_title' : post_title,
'page_path': postUrl
});
}
});
}); // END document()
function initialise_comment( comments_wrapper ) {
var $comments_container = $( comments_wrapper );
if ( 0 === $comments_container.length ) {
return;
}
$comments_container.each(function( index ) {
var $this = $(this);
if ( $this.find('.ast-show-comments-data').length === 0 ) {
var comments_count_wrapper = $this.find( '.comments-count-wrapper' );
var comment_data = '<div class="ast-show-comments-data">';
$this.find( '.comment-respond' ).hide();
if ( comments_count_wrapper.length > 0 ) {
comments_count_wrapper.hide();
$this.find( '.ast-comment-list' ).hide();
comment_data += '<div class="ast-show-comments-count"><h3 class="comments-title">' + comments_count_wrapper.find('.comments-title').text() + '</h3></div>';
}
comment_data += '<div class="ast-show-comments button ast-button">' + show_comments + '</div>';
comment_data += '</div>';
$this.find( '.no-comments' ).hide();
$this.prepend( comment_data );
}
});
}
function initialise_scrollspy() {
scrollspy();
} // END initialise_scrollspy()
function scrollspy() {
$( '.post-divider').off( 'scrollSpy:enter', astra_enter );
$( '.post-divider').off( 'scrollSpy:exit', astra_leave );
// Spy on post-divider - changes the URL in browser location and loads new post.
$( '.post-divider').on( 'scrollSpy:enter', astra_enter );
$( '.post-divider').on( 'scrollSpy:exit', astra_leave );
$( '.post-divider').scrollSpy();
} // END scrollspy()
function astra_enter() {
var $enter = $(this);
changeURL($enter, 'enter' );
} // END astra_enter()
function astra_leave() {
var $leave = $(this);
changeURL($leave, 'leave' );
} // END astra_leave()
function changeURL( $this, in_out_style ) {
var el = $($this);
var this_url = el.attr( 'data-url' );
var this_title = el.attr( 'data-title' );
var this_post_id = el.attr( 'data-post-id' );
var offset = el.offset();
var scrollTop = $(document).scrollTop();
// If exiting or entering from top, change URL.
if ( ( offset.top - scrollTop ) < 200 && curr_url != this_url ) {
curr_url = this_url;
History.pushState(null, this_title, this_url);
// Update edit link if possible
if( $('#wp-admin-bar-edit').length > 0 && '' != edit_post_url ) {
var new_edit_post_url = edit_post_url.replace( "{{id}}", this_post_id );
$('#wp-admin-bar-edit a').attr( 'href', new_edit_post_url );
}
$('body').trigger( 'asta-post-changed', [ this_title, this_url, this_post_id, post_count, stop_reading ] );
}
if ( el.nextAll( '.post-divider' ).length === 0 ) {
// Look for the next post to load if any.
auto_load_next_post();
}
} // END changeURL()
/**
* This is the main function.
*/
function auto_load_next_post() {
// If the user can no read any more then stop looking for new posts.
if ( stop_reading ) {
return;
}
// Grab the url for the next post in the post navigation.
var post_url = $( nav_container ).find( 'a[rel="prev"]').attr( 'href' );
// Return if previous post URL is same as current URL.
if ( ! post_url || post_url === window.location.href ) {
return;
}
// Check to see if pretty permalinks, if not then add partial-prev=1
if ( post_url.indexOf( '?' ) > -1 ) {
var np_url = post_url + '&partial-prev=1'
} else {
var np_url = post_url + '?partial-prev=1'
}
// Remove the post navigation HTML once the next post has loaded.
$( nav_container ).remove();
let request = new XMLHttpRequest();
request.open('GET', post_url, true);
request.send();
request.onload = function() {
let string = request.response;
let postData = new DOMParser().parseFromString(string, 'text/html'),
postId = postData.querySelector( 'article.ast-article-single' ) ? postData.querySelector( 'article.ast-article-single' ).getAttribute('id') : '';
postId = '' != postId ? postId.replace('post-', '') : ''; // Make sure that only the post ID remains.
let linkId = postData.getElementById("uag-style-" + postId + "-css"),
styleId = postData.getElementById("uagb-style-frontend-" + postId);
if ( '' !== postId && linkId ) {
// If file generation is enabled.
let href = linkId.href,
styleLink = document.createElement("link");
styleLink.rel = "stylesheet";
styleLink.id = "uag-style-" + postId + "-css";
styleLink.href = href;
styleLink.media = "all";
document.head.appendChild( styleLink );
}
if ( '' !== postId && styleId ) {
// If inline dynamic styles loaded.
let styleLink = document.createElement("style");
styleLink.id = "uagb-style-frontend-" + postId;
styleLink.textContent = styleId.innerText;
document.head.appendChild( styleLink );
}
}
$.get( np_url , function( data ) {
var post = $( "<div>" + data + "</div>" );
data = post.html(); // Returns the HTML data of the next post that was loaded.
var post_divider = '<hr style="height: 0" class="ast-single-previous-hr post-divider" data-url="' + post_url + '"/>';
var post_html = $( post_divider + data );
var post_title = post_html.find( post_title_selector ); // Find the post title of the loaded article.
var post_ID = $(post).find( 'article' ).attr( 'id' ); // Find the post ID of the loaded article.
if ( typeof post_ID !== typeof undefined && post_ID !== "" ) {
post_ID = post_ID.replace('post-', ''); // Make sure that only the post ID remains.
}
const purifyConfig = {
ADD_TAGS: ['iframe'], // We can Add other tags as needed.
ADD_ATTR: ['src', 'width', 'height', 'frameborder', 'allow', 'allowfullscreen'], // Added required iframe attributes.
ALLOW_DATA_ATTR: false,
};
post_html?.each( ( _, element ) => {
const sanitizedElement = DOMPurify.sanitize(element, purifyConfig);
$(content_container).append(sanitizedElement);
});
// Remove Comments.
if ( remove_comments === 'yes' ) {
initialise_comment( comments_container );
}
// Get the hidden "HR" element and add the missing post title and post id attributes. Also make sure it remains hidden.
$( 'hr[data-url="' + post_url + '"]').attr( 'data-title' , post_title.text() ).attr( 'data-post-id' , post_ID );// .css( 'display', 'inline-block' );
scrollspy(); // Need to set up ScrollSpy now that the new content has loaded.
post_count = post_count+1; // Updates the post count.
// Run an event once the post has loaded.
$('body').trigger( 'astra-post-loaded', [ post_title.text(), post_url, post_ID, post_count ] );
});
} // END auto_load_next_post()
})(jQuery);