: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
const name = '<pre wp-pre-tag-' + index + '></pre>';
preTags[ name ] = peePart.substring( start ) + '</pre>';
pee += peePart.substring( 0, start ) + name;
pee = pee.replace( /<br \/>\s*<br \/>/, '\n\n' );
// Space things out a little.
const allBlocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)';
pee = pee.replace( new RegExp( '(<' + allBlocks + '[^>]*>)', 'gmi' ), '\n$1' );
pee = pee.replace( new RegExp( '(</' + allBlocks + '>)', 'gmi' ), '$1\n\n' );
pee = pee.replace( /\r\n|\r/, '\n' ); // cross-platform newlines.
if ( pee.indexOf( '\n' ) === 0 ) {
pee = pee.substring( 1 );
if ( pee.indexOf( '<option' ) > -1 ) {
// no P/BR around option.
pee = pee.replace( /(?=(\s*))\2<option'/gmi, '<option' );
pee = pee.replace( /<\/option>\s*/gmi, '</option>' );
if ( pee.indexOf( '</object>' ) > -1 ) {
// no P/BR around param and embed.
pee = pee.replace( /(<object[^>]*>)\s*/gmi, '$1' );
pee = pee.replace( /(?=(\s*))\2<\/object>/gmi, '</object>' );
pee = pee.replace( /(?=(\s*))\2(<\/?(?:param|embed)[^>]*>)((?=(\s*))\2)/gmi, '$1' );
/* eslint-disable no-useless-escape */
if ( pee.indexOf( '<source' ) > -1 || pee.indexOf( '<track' ) > -1 ) {
// no P/BR around source and track.
pee = pee.replace( /([<\[](?:audio|video)[^>\]]*[>\]])\s*/gmi, '$1' );
pee = pee.replace( /(?=(\s*))\2([<\[]\/(?:audio|video)[>\]])/gmi, '$1' );
pee = pee.replace( /(?=(\s*))\2(<(?:source|track)[^>]*>)(?=(\s*))\2/gmi, '$1' );
pee = pee.replace( /\n\n+/gmi, '\n\n' ); // take care of duplicates.
// make paragraphs, including one at the end.
const pees = pee.split( /\n\s*\n/ );
pee += '<p>' + tinkle.replace( /^(?:\s+|\s+)$/g, '' ) + '</p>\n';
pee = pee.replace( /<p>\s*<\/p>/gmi, '' ); // Under certain strange conditions, it could create a P of entire whitespace.
pee = pee.replace( /<p>([^<]+)<\/(div|address|form)>/gmi, '<p>$1</p></$2>' );
pee = pee.replace( new RegExp( '<p>\s*(</?' + allBlocks + '[^>]*>)\s*</p>', 'gmi' ), '$1', pee ); // don't pee all over a tag.
pee = pee.replace( /<p>(<li.+?)<\/p>/gmi, '$1' ); // problem with nested lists.
pee = pee.replace( /<p><blockquote([^>]*)>/gmi, '<blockquote$1><p>' );
pee = pee.replace( /<\/blockquote><\/p>/gmi, '</p></blockquote>' );
pee = pee.replace( new RegExp( '<p>\s*(</?' + allBlocks + '[^>]*>)', 'gmi' ), '$1' );
pee = pee.replace( new RegExp( '(</?' + allBlocks + '[^>]*>)\s*</p>', 'gmi' ), '$1' );
pee = pee.replace( /<(script|style)(?:.|\n)*?<\/\\1>/gmi, _autopNewlinePreservationHelper ); // /s modifier from php PCRE regexp replaced with (?:.|\n).
pee = pee.replace( /(<br \/>)?((?=(\s*))\2)\n/gmi, '<br />\n' ); // optionally make line breaks.
pee = pee.replace( '<WPPreserveNewline />', '\n' );
pee = pee.replace( new RegExp( '(</?' + allBlocks + '[^>]*>)\s*<br />', 'gmi' ), '$1' );
pee = pee.replace( /<br \/>(\s*<\/?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)/gmi, '$1' );
pee = pee.replace( /\n<\/p>$/gmi, '</p>' );
if ( Object.keys( preTags ).length ) {
new RegExp( Object.keys( preTags ).join( '|' ), 'gi' ),
return preTags[ matched ];
* @param {Object} args List of arguments.
* @return {wp.media.view.MediaFrame} A media workflow.
initMediaLibrary( args ) {
const mediaFrame = wp.media.frames.wpforms_media_frame = wp.media( {
className: 'media-frame wpforms-media-frame',
library: { type: args.extensions },
mediaFrame.on( 'uploader:ready', function() {
const accept = args.extensions.join( ',' );
jQuery( '.wpforms-media-frame .moxie-shim-html5 input[type="file"]' )
.attr( 'accept', accept );
} ).on( 'library:selection:add', function() {
const attachment = mediaFrame.state().get( 'selection' ).first().toJSON();
if ( ! args.extensions.includes( attachment.file.type ) ) {
// eslint-disable-next-line no-alert
alert( args.extensionsError );
mediaFrame.state().get( 'selection' ).reset();
* Determine whether an element is visible in the viewport.
* @param {jQuery} $element DOM element.
* @return {boolean} true if an element is visible in the viewport.
isInViewport( $element ) {
const rect = $element[ 0 ].getBoundingClientRect();
rect.bottom <= ( window.innerHeight || document.documentElement.clientHeight ) &&
rect.right <= ( window.innerWidth || document.documentElement.clientWidth )