@wordpress/shortcode 3.10.0 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 3.13.0 (2022-07-13)
6
+
7
+ ## 3.12.0 (2022-06-29)
8
+
9
+ ## 3.11.0 (2022-06-15)
10
+
5
11
  ## 3.10.0 (2022-06-01)
6
12
 
7
13
  ## 3.9.0 (2022-05-18)
package/build/index.js CHANGED
@@ -12,8 +12,6 @@ exports.regexp = regexp;
12
12
  exports.replace = replace;
13
13
  exports.string = string;
14
14
 
15
- var _lodash = require("lodash");
16
-
17
15
  var _memize = _interopRequireDefault(require("memize"));
18
16
 
19
17
  /**
@@ -270,9 +268,18 @@ function fromMatch(match) {
270
268
  */
271
269
 
272
270
 
273
- const shortcode = (0, _lodash.extend)(function (options) {
274
- (0, _lodash.extend)(this, (0, _lodash.pick)(options || {}, 'tag', 'attrs', 'type', 'content'));
275
- const attributes = this.attrs; // Ensure we have a correctly formatted `attrs` object.
271
+ const shortcode = Object.assign(function (options) {
272
+ const {
273
+ tag,
274
+ attrs: attributes,
275
+ type,
276
+ content
277
+ } = options || {};
278
+ Object.assign(this, {
279
+ tag,
280
+ type,
281
+ content
282
+ }); // Ensure we have a correctly formatted `attrs` object.
276
283
 
277
284
  this.attrs = {
278
285
  named: {},
@@ -281,15 +288,17 @@ const shortcode = (0, _lodash.extend)(function (options) {
281
288
 
282
289
  if (!attributes) {
283
290
  return;
284
- } // Parse a string of attributes.
291
+ }
285
292
 
293
+ const attributeTypes = ['named', 'numeric']; // Parse a string of attributes.
286
294
 
287
- if ((0, _lodash.isString)(attributes)) {
295
+ if (typeof attributes === 'string') {
288
296
  this.attrs = attrs(attributes); // Identify a correctly formatted `attrs` object.
289
- } else if ((0, _lodash.isEqual)(Object.keys(attributes), ['named', 'numeric'])) {
297
+ } else if (attributes.length === attributeTypes.length && attributeTypes.every((t, key) => t === attributes[key])) {
290
298
  this.attrs = attributes; // Handle a flat object of attributes.
291
299
  } else {
292
- (0, _lodash.forEach)(attributes, (value, key) => {
300
+ Object.entries(attributes).forEach(_ref => {
301
+ let [key, value] = _ref;
293
302
  this.set(key, value);
294
303
  });
295
304
  }
@@ -301,7 +310,7 @@ const shortcode = (0, _lodash.extend)(function (options) {
301
310
  attrs,
302
311
  fromMatch
303
312
  });
304
- (0, _lodash.extend)(shortcode.prototype, {
313
+ Object.assign(shortcode.prototype, {
305
314
  /**
306
315
  * Get a shortcode attribute.
307
316
  *
@@ -313,7 +322,7 @@ const shortcode = (0, _lodash.extend)(function (options) {
313
322
  * @return {string} Attribute value.
314
323
  */
315
324
  get(attr) {
316
- return this.attrs[(0, _lodash.isNumber)(attr) ? 'numeric' : 'named'][attr];
325
+ return this.attrs[typeof attr === 'number' ? 'numeric' : 'named'][attr];
317
326
  },
318
327
 
319
328
  /**
@@ -328,7 +337,7 @@ const shortcode = (0, _lodash.extend)(function (options) {
328
337
  * @return {WPShortcode} Shortcode instance.
329
338
  */
330
339
  set(attr, value) {
331
- this.attrs[(0, _lodash.isNumber)(attr) ? 'numeric' : 'named'][attr] = value;
340
+ this.attrs[typeof attr === 'number' ? 'numeric' : 'named'][attr] = value;
332
341
  return this;
333
342
  },
334
343
 
@@ -339,14 +348,15 @@ const shortcode = (0, _lodash.extend)(function (options) {
339
348
  */
340
349
  string() {
341
350
  let text = '[' + this.tag;
342
- (0, _lodash.forEach)(this.attrs.numeric, value => {
351
+ this.attrs.numeric.forEach(value => {
343
352
  if (/\s/.test(value)) {
344
353
  text += ' "' + value + '"';
345
354
  } else {
346
355
  text += ' ' + value;
347
356
  }
348
357
  });
349
- (0, _lodash.forEach)(this.attrs.named, (value, name) => {
358
+ Object.entries(this.attrs.named).forEach(_ref2 => {
359
+ let [name, value] = _ref2;
350
360
  text += ' ' + name + '="' + value + '"';
351
361
  }); // If the tag is marked as `single` or `self-closing`, close the tag and
352
362
  // ignore any additional content.
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/shortcode/src/index.js"],"names":["next","tag","text","index","re","regexp","lastIndex","match","exec","result","content","shortcode","fromMatch","slice","replace","callback","left","$3","attrs","slash","closing","right","arguments","string","options","RegExp","named","numeric","pattern","toLowerCase","push","type","attributes","Object","keys","value","key","set","prototype","get","attr","test","name"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { extend, pick, isString, isEqual, forEach, isNumber } from 'lodash';\nimport memize from 'memize';\n\n/**\n * Shortcode attributes object.\n *\n * @typedef {Object} WPShortcodeAttrs\n *\n * @property {Object} named Object with named attributes.\n * @property {Array} numeric Array with numeric attributes.\n */\n\n/**\n * Shortcode object.\n *\n * @typedef {Object} WPShortcode\n *\n * @property {string} tag Shortcode tag.\n * @property {WPShortcodeAttrs} attrs Shortcode attributes.\n * @property {string} content Shortcode content.\n * @property {string} type Shortcode type: `self-closing`,\n * `closed`, or `single`.\n */\n\n/**\n * @typedef {Object} WPShortcodeMatch\n *\n * @property {number} index Index the shortcode is found at.\n * @property {string} content Matched content.\n * @property {WPShortcode} shortcode Shortcode instance of the match.\n */\n\n/**\n * Find the next matching shortcode.\n *\n * @param {string} tag Shortcode tag.\n * @param {string} text Text to search.\n * @param {number} index Index to start search from.\n *\n * @return {?WPShortcodeMatch} Matched information.\n */\nexport function next( tag, text, index = 0 ) {\n\tconst re = regexp( tag );\n\n\tre.lastIndex = index;\n\n\tconst match = re.exec( text );\n\n\tif ( ! match ) {\n\t\treturn;\n\t}\n\n\t// If we matched an escaped shortcode, try again.\n\tif ( '[' === match[ 1 ] && ']' === match[ 7 ] ) {\n\t\treturn next( tag, text, re.lastIndex );\n\t}\n\n\tconst result = {\n\t\tindex: match.index,\n\t\tcontent: match[ 0 ],\n\t\tshortcode: fromMatch( match ),\n\t};\n\n\t// If we matched a leading `[`, strip it from the match and increment the\n\t// index accordingly.\n\tif ( match[ 1 ] ) {\n\t\tresult.content = result.content.slice( 1 );\n\t\tresult.index++;\n\t}\n\n\t// If we matched a trailing `]`, strip it from the match.\n\tif ( match[ 7 ] ) {\n\t\tresult.content = result.content.slice( 0, -1 );\n\t}\n\n\treturn result;\n}\n\n/**\n * Replace matching shortcodes in a block of text.\n *\n * @param {string} tag Shortcode tag.\n * @param {string} text Text to search.\n * @param {Function} callback Function to process the match and return\n * replacement string.\n *\n * @return {string} Text with shortcodes replaced.\n */\nexport function replace( tag, text, callback ) {\n\treturn text.replace(\n\t\tregexp( tag ),\n\t\tfunction ( match, left, $3, attrs, slash, content, closing, right ) {\n\t\t\t// If both extra brackets exist, the shortcode has been properly\n\t\t\t// escaped.\n\t\t\tif ( left === '[' && right === ']' ) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\t// Create the match object and pass it through the callback.\n\t\t\tconst result = callback( fromMatch( arguments ) );\n\n\t\t\t// Make sure to return any of the extra brackets if they weren't used to\n\t\t\t// escape the shortcode.\n\t\t\treturn result || result === '' ? left + result + right : match;\n\t\t}\n\t);\n}\n\n/**\n * Generate a string from shortcode parameters.\n *\n * Creates a shortcode instance and returns a string.\n *\n * Accepts the same `options` as the `shortcode()` constructor, containing a\n * `tag` string, a string or object of `attrs`, a boolean indicating whether to\n * format the shortcode using a `single` tag, and a `content` string.\n *\n * @param {Object} options\n *\n * @return {string} String representation of the shortcode.\n */\nexport function string( options ) {\n\treturn new shortcode( options ).string();\n}\n\n/**\n * Generate a RegExp to identify a shortcode.\n *\n * The base regex is functionally equivalent to the one found in\n * `get_shortcode_regex()` in `wp-includes/shortcodes.php`.\n *\n * Capture groups:\n *\n * 1. An extra `[` to allow for escaping shortcodes with double `[[]]`\n * 2. The shortcode name\n * 3. The shortcode argument list\n * 4. The self closing `/`\n * 5. The content of a shortcode when it wraps some content.\n * 6. The closing tag.\n * 7. An extra `]` to allow for escaping shortcodes with double `[[]]`\n *\n * @param {string} tag Shortcode tag.\n *\n * @return {RegExp} Shortcode RegExp.\n */\nexport function regexp( tag ) {\n\treturn new RegExp(\n\t\t'\\\\[(\\\\[?)(' +\n\t\t\ttag +\n\t\t\t')(?![\\\\w-])([^\\\\]\\\\/]*(?:\\\\/(?!\\\\])[^\\\\]\\\\/]*)*?)(?:(\\\\/)\\\\]|\\\\](?:([^\\\\[]*(?:\\\\[(?!\\\\/\\\\2\\\\])[^\\\\[]*)*)(\\\\[\\\\/\\\\2\\\\]))?)(\\\\]?)',\n\t\t'g'\n\t);\n}\n\n/**\n * Parse shortcode attributes.\n *\n * Shortcodes accept many types of attributes. These can chiefly be divided into\n * named and numeric attributes:\n *\n * Named attributes are assigned on a key/value basis, while numeric attributes\n * are treated as an array.\n *\n * Named attributes can be formatted as either `name=\"value\"`, `name='value'`,\n * or `name=value`. Numeric attributes can be formatted as `\"value\"` or just\n * `value`.\n *\n * @param {string} text Serialised shortcode attributes.\n *\n * @return {WPShortcodeAttrs} Parsed shortcode attributes.\n */\nexport const attrs = memize( ( text ) => {\n\tconst named = {};\n\tconst numeric = [];\n\n\t// This regular expression is reused from `shortcode_parse_atts()` in\n\t// `wp-includes/shortcodes.php`.\n\t//\n\t// Capture groups:\n\t//\n\t// 1. An attribute name, that corresponds to...\n\t// 2. a value in double quotes.\n\t// 3. An attribute name, that corresponds to...\n\t// 4. a value in single quotes.\n\t// 5. An attribute name, that corresponds to...\n\t// 6. an unquoted value.\n\t// 7. A numeric attribute in double quotes.\n\t// 8. A numeric attribute in single quotes.\n\t// 9. An unquoted numeric attribute.\n\tconst pattern = /([\\w-]+)\\s*=\\s*\"([^\"]*)\"(?:\\s|$)|([\\w-]+)\\s*=\\s*'([^']*)'(?:\\s|$)|([\\w-]+)\\s*=\\s*([^\\s'\"]+)(?:\\s|$)|\"([^\"]*)\"(?:\\s|$)|'([^']*)'(?:\\s|$)|(\\S+)(?:\\s|$)/g;\n\n\t// Map zero-width spaces to actual spaces.\n\ttext = text.replace( /[\\u00a0\\u200b]/g, ' ' );\n\n\tlet match;\n\n\t// Match and normalize attributes.\n\twhile ( ( match = pattern.exec( text ) ) ) {\n\t\tif ( match[ 1 ] ) {\n\t\t\tnamed[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t} else if ( match[ 3 ] ) {\n\t\t\tnamed[ match[ 3 ].toLowerCase() ] = match[ 4 ];\n\t\t} else if ( match[ 5 ] ) {\n\t\t\tnamed[ match[ 5 ].toLowerCase() ] = match[ 6 ];\n\t\t} else if ( match[ 7 ] ) {\n\t\t\tnumeric.push( match[ 7 ] );\n\t\t} else if ( match[ 8 ] ) {\n\t\t\tnumeric.push( match[ 8 ] );\n\t\t} else if ( match[ 9 ] ) {\n\t\t\tnumeric.push( match[ 9 ] );\n\t\t}\n\t}\n\n\treturn { named, numeric };\n} );\n\n/**\n * Generate a Shortcode Object from a RegExp match.\n *\n * Accepts a `match` object from calling `regexp.exec()` on a `RegExp` generated\n * by `regexp()`. `match` can also be set to the `arguments` from a callback\n * passed to `regexp.replace()`.\n *\n * @param {Array} match Match array.\n *\n * @return {WPShortcode} Shortcode instance.\n */\nexport function fromMatch( match ) {\n\tlet type;\n\n\tif ( match[ 4 ] ) {\n\t\ttype = 'self-closing';\n\t} else if ( match[ 6 ] ) {\n\t\ttype = 'closed';\n\t} else {\n\t\ttype = 'single';\n\t}\n\n\treturn new shortcode( {\n\t\ttag: match[ 2 ],\n\t\tattrs: match[ 3 ],\n\t\ttype,\n\t\tcontent: match[ 5 ],\n\t} );\n}\n\n/**\n * Creates a shortcode instance.\n *\n * To access a raw representation of a shortcode, pass an `options` object,\n * containing a `tag` string, a string or object of `attrs`, a string indicating\n * the `type` of the shortcode ('single', 'self-closing', or 'closed'), and a\n * `content` string.\n *\n * @param {Object} options Options as described.\n *\n * @return {WPShortcode} Shortcode instance.\n */\nconst shortcode = extend(\n\tfunction ( options ) {\n\t\textend(\n\t\t\tthis,\n\t\t\tpick( options || {}, 'tag', 'attrs', 'type', 'content' )\n\t\t);\n\n\t\tconst attributes = this.attrs;\n\n\t\t// Ensure we have a correctly formatted `attrs` object.\n\t\tthis.attrs = {\n\t\t\tnamed: {},\n\t\t\tnumeric: [],\n\t\t};\n\n\t\tif ( ! attributes ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Parse a string of attributes.\n\t\tif ( isString( attributes ) ) {\n\t\t\tthis.attrs = attrs( attributes );\n\t\t\t// Identify a correctly formatted `attrs` object.\n\t\t} else if (\n\t\t\tisEqual( Object.keys( attributes ), [ 'named', 'numeric' ] )\n\t\t) {\n\t\t\tthis.attrs = attributes;\n\t\t\t// Handle a flat object of attributes.\n\t\t} else {\n\t\t\tforEach( attributes, ( value, key ) => {\n\t\t\t\tthis.set( key, value );\n\t\t\t} );\n\t\t}\n\t},\n\t{\n\t\tnext,\n\t\treplace,\n\t\tstring,\n\t\tregexp,\n\t\tattrs,\n\t\tfromMatch,\n\t}\n);\n\nextend( shortcode.prototype, {\n\t/**\n\t * Get a shortcode attribute.\n\t *\n\t * Automatically detects whether `attr` is named or numeric and routes it\n\t * accordingly.\n\t *\n\t * @param {(number|string)} attr Attribute key.\n\t *\n\t * @return {string} Attribute value.\n\t */\n\tget( attr ) {\n\t\treturn this.attrs[ isNumber( attr ) ? 'numeric' : 'named' ][ attr ];\n\t},\n\n\t/**\n\t * Set a shortcode attribute.\n\t *\n\t * Automatically detects whether `attr` is named or numeric and routes it\n\t * accordingly.\n\t *\n\t * @param {(number|string)} attr Attribute key.\n\t * @param {string} value Attribute value.\n\t *\n\t * @return {WPShortcode} Shortcode instance.\n\t */\n\tset( attr, value ) {\n\t\tthis.attrs[ isNumber( attr ) ? 'numeric' : 'named' ][ attr ] = value;\n\t\treturn this;\n\t},\n\n\t/**\n\t * Transform the shortcode into a string.\n\t *\n\t * @return {string} String representation of the shortcode.\n\t */\n\tstring() {\n\t\tlet text = '[' + this.tag;\n\n\t\tforEach( this.attrs.numeric, ( value ) => {\n\t\t\tif ( /\\s/.test( value ) ) {\n\t\t\t\ttext += ' \"' + value + '\"';\n\t\t\t} else {\n\t\t\t\ttext += ' ' + value;\n\t\t\t}\n\t\t} );\n\n\t\tforEach( this.attrs.named, ( value, name ) => {\n\t\t\ttext += ' ' + name + '=\"' + value + '\"';\n\t\t} );\n\n\t\t// If the tag is marked as `single` or `self-closing`, close the tag and\n\t\t// ignore any additional content.\n\t\tif ( 'single' === this.type ) {\n\t\t\treturn text + ']';\n\t\t} else if ( 'self-closing' === this.type ) {\n\t\t\treturn text + ' /]';\n\t\t}\n\n\t\t// Complete the opening tag.\n\t\ttext += ']';\n\n\t\tif ( this.content ) {\n\t\t\ttext += this.content;\n\t\t}\n\n\t\t// Add the closing tag.\n\t\treturn text + '[/' + this.tag + ']';\n\t},\n} );\n\nexport default shortcode;\n"]}
1
+ {"version":3,"sources":["@wordpress/shortcode/src/index.js"],"names":["next","tag","text","index","re","regexp","lastIndex","match","exec","result","content","shortcode","fromMatch","slice","replace","callback","left","$3","attrs","slash","closing","right","arguments","string","options","RegExp","named","numeric","pattern","toLowerCase","push","type","Object","assign","attributes","attributeTypes","length","every","t","key","entries","forEach","value","set","prototype","get","attr","test","name"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport memize from 'memize';\n\n/**\n * Shortcode attributes object.\n *\n * @typedef {Object} WPShortcodeAttrs\n *\n * @property {Object} named Object with named attributes.\n * @property {Array} numeric Array with numeric attributes.\n */\n\n/**\n * Shortcode object.\n *\n * @typedef {Object} WPShortcode\n *\n * @property {string} tag Shortcode tag.\n * @property {WPShortcodeAttrs} attrs Shortcode attributes.\n * @property {string} content Shortcode content.\n * @property {string} type Shortcode type: `self-closing`,\n * `closed`, or `single`.\n */\n\n/**\n * @typedef {Object} WPShortcodeMatch\n *\n * @property {number} index Index the shortcode is found at.\n * @property {string} content Matched content.\n * @property {WPShortcode} shortcode Shortcode instance of the match.\n */\n\n/**\n * Find the next matching shortcode.\n *\n * @param {string} tag Shortcode tag.\n * @param {string} text Text to search.\n * @param {number} index Index to start search from.\n *\n * @return {?WPShortcodeMatch} Matched information.\n */\nexport function next( tag, text, index = 0 ) {\n\tconst re = regexp( tag );\n\n\tre.lastIndex = index;\n\n\tconst match = re.exec( text );\n\n\tif ( ! match ) {\n\t\treturn;\n\t}\n\n\t// If we matched an escaped shortcode, try again.\n\tif ( '[' === match[ 1 ] && ']' === match[ 7 ] ) {\n\t\treturn next( tag, text, re.lastIndex );\n\t}\n\n\tconst result = {\n\t\tindex: match.index,\n\t\tcontent: match[ 0 ],\n\t\tshortcode: fromMatch( match ),\n\t};\n\n\t// If we matched a leading `[`, strip it from the match and increment the\n\t// index accordingly.\n\tif ( match[ 1 ] ) {\n\t\tresult.content = result.content.slice( 1 );\n\t\tresult.index++;\n\t}\n\n\t// If we matched a trailing `]`, strip it from the match.\n\tif ( match[ 7 ] ) {\n\t\tresult.content = result.content.slice( 0, -1 );\n\t}\n\n\treturn result;\n}\n\n/**\n * Replace matching shortcodes in a block of text.\n *\n * @param {string} tag Shortcode tag.\n * @param {string} text Text to search.\n * @param {Function} callback Function to process the match and return\n * replacement string.\n *\n * @return {string} Text with shortcodes replaced.\n */\nexport function replace( tag, text, callback ) {\n\treturn text.replace(\n\t\tregexp( tag ),\n\t\tfunction ( match, left, $3, attrs, slash, content, closing, right ) {\n\t\t\t// If both extra brackets exist, the shortcode has been properly\n\t\t\t// escaped.\n\t\t\tif ( left === '[' && right === ']' ) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\t// Create the match object and pass it through the callback.\n\t\t\tconst result = callback( fromMatch( arguments ) );\n\n\t\t\t// Make sure to return any of the extra brackets if they weren't used to\n\t\t\t// escape the shortcode.\n\t\t\treturn result || result === '' ? left + result + right : match;\n\t\t}\n\t);\n}\n\n/**\n * Generate a string from shortcode parameters.\n *\n * Creates a shortcode instance and returns a string.\n *\n * Accepts the same `options` as the `shortcode()` constructor, containing a\n * `tag` string, a string or object of `attrs`, a boolean indicating whether to\n * format the shortcode using a `single` tag, and a `content` string.\n *\n * @param {Object} options\n *\n * @return {string} String representation of the shortcode.\n */\nexport function string( options ) {\n\treturn new shortcode( options ).string();\n}\n\n/**\n * Generate a RegExp to identify a shortcode.\n *\n * The base regex is functionally equivalent to the one found in\n * `get_shortcode_regex()` in `wp-includes/shortcodes.php`.\n *\n * Capture groups:\n *\n * 1. An extra `[` to allow for escaping shortcodes with double `[[]]`\n * 2. The shortcode name\n * 3. The shortcode argument list\n * 4. The self closing `/`\n * 5. The content of a shortcode when it wraps some content.\n * 6. The closing tag.\n * 7. An extra `]` to allow for escaping shortcodes with double `[[]]`\n *\n * @param {string} tag Shortcode tag.\n *\n * @return {RegExp} Shortcode RegExp.\n */\nexport function regexp( tag ) {\n\treturn new RegExp(\n\t\t'\\\\[(\\\\[?)(' +\n\t\t\ttag +\n\t\t\t')(?![\\\\w-])([^\\\\]\\\\/]*(?:\\\\/(?!\\\\])[^\\\\]\\\\/]*)*?)(?:(\\\\/)\\\\]|\\\\](?:([^\\\\[]*(?:\\\\[(?!\\\\/\\\\2\\\\])[^\\\\[]*)*)(\\\\[\\\\/\\\\2\\\\]))?)(\\\\]?)',\n\t\t'g'\n\t);\n}\n\n/**\n * Parse shortcode attributes.\n *\n * Shortcodes accept many types of attributes. These can chiefly be divided into\n * named and numeric attributes:\n *\n * Named attributes are assigned on a key/value basis, while numeric attributes\n * are treated as an array.\n *\n * Named attributes can be formatted as either `name=\"value\"`, `name='value'`,\n * or `name=value`. Numeric attributes can be formatted as `\"value\"` or just\n * `value`.\n *\n * @param {string} text Serialised shortcode attributes.\n *\n * @return {WPShortcodeAttrs} Parsed shortcode attributes.\n */\nexport const attrs = memize( ( text ) => {\n\tconst named = {};\n\tconst numeric = [];\n\n\t// This regular expression is reused from `shortcode_parse_atts()` in\n\t// `wp-includes/shortcodes.php`.\n\t//\n\t// Capture groups:\n\t//\n\t// 1. An attribute name, that corresponds to...\n\t// 2. a value in double quotes.\n\t// 3. An attribute name, that corresponds to...\n\t// 4. a value in single quotes.\n\t// 5. An attribute name, that corresponds to...\n\t// 6. an unquoted value.\n\t// 7. A numeric attribute in double quotes.\n\t// 8. A numeric attribute in single quotes.\n\t// 9. An unquoted numeric attribute.\n\tconst pattern =\n\t\t/([\\w-]+)\\s*=\\s*\"([^\"]*)\"(?:\\s|$)|([\\w-]+)\\s*=\\s*'([^']*)'(?:\\s|$)|([\\w-]+)\\s*=\\s*([^\\s'\"]+)(?:\\s|$)|\"([^\"]*)\"(?:\\s|$)|'([^']*)'(?:\\s|$)|(\\S+)(?:\\s|$)/g;\n\n\t// Map zero-width spaces to actual spaces.\n\ttext = text.replace( /[\\u00a0\\u200b]/g, ' ' );\n\n\tlet match;\n\n\t// Match and normalize attributes.\n\twhile ( ( match = pattern.exec( text ) ) ) {\n\t\tif ( match[ 1 ] ) {\n\t\t\tnamed[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t} else if ( match[ 3 ] ) {\n\t\t\tnamed[ match[ 3 ].toLowerCase() ] = match[ 4 ];\n\t\t} else if ( match[ 5 ] ) {\n\t\t\tnamed[ match[ 5 ].toLowerCase() ] = match[ 6 ];\n\t\t} else if ( match[ 7 ] ) {\n\t\t\tnumeric.push( match[ 7 ] );\n\t\t} else if ( match[ 8 ] ) {\n\t\t\tnumeric.push( match[ 8 ] );\n\t\t} else if ( match[ 9 ] ) {\n\t\t\tnumeric.push( match[ 9 ] );\n\t\t}\n\t}\n\n\treturn { named, numeric };\n} );\n\n/**\n * Generate a Shortcode Object from a RegExp match.\n *\n * Accepts a `match` object from calling `regexp.exec()` on a `RegExp` generated\n * by `regexp()`. `match` can also be set to the `arguments` from a callback\n * passed to `regexp.replace()`.\n *\n * @param {Array} match Match array.\n *\n * @return {WPShortcode} Shortcode instance.\n */\nexport function fromMatch( match ) {\n\tlet type;\n\n\tif ( match[ 4 ] ) {\n\t\ttype = 'self-closing';\n\t} else if ( match[ 6 ] ) {\n\t\ttype = 'closed';\n\t} else {\n\t\ttype = 'single';\n\t}\n\n\treturn new shortcode( {\n\t\ttag: match[ 2 ],\n\t\tattrs: match[ 3 ],\n\t\ttype,\n\t\tcontent: match[ 5 ],\n\t} );\n}\n\n/**\n * Creates a shortcode instance.\n *\n * To access a raw representation of a shortcode, pass an `options` object,\n * containing a `tag` string, a string or object of `attrs`, a string indicating\n * the `type` of the shortcode ('single', 'self-closing', or 'closed'), and a\n * `content` string.\n *\n * @param {Object} options Options as described.\n *\n * @return {WPShortcode} Shortcode instance.\n */\nconst shortcode = Object.assign(\n\tfunction ( options ) {\n\t\tconst { tag, attrs: attributes, type, content } = options || {};\n\t\tObject.assign( this, { tag, type, content } );\n\n\t\t// Ensure we have a correctly formatted `attrs` object.\n\t\tthis.attrs = {\n\t\t\tnamed: {},\n\t\t\tnumeric: [],\n\t\t};\n\n\t\tif ( ! attributes ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst attributeTypes = [ 'named', 'numeric' ];\n\n\t\t// Parse a string of attributes.\n\t\tif ( typeof attributes === 'string' ) {\n\t\t\tthis.attrs = attrs( attributes );\n\t\t\t// Identify a correctly formatted `attrs` object.\n\t\t} else if (\n\t\t\tattributes.length === attributeTypes.length &&\n\t\t\tattributeTypes.every( ( t, key ) => t === attributes[ key ] )\n\t\t) {\n\t\t\tthis.attrs = attributes;\n\t\t\t// Handle a flat object of attributes.\n\t\t} else {\n\t\t\tObject.entries( attributes ).forEach( ( [ key, value ] ) => {\n\t\t\t\tthis.set( key, value );\n\t\t\t} );\n\t\t}\n\t},\n\t{\n\t\tnext,\n\t\treplace,\n\t\tstring,\n\t\tregexp,\n\t\tattrs,\n\t\tfromMatch,\n\t}\n);\n\nObject.assign( shortcode.prototype, {\n\t/**\n\t * Get a shortcode attribute.\n\t *\n\t * Automatically detects whether `attr` is named or numeric and routes it\n\t * accordingly.\n\t *\n\t * @param {(number|string)} attr Attribute key.\n\t *\n\t * @return {string} Attribute value.\n\t */\n\tget( attr ) {\n\t\treturn this.attrs[ typeof attr === 'number' ? 'numeric' : 'named' ][\n\t\t\tattr\n\t\t];\n\t},\n\n\t/**\n\t * Set a shortcode attribute.\n\t *\n\t * Automatically detects whether `attr` is named or numeric and routes it\n\t * accordingly.\n\t *\n\t * @param {(number|string)} attr Attribute key.\n\t * @param {string} value Attribute value.\n\t *\n\t * @return {WPShortcode} Shortcode instance.\n\t */\n\tset( attr, value ) {\n\t\tthis.attrs[ typeof attr === 'number' ? 'numeric' : 'named' ][ attr ] =\n\t\t\tvalue;\n\t\treturn this;\n\t},\n\n\t/**\n\t * Transform the shortcode into a string.\n\t *\n\t * @return {string} String representation of the shortcode.\n\t */\n\tstring() {\n\t\tlet text = '[' + this.tag;\n\n\t\tthis.attrs.numeric.forEach( ( value ) => {\n\t\t\tif ( /\\s/.test( value ) ) {\n\t\t\t\ttext += ' \"' + value + '\"';\n\t\t\t} else {\n\t\t\t\ttext += ' ' + value;\n\t\t\t}\n\t\t} );\n\n\t\tObject.entries( this.attrs.named ).forEach( ( [ name, value ] ) => {\n\t\t\ttext += ' ' + name + '=\"' + value + '\"';\n\t\t} );\n\n\t\t// If the tag is marked as `single` or `self-closing`, close the tag and\n\t\t// ignore any additional content.\n\t\tif ( 'single' === this.type ) {\n\t\t\treturn text + ']';\n\t\t} else if ( 'self-closing' === this.type ) {\n\t\t\treturn text + ' /]';\n\t\t}\n\n\t\t// Complete the opening tag.\n\t\ttext += ']';\n\n\t\tif ( this.content ) {\n\t\t\ttext += this.content;\n\t\t}\n\n\t\t// Add the closing tag.\n\t\treturn text + '[/' + this.tag + ']';\n\t},\n} );\n\nexport default shortcode;\n"]}
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { extend, pick, isString, isEqual, forEach, isNumber } from 'lodash';
5
4
  import memize from 'memize';
6
5
  /**
7
6
  * Shortcode attributes object.
@@ -247,9 +246,18 @@ export function fromMatch(match) {
247
246
  * @return {WPShortcode} Shortcode instance.
248
247
  */
249
248
 
250
- const shortcode = extend(function (options) {
251
- extend(this, pick(options || {}, 'tag', 'attrs', 'type', 'content'));
252
- const attributes = this.attrs; // Ensure we have a correctly formatted `attrs` object.
249
+ const shortcode = Object.assign(function (options) {
250
+ const {
251
+ tag,
252
+ attrs: attributes,
253
+ type,
254
+ content
255
+ } = options || {};
256
+ Object.assign(this, {
257
+ tag,
258
+ type,
259
+ content
260
+ }); // Ensure we have a correctly formatted `attrs` object.
253
261
 
254
262
  this.attrs = {
255
263
  named: {},
@@ -258,15 +266,17 @@ const shortcode = extend(function (options) {
258
266
 
259
267
  if (!attributes) {
260
268
  return;
261
- } // Parse a string of attributes.
269
+ }
262
270
 
271
+ const attributeTypes = ['named', 'numeric']; // Parse a string of attributes.
263
272
 
264
- if (isString(attributes)) {
273
+ if (typeof attributes === 'string') {
265
274
  this.attrs = attrs(attributes); // Identify a correctly formatted `attrs` object.
266
- } else if (isEqual(Object.keys(attributes), ['named', 'numeric'])) {
275
+ } else if (attributes.length === attributeTypes.length && attributeTypes.every((t, key) => t === attributes[key])) {
267
276
  this.attrs = attributes; // Handle a flat object of attributes.
268
277
  } else {
269
- forEach(attributes, (value, key) => {
278
+ Object.entries(attributes).forEach(_ref => {
279
+ let [key, value] = _ref;
270
280
  this.set(key, value);
271
281
  });
272
282
  }
@@ -278,7 +288,7 @@ const shortcode = extend(function (options) {
278
288
  attrs,
279
289
  fromMatch
280
290
  });
281
- extend(shortcode.prototype, {
291
+ Object.assign(shortcode.prototype, {
282
292
  /**
283
293
  * Get a shortcode attribute.
284
294
  *
@@ -290,7 +300,7 @@ extend(shortcode.prototype, {
290
300
  * @return {string} Attribute value.
291
301
  */
292
302
  get(attr) {
293
- return this.attrs[isNumber(attr) ? 'numeric' : 'named'][attr];
303
+ return this.attrs[typeof attr === 'number' ? 'numeric' : 'named'][attr];
294
304
  },
295
305
 
296
306
  /**
@@ -305,7 +315,7 @@ extend(shortcode.prototype, {
305
315
  * @return {WPShortcode} Shortcode instance.
306
316
  */
307
317
  set(attr, value) {
308
- this.attrs[isNumber(attr) ? 'numeric' : 'named'][attr] = value;
318
+ this.attrs[typeof attr === 'number' ? 'numeric' : 'named'][attr] = value;
309
319
  return this;
310
320
  },
311
321
 
@@ -316,14 +326,15 @@ extend(shortcode.prototype, {
316
326
  */
317
327
  string() {
318
328
  let text = '[' + this.tag;
319
- forEach(this.attrs.numeric, value => {
329
+ this.attrs.numeric.forEach(value => {
320
330
  if (/\s/.test(value)) {
321
331
  text += ' "' + value + '"';
322
332
  } else {
323
333
  text += ' ' + value;
324
334
  }
325
335
  });
326
- forEach(this.attrs.named, (value, name) => {
336
+ Object.entries(this.attrs.named).forEach(_ref2 => {
337
+ let [name, value] = _ref2;
327
338
  text += ' ' + name + '="' + value + '"';
328
339
  }); // If the tag is marked as `single` or `self-closing`, close the tag and
329
340
  // ignore any additional content.
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/shortcode/src/index.js"],"names":["extend","pick","isString","isEqual","forEach","isNumber","memize","next","tag","text","index","re","regexp","lastIndex","match","exec","result","content","shortcode","fromMatch","slice","replace","callback","left","$3","attrs","slash","closing","right","arguments","string","options","RegExp","named","numeric","pattern","toLowerCase","push","type","attributes","Object","keys","value","key","set","prototype","get","attr","test","name"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { extend, pick, isString, isEqual, forEach, isNumber } from 'lodash';\nimport memize from 'memize';\n\n/**\n * Shortcode attributes object.\n *\n * @typedef {Object} WPShortcodeAttrs\n *\n * @property {Object} named Object with named attributes.\n * @property {Array} numeric Array with numeric attributes.\n */\n\n/**\n * Shortcode object.\n *\n * @typedef {Object} WPShortcode\n *\n * @property {string} tag Shortcode tag.\n * @property {WPShortcodeAttrs} attrs Shortcode attributes.\n * @property {string} content Shortcode content.\n * @property {string} type Shortcode type: `self-closing`,\n * `closed`, or `single`.\n */\n\n/**\n * @typedef {Object} WPShortcodeMatch\n *\n * @property {number} index Index the shortcode is found at.\n * @property {string} content Matched content.\n * @property {WPShortcode} shortcode Shortcode instance of the match.\n */\n\n/**\n * Find the next matching shortcode.\n *\n * @param {string} tag Shortcode tag.\n * @param {string} text Text to search.\n * @param {number} index Index to start search from.\n *\n * @return {?WPShortcodeMatch} Matched information.\n */\nexport function next( tag, text, index = 0 ) {\n\tconst re = regexp( tag );\n\n\tre.lastIndex = index;\n\n\tconst match = re.exec( text );\n\n\tif ( ! match ) {\n\t\treturn;\n\t}\n\n\t// If we matched an escaped shortcode, try again.\n\tif ( '[' === match[ 1 ] && ']' === match[ 7 ] ) {\n\t\treturn next( tag, text, re.lastIndex );\n\t}\n\n\tconst result = {\n\t\tindex: match.index,\n\t\tcontent: match[ 0 ],\n\t\tshortcode: fromMatch( match ),\n\t};\n\n\t// If we matched a leading `[`, strip it from the match and increment the\n\t// index accordingly.\n\tif ( match[ 1 ] ) {\n\t\tresult.content = result.content.slice( 1 );\n\t\tresult.index++;\n\t}\n\n\t// If we matched a trailing `]`, strip it from the match.\n\tif ( match[ 7 ] ) {\n\t\tresult.content = result.content.slice( 0, -1 );\n\t}\n\n\treturn result;\n}\n\n/**\n * Replace matching shortcodes in a block of text.\n *\n * @param {string} tag Shortcode tag.\n * @param {string} text Text to search.\n * @param {Function} callback Function to process the match and return\n * replacement string.\n *\n * @return {string} Text with shortcodes replaced.\n */\nexport function replace( tag, text, callback ) {\n\treturn text.replace(\n\t\tregexp( tag ),\n\t\tfunction ( match, left, $3, attrs, slash, content, closing, right ) {\n\t\t\t// If both extra brackets exist, the shortcode has been properly\n\t\t\t// escaped.\n\t\t\tif ( left === '[' && right === ']' ) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\t// Create the match object and pass it through the callback.\n\t\t\tconst result = callback( fromMatch( arguments ) );\n\n\t\t\t// Make sure to return any of the extra brackets if they weren't used to\n\t\t\t// escape the shortcode.\n\t\t\treturn result || result === '' ? left + result + right : match;\n\t\t}\n\t);\n}\n\n/**\n * Generate a string from shortcode parameters.\n *\n * Creates a shortcode instance and returns a string.\n *\n * Accepts the same `options` as the `shortcode()` constructor, containing a\n * `tag` string, a string or object of `attrs`, a boolean indicating whether to\n * format the shortcode using a `single` tag, and a `content` string.\n *\n * @param {Object} options\n *\n * @return {string} String representation of the shortcode.\n */\nexport function string( options ) {\n\treturn new shortcode( options ).string();\n}\n\n/**\n * Generate a RegExp to identify a shortcode.\n *\n * The base regex is functionally equivalent to the one found in\n * `get_shortcode_regex()` in `wp-includes/shortcodes.php`.\n *\n * Capture groups:\n *\n * 1. An extra `[` to allow for escaping shortcodes with double `[[]]`\n * 2. The shortcode name\n * 3. The shortcode argument list\n * 4. The self closing `/`\n * 5. The content of a shortcode when it wraps some content.\n * 6. The closing tag.\n * 7. An extra `]` to allow for escaping shortcodes with double `[[]]`\n *\n * @param {string} tag Shortcode tag.\n *\n * @return {RegExp} Shortcode RegExp.\n */\nexport function regexp( tag ) {\n\treturn new RegExp(\n\t\t'\\\\[(\\\\[?)(' +\n\t\t\ttag +\n\t\t\t')(?![\\\\w-])([^\\\\]\\\\/]*(?:\\\\/(?!\\\\])[^\\\\]\\\\/]*)*?)(?:(\\\\/)\\\\]|\\\\](?:([^\\\\[]*(?:\\\\[(?!\\\\/\\\\2\\\\])[^\\\\[]*)*)(\\\\[\\\\/\\\\2\\\\]))?)(\\\\]?)',\n\t\t'g'\n\t);\n}\n\n/**\n * Parse shortcode attributes.\n *\n * Shortcodes accept many types of attributes. These can chiefly be divided into\n * named and numeric attributes:\n *\n * Named attributes are assigned on a key/value basis, while numeric attributes\n * are treated as an array.\n *\n * Named attributes can be formatted as either `name=\"value\"`, `name='value'`,\n * or `name=value`. Numeric attributes can be formatted as `\"value\"` or just\n * `value`.\n *\n * @param {string} text Serialised shortcode attributes.\n *\n * @return {WPShortcodeAttrs} Parsed shortcode attributes.\n */\nexport const attrs = memize( ( text ) => {\n\tconst named = {};\n\tconst numeric = [];\n\n\t// This regular expression is reused from `shortcode_parse_atts()` in\n\t// `wp-includes/shortcodes.php`.\n\t//\n\t// Capture groups:\n\t//\n\t// 1. An attribute name, that corresponds to...\n\t// 2. a value in double quotes.\n\t// 3. An attribute name, that corresponds to...\n\t// 4. a value in single quotes.\n\t// 5. An attribute name, that corresponds to...\n\t// 6. an unquoted value.\n\t// 7. A numeric attribute in double quotes.\n\t// 8. A numeric attribute in single quotes.\n\t// 9. An unquoted numeric attribute.\n\tconst pattern = /([\\w-]+)\\s*=\\s*\"([^\"]*)\"(?:\\s|$)|([\\w-]+)\\s*=\\s*'([^']*)'(?:\\s|$)|([\\w-]+)\\s*=\\s*([^\\s'\"]+)(?:\\s|$)|\"([^\"]*)\"(?:\\s|$)|'([^']*)'(?:\\s|$)|(\\S+)(?:\\s|$)/g;\n\n\t// Map zero-width spaces to actual spaces.\n\ttext = text.replace( /[\\u00a0\\u200b]/g, ' ' );\n\n\tlet match;\n\n\t// Match and normalize attributes.\n\twhile ( ( match = pattern.exec( text ) ) ) {\n\t\tif ( match[ 1 ] ) {\n\t\t\tnamed[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t} else if ( match[ 3 ] ) {\n\t\t\tnamed[ match[ 3 ].toLowerCase() ] = match[ 4 ];\n\t\t} else if ( match[ 5 ] ) {\n\t\t\tnamed[ match[ 5 ].toLowerCase() ] = match[ 6 ];\n\t\t} else if ( match[ 7 ] ) {\n\t\t\tnumeric.push( match[ 7 ] );\n\t\t} else if ( match[ 8 ] ) {\n\t\t\tnumeric.push( match[ 8 ] );\n\t\t} else if ( match[ 9 ] ) {\n\t\t\tnumeric.push( match[ 9 ] );\n\t\t}\n\t}\n\n\treturn { named, numeric };\n} );\n\n/**\n * Generate a Shortcode Object from a RegExp match.\n *\n * Accepts a `match` object from calling `regexp.exec()` on a `RegExp` generated\n * by `regexp()`. `match` can also be set to the `arguments` from a callback\n * passed to `regexp.replace()`.\n *\n * @param {Array} match Match array.\n *\n * @return {WPShortcode} Shortcode instance.\n */\nexport function fromMatch( match ) {\n\tlet type;\n\n\tif ( match[ 4 ] ) {\n\t\ttype = 'self-closing';\n\t} else if ( match[ 6 ] ) {\n\t\ttype = 'closed';\n\t} else {\n\t\ttype = 'single';\n\t}\n\n\treturn new shortcode( {\n\t\ttag: match[ 2 ],\n\t\tattrs: match[ 3 ],\n\t\ttype,\n\t\tcontent: match[ 5 ],\n\t} );\n}\n\n/**\n * Creates a shortcode instance.\n *\n * To access a raw representation of a shortcode, pass an `options` object,\n * containing a `tag` string, a string or object of `attrs`, a string indicating\n * the `type` of the shortcode ('single', 'self-closing', or 'closed'), and a\n * `content` string.\n *\n * @param {Object} options Options as described.\n *\n * @return {WPShortcode} Shortcode instance.\n */\nconst shortcode = extend(\n\tfunction ( options ) {\n\t\textend(\n\t\t\tthis,\n\t\t\tpick( options || {}, 'tag', 'attrs', 'type', 'content' )\n\t\t);\n\n\t\tconst attributes = this.attrs;\n\n\t\t// Ensure we have a correctly formatted `attrs` object.\n\t\tthis.attrs = {\n\t\t\tnamed: {},\n\t\t\tnumeric: [],\n\t\t};\n\n\t\tif ( ! attributes ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Parse a string of attributes.\n\t\tif ( isString( attributes ) ) {\n\t\t\tthis.attrs = attrs( attributes );\n\t\t\t// Identify a correctly formatted `attrs` object.\n\t\t} else if (\n\t\t\tisEqual( Object.keys( attributes ), [ 'named', 'numeric' ] )\n\t\t) {\n\t\t\tthis.attrs = attributes;\n\t\t\t// Handle a flat object of attributes.\n\t\t} else {\n\t\t\tforEach( attributes, ( value, key ) => {\n\t\t\t\tthis.set( key, value );\n\t\t\t} );\n\t\t}\n\t},\n\t{\n\t\tnext,\n\t\treplace,\n\t\tstring,\n\t\tregexp,\n\t\tattrs,\n\t\tfromMatch,\n\t}\n);\n\nextend( shortcode.prototype, {\n\t/**\n\t * Get a shortcode attribute.\n\t *\n\t * Automatically detects whether `attr` is named or numeric and routes it\n\t * accordingly.\n\t *\n\t * @param {(number|string)} attr Attribute key.\n\t *\n\t * @return {string} Attribute value.\n\t */\n\tget( attr ) {\n\t\treturn this.attrs[ isNumber( attr ) ? 'numeric' : 'named' ][ attr ];\n\t},\n\n\t/**\n\t * Set a shortcode attribute.\n\t *\n\t * Automatically detects whether `attr` is named or numeric and routes it\n\t * accordingly.\n\t *\n\t * @param {(number|string)} attr Attribute key.\n\t * @param {string} value Attribute value.\n\t *\n\t * @return {WPShortcode} Shortcode instance.\n\t */\n\tset( attr, value ) {\n\t\tthis.attrs[ isNumber( attr ) ? 'numeric' : 'named' ][ attr ] = value;\n\t\treturn this;\n\t},\n\n\t/**\n\t * Transform the shortcode into a string.\n\t *\n\t * @return {string} String representation of the shortcode.\n\t */\n\tstring() {\n\t\tlet text = '[' + this.tag;\n\n\t\tforEach( this.attrs.numeric, ( value ) => {\n\t\t\tif ( /\\s/.test( value ) ) {\n\t\t\t\ttext += ' \"' + value + '\"';\n\t\t\t} else {\n\t\t\t\ttext += ' ' + value;\n\t\t\t}\n\t\t} );\n\n\t\tforEach( this.attrs.named, ( value, name ) => {\n\t\t\ttext += ' ' + name + '=\"' + value + '\"';\n\t\t} );\n\n\t\t// If the tag is marked as `single` or `self-closing`, close the tag and\n\t\t// ignore any additional content.\n\t\tif ( 'single' === this.type ) {\n\t\t\treturn text + ']';\n\t\t} else if ( 'self-closing' === this.type ) {\n\t\t\treturn text + ' /]';\n\t\t}\n\n\t\t// Complete the opening tag.\n\t\ttext += ']';\n\n\t\tif ( this.content ) {\n\t\t\ttext += this.content;\n\t\t}\n\n\t\t// Add the closing tag.\n\t\treturn text + '[/' + this.tag + ']';\n\t},\n} );\n\nexport default shortcode;\n"]}
1
+ {"version":3,"sources":["@wordpress/shortcode/src/index.js"],"names":["memize","next","tag","text","index","re","regexp","lastIndex","match","exec","result","content","shortcode","fromMatch","slice","replace","callback","left","$3","attrs","slash","closing","right","arguments","string","options","RegExp","named","numeric","pattern","toLowerCase","push","type","Object","assign","attributes","attributeTypes","length","every","t","key","entries","forEach","value","set","prototype","get","attr","test","name"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport memize from 'memize';\n\n/**\n * Shortcode attributes object.\n *\n * @typedef {Object} WPShortcodeAttrs\n *\n * @property {Object} named Object with named attributes.\n * @property {Array} numeric Array with numeric attributes.\n */\n\n/**\n * Shortcode object.\n *\n * @typedef {Object} WPShortcode\n *\n * @property {string} tag Shortcode tag.\n * @property {WPShortcodeAttrs} attrs Shortcode attributes.\n * @property {string} content Shortcode content.\n * @property {string} type Shortcode type: `self-closing`,\n * `closed`, or `single`.\n */\n\n/**\n * @typedef {Object} WPShortcodeMatch\n *\n * @property {number} index Index the shortcode is found at.\n * @property {string} content Matched content.\n * @property {WPShortcode} shortcode Shortcode instance of the match.\n */\n\n/**\n * Find the next matching shortcode.\n *\n * @param {string} tag Shortcode tag.\n * @param {string} text Text to search.\n * @param {number} index Index to start search from.\n *\n * @return {?WPShortcodeMatch} Matched information.\n */\nexport function next( tag, text, index = 0 ) {\n\tconst re = regexp( tag );\n\n\tre.lastIndex = index;\n\n\tconst match = re.exec( text );\n\n\tif ( ! match ) {\n\t\treturn;\n\t}\n\n\t// If we matched an escaped shortcode, try again.\n\tif ( '[' === match[ 1 ] && ']' === match[ 7 ] ) {\n\t\treturn next( tag, text, re.lastIndex );\n\t}\n\n\tconst result = {\n\t\tindex: match.index,\n\t\tcontent: match[ 0 ],\n\t\tshortcode: fromMatch( match ),\n\t};\n\n\t// If we matched a leading `[`, strip it from the match and increment the\n\t// index accordingly.\n\tif ( match[ 1 ] ) {\n\t\tresult.content = result.content.slice( 1 );\n\t\tresult.index++;\n\t}\n\n\t// If we matched a trailing `]`, strip it from the match.\n\tif ( match[ 7 ] ) {\n\t\tresult.content = result.content.slice( 0, -1 );\n\t}\n\n\treturn result;\n}\n\n/**\n * Replace matching shortcodes in a block of text.\n *\n * @param {string} tag Shortcode tag.\n * @param {string} text Text to search.\n * @param {Function} callback Function to process the match and return\n * replacement string.\n *\n * @return {string} Text with shortcodes replaced.\n */\nexport function replace( tag, text, callback ) {\n\treturn text.replace(\n\t\tregexp( tag ),\n\t\tfunction ( match, left, $3, attrs, slash, content, closing, right ) {\n\t\t\t// If both extra brackets exist, the shortcode has been properly\n\t\t\t// escaped.\n\t\t\tif ( left === '[' && right === ']' ) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\t// Create the match object and pass it through the callback.\n\t\t\tconst result = callback( fromMatch( arguments ) );\n\n\t\t\t// Make sure to return any of the extra brackets if they weren't used to\n\t\t\t// escape the shortcode.\n\t\t\treturn result || result === '' ? left + result + right : match;\n\t\t}\n\t);\n}\n\n/**\n * Generate a string from shortcode parameters.\n *\n * Creates a shortcode instance and returns a string.\n *\n * Accepts the same `options` as the `shortcode()` constructor, containing a\n * `tag` string, a string or object of `attrs`, a boolean indicating whether to\n * format the shortcode using a `single` tag, and a `content` string.\n *\n * @param {Object} options\n *\n * @return {string} String representation of the shortcode.\n */\nexport function string( options ) {\n\treturn new shortcode( options ).string();\n}\n\n/**\n * Generate a RegExp to identify a shortcode.\n *\n * The base regex is functionally equivalent to the one found in\n * `get_shortcode_regex()` in `wp-includes/shortcodes.php`.\n *\n * Capture groups:\n *\n * 1. An extra `[` to allow for escaping shortcodes with double `[[]]`\n * 2. The shortcode name\n * 3. The shortcode argument list\n * 4. The self closing `/`\n * 5. The content of a shortcode when it wraps some content.\n * 6. The closing tag.\n * 7. An extra `]` to allow for escaping shortcodes with double `[[]]`\n *\n * @param {string} tag Shortcode tag.\n *\n * @return {RegExp} Shortcode RegExp.\n */\nexport function regexp( tag ) {\n\treturn new RegExp(\n\t\t'\\\\[(\\\\[?)(' +\n\t\t\ttag +\n\t\t\t')(?![\\\\w-])([^\\\\]\\\\/]*(?:\\\\/(?!\\\\])[^\\\\]\\\\/]*)*?)(?:(\\\\/)\\\\]|\\\\](?:([^\\\\[]*(?:\\\\[(?!\\\\/\\\\2\\\\])[^\\\\[]*)*)(\\\\[\\\\/\\\\2\\\\]))?)(\\\\]?)',\n\t\t'g'\n\t);\n}\n\n/**\n * Parse shortcode attributes.\n *\n * Shortcodes accept many types of attributes. These can chiefly be divided into\n * named and numeric attributes:\n *\n * Named attributes are assigned on a key/value basis, while numeric attributes\n * are treated as an array.\n *\n * Named attributes can be formatted as either `name=\"value\"`, `name='value'`,\n * or `name=value`. Numeric attributes can be formatted as `\"value\"` or just\n * `value`.\n *\n * @param {string} text Serialised shortcode attributes.\n *\n * @return {WPShortcodeAttrs} Parsed shortcode attributes.\n */\nexport const attrs = memize( ( text ) => {\n\tconst named = {};\n\tconst numeric = [];\n\n\t// This regular expression is reused from `shortcode_parse_atts()` in\n\t// `wp-includes/shortcodes.php`.\n\t//\n\t// Capture groups:\n\t//\n\t// 1. An attribute name, that corresponds to...\n\t// 2. a value in double quotes.\n\t// 3. An attribute name, that corresponds to...\n\t// 4. a value in single quotes.\n\t// 5. An attribute name, that corresponds to...\n\t// 6. an unquoted value.\n\t// 7. A numeric attribute in double quotes.\n\t// 8. A numeric attribute in single quotes.\n\t// 9. An unquoted numeric attribute.\n\tconst pattern =\n\t\t/([\\w-]+)\\s*=\\s*\"([^\"]*)\"(?:\\s|$)|([\\w-]+)\\s*=\\s*'([^']*)'(?:\\s|$)|([\\w-]+)\\s*=\\s*([^\\s'\"]+)(?:\\s|$)|\"([^\"]*)\"(?:\\s|$)|'([^']*)'(?:\\s|$)|(\\S+)(?:\\s|$)/g;\n\n\t// Map zero-width spaces to actual spaces.\n\ttext = text.replace( /[\\u00a0\\u200b]/g, ' ' );\n\n\tlet match;\n\n\t// Match and normalize attributes.\n\twhile ( ( match = pattern.exec( text ) ) ) {\n\t\tif ( match[ 1 ] ) {\n\t\t\tnamed[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t} else if ( match[ 3 ] ) {\n\t\t\tnamed[ match[ 3 ].toLowerCase() ] = match[ 4 ];\n\t\t} else if ( match[ 5 ] ) {\n\t\t\tnamed[ match[ 5 ].toLowerCase() ] = match[ 6 ];\n\t\t} else if ( match[ 7 ] ) {\n\t\t\tnumeric.push( match[ 7 ] );\n\t\t} else if ( match[ 8 ] ) {\n\t\t\tnumeric.push( match[ 8 ] );\n\t\t} else if ( match[ 9 ] ) {\n\t\t\tnumeric.push( match[ 9 ] );\n\t\t}\n\t}\n\n\treturn { named, numeric };\n} );\n\n/**\n * Generate a Shortcode Object from a RegExp match.\n *\n * Accepts a `match` object from calling `regexp.exec()` on a `RegExp` generated\n * by `regexp()`. `match` can also be set to the `arguments` from a callback\n * passed to `regexp.replace()`.\n *\n * @param {Array} match Match array.\n *\n * @return {WPShortcode} Shortcode instance.\n */\nexport function fromMatch( match ) {\n\tlet type;\n\n\tif ( match[ 4 ] ) {\n\t\ttype = 'self-closing';\n\t} else if ( match[ 6 ] ) {\n\t\ttype = 'closed';\n\t} else {\n\t\ttype = 'single';\n\t}\n\n\treturn new shortcode( {\n\t\ttag: match[ 2 ],\n\t\tattrs: match[ 3 ],\n\t\ttype,\n\t\tcontent: match[ 5 ],\n\t} );\n}\n\n/**\n * Creates a shortcode instance.\n *\n * To access a raw representation of a shortcode, pass an `options` object,\n * containing a `tag` string, a string or object of `attrs`, a string indicating\n * the `type` of the shortcode ('single', 'self-closing', or 'closed'), and a\n * `content` string.\n *\n * @param {Object} options Options as described.\n *\n * @return {WPShortcode} Shortcode instance.\n */\nconst shortcode = Object.assign(\n\tfunction ( options ) {\n\t\tconst { tag, attrs: attributes, type, content } = options || {};\n\t\tObject.assign( this, { tag, type, content } );\n\n\t\t// Ensure we have a correctly formatted `attrs` object.\n\t\tthis.attrs = {\n\t\t\tnamed: {},\n\t\t\tnumeric: [],\n\t\t};\n\n\t\tif ( ! attributes ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst attributeTypes = [ 'named', 'numeric' ];\n\n\t\t// Parse a string of attributes.\n\t\tif ( typeof attributes === 'string' ) {\n\t\t\tthis.attrs = attrs( attributes );\n\t\t\t// Identify a correctly formatted `attrs` object.\n\t\t} else if (\n\t\t\tattributes.length === attributeTypes.length &&\n\t\t\tattributeTypes.every( ( t, key ) => t === attributes[ key ] )\n\t\t) {\n\t\t\tthis.attrs = attributes;\n\t\t\t// Handle a flat object of attributes.\n\t\t} else {\n\t\t\tObject.entries( attributes ).forEach( ( [ key, value ] ) => {\n\t\t\t\tthis.set( key, value );\n\t\t\t} );\n\t\t}\n\t},\n\t{\n\t\tnext,\n\t\treplace,\n\t\tstring,\n\t\tregexp,\n\t\tattrs,\n\t\tfromMatch,\n\t}\n);\n\nObject.assign( shortcode.prototype, {\n\t/**\n\t * Get a shortcode attribute.\n\t *\n\t * Automatically detects whether `attr` is named or numeric and routes it\n\t * accordingly.\n\t *\n\t * @param {(number|string)} attr Attribute key.\n\t *\n\t * @return {string} Attribute value.\n\t */\n\tget( attr ) {\n\t\treturn this.attrs[ typeof attr === 'number' ? 'numeric' : 'named' ][\n\t\t\tattr\n\t\t];\n\t},\n\n\t/**\n\t * Set a shortcode attribute.\n\t *\n\t * Automatically detects whether `attr` is named or numeric and routes it\n\t * accordingly.\n\t *\n\t * @param {(number|string)} attr Attribute key.\n\t * @param {string} value Attribute value.\n\t *\n\t * @return {WPShortcode} Shortcode instance.\n\t */\n\tset( attr, value ) {\n\t\tthis.attrs[ typeof attr === 'number' ? 'numeric' : 'named' ][ attr ] =\n\t\t\tvalue;\n\t\treturn this;\n\t},\n\n\t/**\n\t * Transform the shortcode into a string.\n\t *\n\t * @return {string} String representation of the shortcode.\n\t */\n\tstring() {\n\t\tlet text = '[' + this.tag;\n\n\t\tthis.attrs.numeric.forEach( ( value ) => {\n\t\t\tif ( /\\s/.test( value ) ) {\n\t\t\t\ttext += ' \"' + value + '\"';\n\t\t\t} else {\n\t\t\t\ttext += ' ' + value;\n\t\t\t}\n\t\t} );\n\n\t\tObject.entries( this.attrs.named ).forEach( ( [ name, value ] ) => {\n\t\t\ttext += ' ' + name + '=\"' + value + '\"';\n\t\t} );\n\n\t\t// If the tag is marked as `single` or `self-closing`, close the tag and\n\t\t// ignore any additional content.\n\t\tif ( 'single' === this.type ) {\n\t\t\treturn text + ']';\n\t\t} else if ( 'self-closing' === this.type ) {\n\t\t\treturn text + ' /]';\n\t\t}\n\n\t\t// Complete the opening tag.\n\t\ttext += ']';\n\n\t\tif ( this.content ) {\n\t\t\ttext += this.content;\n\t\t}\n\n\t\t// Add the closing tag.\n\t\treturn text + '[/' + this.tag + ']';\n\t},\n} );\n\nexport default shortcode;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/shortcode",
3
- "version": "3.10.0",
3
+ "version": "3.13.0",
4
4
  "description": "Shortcode module for WordPress.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -26,11 +26,10 @@
26
26
  "react-native": "src/index",
27
27
  "dependencies": {
28
28
  "@babel/runtime": "^7.16.0",
29
- "lodash": "^4.17.21",
30
29
  "memize": "^1.1.0"
31
30
  },
32
31
  "publishConfig": {
33
32
  "access": "public"
34
33
  },
35
- "gitHead": "a3e0b62091e8a8bdf5e2518e42d60d7098af48cc"
34
+ "gitHead": "9d9d33bbdf317a4381b8ca1713e43bb50df653b3"
36
35
  }
package/src/index.js CHANGED
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { extend, pick, isString, isEqual, forEach, isNumber } from 'lodash';
5
4
  import memize from 'memize';
6
5
 
7
6
  /**
@@ -190,7 +189,8 @@ export const attrs = memize( ( text ) => {
190
189
  // 7. A numeric attribute in double quotes.
191
190
  // 8. A numeric attribute in single quotes.
192
191
  // 9. An unquoted numeric attribute.
193
- const pattern = /([\w-]+)\s*=\s*"([^"]*)"(?:\s|$)|([\w-]+)\s*=\s*'([^']*)'(?:\s|$)|([\w-]+)\s*=\s*([^\s'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|'([^']*)'(?:\s|$)|(\S+)(?:\s|$)/g;
192
+ const pattern =
193
+ /([\w-]+)\s*=\s*"([^"]*)"(?:\s|$)|([\w-]+)\s*=\s*'([^']*)'(?:\s|$)|([\w-]+)\s*=\s*([^\s'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|'([^']*)'(?:\s|$)|(\S+)(?:\s|$)/g;
194
194
 
195
195
  // Map zero-width spaces to actual spaces.
196
196
  text = text.replace( /[\u00a0\u200b]/g, ' ' );
@@ -259,14 +259,10 @@ export function fromMatch( match ) {
259
259
  *
260
260
  * @return {WPShortcode} Shortcode instance.
261
261
  */
262
- const shortcode = extend(
262
+ const shortcode = Object.assign(
263
263
  function ( options ) {
264
- extend(
265
- this,
266
- pick( options || {}, 'tag', 'attrs', 'type', 'content' )
267
- );
268
-
269
- const attributes = this.attrs;
264
+ const { tag, attrs: attributes, type, content } = options || {};
265
+ Object.assign( this, { tag, type, content } );
270
266
 
271
267
  // Ensure we have a correctly formatted `attrs` object.
272
268
  this.attrs = {
@@ -278,17 +274,20 @@ const shortcode = extend(
278
274
  return;
279
275
  }
280
276
 
277
+ const attributeTypes = [ 'named', 'numeric' ];
278
+
281
279
  // Parse a string of attributes.
282
- if ( isString( attributes ) ) {
280
+ if ( typeof attributes === 'string' ) {
283
281
  this.attrs = attrs( attributes );
284
282
  // Identify a correctly formatted `attrs` object.
285
283
  } else if (
286
- isEqual( Object.keys( attributes ), [ 'named', 'numeric' ] )
284
+ attributes.length === attributeTypes.length &&
285
+ attributeTypes.every( ( t, key ) => t === attributes[ key ] )
287
286
  ) {
288
287
  this.attrs = attributes;
289
288
  // Handle a flat object of attributes.
290
289
  } else {
291
- forEach( attributes, ( value, key ) => {
290
+ Object.entries( attributes ).forEach( ( [ key, value ] ) => {
292
291
  this.set( key, value );
293
292
  } );
294
293
  }
@@ -303,7 +302,7 @@ const shortcode = extend(
303
302
  }
304
303
  );
305
304
 
306
- extend( shortcode.prototype, {
305
+ Object.assign( shortcode.prototype, {
307
306
  /**
308
307
  * Get a shortcode attribute.
309
308
  *
@@ -315,7 +314,9 @@ extend( shortcode.prototype, {
315
314
  * @return {string} Attribute value.
316
315
  */
317
316
  get( attr ) {
318
- return this.attrs[ isNumber( attr ) ? 'numeric' : 'named' ][ attr ];
317
+ return this.attrs[ typeof attr === 'number' ? 'numeric' : 'named' ][
318
+ attr
319
+ ];
319
320
  },
320
321
 
321
322
  /**
@@ -330,7 +331,8 @@ extend( shortcode.prototype, {
330
331
  * @return {WPShortcode} Shortcode instance.
331
332
  */
332
333
  set( attr, value ) {
333
- this.attrs[ isNumber( attr ) ? 'numeric' : 'named' ][ attr ] = value;
334
+ this.attrs[ typeof attr === 'number' ? 'numeric' : 'named' ][ attr ] =
335
+ value;
334
336
  return this;
335
337
  },
336
338
 
@@ -342,7 +344,7 @@ extend( shortcode.prototype, {
342
344
  string() {
343
345
  let text = '[' + this.tag;
344
346
 
345
- forEach( this.attrs.numeric, ( value ) => {
347
+ this.attrs.numeric.forEach( ( value ) => {
346
348
  if ( /\s/.test( value ) ) {
347
349
  text += ' "' + value + '"';
348
350
  } else {
@@ -350,7 +352,7 @@ extend( shortcode.prototype, {
350
352
  }
351
353
  } );
352
354
 
353
- forEach( this.attrs.named, ( value, name ) => {
355
+ Object.entries( this.attrs.named ).forEach( ( [ name, value ] ) => {
354
356
  text += ' ' + name + '="' + value + '"';
355
357
  } );
356
358