WordPress/wp-includes/js/dist/shortcode.js.map
Gary Pendergast d13ae6300c Build Tools: Add an npm script shortcut to run grunt.
Rather than needing to install grunt globally, this allows running grunt from `node_modules`, instead.

`npm run grunt ...` is effectively the equivalent of running `grunt ...`.

Props andrew.taylor.
See #45214.


Built from https://develop.svn.wordpress.org/branches/5.0@43836


git-svn-id: http://core.svn.wordpress.org/branches/5.0@43665 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-10-29 08:28:32 +00:00

1 line
23 KiB
Plaintext

{"version":3,"sources":["webpack://wp.[name]/webpack/bootstrap","webpack://wp.[name]//Users/gziolo/PhpstormProjects/gutenberg/packages/shortcode/src/index.js","webpack://wp.[name]/./node_modules/memize/index.js","webpack://wp.[name]/external \"lodash\""],"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","memize","named","numeric","pattern","toLowerCase","push","type","extend","pick","attributes","isString","isEqual","Object","keys","forEach","value","key","set","prototype","get","attr","isNumber","test","name"],"mappings":"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","file":"shortcode.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./node_modules/@wordpress/shortcode/build-module/index.js\");\n","/**\n * Internal 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( regexp( tag ), ( match, left, $3, attrs, slash, content, closing, right ) => {\n\t\t// If both extra brackets exist, the shortcode has been properly\n\t\t// escaped.\n\t\tif ( left === '[' && right === ']' ) {\n\t\t\treturn match;\n\t\t}\n\n\t\t// Create the match object and pass it through the callback.\n\t\tconst result = callback( fromMatch( arguments ) );\n\n\t\t// Make sure to return any of the extra brackets if they weren't used to\n\t\t// escape the shortcode.\n\t\treturn result ? left + result + right : match;\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( '\\\\[(\\\\[?)(' + tag + ')(?![\\\\w-])([^\\\\]\\\\/]*(?:\\\\/(?!\\\\])[^\\\\]\\\\/]*)*?)(?:(\\\\/)\\\\]|\\\\](?:([^\\\\[]*(?:\\\\[(?!\\\\/\\\\2\\\\])[^\\\\[]*)*)(\\\\[\\\\/\\\\2\\\\]))?)(\\\\]?)', 'g' );\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( function( options ) {\n\textend( this, pick( options || {}, 'tag', 'attrs', 'type', 'content' ) );\n\n\tconst attributes = this.attrs;\n\n\t// Ensure we have a correctly formatted `attrs` object.\n\tthis.attrs = {\n\t\tnamed: {},\n\t\tnumeric: [],\n\t};\n\n\tif ( ! attributes ) {\n\t\treturn;\n\t}\n\n\t// Parse a string of attributes.\n\tif ( isString( attributes ) ) {\n\t\tthis.attrs = attrs( attributes );\n\t// Identify a correctly formatted `attrs` object.\n\t} else if ( isEqual( Object.keys( attributes ), [ 'named', 'numeric' ] ) ) {\n\t\tthis.attrs = attributes;\n\t// Handle a flat object of attributes.\n\t} else {\n\t\tforEach( attributes, ( value, key ) => {\n\t\t\tthis.set( key, value );\n\t\t} );\n\t}\n}, {\n\tnext,\n\treplace,\n\tstring,\n\tregexp,\n\tattrs,\n\tfromMatch,\n} );\n\nextend( shortcode.prototype, {\n\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} );\n\nexport default shortcode;\n","module.exports = function memize( fn, options ) {\n\tvar size = 0,\n\t\tmaxSize, head, tail;\n\n\tif ( options && options.maxSize ) {\n\t\tmaxSize = options.maxSize;\n\t}\n\n\tfunction memoized( /* ...args */ ) {\n\t\tvar node = head,\n\t\t\tlen = arguments.length,\n\t\t\targs, i;\n\n\t\tsearchCache: while ( node ) {\n\t\t\t// Perform a shallow equality test to confirm that whether the node\n\t\t\t// under test is a candidate for the arguments passed. Two arrays\n\t\t\t// are shallowly equal if their length matches and each entry is\n\t\t\t// strictly equal between the two sets. Avoid abstracting to a\n\t\t\t// function which could incur an arguments leaking deoptimization.\n\n\t\t\t// Check whether node arguments match arguments length\n\t\t\tif ( node.args.length !== arguments.length ) {\n\t\t\t\tnode = node.next;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check whether node arguments match arguments values\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( node.args[ i ] !== arguments[ i ] ) {\n\t\t\t\t\tnode = node.next;\n\t\t\t\t\tcontinue searchCache;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// At this point we can assume we've found a match\n\n\t\t\t// Surface matched node to head if not already\n\t\t\tif ( node !== head ) {\n\t\t\t\t// As tail, shift to previous. Must only shift if not also\n\t\t\t\t// head, since if both head and tail, there is no previous.\n\t\t\t\tif ( node === tail ) {\n\t\t\t\t\ttail = node.prev;\n\t\t\t\t}\n\n\t\t\t\t// Adjust siblings to point to each other. If node was tail,\n\t\t\t\t// this also handles new tail's empty `next` assignment.\n\t\t\t\tnode.prev.next = node.next;\n\t\t\t\tif ( node.next ) {\n\t\t\t\t\tnode.next.prev = node.prev;\n\t\t\t\t}\n\n\t\t\t\tnode.next = head;\n\t\t\t\tnode.prev = null;\n\t\t\t\thead.prev = node;\n\t\t\t\thead = node;\n\t\t\t}\n\n\t\t\t// Return immediately\n\t\t\treturn node.val;\n\t\t}\n\n\t\t// No cached value found. Continue to insertion phase:\n\n\t\t// Create a copy of arguments (avoid leaking deoptimization)\n\t\targs = new Array( len );\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tnode = {\n\t\t\targs: args,\n\n\t\t\t// Generate the result from original function\n\t\t\tval: fn.apply( null, args )\n\t\t};\n\n\t\t// Don't need to check whether node is already head, since it would\n\t\t// have been returned above already if it was\n\n\t\t// Shift existing head down list\n\t\tif ( head ) {\n\t\t\thead.prev = node;\n\t\t\tnode.next = head;\n\t\t} else {\n\t\t\t// If no head, follows that there's no tail (at initial or reset)\n\t\t\ttail = node;\n\t\t}\n\n\t\t// Trim tail if we're reached max size and are pending cache insertion\n\t\tif ( size === maxSize ) {\n\t\t\ttail = tail.prev;\n\t\t\ttail.next = null;\n\t\t} else {\n\t\t\tsize++;\n\t\t}\n\n\t\thead = node;\n\n\t\treturn node.val;\n\t}\n\n\tmemoized.clear = function() {\n\t\thead = null;\n\t\ttail = null;\n\t\tsize = 0;\n\t};\n\n\tif ( process.env.NODE_ENV === 'test' ) {\n\t\t// Cache is not exposed in the public API, but used in tests to ensure\n\t\t// expected list progression\n\t\tmemoized.getCache = function() {\n\t\t\treturn [ head, tail, size ];\n\t\t};\n\t}\n\n\treturn memoized;\n};\n","(function() { module.exports = this[\"lodash\"]; }());"],"sourceRoot":""}