1/** 2 * Pinterest Pro 3 * @package EasySocialShareButtons 4 * @author appscreo 5 * @since 8.0 6 */ 7( function( $ ) { 8 "use strict"; 9 10 if (!debounce) { 11 var debounce = function( func, wait ) { 12 var timeout, args, context, timestamp; 13 return function() { 14 context = this; 15 args = [].slice.call( arguments, 0 ); 16 timestamp = new Date(); 17 var later = function() { 18 var last = ( new Date() ) - timestamp; 19 if ( last < wait ) { 20 timeout = setTimeout( later, wait - last ); 21 } else { 22 timeout = null; 23 func.apply( context, args ); 24 } 25 }; 26 if ( ! timeout ) { 27 timeout = setTimeout( later, wait ); 28 } 29 }; 30 }; 31 } 32 33 $(document).ready(function(){ 34 /** 35 * Applying additional Pinterest optimizations for images 36 */ 37 // mobile disable 38 if (essbPinImages.disable_mobile && $(window).width() < 1024) { 39 return; 40 } 41 42 43 var essbCurrentPinImageCount = window.essbCurrentPinImageCount = 0; 44 45 if (essb_settings.pin_pinid_active && essb_settings.pin_pinid) { 46 $('img').each(function() { 47 var hasPinID = $(this).data('pin-id') || ''; 48 if (!hasPinID || hasPinID == '') $(this).attr('data-pin-id', essb_settings.pin_pinid); 49 }); 50 } 51 52 if (essb_settings.pin_force_active && essb_settings.pin_force_image) { 53 $('img').each(function() { 54 $(this).attr('data-pin-media', essb_settings.pin_force_image); 55 56 /** 57 * Forcing all custom parameters too 58 */ 59 if (!$(this).data('pin-description')) { 60 var pinDescription = ''; 61 if ($(this).attr('title')) pinDescription = $(this).attr('title'); 62 else if ($(this).attr('alt')) pinDescription = $(this).attr('alt'); 63 64 // give always priority of the custom description if set 65 if (essbPinImages.force_custompin && !essbPinImages.custompin) essbPinImages.custompin = document.title; 66 if (essbPinImages.custompin) pinDescription = essbPinImages.custompin; 67 68 // if title is not genenrated it will use the Document Title 69 if (pinDescription == '') pinDescription = document.title; 70 71 $(this).attr('data-pin-description', pinDescription); 72 } 73 74 if (!$(this).data('pin-url')) $(this).attr('data-pin-url', encodeURI(document.URL)); 75 }); 76 } 77 78 /** 79 * Pinterest Pro Gutenberg images integration 80 */ 81 82 $('.essb-block-image').each(function() { 83 var pinID = $(this).data('essb-pin-id') || '', 84 pinDesc = $(this).data('essb-pin-description') || '', 85 pinAvoid = $(this).data('essb-pin-nopin') || ''; 86 87 if (pinAvoid.toString() == 'true') { 88 $(this).find('img').attr('data-pin-nopin', 'true'); 89 $(this).find('img').addClass('no_pin'); 90 return; 91 } 92 93 if (pinID != '') $(this).find('img').attr('data-pin-id', pinID); 94 if (pinDesc != '') $(this).find('img').attr('data-pin-description', pinDesc); 95 }); 96 97 /** 98 * Pinterest responsive thumbnail correction 99 */ 100 if (essb_settings.force_pin_thumbs) { 101 // setting up a map of parsing images on site 102 var essbReposiveImagesMap = window.essbReposiveImagesMap = {}; 103 104 // getting actual size of a single image 105 var essbDetectAndLocateImageSize = window.essbDetectAndLocateImageSize = function(url, element, isResponsive) { 106 if (isResponsive) { 107 essbReposiveImagesMap[element].responsive[url] = {}; 108 } 109 $("<img/>", { 110 load: function() { 111 if (essbReposiveImagesMap[element]) { 112 if (!isResponsive) { 113 essbReposiveImagesMap[element].originalSize = { 'w': this.width, 'h': this.height, 'done': true }; 114 essbCompileTheDataPinImage(element); 115 } else { 116 essbReposiveImagesMap[element].responsive[url] = { 'w': this.width, 'h': this.height, 'done': true }; 117 essbCompileTheDataPinImage(element); 118 } 119 } 120 121 }, 122 src: url 123 }); 124 }; 125 126 var essbCompileTheDataPinImage = window.essbCompileTheDataPinImage = function(element) { 127 var totalImages = 0, 128 processImages = 0, 129 currentMaxW = 0, 130 imageURL = ''; 131 132 for (var rImageURL in essbReposiveImagesMap[element].responsive) { 133 var dataObj = essbReposiveImagesMap[element].responsive[rImageURL] || {}; 134 totalImages++; 135 136 if (!dataObj.done) continue; 137 processImages++; 138 if (currentMaxW == 0 || currentMaxW < dataObj.w) { 139 currentMaxW = dataObj.w; 140 imageURL = rImageURL; 141 } 142 143 } 144 145 if (totalImages == processImages && essbReposiveImagesMap[element].original != imageURL) { 146 if (essbReposiveImagesMap[element].originalSize.done) { 147 if (currentMaxW > essbReposiveImagesMap[element].originalSize.w) { 148 $('[data-pinpro-key="' + element + '"]').attr('data-pin-media', imageURL); 149 $('[data-pinpro-key="' + element + '"]').attr('data-media', imageURL); 150 $('[data-pinpro-key="' + element + '"]').attr('data-pin-url', window.location.href); 151 $('[data-pinpro-key="' + element + '"]').removeClass('pin-process'); 152 $('[data-pinpro-key="' + element + '"]').each(essbPinImagesGenerateButtons); 153 } 154 } 155 } 156 } 157 158 $('img').each(function() { 159 var responsiveImages = $(this).attr('srcset') || '', 160 uniqueID = Math.random().toString(36).substr(2, 9), 161 element = uniqueID; 162 163 if (!responsiveImages || responsiveImages == '') return; 164 165 $(this).attr('data-pinpro-key', uniqueID); 166 $(this).addClass('pin-process'); 167 var responsiveSet = responsiveImages.split(', '), 168 originalImage = $(this).attr('src') || '', 169 foundReponsiveImage = '', 170 foundReponsiveSize = 0; 171 172 essbReposiveImagesMap[element] = { 173 source: element, 174 original: originalImage, 175 originalSize: {}, 176 responsive: {} 177 }; 178 essbDetectAndLocateImageSize(originalImage, element); 179 for (var i = 0; i < responsiveSet.length; i++) { 180 if (!responsiveSet[i]) continue; 181 var imageData = responsiveSet[i].split(' '), 182 imageURL = imageData[0] || '', 183 imageSize = (imageData[1] || '').replace('w', ''); 184 185 if (!imageURL || !Number(imageSize)) continue; 186 187 essbDetectAndLocateImageSize(imageURL, element, true); 188 189 } 190 191 }); 192 } // end forcing generation of responsive images 193 194 /** 195 * Pinterest Images 196 */ 197 198 var essbPinImagesGenerateButtons = function() { 199 var image = $(this); 200 // the option to avoid button over images with links 201 if (essbPinImages.nolinks && $(image).parents().filter("a").length) return; 202 203 // avoid buttons on images that has lower size that setup 204 if (image.outerWidth() < Number(essbPinImages.min_width || 0) || image.outerHeight() < Number(essbPinImages.min_height || 0
204)) return; 205 // ignore the non Pinable images 206 if (image.hasClass('no_pin') || image.hasClass('no-pin') || image.data('pin-nopin') || image.hasClass('pin-generated') || image.hasClass('pin-process') || image.hasClass('zoomImg') || image.hasClass('lazy-hidden')) return; 207 208 var pinSrc = $(image).prop('src') || '', 209 pinDescription = '', shareBtnCode = [], 210 buttonStyleClasses = '', buttonSizeClasses = '', 211 pinID = $(image).data('pin-id') || ''; 212 213 // additional check for the autoptimize svg placeholder preventing images from load 214 // Pinterest also does not accept SVG images 215 if (pinSrc.indexOf('data:image/svg+xml') > -1 || pinSrc.indexOf('data:image/gif') > -1 || pinSrc.indexOf('data:image/png') > -1 || pinSrc == '') return; 216 217 if (image.data('media')) pinSrc = image.data('media'); 218 if (image.data('lazy-src')) pinSrc = image.data('lazy-src'); 219 if (image.data('pin-media')) pinSrc = image.data('pin-media'); 220 221 if (image.data("pin-description")) pinDescription = image.data("pin-description"); 222 else if (image.attr('title')) pinDescription = image.attr('title'); 223 else if (image.attr('alt')) pinDescription = image.attr('alt'); 224 225 // give always priority of the custom description if set 226 if (essbPinImages.force_custompin && !essbPinImages.custompin) essbPinImages.custompin = document.title; 227 if (essbPinImages.custompin) pinDescription = essbPinImages.custompin; 228 229 // if title is not genenrated it will use the Document Title 230 if (pinDescription == '') pinDescription = document.title; 231 232 var shareCmd = 'https://pinterest.com/pin/create/button/?url=' + encodeURI(document.URL) + '&is_video=false' + '&media=' + encodeURI(pinSrc) + '&description=' + encodeURIComponent(pinDescription); 233 234 if (essbPinImages.legacy_share_cmd) 235 shareCmd = 'https://pinterest.com/pin/create/bookmarklet/?url=' + encodeURI(document.URL) + '&media=' + encodeURI(pinSrc) + '&title=' + encodeURIComponent(pinDescription)+'&description=' + encodeURIComponent(pinDescription) + '&media=' + encodeURI(pinSrc); 236 237 // encode the ' symbol separately 238 if (shareCmd.indexOf("'") > -1) shareCmd = shareCmd.replace(/'/g, '%27'); 239 240 if (pinID != '') shareCmd = 'https://www.pinterest.com/pin/'+pinID+'/repin/x/'; 241 242 var imgClasses = image.attr('class'), 243 imgStyles = image.attr('style'); 244 245 if (essbPinImages ['button_style'] == 'icon_hover') { 246 buttonStyleClasses = ' essb_hide_name'; 247 } 248 if (essbPinImages ['button_style'] == 'icon') { 249 buttonStyleClasses = ' essb_force_hide_name essb_force_hide'; 250 } 251 if (essbPinImages ['button_style'] == 'button_name') { 252 buttonStyleClasses = ' essb_hide_icon'; 253 } 254 if (essbPinImages ['button_style'] == 'vertical') { 255 buttonStyleClasses = ' essb_vertical_name'; 256 } 257 258 if (essbPinImages['button_size']) buttonSizeClasses = ' essb_size_' + essbPinImages['button_size']; 259 if (essbPinImages['animation']) buttonSizeClasses += ' ' + essbPinImages['animation']; 260 if (essbPinImages['position']) buttonSizeClasses += ' essb_pos_' + essbPinImages['position']; 261 262 if (essbPinImages['mobile_position']) buttonSizeClasses += ' essb_mobilepos_' + essbPinImages['mobile_position']; 263 if (essbPinImages['visibility'] && essbPinImages['visibility'] == 'always') buttonSizeClasses += ' essb_always_visible'; 264 265 image.removeClass().attr('style', '').wrap('<div class="essb-pin" />'); 266 if (imgClasses != '') image.parent('.essb-pin').addClass(imgClasses); 267 if (imgStyles != '') image.parent('.essb-pin').attr('style', imgStyles); 268 269 // images count 270 window.essbCurrentPinImageCount++; 271 image.parent('.essb-pin').addClass('essb-pinid-' + window.essbCurrentPinImageCount.toString()); 272 273 if (essbPinImages.reposition) { 274 var imgWidth = $(image).width(); 275 if (Number(imgWidth) && !isNaN(imgWidth) && Number(imgWidth) > 0) { 276 image.parent('.essb-pin').css({'max-width': imgWidth+'px'}); 277 } 278 } 279 280 var uid = (new Date().getTime()).toString(36); 281 282 var iconMainClass = essbPinImages.svgIcon ? 'essb_icon_svg_pinterest' : 'essb_icon_pinterest'; 283 284 shareBtnCode.push('<div class="essb_links essb_displayed_pinimage essb_template_'+essbPinImages.template+buttonSizeClasses+' essb_'+uid+'" data-e
284ssb-position="pinit" data-essb-postid="'+(essb_settings.post_id || '')+'" data-essb-instance="'+uid+'">'); 285 shareBtnCode.push('<ul class="essb_links_list'+(buttonStyleClasses != '' ? ' ' + buttonStyleClasses : '')+'">'); 286 shareBtnCode.push('<li class="essb_item essb_link_pinterest nolightbox'+(essbPinImages['svgIcon'] ? ' essb_link_svg_icon' : '')+'">'); 287 shareBtnCode.push('<a class="nolightbox'+(essbPinImages['template_a_class'] ? ' ' + essbPinImages['template_a_class'] : '')+'" rel="noreferrer noopener nofollow" href="'+shareCmd+'" onclick="essb.window(''+shareCmd+'','pinpro',''+uid+''); return false;" target="_blank"><span class="essb_icon '+iconMainClass+(essbPinImages['template_icon_class'] ? ' ' + essbPinImages['template_icon_class'] : '')+'">'+(essbPinImages.svgIcon || '')+'</span><span class="essb_network_name">'+(essbPinImages['text'] ? essbPinImages['text'] : 'Pin')+'</span></a>'); 288 shareBtnCode.push('</li>'); 289 shareBtnCode.push('</ul>'); 290 shareBtnCode.push('</div>'); 291 292 image.after(shareBtnCode.join('')); 293 image.addClass('pin-generated'); // adding class to avoid generating again the same information 294 //essb.share_window 295 //removing the lazyloading class if posted 296 if (image.parent('.essb-pin').hasClass('lazyloading')) image.parent('.essb-pin').removeClass('lazyloading'); 297 298 if (essbPinImages['recenter'] && (essbPinImages['position'] || '') == 'middle-middle') { 299 let essbContainer = image.parent('.essb-pin').find('.essb_links'); 300 if (essbContainer && essbContainer[0]) { 301 essbContainer[0].style.setProperty('margin-left', '-' + Math.round(essbContainer.width() / 2) + 'px', 'important'); 302 essbContainer[0].style.setProperty('margin-top', '-' + Math.round(essbContainer.height() / 2) + 'px', 'important'); 303 } 304 } 305 306 } 307 308 if (typeof(essbPinImages) != 'undefined' && $('body').hasClass('tcb-edit-mode')) essbPinImages.active = false; 309 310 if (typeof(essbPinImages) != 'undefined' && essbPinImages.active) { 311 // Begin detection of potential images and assign the pinterest generation 312 if (!essbPinImages.min_width || !Number(essbPinImages.min_width)) essbPinImages.min_width = 300; 313 if (!essbPinImages.min_height || !Number(essbPinImages.min_height)) essbPinImages.min_height = 300; 314 315 // Integration with the mobile minimal width and height (if set) 316 if ($(window).width() < 720) { 317 if (Number(essbPinImages.min_width_mobile)) essbPinImages.min_width = Number(essbPinImages.min_width_mobile); 318 if (Number(essbPinImages.min_height_mobile)) essbPinImages.min_height = Number(essbPinImages.min_height_mobile); 319 } 320 321 if ($('.essb-pin.tve_image').length) { 322 $('.essb-pin.tve_image .essb_links').remove(); 323 $('.essb-pin img').removeClass('pin-generated'); 324 } 325 326 // WP Rocket Lazy Videos set no-pin class to those images to prevent holding down 327 $('.rll-youtube-player img').each(function() { 328 $(this).addClass('no-pin'); 329 }); 330 331 // Hide on images option 332 if (essbPinImages.hideon) { 333 $(essbPinImages.hideon).each(function() { 334 $(this).addClass('no-pin'); 335 }); 336 } 337 338 window.addEventListener('LazyLoad::Initialized', function (e) { 339 $('.rll-youtube-player img').each(function() { 340 $(this).addClass('no-pin'); 341 }); 342 }); 343 344 var essbPinImagesDetect = function() { 345 346 // WP Rocket Lazy Videos set no-pin class to those images to prevent holding down 347 $('.rll-youtube-player img').each(function() { 348 $(this).addClass('no-pin'); 349 }); 350 351 // Hide on images option 352 if (essbPinImages.hideon) { 353 $(essbPinImages.hideon).each(function() { 354 $(this).addClass('no-pin'); 355 }); 356 } 357 358 if (essbPinImages.selector) { 359 $(essbPinImages.selector).each(essbPinImagesGenerateButtons); 360 } 361 else { 362 if (!$('.essb-pinterest-images').length) return; 363 $('.essb-pinterest-images').parent().find('img').each(essbPinImagesGenerateButtons); 364 } 365 } 366 367 if (essbPinImages.lazyload) $(window).on('scroll', debounce(essbPinImagesDetect, 10)); 368
369 if (!essbPinImages.optimize_load) setTimeout(essbPinImagesDetect, 1); 370 else { 371 const essbPinUserInteractions =["keydown","mousedown","mousemove","wheel","touchmove","touchstart","touchend"]; 372 essbPinUserInteractions.forEach(function(event) { 373 window.addEventListener(event, essbPinTriggerDOMListener, {passive:true}); 374 }); 375 376 document.addEventListener("visibilitychange", essbPinTriggerDOMListener); 377 378 function essbPinTriggerDOMListener() { 379 //remove existing user interaction event listeners 380 essbPinUserInteractions.forEach(function(event) { 381 window.removeEventListener(event, essbPinTriggerDOMListener, {passive:true}); 382 }); 383 384 //remove visibility change listener 385 document.removeEventListener("visibilitychange", essbPinTriggerDOMListener); 386 387 //add dom listner if page is still loading 388 if(document.readyState === 'loading') { 389 document.addEventListener("DOMContentLoaded", essbPinTriggerDetector); 390 } 391 else { 392 //trigger delayed script process 393 essbPinTriggerDetector(); 394 } 395 } 396 397 function essbPinTriggerDetector() { 398 setTimeout(essbPinImagesDetect, 1); 399 } 400 } 401 } 402 403 if ((typeof(essbPinImages) != 'undefined' && !essbPinImages.active) || typeof(essbPinImages) == 'undefined') { 404 if ($('.essb-pin.tve_image').length) { 405 $('.essb-pin.tve_image .essb_links').remove(); 406 $('.essb-pin img').removeClass('pin-generated'); 407 } 408 } 409 410 }); 411} )( jQuery );
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.