independent-publisher-2.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. ( function () {
  2. // Helper matches function (not a polyfill), compatible with IE 11.
  3. function matches( el, sel ) {
  4. if ( Element.prototype.matches ) {
  5. return el.matches( sel );
  6. }
  7. if ( Element.prototype.msMatchesSelector ) {
  8. return el.msMatchesSelector( sel );
  9. }
  10. }
  11. // Helper closest parent node function (not a polyfill) based on
  12. // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
  13. function closest( el, sel ) {
  14. if ( el.closest ) {
  15. return el.closest( sel );
  16. }
  17. var current = el;
  18. do {
  19. if ( matches( el, sel ) ) {
  20. return current;
  21. }
  22. current = current.parentElement || current.parentNode;
  23. } while ( current !== null && current.nodeType === 1 );
  24. return null;
  25. }
  26. function emitResizeEvent() {
  27. if ( typeof( Event ) === 'function' ) {
  28. window.dispatchEvent( new Event( 'resize' ) );
  29. } else {
  30. var event = window.document.createEvent( 'UIEvents' );
  31. event.initUIEvent( 'resize', true, false, window, 0 );
  32. window.dispatchEvent( event );
  33. }
  34. }
  35. function updatePage() {
  36. galleryWrapper();
  37. outdentMedia();
  38. }
  39. // Wrap tiled galleries so we can outdent them
  40. function galleryWrapper() {
  41. var galleries = document.querySelectorAll( '.entry-content .tiled-gallery' );
  42. var shouldOutdent = false;
  43. for( var i = 0; i < galleries.length; i++ ) {
  44. var gallery = galleries[ i ];
  45. var parent = gallery.parentNode;
  46. // If this tiled gallery has not yet been wrapped, add a wrapper.
  47. if ( parent && ! parent.classList.contains( 'tiled-gallery-wrapper' ) ) {
  48. var div = document.createElement( 'div' );
  49. parent.insertBefore( div, gallery );
  50. parent.removeChild( gallery );
  51. div.appendChild( gallery );
  52. div.classList.add( 'tiled-gallery-wrapper' );
  53. // Outdent in the next event loop.
  54. shouldOutdent = true;
  55. }
  56. }
  57. if ( shouldOutdent ) {
  58. emitResizeEvent();
  59. }
  60. }
  61. // Add an extra class to large images and videos to outdent them.
  62. function outdentMedia() {
  63. var images = document.querySelectorAll( '.entry-content img, .post-image-link img' );
  64. for ( var i = 0; i < images.length; i++ ) {
  65. var img = images[ i ];
  66. var caption = closest( img, 'figure' );
  67. var newImg = new Image();
  68. newImg.addEventListener(
  69. 'load',
  70. // Use an IIFE to avoid scoping issues.
  71. ( function ( img, caption, newImg ) {
  72. return function () {
  73. var imgWidth = newImg.width;
  74. if ( imgWidth >= 1100 &&
  75. ! closest( img, '.tiled-gallery-item-large' ) &&
  76. ! closest( img, '[class^="wp-block-"]' ) ) {
  77. img.classList.add( 'size-big' );
  78. }
  79. if ( caption && caption.classList.contains( 'wp-caption' ) && imgWidth >= 1100 ) {
  80. caption.classList.add( 'size-big' );
  81. }
  82. }
  83. } )( img, caption, newImg )
  84. );
  85. newImg.src = img.getAttribute( 'src' );
  86. }
  87. var wrappers = document.querySelectorAll( '.entry-content .jetpack-video-wrapper' );
  88. for ( var j = 0; j < wrappers.length; j++ ) {
  89. var wrapper = wrappers[ j ];
  90. var firstChild = wrapper.querySelector( ':first-child' );
  91. if ( firstChild && firstChild.offsetWidth >= 1100 ) {
  92. wrapper.classList.add( 'caption-big' );
  93. }
  94. }
  95. }
  96. // After DOM is ready.
  97. if ( document.readyState !== 'loading' ) {
  98. updatePage();
  99. } else {
  100. document.addEventListener( 'DOMContentLoaded', updatePage );
  101. }
  102. // After window loads.
  103. if ( document.readyState === 'complete' ) {
  104. outdentMedia();
  105. } else {
  106. window.addEventListener( 'load', outdentMedia );
  107. }
  108. // After window is resized or infinite scroll loads new posts
  109. window.addEventListener( 'resize', updatePage );
  110. document.body.addEventListener( 'is.post-load', updatePage );
  111. } )();