2022-04-11 08:04:30 -04:00
/******/ ( function ( ) { // webpackBootstrap
/******/ "use strict" ;
/******/ // The require scope
/******/ var _ _webpack _require _ _ = { } ;
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ ! function ( ) {
/******/ // define getter functions for harmony exports
/******/ _ _webpack _require _ _ . d = function ( exports , definition ) {
/******/ for ( var key in definition ) {
/******/ if ( _ _webpack _require _ _ . o ( definition , key ) && ! _ _webpack _require _ _ . o ( exports , key ) ) {
/******/ Object . defineProperty ( exports , key , { enumerable : true , get : definition [ key ] } ) ;
/******/ }
/******/ }
/******/ } ;
/******/ } ( ) ;
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ ! function ( ) {
/******/ _ _webpack _require _ _ . o = function ( obj , prop ) { return Object . prototype . hasOwnProperty . call ( obj , prop ) ; }
/******/ } ( ) ;
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ ! function ( ) {
/******/ // define __esModule on exports
/******/ _ _webpack _require _ _ . r = function ( exports ) {
/******/ if ( typeof Symbol !== 'undefined' && Symbol . toStringTag ) {
/******/ Object . defineProperty ( exports , Symbol . toStringTag , { value : 'Module' } ) ;
/******/ }
/******/ Object . defineProperty ( exports , '__esModule' , { value : true } ) ;
2018-12-13 23:41:57 -05:00
/******/ } ;
2022-04-11 08:04:30 -04:00
/******/ } ( ) ;
/******/
2018-12-13 23:41:57 -05:00
/************************************************************************/
2022-04-11 08:04:30 -04:00
var _ _webpack _exports _ _ = { } ;
2018-12-13 23:41:57 -05:00
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
2022-04-11 08:04:30 -04:00
/* harmony export */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , {
/* harmony export */ "autop" : function ( ) { return /* binding */ autop ; } ,
/* harmony export */ "removep" : function ( ) { return /* binding */ removep ; }
/* harmony export */ } ) ;
2018-12-13 23:41:57 -05:00
/ * *
* The regular expression for an HTML element .
*
2020-06-26 09:33:47 -04:00
* @ type { RegExp }
2018-12-13 23:41:57 -05:00
* /
2021-05-19 11:09:27 -04:00
const htmlSplitRegex = ( ( ) => {
2018-12-13 23:41:57 -05:00
/* eslint-disable no-multi-spaces */
2021-05-19 11:09:27 -04:00
const comments = '!' + // Start of comment, after the <.
2018-12-13 23:41:57 -05:00
'(?:' + // Unroll the loop: Consume everything until --> is found.
'-(?!->)' + // Dash not followed by end of comment.
'[^\\-]*' + // Consume non-dashes.
')*' + // Loop possessively.
'(?:-->)?' ; // End of comment. If not found, match all input.
2021-05-19 11:09:27 -04:00
const cdata = '!\\[CDATA\\[' + // Start of comment, after the <.
2018-12-13 23:41:57 -05:00
'[^\\]]*' + // Consume non-].
'(?:' + // Unroll the loop: Consume everything until ]]> is found.
'](?!]>)' + // One ] not followed by end of comment.
'[^\\]]*' + // Consume non-].
')*?' + // Loop possessively.
'(?:]]>)?' ; // End of comment. If not found, match all input.
2021-05-19 11:09:27 -04:00
const escaped = '(?=' + // Is the element escaped?
2018-12-13 23:41:57 -05:00
'!--' + '|' + '!\\[CDATA\\[' + ')' + '((?=!-)' + // If yes, which type?
comments + '|' + cdata + ')' ;
2021-05-19 11:09:27 -04:00
const regex = '(' + // Capture the entire match.
2018-12-13 23:41:57 -05:00
'<' + // Find start of element.
'(' + // Conditional expression follows.
escaped + // Find end of escaped element.
'|' + // ... else ...
'[^>]*>?' + // Find end of normal element.
')' + ')' ;
return new RegExp ( regex ) ;
/* eslint-enable no-multi-spaces */
2021-05-19 11:09:27 -04:00
} ) ( ) ;
2018-12-13 23:41:57 -05:00
/ * *
* Separate HTML elements and comments from the text .
*
2021-11-08 09:29:21 -05:00
* @ param { string } input The text which has to be formatted .
*
* @ return { string [ ] } The formatted text .
2018-12-13 23:41:57 -05:00
* /
function htmlSplit ( input ) {
2021-05-19 11:09:27 -04:00
const parts = [ ] ;
let workingInput = input ;
let match ;
2018-12-13 23:41:57 -05:00
while ( match = workingInput . match ( htmlSplitRegex ) ) {
2020-06-26 09:33:47 -04:00
// The `match` result, when invoked on a RegExp with the `g` flag (`/foo/g`) will not include `index`.
// If the `g` flag is omitted, `index` is included.
// `htmlSplitRegex` does not have the `g` flag so we can assert it will have an index number.
// Assert `match.index` is a number.
2021-05-19 11:09:27 -04:00
const index =
2020-06-26 09:33:47 -04:00
/** @type {number} */
match . index ;
parts . push ( workingInput . slice ( 0 , index ) ) ;
2018-12-13 23:41:57 -05:00
parts . push ( match [ 0 ] ) ;
2020-06-26 09:33:47 -04:00
workingInput = workingInput . slice ( index + match [ 0 ] . length ) ;
2018-12-13 23:41:57 -05:00
}
if ( workingInput . length ) {
parts . push ( workingInput ) ;
}
return parts ;
}
/ * *
* Replace characters or phrases within HTML elements only .
*
2021-11-08 09:29:21 -05:00
* @ param { string } haystack The text which has to be formatted .
* @ param { Record < string , string > } replacePairs In the form { from : 'to' , … } .
*
* @ return { string } The formatted text .
2018-12-13 23:41:57 -05:00
* /
function replaceInHtmlTags ( haystack , replacePairs ) {
// Find all elements.
2021-05-19 11:09:27 -04:00
const textArr = htmlSplit ( haystack ) ;
let changed = false ; // Extract all needles.
2018-12-13 23:41:57 -05:00
2021-05-19 11:09:27 -04:00
const needles = Object . keys ( replacePairs ) ; // Loop through delimiters (elements) only.
2018-12-13 23:41:57 -05:00
2021-05-19 11:09:27 -04:00
for ( let i = 1 ; i < textArr . length ; i += 2 ) {
for ( let j = 0 ; j < needles . length ; j ++ ) {
const needle = needles [ j ] ;
2018-12-13 23:41:57 -05:00
if ( - 1 !== textArr [ i ] . indexOf ( needle ) ) {
textArr [ i ] = textArr [ i ] . replace ( new RegExp ( needle , 'g' ) , replacePairs [ needle ] ) ;
changed = true ; // After one strtr() break out of the foreach loop and look at next element.
break ;
}
}
}
if ( changed ) {
haystack = textArr . join ( '' ) ;
}
return haystack ;
}
/ * *
* Replaces double line - breaks with paragraph elements .
*
* A group of regex replaces used to identify text formatted with newlines and
* replace double line - breaks with HTML paragraph tags . The remaining line -
2019-03-07 04:09:59 -05:00
* breaks after conversion become ` <br /> ` tags , unless br is set to 'false' .
2018-12-13 23:41:57 -05:00
*
2021-11-08 09:29:21 -05:00
* @ param { string } text The text which has to be formatted .
* @ param { boolean } br Optional . If set , will convert all remaining line -
* breaks after paragraphing . Default true .
2019-03-21 08:48:00 -04:00
*
* @ example
* ` ` ` js
* import { autop } from '@wordpress/autop' ;
* autop ( 'my text' ) ; // "<p>my text</p>"
* ` ` `
*
2021-11-08 09:29:21 -05:00
* @ return { string } Text which has been converted into paragraph tags .
2018-12-13 23:41:57 -05:00
* /
2023-06-27 10:24:19 -04:00
function autop ( text , br = true ) {
2021-05-19 11:09:27 -04:00
const preTags = [ ] ;
2018-12-13 23:41:57 -05:00
if ( text . trim ( ) === '' ) {
return '' ;
} // Just to make things a little easier, pad the end.
text = text + '\n' ;
/ *
* Pre tags shouldn ' t be touched by autop .
* Replace pre tags with placeholders and bring them back after autop .
* /
if ( text . indexOf ( '<pre' ) !== - 1 ) {
2021-05-19 11:09:27 -04:00
const textParts = text . split ( '</pre>' ) ;
const lastText = textParts . pop ( ) ;
2018-12-13 23:41:57 -05:00
text = '' ;
2021-05-19 11:09:27 -04:00
for ( let i = 0 ; i < textParts . length ; i ++ ) {
const textPart = textParts [ i ] ;
const start = textPart . indexOf ( '<pre' ) ; // Malformed html?
2018-12-13 23:41:57 -05:00
if ( start === - 1 ) {
text += textPart ;
continue ;
}
2021-05-19 11:09:27 -04:00
const name = '<pre wp-pre-tag-' + i + '></pre>' ;
2018-12-13 23:41:57 -05:00
preTags . push ( [ name , textPart . substr ( start ) + '</pre>' ] ) ;
text += textPart . substr ( 0 , start ) + name ;
}
text += lastText ;
} // Change multiple <br>s into two line breaks, which will turn into paragraphs.
text = text . replace ( /<br\s*\/?>\s*<br\s*\/?>/g , '\n\n' ) ;
2021-05-19 11:09:27 -04:00
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)' ; // Add a double line break above block-level opening tags.
2018-12-13 23:41:57 -05:00
2020-02-06 16:03:31 -05:00
text = text . replace ( new RegExp ( '(<' + allBlocks + '[\\s/>])' , 'g' ) , '\n\n$1' ) ; // Add a double line break below block-level closing tags.
2018-12-13 23:41:57 -05:00
2020-02-06 16:03:31 -05:00
text = text . replace ( new RegExp ( '(</' + allBlocks + '>)' , 'g' ) , '$1\n\n' ) ; // Standardize newline characters to "\n".
2018-12-13 23:41:57 -05:00
text = text . replace ( /\r\n|\r/g , '\n' ) ; // Find newlines in all elements and add placeholders.
text = replaceInHtmlTags ( text , {
'\n' : ' <!-- wpnl --> '
} ) ; // Collapse line breaks before and after <option> elements so they don't get autop'd.
if ( text . indexOf ( '<option' ) !== - 1 ) {
text = text . replace ( /\s*<option/g , '<option' ) ;
text = text . replace ( /<\/option>\s*/g , '</option>' ) ;
}
/ *
* Collapse line breaks inside < object > elements , before < param > and < embed > elements
* so they don 't get autop' d .
* /
if ( text . indexOf ( '</object>' ) !== - 1 ) {
text = text . replace ( /(<object[^>]*>)\s*/g , '$1' ) ;
text = text . replace ( /\s*<\/object>/g , '</object>' ) ;
text = text . replace ( /\s*(<\/?(?:param|embed)[^>]*>)\s*/g , '$1' ) ;
}
/ *
* Collapse line breaks inside < audio > and < video > elements ,
* before and after < source > and < track > elements .
* /
if ( text . indexOf ( '<source' ) !== - 1 || text . indexOf ( '<track' ) !== - 1 ) {
text = text . replace ( /([<\[](?:audio|video)[^>\]]*[>\]])\s*/g , '$1' ) ;
text = text . replace ( /\s*([<\[]\/(?:audio|video)[>\]])/g , '$1' ) ;
text = text . replace ( /\s*(<(?:source|track)[^>]*>)\s*/g , '$1' ) ;
} // Collapse line breaks before and after <figcaption> elements.
if ( text . indexOf ( '<figcaption' ) !== - 1 ) {
text = text . replace ( /\s*(<figcaption[^>]*>)/ , '$1' ) ;
text = text . replace ( /<\/figcaption>\s*/ , '</figcaption>' ) ;
} // Remove more than two contiguous line breaks.
text = text . replace ( /\n\n+/g , '\n\n' ) ; // Split up the contents into an array of strings, separated by double line breaks.
2021-05-19 11:09:27 -04:00
const texts = text . split ( /\n\s*\n/ ) . filter ( Boolean ) ; // Reset text prior to rebuilding.
2018-12-13 23:41:57 -05:00
text = '' ; // Rebuild the content as a string, wrapping every bit with a <p>.
2021-05-19 11:09:27 -04:00
texts . forEach ( textPiece => {
2018-12-13 23:41:57 -05:00
text += '<p>' + textPiece . replace ( /^\n*|\n*$/g , '' ) + '</p>\n' ;
} ) ; // Under certain strange conditions it could create a P of entirely whitespace.
text = text . replace ( /<p>\s*<\/p>/g , '' ) ; // Add a closing <p> inside <div>, <address>, or <form> tag if missing.
text = text . replace ( /<p>([^<]+)<\/(div|address|form)>/g , '<p>$1</p></$2>' ) ; // If an opening or closing block element tag is wrapped in a <p>, unwrap it.
2020-02-06 16:03:31 -05:00
text = text . replace ( new RegExp ( '<p>\\s*(</?' + allBlocks + '[^>]*>)\\s*</p>' , 'g' ) , '$1' ) ; // In some cases <li> may get wrapped in <p>, fix them.
2018-12-13 23:41:57 -05:00
text = text . replace ( /<p>(<li.+?)<\/p>/g , '$1' ) ; // If a <blockquote> is wrapped with a <p>, move it inside the <blockquote>.
text = text . replace ( /<p><blockquote([^>]*)>/gi , '<blockquote$1><p>' ) ;
text = text . replace ( /<\/blockquote><\/p>/g , '</p></blockquote>' ) ; // If an opening or closing block element tag is preceded by an opening <p> tag, remove it.
2020-02-06 16:03:31 -05:00
text = text . replace ( new RegExp ( '<p>\\s*(</?' + allBlocks + '[^>]*>)' , 'g' ) , '$1' ) ; // If an opening or closing block element tag is followed by a closing <p> tag, remove it.
2018-12-13 23:41:57 -05:00
2020-02-06 16:03:31 -05:00
text = text . replace ( new RegExp ( '(</?' + allBlocks + '[^>]*>)\\s*</p>' , 'g' ) , '$1' ) ; // Optionally insert line breaks.
2018-12-13 23:41:57 -05:00
if ( br ) {
// Replace newlines that shouldn't be touched with a placeholder.
2021-05-19 11:09:27 -04:00
text = text . replace ( /<(script|style).*?<\/\\1>/g , match => match [ 0 ] . replace ( /\n/g , '<WPPreserveNewline />' ) ) ; // Normalize <br>
2018-12-13 23:41:57 -05:00
text = text . replace ( /<br>|<br\/>/g , '<br />' ) ; // Replace any new line characters that aren't preceded by a <br /> with a <br />.
2021-05-19 11:09:27 -04:00
text = text . replace ( /(<br \/>)?\s*\n/g , ( a , b ) => b ? a : '<br />\n' ) ; // Replace newline placeholders with newlines.
2018-12-13 23:41:57 -05:00
text = text . replace ( /<WPPreserveNewline \/>/g , '\n' ) ;
} // If a <br /> tag is after an opening or closing block tag, remove it.
2020-02-06 16:03:31 -05:00
text = text . replace ( new RegExp ( '(</?' + allBlocks + '[^>]*>)\\s*<br />' , 'g' ) , '$1' ) ; // If a <br /> tag is before a subset of opening or closing block tags, remove it.
2018-12-13 23:41:57 -05:00
text = text . replace ( /<br \/>(\s*<\/?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)/g , '$1' ) ;
text = text . replace ( /\n<\/p>$/g , '</p>' ) ; // Replace placeholder <pre> tags with their original content.
2021-05-19 11:09:27 -04:00
preTags . forEach ( preTag => {
const [ name , original ] = preTag ;
2018-12-13 23:41:57 -05:00
text = text . replace ( name , original ) ;
} ) ; // Restore newlines in all elements.
if ( - 1 !== text . indexOf ( '<!-- wpnl -->' ) ) {
text = text . replace ( /\s?<!-- wpnl -->\s?/g , '\n' ) ;
}
return text ;
}
/ * *
2019-03-07 04:09:59 -05:00
* Replaces ` <p> ` tags with two line breaks . "Opposite" of autop ( ) .
2018-12-13 23:41:57 -05:00
*
2019-03-07 04:09:59 -05:00
* Replaces ` <p> ` tags with two line breaks except where the ` <p> ` has attributes .
* Unifies whitespace . Indents ` <li> ` , ` <dt> ` and ` <dd> ` for better readability .
2018-12-13 23:41:57 -05:00
*
2021-11-08 09:29:21 -05:00
* @ param { string } html The content from the editor .
2019-03-21 08:48:00 -04:00
*
* @ example
* ` ` ` js
* import { removep } from '@wordpress/autop' ;
* removep ( '<p>my text</p>' ) ; // "my text"
* ` ` `
*
2021-11-08 09:29:21 -05:00
* @ return { string } The content with stripped paragraph tags .
2018-12-13 23:41:57 -05:00
* /
function removep ( html ) {
2021-05-19 11:09:27 -04:00
const blocklist = 'blockquote|ul|ol|li|dl|dt|dd|table|thead|tbody|tfoot|tr|th|td|h[1-6]|fieldset|figure' ;
const blocklist1 = blocklist + '|div|p' ;
const blocklist2 = blocklist + '|pre' ;
2020-06-26 09:33:47 -04:00
/** @type {string[]} */
2021-05-19 11:09:27 -04:00
const preserve = [ ] ;
let preserveLinebreaks = false ;
let preserveBr = false ;
2018-12-13 23:41:57 -05:00
if ( ! html ) {
return '' ;
} // Protect script and style tags.
if ( html . indexOf ( '<script' ) !== - 1 || html . indexOf ( '<style' ) !== - 1 ) {
2021-05-19 11:09:27 -04:00
html = html . replace ( /<(script|style)[^>]*>[\s\S]*?<\/\1>/g , match => {
2018-12-13 23:41:57 -05:00
preserve . push ( match ) ;
return '<wp-preserve>' ;
} ) ;
} // Protect pre tags.
if ( html . indexOf ( '<pre' ) !== - 1 ) {
preserveLinebreaks = true ;
2021-05-19 11:09:27 -04:00
html = html . replace ( /<pre[^>]*>[\s\S]+?<\/pre>/g , a => {
2018-12-13 23:41:57 -05:00
a = a . replace ( /<br ?\/?>(\r\n|\n)?/g , '<wp-line-break>' ) ;
a = a . replace ( /<\/?p( [^>]*)?>(\r\n|\n)?/g , '<wp-line-break>' ) ;
return a . replace ( /\r?\n/g , '<wp-line-break>' ) ;
} ) ;
} // Remove line breaks but keep <br> tags inside image captions.
if ( html . indexOf ( '[caption' ) !== - 1 ) {
preserveBr = true ;
2021-05-19 11:09:27 -04:00
html = html . replace ( /\[caption[\s\S]+?\[\/caption\]/g , a => {
2018-12-13 23:41:57 -05:00
return a . replace ( /<br([^>]*)>/g , '<wp-temp-br$1>' ) . replace ( /[\r\n\t]+/ , '' ) ;
} ) ;
} // Normalize white space characters before and after block tags.
html = html . replace ( new RegExp ( '\\s*</(' + blocklist1 + ')>\\s*' , 'g' ) , '</$1>\n' ) ;
html = html . replace ( new RegExp ( '\\s*<((?:' + blocklist1 + ')(?: [^>]*)?)>' , 'g' ) , '\n<$1>' ) ; // Mark </p> if it has any attributes.
2019-09-19 11:19:18 -04:00
html = html . replace ( /(<p [^>]+>[\s\S]*?)<\/p>/g , '$1</p#>' ) ; // Preserve the first <p> inside a <div>.
2018-12-13 23:41:57 -05:00
html = html . replace ( /<div( [^>]*)?>\s*<p>/gi , '<div$1>\n\n' ) ; // Remove paragraph tags.
html = html . replace ( /\s*<p>/gi , '' ) ;
html = html . replace ( /\s*<\/p>\s*/gi , '\n\n' ) ; // Normalize white space chars and remove multiple line breaks.
html = html . replace ( /\n[\s\u00a0]+\n/g , '\n\n' ) ; // Replace <br> tags with line breaks.
2021-05-19 11:09:27 -04:00
html = html . replace ( /(\s*)<br ?\/?>\s*/gi , ( _ , space ) => {
2018-12-13 23:41:57 -05:00
if ( space && space . indexOf ( '\n' ) !== - 1 ) {
return '\n\n' ;
}
return '\n' ;
} ) ; // Fix line breaks around <div>.
html = html . replace ( /\s*<div/g , '\n<div' ) ;
html = html . replace ( /<\/div>\s*/g , '</div>\n' ) ; // Fix line breaks around caption shortcodes.
html = html . replace ( /\s*\[caption([^\[]+)\[\/caption\]\s*/gi , '\n\n[caption$1[/caption]\n\n' ) ;
html = html . replace ( /caption\]\n\n+\[caption/g , 'caption]\n\n[caption' ) ; // Pad block elements tags with a line break.
html = html . replace ( new RegExp ( '\\s*<((?:' + blocklist2 + ')(?: [^>]*)?)\\s*>' , 'g' ) , '\n<$1>' ) ;
html = html . replace ( new RegExp ( '\\s*</(' + blocklist2 + ')>\\s*' , 'g' ) , '</$1>\n' ) ; // Indent <li>, <dt> and <dd> tags.
html = html . replace ( /<((li|dt|dd)[^>]*)>/g , ' \t<$1>' ) ; // Fix line breaks around <select> and <option>.
if ( html . indexOf ( '<option' ) !== - 1 ) {
html = html . replace ( /\s*<option/g , '\n<option' ) ;
html = html . replace ( /\s*<\/select>/g , '\n</select>' ) ;
} // Pad <hr> with two line breaks.
if ( html . indexOf ( '<hr' ) !== - 1 ) {
html = html . replace ( /\s*<hr( [^>]*)?>\s*/g , '\n\n<hr$1>\n\n' ) ;
} // Remove line breaks in <object> tags.
if ( html . indexOf ( '<object' ) !== - 1 ) {
2021-05-19 11:09:27 -04:00
html = html . replace ( /<object[\s\S]+?<\/object>/g , a => {
2018-12-13 23:41:57 -05:00
return a . replace ( /[\r\n]+/g , '' ) ;
} ) ;
} // Unmark special paragraph closing tags.
html = html . replace ( /<\/p#>/g , '</p>\n' ) ; // Pad remaining <p> tags whit a line break.
html = html . replace ( /\s*(<p [^>]+>[\s\S]*?<\/p>)/g , '\n$1' ) ; // Trim.
html = html . replace ( /^\s+/ , '' ) ;
html = html . replace ( /[\s\u00a0]+$/ , '' ) ;
if ( preserveLinebreaks ) {
html = html . replace ( /<wp-line-break>/g , '\n' ) ;
}
if ( preserveBr ) {
html = html . replace ( /<wp-temp-br([^>]*)>/g , '<br$1>' ) ;
} // Restore preserved tags.
if ( preserve . length ) {
2021-05-19 11:09:27 -04:00
html = html . replace ( /<wp-preserve>/g , ( ) => {
2020-06-26 09:33:47 -04:00
return (
/** @type {string} */
preserve . shift ( )
) ;
2018-12-13 23:41:57 -05:00
} ) ;
}
return html ;
}
2022-04-11 08:04:30 -04:00
( window . wp = window . wp || { } ) . autop = _ _webpack _exports _ _ ;
/******/ } ) ( )
;