[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-includes/js/dist/ -> shortcode.js (source)

   1  /******/ (function() { // webpackBootstrap
   2  /******/     var __webpack_modules__ = ({
   3  
   4  /***/ 9756:
   5  /***/ (function(module) {
   6  
   7  /**
   8   * Memize options object.
   9   *
  10   * @typedef MemizeOptions
  11   *
  12   * @property {number} [maxSize] Maximum size of the cache.
  13   */
  14  
  15  /**
  16   * Internal cache entry.
  17   *
  18   * @typedef MemizeCacheNode
  19   *
  20   * @property {?MemizeCacheNode|undefined} [prev] Previous node.
  21   * @property {?MemizeCacheNode|undefined} [next] Next node.
  22   * @property {Array<*>}                   args   Function arguments for cache
  23   *                                               entry.
  24   * @property {*}                          val    Function result.
  25   */
  26  
  27  /**
  28   * Properties of the enhanced function for controlling cache.
  29   *
  30   * @typedef MemizeMemoizedFunction
  31   *
  32   * @property {()=>void} clear Clear the cache.
  33   */
  34  
  35  /**
  36   * Accepts a function to be memoized, and returns a new memoized function, with
  37   * optional options.
  38   *
  39   * @template {Function} F
  40   *
  41   * @param {F}             fn        Function to memoize.
  42   * @param {MemizeOptions} [options] Options object.
  43   *
  44   * @return {F & MemizeMemoizedFunction} Memoized function.
  45   */
  46  function memize( fn, options ) {
  47      var size = 0;
  48  
  49      /** @type {?MemizeCacheNode|undefined} */
  50      var head;
  51  
  52      /** @type {?MemizeCacheNode|undefined} */
  53      var tail;
  54  
  55      options = options || {};
  56  
  57  	function memoized( /* ...args */ ) {
  58          var node = head,
  59              len = arguments.length,
  60              args, i;
  61  
  62          searchCache: while ( node ) {
  63              // Perform a shallow equality test to confirm that whether the node
  64              // under test is a candidate for the arguments passed. Two arrays
  65              // are shallowly equal if their length matches and each entry is
  66              // strictly equal between the two sets. Avoid abstracting to a
  67              // function which could incur an arguments leaking deoptimization.
  68  
  69              // Check whether node arguments match arguments length
  70              if ( node.args.length !== arguments.length ) {
  71                  node = node.next;
  72                  continue;
  73              }
  74  
  75              // Check whether node arguments match arguments values
  76              for ( i = 0; i < len; i++ ) {
  77                  if ( node.args[ i ] !== arguments[ i ] ) {
  78                      node = node.next;
  79                      continue searchCache;
  80                  }
  81              }
  82  
  83              // At this point we can assume we've found a match
  84  
  85              // Surface matched node to head if not already
  86              if ( node !== head ) {
  87                  // As tail, shift to previous. Must only shift if not also
  88                  // head, since if both head and tail, there is no previous.
  89                  if ( node === tail ) {
  90                      tail = node.prev;
  91                  }
  92  
  93                  // Adjust siblings to point to each other. If node was tail,
  94                  // this also handles new tail's empty `next` assignment.
  95                  /** @type {MemizeCacheNode} */ ( node.prev ).next = node.next;
  96                  if ( node.next ) {
  97                      node.next.prev = node.prev;
  98                  }
  99  
 100                  node.next = head;
 101                  node.prev = null;
 102                  /** @type {MemizeCacheNode} */ ( head ).prev = node;
 103                  head = node;
 104              }
 105  
 106              // Return immediately
 107              return node.val;
 108          }
 109  
 110          // No cached value found. Continue to insertion phase:
 111  
 112          // Create a copy of arguments (avoid leaking deoptimization)
 113          args = new Array( len );
 114          for ( i = 0; i < len; i++ ) {
 115              args[ i ] = arguments[ i ];
 116          }
 117  
 118          node = {
 119              args: args,
 120  
 121              // Generate the result from original function
 122              val: fn.apply( null, args ),
 123          };
 124  
 125          // Don't need to check whether node is already head, since it would
 126          // have been returned above already if it was
 127  
 128          // Shift existing head down list
 129          if ( head ) {
 130              head.prev = node;
 131              node.next = head;
 132          } else {
 133              // If no head, follows that there's no tail (at initial or reset)
 134              tail = node;
 135          }
 136  
 137          // Trim tail if we're reached max size and are pending cache insertion
 138          if ( size === /** @type {MemizeOptions} */ ( options ).maxSize ) {
 139              tail = /** @type {MemizeCacheNode} */ ( tail ).prev;
 140              /** @type {MemizeCacheNode} */ ( tail ).next = null;
 141          } else {
 142              size++;
 143          }
 144  
 145          head = node;
 146  
 147          return node.val;
 148      }
 149  
 150      memoized.clear = function() {
 151          head = null;
 152          tail = null;
 153          size = 0;
 154      };
 155  
 156      if ( false ) {}
 157  
 158      // Ignore reason: There's not a clear solution to create an intersection of
 159      // the function with additional properties, where the goal is to retain the
 160      // function signature of the incoming argument and add control properties
 161      // on the return value.
 162  
 163      // @ts-ignore
 164      return memoized;
 165  }
 166  
 167  module.exports = memize;
 168  
 169  
 170  /***/ })
 171  
 172  /******/     });
 173  /************************************************************************/
 174  /******/     // The module cache
 175  /******/     var __webpack_module_cache__ = {};
 176  /******/     
 177  /******/     // The require function
 178  /******/ 	function __webpack_require__(moduleId) {
 179  /******/         // Check if module is in cache
 180  /******/         var cachedModule = __webpack_module_cache__[moduleId];
 181  /******/         if (cachedModule !== undefined) {
 182  /******/             return cachedModule.exports;
 183  /******/         }
 184  /******/         // Create a new module (and put it into the cache)
 185  /******/         var module = __webpack_module_cache__[moduleId] = {
 186  /******/             // no module.id needed
 187  /******/             // no module.loaded needed
 188  /******/             exports: {}
 189  /******/         };
 190  /******/     
 191  /******/         // Execute the module function
 192  /******/         __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
 193  /******/     
 194  /******/         // Return the exports of the module
 195  /******/         return module.exports;
 196  /******/     }
 197  /******/     
 198  /************************************************************************/
 199  /******/     /* webpack/runtime/compat get default export */
 200  /******/     !function() {
 201  /******/         // getDefaultExport function for compatibility with non-harmony modules
 202  /******/         __webpack_require__.n = function(module) {
 203  /******/             var getter = module && module.__esModule ?
 204  /******/                 function() { return module['default']; } :
 205  /******/                 function() { return module; };
 206  /******/             __webpack_require__.d(getter, { a: getter });
 207  /******/             return getter;
 208  /******/         };
 209  /******/     }();
 210  /******/     
 211  /******/     /* webpack/runtime/define property getters */
 212  /******/     !function() {
 213  /******/         // define getter functions for harmony exports
 214  /******/         __webpack_require__.d = function(exports, definition) {
 215  /******/             for(var key in definition) {
 216  /******/                 if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
 217  /******/                     Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
 218  /******/                 }
 219  /******/             }
 220  /******/         };
 221  /******/     }();
 222  /******/     
 223  /******/     /* webpack/runtime/hasOwnProperty shorthand */
 224  /******/     !function() {
 225  /******/         __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
 226  /******/     }();
 227  /******/     
 228  /************************************************************************/
 229  var __webpack_exports__ = {};
 230  // This entry need to be wrapped in an IIFE because it need to be in strict mode.
 231  !function() {
 232  "use strict";
 233  
 234  // EXPORTS
 235  __webpack_require__.d(__webpack_exports__, {
 236    "default": function() { return /* binding */ build_module; }
 237  });
 238  
 239  // UNUSED EXPORTS: attrs, fromMatch, next, regexp, replace, string
 240  
 241  ;// CONCATENATED MODULE: external "lodash"
 242  var external_lodash_namespaceObject = window["lodash"];
 243  // EXTERNAL MODULE: ./node_modules/memize/index.js
 244  var memize = __webpack_require__(9756);
 245  var memize_default = /*#__PURE__*/__webpack_require__.n(memize);
 246  ;// CONCATENATED MODULE: ./node_modules/@wordpress/shortcode/build-module/index.js
 247  /**
 248   * External dependencies
 249   */
 250  
 251  
 252  /**
 253   * Shortcode attributes object.
 254   *
 255   * @typedef {Object} WPShortcodeAttrs
 256   *
 257   * @property {Object} named   Object with named attributes.
 258   * @property {Array}  numeric Array with numeric attributes.
 259   */
 260  
 261  /**
 262   * Shortcode object.
 263   *
 264   * @typedef {Object} WPShortcode
 265   *
 266   * @property {string}           tag     Shortcode tag.
 267   * @property {WPShortcodeAttrs} attrs   Shortcode attributes.
 268   * @property {string}           content Shortcode content.
 269   * @property {string}           type    Shortcode type: `self-closing`,
 270   *                                      `closed`, or `single`.
 271   */
 272  
 273  /**
 274   * @typedef {Object} WPShortcodeMatch
 275   *
 276   * @property {number}      index     Index the shortcode is found at.
 277   * @property {string}      content   Matched content.
 278   * @property {WPShortcode} shortcode Shortcode instance of the match.
 279   */
 280  
 281  /**
 282   * Find the next matching shortcode.
 283   *
 284   * @param {string} tag   Shortcode tag.
 285   * @param {string} text  Text to search.
 286   * @param {number} index Index to start search from.
 287   *
 288   * @return {?WPShortcodeMatch} Matched information.
 289   */
 290  
 291  function next(tag, text) {
 292    let index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
 293    const re = regexp(tag);
 294    re.lastIndex = index;
 295    const match = re.exec(text);
 296  
 297    if (!match) {
 298      return;
 299    } // If we matched an escaped shortcode, try again.
 300  
 301  
 302    if ('[' === match[1] && ']' === match[7]) {
 303      return next(tag, text, re.lastIndex);
 304    }
 305  
 306    const result = {
 307      index: match.index,
 308      content: match[0],
 309      shortcode: fromMatch(match)
 310    }; // If we matched a leading `[`, strip it from the match and increment the
 311    // index accordingly.
 312  
 313    if (match[1]) {
 314      result.content = result.content.slice(1);
 315      result.index++;
 316    } // If we matched a trailing `]`, strip it from the match.
 317  
 318  
 319    if (match[7]) {
 320      result.content = result.content.slice(0, -1);
 321    }
 322  
 323    return result;
 324  }
 325  /**
 326   * Replace matching shortcodes in a block of text.
 327   *
 328   * @param {string}   tag      Shortcode tag.
 329   * @param {string}   text     Text to search.
 330   * @param {Function} callback Function to process the match and return
 331   *                            replacement string.
 332   *
 333   * @return {string} Text with shortcodes replaced.
 334   */
 335  
 336  function replace(tag, text, callback) {
 337    return text.replace(regexp(tag), function (match, left, $3, attrs, slash, content, closing, right) {
 338      // If both extra brackets exist, the shortcode has been properly
 339      // escaped.
 340      if (left === '[' && right === ']') {
 341        return match;
 342      } // Create the match object and pass it through the callback.
 343  
 344  
 345      const result = callback(fromMatch(arguments)); // Make sure to return any of the extra brackets if they weren't used to
 346      // escape the shortcode.
 347  
 348      return result || result === '' ? left + result + right : match;
 349    });
 350  }
 351  /**
 352   * Generate a string from shortcode parameters.
 353   *
 354   * Creates a shortcode instance and returns a string.
 355   *
 356   * Accepts the same `options` as the `shortcode()` constructor, containing a
 357   * `tag` string, a string or object of `attrs`, a boolean indicating whether to
 358   * format the shortcode using a `single` tag, and a `content` string.
 359   *
 360   * @param {Object} options
 361   *
 362   * @return {string} String representation of the shortcode.
 363   */
 364  
 365  function string(options) {
 366    return new shortcode(options).string();
 367  }
 368  /**
 369   * Generate a RegExp to identify a shortcode.
 370   *
 371   * The base regex is functionally equivalent to the one found in
 372   * `get_shortcode_regex()` in `wp-includes/shortcodes.php`.
 373   *
 374   * Capture groups:
 375   *
 376   * 1. An extra `[` to allow for escaping shortcodes with double `[[]]`
 377   * 2. The shortcode name
 378   * 3. The shortcode argument list
 379   * 4. The self closing `/`
 380   * 5. The content of a shortcode when it wraps some content.
 381   * 6. The closing tag.
 382   * 7. An extra `]` to allow for escaping shortcodes with double `[[]]`
 383   *
 384   * @param {string} tag Shortcode tag.
 385   *
 386   * @return {RegExp} Shortcode RegExp.
 387   */
 388  
 389  function regexp(tag) {
 390    return new RegExp('\\[(\\[?)(' + tag + ')(?![\\w-])([^\\]\\/]*(?:\\/(?!\\])[^\\]\\/]*)*?)(?:(\\/)\\]|\\](?:([^\\[]*(?:\\[(?!\\/\\2\\])[^\\[]*)*)(\\[\\/\\2\\]))?)(\\]?)', 'g');
 391  }
 392  /**
 393   * Parse shortcode attributes.
 394   *
 395   * Shortcodes accept many types of attributes. These can chiefly be divided into
 396   * named and numeric attributes:
 397   *
 398   * Named attributes are assigned on a key/value basis, while numeric attributes
 399   * are treated as an array.
 400   *
 401   * Named attributes can be formatted as either `name="value"`, `name='value'`,
 402   * or `name=value`. Numeric attributes can be formatted as `"value"` or just
 403   * `value`.
 404   *
 405   * @param {string} text Serialised shortcode attributes.
 406   *
 407   * @return {WPShortcodeAttrs} Parsed shortcode attributes.
 408   */
 409  
 410  const attrs = memize_default()(text => {
 411    const named = {};
 412    const numeric = []; // This regular expression is reused from `shortcode_parse_atts()` in
 413    // `wp-includes/shortcodes.php`.
 414    //
 415    // Capture groups:
 416    //
 417    // 1. An attribute name, that corresponds to...
 418    // 2. a value in double quotes.
 419    // 3. An attribute name, that corresponds to...
 420    // 4. a value in single quotes.
 421    // 5. An attribute name, that corresponds to...
 422    // 6. an unquoted value.
 423    // 7. A numeric attribute in double quotes.
 424    // 8. A numeric attribute in single quotes.
 425    // 9. An unquoted numeric attribute.
 426  
 427    const 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.
 428  
 429    text = text.replace(/[\u00a0\u200b]/g, ' ');
 430    let match; // Match and normalize attributes.
 431  
 432    while (match = pattern.exec(text)) {
 433      if (match[1]) {
 434        named[match[1].toLowerCase()] = match[2];
 435      } else if (match[3]) {
 436        named[match[3].toLowerCase()] = match[4];
 437      } else if (match[5]) {
 438        named[match[5].toLowerCase()] = match[6];
 439      } else if (match[7]) {
 440        numeric.push(match[7]);
 441      } else if (match[8]) {
 442        numeric.push(match[8]);
 443      } else if (match[9]) {
 444        numeric.push(match[9]);
 445      }
 446    }
 447  
 448    return {
 449      named,
 450      numeric
 451    };
 452  });
 453  /**
 454   * Generate a Shortcode Object from a RegExp match.
 455   *
 456   * Accepts a `match` object from calling `regexp.exec()` on a `RegExp` generated
 457   * by `regexp()`. `match` can also be set to the `arguments` from a callback
 458   * passed to `regexp.replace()`.
 459   *
 460   * @param {Array} match Match array.
 461   *
 462   * @return {WPShortcode} Shortcode instance.
 463   */
 464  
 465  function fromMatch(match) {
 466    let type;
 467  
 468    if (match[4]) {
 469      type = 'self-closing';
 470    } else if (match[6]) {
 471      type = 'closed';
 472    } else {
 473      type = 'single';
 474    }
 475  
 476    return new shortcode({
 477      tag: match[2],
 478      attrs: match[3],
 479      type,
 480      content: match[5]
 481    });
 482  }
 483  /**
 484   * Creates a shortcode instance.
 485   *
 486   * To access a raw representation of a shortcode, pass an `options` object,
 487   * containing a `tag` string, a string or object of `attrs`, a string indicating
 488   * the `type` of the shortcode ('single', 'self-closing', or 'closed'), and a
 489   * `content` string.
 490   *
 491   * @param {Object} options Options as described.
 492   *
 493   * @return {WPShortcode} Shortcode instance.
 494   */
 495  
 496  const shortcode = (0,external_lodash_namespaceObject.extend)(function (options) {
 497    (0,external_lodash_namespaceObject.extend)(this, (0,external_lodash_namespaceObject.pick)(options || {}, 'tag', 'attrs', 'type', 'content'));
 498    const attributes = this.attrs; // Ensure we have a correctly formatted `attrs` object.
 499  
 500    this.attrs = {
 501      named: {},
 502      numeric: []
 503    };
 504  
 505    if (!attributes) {
 506      return;
 507    } // Parse a string of attributes.
 508  
 509  
 510    if ((0,external_lodash_namespaceObject.isString)(attributes)) {
 511      this.attrs = attrs(attributes); // Identify a correctly formatted `attrs` object.
 512    } else if ((0,external_lodash_namespaceObject.isEqual)(Object.keys(attributes), ['named', 'numeric'])) {
 513      this.attrs = attributes; // Handle a flat object of attributes.
 514    } else {
 515      (0,external_lodash_namespaceObject.forEach)(attributes, (value, key) => {
 516        this.set(key, value);
 517      });
 518    }
 519  }, {
 520    next,
 521    replace,
 522    string,
 523    regexp,
 524    attrs,
 525    fromMatch
 526  });
 527  (0,external_lodash_namespaceObject.extend)(shortcode.prototype, {
 528    /**
 529     * Get a shortcode attribute.
 530     *
 531     * Automatically detects whether `attr` is named or numeric and routes it
 532     * accordingly.
 533     *
 534     * @param {(number|string)} attr Attribute key.
 535     *
 536     * @return {string} Attribute value.
 537     */
 538    get(attr) {
 539      return this.attrs[(0,external_lodash_namespaceObject.isNumber)(attr) ? 'numeric' : 'named'][attr];
 540    },
 541  
 542    /**
 543     * Set a shortcode attribute.
 544     *
 545     * Automatically detects whether `attr` is named or numeric and routes it
 546     * accordingly.
 547     *
 548     * @param {(number|string)} attr  Attribute key.
 549     * @param {string}          value Attribute value.
 550     *
 551     * @return {WPShortcode} Shortcode instance.
 552     */
 553    set(attr, value) {
 554      this.attrs[(0,external_lodash_namespaceObject.isNumber)(attr) ? 'numeric' : 'named'][attr] = value;
 555      return this;
 556    },
 557  
 558    /**
 559     * Transform the shortcode into a string.
 560     *
 561     * @return {string} String representation of the shortcode.
 562     */
 563    string() {
 564      let text = '[' + this.tag;
 565      (0,external_lodash_namespaceObject.forEach)(this.attrs.numeric, value => {
 566        if (/\s/.test(value)) {
 567          text += ' "' + value + '"';
 568        } else {
 569          text += ' ' + value;
 570        }
 571      });
 572      (0,external_lodash_namespaceObject.forEach)(this.attrs.named, (value, name) => {
 573        text += ' ' + name + '="' + value + '"';
 574      }); // If the tag is marked as `single` or `self-closing`, close the tag and
 575      // ignore any additional content.
 576  
 577      if ('single' === this.type) {
 578        return text + ']';
 579      } else if ('self-closing' === this.type) {
 580        return text + ' /]';
 581      } // Complete the opening tag.
 582  
 583  
 584      text += ']';
 585  
 586      if (this.content) {
 587        text += this.content;
 588      } // Add the closing tag.
 589  
 590  
 591      return text + '[/' + this.tag + ']';
 592    }
 593  
 594  });
 595  /* harmony default export */ var build_module = (shortcode);
 596  
 597  }();
 598  (window.wp = window.wp || {}).shortcode = __webpack_exports__["default"];
 599  /******/ })()
 600  ;


Generated: Tue Apr 16 01:00:02 2024 Cross-referenced by PHPXref 0.7.1