diff -r 3d4e9c994f10 -r a86126ab1dd4 wp/wp-includes/js/shortcode.js --- a/wp/wp-includes/js/shortcode.js Tue Oct 22 16:11:46 2019 +0200 +++ b/wp/wp-includes/js/shortcode.js Tue Dec 15 13:49:49 2020 +0100 @@ -13,13 +13,15 @@ (function(){ wp.shortcode = { - // ### Find the next matching shortcode - // - // Given a shortcode `tag`, a block of `text`, and an optional starting - // `index`, returns the next matching shortcode or `undefined`. - // - // Shortcodes are formatted as an object that contains the match - // `content`, the matching `index`, and the parsed `shortcode` object. + /* + * ### Find the next matching shortcode. + * + * Given a shortcode `tag`, a block of `text`, and an optional starting + * `index`, returns the next matching shortcode or `undefined`. + * + * Shortcodes are formatted as an object that contains the match + * `content`, the matching `index`, and the parsed `shortcode` object. + */ next: function( tag, text, index ) { var re = wp.shortcode.regexp( tag ), match, result; @@ -57,15 +59,17 @@ return result; }, - // ### Replace matching shortcodes in a block of text - // - // Accepts a shortcode `tag`, content `text` to scan, and a `callback` - // to process the shortcode matches and return a replacement string. - // Returns the `text` with all shortcodes replaced. - // - // Shortcode matches are objects that contain the shortcode `tag`, - // a shortcode `attrs` object, the `content` between shortcode tags, - // and a boolean flag to indicate if the match was a `single` tag. + /* + * ### Replace matching shortcodes in a block of text. + * + * Accepts a shortcode `tag`, content `text` to scan, and a `callback` + * to process the shortcode matches and return a replacement string. + * Returns the `text` with all shortcodes replaced. + * + * Shortcode matches are objects that contain the shortcode `tag`, + * a shortcode `attrs` object, the `content` between shortcode tags, + * and a boolean flag to indicate if the match was a `single` tag. + */ replace: function( tag, text, callback ) { return text.replace( wp.shortcode.regexp( tag ), function( match, left, tag, attrs, slash, content, closing, right ) { // If both extra brackets exist, the shortcode has been @@ -83,67 +87,75 @@ }); }, - // ### Generate a string from shortcode parameters - // - // Creates a `wp.shortcode` instance and returns a string. - // - // Accepts the same `options` as the `wp.shortcode()` constructor, - // containing a `tag` string, a string or object of `attrs`, a boolean - // indicating whether to format the shortcode using a `single` tag, and a - // `content` string. + /* + * ### Generate a string from shortcode parameters. + * + * Creates a `wp.shortcode` instance and returns a string. + * + * Accepts the same `options` as the `wp.shortcode()` constructor, + * containing a `tag` string, a string or object of `attrs`, a boolean + * indicating whether to format the shortcode using a `single` tag, and a + * `content` string. + */ string: function( options ) { return new wp.shortcode( options ).string(); }, - // ### Generate a RegExp to identify a shortcode - // - // The base regex is functionally equivalent to the one found in - // `get_shortcode_regex()` in `wp-includes/shortcodes.php`. - // - // Capture groups: - // - // 1. An extra `[` to allow for escaping shortcodes with double `[[]]` - // 2. The shortcode name - // 3. The shortcode argument list - // 4. The self closing `/` - // 5. The content of a shortcode when it wraps some content. - // 6. The closing tag. - // 7. An extra `]` to allow for escaping shortcodes with double `[[]]` + /* + * ### Generate a RegExp to identify a shortcode. + * + * The base regex is functionally equivalent to the one found in + * `get_shortcode_regex()` in `wp-includes/shortcodes.php`. + * + * Capture groups: + * + * 1. An extra `[` to allow for escaping shortcodes with double `[[]]`. + * 2. The shortcode name. + * 3. The shortcode argument list. + * 4. The self closing `/`. + * 5. The content of a shortcode when it wraps some content. + * 6. The closing tag. + * 7. An extra `]` to allow for escaping shortcodes with double `[[]]`. + */ regexp: _.memoize( function( tag ) { return new RegExp( '\\[(\\[?)(' + tag + ')(?![\\w-])([^\\]\\/]*(?:\\/(?!\\])[^\\]\\/]*)*?)(?:(\\/)\\]|\\](?:([^\\[]*(?:\\[(?!\\/\\2\\])[^\\[]*)*)(\\[\\/\\2\\]))?)(\\]?)', 'g' ); }), - // ### Parse shortcode attributes - // - // Shortcodes accept many types of attributes. These can chiefly be - // divided into named and numeric attributes: - // - // Named attributes are assigned on a key/value basis, while numeric - // attributes are treated as an array. - // - // Named attributes can be formatted as either `name="value"`, - // `name='value'`, or `name=value`. Numeric attributes can be formatted - // as `"value"` or just `value`. + /* + * ### Parse shortcode attributes. + * + * Shortcodes accept many types of attributes. These can chiefly be + * divided into named and numeric attributes: + * + * Named attributes are assigned on a key/value basis, while numeric + * attributes are treated as an array. + * + * Named attributes can be formatted as either `name="value"`, + * `name='value'`, or `name=value`. Numeric attributes can be formatted + * as `"value"` or just `value`. + */ attrs: _.memoize( function( text ) { var named = {}, numeric = [], pattern, match; - // This regular expression is reused from `shortcode_parse_atts()` - // in `wp-includes/shortcodes.php`. - // - // Capture groups: - // - // 1. An attribute name, that corresponds to... - // 2. a value in double quotes. - // 3. An attribute name, that corresponds to... - // 4. a value in single quotes. - // 5. An attribute name, that corresponds to... - // 6. an unquoted value. - // 7. A numeric attribute in double quotes. - // 8. A numeric attribute in single quotes. - // 9. An unquoted numeric attribute. + /* + * This regular expression is reused from `shortcode_parse_atts()` + * in `wp-includes/shortcodes.php`. + * + * Capture groups: + * + * 1. An attribute name, that corresponds to... + * 2. a value in double quotes. + * 3. An attribute name, that corresponds to... + * 4. a value in single quotes. + * 5. An attribute name, that corresponds to... + * 6. an unquoted value. + * 7. A numeric attribute in double quotes. + * 8. A numeric attribute in single quotes. + * 9. An unquoted numeric attribute. + */ pattern = /([\w-]+)\s*=\s*"([^"]*)"(?:\s|$)|([\w-]+)\s*=\s*'([^']*)'(?:\s|$)|([\w-]+)\s*=\s*([^\s'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|'([^']*)'(?:\s|$)|(\S+)(?:\s|$)/g; // Map zero-width spaces to actual spaces. @@ -172,10 +184,13 @@ }; }), - // ### Generate a Shortcode Object from a RegExp match - // Accepts a `match` object from calling `regexp.exec()` on a `RegExp` - // generated by `wp.shortcode.regexp()`. `match` can also be set to the - // `arguments` from a callback passed to `regexp.replace()`. + /* + * ### Generate a Shortcode Object from a RegExp match. + * + * Accepts a `match` object from calling `regexp.exec()` on a `RegExp` + * generated by `wp.shortcode.regexp()`. `match` can also be set + * to the `arguments` from a callback passed to `regexp.replace()`. + */ fromMatch: function( match ) { var type; @@ -197,16 +212,18 @@ }; - // Shortcode Objects - // ----------------- - // - // Shortcode objects are generated automatically when using the main - // `wp.shortcode` methods: `next()`, `replace()`, and `string()`. - // - // To access a raw representation of a shortcode, pass an `options` object, - // containing a `tag` string, a string or object of `attrs`, a string - // indicating the `type` of the shortcode ('single', 'self-closing', or - // 'closed'), and a `content` string. + /* + * Shortcode Objects + * ----------------- + * + * Shortcode objects are generated automatically when using the main + * `wp.shortcode` methods: `next()`, `replace()`, and `string()`. + * + * To access a raw representation of a shortcode, pass an `options` object, + * containing a `tag` string, a string or object of `attrs`, a string + * indicating the `type` of the shortcode ('single', 'self-closing', + * or 'closed'), and a `content` string. + */ wp.shortcode = _.extend( function( options ) { _.extend( this, _.pick( options || {}, 'tag', 'attrs', 'type', 'content' ) ); @@ -227,8 +244,8 @@ this.attrs = wp.shortcode.attrs( attrs ); // Identify a correctly formatted `attrs` object. - } else if ( _.isEqual( _.keys( attrs ), [ 'named', 'numeric' ] ) ) { - this.attrs = attrs; + } else if ( _.difference( _.keys( attrs ), [ 'named', 'numeric' ] ).length === 0 ) { + this.attrs = _.defaults( attrs, this.attrs ); // Handle a flat object of attributes. } else { @@ -239,24 +256,28 @@ }, wp.shortcode ); _.extend( wp.shortcode.prototype, { - // ### Get a shortcode attribute - // - // Automatically detects whether `attr` is named or numeric and routes - // it accordingly. + /* + * ### Get a shortcode attribute. + * + * Automatically detects whether `attr` is named or numeric and routes + * it accordingly. + */ get: function( attr ) { return this.attrs[ _.isNumber( attr ) ? 'numeric' : 'named' ][ attr ]; }, - // ### Set a shortcode attribute - // - // Automatically detects whether `attr` is named or numeric and routes - // it accordingly. + /* + * ### Set a shortcode attribute. + * + * Automatically detects whether `attr` is named or numeric and routes + * it accordingly. + */ set: function( attr, value ) { this.attrs[ _.isNumber( attr ) ? 'numeric' : 'named' ][ attr ] = value; return this; }, - // ### Transform the shortcode match into a string + // ### Transform the shortcode match into a string. string: function() { var text = '[' + this.tag; @@ -293,20 +314,24 @@ }); }()); -// HTML utility functions -// ---------------------- -// -// Experimental. These functions may change or be removed in the future. +/* + * HTML utility functions + * ---------------------- + * + * Experimental. These functions may change or be removed in the future. + */ (function(){ wp.html = _.extend( wp.html || {}, { - // ### Parse HTML attributes. - // - // Converts `content` to a set of parsed HTML attributes. - // Utilizes `wp.shortcode.attrs( content )`, which is a valid superset of - // the HTML attribute specification. Reformats the attributes into an - // object that contains the `attrs` with `key:value` mapping, and a record - // of the attributes that were entered using `empty` attribute syntax (i.e. - // with no value). + /* + * ### Parse HTML attributes. + * + * Converts `content` to a set of parsed HTML attributes. + * Utilizes `wp.shortcode.attrs( content )`, which is a valid superset of + * the HTML attribute specification. Reformats the attributes into an + * object that contains the `attrs` with `key:value` mapping, and a record + * of the attributes that were entered using `empty` attribute syntax (i.e. + * with no value). + */ attrs: function( content ) { var result, attrs;